Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Side by Side Diff: src/assembler_ia32.cpp

Issue 617593002: Handle imul, pcmpeq, pcmpgt. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: go ahead and optimize i8 Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698