src/cpu/x86/vm/assembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hs-comp-bmi1 Sdiff src/cpu/x86/vm

src/cpu/x86/vm/assembler_x86.cpp

Print this page




1072   emit_int32(imm32);
1073 }
1074 
1075 void Assembler::andl(Register dst, int32_t imm32) {
1076   prefix(dst);
1077   emit_arith(0x81, 0xE0, dst, imm32);
1078 }
1079 
1080 void Assembler::andl(Register dst, Address src) {
1081   InstructionMark im(this);
1082   prefix(src, dst);
1083   emit_int8(0x23);
1084   emit_operand(dst, src);
1085 }
1086 
1087 void Assembler::andl(Register dst, Register src) {
1088   (void) prefix_and_encode(dst->encoding(), src->encoding());
1089   emit_arith(0x23, 0xC0, dst, src);
1090 }
1091 















1092 void Assembler::bsfl(Register dst, Register src) {
1093   int encode = prefix_and_encode(dst->encoding(), src->encoding());
1094   emit_int8(0x0F);
1095   emit_int8((unsigned char)0xBC);
1096   emit_int8((unsigned char)(0xC0 | encode));
1097 }
1098 
1099 void Assembler::bsrl(Register dst, Register src) {
1100   assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
1101   int encode = prefix_and_encode(dst->encoding(), src->encoding());
1102   emit_int8(0x0F);
1103   emit_int8((unsigned char)0xBD);
1104   emit_int8((unsigned char)(0xC0 | encode));
1105 }
1106 
1107 void Assembler::bswapl(Register reg) { // bswap
1108   int encode = prefix_and_encode(reg->encoding());
1109   emit_int8(0x0F);
1110   emit_int8((unsigned char)(0xC8 | encode));
1111 }
1112 













































1113 void Assembler::call(Label& L, relocInfo::relocType rtype) {
1114   // suspect disp32 is always good
1115   int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);
1116 
1117   if (L.is_bound()) {
1118     const int long_size = 5;
1119     int offs = (int)( target(L) - pc() );
1120     assert(offs <= 0, "assembler error");
1121     InstructionMark im(this);
1122     // 1110 1000 #32-bit disp
1123     emit_int8((unsigned char)0xE8);
1124     emit_data(offs - long_size, rtype, operand);
1125   } else {
1126     InstructionMark im(this);
1127     // 1110 1000 #32-bit disp
1128     L.add_patch_at(code(), locator());
1129 
1130     emit_int8((unsigned char)0xE8);
1131     emit_data(int(0), rtype, operand);
1132   }


2861   } else {
2862     encode = prefix_and_encode(encode);
2863     emit_int8((unsigned char)0xF7);
2864     emit_int8((unsigned char)(0xC0 | encode));
2865   }
2866   emit_int32(imm32);
2867 }
2868 
2869 void Assembler::testl(Register dst, Register src) {
2870   (void) prefix_and_encode(dst->encoding(), src->encoding());
2871   emit_arith(0x85, 0xC0, dst, src);
2872 }
2873 
2874 void Assembler::testl(Register dst, Address  src) {
2875   InstructionMark im(this);
2876   prefix(src, dst);
2877   emit_int8((unsigned char)0x85);
2878   emit_operand(dst, src);
2879 }
2880 


















2881 void Assembler::ucomisd(XMMRegister dst, Address src) {
2882   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2883   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);
2884 }
2885 
2886 void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
2887   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2888   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);
2889 }
2890 
2891 void Assembler::ucomiss(XMMRegister dst, Address src) {
2892   NOT_LP64(assert(VM_Version::supports_sse(), ""));
2893   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);
2894 }
2895 
2896 void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
2897   NOT_LP64(assert(VM_Version::supports_sse(), ""));
2898   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);
2899 }
2900 


4820   emit_int32(imm32);
4821 }
4822 
4823 void Assembler::andq(Register dst, int32_t imm32) {
4824   (void) prefixq_and_encode(dst->encoding());
4825   emit_arith(0x81, 0xE0, dst, imm32);
4826 }
4827 
4828 void Assembler::andq(Register dst, Address src) {
4829   InstructionMark im(this);
4830   prefixq(src, dst);
4831   emit_int8(0x23);
4832   emit_operand(dst, src);
4833 }
4834 
4835 void Assembler::andq(Register dst, Register src) {
4836   (void) prefixq_and_encode(dst->encoding(), src->encoding());
4837   emit_arith(0x23, 0xC0, dst, src);
4838 }
4839 















