| 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 // generation even when generating snapshots. This won't work for cross | 57 // generation even when generating snapshots. This won't work for cross |
| 58 // compilation. | 58 // compilation. |
| 59 #if defined(__mips__) && defined(__mips_hard_float) && __mips_hard_float != 0 | 59 #if defined(__mips__) && defined(__mips_hard_float) && __mips_hard_float != 0 |
| 60 answer |= 1u << FPU; | 60 answer |= 1u << FPU; |
| 61 #endif | 61 #endif |
| 62 | 62 |
| 63 return answer; | 63 return answer; |
| 64 } | 64 } |
| 65 | 65 |
| 66 | 66 |
| 67 const char* DoubleRegister::AllocationIndexToString(int index) { |
| 68 DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters); |
| 69 const char* const names[] = { |
| 70 "f0", |
| 71 "f2", |
| 72 "f4", |
| 73 "f6", |
| 74 "f8", |
| 75 "f10", |
| 76 "f12", |
| 77 "f14", |
| 78 "f16", |
| 79 "f18", |
| 80 "f20", |
| 81 "f22", |
| 82 "f24", |
| 83 "f26" |
| 84 }; |
| 85 return names[index]; |
| 86 } |
| 87 |
| 88 |
| 67 void CpuFeatures::ProbeImpl(bool cross_compile) { | 89 void CpuFeatures::ProbeImpl(bool cross_compile) { |
| 68 supported_ |= CpuFeaturesImpliedByCompiler(); | 90 supported_ |= CpuFeaturesImpliedByCompiler(); |
| 69 | 91 |
| 70 // Only use statically determined features for cross compile (snapshot). | 92 // Only use statically determined features for cross compile (snapshot). |
| 71 if (cross_compile) return; | 93 if (cross_compile) return; |
| 72 | 94 |
| 73 // If the compiler is allowed to use fpu then we can use fpu too in our | 95 // If the compiler is allowed to use fpu then we can use fpu too in our |
| 74 // code generation. | 96 // code generation. |
| 75 #ifndef __mips__ | 97 #ifndef __mips__ |
| 76 // For the simulator build, use FPU. | 98 // For the simulator build, use FPU. |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 offset_ = unit * multiplier + offset_addend; | 243 offset_ = unit * multiplier + offset_addend; |
| 222 } | 244 } |
| 223 | 245 |
| 224 | 246 |
| 225 // ----------------------------------------------------------------------------- | 247 // ----------------------------------------------------------------------------- |
| 226 // Specific instructions, constants, and masks. | 248 // Specific instructions, constants, and masks. |
| 227 | 249 |
| 228 static const int kNegOffset = 0x00008000; | 250 static const int kNegOffset = 0x00008000; |
| 229 // addiu(sp, sp, 4) aka Pop() operation or part of Pop(r) | 251 // addiu(sp, sp, 4) aka Pop() operation or part of Pop(r) |
| 230 // operations as post-increment of sp. | 252 // operations as post-increment of sp. |
| 231 const Instr kPopInstruction = ADDIU | (Register::kCode_sp << kRsShift) | | 253 const Instr kPopInstruction = ADDIU | (kRegister_sp_Code << kRsShift) |
| 232 (Register::kCode_sp << kRtShift) | | 254 | (kRegister_sp_Code << kRtShift) |
| 233 (kPointerSize & kImm16Mask); // NOLINT | 255 | (kPointerSize & kImm16Mask); // NOLINT |
| 234 // addiu(sp, sp, -4) part of Push(r) operation as pre-decrement of sp. | 256 // addiu(sp, sp, -4) part of Push(r) operation as pre-decrement of sp. |
| 235 const Instr kPushInstruction = ADDIU | (Register::kCode_sp << kRsShift) | | 257 const Instr kPushInstruction = ADDIU | (kRegister_sp_Code << kRsShift) |
| 236 (Register::kCode_sp << kRtShift) | | 258 | (kRegister_sp_Code << kRtShift) |
| 237 (-kPointerSize & kImm16Mask); // NOLINT | 259 | (-kPointerSize & kImm16Mask); // NOLINT |
| 238 // sw(r, MemOperand(sp, 0)) | 260 // sw(r, MemOperand(sp, 0)) |
| 239 const Instr kPushRegPattern = | 261 const Instr kPushRegPattern = SW | (kRegister_sp_Code << kRsShift) |
| 240 SW | (Register::kCode_sp << kRsShift) | (0 & kImm16Mask); // NOLINT | 262 | (0 & kImm16Mask); // NOLINT |
| 241 // lw(r, MemOperand(sp, 0)) | 263 // lw(r, MemOperand(sp, 0)) |
| 242 const Instr kPopRegPattern = | 264 const Instr kPopRegPattern = LW | (kRegister_sp_Code << kRsShift) |
| 243 LW | (Register::kCode_sp << kRsShift) | (0 & kImm16Mask); // NOLINT | 265 | (0 & kImm16Mask); // NOLINT |
| 244 | 266 |
| 245 const Instr kLwRegFpOffsetPattern = | 267 const Instr kLwRegFpOffsetPattern = LW | (kRegister_fp_Code << kRsShift) |
| 246 LW | (Register::kCode_fp << kRsShift) | (0 & kImm16Mask); // NOLINT | 268 | (0 & kImm16Mask); // NOLINT |
| 247 | 269 |
| 248 const Instr kSwRegFpOffsetPattern = | 270 const Instr kSwRegFpOffsetPattern = SW | (kRegister_fp_Code << kRsShift) |
| 249 SW | (Register::kCode_fp << kRsShift) | (0 & kImm16Mask); // NOLINT | 271 | (0 & kImm16Mask); // NOLINT |
| 250 | 272 |
| 251 const Instr kLwRegFpNegOffsetPattern = LW | (Register::kCode_fp << kRsShift) | | 273 const Instr kLwRegFpNegOffsetPattern = LW | (kRegister_fp_Code << kRsShift) |
| 252 (kNegOffset & kImm16Mask); // NOLINT | 274 | (kNegOffset & kImm16Mask); // NOLINT |
| 253 | 275 |
| 254 const Instr kSwRegFpNegOffsetPattern = SW | (Register::kCode_fp << kRsShift) | | 276 const Instr kSwRegFpNegOffsetPattern = SW | (kRegister_fp_Code << kRsShift) |
| 255 (kNegOffset & kImm16Mask); // NOLINT | 277 | (kNegOffset & kImm16Mask); // NOLINT |
| 256 // A mask for the Rt register for push, pop, lw, sw instructions. | 278 // A mask for the Rt register for push, pop, lw, sw instructions. |
| 257 const Instr kRtMask = kRtFieldMask; | 279 const Instr kRtMask = kRtFieldMask; |
| 258 const Instr kLwSwInstrTypeMask = 0xffe00000; | 280 const Instr kLwSwInstrTypeMask = 0xffe00000; |
| 259 const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask; | 281 const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask; |
| 260 const Instr kLwSwOffsetMask = kImm16Mask; | 282 const Instr kLwSwOffsetMask = kImm16Mask; |
| 261 | 283 |
| 262 | 284 |
| 263 Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) | 285 Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) |
| 264 : AssemblerBase(isolate, buffer, buffer_size), | 286 : AssemblerBase(isolate, buffer, buffer_size), |
| 265 recorded_ast_id_(TypeFeedbackId::None()), | 287 recorded_ast_id_(TypeFeedbackId::None()), |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 | 327 |
| 306 void Assembler::CodeTargetAlign() { | 328 void Assembler::CodeTargetAlign() { |
| 307 // No advantage to aligning branch/call targets to more than | 329 // No advantage to aligning branch/call targets to more than |
| 308 // single instruction, that I am aware of. | 330 // single instruction, that I am aware of. |
| 309 Align(4); | 331 Align(4); |
| 310 } | 332 } |
| 311 | 333 |
| 312 | 334 |
| 313 Register Assembler::GetRtReg(Instr instr) { | 335 Register Assembler::GetRtReg(Instr instr) { |
| 314 Register rt; | 336 Register rt; |
| 315 rt.reg_code = (instr & kRtFieldMask) >> kRtShift; | 337 rt.code_ = (instr & kRtFieldMask) >> kRtShift; |
| 316 return rt; | 338 return rt; |
| 317 } | 339 } |
| 318 | 340 |
| 319 | 341 |
| 320 Register Assembler::GetRsReg(Instr instr) { | 342 Register Assembler::GetRsReg(Instr instr) { |
| 321 Register rs; | 343 Register rs; |
| 322 rs.reg_code = (instr & kRsFieldMask) >> kRsShift; | 344 rs.code_ = (instr & kRsFieldMask) >> kRsShift; |
| 323 return rs; | 345 return rs; |
| 324 } | 346 } |
| 325 | 347 |
| 326 | 348 |
| 327 Register Assembler::GetRdReg(Instr instr) { | 349 Register Assembler::GetRdReg(Instr instr) { |
| 328 Register rd; | 350 Register rd; |
| 329 rd.reg_code = (instr & kRdFieldMask) >> kRdShift; | 351 rd.code_ = (instr & kRdFieldMask) >> kRdShift; |
| 330 return rd; | 352 return rd; |
| 331 } | 353 } |
| 332 | 354 |
| 333 | 355 |
| 334 uint32_t Assembler::GetRt(Instr instr) { | 356 uint32_t Assembler::GetRt(Instr instr) { |
| 335 return (instr & kRtFieldMask) >> kRtShift; | 357 return (instr & kRtFieldMask) >> kRtShift; |
| 336 } | 358 } |
| 337 | 359 |
| 338 | 360 |
| 339 uint32_t Assembler::GetRtField(Instr instr) { | 361 uint32_t Assembler::GetRtField(Instr instr) { |
| (...skipping 1573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 } | 1935 } |
| 1914 | 1936 |
| 1915 | 1937 |
| 1916 void Assembler::movn(Register rd, Register rs, Register rt) { | 1938 void Assembler::movn(Register rd, Register rs, Register rt) { |
| 1917 GenInstrRegister(SPECIAL, rs, rt, rd, 0, MOVN); | 1939 GenInstrRegister(SPECIAL, rs, rt, rd, 0, MOVN); |
| 1918 } | 1940 } |
| 1919 | 1941 |
| 1920 | 1942 |
| 1921 void Assembler::movt(Register rd, Register rs, uint16_t cc) { | 1943 void Assembler::movt(Register rd, Register rs, uint16_t cc) { |
| 1922 Register rt; | 1944 Register rt; |
| 1923 rt.reg_code = (cc & 0x0007) << 2 | 1; | 1945 rt.code_ = (cc & 0x0007) << 2 | 1; |
| 1924 GenInstrRegister(SPECIAL, rs, rt, rd, 0, MOVCI); | 1946 GenInstrRegister(SPECIAL, rs, rt, rd, 0, MOVCI); |
| 1925 } | 1947 } |
| 1926 | 1948 |
| 1927 | 1949 |
| 1928 void Assembler::movf(Register rd, Register rs, uint16_t cc) { | 1950 void Assembler::movf(Register rd, Register rs, uint16_t cc) { |
| 1929 Register rt; | 1951 Register rt; |
| 1930 rt.reg_code = (cc & 0x0007) << 2 | 0; | 1952 rt.code_ = (cc & 0x0007) << 2 | 0; |
| 1931 GenInstrRegister(SPECIAL, rs, rt, rd, 0, MOVCI); | 1953 GenInstrRegister(SPECIAL, rs, rt, rd, 0, MOVCI); |
| 1932 } | 1954 } |
| 1933 | 1955 |
| 1934 | 1956 |
| 1935 void Assembler::seleqz(Register rd, Register rs, Register rt) { | 1957 void Assembler::seleqz(Register rd, Register rs, Register rt) { |
| 1936 DCHECK(IsMipsArchVariant(kMips32r6)); | 1958 DCHECK(IsMipsArchVariant(kMips32r6)); |
| 1937 GenInstrRegister(SPECIAL, rs, rt, rd, 0, SELEQZ_S); | 1959 GenInstrRegister(SPECIAL, rs, rt, rd, 0, SELEQZ_S); |
| 1938 } | 1960 } |
| 1939 | 1961 |
| 1940 | 1962 |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2204 | 2226 |
| 2205 void Assembler::movz_d(FPURegister fd, FPURegister fs, Register rt) { | 2227 void Assembler::movz_d(FPURegister fd, FPURegister fs, Register rt) { |
| 2206 DCHECK(IsMipsArchVariant(kMips32r2)); | 2228 DCHECK(IsMipsArchVariant(kMips32r2)); |
| 2207 GenInstrRegister(COP1, D, rt, fs, fd, MOVZ_C); | 2229 GenInstrRegister(COP1, D, rt, fs, fd, MOVZ_C); |
| 2208 } | 2230 } |
| 2209 | 2231 |
| 2210 | 2232 |
| 2211 void Assembler::movt_s(FPURegister fd, FPURegister fs, uint16_t cc) { | 2233 void Assembler::movt_s(FPURegister fd, FPURegister fs, uint16_t cc) { |
| 2212 DCHECK(IsMipsArchVariant(kMips32r2)); | 2234 DCHECK(IsMipsArchVariant(kMips32r2)); |
| 2213 FPURegister ft; | 2235 FPURegister ft; |
| 2214 ft.reg_code = (cc & 0x0007) << 2 | 1; | 2236 ft.code_ = (cc & 0x0007) << 2 | 1; |
| 2215 GenInstrRegister(COP1, S, ft, fs, fd, MOVF); | 2237 GenInstrRegister(COP1, S, ft, fs, fd, MOVF); |
| 2216 } | 2238 } |
| 2217 | 2239 |
| 2218 | 2240 |
| 2219 void Assembler::movt_d(FPURegister fd, FPURegister fs, uint16_t cc) { | 2241 void Assembler::movt_d(FPURegister fd, FPURegister fs, uint16_t cc) { |
| 2220 DCHECK(IsMipsArchVariant(kMips32r2)); | 2242 DCHECK(IsMipsArchVariant(kMips32r2)); |
| 2221 FPURegister ft; | 2243 FPURegister ft; |
| 2222 ft.reg_code = (cc & 0x0007) << 2 | 1; | 2244 ft.code_ = (cc & 0x0007) << 2 | 1; |
| 2223 GenInstrRegister(COP1, D, ft, fs, fd, MOVF); | 2245 GenInstrRegister(COP1, D, ft, fs, fd, MOVF); |
| 2224 } | 2246 } |
| 2225 | 2247 |
| 2226 | 2248 |
| 2227 void Assembler::movf_s(FPURegister fd, FPURegister fs, uint16_t cc) { | 2249 void Assembler::movf_s(FPURegister fd, FPURegister fs, uint16_t cc) { |
| 2228 DCHECK(IsMipsArchVariant(kMips32r2)); | 2250 DCHECK(IsMipsArchVariant(kMips32r2)); |
| 2229 FPURegister ft; | 2251 FPURegister ft; |
| 2230 ft.reg_code = (cc & 0x0007) << 2 | 0; | 2252 ft.code_ = (cc & 0x0007) << 2 | 0; |
| 2231 GenInstrRegister(COP1, S, ft, fs, fd, MOVF); | 2253 GenInstrRegister(COP1, S, ft, fs, fd, MOVF); |
| 2232 } | 2254 } |
| 2233 | 2255 |
| 2234 | 2256 |
| 2235 void Assembler::movf_d(FPURegister fd, FPURegister fs, uint16_t cc) { | 2257 void Assembler::movf_d(FPURegister fd, FPURegister fs, uint16_t cc) { |
| 2236 DCHECK(IsMipsArchVariant(kMips32r2)); | 2258 DCHECK(IsMipsArchVariant(kMips32r2)); |
| 2237 FPURegister ft; | 2259 FPURegister ft; |
| 2238 ft.reg_code = (cc & 0x0007) << 2 | 0; | 2260 ft.code_ = (cc & 0x0007) << 2 | 0; |
| 2239 GenInstrRegister(COP1, D, ft, fs, fd, MOVF); | 2261 GenInstrRegister(COP1, D, ft, fs, fd, MOVF); |
| 2240 } | 2262 } |
| 2241 | 2263 |
| 2242 | 2264 |
| 2243 // Arithmetic. | 2265 // Arithmetic. |
| 2244 | 2266 |
| 2245 void Assembler::add_s(FPURegister fd, FPURegister fs, FPURegister ft) { | 2267 void Assembler::add_s(FPURegister fd, FPURegister fs, FPURegister ft) { |
| 2246 GenInstrRegister(COP1, S, ft, fs, fd, ADD_S); | 2268 GenInstrRegister(COP1, S, ft, fs, fd, ADD_S); |
| 2247 } | 2269 } |
| 2248 | 2270 |
| (...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3074 if (patched) { | 3096 if (patched) { |
| 3075 CpuFeatures::FlushICache(pc + 2, sizeof(Address)); | 3097 CpuFeatures::FlushICache(pc + 2, sizeof(Address)); |
| 3076 } | 3098 } |
| 3077 } | 3099 } |
| 3078 | 3100 |
| 3079 | 3101 |
| 3080 } // namespace internal | 3102 } // namespace internal |
| 3081 } // namespace v8 | 3103 } // namespace v8 |
| 3082 | 3104 |
| 3083 #endif // V8_TARGET_ARCH_MIPS | 3105 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |