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