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

Side by Side Diff: src/x64/assembler-x64.h

Issue 2328843003: [x64] supplement SSE insturctions for SIMD.js (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « src/v8.gyp ('k') | src/x64/assembler-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « src/v8.gyp ('k') | src/x64/assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698