src/cpu/x86/vm/x86_32.ad
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/x86_32.ad

Print this page




5695     Register Rdst = $dst$$Register;
5696     Register Rsrc = $src$$Register;
5697     Label msw_is_zero;
5698     Label not_zero;
5699     __ bsrl(Rdst, HIGH_FROM_LOW(Rsrc));
5700     __ jccb(Assembler::zero, msw_is_zero);
5701     __ addl(Rdst, BitsPerInt);
5702     __ jmpb(not_zero);
5703     __ bind(msw_is_zero);
5704     __ bsrl(Rdst, Rsrc);
5705     __ jccb(Assembler::notZero, not_zero);
5706     __ movl(Rdst, -1);
5707     __ bind(not_zero);
5708     __ negl(Rdst);
5709     __ addl(Rdst, BitsPerLong - 1);
5710   %}
5711   ins_pipe(ialu_reg);
5712 %}
5713 
5714 instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{













5715   match(Set dst (CountTrailingZerosI src));
5716   effect(KILL cr);
5717 
5718   format %{ "BSF    $dst, $src\t# count trailing zeros (int)\n\t"
5719             "JNZ    done\n\t"
5720             "MOV    $dst, 32\n"
5721       "done:" %}
5722   ins_encode %{
5723     Register Rdst = $dst$$Register;
5724     Label done;
5725     __ bsfl(Rdst, $src$$Register);
5726     __ jccb(Assembler::notZero, done);
5727     __ movl(Rdst, BitsPerInt);
5728     __ bind(done);
5729   %}
5730   ins_pipe(ialu_reg);
5731 %}
5732 
5733 instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
























5734   match(Set dst (CountTrailingZerosL src));
5735   effect(TEMP dst, KILL cr);
5736 
5737   format %{ "BSF    $dst, $src.lo\t# count trailing zeros (long)\n\t"
5738             "JNZ    done\n\t"
5739             "BSF    $dst, $src.hi\n\t"
5740             "JNZ    msw_not_zero\n\t"
5741             "MOV    $dst, 32\n"
5742       "msw_not_zero:\n\t"
5743             "ADD    $dst, 32\n"
5744       "done:" %}
5745   ins_encode %{
5746     Register Rdst = $dst$$Register;
5747     Register Rsrc = $src$$Register;
5748     Label msw_not_zero;
5749     Label done;
5750     __ bsfl(Rdst, Rsrc);
5751     __ jccb(Assembler::notZero, done);
5752     __ bsfl(Rdst, HIGH_FROM_LOW(Rsrc));
5753     __ jccb(Assembler::notZero, msw_not_zero);


8685   ins_cost(150);
8686   format %{ "AND    $dst,$src" %}
8687   opcode(0x21);  /* Opcode 21 /r */
8688   ins_encode( OpcP, RegMem( src, dst ) );
8689   ins_pipe( ialu_mem_reg );
8690 %}
8691 
8692 // And Memory with Immediate
8693 instruct andI_mem_imm(memory dst, immI src, eFlagsReg cr) %{
8694   match(Set dst (StoreI dst (AndI (LoadI dst) src)));
8695   effect(KILL cr);
8696 
8697   ins_cost(125);
8698   format %{ "AND    $dst,$src" %}
8699   opcode(0x81, 0x4);  /* Opcode 81 /4 id */
8700   // ins_encode( MemImm( dst, src) );
8701   ins_encode( OpcSE( src ), RMopc_Mem(secondary, dst ), Con8or32( src ) );
8702   ins_pipe( ialu_mem_imm );
8703 %}
8704 





















































































































