< prev index next >

src/hotspot/cpu/x86/macroAssembler_x86.hpp

Print this page




 860 
 861   // Emit the CompiledIC call idiom
 862   void ic_call(address entry, jint method_index = 0);
 863 
 864   // Jumps
 865 
 866   // NOTE: these jumps tranfer to the effective address of dst NOT
 867   // the address contained by dst. This is because this is more natural
 868   // for jumps/calls.
 869   void jump(AddressLiteral dst);
 870   void jump_cc(Condition cc, AddressLiteral dst);
 871 
 872   // 32bit can do a case table jump in one instruction but we no longer allow the base
 873   // to be installed in the Address class. This jump will tranfers to the address
 874   // contained in the location described by entry (not the address of entry)
 875   void jump(ArrayAddress entry);
 876 
 877   // Floating
 878 
 879   void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); }
 880   void andpd(XMMRegister dst, AddressLiteral src);
 881   void andpd(XMMRegister dst, XMMRegister src) { Assembler::andpd(dst, src); }
 882 
 883   void andps(XMMRegister dst, XMMRegister src) { Assembler::andps(dst, src); }
 884   void andps(XMMRegister dst, Address src) { Assembler::andps(dst, src); }
 885   void andps(XMMRegister dst, AddressLiteral src);
 886 
 887   void comiss(XMMRegister dst, XMMRegister src) { Assembler::comiss(dst, src); }
 888   void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); }
 889   void comiss(XMMRegister dst, AddressLiteral src);
 890 
 891   void comisd(XMMRegister dst, XMMRegister src) { Assembler::comisd(dst, src); }
 892   void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
 893   void comisd(XMMRegister dst, AddressLiteral src);
 894 
 895   void fadd_s(Address src)        { Assembler::fadd_s(src); }
 896   void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); }
 897 
 898   void fldcw(Address src) { Assembler::fldcw(src); }
 899   void fldcw(AddressLiteral src);
 900 
 901   void fld_s(int index)   { Assembler::fld_s(index); }
 902   void fld_s(Address src) { Assembler::fld_s(src); }
 903   void fld_s(AddressLiteral src);
 904 
 905   void fld_d(Address src) { Assembler::fld_d(src); }


1049 
1050   void libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx,
1051                          Register esi, Register edi, Register ebp, Register esp);
1052 
1053   void libm_tancot_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx,
1054                         Register edx, Register ebx, Register esi, Register edi,
1055                         Register ebp, Register esp);
1056 
1057   void fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1058                 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1059                 Register rax, Register rcx, Register rdx, Register tmp);
1060 #endif
1061 
1062   void increase_precision();
1063   void restore_precision();
1064 
1065 private:
1066 
1067   // these are private because users should be doing movflt/movdbl
1068 
1069   void movss(Address dst, XMMRegister src)     { Assembler::movss(dst, src); }
1070   void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); }

