OLD | NEW |
1 | 1 |
2 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 2 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
3 // All Rights Reserved. | 3 // All Rights Reserved. |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // - Redistributions of source code must retain the above copyright notice, | 9 // - Redistributions of source code must retain the above copyright notice, |
10 // this list of conditions and the following disclaimer. | 10 // this list of conditions and the following disclaimer. |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 } | 189 } |
190 | 190 |
191 | 191 |
192 Address Assembler::break_address_from_return_address(Address pc) { | 192 Address Assembler::break_address_from_return_address(Address pc) { |
193 return pc - Assembler::kPatchDebugBreakSlotReturnOffset; | 193 return pc - Assembler::kPatchDebugBreakSlotReturnOffset; |
194 } | 194 } |
195 | 195 |
196 | 196 |
197 void Assembler::set_target_internal_reference_encoded_at(Address pc, | 197 void Assembler::set_target_internal_reference_encoded_at(Address pc, |
198 Address target) { | 198 Address target) { |
199 // Encoded internal references are lui/ori load of 48-bit absolute address. | 199 // Encoded internal references are j/jal instructions. |
200 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); | 200 Instr instr = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); |
201 Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); | 201 |
202 Instr instr_ori2 = Assembler::instr_at(pc + 3 * Assembler::kInstrSize); | 202 uint64_t imm28 = |
203 DCHECK(Assembler::IsLui(instr_lui)); | 203 (reinterpret_cast<uint64_t>(target) & static_cast<uint64_t>(kImm28Mask)); |
204 DCHECK(Assembler::IsOri(instr_ori)); | 204 |
205 DCHECK(Assembler::IsOri(instr_ori2)); | 205 instr &= ~kImm26Mask; |
206 instr_lui &= ~kImm16Mask; | 206 uint64_t imm26 = imm28 >> 2; |
207 instr_ori &= ~kImm16Mask; | 207 DCHECK(is_uint26(imm26)); |
208 instr_ori2 &= ~kImm16Mask; | 208 |
209 int64_t imm = reinterpret_cast<int64_t>(target); | 209 instr_at_put(pc, instr | (imm26 & kImm26Mask)); |
210 DCHECK((imm & 3) == 0); | |
211 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, | |
212 instr_lui | ((imm >> 32) & kImm16Mask)); | |
213 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, | |
214 instr_ori | ((imm >> 16) & kImm16Mask)); | |
215 Assembler::instr_at_put(pc + 3 * Assembler::kInstrSize, | |
216 instr_ori | (imm & kImm16Mask)); | |
217 // Currently used only by deserializer, and all code will be flushed | 210 // Currently used only by deserializer, and all code will be flushed |
218 // after complete deserialization, no need to flush on each reference. | 211 // after complete deserialization, no need to flush on each reference. |
219 } | 212 } |
220 | 213 |
221 | 214 |
222 void Assembler::deserialization_set_target_internal_reference_at( | 215 void Assembler::deserialization_set_target_internal_reference_at( |
223 Address pc, Address target, RelocInfo::Mode mode) { | 216 Address pc, Address target, RelocInfo::Mode mode) { |
224 if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { | 217 if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { |
225 DCHECK(IsLui(instr_at(pc))); | 218 DCHECK(IsJ(instr_at(pc))); |
226 set_target_internal_reference_encoded_at(pc, target); | 219 set_target_internal_reference_encoded_at(pc, target); |
227 } else { | 220 } else { |
228 DCHECK(mode == RelocInfo::INTERNAL_REFERENCE); | 221 DCHECK(mode == RelocInfo::INTERNAL_REFERENCE); |
229 Memory::Address_at(pc) = target; | 222 Memory::Address_at(pc) = target; |
230 } | 223 } |
231 } | 224 } |
232 | 225 |
233 | 226 |
234 Object* RelocInfo::target_object() { | 227 Object* RelocInfo::target_object() { |
235 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 228 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
(...skipping 27 matching lines...) Expand all Loading... |
263 Address RelocInfo::target_external_reference() { | 256 Address RelocInfo::target_external_reference() { |
264 DCHECK(rmode_ == EXTERNAL_REFERENCE); | 257 DCHECK(rmode_ == EXTERNAL_REFERENCE); |
265 return Assembler::target_address_at(pc_, host_); | 258 return Assembler::target_address_at(pc_, host_); |
266 } | 259 } |
267 | 260 |
268 | 261 |
269 Address RelocInfo::target_internal_reference() { | 262 Address RelocInfo::target_internal_reference() { |
270 if (rmode_ == INTERNAL_REFERENCE) { | 263 if (rmode_ == INTERNAL_REFERENCE) { |
271 return Memory::Address_at(pc_); | 264 return Memory::Address_at(pc_); |
272 } else { | 265 } else { |
273 // Encoded internal references are lui/ori load of 48-bit absolute address. | 266 // Encoded internal references are j/jal instructions. |
274 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); | 267 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); |
275 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); | 268 Instr instr = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); |
276 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | 269 instr &= kImm26Mask; |
277 Instr instr_ori2 = Assembler::instr_at(pc_ + 3 * Assembler::kInstrSize); | 270 uint64_t imm28 = instr << 2; |
278 DCHECK(Assembler::IsLui(instr_lui)); | 271 uint64_t segment = |
279 DCHECK(Assembler::IsOri(instr_ori)); | 272 (reinterpret_cast<uint64_t>(pc_) & ~static_cast<uint64_t>(kImm28Mask)); |
280 DCHECK(Assembler::IsOri(instr_ori2)); | 273 return reinterpret_cast<Address>(segment | imm28); |
281 int64_t imm = (instr_lui & static_cast<int64_t>(kImm16Mask)) << 32; | |
282 imm |= (instr_ori & static_cast<int64_t>(kImm16Mask)) << 16; | |
283 imm |= (instr_ori2 & static_cast<int64_t>(kImm16Mask)); | |
284 return reinterpret_cast<Address>(imm); | |
285 } | 274 } |
286 } | 275 } |
287 | 276 |
288 | 277 |
289 Address RelocInfo::target_internal_reference_address() { | 278 Address RelocInfo::target_internal_reference_address() { |
290 DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); | 279 DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); |
291 return reinterpret_cast<Address>(pc_); | 280 return reinterpret_cast<Address>(pc_); |
292 } | 281 } |
293 | 282 |
294 | 283 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 } | 516 } |
528 *reinterpret_cast<uint64_t*>(pc_) = x; | 517 *reinterpret_cast<uint64_t*>(pc_) = x; |
529 pc_ += kInstrSize * 2; | 518 pc_ += kInstrSize * 2; |
530 CheckTrampolinePoolQuick(); | 519 CheckTrampolinePoolQuick(); |
531 } | 520 } |
532 | 521 |
533 | 522 |
534 } } // namespace v8::internal | 523 } } // namespace v8::internal |
535 | 524 |
536 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ | 525 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
OLD | NEW |