4840 void Assembler::bsfq(Register dst, Register src) {
4841   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4842   emit_int8(0x0F);
4843   emit_int8((unsigned char)0xBC);
4844   emit_int8((unsigned char)(0xC0 | encode));
4845 }
4846 
4847 void Assembler::bsrq(Register dst, Register src) {
4848   assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
4849   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4850   emit_int8(0x0F);
4851   emit_int8((unsigned char)0xBD);
4852   emit_int8((unsigned char)(0xC0 | encode));
4853 }
4854 
4855 void Assembler::bswapq(Register reg) {
4856   int encode = prefixq_and_encode(reg->encoding());
4857   emit_int8(0x0F);
4858   emit_int8((unsigned char)(0xC8 | encode));
4859 }
4860 













































4861 void Assembler::cdqq() {
4862   prefix(REX_W);
4863   emit_int8((unsigned char)0x99);
4864 }
4865 
4866 void Assembler::clflush(Address adr) {
4867   prefix(adr);
4868   emit_int8(0x0F);
4869   emit_int8((unsigned char)0xAE);
4870   emit_operand(rdi, adr);
4871 }
4872 
4873 void Assembler::cmovq(Condition cc, Register dst, Register src) {
4874   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4875   emit_int8(0x0F);
4876   emit_int8(0x40 | cc);
4877   emit_int8((unsigned char)(0xC0 | encode));
4878 }
4879 
4880 void Assembler::cmovq(Condition cc, Register dst, Address src) {




1072   emit_int32(imm32);
1073 }
1074 
1075 void Assembler::andl(Register dst, int32_t imm32) {
1076   prefix(dst);
1077   emit_arith(0x81, 0xE0, dst, imm32);
1078 }
1079 
1080 void Assembler::andl(Register dst, Address src) {
1081   InstructionMark im(this);
1082   prefix(src, dst);
1083   emit_int8(0x23);
1084   emit_operand(dst, src);
1085 }
1086 
1087 void Assembler::andl(Register dst, Register src) {
1088   (void) prefix_and_encode(dst->encoding(), src->encoding());
1089   emit_arith(0x23, 0xC0, dst, src);
1090 }
1091 
1092 void Assembler::andnl(Register dst, Register src1, Register src2) {
1093   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1094   int encode = vex_prefix_0F38_and_encode(dst, src1, src2);
1095   emit_int8((unsigned char)0xF2);
1096   emit_int8((unsigned char)(0xC0 | encode));
1097 }
1098 
1099 void Assembler::andnl(Register dst, Register src1, Address src2) {
1100   InstructionMark im(this);
1101   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1102   vex_prefix_0F38(dst, src1, src2);
1103   emit_int8((unsigned char)0xF2);
1104   emit_operand(dst, src2);
1105 }
1106 
1107 void Assembler::bsfl(Register dst, Register src) {
1108   int encode = prefix_and_encode(dst->encoding(), src->encoding());
1109   emit_int8(0x0F);
1110   emit_int8((unsigned char)0xBC);
1111   emit_int8((unsigned char)(0xC0 | encode));
1112 }
1113 
1114 void Assembler::bsrl(Register dst, Register src) {
1115   assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
1116   int encode = prefix_and_encode(dst->encoding(), src->encoding());
1117   emit_int8(0x0F);
1118   emit_int8((unsigned char)0xBD);
1119   emit_int8((unsigned char)(0xC0 | encode));
1120 }
1121 
1122 void Assembler::bswapl(Register reg) { // bswap
1123   int encode = prefix_and_encode(reg->encoding());
1124   emit_int8(0x0F);
1125   emit_int8((unsigned char)(0xC8 | encode));
1126 }
1127 
1128 void Assembler::blsil(Register dst, Register src) {
1129   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1130   int encode = vex_prefix_0F38_and_encode(rbx, dst, src);
1131   emit_int8((unsigned char)0xF3);
1132   emit_int8((unsigned char)(0xC0 | encode));
1133 }
1134 
1135 void Assembler::blsil(Register dst, Address src) {
1136   InstructionMark im(this);
1137   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1138   vex_prefix_0F38(rbx, dst, src);
1139   emit_int8((unsigned char)0xF3);
1140   emit_operand(rbx, src);
1141 }
1142 
1143 void Assembler::blsmskl(Register dst, Register src) {
1144   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1145   int encode = vex_prefix_0F38_and_encode(rdx, dst, src);
1146   emit_int8((unsigned char)0xF3);
1147   emit_int8((unsigned char)(0xC0 | encode));
1148 }
1149 
1150 void Assembler::blsmskl(Register dst, Address src) {
1151   InstructionMark im(this);
1152   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1153   vex_prefix_0F38(rdx, dst, src);
1154   emit_int8((unsigned char)0xF3);
1155   emit_operand(rdx, src);
1156 }
1157 
1158 void Assembler::blsrl(Register dst, Register src) {
1159   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1160   int encode = vex_prefix_0F38_and_encode(rcx, dst, src);
1161   emit_int8((unsigned char)0xF3);
1162   emit_int8((unsigned char)(0xC0 | encode));
1163 }
1164 
1165 void Assembler::blsrl(Register dst, Address src) {
1166   InstructionMark im(this);
1167   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
1168   vex_prefix_0F38(rcx, dst, src);
1169   emit_int8((unsigned char)0xF3);
1170   emit_operand(rcx, src);
1171 }
1172 
1173 void Assembler::call(Label& L, relocInfo::relocType rtype) {
1174   // suspect disp32 is always good
1175   int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);
1176 
1177   if (L.is_bound()) {
1178     const int long_size = 5;
1179     int offs = (int)( target(L) - pc() );
1180     assert(offs <= 0, "assembler error");
1181     InstructionMark im(this);
1182     // 1110 1000 #32-bit disp
1183     emit_int8((unsigned char)0xE8);
1184     emit_data(offs - long_size, rtype, operand);
1185   } else {
1186     InstructionMark im(this);
1187     // 1110 1000 #32-bit disp
1188     L.add_patch_at(code(), locator());
1189 
1190     emit_int8((unsigned char)0xE8);
1191     emit_data(int(0), rtype, operand);
1192   }