1071   void movss(XMMRegister dst, Address src)     { Assembler::movss(dst, src); }
1072   void movss(XMMRegister dst, AddressLiteral src);
1073 
1074   void movlpd(XMMRegister dst, Address src)    {Assembler::movlpd(dst, src); }
1075   void movlpd(XMMRegister dst, AddressLiteral src);
1076 
1077 public:
1078 
1079   void addsd(XMMRegister dst, XMMRegister src)    { Assembler::addsd(dst, src); }
1080   void addsd(XMMRegister dst, Address src)        { Assembler::addsd(dst, src); }
1081   void addsd(XMMRegister dst, AddressLiteral src);
1082 
1083   void addss(XMMRegister dst, XMMRegister src)    { Assembler::addss(dst, src); }
1084   void addss(XMMRegister dst, Address src)        { Assembler::addss(dst, src); }
1085   void addss(XMMRegister dst, AddressLiteral src);
1086 
1087   void addpd(XMMRegister dst, XMMRegister src)    { Assembler::addpd(dst, src); }
1088   void addpd(XMMRegister dst, Address src)        { Assembler::addpd(dst, src); }
1089   void addpd(XMMRegister dst, AddressLiteral src);
1090 
1091   void divsd(XMMRegister dst, XMMRegister src)    { Assembler::divsd(dst, src); }
1092   void divsd(XMMRegister dst, Address src)        { Assembler::divsd(dst, src); }
1093   void divsd(XMMRegister dst, AddressLiteral src);
1094 
1095   void divss(XMMRegister dst, XMMRegister src)    { Assembler::divss(dst, src); }
1096   void divss(XMMRegister dst, Address src)        { Assembler::divss(dst, src); }
1097   void divss(XMMRegister dst, AddressLiteral src);
1098 
1099   // Move Unaligned Double Quadword
1100   void movdqu(Address     dst, XMMRegister src);
1101   void movdqu(XMMRegister dst, Address src);
1102   void movdqu(XMMRegister dst, XMMRegister src);
1103   void movdqu(XMMRegister dst, AddressLiteral src, Register scratchReg = rscratch1);
1104   // AVX Unaligned forms
1105   void vmovdqu(Address     dst, XMMRegister src);
1106   void vmovdqu(XMMRegister dst, Address src);
1107   void vmovdqu(XMMRegister dst, XMMRegister src);
1108   void vmovdqu(XMMRegister dst, AddressLiteral src);
1109   void evmovdquq(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1110   void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1111   void evmovdquq(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1112   void evmovdquq(XMMRegister dst, AddressLiteral src, int vector_len, Register rscratch);
1113 
1114   // Move Aligned Double Quadword
1115   void movdqa(XMMRegister dst, Address src)       { Assembler::movdqa(dst, src); }
1116   void movdqa(XMMRegister dst, XMMRegister src)   { Assembler::movdqa(dst, src); }
1117   void movdqa(XMMRegister dst, AddressLiteral src);
1118 
1119   void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
1120   void movsd(Address dst, XMMRegister src)     { Assembler::movsd(dst, src); }
1121   void movsd(XMMRegister dst, Address src)     { Assembler::movsd(dst, src); }
1122   void movsd(XMMRegister dst, AddressLiteral src);
1123 
1124   void mulpd(XMMRegister dst, XMMRegister src)    { Assembler::mulpd(dst, src); }
1125   void mulpd(XMMRegister dst, Address src)        { Assembler::mulpd(dst, src); }
1126   void mulpd(XMMRegister dst, AddressLiteral src);
1127 
1128   void mulsd(XMMRegister dst, XMMRegister src)    { Assembler::mulsd(dst, src); }


1166 
1167   void subsd(XMMRegister dst, XMMRegister src)    { Assembler::subsd(dst, src); }
1168   void subsd(XMMRegister dst, Address src)        { Assembler::subsd(dst, src); }
1169   void subsd(XMMRegister dst, AddressLiteral src);
1170 
1171   void subss(XMMRegister dst, XMMRegister src)    { Assembler::subss(dst, src); }
1172   void subss(XMMRegister dst, Address src)        { Assembler::subss(dst, src); }
1173   void subss(XMMRegister dst, AddressLiteral src);
1174 
1175   void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
1176   void ucomiss(XMMRegister dst, Address src)     { Assembler::ucomiss(dst, src); }
1177   void ucomiss(XMMRegister dst, AddressLiteral src);
1178 
1179   void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
1180   void ucomisd(XMMRegister dst, Address src)     { Assembler::ucomisd(dst, src); }
1181   void ucomisd(XMMRegister dst, AddressLiteral src);
1182 
1183   // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
1184   void xorpd(XMMRegister dst, XMMRegister src);
1185   void xorpd(XMMRegister dst, Address src)     { Assembler::xorpd(dst, src); }
1186   void xorpd(XMMRegister dst, AddressLiteral src);
1187 
1188   // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
1189   void xorps(XMMRegister dst, XMMRegister src);
1190   void xorps(XMMRegister dst, Address src)     { Assembler::xorps(dst, src); }
1191   void xorps(XMMRegister dst, AddressLiteral src);
1192 
1193   // Shuffle Bytes
1194   void pshufb(XMMRegister dst, XMMRegister src) { Assembler::pshufb(dst, src); }
1195   void pshufb(XMMRegister dst, Address src)     { Assembler::pshufb(dst, src); }
1196   void pshufb(XMMRegister dst, AddressLiteral src);
1197   // AVX 3-operands instructions
1198 
1199   void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); }
1200   void vaddsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vaddsd(dst, nds, src); }
1201   void vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1202 
1203   void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddss(dst, nds, src); }
1204   void vaddss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vaddss(dst, nds, src); }
1205   void vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1206 
1207   void vabsss(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len);
1208   void vabssd(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len);
1209 
1210   void vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1211   void vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1212 
1213   void vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1214   void vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1215 
1216   void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
1217   void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
1218   void vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len);
1219 
1220   void vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len);
1221   void vpbroadcastw(XMMRegister dst, Address src, int vector_len) { Assembler::vpbroadcastw(dst, src, vector_len); }
1222 
1223   void vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1224 
1225   void vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1226 
1227   void vpmovzxbw(XMMRegister dst, Address src, int vector_len);
1228   void vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::vpmovzxbw(dst, src, vector_len); }
1229 
1230   void vpmovmskb(Register dst, XMMRegister src);
1231 
1232   void vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1233   void vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1234 
1235   void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1236   void vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1237 
1238   void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1239   void vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1240 
1241   void vpsraw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1242   void vpsraw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1243 



