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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 Address Assembler::target_address_from_return_address(Address pc) { | 187 Address Assembler::target_address_from_return_address(Address pc) { |
188 return pc - kCallTargetAddressOffset; | 188 return pc - kCallTargetAddressOffset; |
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, |
| 198 Address target) { |
| 199 // Encoded internal references are lui/ori load of 48-bit absolute address. |
| 200 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); |
| 201 Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); |
| 202 Instr instr_ori2 = Assembler::instr_at(pc + 3 * Assembler::kInstrSize); |
| 203 DCHECK(Assembler::IsLui(instr_lui)); |
| 204 DCHECK(Assembler::IsOri(instr_ori)); |
| 205 DCHECK(Assembler::IsOri(instr_ori2)); |
| 206 instr_lui &= ~kImm16Mask; |
| 207 instr_ori &= ~kImm16Mask; |
| 208 instr_ori2 &= ~kImm16Mask; |
| 209 int64_t imm = reinterpret_cast<int64_t>(target); |
| 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 |
| 218 // after complete deserialization, no need to flush on each reference. |
| 219 } |
| 220 |
| 221 |
197 void Assembler::deserialization_set_target_internal_reference_at( | 222 void Assembler::deserialization_set_target_internal_reference_at( |
198 Address pc, Address target) { | 223 Address pc, Address target) { |
199 if (IsLui(instr_at(pc))) { | 224 Memory::Address_at(pc) = target; |
200 // Encoded internal references are lui/ori load of 48-bit abolute address. | |
201 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); | |
202 Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); | |
203 Instr instr_ori2 = Assembler::instr_at(pc + 3 * Assembler::kInstrSize); | |
204 DCHECK(Assembler::IsLui(instr_lui)); | |
205 DCHECK(Assembler::IsOri(instr_ori)); | |
206 DCHECK(Assembler::IsOri(instr_ori2)); | |
207 instr_lui &= ~kImm16Mask; | |
208 instr_ori &= ~kImm16Mask; | |
209 instr_ori2 &= ~kImm16Mask; | |
210 int64_t imm = reinterpret_cast<int64_t>(target); | |
211 DCHECK((imm & 3) == 0); | |
212 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, | |
213 instr_lui | ((imm >> 32) & kImm16Mask)); | |
214 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, | |
215 instr_ori | ((imm >> 16) & kImm16Mask)); | |
216 Assembler::instr_at_put(pc + 3 * Assembler::kInstrSize, | |
217 instr_ori | (imm & kImm16Mask)); | |
218 // Currently used only by deserializer, and all code will be flushed | |
219 // after complete deserialization, no need to flush on each reference. | |
220 } else { | |
221 Memory::Address_at(pc) = target; | |
222 } | |
223 } | 225 } |
224 | 226 |
225 | 227 |
| 228 void Assembler::deserialization_set_target_internal_reference_encoded_at( |
| 229 Address pc, Address target) { |
| 230 DCHECK(IsLui(instr_at(pc))); |
| 231 set_target_internal_reference_encoded_at(pc, target); |
| 232 } |
| 233 |
| 234 |
226 Object* RelocInfo::target_object() { | 235 Object* RelocInfo::target_object() { |
227 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 236 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
228 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); | 237 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); |
229 } | 238 } |
230 | 239 |
231 | 240 |
232 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { | 241 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { |
233 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 242 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
234 return Handle<Object>(reinterpret_cast<Object**>( | 243 return Handle<Object>(reinterpret_cast<Object**>( |
235 Assembler::target_address_at(pc_, host_))); | 244 Assembler::target_address_at(pc_, host_))); |
(...skipping 19 matching lines...) Expand all Loading... |
255 Address RelocInfo::target_external_reference() { | 264 Address RelocInfo::target_external_reference() { |
256 DCHECK(rmode_ == EXTERNAL_REFERENCE); | 265 DCHECK(rmode_ == EXTERNAL_REFERENCE); |
257 return Assembler::target_address_at(pc_, host_); | 266 return Assembler::target_address_at(pc_, host_); |
258 } | 267 } |
259 | 268 |
260 | 269 |
261 Address RelocInfo::target_internal_reference() { | 270 Address RelocInfo::target_internal_reference() { |
262 if (rmode_ == INTERNAL_REFERENCE) { | 271 if (rmode_ == INTERNAL_REFERENCE) { |
263 return Memory::Address_at(pc_); | 272 return Memory::Address_at(pc_); |
264 } else { | 273 } else { |
265 // Encoded internal references are lui/ori load of 48-bit abolute address. | 274 // Encoded internal references are lui/ori load of 48-bit absolute address. |
266 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); | 275 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); |
267 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); | 276 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); |
268 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | 277 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); |
269 Instr instr_ori2 = Assembler::instr_at(pc_ + 3 * Assembler::kInstrSize); | 278 Instr instr_ori2 = Assembler::instr_at(pc_ + 3 * Assembler::kInstrSize); |
270 DCHECK(Assembler::IsLui(instr_lui)); | 279 DCHECK(Assembler::IsLui(instr_lui)); |
271 DCHECK(Assembler::IsOri(instr_ori)); | 280 DCHECK(Assembler::IsOri(instr_ori)); |
272 DCHECK(Assembler::IsOri(instr_ori2)); | 281 DCHECK(Assembler::IsOri(instr_ori2)); |
273 int64_t imm = (instr_lui & static_cast<int64_t>(kImm16Mask)) << 32; | 282 int64_t imm = (instr_lui & static_cast<int64_t>(kImm16Mask)) << 32; |
274 imm |= (instr_ori & static_cast<int64_t>(kImm16Mask)) << 16; | 283 imm |= (instr_ori & static_cast<int64_t>(kImm16Mask)) << 16; |
275 imm |= (instr_ori2 & static_cast<int64_t>(kImm16Mask)); | 284 imm |= (instr_ori2 & static_cast<int64_t>(kImm16Mask)); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 } | 403 } |
395 | 404 |
396 | 405 |
397 void RelocInfo::WipeOut() { | 406 void RelocInfo::WipeOut() { |
398 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 407 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || |
399 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 408 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || |
400 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 409 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); |
401 if (IsInternalReference(rmode_)) { | 410 if (IsInternalReference(rmode_)) { |
402 Memory::Address_at(pc_) = NULL; | 411 Memory::Address_at(pc_) = NULL; |
403 } else if (IsInternalReferenceEncoded(rmode_)) { | 412 } else if (IsInternalReferenceEncoded(rmode_)) { |
404 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); | 413 Assembler::set_target_internal_reference_encoded_at(pc_, nullptr); |
405 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | |
406 Instr instr_ori2 = Assembler::instr_at(pc_ + 3 * Assembler::kInstrSize); | |
407 DCHECK(Assembler::IsLui(instr_lui)); | |
408 DCHECK(Assembler::IsOri(instr_ori)); | |
409 DCHECK(Assembler::IsOri(instr_ori2)); | |
410 instr_lui &= ~kImm16Mask; | |
411 instr_ori &= ~kImm16Mask; | |
412 instr_ori2 &= ~kImm16Mask; | |
413 int64_t imm = 0; | |
414 Assembler::instr_at_put(pc_ + 0 * Assembler::kInstrSize, | |
415 instr_lui | ((imm >> 32) & kImm16Mask)); | |
416 Assembler::instr_at_put(pc_ + 1 * Assembler::kInstrSize, | |
417 instr_ori | ((imm >> 16) & kImm16Mask)); | |
418 Assembler::instr_at_put(pc_ + 3 * Assembler::kInstrSize, | |
419 instr_ori | (imm & kImm16Mask)); | |
420 // Currently used only by deserializer, and all code will be flushed | |
421 // after complete deserialization, no need to flush on each reference. | |
422 } else { | 414 } else { |
423 Assembler::set_target_address_at(pc_, host_, NULL); | 415 Assembler::set_target_address_at(pc_, host_, NULL); |
424 } | 416 } |
425 } | 417 } |
426 | 418 |
427 | 419 |
428 bool RelocInfo::IsPatchedReturnSequence() { | 420 bool RelocInfo::IsPatchedReturnSequence() { |
429 Instr instr0 = Assembler::instr_at(pc_); // lui. | 421 Instr instr0 = Assembler::instr_at(pc_); // lui. |
430 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); // ori. | 422 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); // ori. |
431 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); // dsll. | 423 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); // dsll. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 } | 528 } |
537 *reinterpret_cast<uint64_t*>(pc_) = x; | 529 *reinterpret_cast<uint64_t*>(pc_) = x; |
538 pc_ += kInstrSize * 2; | 530 pc_ += kInstrSize * 2; |
539 CheckTrampolinePoolQuick(); | 531 CheckTrampolinePoolQuick(); |
540 } | 532 } |
541 | 533 |
542 | 534 |
543 } } // namespace v8::internal | 535 } } // namespace v8::internal |
544 | 536 |
545 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ | 537 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
OLD | NEW |