Mercurial > hg > truffle
comparison src/cpu/sparc/vm/assembler_sparc.hpp @ 3753:cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
Reviewed-by: kvn, jrose
author | never |
---|---|
date | Fri, 03 Jun 2011 22:31:43 -0700 |
parents | e1162778c1c8 |
children | faa472957b38 |
comparison
equal
deleted
inserted
replaced
3752:f918d6096e23 | 3753:cba7b5c2d53f |
---|---|
307 _index_or_disp(in_bytes(disp)) { | 307 _index_or_disp(in_bytes(disp)) { |
308 } | 308 } |
309 #endif | 309 #endif |
310 | 310 |
311 // accessors | 311 // accessors |
312 Register base() const { return _base; } | 312 Register base() const { return _base; } |
313 Register index() const { return _index_or_disp.as_register(); } | 313 Register index() const { return _index_or_disp.as_register(); } |
314 int disp() const { return _index_or_disp.as_constant(); } | 314 int disp() const { return _index_or_disp.as_constant(); } |
315 | 315 |
316 bool has_index() const { return _index_or_disp.is_register(); } | 316 bool has_index() const { return _index_or_disp.is_register(); } |
317 bool has_disp() const { return _index_or_disp.is_constant(); } | 317 bool has_disp() const { return _index_or_disp.is_constant(); } |
318 | |
319 bool uses(Register reg) const { return base() == reg || (has_index() && index() == reg); } | |
318 | 320 |
319 const relocInfo::relocType rtype() { return _rspec.type(); } | 321 const relocInfo::relocType rtype() { return _rspec.type(); } |
320 const RelocationHolder& rspec() { return _rspec; } | 322 const RelocationHolder& rspec() { return _rspec; } |
321 | 323 |
322 RelocationHolder rspec(int offset) const { | 324 RelocationHolder rspec(int offset) const { |
327 | 329 |
328 Address plus_disp(int plusdisp) const { // bump disp by a small amount | 330 Address plus_disp(int plusdisp) const { // bump disp by a small amount |
329 assert(_index_or_disp.is_constant(), "must have a displacement"); | 331 assert(_index_or_disp.is_constant(), "must have a displacement"); |
330 Address a(base(), disp() + plusdisp); | 332 Address a(base(), disp() + plusdisp); |
331 return a; | 333 return a; |
334 } | |
335 bool is_same_address(Address a) const { | |
336 // disregard _rspec | |
337 return base() == a.base() && (has_index() ? index() == a.index() : disp() == a.disp()); | |
332 } | 338 } |
333 | 339 |
334 Address after_save() const { | 340 Address after_save() const { |
335 Address a = (*this); | 341 Address a = (*this); |
336 a._base = a._base->after_save(); | 342 a._base = a._base->after_save(); |
434 | 440 |
435 AddressLiteral(oop addr, relocInfo::relocType rtype = relocInfo::none) | 441 AddressLiteral(oop addr, relocInfo::relocType rtype = relocInfo::none) |
436 : _address((address) addr), | 442 : _address((address) addr), |
437 _rspec(rspec_from_rtype(rtype, (address) addr)) {} | 443 _rspec(rspec_from_rtype(rtype, (address) addr)) {} |
438 | 444 |
445 AddressLiteral(oop* addr, relocInfo::relocType rtype = relocInfo::none) | |
446 : _address((address) addr), | |
447 _rspec(rspec_from_rtype(rtype, (address) addr)) {} | |
448 | |
439 AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none) | 449 AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none) |
440 : _address((address) addr), | 450 : _address((address) addr), |
441 _rspec(rspec_from_rtype(rtype, (address) addr)) {} | 451 _rspec(rspec_from_rtype(rtype, (address) addr)) {} |
442 | 452 |
443 AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none) | 453 AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none) |
453 RelocationHolder rspec(int offset) const { | 463 RelocationHolder rspec(int offset) const { |
454 return offset == 0 ? _rspec : _rspec.plus(offset); | 464 return offset == 0 ? _rspec : _rspec.plus(offset); |
455 } | 465 } |
456 }; | 466 }; |
457 | 467 |
468 // Convenience classes | |
469 class ExternalAddress: public AddressLiteral { | |
470 private: | |
471 static relocInfo::relocType reloc_for_target(address target) { | |
472 // Sometimes ExternalAddress is used for values which aren't | |
473 // exactly addresses, like the card table base. | |
474 // external_word_type can't be used for values in the first page | |
475 // so just skip the reloc in that case. | |
476 return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none; | |
477 } | |
478 | |
479 public: | |
480 ExternalAddress(address target) : AddressLiteral(target, reloc_for_target( target)) {} | |
481 ExternalAddress(oop* target) : AddressLiteral(target, reloc_for_target((address) target)) {} | |
482 }; | |
458 | 483 |
459 inline Address RegisterImpl::address_in_saved_window() const { | 484 inline Address RegisterImpl::address_in_saved_window() const { |
460 return (Address(SP, (sp_offset_in_saved_window() * wordSize) + STACK_BIAS)); | 485 return (Address(SP, (sp_offset_in_saved_window() * wordSize) + STACK_BIAS)); |
461 } | 486 } |
462 | 487 |
853 | 878 |
854 // x is supposed to fit in a field "nbits" wide | 879 // x is supposed to fit in a field "nbits" wide |
855 // and be sign-extended. Check the range. | 880 // and be sign-extended. Check the range. |
856 | 881 |
857 static void assert_signed_range(intptr_t x, int nbits) { | 882 static void assert_signed_range(intptr_t x, int nbits) { |
858 assert( nbits == 32 | 883 assert(nbits == 32 || (-(1 << nbits-1) <= x && x < ( 1 << nbits-1)), |
859 || -(1 << nbits-1) <= x && x < ( 1 << nbits-1), | 884 err_msg("value out of range: x=" INTPTR_FORMAT ", nbits=%d", x, nbits)); |
860 "value out of range"); | |
861 } | 885 } |
862 | 886 |
863 static void assert_signed_word_disp_range(intptr_t x, int nbits) { | 887 static void assert_signed_word_disp_range(intptr_t x, int nbits) { |
864 assert( (x & 3) == 0, "not word aligned"); | 888 assert( (x & 3) == 0, "not word aligned"); |
865 assert_signed_range(x, nbits + 2); | 889 assert_signed_range(x, nbits + 2); |
2285 void set_varargs( Argument a, Register d ); | 2309 void set_varargs( Argument a, Register d ); |
2286 | 2310 |
2287 int total_frame_size_in_bytes(int extraWords); | 2311 int total_frame_size_in_bytes(int extraWords); |
2288 | 2312 |
2289 // used when extraWords known statically | 2313 // used when extraWords known statically |
2290 void save_frame(int extraWords); | 2314 void save_frame(int extraWords = 0); |
2291 void save_frame_c1(int size_in_bytes); | 2315 void save_frame_c1(int size_in_bytes); |
2292 // make a frame, and simultaneously pass up one or two register value | 2316 // make a frame, and simultaneously pass up one or two register value |
2293 // into the new register window | 2317 // into the new register window |
2294 void save_frame_and_mov(int extraWords, Register s1, Register d1, Register s2 = Register(), Register d2 = Register()); | 2318 void save_frame_and_mov(int extraWords, Register s1, Register d1, Register s2 = Register(), Register d2 = Register()); |
2295 | 2319 |
2454 Register temp_reg); | 2478 Register temp_reg); |
2455 void jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop = true); | 2479 void jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop = true); |
2456 // offset relative to Gargs of argument at tos[arg_slot]. | 2480 // offset relative to Gargs of argument at tos[arg_slot]. |
2457 // (arg_slot == 0 means the last argument, not the first). | 2481 // (arg_slot == 0 means the last argument, not the first). |
2458 RegisterOrConstant argument_offset(RegisterOrConstant arg_slot, | 2482 RegisterOrConstant argument_offset(RegisterOrConstant arg_slot, |
2483 Register temp_reg, | |
2459 int extra_slot_offset = 0); | 2484 int extra_slot_offset = 0); |
2460 // Address of Gargs and argument_offset. | 2485 // Address of Gargs and argument_offset. |
2461 Address argument_address(RegisterOrConstant arg_slot, | 2486 Address argument_address(RegisterOrConstant arg_slot, |
2487 Register temp_reg, | |
2462 int extra_slot_offset = 0); | 2488 int extra_slot_offset = 0); |
2463 | 2489 |
2464 // Stack overflow checking | 2490 // Stack overflow checking |
2465 | 2491 |
2466 // Note: this clobbers G3_scratch | 2492 // Note: this clobbers G3_scratch |