1244   void vpsrlw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1245   void vpsrlw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1246 
1247   void vpsllw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1248   void vpsllw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1249 
1250   void vptest(XMMRegister dst, XMMRegister src);
1251 
1252   void punpcklbw(XMMRegister dst, XMMRegister src);
1253   void punpcklbw(XMMRegister dst, Address src) { Assembler::punpcklbw(dst, src); }
1254 
1255   void pshufd(XMMRegister dst, Address src, int mode);
1256   void pshufd(XMMRegister dst, XMMRegister src, int mode) { Assembler::pshufd(dst, src, mode); }
1257 
1258   void pshuflw(XMMRegister dst, XMMRegister src, int mode);
1259   void pshuflw(XMMRegister dst, Address src, int mode) { Assembler::pshuflw(dst, src, mode); }
1260 
1261   void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vandpd(dst, nds, src, vector_len); }
1262   void vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len)     { Assembler::vandpd(dst, nds, src, vector_len); }
1263   void vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len);
1264 
1265   void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vandps(dst, nds, src, vector_len); }
1266   void vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len)     { Assembler::vandps(dst, nds, src, vector_len); }
1267   void vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len);
1268 
1269   void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivsd(dst, nds, src); }
1270   void vdivsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vdivsd(dst, nds, src); }
1271   void vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1272 
1273   void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivss(dst, nds, src); }
1274   void vdivss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vdivss(dst, nds, src); }
1275   void vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1276 
1277   void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulsd(dst, nds, src); }
1278   void vmulsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vmulsd(dst, nds, src); }
1279   void vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1280 
1281   void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulss(dst, nds, src); }
1282   void vmulss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vmulss(dst, nds, src); }
1283   void vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1284 
1285   void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubsd(dst, nds, src); }
1286   void vsubsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubsd(dst, nds, src); }
1287   void vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1288 
1289   void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubss(dst, nds, src); }
1290   void vsubss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubss(dst, nds, src); }
1291   void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1292 
1293   void vnegatess(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1294   void vnegatesd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1295 
1296   // AVX Vector instructions
1297 
1298   void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
1299   void vxorpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
1300   void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len);
1301 
1302   void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorps(dst, nds, src, vector_len); }
1303   void vxorps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vxorps(dst, nds, src, vector_len); }
1304   void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len);
1305 
1306   void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
1307     if (UseAVX > 1 || (vector_len < 1)) // vpxor 256 bit is available only in AVX2
1308       Assembler::vpxor(dst, nds, src, vector_len);
1309     else
1310       Assembler::vxorpd(dst, nds, src, vector_len);
1311   }
1312   void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
1313     if (UseAVX > 1 || (vector_len < 1)) // vpxor 256 bit is available only in AVX2
1314       Assembler::vpxor(dst, nds, src, vector_len);
1315     else
1316       Assembler::vxorpd(dst, nds, src, vector_len);
1317   }