8705 // Or Instructions
8706 // Or Register with Register
8707 instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
8708   match(Set dst (OrI dst src));
8709   effect(KILL cr);
8710 
8711   size(2);
8712   format %{ "OR     $dst,$src" %}
8713   opcode(0x0B);
8714   ins_encode( OpcP, RegReg( dst, src) );
8715   ins_pipe( ialu_reg_reg );
8716 %}
8717 
8718 instruct orI_eReg_castP2X(rRegI dst, eRegP src, eFlagsReg cr) %{
8719   match(Set dst (OrI dst (CastP2X src)));
8720   effect(KILL cr);
8721 
8722   size(2);
8723   format %{ "OR     $dst,$src" %}
8724   opcode(0x0B);


9222   effect(KILL cr);
9223   format %{ "AND    $dst.lo,$src.lo\n\t"
9224             "AND    $dst.hi,$src.hi" %}
9225   opcode(0x81,0x04,0x04);  /* Opcode 81 /4, 81 /4 */
9226   ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
9227   ins_pipe( ialu_reg_long );
9228 %}
9229 
9230 // And Long Register with Memory
9231 instruct andL_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
9232   match(Set dst (AndL dst (LoadL mem)));
9233   effect(KILL cr);
9234   ins_cost(125);
9235   format %{ "AND    $dst.lo,$mem\n\t"
9236             "AND    $dst.hi,$mem+4" %}
9237   opcode(0x23, 0x23);
9238   ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
9239   ins_pipe( ialu_reg_long_mem );
9240 %}
9241 












































































































































































































9242 // Or Long Register with Register
9243 instruct orl_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
9244   match(Set dst (OrL dst src));
9245   effect(KILL cr);
9246   format %{ "OR     $dst.lo,$src.lo\n\t"
9247             "OR     $dst.hi,$src.hi" %}
9248   opcode(0x0B,0x0B);
9249   ins_encode( RegReg_Lo( dst, src), RegReg_Hi( dst, src) );
9250   ins_pipe( ialu_reg_reg_long );
9251 %}
9252 
9253 // Or Long Register with Immediate
9254 instruct orl_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
9255   match(Set dst (OrL dst src));
9256   effect(KILL cr);
9257   format %{ "OR     $dst.lo,$src.lo\n\t"
9258             "OR     $dst.hi,$src.hi" %}
9259   opcode(0x81,0x01,0x01);  /* Opcode 81 /1, 81 /1 */
9260   ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
9261   ins_pipe( ialu_reg_long );




