OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 // | 4 // |
5 // Modified by the Subzero authors. | 5 // Modified by the Subzero authors. |
6 // | 6 // |
7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
8 // | 8 // |
9 // The Subzero Code Generator | 9 // The Subzero Code Generator |
10 // | 10 // |
(...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1049 | 1049 |
1050 void AssemblerX86::pmovsxdq(XmmRegister dst, XmmRegister src) { | 1050 void AssemblerX86::pmovsxdq(XmmRegister dst, XmmRegister src) { |
1051 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1051 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1052 EmitUint8(0x66); | 1052 EmitUint8(0x66); |
1053 EmitUint8(0x0F); | 1053 EmitUint8(0x0F); |
1054 EmitUint8(0x38); | 1054 EmitUint8(0x38); |
1055 EmitUint8(0x25); | 1055 EmitUint8(0x25); |
1056 EmitXmmRegisterOperand(dst, src); | 1056 EmitXmmRegisterOperand(dst, src); |
1057 } | 1057 } |
1058 | 1058 |
1059 void AssemblerX86::pcmpeqq(XmmRegister dst, XmmRegister src) { | 1059 void AssemblerX86::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) { |
1060 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1060 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1061 EmitUint8(0x66); | 1061 EmitUint8(0x66); |
1062 EmitUint8(0x0F); | 1062 EmitUint8(0x0F); |
1063 EmitUint8(0x38); | 1063 if (isByteSizedArithType(Ty)) { |
1064 EmitUint8(0x29); | 1064 EmitUint8(0x74); |
| 1065 } else if (Ty == IceType_i16) { |
| 1066 EmitUint8(0x75); |
| 1067 } else { |
| 1068 EmitUint8(0x76); |
| 1069 } |
1065 EmitXmmRegisterOperand(dst, src); | 1070 EmitXmmRegisterOperand(dst, src); |
1066 } | 1071 } |
1067 | 1072 |
| 1073 void AssemblerX86::pcmpeq(Type Ty, XmmRegister dst, const Address &src) { |
| 1074 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1075 EmitUint8(0x66); |
| 1076 EmitUint8(0x0F); |
| 1077 if (isByteSizedArithType(Ty)) { |
| 1078 EmitUint8(0x74); |
| 1079 } else if (Ty == IceType_i16) { |
| 1080 EmitUint8(0x75); |
| 1081 } else { |
| 1082 EmitUint8(0x76); |
| 1083 } |
| 1084 EmitOperand(dst, src); |
| 1085 } |
| 1086 |
| 1087 void AssemblerX86::pcmpgt(Type Ty, XmmRegister dst, XmmRegister src) { |
| 1088 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1089 EmitUint8(0x66); |
| 1090 EmitUint8(0x0F); |
| 1091 if (isByteSizedArithType(Ty)) { |
| 1092 EmitUint8(0x64); |
| 1093 } else if (Ty == IceType_i16) { |
| 1094 EmitUint8(0x65); |
| 1095 } else { |
| 1096 EmitUint8(0x66); |
| 1097 } |
| 1098 EmitXmmRegisterOperand(dst, src); |
| 1099 } |
| 1100 |
| 1101 void AssemblerX86::pcmpgt(Type Ty, XmmRegister dst, const Address &src) { |
| 1102 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1103 EmitUint8(0x66); |
| 1104 EmitUint8(0x0F); |
| 1105 if (isByteSizedArithType(Ty)) { |
| 1106 EmitUint8(0x64); |
| 1107 } else if (Ty == IceType_i16) { |
| 1108 EmitUint8(0x65); |
| 1109 } else { |
| 1110 EmitUint8(0x66); |
| 1111 } |
| 1112 EmitOperand(dst, src); |
| 1113 } |
| 1114 |
1068 void AssemblerX86::roundsd(XmmRegister dst, XmmRegister src, | 1115 void AssemblerX86::roundsd(XmmRegister dst, XmmRegister src, |
1069 RoundingMode mode) { | 1116 RoundingMode mode) { |
1070 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1117 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1071 EmitUint8(0x66); | 1118 EmitUint8(0x66); |
1072 EmitUint8(0x0F); | 1119 EmitUint8(0x0F); |
1073 EmitUint8(0x3A); | 1120 EmitUint8(0x3A); |
1074 EmitUint8(0x0B); | 1121 EmitUint8(0x0B); |
1075 EmitXmmRegisterOperand(dst, src); | 1122 EmitXmmRegisterOperand(dst, src); |
1076 // Mask precision exeption. | 1123 // Mask precision exeption. |
1077 EmitUint8(static_cast<uint8_t>(mode) | 0x8); | 1124 EmitUint8(static_cast<uint8_t>(mode) | 0x8); |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1482 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1529 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1483 if (Ty == IceType_i16) | 1530 if (Ty == IceType_i16) |
1484 EmitOperandSizeOverride(); | 1531 EmitOperandSizeOverride(); |
1485 if (isByteSizedArithType(Ty)) | 1532 if (isByteSizedArithType(Ty)) |
1486 EmitUint8(0xF6); | 1533 EmitUint8(0xF6); |
1487 else | 1534 else |
1488 EmitUint8(0xF7); | 1535 EmitUint8(0xF7); |
1489 EmitOperand(7, addr); | 1536 EmitOperand(7, addr); |
1490 } | 1537 } |
1491 | 1538 |
1492 void AssemblerX86::imull(GPRRegister dst, GPRRegister src) { | 1539 void AssemblerX86::imul(Type Ty, GPRRegister dst, GPRRegister src) { |
1493 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1540 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1541 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 1542 if (Ty == IceType_i16) |
| 1543 EmitOperandSizeOverride(); |
1494 EmitUint8(0x0F); | 1544 EmitUint8(0x0F); |
1495 EmitUint8(0xAF); | 1545 EmitUint8(0xAF); |
1496 EmitOperand(dst, Operand(src)); | 1546 EmitRegisterOperand(dst, src); |
1497 } | 1547 } |
1498 | 1548 |
1499 void AssemblerX86::imull(GPRRegister reg, const Immediate &imm) { | 1549 void AssemblerX86::imul(Type Ty, GPRRegister reg, const Address &address) { |
1500 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1550 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1501 EmitUint8(0x69); | 1551 assert(Ty == IceType_i16 || Ty == IceType_i32); |
1502 EmitOperand(reg, Operand(reg)); | 1552 if (Ty == IceType_i16) |
1503 EmitImmediate(BrokenType, imm); | 1553 EmitOperandSizeOverride(); |
1504 } | |
1505 | |
1506 void AssemblerX86::imull(GPRRegister reg, const Address &address) { | |
1507 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1508 EmitUint8(0x0F); | 1554 EmitUint8(0x0F); |
1509 EmitUint8(0xAF); | 1555 EmitUint8(0xAF); |
1510 EmitOperand(reg, address); | 1556 EmitOperand(reg, address); |
1511 } | 1557 } |
1512 | 1558 |
1513 void AssemblerX86::imull(GPRRegister reg) { | 1559 void AssemblerX86::imul(Type Ty, GPRRegister reg, const Immediate &imm) { |
1514 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1560 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1515 EmitUint8(0xF7); | 1561 assert(Ty == IceType_i16 || Ty == IceType_i32); |
1516 EmitOperand(5, Operand(reg)); | 1562 if (Ty == IceType_i16) |
| 1563 EmitOperandSizeOverride(); |
| 1564 if (imm.is_int8()) { |
| 1565 EmitUint8(0x6B); |
| 1566 EmitRegisterOperand(reg, reg); |
| 1567 EmitUint8(imm.value() & 0xFF); |
| 1568 } else { |
| 1569 EmitUint8(0x69); |
| 1570 EmitRegisterOperand(reg, reg); |
| 1571 EmitImmediate(Ty, imm); |
| 1572 } |
1517 } | 1573 } |
1518 | 1574 |
1519 void AssemblerX86::imull(const Address &address) { | 1575 void AssemblerX86::imul(Type Ty, GPRRegister reg) { |
1520 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1576 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1521 EmitUint8(0xF7); | 1577 if (Ty == IceType_i16) |
| 1578 EmitOperandSizeOverride(); |
| 1579 if (isByteSizedArithType(Ty)) |
| 1580 EmitUint8(0xF6); |
| 1581 else |
| 1582 EmitUint8(0xF7); |
| 1583 EmitRegisterOperand(5, reg); |
| 1584 } |
| 1585 |
| 1586 void AssemblerX86::imul(Type Ty, const Address &address) { |
| 1587 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1588 if (Ty == IceType_i16) |
| 1589 EmitOperandSizeOverride(); |
| 1590 if (isByteSizedArithType(Ty)) |
| 1591 EmitUint8(0xF6); |
| 1592 else |
| 1593 EmitUint8(0xF7); |
1522 EmitOperand(5, address); | 1594 EmitOperand(5, address); |
1523 } | 1595 } |
1524 | 1596 |
1525 void AssemblerX86::mul(Type Ty, GPRRegister reg) { | 1597 void AssemblerX86::mul(Type Ty, GPRRegister reg) { |
1526 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1598 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1527 if (Ty == IceType_i16) | 1599 if (Ty == IceType_i16) |
1528 EmitOperandSizeOverride(); | 1600 EmitOperandSizeOverride(); |
1529 if (isByteSizedArithType(Ty)) | 1601 if (isByteSizedArithType(Ty)) |
1530 EmitUint8(0xF6); | 1602 EmitUint8(0xF6); |
1531 else | 1603 else |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2072 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, | 2144 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, |
2073 GPRRegister shifter) { | 2145 GPRRegister shifter) { |
2074 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2146 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
2075 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2147 assert(shifter == RegX8632::Encoded_Reg_ecx); |
2076 EmitUint8(0xD3); | 2148 EmitUint8(0xD3); |
2077 EmitOperand(rm, Operand(operand)); | 2149 EmitOperand(rm, Operand(operand)); |
2078 } | 2150 } |
2079 | 2151 |
2080 } // end of namespace x86 | 2152 } // end of namespace x86 |
2081 } // end of namespace Ice | 2153 } // end of namespace Ice |
OLD | NEW |