1318 
1319   // Simple version for AVX2 256bit vectors
1320   void vpxor(XMMRegister dst, XMMRegister src) { Assembler::vpxor(dst, dst, src, true); }
1321   void vpxor(XMMRegister dst, Address src) { Assembler::vpxor(dst, dst, src, true); }
1322 
1323   void vinserti128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
1324     if (UseAVX > 2) {
1325       Assembler::vinserti32x4(dst, dst, src, imm8);
1326     } else if (UseAVX > 1) {
1327       // vinserti128 is available only in AVX2
1328       Assembler::vinserti128(dst, nds, src, imm8);
1329     } else {
1330       Assembler::vinsertf128(dst, nds, src, imm8);
1331     }
1332   }
1333 
1334   void vinserti128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {
1335     if (UseAVX > 2) {
1336       Assembler::vinserti32x4(dst, dst, src, imm8);
1337     } else if (UseAVX > 1) {




 860 
 861   // Emit the CompiledIC call idiom
 862   void ic_call(address entry, jint method_index = 0);
 863 
 864   // Jumps
 865 
 866   // NOTE: these jumps tranfer to the effective address of dst NOT
 867   // the address contained by dst. This is because this is more natural
 868   // for jumps/calls.
 869   void jump(AddressLiteral dst);
 870   void jump_cc(Condition cc, AddressLiteral dst);
 871 
 872   // 32bit can do a case table jump in one instruction but we no longer allow the base
 873   // to be installed in the Address class. This jump will tranfers to the address
 874   // contained in the location described by entry (not the address of entry)
 875   void jump(ArrayAddress entry);
 876 
 877   // Floating
 878 
 879   void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); }
 880   void andpd(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
 881   void andpd(XMMRegister dst, XMMRegister src) { Assembler::andpd(dst, src); }
 882 
 883   void andps(XMMRegister dst, XMMRegister src) { Assembler::andps(dst, src); }
 884   void andps(XMMRegister dst, Address src) { Assembler::andps(dst, src); }
 885   void andps(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
 886 
 887   void comiss(XMMRegister dst, XMMRegister src) { Assembler::comiss(dst, src); }
 888   void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); }
 889   void comiss(XMMRegister dst, AddressLiteral src);
 890 
 891   void comisd(XMMRegister dst, XMMRegister src) { Assembler::comisd(dst, src); }
 892   void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
 893   void comisd(XMMRegister dst, AddressLiteral src);
 894 
 895   void fadd_s(Address src)        { Assembler::fadd_s(src); }
 896   void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); }
 897 
 898   void fldcw(Address src) { Assembler::fldcw(src); }
 899   void fldcw(AddressLiteral src);
 900 
 901   void fld_s(int index)   { Assembler::fld_s(index); }
 902   void fld_s(Address src) { Assembler::fld_s(src); }
 903   void fld_s(AddressLiteral src);
 904 
 905   void fld_d(Address src) { Assembler::fld_d(src); }


1049 
1050   void libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx,
1051                          Register esi, Register edi, Register ebp, Register esp);
1052 
1053   void libm_tancot_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx,
1054                         Register edx, Register ebx, Register esi, Register edi,
1055                         Register ebp, Register esp);
1056 
1057   void fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1058                 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1059                 Register rax, Register rcx, Register rdx, Register tmp);
1060 #endif
1061 
1062   void increase_precision();
1063   void restore_precision();
1064 
1065 private:
1066 
1067   // these are private because users should be doing movflt/movdbl
1068 