5695     Register Rdst = $dst$$Register;
5696     Register Rsrc = $src$$Register;
5697     Label msw_is_zero;
5698     Label not_zero;
5699     __ bsrl(Rdst, HIGH_FROM_LOW(Rsrc));
5700     __ jccb(Assembler::zero, msw_is_zero);
5701     __ addl(Rdst, BitsPerInt);
5702     __ jmpb(not_zero);
5703     __ bind(msw_is_zero);
5704     __ bsrl(Rdst, Rsrc);
5705     __ jccb(Assembler::notZero, not_zero);
5706     __ movl(Rdst, -1);
5707     __ bind(not_zero);
5708     __ negl(Rdst);
5709     __ addl(Rdst, BitsPerLong - 1);
5710   %}
5711   ins_pipe(ialu_reg);
5712 %}
5713 
5714 instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
5715   predicate(UseCountTrailingZerosInstruction);
5716   match(Set dst (CountTrailingZerosI src));
5717   effect(KILL cr);
5718 
5719   format %{ "TZCNT    $dst, $src\t# count trailing zeros (int)" %}
5720   ins_encode %{
5721     __ tzcntl($dst$$Register, $src$$Register);
5722   %}
5723   ins_pipe(ialu_reg);
5724 %}
5725 
5726 instruct countTrailingZerosI_bsf(rRegI dst, rRegI src, eFlagsReg cr) %{
5727   predicate(!UseCountTrailingZerosInstruction);
5728   match(Set dst (CountTrailingZerosI src));
5729   effect(KILL cr);
5730 
5731   format %{ "BSF    $dst, $src\t# count trailing zeros (int)\n\t"
5732             "JNZ    done\n\t"
5733             "MOV    $dst, 32\n"
5734       "done:" %}
5735   ins_encode %{
5736     Register Rdst = $dst$$Register;
5737     Label done;
5738     __ bsfl(Rdst, $src$$Register);
5739     __ jccb(Assembler::notZero, done);
5740     __ movl(Rdst, BitsPerInt);
5741     __ bind(done);
5742   %}
5743   ins_pipe(ialu_reg);
5744 %}
5745 
5746 instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
5747   predicate(UseCountTrailingZerosInstruction);
5748   match(Set dst (CountTrailingZerosL src));
5749   effect(TEMP dst, KILL cr);
5750 
5751   format %{ "TZCNT  $dst, $src.lo\t# count trailing zeros (long) \n\t"
5752             "JNC    done\n\t"
5753             "TZCNT  $dst, $src.hi\n\t"
5754             "ADD    $dst, 32\n"
5755             "done:" %}
5756   ins_encode %{
5757     Register Rdst = $dst$$Register;
5758     Register Rsrc = $src$$Register;
5759     Label done;
5760     __ tzcntl(Rdst, Rsrc);
5761     __ jccb(Assembler::carryClear, done);
5762     __ tzcntl(Rdst, HIGH_FROM_LOW(Rsrc));
5763     __ addl(Rdst, BitsPerInt);
5764     __ bind(done);
5765   %}
5766   ins_pipe(ialu_reg);
5767 %}
5768 
5769 instruct countTrailingZerosL_bsf(rRegI dst, eRegL src, eFlagsReg cr) %{
5770   predicate(!UseCountTrailingZerosInstruction);
5771   match(Set dst (CountTrailingZerosL src));
5772   effect(TEMP dst, KILL cr);
5773 
5774   format %{ "BSF    $dst, $src.lo\t# count trailing zeros (long)\n\t"
5775             "JNZ    done\n\t"
5776             "BSF    $dst, $src.hi\n\t"
5777             "JNZ    msw_not_zero\n\t"
5778             "MOV    $dst, 32\n"
5779       "msw_not_zero:\n\t"
5780             "ADD    $dst, 32\n"
5781       "done:" %}
5782   ins_encode %{
5783     Register Rdst = $dst$$Register;
5784     Register Rsrc = $src$$Register;
5785     Label msw_not_zero;
5786     Label done;
5787     __ bsfl(Rdst, Rsrc);
5788     __ jccb(Assembler::notZero, done);
5789     __ bsfl(Rdst, HIGH_FROM_LOW(Rsrc));
5790     __ jccb(Assembler::notZero, msw_not_zero);


8722   ins_cost(150);
8723   format %{ "AND    $dst,$src" %}
8724   opcode(0x21);  /* Opcode 21 /r */
8725   ins_encode( OpcP, RegMem( src, dst ) );
8726   ins_pipe( ialu_mem_reg );
8727 %}
8728 
8729 // And Memory with Immediate
8730 instruct andI_mem_imm(memory dst, immI src, eFlagsReg cr) %{
8731   match(Set dst (StoreI dst (AndI (LoadI dst) src)));
8732   effect(KILL cr);
8733 
8734   ins_cost(125);
8735   format %{ "AND    $dst,$src" %}
8736   opcode(0x81, 0x4);  /* Opcode 81 /4 id */
8737   // ins_encode( MemImm( dst, src) );
8738   ins_encode( OpcSE( src ), RMopc_Mem(secondary, dst ), Con8or32( src ) );
8739   ins_pipe( ialu_mem_imm );
8740 %}
8741 
8742 // BMI1 instructions
8743 instruct andnI_rReg_rReg_rReg(rRegI dst, rRegI src1, rRegI src2, immI_M1 minus_1, eFlagsReg cr) %{
8744   match(Set dst (AndI (XorI src1 minus_1) src2));
8745   predicate(UseBMI1Instructions);
8746   effect(KILL cr);
8747 
8748   format %{ "ANDNL  $dst, $src1, $src2" %}
8749 
8750   ins_encode %{
8751     __ andnl($dst$$Register, $src1$$Register, $src2$$Register);
8752   %}
8753   ins_pipe(ialu_reg);
8754 %}
8755 
8756 instruct andnI_rReg_rReg_mem(rRegI dst, rRegI src1, memory src2, immI_M1 minus_1, eFlagsReg cr) %{
8757   match(Set dst (AndI (XorI src1 minus_1) (LoadI src2) ));
8758   predicate(UseBMI1Instructions);
8759   effect(KILL cr);
8760 
8761   ins_cost(125);
8762   format %{ "ANDNL  $dst, $src1, $src2" %}
8763 
8764   ins_encode %{
8765     __ andnl($dst$$Register, $src1$$Register, $src2$$Address);
8766   %}
8767   ins_pipe(ialu_reg_mem);
8768 %}
8769 
8770 instruct blsiI_rReg_rReg(rRegI dst, rRegI src, immI0 imm_zero, eFlagsReg cr) %{
8771   match(Set dst (AndI (SubI imm_zero src) src));
8772   predicate(UseBMI1Instructions);
8773   effect(KILL cr);
8774 
8775   format %{ "BLSIL  $dst, $src" %}
8776 
8777   ins_encode %{
8778     __ blsil($dst$$Register, $src$$Register);
8779   %}
8780   ins_pipe(ialu_reg);
8781 %}
8782 
8783 instruct blsiI_rReg_mem(rRegI dst, memory src, immI0 imm_zero, eFlagsReg cr) %{
8784   match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) ));
8785   predicate(UseBMI1Instructions);
8786   effect(KILL cr);
8787 
8788   ins_cost(125);
8789   format %{ "BLSIL  $dst, $src" %}
8790 
8791   ins_encode %{
8792     __ blsil($dst$$Register, $src$$Address);
8793   %}
8794   ins_pipe(ialu_reg_mem);
8795 %}
8796 
8797 instruct blsmskI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, eFlagsReg cr)
8798 %{
8799   match(Set dst (XorI (AddI src minus_1) src));
8800   predicate(UseBMI1Instructions);
8801   effect(KILL cr);
8802 
8803   format %{ "BLSMSKL $dst, $src" %}
8804 
8805   ins_encode %{
8806     __ blsmskl($dst$$Register, $src$$Register);
8807   %}
8808 
8809   ins_pipe(ialu_reg);
8810 %}
8811 
8812 instruct blsmskI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, eFlagsReg cr)
8813 %{
8814   match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) ));
8815   predicate(UseBMI1Instructions);
8816   effect(KILL cr);
8817 
8818   ins_cost(125);
8819   format %{ "BLSMSKL $dst, $src" %}
8820 
8821   ins_encode %{
8822     __ blsmskl($dst$$Register, $src$$Address);
8823   %}
8824 
8825   ins_pipe(ialu_reg_mem);
8826 %}
8827 
8828 instruct blsrI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, eFlagsReg cr)
8829 %{
8830   match(Set dst (AndI (AddI src minus_1) src) );
8831   predicate(UseBMI1Instructions);
8832   effect(KILL cr);
8833 
8834   format %{ "BLSRL  $dst, $src" %}
8835 
8836   ins_encode %{
8837     __ blsrl($dst$$Register, $src$$Register);
8838   %}
8839 
8840   ins_pipe(ialu_reg);
8841 %}
8842 
8843 instruct blsrI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, eFlagsReg cr)
8844 %{
8845   match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) ));
8846   predicate(UseBMI1Instructions);
8847   effect(KILL cr);
8848 
8849   ins_cost(125);
8850   format %{ "BLSRL  $dst, $src" %}
8851 
8852   ins_encode %{
8853     __ blsrl($dst$$Register, $src$$Address);
8854   %}
8855 
8856   ins_pipe(ialu_reg_mem);
8857 %}
8858 
8859 // Or Instructions
8860 // Or Register with Register
8861 instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
8862   match(Set dst (OrI dst src));
8863   effect(KILL cr);
8864 
8865   size(2);
8866   format %{ "OR     $dst,$src" %}
8867   opcode(0x0B);
8868   ins_encode( OpcP, RegReg( dst, src) );
8869   ins_pipe( ialu_reg_reg );
8870 %}
8871 
8872 instruct orI_eReg_castP2X(rRegI dst, eRegP src, eFlagsReg cr) %{
8873   match(Set dst (OrI dst (CastP2X src)));
8874   effect(KILL cr);
8875 
8876   size(2);
8877   format %{ "OR     $dst,$src" %}
8878   opcode(0x0B);


9376   effect(KILL cr);
9377   format %{ "AND    $dst.lo,$src.lo\n\t"
9378             "AND    $dst.hi,$src.hi" %}
9379   opcode(0x81,0x04,0x04);  /* Opcode 81 /4, 81 /4 */
9380   ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
9381   ins_pipe( ialu_reg_long );
9382 %}
9383 
9384 // And Long Register with Memory
9385 instruct andL_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
9386   match(Set dst (AndL dst (LoadL mem)));
9387   effect(KILL cr);
9388   ins_cost(125);
9389   format %{ "AND    $dst.lo,$mem\n\t"
9390             "AND    $dst.hi,$mem+4" %}
9391   opcode(0x23, 0x23);
9392   ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
9393   ins_pipe( ialu_reg_long_mem );
9394 %}
9395 
9396 // BMI1 instructions
9397 instruct andnL_eReg_eReg_eReg(eRegL dst, eRegL src1, eRegL src2, immL_M1 minus_1, eFlagsReg cr) %{
9398   match(Set dst (AndL (XorL src1 minus_1) src2));
9399   predicate(UseBMI1Instructions);
9400   effect(KILL cr, TEMP dst);
9401 
9402   format %{ "ANDNL  $dst.lo, $src1.lo, $src2.lo\n\t"
9403             "ANDNL  $dst.hi, $src1.hi, $src2.hi"
9404          %}
9405 
9406   ins_encode %{
9407     Register Rdst = $dst$$Register;
9408     Register Rsrc1 = $src1$$Register;
9409     Register Rsrc2 = $src2$$Register;
9410     __ andnl(Rdst, Rsrc1, Rsrc2);
9411     __ andnl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc1), HIGH_FROM_LOW(Rsrc2));
9412   %}
9413   ins_pipe(ialu_reg_reg_long);
9414 %}
9415 
9416 instruct andnL_eReg_eReg_mem(eRegL dst, eRegL src1, memory src2, immL_M1 minus_1, eFlagsReg cr) %{
9417   match(Set dst (AndL (XorL src1 minus_1) (LoadL src2) ));
9418   predicate(UseBMI1Instructions);
9419   effect(KILL cr, TEMP dst);
9420 
9421   ins_cost(125);
9422   format %{ "ANDNL  $dst.lo, $src1.lo, $src2\n\t"
9423             "ANDNL  $dst.hi, $src1.hi, $src2+4"
9424          %}
9425 
9426   ins_encode %{
9427     Register Rdst = $dst$$Register;
9428     Register Rsrc1 = $src1$$Register;
9429     Address src2_hi = Address::make_raw($src2$$base, $src2$$index, $src2$$scale, $src2$$disp + 4, relocInfo::none);
9430 
9431     __ andnl(Rdst, Rsrc1, $src2$$Address);
9432     __ andnl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc1), src2_hi);
9433   %}
9434   ins_pipe(ialu_reg_mem);
9435 %}
9436 
9437 instruct blsiL_eReg_eReg(eRegL dst, eRegL src, immL0 imm_zero, eFlagsReg cr) %{
9438   match(Set dst (AndL (SubL imm_zero src) src));
9439   predicate(UseBMI1Instructions);
9440   effect(KILL cr, TEMP dst);
9441 
9442   format %{ "MOVL   $dst.hi, 0\n\t"
9443             "BLSIL  $dst.lo, $src.lo\n\t"
9444             "JNZ    done\n\t"
9445             "BLSIL  $dst.hi, $src.hi\n"
9446             "done:"
9447          %}
9448 
9449   ins_encode %{
9450     Label done;
9451     Register Rdst = $dst$$Register;
9452     Register Rsrc = $src$$Register;
9453     __ movl(HIGH_FROM_LOW(Rdst), 0);
9454     __ blsil(Rdst, Rsrc);
9455     __ jccb(Assembler::notZero, done);
9456     __ blsil(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc));
9457     __ bind(done);
9458   %}
9459   ins_pipe(ialu_reg);
9460 %}
9461 
9462 instruct blsiL_eReg_mem(eRegL dst, memory src, immL0 imm_zero, eFlagsReg cr) %{
9463   match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) ));
9464   predicate(UseBMI1Instructions);
9465   effect(KILL cr, TEMP dst);
9466 
9467   ins_cost(125);
9468   format %{ "MOVL   $dst.hi, 0\n\t"
9469             "BLSIL  $dst.lo, $src\n\t"
9470             "JNZ    done\n\t"
9471             "BLSIL  $dst.hi, $src+4\n"
9472             "done:"
9473          %}
9474 
9475   ins_encode %{
9476     Label done;
9477     Register Rdst = $dst$$Register;
9478     Address src_hi = Address::make_raw($src$$base, $src$$index, $src$$scale, $src$$disp + 4, relocInfo::none);
9479 
9480     __ movl(HIGH_FROM_LOW(Rdst), 0);
9481     __ blsil(Rdst, $src$$Address);
9482     __ jccb(Assembler::notZero, done);
9483     __ blsil(HIGH_FROM_LOW(Rdst), src_hi);
9484     __ bind(done);
9485   %}
9486   ins_pipe(ialu_reg_mem);
9487 %}
9488 
9489 instruct blsmskL_eReg_eReg(eRegL dst, eRegL src, immL_M1 minus_1, eFlagsReg cr)
9490 %{
9491   match(Set dst (XorL (AddL src minus_1) src));
9492   predicate(UseBMI1Instructions);
9493   effect(KILL cr, TEMP dst);
9494 
9495   format %{ "MOVL    $dst.hi, 0\n\t"
9496             "BLSMSKL $dst.lo, $src.lo\n\t"
9497             "JNC     done\n\t"
9498             "BLSMSKL $dst.hi, $src.hi\n"
9499             "done:"
9500          %}
9501 
9502   ins_encode %{
9503     Label done;
9504     Register Rdst = $dst$$Register;
9505     Register Rsrc = $src$$Register;
9506     __ movl(HIGH_FROM_LOW(Rdst), 0);
9507     __ blsmskl(Rdst, Rsrc);
9508     __ jccb(Assembler::carryClear, done);
9509     __ blsmskl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc));
9510     __ bind(done);
9511   %}
9512 
9513   ins_pipe(ialu_reg);
9514 %}
9515 
9516 instruct blsmskL_eReg_mem(eRegL dst, memory src, immL_M1 minus_1, eFlagsReg cr)
9517 %{
9518   match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) ));
9519   predicate(UseBMI1Instructions);
9520   effect(KILL cr, TEMP dst);
9521 
9522   ins_cost(125);
9523   format %{ "MOVL    $dst.hi, 0\n\t"
9524             "BLSMSKL $dst.lo, $src\n\t"
9525             "JNC     done\n\t"
9526             "BLSMSKL $dst.hi, $src+4\n"
9527             "done:"
9528          %}
9529 
9530   ins_encode %{
9531     Label done;
9532     Register Rdst = $dst$$Register;
9533     Address src_hi = Address::make_raw($src$$base, $src$$index, $src$$scale, $src$$disp + 4, relocInfo::none);
9534 
9535     __ movl(HIGH_FROM_LOW(Rdst), 0);
9536     __ blsmskl(Rdst, $src$$Address);
9537     __ jccb(Assembler::carryClear, done);
9538     __ blsmskl(HIGH_FROM_LOW(Rdst), src_hi);
9539     __ bind(done);
9540   %}
9541 
9542   ins_pipe(ialu_reg_mem);
9543 %}
9544 
9545 instruct blsrL_eReg_eReg(eRegL dst, eRegL src, immL_M1 minus_1, eFlagsReg cr)
9546 %{
9547   match(Set dst (AndL (AddL src minus_1) src) );
9548   predicate(UseBMI1Instructions);
9549   effect(KILL cr, TEMP dst);
9550 
9551   format %{ "MOVL   $dst.hi, $src.hi\n\t"
9552             "BLSRL  $dst.lo, $src.lo\n\t"
9553             "JNC    done\n\t"
9554             "BLSRL  $dst.hi, $src.hi\n"
9555             "done:"
9556   %}
9557 
9558   ins_encode %{
9559     Label done;
9560     Register Rdst = $dst$$Register;
9561     Register Rsrc = $src$$Register;
9562     __ movl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc));
9563     __ blsrl(Rdst, Rsrc);
9564     __ jccb(Assembler::carryClear, done);
9565     __ blsrl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc));
9566     __ bind(done);
9567   %}
9568 
9569   ins_pipe(ialu_reg);
9570 %}
9571 
9572 instruct blsrL_eReg_mem(eRegL dst, memory src, immL_M1 minus_1, eFlagsReg cr)
9573 %{
9574   match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src) ));
9575   predicate(UseBMI1Instructions);
9576   effect(KILL cr, TEMP dst);
9577 
9578   ins_cost(125);
9579   format %{ "MOVL   $dst.hi, $src+4\n\t"
9580             "BLSRL  $dst.lo, $src\n\t"
9581             "JNC    done\n\t"
9582             "BLSRL  $dst.hi, $src+4\n"
9583             "done:"
9584   %}
9585 
9586   ins_encode %{
9587     Label done;
9588     Register Rdst = $dst$$Register;
9589     Address src_hi = Address::make_raw($src$$base, $src$$index, $src$$scale, $src$$disp + 4, relocInfo::none);
9590     __ movl(HIGH_FROM_LOW(Rdst), src_hi);
9591     __ blsrl(Rdst, $src$$Address);
9592     __ jccb(Assembler::carryClear, done);
9593     __ blsrl(HIGH_FROM_LOW(Rdst), src_hi);
9594     __ bind(done);
9595   %}
9596 
9597   ins_pipe(ialu_reg_mem);
9598 %}
9599 
9600 // Or Long Register with Register
9601 instruct orl_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
9602   match(Set dst (OrL dst src));
9603   effect(KILL cr);
9604   format %{ "OR     $dst.lo,$src.lo\n\t"
9605             "OR     $dst.hi,$src.hi" %}
9606   opcode(0x0B,0x0B);
9607   ins_encode( RegReg_Lo( dst, src), RegReg_Hi( dst, src) );
9608   ins_pipe( ialu_reg_reg_long );
9609 %}
9610 
9611 // Or Long Register with Immediate
9612 instruct orl_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
9613   match(Set dst (OrL dst src));
9614   effect(KILL cr);
9615   format %{ "OR     $dst.lo,$src.lo\n\t"
9616             "OR     $dst.hi,$src.hi" %}
9617   opcode(0x81,0x01,0x01);  /* Opcode 81 /1, 81 /1 */
9618   ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
9619   ins_pipe( ialu_reg_long );


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