| 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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 } | 153 } |
| 154 | 154 |
| 155 | 155 |
| 156 Address Assembler::target_address_from_return_address(Address pc) { | 156 Address Assembler::target_address_from_return_address(Address pc) { |
| 157 return pc - kCallTargetAddressOffset; | 157 return pc - kCallTargetAddressOffset; |
| 158 } | 158 } |
| 159 | 159 |
| 160 | 160 |
| 161 void Assembler::set_target_internal_reference_encoded_at(Address pc, | 161 void Assembler::set_target_internal_reference_encoded_at(Address pc, |
| 162 Address target) { | 162 Address target) { |
| 163 // Encoded internal references are lui/ori load of 32-bit abolute address. | 163 Instr instr1 = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); |
| 164 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); | 164 Instr instr2 = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); |
| 165 Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); | 165 DCHECK(Assembler::IsLui(instr1)); |
| 166 DCHECK(Assembler::IsLui(instr_lui)); | 166 DCHECK(Assembler::IsOri(instr2) || Assembler::IsJicOrJialc(instr2)); |
| 167 DCHECK(Assembler::IsOri(instr_ori)); | 167 instr1 &= ~kImm16Mask; |
| 168 instr_lui &= ~kImm16Mask; | 168 instr2 &= ~kImm16Mask; |
| 169 instr_ori &= ~kImm16Mask; | |
| 170 int32_t imm = reinterpret_cast<int32_t>(target); | 169 int32_t imm = reinterpret_cast<int32_t>(target); |
| 171 DCHECK((imm & 3) == 0); | 170 DCHECK((imm & 3) == 0); |
| 172 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, | 171 if (Assembler::IsJicOrJialc(instr2)) { |
| 173 instr_lui | ((imm >> kLuiShift) & kImm16Mask)); | 172 // Encoded internal references are lui/jic load of 32-bit absolute address. |
| 174 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, | 173 uint32_t lui_offset_u, jic_offset_u; |
| 175 instr_ori | (imm & kImm16Mask)); | 174 Assembler::UnpackTargetAddressUnsigned(imm, lui_offset_u, jic_offset_u); |
| 175 |
| 176 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, |
| 177 instr1 | lui_offset_u); |
| 178 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, |
| 179 instr2 | jic_offset_u); |
| 180 } else { |
| 181 // Encoded internal references are lui/ori load of 32-bit absolute address. |
| 182 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, |
| 183 instr1 | ((imm >> kLuiShift) & kImm16Mask)); |
| 184 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, |
| 185 instr2 | (imm & kImm16Mask)); |
| 186 } |
| 176 | 187 |
| 177 // Currently used only by deserializer, and all code will be flushed | 188 // Currently used only by deserializer, and all code will be flushed |
| 178 // after complete deserialization, no need to flush on each reference. | 189 // after complete deserialization, no need to flush on each reference. |
| 179 } | 190 } |
| 180 | 191 |
| 181 | 192 |
| 182 void Assembler::deserialization_set_target_internal_reference_at( | 193 void Assembler::deserialization_set_target_internal_reference_at( |
| 183 Isolate* isolate, Address pc, Address target, RelocInfo::Mode mode) { | 194 Isolate* isolate, Address pc, Address target, RelocInfo::Mode mode) { |
| 184 if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { | 195 if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { |
| 185 DCHECK(IsLui(instr_at(pc))); | 196 DCHECK(IsLui(instr_at(pc))); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 Address RelocInfo::target_external_reference() { | 234 Address RelocInfo::target_external_reference() { |
| 224 DCHECK(rmode_ == EXTERNAL_REFERENCE); | 235 DCHECK(rmode_ == EXTERNAL_REFERENCE); |
| 225 return Assembler::target_address_at(pc_, host_); | 236 return Assembler::target_address_at(pc_, host_); |
| 226 } | 237 } |
| 227 | 238 |
| 228 | 239 |
| 229 Address RelocInfo::target_internal_reference() { | 240 Address RelocInfo::target_internal_reference() { |
| 230 if (rmode_ == INTERNAL_REFERENCE) { | 241 if (rmode_ == INTERNAL_REFERENCE) { |
| 231 return Memory::Address_at(pc_); | 242 return Memory::Address_at(pc_); |
| 232 } else { | 243 } else { |
| 233 // Encoded internal references are lui/ori load of 32-bit abolute address. | 244 // Encoded internal references are lui/ori or lui/jic load of 32-bit |
| 245 // absolute address. |
| 234 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); | 246 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); |
| 235 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); | 247 Instr instr1 = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); |
| 236 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | 248 Instr instr2 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); |
| 237 DCHECK(Assembler::IsLui(instr_lui)); | 249 DCHECK(Assembler::IsLui(instr1)); |
| 238 DCHECK(Assembler::IsOri(instr_ori)); | 250 DCHECK(Assembler::IsOri(instr2) || Assembler::IsJicOrJialc(instr2)); |
| 239 int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift; | 251 if (Assembler::IsJicOrJialc(instr2)) { |
| 240 imm |= (instr_ori & static_cast<int32_t>(kImm16Mask)); | 252 return reinterpret_cast<Address>( |
| 253 Assembler::CreateTargetAddress(instr1, instr2)); |
| 254 } |
| 255 int32_t imm = (instr1 & static_cast<int32_t>(kImm16Mask)) << kLuiShift; |
| 256 imm |= (instr2 & static_cast<int32_t>(kImm16Mask)); |
| 241 return reinterpret_cast<Address>(imm); | 257 return reinterpret_cast<Address>(imm); |
| 242 } | 258 } |
| 243 } | 259 } |
| 244 | 260 |
| 245 | 261 |
| 246 Address RelocInfo::target_internal_reference_address() { | 262 Address RelocInfo::target_internal_reference_address() { |
| 247 DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); | 263 DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); |
| 248 return reinterpret_cast<Address>(pc_); | 264 return reinterpret_cast<Address>(pc_); |
| 249 } | 265 } |
| 250 | 266 |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 CheckBuffer(); | 479 CheckBuffer(); |
| 464 } | 480 } |
| 465 EmitHelper(x, is_compact_branch); | 481 EmitHelper(x, is_compact_branch); |
| 466 } | 482 } |
| 467 | 483 |
| 468 | 484 |
| 469 } // namespace internal | 485 } // namespace internal |
| 470 } // namespace v8 | 486 } // namespace v8 |
| 471 | 487 |
| 472 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ | 488 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
| OLD | NEW |