1069   void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); }
1070   void movss(Address dst, XMMRegister src)     { Assembler::movss(dst, src); }
1071   void movss(XMMRegister dst, Address src)     { Assembler::movss(dst, src); }
1072   void movss(XMMRegister dst, AddressLiteral src);
1073 
1074   void movlpd(XMMRegister dst, Address src)    {Assembler::movlpd(dst, src); }
1075   void movlpd(XMMRegister dst, AddressLiteral src);
1076 
1077 public:
1078 
1079   void addsd(XMMRegister dst, XMMRegister src)    { Assembler::addsd(dst, src); }
1080   void addsd(XMMRegister dst, Address src)        { Assembler::addsd(dst, src); }
1081   void addsd(XMMRegister dst, AddressLiteral src);
1082 
1083   void addss(XMMRegister dst, XMMRegister src)    { Assembler::addss(dst, src); }
1084   void addss(XMMRegister dst, Address src)        { Assembler::addss(dst, src); }
1085   void addss(XMMRegister dst, AddressLiteral src);
1086 
1087   void addpd(XMMRegister dst, XMMRegister src)    { Assembler::addpd(dst, src); }
1088   void addpd(XMMRegister dst, Address src)        { Assembler::addpd(dst, src); }
1089   void addpd(XMMRegister dst, AddressLiteral src);
1090 
1091   void divsd(XMMRegister dst, XMMRegister src)    { Assembler::divsd(dst, src); }
1092   void divsd(XMMRegister dst, Address src)        { Assembler::divsd(dst, src); }
1093   void divsd(XMMRegister dst, AddressLiteral src);
1094 
1095   void divss(XMMRegister dst, XMMRegister src)    { Assembler::divss(dst, src); }
1096   void divss(XMMRegister dst, Address src)        { Assembler::divss(dst, src); }
1097   void divss(XMMRegister dst, AddressLiteral src);
1098 
1099   // Move Unaligned Double Quadword
1100   void movdqu(Address     dst, XMMRegister src);
1101   void movdqu(XMMRegister dst, Address src);
1102   void movdqu(XMMRegister dst, XMMRegister src);
1103   void movdqu(XMMRegister dst, AddressLiteral src, Register scratchReg = rscratch1);
1104   // AVX Unaligned forms
1105   void vmovdqu(Address     dst, XMMRegister src);
1106   void vmovdqu(XMMRegister dst, Address src);
1107   void vmovdqu(XMMRegister dst, XMMRegister src);
1108   void vmovdqu(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1109   void evmovdquq(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1110   void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1111   void evmovdquq(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1112   void evmovdquq(XMMRegister dst, AddressLiteral src, int vector_len, Register rscratch);
1113 
1114   // Move Aligned Double Quadword
1115   void movdqa(XMMRegister dst, Address src)       { Assembler::movdqa(dst, src); }
1116   void movdqa(XMMRegister dst, XMMRegister src)   { Assembler::movdqa(dst, src); }
1117   void movdqa(XMMRegister dst, AddressLiteral src);
1118 
1119   void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
1120   void movsd(Address dst, XMMRegister src)     { Assembler::movsd(dst, src); }
1121   void movsd(XMMRegister dst, Address src)     { Assembler::movsd(dst, src); }
1122   void movsd(XMMRegister dst, AddressLiteral src);
1123 
1124   void mulpd(XMMRegister dst, XMMRegister src)    { Assembler::mulpd(dst, src); }
1125   void mulpd(XMMRegister dst, Address src)        { Assembler::mulpd(dst, src); }
1126   void mulpd(XMMRegister dst, AddressLiteral src);
1127 
1128   void mulsd(XMMRegister dst, XMMRegister src)    { Assembler::mulsd(dst, src); }


1166 
1167   void subsd(XMMRegister dst, XMMRegister src)    { Assembler::subsd(dst, src); }
1168   void subsd(XMMRegister dst, Address src)        { Assembler::subsd(dst, src); }
1169   void subsd(XMMRegister dst, AddressLiteral src);
1170 
1171   void subss(XMMRegister dst, XMMRegister src)    { Assembler::subss(dst, src); }
1172   void subss(XMMRegister dst, Address src)        { Assembler::subss(dst, src); }
1173   void subss(XMMRegister dst, AddressLiteral src);
1174 
1175   void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
1176   void ucomiss(XMMRegister dst, Address src)     { Assembler::ucomiss(dst, src); }
1177   void ucomiss(XMMRegister dst, AddressLiteral src);
1178 
1179   void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
1180   void ucomisd(XMMRegister dst, Address src)     { Assembler::ucomisd(dst, src); }
1181   void ucomisd(XMMRegister dst, AddressLiteral src);
1182 
1183   // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
1184   void xorpd(XMMRegister dst, XMMRegister src);
1185   void xorpd(XMMRegister dst, Address src)     { Assembler::xorpd(dst, src); }
1186   void xorpd(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1187 
1188   // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
1189   void xorps(XMMRegister dst, XMMRegister src);
1190   void xorps(XMMRegister dst, Address src)     { Assembler::xorps(dst, src); }
1191   void xorps(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1192 
1193   // Shuffle Bytes
1194   void pshufb(XMMRegister dst, XMMRegister src) { Assembler::pshufb(dst, src); }
1195   void pshufb(XMMRegister dst, Address src)     { Assembler::pshufb(dst, src); }
1196   void pshufb(XMMRegister dst, AddressLiteral src);
1197   // AVX 3-operands instructions
1198 
1199   void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); }
1200   void vaddsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vaddsd(dst, nds, src); }
1201   void vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1202 
1203   void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddss(dst, nds, src); }
1204   void vaddss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vaddss(dst, nds, src); }
1205   void vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1206 
1207   void vabsss(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len);
1208   void vabssd(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len);
1209 
1210   void vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1211   void vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1212 
1213   void vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1214   void vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1215 
1216   void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
1217   void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
1218   void vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1219 
1220   void vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len);
1221   void vpbroadcastw(XMMRegister dst, Address src, int vector_len) { Assembler::vpbroadcastw(dst, src, vector_len); }
1222 
1223   void vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1224 
1225   void vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1226 
1227   void vpmovzxbw(XMMRegister dst, Address src, int vector_len);
1228   void vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::vpmovzxbw(dst, src, vector_len); }
1229 
1230   void vpmovmskb(Register dst, XMMRegister src);
1231 
1232   void vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1233   void vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1234 
1235   void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1236   void vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1237 
1238   void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1239   void vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1240 
1241   void vpsraw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1242   void vpsraw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1243 
1244   void evpsraq(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1245   void evpsraq(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1246 
1247   void vpsrlw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1248   void vpsrlw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1249 
1250   void vpsllw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1251   void vpsllw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1252 
1253   void vptest(XMMRegister dst, XMMRegister src);
1254 
1255   void punpcklbw(XMMRegister dst, XMMRegister src);
1256   void punpcklbw(XMMRegister dst, Address src) { Assembler::punpcklbw(dst, src); }
1257 
1258   void pshufd(XMMRegister dst, Address src, int mode);
1259   void pshufd(XMMRegister dst, XMMRegister src, int mode) { Assembler::pshufd(dst, src, mode); }
1260 
1261   void pshuflw(XMMRegister dst, XMMRegister src, int mode);
1262   void pshuflw(XMMRegister dst, Address src, int mode) { Assembler::pshuflw(dst, src, mode); }
1263 
1264   void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vandpd(dst, nds, src, vector_len); }
1265   void vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len)     { Assembler::vandpd(dst, nds, src, vector_len); }
1266   void vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1267 
1268   void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vandps(dst, nds, src, vector_len); }
1269   void vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len)     { Assembler::vandps(dst, nds, src, vector_len); }
1270   void vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1271 
1272   void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivsd(dst, nds, src); }
1273   void vdivsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vdivsd(dst, nds, src); }
1274   void vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1275 
1276   void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivss(dst, nds, src); }
1277   void vdivss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vdivss(dst, nds, src); }
1278   void vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1279 
1280   void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulsd(dst, nds, src); }
1281   void vmulsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vmulsd(dst, nds, src); }
1282   void vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1283 
1284   void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulss(dst, nds, src); }
1285   void vmulss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vmulss(dst, nds, src); }
1286   void vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1287 
1288   void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubsd(dst, nds, src); }
1289   void vsubsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubsd(dst, nds, src); }
1290   void vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1291 
1292   void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubss(dst, nds, src); }
1293   void vsubss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubss(dst, nds, src); }
1294   void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1295 
1296   void vnegatess(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1297   void vnegatesd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1298 
1299   // AVX Vector instructions
1300 
1301   void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
1302   void vxorpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
1303   void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1304 
1305   void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorps(dst, nds, src, vector_len); }
1306   void vxorps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vxorps(dst, nds, src, vector_len); }
1307   void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1308 
1309   void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
1310     if (UseAVX > 1 || (vector_len < 1)) // vpxor 256 bit is available only in AVX2
1311       Assembler::vpxor(dst, nds, src, vector_len);
1312     else
1313       Assembler::vxorpd(dst, nds, src, vector_len);
1314   }
1315   void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
1316     if (UseAVX > 1 || (vector_len < 1)) // vpxor 256 bit is available only in AVX2
1317       Assembler::vpxor(dst, nds, src, vector_len);
1318     else
1319       Assembler::vxorpd(dst, nds, src, vector_len);
1320   }
1321   void vpxor(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1322 
1323   // Simple version for AVX2 256bit vectors
1324   void vpxor(XMMRegister dst, XMMRegister src) { Assembler::vpxor(dst, dst, src, true); }
1325   void vpxor(XMMRegister dst, Address src) { Assembler::vpxor(dst, dst, src, true); }
1326 
1327   void vinserti128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
1328     if (UseAVX > 2) {
1329       Assembler::vinserti32x4(dst, dst, src, imm8);
1330     } else if (UseAVX > 1) {
1331       // vinserti128 is available only in AVX2
1332       Assembler::vinserti128(dst, nds, src, imm8);
1333     } else {
1334       Assembler::vinsertf128(dst, nds, src, imm8);
1335     }
1336   }
1337 
1338   void vinserti128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {
1339     if (UseAVX > 2) {
1340       Assembler::vinserti32x4(dst, dst, src, imm8);
1341     } else if (UseAVX > 1) {


< prev index next >