2921   } else {
2922     encode = prefix_and_encode(encode);
2923     emit_int8((unsigned char)0xF7);
2924     emit_int8((unsigned char)(0xC0 | encode));
2925   }
2926   emit_int32(imm32);
2927 }
2928 
2929 void Assembler::testl(Register dst, Register src) {
2930   (void) prefix_and_encode(dst->encoding(), src->encoding());
2931   emit_arith(0x85, 0xC0, dst, src);
2932 }
2933 
2934 void Assembler::testl(Register dst, Address  src) {
2935   InstructionMark im(this);
2936   prefix(src, dst);
2937   emit_int8((unsigned char)0x85);
2938   emit_operand(dst, src);
2939 }
2940 
2941 void Assembler::tzcntl(Register dst, Register src) {
2942   assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");
2943   emit_int8((unsigned char)0xF3);
2944   int encode = prefix_and_encode(dst->encoding(), src->encoding());
2945   emit_int8(0x0F);
2946   emit_int8((unsigned char)0xBC);
2947   emit_int8((unsigned char)0xC0 | encode);
2948 }
2949 
2950 void Assembler::tzcntq(Register dst, Register src) {
2951   assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");
2952   emit_int8((unsigned char)0xF3);
2953   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
2954   emit_int8(0x0F);
2955   emit_int8((unsigned char)0xBC);
2956   emit_int8((unsigned char)(0xC0 | encode));
2957 }
2958 
2959 void Assembler::ucomisd(XMMRegister dst, Address src) {
2960   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2961   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);
2962 }
2963 
2964 void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
2965   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2966   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);
2967 }
2968 
2969 void Assembler::ucomiss(XMMRegister dst, Address src) {
2970   NOT_LP64(assert(VM_Version::supports_sse(), ""));
2971   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);
2972 }
2973 
2974 void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
2975   NOT_LP64(assert(VM_Version::supports_sse(), ""));
2976   emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);
2977 }
2978 


