Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @ 1060:323bd24c6520
6769124: various 64-bit fixes for c1
Reviewed-by: never
author | roland |
---|---|
date | Mon, 02 Nov 2009 11:17:55 +0100 |
parents | 148e5441d916 |
children | ba263cfb7611 6deeaebad47a |
comparison
equal
deleted
inserted
replaced
1059:389049f3f393 | 1060:323bd24c6520 |
---|---|
299 // copied into place by code emitted in the IR. | 299 // copied into place by code emitted in the IR. |
300 | 300 |
301 Register OSR_buf = osrBufferPointer()->as_pointer_register(); | 301 Register OSR_buf = osrBufferPointer()->as_pointer_register(); |
302 { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below"); | 302 { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below"); |
303 int monitor_offset = BytesPerWord * method()->max_locals() + | 303 int monitor_offset = BytesPerWord * method()->max_locals() + |
304 (BasicObjectLock::size() * BytesPerWord) * (number_of_locks - 1); | 304 (2 * BytesPerWord) * (number_of_locks - 1); |
305 // SharedRuntime::OSR_migration_begin() packs BasicObjectLocks in | |
306 // the OSR buffer using 2 word entries: first the lock and then | |
307 // the oop. | |
305 for (int i = 0; i < number_of_locks; i++) { | 308 for (int i = 0; i < number_of_locks; i++) { |
306 int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord); | 309 int slot_offset = monitor_offset - ((i * 2) * BytesPerWord); |
307 #ifdef ASSERT | 310 #ifdef ASSERT |
308 // verify the interpreter's monitor has a non-null object | 311 // verify the interpreter's monitor has a non-null object |
309 { | 312 { |
310 Label L; | 313 Label L; |
311 __ cmpptr(Address(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes()), (int32_t)NULL_WORD); | 314 __ cmpptr(Address(OSR_buf, slot_offset + 1*BytesPerWord), (int32_t)NULL_WORD); |
312 __ jcc(Assembler::notZero, L); | 315 __ jcc(Assembler::notZero, L); |
313 __ stop("locked object is NULL"); | 316 __ stop("locked object is NULL"); |
314 __ bind(L); | 317 __ bind(L); |
315 } | 318 } |
316 #endif | 319 #endif |
317 __ movptr(rbx, Address(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes())); | 320 __ movptr(rbx, Address(OSR_buf, slot_offset + 0)); |
318 __ movptr(frame_map()->address_for_monitor_lock(i), rbx); | 321 __ movptr(frame_map()->address_for_monitor_lock(i), rbx); |
319 __ movptr(rbx, Address(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes())); | 322 __ movptr(rbx, Address(OSR_buf, slot_offset + 1*BytesPerWord)); |
320 __ movptr(frame_map()->address_for_monitor_object(i), rbx); | 323 __ movptr(frame_map()->address_for_monitor_object(i), rbx); |
321 } | 324 } |
322 } | 325 } |
323 } | 326 } |
324 | 327 |
783 } else { | 786 } else { |
784 if (is_literal_address(addr)) { | 787 if (is_literal_address(addr)) { |
785 ShouldNotReachHere(); | 788 ShouldNotReachHere(); |
786 __ movoop(as_Address(addr, noreg), c->as_jobject()); | 789 __ movoop(as_Address(addr, noreg), c->as_jobject()); |
787 } else { | 790 } else { |
791 #ifdef _LP64 | |
792 __ movoop(rscratch1, c->as_jobject()); | |
793 null_check_here = code_offset(); | |
794 __ movptr(as_Address_lo(addr), rscratch1); | |
795 #else | |
788 __ movoop(as_Address(addr), c->as_jobject()); | 796 __ movoop(as_Address(addr), c->as_jobject()); |
797 #endif | |
789 } | 798 } |
790 } | 799 } |
791 break; | 800 break; |
792 | 801 |
793 case T_LONG: // fall through | 802 case T_LONG: // fall through |
1116 if (src->is_single_stack()) { | 1125 if (src->is_single_stack()) { |
1117 if (type == T_OBJECT || type == T_ARRAY) { | 1126 if (type == T_OBJECT || type == T_ARRAY) { |
1118 __ pushptr(frame_map()->address_for_slot(src ->single_stack_ix())); | 1127 __ pushptr(frame_map()->address_for_slot(src ->single_stack_ix())); |
1119 __ popptr (frame_map()->address_for_slot(dest->single_stack_ix())); | 1128 __ popptr (frame_map()->address_for_slot(dest->single_stack_ix())); |
1120 } else { | 1129 } else { |
1130 #ifndef _LP64 | |
1121 __ pushl(frame_map()->address_for_slot(src ->single_stack_ix())); | 1131 __ pushl(frame_map()->address_for_slot(src ->single_stack_ix())); |
1122 __ popl (frame_map()->address_for_slot(dest->single_stack_ix())); | 1132 __ popl (frame_map()->address_for_slot(dest->single_stack_ix())); |
1133 #else | |
1134 //no pushl on 64bits | |
1135 __ movl(rscratch1, frame_map()->address_for_slot(src ->single_stack_ix())); | |
1136 __ movl(frame_map()->address_for_slot(dest->single_stack_ix()), rscratch1); | |
1137 #endif | |
1123 } | 1138 } |
1124 | 1139 |
1125 } else if (src->is_double_stack()) { | 1140 } else if (src->is_double_stack()) { |
1126 #ifdef _LP64 | 1141 #ifdef _LP64 |
1127 __ pushptr(frame_map()->address_for_slot(src ->double_stack_ix())); | 1142 __ pushptr(frame_map()->address_for_slot(src ->double_stack_ix())); |
3134 __ shlptr(length, shift_amount); | 3149 __ shlptr(length, shift_amount); |
3135 } | 3150 } |
3136 | 3151 |
3137 #ifdef _LP64 | 3152 #ifdef _LP64 |
3138 assert_different_registers(c_rarg0, dst, dst_pos, length); | 3153 assert_different_registers(c_rarg0, dst, dst_pos, length); |
3154 __ movl2ptr(src_pos, src_pos); //higher 32bits must be null | |
3139 __ lea(c_rarg0, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); | 3155 __ lea(c_rarg0, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); |
3140 assert_different_registers(c_rarg1, length); | 3156 assert_different_registers(c_rarg1, length); |
3157 __ movl2ptr(dst_pos, dst_pos); //higher 32bits must be null | |
3141 __ lea(c_rarg1, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); | 3158 __ lea(c_rarg1, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); |
3142 __ mov(c_rarg2, length); | 3159 __ mov(c_rarg2, length); |
3143 | 3160 |
3144 #else | 3161 #else |
3145 __ lea(tmp, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); | 3162 __ lea(tmp, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); |