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 | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 return reg_code; | 173 return reg_code; |
174 } | 174 } |
175 int bit() const { | 175 int bit() const { |
176 DCHECK(is_valid()); | 176 DCHECK(is_valid()); |
177 return 1 << reg_code; | 177 return 1 << reg_code; |
178 } | 178 } |
179 static SwVfpRegister from_code(int code) { | 179 static SwVfpRegister from_code(int code) { |
180 SwVfpRegister r = {code}; | 180 SwVfpRegister r = {code}; |
181 return r; | 181 return r; |
182 } | 182 } |
183 void split_code(int* vm, int* m) const { | 183 static void split_code(int reg_code, int* vm, int* m) { |
184 DCHECK(is_valid()); | 184 DCHECK(from_code(reg_code).is_valid()); |
185 *m = reg_code & 0x1; | 185 *m = reg_code & 0x1; |
186 *vm = reg_code >> 1; | 186 *vm = reg_code >> 1; |
187 } | 187 } |
| 188 void split_code(int* vm, int* m) const { |
| 189 split_code(reg_code, vm, m); |
| 190 } |
188 | 191 |
189 int reg_code; | 192 int reg_code; |
190 }; | 193 }; |
191 | 194 |
192 typedef SwVfpRegister FloatRegister; | 195 typedef SwVfpRegister FloatRegister; |
193 | 196 |
194 // Double word VFP register. | 197 // Double word VFP register. |
195 struct DwVfpRegister { | 198 struct DwVfpRegister { |
196 enum Code { | 199 enum Code { |
197 #define REGISTER_CODE(R) kCode_##R, | 200 #define REGISTER_CODE(R) kCode_##R, |
(...skipping 21 matching lines...) Expand all Loading... |
219 } | 222 } |
220 int bit() const { | 223 int bit() const { |
221 DCHECK(is_valid()); | 224 DCHECK(is_valid()); |
222 return 1 << reg_code; | 225 return 1 << reg_code; |
223 } | 226 } |
224 | 227 |
225 static DwVfpRegister from_code(int code) { | 228 static DwVfpRegister from_code(int code) { |
226 DwVfpRegister r = {code}; | 229 DwVfpRegister r = {code}; |
227 return r; | 230 return r; |
228 } | 231 } |
229 void split_code(int* vm, int* m) const { | 232 static void split_code(int reg_code, int* vm, int* m) { |
230 DCHECK(is_valid()); | 233 DCHECK(from_code(reg_code).is_valid()); |
231 *m = (reg_code & 0x10) >> 4; | 234 *m = (reg_code & 0x10) >> 4; |
232 *vm = reg_code & 0x0F; | 235 *vm = reg_code & 0x0F; |
233 } | 236 } |
| 237 void split_code(int* vm, int* m) const { |
| 238 split_code(reg_code, vm, m); |
| 239 } |
234 | 240 |
235 int reg_code; | 241 int reg_code; |
236 }; | 242 }; |
237 | 243 |
238 | 244 |
239 typedef DwVfpRegister DoubleRegister; | 245 typedef DwVfpRegister DoubleRegister; |
240 | 246 |
241 | 247 |
242 // Double word VFP register d0-15. | 248 // Double word VFP register d0-15. |
243 struct LowDwVfpRegister { | 249 struct LowDwVfpRegister { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 } | 295 } |
290 | 296 |
291 bool is_valid() const { | 297 bool is_valid() const { |
292 return (0 <= reg_code) && (reg_code < kMaxNumRegisters); | 298 return (0 <= reg_code) && (reg_code < kMaxNumRegisters); |
293 } | 299 } |
294 bool is(QwNeonRegister reg) const { return reg_code == reg.reg_code; } | 300 bool is(QwNeonRegister reg) const { return reg_code == reg.reg_code; } |
295 int code() const { | 301 int code() const { |
296 DCHECK(is_valid()); | 302 DCHECK(is_valid()); |
297 return reg_code; | 303 return reg_code; |
298 } | 304 } |
299 void split_code(int* vm, int* m) const { | 305 static void split_code(int reg_code, int* vm, int* m) { |
300 DCHECK(is_valid()); | 306 DCHECK(from_code(reg_code).is_valid()); |
301 int encoded_code = reg_code << 1; | 307 int encoded_code = reg_code << 1; |
302 *m = (encoded_code & 0x10) >> 4; | 308 *m = (encoded_code & 0x10) >> 4; |
303 *vm = encoded_code & 0x0F; | 309 *vm = encoded_code & 0x0F; |
304 } | 310 } |
| 311 void split_code(int* vm, int* m) const { |
| 312 split_code(reg_code, vm, m); |
| 313 } |
305 DwVfpRegister low() const { | 314 DwVfpRegister low() const { |
306 DwVfpRegister reg; | 315 DwVfpRegister reg; |
307 reg.reg_code = reg_code * 2; | 316 reg.reg_code = reg_code * 2; |
308 | 317 |
309 DCHECK(reg.is_valid()); | 318 DCHECK(reg.is_valid()); |
310 return reg; | 319 return reg; |
311 } | 320 } |
312 DwVfpRegister high() const { | 321 DwVfpRegister high() const { |
313 DwVfpRegister reg; | 322 DwVfpRegister reg; |
314 reg.reg_code = reg_code * 2 + 1; | 323 reg.reg_code = reg_code * 2 + 1; |
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1308 const NeonMemOperand& src); | 1317 const NeonMemOperand& src); |
1309 void vst1(NeonSize size, | 1318 void vst1(NeonSize size, |
1310 const NeonListOperand& src, | 1319 const NeonListOperand& src, |
1311 const NeonMemOperand& dst); | 1320 const NeonMemOperand& dst); |
1312 void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src); | 1321 void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src); |
1313 | 1322 |
1314 // Only unconditional core <-> scalar moves are currently supported. | 1323 // Only unconditional core <-> scalar moves are currently supported. |
1315 void vmov(NeonDataType dt, DwVfpRegister dst, int index, Register src); | 1324 void vmov(NeonDataType dt, DwVfpRegister dst, int index, Register src); |
1316 void vmov(NeonDataType dt, Register dst, DwVfpRegister src, int index); | 1325 void vmov(NeonDataType dt, Register dst, DwVfpRegister src, int index); |
1317 | 1326 |
1318 void vmov(const QwNeonRegister dst, const QwNeonRegister src); | 1327 void vmov(QwNeonRegister dst, QwNeonRegister src); |
1319 void vmvn(const QwNeonRegister dst, const QwNeonRegister src); | 1328 void vdup(NeonSize size, QwNeonRegister dst, Register src); |
| 1329 void vdup(QwNeonRegister dst, SwVfpRegister src); |
| 1330 |
| 1331 void vcvt_f32_s32(QwNeonRegister dst, QwNeonRegister src); |
| 1332 void vcvt_f32_u32(QwNeonRegister dst, QwNeonRegister src); |
| 1333 void vcvt_s32_f32(QwNeonRegister dst, QwNeonRegister src); |
| 1334 void vcvt_u32_f32(QwNeonRegister dst, QwNeonRegister src); |
| 1335 |
| 1336 void vmvn(QwNeonRegister dst, QwNeonRegister src); |
1320 void vswp(DwVfpRegister dst, DwVfpRegister src); | 1337 void vswp(DwVfpRegister dst, DwVfpRegister src); |
1321 void vswp(QwNeonRegister dst, QwNeonRegister src); | 1338 void vswp(QwNeonRegister dst, QwNeonRegister src); |
1322 // vdup conditional execution isn't supported. | 1339 void vabs(QwNeonRegister dst, QwNeonRegister src); |
1323 void vdup(NeonSize size, const QwNeonRegister dst, const Register src); | 1340 void vabs(NeonSize size, QwNeonRegister dst, QwNeonRegister src); |
1324 void vdup(const QwNeonRegister dst, const SwVfpRegister src); | 1341 void vneg(QwNeonRegister dst, QwNeonRegister src); |
| 1342 void vneg(NeonSize size, QwNeonRegister dst, QwNeonRegister src); |
1325 | 1343 |
1326 void vcvt_f32_s32(const QwNeonRegister dst, const QwNeonRegister src); | 1344 void vand(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1327 void vcvt_f32_u32(const QwNeonRegister dst, const QwNeonRegister src); | |
1328 void vcvt_s32_f32(const QwNeonRegister dst, const QwNeonRegister src); | |
1329 void vcvt_u32_f32(const QwNeonRegister dst, const QwNeonRegister src); | |
1330 | |
1331 void vabs(const QwNeonRegister dst, const QwNeonRegister src); | |
1332 void vabs(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src); | |
1333 void vneg(const QwNeonRegister dst, const QwNeonRegister src); | |
1334 void vneg(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src); | |
1335 void veor(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2); | 1345 void veor(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2); |
1336 void vand(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1346 void veor(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1337 void vbsl(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1347 void vbsl(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1338 void veor(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | |
1339 void vorr(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1348 void vorr(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1340 void vadd(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1349 void vadd(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1341 void vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, | 1350 void vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, |
1342 QwNeonRegister src2); | 1351 QwNeonRegister src2); |
1343 void vqadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, | 1352 void vqadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, |
1344 QwNeonRegister src2); | 1353 QwNeonRegister src2); |
1345 void vsub(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1354 void vsub(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1346 void vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, | 1355 void vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, |
1347 QwNeonRegister src2); | 1356 QwNeonRegister src2); |
1348 void vqsub(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, | 1357 void vqsub(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, |
(...skipping 18 matching lines...) Expand all Loading... |
1367 void vrecpe(QwNeonRegister dst, QwNeonRegister src); | 1376 void vrecpe(QwNeonRegister dst, QwNeonRegister src); |
1368 void vrsqrte(QwNeonRegister dst, QwNeonRegister src); | 1377 void vrsqrte(QwNeonRegister dst, QwNeonRegister src); |
1369 void vrecps(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1378 void vrecps(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1370 void vrsqrts(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1379 void vrsqrts(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1371 void vtst(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, | 1380 void vtst(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, |
1372 QwNeonRegister src2); | 1381 QwNeonRegister src2); |
1373 void vceq(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1382 void vceq(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1374 void vceq(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, | 1383 void vceq(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, |
1375 QwNeonRegister src2); | 1384 QwNeonRegister src2); |
1376 void vcge(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1385 void vcge(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1377 void vcge(NeonDataType dt, QwNeonRegister dst, | 1386 void vcge(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, |
1378 QwNeonRegister src1, QwNeonRegister src2); | 1387 QwNeonRegister src2); |
1379 void vcgt(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); | 1388 void vcgt(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); |
1380 void vcgt(NeonDataType dt, QwNeonRegister dst, | 1389 void vcgt(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, |
1381 QwNeonRegister src1, QwNeonRegister src2); | 1390 QwNeonRegister src2); |
1382 void vext(const QwNeonRegister dst, const QwNeonRegister src1, | 1391 void vext(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2, |
1383 const QwNeonRegister src2, int bytes); | 1392 int bytes); |
1384 void vzip(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src); | 1393 void vzip(NeonSize size, QwNeonRegister src1, QwNeonRegister src2); |
1385 void vrev16(NeonSize size, const QwNeonRegister dst, | 1394 void vuzp(NeonSize size, QwNeonRegister src1, QwNeonRegister src2); |
1386 const QwNeonRegister src); | 1395 void vrev16(NeonSize size, QwNeonRegister dst, QwNeonRegister src); |
1387 void vrev32(NeonSize size, const QwNeonRegister dst, | 1396 void vrev32(NeonSize size, QwNeonRegister dst, QwNeonRegister src); |
1388 const QwNeonRegister src); | 1397 void vrev64(NeonSize size, QwNeonRegister dst, QwNeonRegister src); |
1389 void vrev64(NeonSize size, const QwNeonRegister dst, | 1398 void vtrn(NeonSize size, QwNeonRegister src1, QwNeonRegister src2); |
1390 const QwNeonRegister src); | 1399 void vtbl(DwVfpRegister dst, const NeonListOperand& list, |
1391 void vtbl(const DwVfpRegister dst, const NeonListOperand& list, | 1400 DwVfpRegister index); |
1392 const DwVfpRegister index); | 1401 void vtbx(DwVfpRegister dst, const NeonListOperand& list, |
1393 void vtbx(const DwVfpRegister dst, const NeonListOperand& list, | 1402 DwVfpRegister index); |
1394 const DwVfpRegister index); | |
1395 | 1403 |
1396 // Pseudo instructions | 1404 // Pseudo instructions |
1397 | 1405 |
1398 // Different nop operations are used by the code generator to detect certain | 1406 // Different nop operations are used by the code generator to detect certain |
1399 // states of the generated code. | 1407 // states of the generated code. |
1400 enum NopMarkerTypes { | 1408 enum NopMarkerTypes { |
1401 NON_MARKING_NOP = 0, | 1409 NON_MARKING_NOP = 0, |
1402 DEBUG_BREAK_NOP, | 1410 DEBUG_BREAK_NOP, |
1403 // IC markers. | 1411 // IC markers. |
1404 PROPERTY_ACCESS_INLINED, | 1412 PROPERTY_ACCESS_INLINED, |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1789 class EnsureSpace BASE_EMBEDDED { | 1797 class EnsureSpace BASE_EMBEDDED { |
1790 public: | 1798 public: |
1791 INLINE(explicit EnsureSpace(Assembler* assembler)); | 1799 INLINE(explicit EnsureSpace(Assembler* assembler)); |
1792 }; | 1800 }; |
1793 | 1801 |
1794 | 1802 |
1795 } // namespace internal | 1803 } // namespace internal |
1796 } // namespace v8 | 1804 } // namespace v8 |
1797 | 1805 |
1798 #endif // V8_ARM_ASSEMBLER_ARM_H_ | 1806 #endif // V8_ARM_ASSEMBLER_ARM_H_ |
OLD | NEW |