RFR(L): 8031321 Support Intel bit manipulation instructions

Florian Weimer fweimer at redhat.com
Mon Feb 17 01:26:46 PST 2014


On 02/14/2014 09:27 PM, Igor Veresov wrote:
> But you have to return 64 in case when all bits are 0:
>
> instruct countTrailingZerosL_bsf(rRegI dst, rRegL src, rFlagsReg cr) %{
>    predicate(!UseCountTrailingZerosInstruction);
>    match(Set dst (CountTrailingZerosL src));
>    effect(KILL cr);
>
>    format %{ "bsfq    $dst, $src\t# count trailing zeros (long)\n\t"
>              "jnz     done\n\t"
>              "movl    $dst, 64\n"
>        "done:" %}
>    ins_encode %{
>      Register Rdst = $dst$$Register;
>      Label done;
>      __ bsfq(Rdst, $src$$Register);
>      __ jccb(Assembler::notZero, done);
>      __ movl(Rdst, BitsPerLong);
>      __ bind(done);
>    %}
>    ins_pipe(ialu_reg);
> %}

I meant something like this:

instruct countTrailingZerosL_bsf(rRegI dst, rRegL src, rFlagsReg cr) %{
   predicate(!UseCountTrailingZerosInstruction);
   match(Set dst (CountTrailingZerosL src));
   effect(KILL cr);

   format %{ "movl    $dst, 64\n"
             "bsfq    $dst, $src\t# count trailing zeros (long)\n\t" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     __ movl(Rdst, BitsPerLong);
     __ bsfq(Rdst, $src$$Register);
   %}
   ins_pipe(ialu_reg);
%}

And you also need some constraint that src and dst isn't the same.  (Not 
sure how to express that.)

This is based on the following statement in "AMD64 Architecture
Programmer's Manual, Volume 3: General-Purpose and System Instructions", 
as part of the BSF instruction description:

"If the second operand contains 0, the instruction sets ZF to 1 and does 
not change the contents of the destination register."

-- 
Florian Weimer / Red Hat Product Security Team


More information about the hotspot-compiler-dev mailing list