| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 // to a few constants). If this is a problem, we could change the code | 90 // to a few constants). If this is a problem, we could change the code |
| 91 // such that we use an enum in optimized mode, and the struct in debug | 91 // such that we use an enum in optimized mode, and the struct in debug |
| 92 // mode. This way we get the compile-time error checking in debug mode | 92 // mode. This way we get the compile-time error checking in debug mode |
| 93 // and best performance in optimized code. | 93 // and best performance in optimized code. |
| 94 | 94 |
| 95 | 95 |
| 96 // ----------------------------------------------------------------------------- | 96 // ----------------------------------------------------------------------------- |
| 97 // Implementation of Register and FPURegister. | 97 // Implementation of Register and FPURegister. |
| 98 | 98 |
| 99 struct Register { | 99 struct Register { |
| 100 static const int kCpRegister = 23; // cp (s7) is the 23rd register. | 100 static constexpr int kCpRegister = 23; // cp (s7) is the 23rd register. |
| 101 | 101 |
| 102 enum Code { | 102 enum Code { |
| 103 #define REGISTER_CODE(R) kCode_##R, | 103 #define REGISTER_CODE(R) kCode_##R, |
| 104 GENERAL_REGISTERS(REGISTER_CODE) | 104 GENERAL_REGISTERS(REGISTER_CODE) |
| 105 #undef REGISTER_CODE | 105 #undef REGISTER_CODE |
| 106 kAfterLast, | 106 kAfterLast, |
| 107 kCode_no_reg = -1 | 107 kCode_no_reg = -1 |
| 108 }; | 108 }; |
| 109 | 109 |
| 110 static const int kNumRegisters = Code::kAfterLast; | 110 static constexpr int kNumRegisters = Code::kAfterLast; |
| 111 | 111 |
| 112 #if defined(V8_TARGET_LITTLE_ENDIAN) | 112 #if defined(V8_TARGET_LITTLE_ENDIAN) |
| 113 static const int kMantissaOffset = 0; | 113 static constexpr int kMantissaOffset = 0; |
| 114 static const int kExponentOffset = 4; | 114 static constexpr int kExponentOffset = 4; |
| 115 #elif defined(V8_TARGET_BIG_ENDIAN) | 115 #elif defined(V8_TARGET_BIG_ENDIAN) |
| 116 static const int kMantissaOffset = 4; | 116 static constexpr int kMantissaOffset = 4; |
| 117 static const int kExponentOffset = 0; | 117 static constexpr int kExponentOffset = 0; |
| 118 #else | 118 #else |
| 119 #error Unknown endianness | 119 #error Unknown endianness |
| 120 #endif | 120 #endif |
| 121 | 121 |
| 122 | 122 |
| 123 static Register from_code(int code) { | 123 static Register from_code(int code) { |
| 124 DCHECK(code >= 0); | 124 DCHECK_LE(0, code); |
| 125 DCHECK(code < kNumRegisters); | 125 DCHECK_GT(kNumRegisters, code); |
| 126 Register r = {code}; | 126 return Register{code}; |
| 127 return r; | |
| 128 } | 127 } |
| 129 bool is_valid() const { return 0 <= reg_code && reg_code < kNumRegisters; } | 128 bool is_valid() const { return 0 <= reg_code && reg_code < kNumRegisters; } |
| 130 bool is(Register reg) const { return reg_code == reg.reg_code; } | 129 bool is(Register reg) const { return reg_code == reg.reg_code; } |
| 131 int code() const { | 130 int code() const { |
| 132 DCHECK(is_valid()); | 131 DCHECK(is_valid()); |
| 133 return reg_code; | 132 return reg_code; |
| 134 } | 133 } |
| 135 int bit() const { | 134 int bit() const { |
| 136 DCHECK(is_valid()); | 135 DCHECK(is_valid()); |
| 137 return 1 << reg_code; | 136 return 1 << reg_code; |
| 138 } | 137 } |
| 139 | 138 |
| 140 // Unfortunately we can't make this private in a struct. | 139 // Unfortunately we can't make this private in a struct. |
| 141 int reg_code; | 140 int reg_code; |
| 142 }; | 141 }; |
| 143 | 142 |
| 144 // s7: context register | 143 // s7: context register |
| 145 // s3: lithium scratch | 144 // s3: lithium scratch |
| 146 // s4: lithium scratch2 | 145 // s4: lithium scratch2 |
| 147 #define DECLARE_REGISTER(R) const Register R = {Register::kCode_##R}; | 146 #define DECLARE_REGISTER(R) constexpr Register R = {Register::kCode_##R}; |
| 148 GENERAL_REGISTERS(DECLARE_REGISTER) | 147 GENERAL_REGISTERS(DECLARE_REGISTER) |
| 149 #undef DECLARE_REGISTER | 148 #undef DECLARE_REGISTER |
| 150 const Register no_reg = {Register::kCode_no_reg}; | 149 constexpr Register no_reg = {Register::kCode_no_reg}; |
| 151 | |
| 152 | 150 |
| 153 int ToNumber(Register reg); | 151 int ToNumber(Register reg); |
| 154 | 152 |
| 155 Register ToRegister(int num); | 153 Register ToRegister(int num); |
| 156 | 154 |
| 157 static const bool kSimpleFPAliasing = true; | 155 constexpr bool kSimpleFPAliasing = true; |
| 158 static const bool kSimdMaskRegisters = false; | 156 constexpr bool kSimdMaskRegisters = false; |
| 159 | 157 |
| 160 // Coprocessor register. | 158 // Coprocessor register. |
| 161 struct FPURegister { | 159 struct FPURegister { |
| 162 enum Code { | 160 enum Code { |
| 163 #define REGISTER_CODE(R) kCode_##R, | 161 #define REGISTER_CODE(R) kCode_##R, |
| 164 DOUBLE_REGISTERS(REGISTER_CODE) | 162 DOUBLE_REGISTERS(REGISTER_CODE) |
| 165 #undef REGISTER_CODE | 163 #undef REGISTER_CODE |
| 166 kAfterLast, | 164 kAfterLast, |
| 167 kCode_no_reg = -1 | 165 kCode_no_reg = -1 |
| 168 }; | 166 }; |
| 169 | 167 |
| 170 static const int kMaxNumRegisters = Code::kAfterLast; | 168 static constexpr int kMaxNumRegisters = Code::kAfterLast; |
| 171 | 169 |
| 172 inline static int NumRegisters(); | 170 inline static int NumRegisters(); |
| 173 | 171 |
| 174 // TODO(plind): Warning, inconsistent numbering here. kNumFPURegisters refers | 172 // TODO(plind): Warning, inconsistent numbering here. kNumFPURegisters refers |
| 175 // to number of 32-bit FPU regs, but kNumAllocatableRegisters refers to | 173 // to number of 32-bit FPU regs, but kNumAllocatableRegisters refers to |
| 176 // number of Double regs (64-bit regs, or FPU-reg-pairs). | 174 // number of Double regs (64-bit regs, or FPU-reg-pairs). |
| 177 | 175 |
| 178 bool is_valid() const { return 0 <= reg_code && reg_code < kMaxNumRegisters; } | 176 bool is_valid() const { return 0 <= reg_code && reg_code < kMaxNumRegisters; } |
| 179 bool is(FPURegister reg) const { return reg_code == reg.reg_code; } | 177 bool is(FPURegister reg) const { return reg_code == reg.reg_code; } |
| 180 FPURegister low() const { | 178 FPURegister low() const { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 // but it is not in common use. Someday we will want to support this in v8.) | 227 // but it is not in common use. Someday we will want to support this in v8.) |
| 230 | 228 |
| 231 // For O32 ABI, Floats and Doubles refer to same set of 32 32-bit registers. | 229 // For O32 ABI, Floats and Doubles refer to same set of 32 32-bit registers. |
| 232 typedef FPURegister FloatRegister; | 230 typedef FPURegister FloatRegister; |
| 233 | 231 |
| 234 typedef FPURegister DoubleRegister; | 232 typedef FPURegister DoubleRegister; |
| 235 | 233 |
| 236 // TODO(mips) Define SIMD registers. | 234 // TODO(mips) Define SIMD registers. |
| 237 typedef FPURegister Simd128Register; | 235 typedef FPURegister Simd128Register; |
| 238 | 236 |
| 239 const DoubleRegister no_freg = {-1}; | 237 constexpr DoubleRegister no_freg = {-1}; |
| 240 | 238 |
| 241 const DoubleRegister f0 = {0}; // Return value in hard float mode. | 239 constexpr DoubleRegister f0 = {0}; // Return value in hard float mode. |
| 242 const DoubleRegister f1 = {1}; | 240 constexpr DoubleRegister f1 = {1}; |
| 243 const DoubleRegister f2 = {2}; | 241 constexpr DoubleRegister f2 = {2}; |
| 244 const DoubleRegister f3 = {3}; | 242 constexpr DoubleRegister f3 = {3}; |
| 245 const DoubleRegister f4 = {4}; | 243 constexpr DoubleRegister f4 = {4}; |
| 246 const DoubleRegister f5 = {5}; | 244 constexpr DoubleRegister f5 = {5}; |
| 247 const DoubleRegister f6 = {6}; | 245 constexpr DoubleRegister f6 = {6}; |
| 248 const DoubleRegister f7 = {7}; | 246 constexpr DoubleRegister f7 = {7}; |
| 249 const DoubleRegister f8 = {8}; | 247 constexpr DoubleRegister f8 = {8}; |
| 250 const DoubleRegister f9 = {9}; | 248 constexpr DoubleRegister f9 = {9}; |
| 251 const DoubleRegister f10 = {10}; | 249 constexpr DoubleRegister f10 = {10}; |
| 252 const DoubleRegister f11 = {11}; | 250 constexpr DoubleRegister f11 = {11}; |
| 253 const DoubleRegister f12 = {12}; // Arg 0 in hard float mode. | 251 constexpr DoubleRegister f12 = {12}; // Arg 0 in hard float mode. |
| 254 const DoubleRegister f13 = {13}; | 252 constexpr DoubleRegister f13 = {13}; |
| 255 const DoubleRegister f14 = {14}; // Arg 1 in hard float mode. | 253 constexpr DoubleRegister f14 = {14}; // Arg 1 in hard float mode. |
| 256 const DoubleRegister f15 = {15}; | 254 constexpr DoubleRegister f15 = {15}; |
| 257 const DoubleRegister f16 = {16}; | 255 constexpr DoubleRegister f16 = {16}; |
| 258 const DoubleRegister f17 = {17}; | 256 constexpr DoubleRegister f17 = {17}; |
| 259 const DoubleRegister f18 = {18}; | 257 constexpr DoubleRegister f18 = {18}; |
| 260 const DoubleRegister f19 = {19}; | 258 constexpr DoubleRegister f19 = {19}; |
| 261 const DoubleRegister f20 = {20}; | 259 constexpr DoubleRegister f20 = {20}; |
| 262 const DoubleRegister f21 = {21}; | 260 constexpr DoubleRegister f21 = {21}; |
| 263 const DoubleRegister f22 = {22}; | 261 constexpr DoubleRegister f22 = {22}; |
| 264 const DoubleRegister f23 = {23}; | 262 constexpr DoubleRegister f23 = {23}; |
| 265 const DoubleRegister f24 = {24}; | 263 constexpr DoubleRegister f24 = {24}; |
| 266 const DoubleRegister f25 = {25}; | 264 constexpr DoubleRegister f25 = {25}; |
| 267 const DoubleRegister f26 = {26}; | 265 constexpr DoubleRegister f26 = {26}; |
| 268 const DoubleRegister f27 = {27}; | 266 constexpr DoubleRegister f27 = {27}; |
| 269 const DoubleRegister f28 = {28}; | 267 constexpr DoubleRegister f28 = {28}; |
| 270 const DoubleRegister f29 = {29}; | 268 constexpr DoubleRegister f29 = {29}; |
| 271 const DoubleRegister f30 = {30}; | 269 constexpr DoubleRegister f30 = {30}; |
| 272 const DoubleRegister f31 = {31}; | 270 constexpr DoubleRegister f31 = {31}; |
| 273 | 271 |
| 274 // Register aliases. | 272 // Register aliases. |
| 275 // cp is assumed to be a callee saved register. | 273 // cp is assumed to be a callee saved register. |
| 276 // Defined using #define instead of "static const Register&" because Clang | 274 constexpr Register kRootRegister = s6; |
| 277 // complains otherwise when a compilation unit that includes this header | 275 constexpr Register cp = s7; |
| 278 // doesn't use the variables. | 276 constexpr Register kLithiumScratchReg = s3; |
| 279 #define kRootRegister s6 | 277 constexpr Register kLithiumScratchReg2 = s4; |
| 280 #define cp s7 | 278 constexpr DoubleRegister kLithiumScratchDouble = f30; |
| 281 #define kLithiumScratchReg s3 | 279 constexpr DoubleRegister kDoubleRegZero = f28; |
| 282 #define kLithiumScratchReg2 s4 | |
| 283 #define kLithiumScratchDouble f30 | |
| 284 #define kDoubleRegZero f28 | |
| 285 // Used on mips32r6 for compare operations. | 280 // Used on mips32r6 for compare operations. |
| 286 #define kDoubleCompareReg f26 | 281 constexpr DoubleRegister kDoubleCompareReg = f26; |
| 287 | 282 |
| 288 // FPU (coprocessor 1) control registers. | 283 // FPU (coprocessor 1) control registers. |
| 289 // Currently only FCSR (#31) is implemented. | 284 // Currently only FCSR (#31) is implemented. |
| 290 struct FPUControlRegister { | 285 struct FPUControlRegister { |
| 291 bool is_valid() const { return reg_code == kFCSRRegister; } | 286 bool is_valid() const { return reg_code == kFCSRRegister; } |
| 292 bool is(FPUControlRegister creg) const { return reg_code == creg.reg_code; } | 287 bool is(FPUControlRegister creg) const { return reg_code == creg.reg_code; } |
| 293 int code() const { | 288 int code() const { |
| 294 DCHECK(is_valid()); | 289 DCHECK(is_valid()); |
| 295 return reg_code; | 290 return reg_code; |
| 296 } | 291 } |
| 297 int bit() const { | 292 int bit() const { |
| 298 DCHECK(is_valid()); | 293 DCHECK(is_valid()); |
| 299 return 1 << reg_code; | 294 return 1 << reg_code; |
| 300 } | 295 } |
| 301 void setcode(int f) { | 296 void setcode(int f) { |
| 302 reg_code = f; | 297 reg_code = f; |
| 303 DCHECK(is_valid()); | 298 DCHECK(is_valid()); |
| 304 } | 299 } |
| 305 // Unfortunately we can't make this private in a struct. | 300 // Unfortunately we can't make this private in a struct. |
| 306 int reg_code; | 301 int reg_code; |
| 307 }; | 302 }; |
| 308 | 303 |
| 309 const FPUControlRegister no_fpucreg = { kInvalidFPUControlRegister }; | 304 constexpr FPUControlRegister no_fpucreg = {kInvalidFPUControlRegister}; |
| 310 const FPUControlRegister FCSR = { kFCSRRegister }; | 305 constexpr FPUControlRegister FCSR = {kFCSRRegister}; |
| 311 | 306 |
| 312 // ----------------------------------------------------------------------------- | 307 // ----------------------------------------------------------------------------- |
| 313 // Machine instruction Operands. | 308 // Machine instruction Operands. |
| 314 | 309 |
| 315 // Class Operand represents a shifter operand in data processing instructions. | 310 // Class Operand represents a shifter operand in data processing instructions. |
| 316 class Operand BASE_EMBEDDED { | 311 class Operand BASE_EMBEDDED { |
| 317 public: | 312 public: |
| 318 // Immediate. | 313 // Immediate. |
| 319 INLINE(explicit Operand(int32_t immediate, | 314 INLINE(explicit Operand(int32_t immediate, |
| 320 RelocInfo::Mode rmode = RelocInfo::NONE32)); | 315 RelocInfo::Mode rmode = RelocInfo::NONE32)); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 instruction_payload - kInstructionsFor32BitConstant * kInstrSize, code, | 490 instruction_payload - kInstructionsFor32BitConstant * kInstrSize, code, |
| 496 target); | 491 target); |
| 497 } | 492 } |
| 498 | 493 |
| 499 // This sets the internal reference at the pc. | 494 // This sets the internal reference at the pc. |
| 500 inline static void deserialization_set_target_internal_reference_at( | 495 inline static void deserialization_set_target_internal_reference_at( |
| 501 Isolate* isolate, Address pc, Address target, | 496 Isolate* isolate, Address pc, Address target, |
| 502 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE); | 497 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE); |
| 503 | 498 |
| 504 // Size of an instruction. | 499 // Size of an instruction. |
| 505 static const int kInstrSize = sizeof(Instr); | 500 static constexpr int kInstrSize = sizeof(Instr); |
| 506 | 501 |
| 507 // Difference between address of current opcode and target address offset. | 502 // Difference between address of current opcode and target address offset. |
| 508 static const int kBranchPCOffset = 4; | 503 static constexpr int kBranchPCOffset = 4; |
| 509 | 504 |
| 510 // Here we are patching the address in the LUI/ORI instruction pair. | 505 // Here we are patching the address in the LUI/ORI instruction pair. |
| 511 // These values are used in the serialization process and must be zero for | 506 // These values are used in the serialization process and must be zero for |
| 512 // MIPS platform, as Code, Embedded Object or External-reference pointers | 507 // MIPS platform, as Code, Embedded Object or External-reference pointers |
| 513 // are split across two consecutive instructions and don't exist separately | 508 // are split across two consecutive instructions and don't exist separately |
| 514 // in the code, so the serializer should not step forwards in memory after | 509 // in the code, so the serializer should not step forwards in memory after |
| 515 // a target is resolved and written. | 510 // a target is resolved and written. |
| 516 static const int kSpecialTargetSize = 0; | 511 static constexpr int kSpecialTargetSize = 0; |
| 517 | 512 |
| 518 // Number of consecutive instructions used to store 32bit constant. This | 513 // Number of consecutive instructions used to store 32bit constant. This |
| 519 // constant is used in RelocInfo::target_address_address() function to tell | 514 // constant is used in RelocInfo::target_address_address() function to tell |
| 520 // serializer address of the instruction that follows LUI/ORI instruction | 515 // serializer address of the instruction that follows LUI/ORI instruction |
| 521 // pair. | 516 // pair. |
| 522 static const int kInstructionsFor32BitConstant = 2; | 517 static constexpr int kInstructionsFor32BitConstant = 2; |
| 523 | 518 |
| 524 // Distance between the instruction referring to the address of the call | 519 // Distance between the instruction referring to the address of the call |
| 525 // target and the return address. | 520 // target and the return address. |
| 526 #ifdef _MIPS_ARCH_MIPS32R6 | 521 #ifdef _MIPS_ARCH_MIPS32R6 |
| 527 static const int kCallTargetAddressOffset = 3 * kInstrSize; | 522 static constexpr int kCallTargetAddressOffset = 3 * kInstrSize; |
| 528 #else | 523 #else |
| 529 static const int kCallTargetAddressOffset = 4 * kInstrSize; | 524 static constexpr int kCallTargetAddressOffset = 4 * kInstrSize; |
| 530 #endif | 525 #endif |
| 531 | 526 |
| 532 // Distance between start of patched debug break slot and the emitted address | 527 // Distance between start of patched debug break slot and the emitted address |
| 533 // to jump to. | 528 // to jump to. |
| 534 static const int kPatchDebugBreakSlotAddressOffset = 4 * kInstrSize; | 529 static constexpr int kPatchDebugBreakSlotAddressOffset = 4 * kInstrSize; |
| 535 | 530 |
| 536 // Difference between address of current opcode and value read from pc | 531 // Difference between address of current opcode and value read from pc |
| 537 // register. | 532 // register. |
| 538 static const int kPcLoadDelta = 4; | 533 static constexpr int kPcLoadDelta = 4; |
| 539 | 534 |
| 540 #ifdef _MIPS_ARCH_MIPS32R6 | 535 #ifdef _MIPS_ARCH_MIPS32R6 |
| 541 static const int kDebugBreakSlotInstructions = 3; | 536 static constexpr int kDebugBreakSlotInstructions = 3; |
| 542 #else | 537 #else |
| 543 static const int kDebugBreakSlotInstructions = 4; | 538 static constexpr int kDebugBreakSlotInstructions = 4; |
| 544 #endif | 539 #endif |
| 545 static const int kDebugBreakSlotLength = | 540 static constexpr int kDebugBreakSlotLength = |
| 546 kDebugBreakSlotInstructions * kInstrSize; | 541 kDebugBreakSlotInstructions * kInstrSize; |
| 547 | 542 |
| 548 // Max offset for instructions with 16-bit offset field | 543 // Max offset for instructions with 16-bit offset field |
| 549 static const int kMaxBranchOffset = (1 << (18 - 1)) - 1; | 544 static constexpr int kMaxBranchOffset = (1 << (18 - 1)) - 1; |
| 550 | 545 |
| 551 // Max offset for compact branch instructions with 26-bit offset field | 546 // Max offset for compact branch instructions with 26-bit offset field |
| 552 static const int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1; | 547 static constexpr int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1; |
| 553 | 548 |
| 554 #ifdef _MIPS_ARCH_MIPS32R6 | 549 #ifdef _MIPS_ARCH_MIPS32R6 |
| 555 static const int kTrampolineSlotsSize = 2 * kInstrSize; | 550 static constexpr int kTrampolineSlotsSize = 2 * kInstrSize; |
| 556 #else | 551 #else |
| 557 static const int kTrampolineSlotsSize = 4 * kInstrSize; | 552 static constexpr int kTrampolineSlotsSize = 4 * kInstrSize; |
| 558 #endif | 553 #endif |
| 559 | 554 |
| 560 // --------------------------------------------------------------------------- | 555 // --------------------------------------------------------------------------- |
| 561 // Code generation. | 556 // Code generation. |
| 562 | 557 |
| 563 // Insert the smallest number of nop instructions | 558 // Insert the smallest number of nop instructions |
| 564 // possible to align the pc offset to a multiple | 559 // possible to align the pc offset to a multiple |
| 565 // of m. m must be a power of 2 (>= 4). | 560 // of m. m must be a power of 2 (>= 4). |
| 566 void Align(int m); | 561 void Align(int m); |
| 567 // Insert the smallest number of zero bytes possible to align the pc offset | 562 // Insert the smallest number of zero bytes possible to align the pc offset |
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 inline void CheckTrampolinePoolQuick(int extra_instructions = 0); | 1251 inline void CheckTrampolinePoolQuick(int extra_instructions = 0); |
| 1257 | 1252 |
| 1258 inline void CheckBuffer(); | 1253 inline void CheckBuffer(); |
| 1259 | 1254 |
| 1260 private: | 1255 private: |
| 1261 inline static void set_target_internal_reference_encoded_at(Address pc, | 1256 inline static void set_target_internal_reference_encoded_at(Address pc, |
| 1262 Address target); | 1257 Address target); |
| 1263 | 1258 |
| 1264 // Buffer size and constant pool distance are checked together at regular | 1259 // Buffer size and constant pool distance are checked together at regular |
| 1265 // intervals of kBufferCheckInterval emitted bytes. | 1260 // intervals of kBufferCheckInterval emitted bytes. |
| 1266 static const int kBufferCheckInterval = 1*KB/2; | 1261 static constexpr int kBufferCheckInterval = 1 * KB / 2; |
| 1267 | 1262 |
| 1268 // Code generation. | 1263 // Code generation. |
| 1269 // The relocation writer's position is at least kGap bytes below the end of | 1264 // The relocation writer's position is at least kGap bytes below the end of |
| 1270 // the generated instructions. This is so that multi-instruction sequences do | 1265 // the generated instructions. This is so that multi-instruction sequences do |
| 1271 // not have to check for overflow. The same is true for writes of large | 1266 // not have to check for overflow. The same is true for writes of large |
| 1272 // relocation info entries. | 1267 // relocation info entries. |
| 1273 static const int kGap = 32; | 1268 static constexpr int kGap = 32; |
| 1274 | |
| 1275 | 1269 |
| 1276 // Repeated checking whether the trampoline pool should be emitted is rather | 1270 // Repeated checking whether the trampoline pool should be emitted is rather |
| 1277 // expensive. By default we only check again once a number of instructions | 1271 // expensive. By default we only check again once a number of instructions |
| 1278 // has been generated. | 1272 // has been generated. |
| 1279 static const int kCheckConstIntervalInst = 32; | 1273 static constexpr int kCheckConstIntervalInst = 32; |
| 1280 static const int kCheckConstInterval = kCheckConstIntervalInst * kInstrSize; | 1274 static constexpr int kCheckConstInterval = |
| 1275 kCheckConstIntervalInst * kInstrSize; |
| 1281 | 1276 |
| 1282 int next_buffer_check_; // pc offset of next buffer check. | 1277 int next_buffer_check_; // pc offset of next buffer check. |
| 1283 | 1278 |
| 1284 // Emission of the trampoline pool may be blocked in some code sequences. | 1279 // Emission of the trampoline pool may be blocked in some code sequences. |
| 1285 int trampoline_pool_blocked_nesting_; // Block emission if this is not zero. | 1280 int trampoline_pool_blocked_nesting_; // Block emission if this is not zero. |
| 1286 int no_trampoline_pool_before_; // Block emission before this pc offset. | 1281 int no_trampoline_pool_before_; // Block emission before this pc offset. |
| 1287 | 1282 |
| 1288 // Keep track of the last emitted pool to guarantee a maximal distance. | 1283 // Keep track of the last emitted pool to guarantee a maximal distance. |
| 1289 int last_trampoline_pool_end_; // pc offset of the end of the last pool. | 1284 int last_trampoline_pool_end_; // pc offset of the end of the last pool. |
| 1290 | 1285 |
| 1291 // Automatic growth of the assembly buffer may be blocked for some sequences. | 1286 // Automatic growth of the assembly buffer may be blocked for some sequences. |
| 1292 bool block_buffer_growth_; // Block growth when true. | 1287 bool block_buffer_growth_; // Block growth when true. |
| 1293 | 1288 |
| 1294 // Relocation information generation. | 1289 // Relocation information generation. |
| 1295 // Each relocation is encoded as a variable size value. | 1290 // Each relocation is encoded as a variable size value. |
| 1296 static const int kMaxRelocSize = RelocInfoWriter::kMaxSize; | 1291 static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize; |
| 1297 RelocInfoWriter reloc_info_writer; | 1292 RelocInfoWriter reloc_info_writer; |
| 1298 | 1293 |
| 1299 // The bound position, before this we cannot do instruction elimination. | 1294 // The bound position, before this we cannot do instruction elimination. |
| 1300 int last_bound_pos_; | 1295 int last_bound_pos_; |
| 1301 | 1296 |
| 1302 // Readable constants for compact branch handling in emit() | 1297 // Readable constants for compact branch handling in emit() |
| 1303 enum class CompactBranchType : bool { NO = false, COMPACT_BRANCH = true }; | 1298 enum class CompactBranchType : bool { NO = false, COMPACT_BRANCH = true }; |
| 1304 | 1299 |
| 1305 // Code emission. | 1300 // Code emission. |
| 1306 void GrowBuffer(); | 1301 void GrowBuffer(); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1440 }; | 1435 }; |
| 1441 | 1436 |
| 1442 int32_t get_trampoline_entry(int32_t pos); | 1437 int32_t get_trampoline_entry(int32_t pos); |
| 1443 int unbound_labels_count_; | 1438 int unbound_labels_count_; |
| 1444 // If trampoline is emitted, generated code is becoming large. As this is | 1439 // If trampoline is emitted, generated code is becoming large. As this is |
| 1445 // already a slow case which can possibly break our code generation for the | 1440 // already a slow case which can possibly break our code generation for the |
| 1446 // extreme case, we use this information to trigger different mode of | 1441 // extreme case, we use this information to trigger different mode of |
| 1447 // branch instruction generation, where we use jump instructions rather | 1442 // branch instruction generation, where we use jump instructions rather |
| 1448 // than regular branch instructions. | 1443 // than regular branch instructions. |
| 1449 bool trampoline_emitted_; | 1444 bool trampoline_emitted_; |
| 1450 static const int kInvalidSlotPos = -1; | 1445 static constexpr int kInvalidSlotPos = -1; |
| 1451 | 1446 |
| 1452 // Internal reference positions, required for unbounded internal reference | 1447 // Internal reference positions, required for unbounded internal reference |
| 1453 // labels. | 1448 // labels. |
| 1454 std::set<int> internal_reference_positions_; | 1449 std::set<int> internal_reference_positions_; |
| 1455 bool is_internal_reference(Label* L) { | 1450 bool is_internal_reference(Label* L) { |
| 1456 return internal_reference_positions_.find(L->pos()) != | 1451 return internal_reference_positions_.find(L->pos()) != |
| 1457 internal_reference_positions_.end(); | 1452 internal_reference_positions_.end(); |
| 1458 } | 1453 } |
| 1459 | 1454 |
| 1460 void EmittedCompactBranchInstruction() { prev_instr_compact_branch_ = true; } | 1455 void EmittedCompactBranchInstruction() { prev_instr_compact_branch_ = true; } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1476 public: | 1471 public: |
| 1477 explicit EnsureSpace(Assembler* assembler) { | 1472 explicit EnsureSpace(Assembler* assembler) { |
| 1478 assembler->CheckBuffer(); | 1473 assembler->CheckBuffer(); |
| 1479 } | 1474 } |
| 1480 }; | 1475 }; |
| 1481 | 1476 |
| 1482 } // namespace internal | 1477 } // namespace internal |
| 1483 } // namespace v8 | 1478 } // namespace v8 |
| 1484 | 1479 |
| 1485 #endif // V8_ARM_ASSEMBLER_MIPS_H_ | 1480 #endif // V8_ARM_ASSEMBLER_MIPS_H_ |
| OLD | NEW |