< prev index next >

src/hotspot/cpu/x86/x86_64.ad

Print this page
rev 58322 : 8240615: is_power_of_2() has Undefined Behaviour and is inconsistent
Reviewed-by: duke


3103   match(ConL);
3104 
3105   op_cost(10);
3106   format %{ %}
3107   interface(CONST_INTER);
3108 %}
3109 
3110 // Long Immediate 32-bit signed
3111 operand immL32()
3112 %{
3113   predicate(n->get_long() == (int) (n->get_long()));
3114   match(ConL);
3115 
3116   op_cost(15);
3117   format %{ %}
3118   interface(CONST_INTER);
3119 %}
3120 
3121 operand immL_Pow2()
3122 %{
3123   predicate(is_power_of_2(n->get_long()));
3124   match(ConL);
3125 
3126   op_cost(15);
3127   format %{ %}
3128   interface(CONST_INTER);
3129 %}
3130 
3131 operand immL_NotPow2()
3132 %{
3133   predicate(is_power_of_2(~n->get_long()));
3134   match(ConL);
3135 
3136   op_cost(15);
3137   format %{ %}
3138   interface(CONST_INTER);
3139 %}
3140 
3141 // Long Immediate zero
3142 operand immL0()
3143 %{
3144   predicate(n->get_long() == 0L);
3145   match(ConL);
3146 
3147   op_cost(10);
3148   format %{ %}
3149   interface(CONST_INTER);
3150 %}
3151 
3152 // Constant for increment
3153 operand immL1()


10012   ins_cost(125);
10013   format %{ "orq     $dst, $src\t# long" %}
10014   opcode(0x81, 0x1); /* Opcode 81 /1 id */
10015   ins_encode(REX_mem_wide(dst), OpcSE(src),
10016              RM_opc_mem(secondary, dst), Con8or32(src));
10017   ins_pipe(ialu_mem_imm);
10018 %}
10019 
10020 instruct btsL_mem_imm(memory dst, immL_Pow2 con, rFlagsReg cr)
10021 %{
10022   // con should be a pure 64-bit power of 2 immediate
10023   // because AND/OR works well enough for 8/32-bit values.
10024   predicate(log2_long(n->in(3)->in(2)->get_long()) > 31);
10025 
10026   match(Set dst (StoreL dst (OrL (LoadL dst) con)));
10027   effect(KILL cr);
10028 
10029   ins_cost(125);
10030   format %{ "btsq    $dst, log2($con)\t# long" %}
10031   ins_encode %{
10032     __ btsq($dst$$Address, log2_long($con$$constant));
10033   %}
10034   ins_pipe(ialu_mem_imm);
10035 %}
10036 
10037 // Xor Instructions
10038 // Xor Register with Register
10039 instruct xorL_rReg(rRegL dst, rRegL src, rFlagsReg cr)
10040 %{
10041   match(Set dst (XorL dst src));
10042   effect(KILL cr);
10043 
10044   format %{ "xorq    $dst, $src\t# long" %}
10045   opcode(0x33);
10046   ins_encode(REX_reg_reg_wide(dst, src), OpcP, reg_reg(dst, src));
10047   ins_pipe(ialu_reg_reg);
10048 %}
10049 
10050 // Xor Register with Immediate -1
10051 instruct xorL_rReg_im1(rRegL dst, immL_M1 imm) %{
10052   match(Set dst (XorL dst imm));




3103   match(ConL);
3104 
3105   op_cost(10);
3106   format %{ %}
3107   interface(CONST_INTER);
3108 %}
3109 
3110 // Long Immediate 32-bit signed
3111 operand immL32()
3112 %{
3113   predicate(n->get_long() == (int) (n->get_long()));
3114   match(ConL);
3115 
3116   op_cost(15);
3117   format %{ %}
3118   interface(CONST_INTER);
3119 %}
3120 
3121 operand immL_Pow2()
3122 %{
3123   predicate(is_power_of_2((julong)n->get_long()));
3124   match(ConL);
3125 
3126   op_cost(15);
3127   format %{ %}
3128   interface(CONST_INTER);
3129 %}
3130 
3131 operand immL_NotPow2()
3132 %{
3133   predicate(is_power_of_2((julong)~n->get_long()));
3134   match(ConL);
3135 
3136   op_cost(15);
3137   format %{ %}
3138   interface(CONST_INTER);
3139 %}
3140 
3141 // Long Immediate zero
3142 operand immL0()
3143 %{
3144   predicate(n->get_long() == 0L);
3145   match(ConL);
3146 
3147   op_cost(10);
3148   format %{ %}
3149   interface(CONST_INTER);
3150 %}
3151 
3152 // Constant for increment
3153 operand immL1()


10012   ins_cost(125);
10013   format %{ "orq     $dst, $src\t# long" %}
10014   opcode(0x81, 0x1); /* Opcode 81 /1 id */
10015   ins_encode(REX_mem_wide(dst), OpcSE(src),
10016              RM_opc_mem(secondary, dst), Con8or32(src));
10017   ins_pipe(ialu_mem_imm);
10018 %}
10019 
10020 instruct btsL_mem_imm(memory dst, immL_Pow2 con, rFlagsReg cr)
10021 %{
10022   // con should be a pure 64-bit power of 2 immediate
10023   // because AND/OR works well enough for 8/32-bit values.
10024   predicate(log2_long(n->in(3)->in(2)->get_long()) > 31);
10025 
10026   match(Set dst (StoreL dst (OrL (LoadL dst) con)));
10027   effect(KILL cr);
10028 
10029   ins_cost(125);
10030   format %{ "btsq    $dst, log2($con)\t# long" %}
10031   ins_encode %{
10032     __ btsq($dst$$Address, log2_long((julong)$con$$constant));
10033   %}
10034   ins_pipe(ialu_mem_imm);
10035 %}
10036 
10037 // Xor Instructions
10038 // Xor Register with Register
10039 instruct xorL_rReg(rRegL dst, rRegL src, rFlagsReg cr)
10040 %{
10041   match(Set dst (XorL dst src));
10042   effect(KILL cr);
10043 
10044   format %{ "xorq    $dst, $src\t# long" %}
10045   opcode(0x33);
10046   ins_encode(REX_reg_reg_wide(dst, src), OpcP, reg_reg(dst, src));
10047   ins_pipe(ialu_reg_reg);
10048 %}
10049 
10050 // Xor Register with Immediate -1
10051 instruct xorL_rReg_im1(rRegL dst, immL_M1 imm) %{
10052   match(Set dst (XorL dst imm));


< prev index next >