| 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 |