4898   emit_int32(imm32);
4899 }
4900 
4901 void Assembler::andq(Register dst, int32_t imm32) {
4902   (void) prefixq_and_encode(dst->encoding());
4903   emit_arith(0x81, 0xE0, dst, imm32);
4904 }
4905 
4906 void Assembler::andq(Register dst, Address src) {
4907   InstructionMark im(this);
4908   prefixq(src, dst);
4909   emit_int8(0x23);
4910   emit_operand(dst, src);
4911 }
4912 
4913 void Assembler::andq(Register dst, Register src) {
4914   (void) prefixq_and_encode(dst->encoding(), src->encoding());
4915   emit_arith(0x23, 0xC0, dst, src);
4916 }
4917 
4918 void Assembler::andnq(Register dst, Register src1, Register src2) {
4919   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4920   int encode = vex_prefix_0F38_and_encode_q(dst, src1, src2);
4921   emit_int8((unsigned char)0xF2);
4922   emit_int8((unsigned char)(0xC0 | encode));
4923 }
4924 
4925 void Assembler::andnq(Register dst, Register src1, Address src2) {
4926   InstructionMark im(this);
4927   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4928   vex_prefix_0F38_q(dst, src1, src2);
4929   emit_int8((unsigned char)0xF2);
4930   emit_operand(dst, src2);
4931 }
4932 
4933 void Assembler::bsfq(Register dst, Register src) {
4934   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4935   emit_int8(0x0F);
4936   emit_int8((unsigned char)0xBC);
4937   emit_int8((unsigned char)(0xC0 | encode));
4938 }
4939 
4940 void Assembler::bsrq(Register dst, Register src) {
4941   assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
4942   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4943   emit_int8(0x0F);
4944   emit_int8((unsigned char)0xBD);
4945   emit_int8((unsigned char)(0xC0 | encode));
4946 }
4947 
4948 void Assembler::bswapq(Register reg) {
4949   int encode = prefixq_and_encode(reg->encoding());
4950   emit_int8(0x0F);
4951   emit_int8((unsigned char)(0xC8 | encode));
4952 }
4953 
4954 void Assembler::blsiq(Register dst, Register src) {
4955   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4956   int encode = vex_prefix_0F38_and_encode_q(rbx, dst, src);
4957   emit_int8((unsigned char)0xF3);
4958   emit_int8((unsigned char)(0xC0 | encode));
4959 }
4960 
4961 void Assembler::blsiq(Register dst, Address src) {
4962   InstructionMark im(this);
4963   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4964   vex_prefix_0F38_q(rbx, dst, src);
4965   emit_int8((unsigned char)0xF3);
4966   emit_operand(rbx, src);
4967 }
4968 
4969 void Assembler::blsmskq(Register dst, Register src) {
4970   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4971   int encode = vex_prefix_0F38_and_encode_q(rdx, dst, src);
4972   emit_int8((unsigned char)0xF3);
4973   emit_int8((unsigned char)(0xC0 | encode));
4974 }
4975 
4976 void Assembler::blsmskq(Register dst, Address src) {
4977   InstructionMark im(this);
4978   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4979   vex_prefix_0F38_q(rdx, dst, src);
4980   emit_int8((unsigned char)0xF3);
4981   emit_operand(rdx, src);
4982 }
4983 
4984 void Assembler::blsrq(Register dst, Register src) {
4985   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4986   int encode = vex_prefix_0F38_and_encode_q(rcx, dst, src);
4987   emit_int8((unsigned char)0xF3);
4988   emit_int8((unsigned char)(0xC0 | encode));
4989 }
4990 
4991 void Assembler::blsrq(Register dst, Address src) {
4992   InstructionMark im(this);
4993   assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
4994   vex_prefix_0F38_q(rcx, dst, src);
4995   emit_int8((unsigned char)0xF3);
4996   emit_operand(rcx, src);
4997 }
4998 
4999 void Assembler::cdqq() {
5000   prefix(REX_W);
5001   emit_int8((unsigned char)0x99);
5002 }
5003 
5004 void Assembler::clflush(Address adr) {
5005   prefix(adr);
5006   emit_int8(0x0F);
5007   emit_int8((unsigned char)0xAE);
5008   emit_operand(rdi, adr);
5009 }
5010 
5011 void Assembler::cmovq(Condition cc, Register dst, Register src) {
5012   int encode = prefixq_and_encode(dst->encoding(), src->encoding());
5013   emit_int8(0x0F);
5014   emit_int8(0x40 | cc);
5015   emit_int8((unsigned char)(0xC0 | encode));
5016 }
5017 
5018 void Assembler::cmovq(Condition cc, Register dst, Address src) {


src/cpu/x86/vm/assembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File