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 22 matching lines...) Expand all Loading... |
33 // Copyright 2012 the V8 project authors. All rights reserved. | 33 // Copyright 2012 the V8 project authors. All rights reserved. |
34 | 34 |
35 // A lightweight X64 Assembler. | 35 // A lightweight X64 Assembler. |
36 | 36 |
37 #ifndef V8_X64_ASSEMBLER_X64_H_ | 37 #ifndef V8_X64_ASSEMBLER_X64_H_ |
38 #define V8_X64_ASSEMBLER_X64_H_ | 38 #define V8_X64_ASSEMBLER_X64_H_ |
39 | 39 |
40 #include <deque> | 40 #include <deque> |
41 | 41 |
42 #include "src/assembler.h" | 42 #include "src/assembler.h" |
| 43 #include "src/x64/sse-instr.h" |
43 | 44 |
44 namespace v8 { | 45 namespace v8 { |
45 namespace internal { | 46 namespace internal { |
46 | 47 |
47 // Utility functions | 48 // Utility functions |
48 | 49 |
49 #define GENERAL_REGISTERS(V) \ | 50 #define GENERAL_REGISTERS(V) \ |
50 V(rax) \ | 51 V(rax) \ |
51 V(rcx) \ | 52 V(rcx) \ |
52 V(rdx) \ | 53 V(rdx) \ |
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 void addps(XMMRegister dst, const Operand& src); | 1066 void addps(XMMRegister dst, const Operand& src); |
1066 void subps(XMMRegister dst, XMMRegister src); | 1067 void subps(XMMRegister dst, XMMRegister src); |
1067 void subps(XMMRegister dst, const Operand& src); | 1068 void subps(XMMRegister dst, const Operand& src); |
1068 void mulps(XMMRegister dst, XMMRegister src); | 1069 void mulps(XMMRegister dst, XMMRegister src); |
1069 void mulps(XMMRegister dst, const Operand& src); | 1070 void mulps(XMMRegister dst, const Operand& src); |
1070 void divps(XMMRegister dst, XMMRegister src); | 1071 void divps(XMMRegister dst, XMMRegister src); |
1071 void divps(XMMRegister dst, const Operand& src); | 1072 void divps(XMMRegister dst, const Operand& src); |
1072 | 1073 |
1073 void movmskps(Register dst, XMMRegister src); | 1074 void movmskps(Register dst, XMMRegister src); |
1074 | 1075 |
| 1076 void vinstr(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2, |
| 1077 SIMDPrefix pp, LeadingOpcode m, VexW w); |
| 1078 void vinstr(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2, |
| 1079 SIMDPrefix pp, LeadingOpcode m, VexW w); |
| 1080 |
1075 // SSE2 instructions | 1081 // SSE2 instructions |
| 1082 void sse2_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape, |
| 1083 byte opcode); |
| 1084 void sse2_instr(XMMRegister dst, const Operand& src, byte prefix, byte escape, |
| 1085 byte opcode); |
| 1086 #define DECLARE_SSE2_INSTRUCTION(instruction, prefix, escape, opcode) \ |
| 1087 void instruction(XMMRegister dst, XMMRegister src) { \ |
| 1088 sse2_instr(dst, src, 0x##prefix, 0x##escape, 0x##opcode); \ |
| 1089 } \ |
| 1090 void instruction(XMMRegister dst, const Operand& src) { \ |
| 1091 sse2_instr(dst, src, 0x##prefix, 0x##escape, 0x##opcode); \ |
| 1092 } |
| 1093 |
| 1094 SSE2_INSTRUCTION_LIST(DECLARE_SSE2_INSTRUCTION) |
| 1095 #undef DECLARE_SSE2_INSTRUCTION |
| 1096 |
| 1097 #define DECLARE_SSE2_AVX_INSTRUCTION(instruction, prefix, escape, opcode) \ |
| 1098 void v##instruction(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ |
| 1099 vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape, kW0); \ |
| 1100 } \ |
| 1101 void v##instruction(XMMRegister dst, XMMRegister src1, \ |
| 1102 const Operand& src2) { \ |
| 1103 vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape, kW0); \ |
| 1104 } |
| 1105 |
| 1106 SSE2_INSTRUCTION_LIST(DECLARE_SSE2_AVX_INSTRUCTION) |
| 1107 #undef DECLARE_SSE2_AVX_INSTRUCTION |
| 1108 |
| 1109 // SSE3 |
| 1110 void lddqu(XMMRegister dst, const Operand& src); |
| 1111 |
| 1112 // SSSE3 |
| 1113 void ssse3_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape1, |
| 1114 byte escape2, byte opcode); |
| 1115 void ssse3_instr(XMMRegister dst, const Operand& src, byte prefix, |
| 1116 byte escape1, byte escape2, byte opcode); |
| 1117 |
| 1118 #define DECLARE_SSSE3_INSTRUCTION(instruction, prefix, escape1, escape2, \ |
| 1119 opcode) \ |
| 1120 void instruction(XMMRegister dst, XMMRegister src) { \ |
| 1121 ssse3_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ |
| 1122 } \ |
| 1123 void instruction(XMMRegister dst, const Operand& src) { \ |
| 1124 ssse3_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ |
| 1125 } |
| 1126 |
| 1127 SSSE3_INSTRUCTION_LIST(DECLARE_SSSE3_INSTRUCTION) |
| 1128 #undef DECLARE_SSSE3_INSTRUCTION |
| 1129 |
| 1130 // SSE4 |
| 1131 void sse4_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape1, |
| 1132 byte escape2, byte opcode); |
| 1133 void sse4_instr(XMMRegister dst, const Operand& src, byte prefix, |
| 1134 byte escape1, byte escape2, byte opcode); |
| 1135 #define DECLARE_SSE4_INSTRUCTION(instruction, prefix, escape1, escape2, \ |
| 1136 opcode) \ |
| 1137 void instruction(XMMRegister dst, XMMRegister src) { \ |
| 1138 sse4_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ |
| 1139 } \ |
| 1140 void instruction(XMMRegister dst, const Operand& src) { \ |
| 1141 sse4_instr(dst, src, 0x##prefix, 0x##escape1, 0x##escape2, 0x##opcode); \ |
| 1142 } |
| 1143 |
| 1144 SSE4_INSTRUCTION_LIST(DECLARE_SSE4_INSTRUCTION) |
| 1145 #undef DECLARE_SSE4_INSTRUCTION |
| 1146 |
| 1147 #define DECLARE_SSE34_AVX_INSTRUCTION(instruction, prefix, escape1, escape2, \ |
| 1148 opcode) \ |
| 1149 void v##instruction(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ |
| 1150 vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape1##escape2, kW0); \ |
| 1151 } \ |
| 1152 void v##instruction(XMMRegister dst, XMMRegister src1, \ |
| 1153 const Operand& src2) { \ |
| 1154 vinstr(0x##opcode, dst, src1, src2, k##prefix, k##escape1##escape2, kW0); \ |
| 1155 } |
| 1156 |
| 1157 SSSE3_INSTRUCTION_LIST(DECLARE_SSE34_AVX_INSTRUCTION) |
| 1158 SSE4_INSTRUCTION_LIST(DECLARE_SSE34_AVX_INSTRUCTION) |
| 1159 #undef DECLARE_SSE34_AVX_INSTRUCTION |
| 1160 |
1076 void movd(XMMRegister dst, Register src); | 1161 void movd(XMMRegister dst, Register src); |
1077 void movd(XMMRegister dst, const Operand& src); | 1162 void movd(XMMRegister dst, const Operand& src); |
1078 void movd(Register dst, XMMRegister src); | 1163 void movd(Register dst, XMMRegister src); |
1079 void movq(XMMRegister dst, Register src); | 1164 void movq(XMMRegister dst, Register src); |
1080 void movq(Register dst, XMMRegister src); | 1165 void movq(Register dst, XMMRegister src); |
1081 void movq(XMMRegister dst, XMMRegister src); | 1166 void movq(XMMRegister dst, XMMRegister src); |
1082 | 1167 |
1083 // Don't use this unless it's important to keep the | 1168 // Don't use this unless it's important to keep the |
1084 // top half of the destination register unchanged. | 1169 // top half of the destination register unchanged. |
1085 // Use movapd when moving double values and movq for integer | 1170 // Use movapd when moving double values and movq for integer |
1086 // values in xmm registers. | 1171 // values in xmm registers. |
1087 void movsd(XMMRegister dst, XMMRegister src); | 1172 void movsd(XMMRegister dst, XMMRegister src); |
1088 | 1173 |
1089 void movsd(const Operand& dst, XMMRegister src); | 1174 void movsd(const Operand& dst, XMMRegister src); |
1090 void movsd(XMMRegister dst, const Operand& src); | 1175 void movsd(XMMRegister dst, const Operand& src); |
1091 | 1176 |
1092 void movdqa(const Operand& dst, XMMRegister src); | 1177 void movdqa(const Operand& dst, XMMRegister src); |
1093 void movdqa(XMMRegister dst, const Operand& src); | 1178 void movdqa(XMMRegister dst, const Operand& src); |
1094 | 1179 |
1095 void movdqu(const Operand& dst, XMMRegister src); | 1180 void movdqu(const Operand& dst, XMMRegister src); |
1096 void movdqu(XMMRegister dst, const Operand& src); | 1181 void movdqu(XMMRegister dst, const Operand& src); |
1097 | 1182 |
1098 void movapd(XMMRegister dst, XMMRegister src); | 1183 void movapd(XMMRegister dst, XMMRegister src); |
1099 void movupd(XMMRegister dst, const Operand& src); | 1184 void movupd(XMMRegister dst, const Operand& src); |
1100 void movupd(const Operand& dst, XMMRegister src); | 1185 void movupd(const Operand& dst, XMMRegister src); |
1101 | 1186 |
1102 void psllq(XMMRegister reg, byte imm8); | 1187 void psllq(XMMRegister reg, byte imm8); |
1103 void psrlq(XMMRegister reg, byte imm8); | 1188 void psrlq(XMMRegister reg, byte imm8); |
| 1189 void psllw(XMMRegister reg, byte imm8); |
1104 void pslld(XMMRegister reg, byte imm8); | 1190 void pslld(XMMRegister reg, byte imm8); |
| 1191 void psrlw(XMMRegister reg, byte imm8); |
1105 void psrld(XMMRegister reg, byte imm8); | 1192 void psrld(XMMRegister reg, byte imm8); |
| 1193 void psraw(XMMRegister reg, byte imm8); |
| 1194 void psrad(XMMRegister reg, byte imm8); |
1106 | 1195 |
1107 void cvttsd2si(Register dst, const Operand& src); | 1196 void cvttsd2si(Register dst, const Operand& src); |
1108 void cvttsd2si(Register dst, XMMRegister src); | 1197 void cvttsd2si(Register dst, XMMRegister src); |
1109 void cvttss2siq(Register dst, XMMRegister src); | 1198 void cvttss2siq(Register dst, XMMRegister src); |
1110 void cvttss2siq(Register dst, const Operand& src); | 1199 void cvttss2siq(Register dst, const Operand& src); |
1111 void cvttsd2siq(Register dst, XMMRegister src); | 1200 void cvttsd2siq(Register dst, XMMRegister src); |
1112 void cvttsd2siq(Register dst, const Operand& src); | 1201 void cvttsd2siq(Register dst, const Operand& src); |
1113 | 1202 |
1114 void cvtlsi2sd(XMMRegister dst, const Operand& src); | 1203 void cvtlsi2sd(XMMRegister dst, const Operand& src); |
1115 void cvtlsi2sd(XMMRegister dst, Register src); | 1204 void cvtlsi2sd(XMMRegister dst, Register src); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 void orpd(XMMRegister dst, XMMRegister src); | 1237 void orpd(XMMRegister dst, XMMRegister src); |
1149 void orpd(XMMRegister dst, const Operand& src); | 1238 void orpd(XMMRegister dst, const Operand& src); |
1150 void xorpd(XMMRegister dst, XMMRegister src); | 1239 void xorpd(XMMRegister dst, XMMRegister src); |
1151 void xorpd(XMMRegister dst, const Operand& src); | 1240 void xorpd(XMMRegister dst, const Operand& src); |
1152 void sqrtsd(XMMRegister dst, XMMRegister src); | 1241 void sqrtsd(XMMRegister dst, XMMRegister src); |
1153 void sqrtsd(XMMRegister dst, const Operand& src); | 1242 void sqrtsd(XMMRegister dst, const Operand& src); |
1154 | 1243 |
1155 void ucomisd(XMMRegister dst, XMMRegister src); | 1244 void ucomisd(XMMRegister dst, XMMRegister src); |
1156 void ucomisd(XMMRegister dst, const Operand& src); | 1245 void ucomisd(XMMRegister dst, const Operand& src); |
1157 void cmpltsd(XMMRegister dst, XMMRegister src); | 1246 void cmpltsd(XMMRegister dst, XMMRegister src); |
1158 void pcmpeqd(XMMRegister dst, XMMRegister src); | |
1159 | 1247 |
1160 void movmskpd(Register dst, XMMRegister src); | 1248 void movmskpd(Register dst, XMMRegister src); |
1161 | 1249 |
1162 void punpckldq(XMMRegister dst, XMMRegister src); | 1250 void punpckldq(XMMRegister dst, XMMRegister src); |
1163 void punpckldq(XMMRegister dst, const Operand& src); | 1251 void punpckldq(XMMRegister dst, const Operand& src); |
1164 void punpckhdq(XMMRegister dst, XMMRegister src); | 1252 void punpckhdq(XMMRegister dst, XMMRegister src); |
1165 | 1253 |
1166 // SSE 4.1 instruction | 1254 // SSE 4.1 instruction |
1167 void insertps(XMMRegister dst, XMMRegister src, byte imm8); | 1255 void insertps(XMMRegister dst, XMMRegister src, byte imm8); |
1168 void extractps(Register dst, XMMRegister src, byte imm8); | 1256 void extractps(Register dst, XMMRegister src, byte imm8); |
| 1257 void pextrb(Register dst, XMMRegister src, int8_t imm8); |
| 1258 void pextrb(const Operand& dst, XMMRegister src, int8_t imm8); |
| 1259 void pextrw(Register dst, XMMRegister src, int8_t imm8); |
| 1260 void pextrw(const Operand& dst, XMMRegister src, int8_t imm8); |
1169 void pextrd(Register dst, XMMRegister src, int8_t imm8); | 1261 void pextrd(Register dst, XMMRegister src, int8_t imm8); |
| 1262 void pextrd(const Operand& dst, XMMRegister src, int8_t imm8); |
| 1263 void pinsrb(XMMRegister dst, Register src, int8_t imm8); |
| 1264 void pinsrb(XMMRegister dst, const Operand& src, int8_t imm8); |
| 1265 void pinsrw(XMMRegister dst, Register src, int8_t imm8); |
| 1266 void pinsrw(XMMRegister dst, const Operand& src, int8_t imm8); |
1170 void pinsrd(XMMRegister dst, Register src, int8_t imm8); | 1267 void pinsrd(XMMRegister dst, Register src, int8_t imm8); |
1171 void pinsrd(XMMRegister dst, const Operand& src, int8_t imm8); | 1268 void pinsrd(XMMRegister dst, const Operand& src, int8_t imm8); |
1172 | 1269 |
1173 void roundss(XMMRegister dst, XMMRegister src, RoundingMode mode); | 1270 void roundss(XMMRegister dst, XMMRegister src, RoundingMode mode); |
1174 void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode); | 1271 void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode); |
1175 | 1272 |
1176 void cmpps(XMMRegister dst, XMMRegister src, int8_t cmp); | 1273 void cmpps(XMMRegister dst, XMMRegister src, int8_t cmp); |
1177 void cmpps(XMMRegister dst, const Operand& src, int8_t cmp); | 1274 void cmpps(XMMRegister dst, const Operand& src, int8_t cmp); |
1178 void cmppd(XMMRegister dst, XMMRegister src, int8_t cmp); | 1275 void cmppd(XMMRegister dst, XMMRegister src, int8_t cmp); |
1179 void cmppd(XMMRegister dst, const Operand& src, int8_t cmp); | 1276 void cmppd(XMMRegister dst, const Operand& src, int8_t cmp); |
(...skipping 21 matching lines...) Expand all Loading... |
1201 void maxps(XMMRegister dst, const Operand& src); | 1298 void maxps(XMMRegister dst, const Operand& src); |
1202 void rcpps(XMMRegister dst, XMMRegister src); | 1299 void rcpps(XMMRegister dst, XMMRegister src); |
1203 void rcpps(XMMRegister dst, const Operand& src); | 1300 void rcpps(XMMRegister dst, const Operand& src); |
1204 void rsqrtps(XMMRegister dst, XMMRegister src); | 1301 void rsqrtps(XMMRegister dst, XMMRegister src); |
1205 void rsqrtps(XMMRegister dst, const Operand& src); | 1302 void rsqrtps(XMMRegister dst, const Operand& src); |
1206 void sqrtps(XMMRegister dst, XMMRegister src); | 1303 void sqrtps(XMMRegister dst, XMMRegister src); |
1207 void sqrtps(XMMRegister dst, const Operand& src); | 1304 void sqrtps(XMMRegister dst, const Operand& src); |
1208 void movups(XMMRegister dst, XMMRegister src); | 1305 void movups(XMMRegister dst, XMMRegister src); |
1209 void movups(XMMRegister dst, const Operand& src); | 1306 void movups(XMMRegister dst, const Operand& src); |
1210 void movups(const Operand& dst, XMMRegister src); | 1307 void movups(const Operand& dst, XMMRegister src); |
1211 void paddd(XMMRegister dst, XMMRegister src); | |
1212 void paddd(XMMRegister dst, const Operand& src); | |
1213 void psubd(XMMRegister dst, XMMRegister src); | |
1214 void psubd(XMMRegister dst, const Operand& src); | |
1215 void pmulld(XMMRegister dst, XMMRegister src); | |
1216 void pmulld(XMMRegister dst, const Operand& src); | |
1217 void pmuludq(XMMRegister dst, XMMRegister src); | |
1218 void pmuludq(XMMRegister dst, const Operand& src); | |
1219 void psrldq(XMMRegister dst, uint8_t shift); | 1308 void psrldq(XMMRegister dst, uint8_t shift); |
1220 void pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle); | 1309 void pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle); |
1221 void cvtps2dq(XMMRegister dst, XMMRegister src); | 1310 void pshufd(XMMRegister dst, const Operand& src, uint8_t shuffle); |
1222 void cvtps2dq(XMMRegister dst, const Operand& src); | |
1223 void cvtdq2ps(XMMRegister dst, XMMRegister src); | 1311 void cvtdq2ps(XMMRegister dst, XMMRegister src); |
1224 void cvtdq2ps(XMMRegister dst, const Operand& src); | 1312 void cvtdq2ps(XMMRegister dst, const Operand& src); |
1225 | 1313 |
1226 // AVX instruction | 1314 // AVX instruction |
1227 void vfmadd132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1315 void vfmadd132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1228 vfmasd(0x99, dst, src1, src2); | 1316 vfmasd(0x99, dst, src1, src2); |
1229 } | 1317 } |
1230 void vfmadd213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1318 void vfmadd213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1231 vfmasd(0xa9, dst, src1, src2); | 1319 vfmasd(0xa9, dst, src1, src2); |
1232 } | 1320 } |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1414 AVX_SP_3(vsqrt, 0x51); | 1502 AVX_SP_3(vsqrt, 0x51); |
1415 AVX_SP_3(vadd, 0x58); | 1503 AVX_SP_3(vadd, 0x58); |
1416 AVX_SP_3(vsub, 0x5c); | 1504 AVX_SP_3(vsub, 0x5c); |
1417 AVX_SP_3(vmul, 0x59); | 1505 AVX_SP_3(vmul, 0x59); |
1418 AVX_SP_3(vdiv, 0x5e); | 1506 AVX_SP_3(vdiv, 0x5e); |
1419 AVX_SP_3(vmin, 0x5d); | 1507 AVX_SP_3(vmin, 0x5d); |
1420 AVX_SP_3(vmax, 0x5f); | 1508 AVX_SP_3(vmax, 0x5f); |
1421 AVX_P_3(vand, 0x54); | 1509 AVX_P_3(vand, 0x54); |
1422 AVX_P_3(vor, 0x56); | 1510 AVX_P_3(vor, 0x56); |
1423 AVX_P_3(vxor, 0x57); | 1511 AVX_P_3(vxor, 0x57); |
1424 AVX_3(vpcmpeqd, 0x76, vpd); | |
1425 AVX_3(vcvtsd2ss, 0x5a, vsd); | 1512 AVX_3(vcvtsd2ss, 0x5a, vsd); |
1426 | 1513 |
1427 #undef AVX_3 | 1514 #undef AVX_3 |
1428 #undef AVX_S_3 | 1515 #undef AVX_S_3 |
1429 #undef AVX_P_3 | 1516 #undef AVX_P_3 |
1430 #undef AVX_SP_3 | 1517 #undef AVX_SP_3 |
1431 | 1518 |
1432 void vpsrlq(XMMRegister dst, XMMRegister src, byte imm8) { | 1519 void vpsrlq(XMMRegister dst, XMMRegister src, byte imm8) { |
1433 XMMRegister iop = {2}; | 1520 XMMRegister iop = {2}; |
1434 vpd(0x73, iop, dst, src); | 1521 vpd(0x73, iop, dst, src); |
1435 emit(imm8); | 1522 emit(imm8); |
1436 } | 1523 } |
1437 void vpsllq(XMMRegister dst, XMMRegister src, byte imm8) { | 1524 void vpsllq(XMMRegister dst, XMMRegister src, byte imm8) { |
1438 XMMRegister iop = {6}; | 1525 XMMRegister iop = {6}; |
1439 vpd(0x73, iop, dst, src); | 1526 vpd(0x73, iop, dst, src); |
1440 emit(imm8); | 1527 emit(imm8); |
1441 } | 1528 } |
1442 void vcvtss2sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1529 void vcvtss2sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1443 vsd(0x5a, dst, src1, src2, kF3, k0F, kWIG); | 1530 vinstr(0x5a, dst, src1, src2, kF3, k0F, kWIG); |
1444 } | 1531 } |
1445 void vcvtss2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1532 void vcvtss2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1446 vsd(0x5a, dst, src1, src2, kF3, k0F, kWIG); | 1533 vinstr(0x5a, dst, src1, src2, kF3, k0F, kWIG); |
1447 } | 1534 } |
1448 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { | 1535 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { |
1449 XMMRegister isrc2 = {src2.code()}; | 1536 XMMRegister isrc2 = {src2.code()}; |
1450 vsd(0x2a, dst, src1, isrc2, kF2, k0F, kW0); | 1537 vinstr(0x2a, dst, src1, isrc2, kF2, k0F, kW0); |
1451 } | 1538 } |
1452 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1539 void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1453 vsd(0x2a, dst, src1, src2, kF2, k0F, kW0); | 1540 vinstr(0x2a, dst, src1, src2, kF2, k0F, kW0); |
1454 } | 1541 } |
1455 void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, Register src2) { | 1542 void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, Register src2) { |
1456 XMMRegister isrc2 = {src2.code()}; | 1543 XMMRegister isrc2 = {src2.code()}; |
1457 vsd(0x2a, dst, src1, isrc2, kF3, k0F, kW0); | 1544 vinstr(0x2a, dst, src1, isrc2, kF3, k0F, kW0); |
1458 } | 1545 } |
1459 void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1546 void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1460 vsd(0x2a, dst, src1, src2, kF3, k0F, kW0); | 1547 vinstr(0x2a, dst, src1, src2, kF3, k0F, kW0); |
1461 } | 1548 } |
1462 void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, Register src2) { | 1549 void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, Register src2) { |
1463 XMMRegister isrc2 = {src2.code()}; | 1550 XMMRegister isrc2 = {src2.code()}; |
1464 vsd(0x2a, dst, src1, isrc2, kF3, k0F, kW1); | 1551 vinstr(0x2a, dst, src1, isrc2, kF3, k0F, kW1); |
1465 } | 1552 } |
1466 void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1553 void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1467 vsd(0x2a, dst, src1, src2, kF3, k0F, kW1); | 1554 vinstr(0x2a, dst, src1, src2, kF3, k0F, kW1); |
1468 } | 1555 } |
1469 void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { | 1556 void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, Register src2) { |
1470 XMMRegister isrc2 = {src2.code()}; | 1557 XMMRegister isrc2 = {src2.code()}; |
1471 vsd(0x2a, dst, src1, isrc2, kF2, k0F, kW1); | 1558 vinstr(0x2a, dst, src1, isrc2, kF2, k0F, kW1); |
1472 } | 1559 } |
1473 void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1560 void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1474 vsd(0x2a, dst, src1, src2, kF2, k0F, kW1); | 1561 vinstr(0x2a, dst, src1, src2, kF2, k0F, kW1); |
1475 } | 1562 } |
1476 void vcvttss2si(Register dst, XMMRegister src) { | 1563 void vcvttss2si(Register dst, XMMRegister src) { |
1477 XMMRegister idst = {dst.code()}; | 1564 XMMRegister idst = {dst.code()}; |
1478 vsd(0x2c, idst, xmm0, src, kF3, k0F, kW0); | 1565 vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW0); |
1479 } | 1566 } |
1480 void vcvttss2si(Register dst, const Operand& src) { | 1567 void vcvttss2si(Register dst, const Operand& src) { |
1481 XMMRegister idst = {dst.code()}; | 1568 XMMRegister idst = {dst.code()}; |
1482 vsd(0x2c, idst, xmm0, src, kF3, k0F, kW0); | 1569 vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW0); |
1483 } | 1570 } |
1484 void vcvttsd2si(Register dst, XMMRegister src) { | 1571 void vcvttsd2si(Register dst, XMMRegister src) { |
1485 XMMRegister idst = {dst.code()}; | 1572 XMMRegister idst = {dst.code()}; |
1486 vsd(0x2c, idst, xmm0, src, kF2, k0F, kW0); | 1573 vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW0); |
1487 } | 1574 } |
1488 void vcvttsd2si(Register dst, const Operand& src) { | 1575 void vcvttsd2si(Register dst, const Operand& src) { |
1489 XMMRegister idst = {dst.code()}; | 1576 XMMRegister idst = {dst.code()}; |
1490 vsd(0x2c, idst, xmm0, src, kF2, k0F, kW0); | 1577 vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW0); |
1491 } | 1578 } |
1492 void vcvttss2siq(Register dst, XMMRegister src) { | 1579 void vcvttss2siq(Register dst, XMMRegister src) { |
1493 XMMRegister idst = {dst.code()}; | 1580 XMMRegister idst = {dst.code()}; |
1494 vsd(0x2c, idst, xmm0, src, kF3, k0F, kW1); | 1581 vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW1); |
1495 } | 1582 } |
1496 void vcvttss2siq(Register dst, const Operand& src) { | 1583 void vcvttss2siq(Register dst, const Operand& src) { |
1497 XMMRegister idst = {dst.code()}; | 1584 XMMRegister idst = {dst.code()}; |
1498 vsd(0x2c, idst, xmm0, src, kF3, k0F, kW1); | 1585 vinstr(0x2c, idst, xmm0, src, kF3, k0F, kW1); |
1499 } | 1586 } |
1500 void vcvttsd2siq(Register dst, XMMRegister src) { | 1587 void vcvttsd2siq(Register dst, XMMRegister src) { |
1501 XMMRegister idst = {dst.code()}; | 1588 XMMRegister idst = {dst.code()}; |
1502 vsd(0x2c, idst, xmm0, src, kF2, k0F, kW1); | 1589 vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW1); |
1503 } | 1590 } |
1504 void vcvttsd2siq(Register dst, const Operand& src) { | 1591 void vcvttsd2siq(Register dst, const Operand& src) { |
1505 XMMRegister idst = {dst.code()}; | 1592 XMMRegister idst = {dst.code()}; |
1506 vsd(0x2c, idst, xmm0, src, kF2, k0F, kW1); | 1593 vinstr(0x2c, idst, xmm0, src, kF2, k0F, kW1); |
1507 } | 1594 } |
1508 void vcvtsd2si(Register dst, XMMRegister src) { | 1595 void vcvtsd2si(Register dst, XMMRegister src) { |
1509 XMMRegister idst = {dst.code()}; | 1596 XMMRegister idst = {dst.code()}; |
1510 vsd(0x2d, idst, xmm0, src, kF2, k0F, kW0); | 1597 vinstr(0x2d, idst, xmm0, src, kF2, k0F, kW0); |
1511 } | 1598 } |
1512 void vucomisd(XMMRegister dst, XMMRegister src) { | 1599 void vucomisd(XMMRegister dst, XMMRegister src) { |
1513 vsd(0x2e, dst, xmm0, src, k66, k0F, kWIG); | 1600 vinstr(0x2e, dst, xmm0, src, k66, k0F, kWIG); |
1514 } | 1601 } |
1515 void vucomisd(XMMRegister dst, const Operand& src) { | 1602 void vucomisd(XMMRegister dst, const Operand& src) { |
1516 vsd(0x2e, dst, xmm0, src, k66, k0F, kWIG); | 1603 vinstr(0x2e, dst, xmm0, src, k66, k0F, kWIG); |
1517 } | 1604 } |
1518 void vroundss(XMMRegister dst, XMMRegister src1, XMMRegister src2, | 1605 void vroundss(XMMRegister dst, XMMRegister src1, XMMRegister src2, |
1519 RoundingMode mode) { | 1606 RoundingMode mode) { |
1520 vsd(0x0a, dst, src1, src2, k66, k0F3A, kWIG); | 1607 vinstr(0x0a, dst, src1, src2, k66, k0F3A, kWIG); |
1521 emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. | 1608 emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. |
1522 } | 1609 } |
1523 void vroundsd(XMMRegister dst, XMMRegister src1, XMMRegister src2, | 1610 void vroundsd(XMMRegister dst, XMMRegister src1, XMMRegister src2, |
1524 RoundingMode mode) { | 1611 RoundingMode mode) { |
1525 vsd(0x0b, dst, src1, src2, k66, k0F3A, kWIG); | 1612 vinstr(0x0b, dst, src1, src2, k66, k0F3A, kWIG); |
1526 emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. | 1613 emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. |
1527 } | 1614 } |
1528 | 1615 |
1529 void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1616 void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1530 vsd(op, dst, src1, src2, kF2, k0F, kWIG); | 1617 vinstr(op, dst, src1, src2, kF2, k0F, kWIG); |
1531 } | 1618 } |
1532 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2) { | 1619 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2) { |
1533 vsd(op, dst, src1, src2, kF2, k0F, kWIG); | 1620 vinstr(op, dst, src1, src2, kF2, k0F, kWIG); |
1534 } | 1621 } |
1535 void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2, | |
1536 SIMDPrefix pp, LeadingOpcode m, VexW w); | |
1537 void vsd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2, | |
1538 SIMDPrefix pp, LeadingOpcode m, VexW w); | |
1539 | 1622 |
1540 void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { | 1623 void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
1541 vss(0x10, dst, src1, src2); | 1624 vss(0x10, dst, src1, src2); |
1542 } | 1625 } |
1543 void vmovss(XMMRegister dst, const Operand& src) { | 1626 void vmovss(XMMRegister dst, const Operand& src) { |
1544 vss(0x10, dst, xmm0, src); | 1627 vss(0x10, dst, xmm0, src); |
1545 } | 1628 } |
1546 void vmovss(const Operand& dst, XMMRegister src) { | 1629 void vmovss(const Operand& dst, XMMRegister src) { |
1547 vss(0x11, src, xmm0, dst); | 1630 vss(0x11, src, xmm0, dst); |
1548 } | 1631 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1609 | 1692 |
1610 AVX_CMP_P(vcmpeq, 0x0); | 1693 AVX_CMP_P(vcmpeq, 0x0); |
1611 AVX_CMP_P(vcmplt, 0x1); | 1694 AVX_CMP_P(vcmplt, 0x1); |
1612 AVX_CMP_P(vcmple, 0x2); | 1695 AVX_CMP_P(vcmple, 0x2); |
1613 AVX_CMP_P(vcmpneq, 0x4); | 1696 AVX_CMP_P(vcmpneq, 0x4); |
1614 AVX_CMP_P(vcmpnlt, 0x5); | 1697 AVX_CMP_P(vcmpnlt, 0x5); |
1615 AVX_CMP_P(vcmpnle, 0x6); | 1698 AVX_CMP_P(vcmpnle, 0x6); |
1616 | 1699 |
1617 #undef AVX_CMP_P | 1700 #undef AVX_CMP_P |
1618 | 1701 |
| 1702 void vlddqu(XMMRegister dst, const Operand& src) { |
| 1703 vinstr(0xF0, dst, xmm0, src, kF2, k0F, kWIG); |
| 1704 } |
| 1705 void vpsllw(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1706 XMMRegister iop = {6}; |
| 1707 vinstr(0x71, iop, dst, src, k66, k0F, kWIG); |
| 1708 emit(imm8); |
| 1709 } |
| 1710 void vpsrlw(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1711 XMMRegister iop = {2}; |
| 1712 vinstr(0x71, iop, dst, src, k66, k0F, kWIG); |
| 1713 emit(imm8); |
| 1714 } |
| 1715 void vpsraw(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1716 XMMRegister iop = {4}; |
| 1717 vinstr(0x71, iop, dst, src, k66, k0F, kWIG); |
| 1718 emit(imm8); |
| 1719 } |
| 1720 void vpslld(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1721 XMMRegister iop = {6}; |
| 1722 vinstr(0x72, iop, dst, src, k66, k0F, kWIG); |
| 1723 emit(imm8); |
| 1724 } |
| 1725 void vpsrld(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1726 XMMRegister iop = {2}; |
| 1727 vinstr(0x72, iop, dst, src, k66, k0F, kWIG); |
| 1728 emit(imm8); |
| 1729 } |
| 1730 void vpsrad(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1731 XMMRegister iop = {4}; |
| 1732 vinstr(0x72, iop, dst, src, k66, k0F, kWIG); |
| 1733 emit(imm8); |
| 1734 } |
| 1735 void vpextrb(Register dst, XMMRegister src, int8_t imm8) { |
| 1736 XMMRegister idst = {dst.code()}; |
| 1737 vinstr(0x14, src, xmm0, idst, k66, k0F3A, kW0); |
| 1738 emit(imm8); |
| 1739 } |
| 1740 void vpextrb(const Operand& dst, XMMRegister src, int8_t imm8) { |
| 1741 vinstr(0x14, src, xmm0, dst, k66, k0F3A, kW0); |
| 1742 emit(imm8); |
| 1743 } |
| 1744 void vpextrw(Register dst, XMMRegister src, int8_t imm8) { |
| 1745 XMMRegister idst = {dst.code()}; |
| 1746 vinstr(0xc5, idst, xmm0, src, k66, k0F, kW0); |
| 1747 emit(imm8); |
| 1748 } |
| 1749 void vpextrw(const Operand& dst, XMMRegister src, int8_t imm8) { |
| 1750 vinstr(0x15, src, xmm0, dst, k66, k0F3A, kW0); |
| 1751 emit(imm8); |
| 1752 } |
| 1753 void vpextrd(Register dst, XMMRegister src, int8_t imm8) { |
| 1754 XMMRegister idst = {dst.code()}; |
| 1755 vinstr(0x16, src, xmm0, idst, k66, k0F3A, kW0); |
| 1756 emit(imm8); |
| 1757 } |
| 1758 void vpextrd(const Operand& dst, XMMRegister src, int8_t imm8) { |
| 1759 vinstr(0x16, src, xmm0, dst, k66, k0F3A, kW0); |
| 1760 emit(imm8); |
| 1761 } |
| 1762 void vpinsrb(XMMRegister dst, XMMRegister src1, Register src2, int8_t imm8) { |
| 1763 XMMRegister isrc = {src2.code()}; |
| 1764 vinstr(0x20, dst, src1, isrc, k66, k0F3A, kW0); |
| 1765 emit(imm8); |
| 1766 } |
| 1767 void vpinsrb(XMMRegister dst, XMMRegister src1, const Operand& src2, |
| 1768 int8_t imm8) { |
| 1769 vinstr(0x20, dst, src1, src2, k66, k0F3A, kW0); |
| 1770 emit(imm8); |
| 1771 } |
| 1772 void vpinsrw(XMMRegister dst, XMMRegister src1, Register src2, int8_t imm8) { |
| 1773 XMMRegister isrc = {src2.code()}; |
| 1774 vinstr(0xc4, dst, src1, isrc, k66, k0F, kW0); |
| 1775 emit(imm8); |
| 1776 } |
| 1777 void vpinsrw(XMMRegister dst, XMMRegister src1, const Operand& src2, |
| 1778 int8_t imm8) { |
| 1779 vinstr(0xc4, dst, src1, src2, k66, k0F, kW0); |
| 1780 emit(imm8); |
| 1781 } |
| 1782 void vpinsrd(XMMRegister dst, XMMRegister src1, Register src2, int8_t imm8) { |
| 1783 XMMRegister isrc = {src2.code()}; |
| 1784 vinstr(0x22, dst, src1, isrc, k66, k0F3A, kW0); |
| 1785 emit(imm8); |
| 1786 } |
| 1787 void vpinsrd(XMMRegister dst, XMMRegister src1, const Operand& src2, |
| 1788 int8_t imm8) { |
| 1789 vinstr(0x22, dst, src1, src2, k66, k0F3A, kW0); |
| 1790 emit(imm8); |
| 1791 } |
| 1792 void vpshufd(XMMRegister dst, XMMRegister src, int8_t imm8) { |
| 1793 vinstr(0x70, dst, xmm0, src, k66, k0F, kWIG); |
| 1794 emit(imm8); |
| 1795 } |
| 1796 |
1619 void vps(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); | 1797 void vps(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
1620 void vps(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); | 1798 void vps(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
1621 void vpd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); | 1799 void vpd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
1622 void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); | 1800 void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
1623 | 1801 |
1624 // BMI instruction | 1802 // BMI instruction |
1625 void andnq(Register dst, Register src1, Register src2) { | 1803 void andnq(Register dst, Register src1, Register src2) { |
1626 bmi1q(0xf2, dst, src1, src2); | 1804 bmi1q(0xf2, dst, src1, src2); |
1627 } | 1805 } |
1628 void andnq(Register dst, Register src1, const Operand& src2) { | 1806 void andnq(Register dst, Register src1, const Operand& src2) { |
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2350 Assembler* assembler_; | 2528 Assembler* assembler_; |
2351 #ifdef DEBUG | 2529 #ifdef DEBUG |
2352 int space_before_; | 2530 int space_before_; |
2353 #endif | 2531 #endif |
2354 }; | 2532 }; |
2355 | 2533 |
2356 } // namespace internal | 2534 } // namespace internal |
2357 } // namespace v8 | 2535 } // namespace v8 |
2358 | 2536 |
2359 #endif // V8_X64_ASSEMBLER_X64_H_ | 2537 #endif // V8_X64_ASSEMBLER_X64_H_ |
OLD | NEW |