Mercurial > hg > graal-jvmci-8
comparison src/cpu/sparc/vm/c1_LIRAssembler_sparc.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 |
---|---|
187 // copied into place by code emitted in the IR. | 187 // copied into place by code emitted in the IR. |
188 | 188 |
189 Register OSR_buf = osrBufferPointer()->as_register(); | 189 Register OSR_buf = osrBufferPointer()->as_register(); |
190 { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below"); | 190 { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below"); |
191 int monitor_offset = BytesPerWord * method()->max_locals() + | 191 int monitor_offset = BytesPerWord * method()->max_locals() + |
192 (BasicObjectLock::size() * BytesPerWord) * (number_of_locks - 1); | 192 (2 * BytesPerWord) * (number_of_locks - 1); |
193 // SharedRuntime::OSR_migration_begin() packs BasicObjectLocks in | |
194 // the OSR buffer using 2 word entries: first the lock and then | |
195 // the oop. | |
193 for (int i = 0; i < number_of_locks; i++) { | 196 for (int i = 0; i < number_of_locks; i++) { |
194 int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord); | 197 int slot_offset = monitor_offset - ((i * 2) * BytesPerWord); |
195 #ifdef ASSERT | 198 #ifdef ASSERT |
196 // verify the interpreter's monitor has a non-null object | 199 // verify the interpreter's monitor has a non-null object |
197 { | 200 { |
198 Label L; | 201 Label L; |
199 __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7); | 202 __ ld_ptr(OSR_buf, slot_offset + 1*BytesPerWord, O7); |
200 __ cmp(G0, O7); | 203 __ cmp(G0, O7); |
201 __ br(Assembler::notEqual, false, Assembler::pt, L); | 204 __ br(Assembler::notEqual, false, Assembler::pt, L); |
202 __ delayed()->nop(); | 205 __ delayed()->nop(); |
203 __ stop("locked object is NULL"); | 206 __ stop("locked object is NULL"); |
204 __ bind(L); | 207 __ bind(L); |
205 } | 208 } |
206 #endif // ASSERT | 209 #endif // ASSERT |
207 // Copy the lock field into the compiled activation. | 210 // Copy the lock field into the compiled activation. |
208 __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes(), O7); | 211 __ ld_ptr(OSR_buf, slot_offset + 0, O7); |
209 __ st_ptr(O7, frame_map()->address_for_monitor_lock(i)); | 212 __ st_ptr(O7, frame_map()->address_for_monitor_lock(i)); |
210 __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7); | 213 __ ld_ptr(OSR_buf, slot_offset + 1*BytesPerWord, O7); |
211 __ st_ptr(O7, frame_map()->address_for_monitor_object(i)); | 214 __ st_ptr(O7, frame_map()->address_for_monitor_object(i)); |
212 } | 215 } |
213 } | 216 } |
214 } | 217 } |
215 | 218 |
951 __ ldd(base, offset, to_reg->as_register_hi()); | 954 __ ldd(base, offset, to_reg->as_register_hi()); |
952 #endif | 955 #endif |
953 } else { | 956 } else { |
954 #ifdef _LP64 | 957 #ifdef _LP64 |
955 assert(base != to_reg->as_register_lo(), "can't handle this"); | 958 assert(base != to_reg->as_register_lo(), "can't handle this"); |
959 assert(O7 != to_reg->as_register_lo(), "can't handle this"); | |
956 __ ld(base, offset + hi_word_offset_in_bytes, to_reg->as_register_lo()); | 960 __ ld(base, offset + hi_word_offset_in_bytes, to_reg->as_register_lo()); |
961 __ lduw(base, offset + lo_word_offset_in_bytes, O7); // in case O7 is base or offset, use it last | |
957 __ sllx(to_reg->as_register_lo(), 32, to_reg->as_register_lo()); | 962 __ sllx(to_reg->as_register_lo(), 32, to_reg->as_register_lo()); |
958 __ ld(base, offset + lo_word_offset_in_bytes, to_reg->as_register_lo()); | 963 __ or3(to_reg->as_register_lo(), O7, to_reg->as_register_lo()); |
959 #else | 964 #else |
960 if (base == to_reg->as_register_lo()) { | 965 if (base == to_reg->as_register_lo()) { |
961 __ ld(base, offset + hi_word_offset_in_bytes, to_reg->as_register_hi()); | 966 __ ld(base, offset + hi_word_offset_in_bytes, to_reg->as_register_hi()); |
962 __ ld(base, offset + lo_word_offset_in_bytes, to_reg->as_register_lo()); | 967 __ ld(base, offset + lo_word_offset_in_bytes, to_reg->as_register_lo()); |
963 } else { | 968 } else { |
974 case T_DOUBLE: | 979 case T_DOUBLE: |
975 { | 980 { |
976 FloatRegister reg = to_reg->as_double_reg(); | 981 FloatRegister reg = to_reg->as_double_reg(); |
977 // split unaligned loads | 982 // split unaligned loads |
978 if (unaligned || PatchALot) { | 983 if (unaligned || PatchALot) { |
979 __ ldf(FloatRegisterImpl::S, base, offset + BytesPerWord, reg->successor()); | 984 __ ldf(FloatRegisterImpl::S, base, offset + 4, reg->successor()); |
980 __ ldf(FloatRegisterImpl::S, base, offset, reg); | 985 __ ldf(FloatRegisterImpl::S, base, offset, reg); |
981 } else { | 986 } else { |
982 __ ldf(FloatRegisterImpl::D, base, offset, to_reg->as_double_reg()); | 987 __ ldf(FloatRegisterImpl::D, base, offset, to_reg->as_double_reg()); |
983 } | 988 } |
984 break; | 989 break; |
985 } | 990 } |
2198 Register src_ptr = O0; | 2203 Register src_ptr = O0; |
2199 Register dst_ptr = O1; | 2204 Register dst_ptr = O1; |
2200 Register len = O2; | 2205 Register len = O2; |
2201 | 2206 |
2202 __ add(src, arrayOopDesc::base_offset_in_bytes(basic_type), src_ptr); | 2207 __ add(src, arrayOopDesc::base_offset_in_bytes(basic_type), src_ptr); |
2208 LP64_ONLY(__ sra(src_pos, 0, src_pos);) //higher 32bits must be null | |
2203 if (shift == 0) { | 2209 if (shift == 0) { |
2204 __ add(src_ptr, src_pos, src_ptr); | 2210 __ add(src_ptr, src_pos, src_ptr); |
2205 } else { | 2211 } else { |
2206 __ sll(src_pos, shift, tmp); | 2212 __ sll(src_pos, shift, tmp); |
2207 __ add(src_ptr, tmp, src_ptr); | 2213 __ add(src_ptr, tmp, src_ptr); |
2208 } | 2214 } |
2209 | 2215 |
2210 __ add(dst, arrayOopDesc::base_offset_in_bytes(basic_type), dst_ptr); | 2216 __ add(dst, arrayOopDesc::base_offset_in_bytes(basic_type), dst_ptr); |
2217 LP64_ONLY(__ sra(dst_pos, 0, dst_pos);) //higher 32bits must be null | |
2211 if (shift == 0) { | 2218 if (shift == 0) { |
2212 __ add(dst_ptr, dst_pos, dst_ptr); | 2219 __ add(dst_ptr, dst_pos, dst_ptr); |
2213 } else { | 2220 } else { |
2214 __ sll(dst_pos, shift, tmp); | 2221 __ sll(dst_pos, shift, tmp); |
2215 __ add(dst_ptr, tmp, dst_ptr); | 2222 __ add(dst_ptr, tmp, dst_ptr); |