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 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 | 1290 |
1291 void vmovsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1291 void vmovsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1292 vsd(0x10, dst, src1, src2); | 1292 vsd(0x10, dst, src1, src2); |
1293 } | 1293 } |
1294 void vmovsd(XMMRegister dst, const Operand& src) { | 1294 void vmovsd(XMMRegister dst, const Operand& src) { |
1295 vsd(0x10, dst, xmm0, src); | 1295 vsd(0x10, dst, xmm0, src); |
1296 } | 1296 } |
1297 void vmovsd(const Operand& dst, XMMRegister src) { | 1297 void vmovsd(const Operand& dst, XMMRegister src) { |
1298 vsd(0x11, src, xmm0, dst); | 1298 vsd(0x11, src, xmm0, dst); |
1299 } | 1299 } |
1300 void vaddsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1300 |
1301 vsd(0x58, dst, src1, src2); | 1301 #define AVX_SP_3(instr, opcode) \ |
| 1302 AVX_S_3(instr, opcode) \ |
| 1303 AVX_P_3(instr, opcode) |
| 1304 |
| 1305 #define AVX_S_3(instr, opcode) \ |
| 1306 AVX_3(instr##ss, opcode, vss) \ |
| 1307 AVX_3(instr##sd, opcode, vsd) |
| 1308 |
| 1309 #define AVX_P_3(instr, opcode) \ |
| 1310 AVX_3(instr##ps, opcode, vps) \ |
| 1311 AVX_3(instr##pd, opcode, vpd) |
| 1312 |
| 1313 #define AVX_3(instr, opcode, impl) \ |
| 1314 void instr(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ |
| 1315 impl(opcode, dst, src1, src2); \ |
| 1316 } \ |
| 1317 void instr(XMMRegister dst, XMMRegister src1, const Operand& src2) { \ |
| 1318 impl(opcode, dst, src1, src2); \ |
1302 } | 1319 } |
1303 void vaddsd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1320 |
1304 vsd(0x58, dst, src1, src2); | 1321 AVX_SP_3(vadd, 0x58); |
1305 } | 1322 AVX_SP_3(vsub, 0x5c); |
1306 void vsubsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1323 AVX_SP_3(vmul, 0x59); |
1307 vsd(0x5c, dst, src1, src2); | 1324 AVX_SP_3(vdiv, 0x5e); |
1308 } | 1325 AVX_SP_3(vmin, 0x5d); |
1309 void vsubsd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1326 AVX_SP_3(vmax, 0x5f); |
1310 vsd(0x5c, dst, src1, src2); | 1327 AVX_P_3(vand, 0x54); |
1311 } | 1328 AVX_P_3(vxor, 0x57); |
1312 void vmulsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1329 AVX_3(vcvtsd2ss, 0x5a, vsd); |
1313 vsd(0x59, dst, src1, src2); | 1330 |
1314 } | 1331 #undef AVX_3 |
1315 void vmulsd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1332 #undef AVX_S_3 |
1316 vsd(0x59, dst, src1, src2); | 1333 #undef AVX_P_3 |
1317 } | 1334 #undef AVX_SP_3 |
1318 void vdivsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1335 |
1319 vsd(0x5e, dst, src1, src2); | |
1320 } | |
1321 void vdivsd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1322 vsd(0x5e, dst, src1, src2); | |
1323 } | |
1324 void vmaxsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1325 vsd(0x5f, dst, src1, src2); | |
1326 } | |
1327 void vmaxsd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1328 vsd(0x5f, dst, src1, src2); | |
1329 } | |
1330 void vminsd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1331 vsd(0x5d, dst, src1, src2); | |
1332 } | |
1333 void vminsd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1334 vsd(0x5d, dst, src1, src2); | |
1335 } | |
1336 void vcvtss2sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1336 void vcvtss2sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1337 vsd(0x5a, dst, src1, src2, kF3, k0F, kWIG); | 1337 vsd(0x5a, dst, src1, src2, kF3, k0F, kWIG); |
1338 } | 1338 } |
1339 void vcvtss2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1339 void vcvtss2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1340 vsd(0x5a, dst, src1, src2, kF3, k0F, kWIG); | 1340 vsd(0x5a, dst, src1, src2, kF3, k0F, kWIG); |
1341 } | 1341 } |
1342 void vcvtsd2ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1343 vsd(0x5a, dst, src1, src2); | |
1344 } | |
1345 void vcvtsd2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1346 vsd(0x5a, dst, src1, src2); | |
1347 } | |
1348 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { | 1342 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { |
1349 XMMRegister isrc2 = {src2.code()}; | 1343 XMMRegister isrc2 = {src2.code()}; |
1350 vsd(0x2a, dst, src1, isrc2, kF2, k0F, kW0); | 1344 vsd(0x2a, dst, src1, isrc2, kF2, k0F, kW0); |
1351 } | 1345 } |
1352 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1346 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1353 vsd(0x2a, dst, src1, src2, kF2, k0F, kW0); | 1347 vsd(0x2a, dst, src1, src2, kF2, k0F, kW0); |
1354 } | 1348 } |
1355 void vcvttsd2si(Register dst, XMMRegister src) { | 1349 void vcvttsd2si(Register dst, XMMRegister src) { |
1356 XMMRegister idst = {dst.code()}; | 1350 XMMRegister idst = {dst.code()}; |
1357 vsd(0x2c, idst, xmm0, src, kF2, k0F, kW0); | 1351 vsd(0x2c, idst, xmm0, src, kF2, k0F, kW0); |
(...skipping 21 matching lines...) Expand all Loading... |
1379 vsd(op, dst, src1, src2, kF2, k0F, kWIG); | 1373 vsd(op, dst, src1, src2, kF2, k0F, kWIG); |
1380 } | 1374 } |
1381 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1375 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1382 vsd(op, dst, src1, src2, kF2, k0F, kWIG); | 1376 vsd(op, dst, src1, src2, kF2, k0F, kWIG); |
1383 } | 1377 } |
1384 void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2, | 1378 void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2, |
1385 SIMDPrefix pp, LeadingOpcode m, VexW w); | 1379 SIMDPrefix pp, LeadingOpcode m, VexW w); |
1386 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2, | 1380 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2, |
1387 SIMDPrefix pp, LeadingOpcode m, VexW w); | 1381 SIMDPrefix pp, LeadingOpcode m, VexW w); |
1388 | 1382 |
1389 void vaddss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1390 vss(0x58, dst, src1, src2); | |
1391 } | |
1392 void vaddss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1393 vss(0x58, dst, src1, src2); | |
1394 } | |
1395 void vsubss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1396 vss(0x5c, dst, src1, src2); | |
1397 } | |
1398 void vsubss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1399 vss(0x5c, dst, src1, src2); | |
1400 } | |
1401 void vmulss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1402 vss(0x59, dst, src1, src2); | |
1403 } | |
1404 void vmulss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1405 vss(0x59, dst, src1, src2); | |
1406 } | |
1407 void vdivss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1408 vss(0x5e, dst, src1, src2); | |
1409 } | |
1410 void vdivss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1411 vss(0x5e, dst, src1, src2); | |
1412 } | |
1413 void vmaxss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1414 vss(0x5f, dst, src1, src2); | |
1415 } | |
1416 void vmaxss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1417 vss(0x5f, dst, src1, src2); | |
1418 } | |
1419 void vminss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | |
1420 vss(0x5d, dst, src1, src2); | |
1421 } | |
1422 void vminss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | |
1423 vss(0x5d, dst, src1, src2); | |
1424 } | |
1425 void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1383 void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1426 vss(0x10, dst, src1, src2); | 1384 vss(0x10, dst, src1, src2); |
1427 } | 1385 } |
1428 void vmovss(XMMRegister dst, const Operand& src) { | 1386 void vmovss(XMMRegister dst, const Operand& src) { |
1429 vss(0x10, dst, xmm0, src); | 1387 vss(0x10, dst, xmm0, src); |
1430 } | 1388 } |
1431 void vmovss(const Operand& dst, XMMRegister src) { | 1389 void vmovss(const Operand& dst, XMMRegister src) { |
1432 vss(0x11, src, xmm0, dst); | 1390 vss(0x11, src, xmm0, dst); |
1433 } | 1391 } |
1434 void vucomiss(XMMRegister dst, XMMRegister src); | 1392 void vucomiss(XMMRegister dst, XMMRegister src); |
1435 void vucomiss(XMMRegister dst, const Operand& src); | 1393 void vucomiss(XMMRegister dst, const Operand& src); |
1436 void vss(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); | 1394 void vss(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
1437 void vss(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); | 1395 void vss(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
1438 | 1396 |
| 1397 void vmovaps(XMMRegister dst, XMMRegister src) { vps(0x28, dst, xmm0, src); } |
| 1398 void vmovapd(XMMRegister dst, XMMRegister src) { vpd(0x28, dst, xmm0, src); } |
| 1399 void vmovmskpd(Register dst, XMMRegister src) { |
| 1400 XMMRegister idst = {dst.code()}; |
| 1401 vpd(0x50, idst, xmm0, src); |
| 1402 } |
| 1403 |
| 1404 void vps(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
| 1405 void vps(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
| 1406 void vpd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
| 1407 void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
| 1408 |
1439 // BMI instruction | 1409 // BMI instruction |
1440 void andnq(Register dst, Register src1, Register src2) { | 1410 void andnq(Register dst, Register src1, Register src2) { |
1441 bmi1q(0xf2, dst, src1, src2); | 1411 bmi1q(0xf2, dst, src1, src2); |
1442 } | 1412 } |
1443 void andnq(Register dst, Register src1, const Operand& src2) { | 1413 void andnq(Register dst, Register src1, const Operand& src2) { |
1444 bmi1q(0xf2, dst, src1, src2); | 1414 bmi1q(0xf2, dst, src1, src2); |
1445 } | 1415 } |
1446 void andnl(Register dst, Register src1, Register src2) { | 1416 void andnl(Register dst, Register src1, Register src2) { |
1447 bmi1l(0xf2, dst, src1, src2); | 1417 bmi1l(0xf2, dst, src1, src2); |
1448 } | 1418 } |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1606 bmi2l(kF2, 0xf7, dst, src2, src1); | 1576 bmi2l(kF2, 0xf7, dst, src2, src1); |
1607 } | 1577 } |
1608 void shrxl(Register dst, const Operand& src1, Register src2) { | 1578 void shrxl(Register dst, const Operand& src1, Register src2) { |
1609 bmi2l(kF2, 0xf7, dst, src2, src1); | 1579 bmi2l(kF2, 0xf7, dst, src2, src1); |
1610 } | 1580 } |
1611 void rorxq(Register dst, Register src, byte imm8); | 1581 void rorxq(Register dst, Register src, byte imm8); |
1612 void rorxq(Register dst, const Operand& src, byte imm8); | 1582 void rorxq(Register dst, const Operand& src, byte imm8); |
1613 void rorxl(Register dst, Register src, byte imm8); | 1583 void rorxl(Register dst, Register src, byte imm8); |
1614 void rorxl(Register dst, const Operand& src, byte imm8); | 1584 void rorxl(Register dst, const Operand& src, byte imm8); |
1615 | 1585 |
1616 void vmovaps(XMMRegister dst, XMMRegister src) { vps(0x28, dst, xmm0, src); } | |
1617 void vmovapd(XMMRegister dst, XMMRegister src) { vpd(0x28, dst, xmm0, src); } | |
1618 void vmovmskpd(Register dst, XMMRegister src) { | |
1619 XMMRegister idst = {dst.code()}; | |
1620 vpd(0x50, idst, xmm0, src); | |
1621 } | |
1622 | |
1623 #define PACKED_OP_LIST(V) \ | |
1624 V(and, 0x54) \ | |
1625 V(xor, 0x57) | |
1626 | |
1627 #define AVX_PACKED_OP_DECLARE(name, opcode) \ | |
1628 void v##name##ps(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ | |
1629 vps(opcode, dst, src1, src2); \ | |
1630 } \ | |
1631 void v##name##ps(XMMRegister dst, XMMRegister src1, const Operand& src2) { \ | |
1632 vps(opcode, dst, src1, src2); \ | |
1633 } \ | |
1634 void v##name##pd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ | |
1635 vpd(opcode, dst, src1, src2); \ | |
1636 } \ | |
1637 void v##name##pd(XMMRegister dst, XMMRegister src1, const Operand& src2) { \ | |
1638 vpd(opcode, dst, src1, src2); \ | |
1639 } | |
1640 | |
1641 PACKED_OP_LIST(AVX_PACKED_OP_DECLARE); | |
1642 void vps(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); | |
1643 void vps(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); | |
1644 void vpd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); | |
1645 void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); | |
1646 | |
1647 // Debugging | 1586 // Debugging |
1648 void Print(); | 1587 void Print(); |
1649 | 1588 |
1650 // Check the code size generated from label to here. | 1589 // Check the code size generated from label to here. |
1651 int SizeOfCodeGeneratedSince(Label* label) { | 1590 int SizeOfCodeGeneratedSince(Label* label) { |
1652 return pc_offset() - label->pos(); | 1591 return pc_offset() - label->pos(); |
1653 } | 1592 } |
1654 | 1593 |
1655 // Mark generator continuation. | 1594 // Mark generator continuation. |
1656 void RecordGeneratorContinuation(); | 1595 void RecordGeneratorContinuation(); |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2193 Assembler* assembler_; | 2132 Assembler* assembler_; |
2194 #ifdef DEBUG | 2133 #ifdef DEBUG |
2195 int space_before_; | 2134 int space_before_; |
2196 #endif | 2135 #endif |
2197 }; | 2136 }; |
2198 | 2137 |
2199 } // namespace internal | 2138 } // namespace internal |
2200 } // namespace v8 | 2139 } // namespace v8 |
2201 | 2140 |
2202 #endif // V8_X64_ASSEMBLER_X64_H_ | 2141 #endif // V8_X64_ASSEMBLER_X64_H_ |
OLD | NEW |