src/cpu/x86/vm/x86_32.ad

changeset 506
3d62cb85208d
parent 435
a61af66fc99e
child 548
ba764ed4b6f2
     1.1 --- a/src/cpu/x86/vm/x86_32.ad	Wed Mar 19 15:14:36 2008 -0700
     1.2 +++ b/src/cpu/x86/vm/x86_32.ad	Wed Mar 19 15:33:25 2008 -0700
     1.3 @@ -10970,7 +10970,7 @@
     1.4  %}
     1.5  
     1.6  instruct convI2XD_reg(regXD dst, eRegI src) %{
     1.7 -  predicate( UseSSE>=2 );
     1.8 +  predicate( UseSSE>=2 && !UseXmmI2D );
     1.9    match(Set dst (ConvI2D src));
    1.10    format %{ "CVTSI2SD $dst,$src" %}
    1.11    opcode(0xF2, 0x0F, 0x2A);
    1.12 @@ -10987,6 +10987,20 @@
    1.13    ins_pipe( pipe_slow );
    1.14  %}
    1.15  
    1.16 +instruct convXI2XD_reg(regXD dst, eRegI src)
    1.17 +%{
    1.18 +  predicate( UseSSE>=2 && UseXmmI2D );
    1.19 +  match(Set dst (ConvI2D src));
    1.20 +
    1.21 +  format %{ "MOVD  $dst,$src\n\t"
    1.22 +            "CVTDQ2PD $dst,$dst\t# i2d" %}
    1.23 +  ins_encode %{
    1.24 +    __ movd($dst$$XMMRegister, $src$$Register);
    1.25 +    __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister);
    1.26 +  %}
    1.27 +  ins_pipe(pipe_slow); // XXX
    1.28 +%}
    1.29 +
    1.30  instruct convI2D_mem(regD dst, memory mem) %{
    1.31    predicate( UseSSE<=1 && !Compile::current()->select_24_bit_instr());
    1.32    match(Set dst (ConvI2D (LoadI mem)));
    1.33 @@ -11062,7 +11076,7 @@
    1.34  
    1.35  // Convert an int to a float in xmm; no rounding step needed.
    1.36  instruct convI2X_reg(regX dst, eRegI src) %{
    1.37 -  predicate(UseSSE>=1);
    1.38 +  predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F );
    1.39    match(Set dst (ConvI2F src));
    1.40    format %{ "CVTSI2SS $dst, $src" %}
    1.41  
    1.42 @@ -11071,6 +11085,20 @@
    1.43    ins_pipe( pipe_slow );
    1.44  %}
    1.45  
    1.46 + instruct convXI2X_reg(regX dst, eRegI src)
    1.47 +%{
    1.48 +  predicate( UseSSE>=2 && UseXmmI2F );
    1.49 +  match(Set dst (ConvI2F src));
    1.50 +
    1.51 +  format %{ "MOVD  $dst,$src\n\t"
    1.52 +            "CVTDQ2PS $dst,$dst\t# i2f" %}
    1.53 +  ins_encode %{
    1.54 +    __ movd($dst$$XMMRegister, $src$$Register);
    1.55 +    __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister);
    1.56 +  %}
    1.57 +  ins_pipe(pipe_slow); // XXX
    1.58 +%}
    1.59 +
    1.60  instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{
    1.61    match(Set dst (ConvI2L src));
    1.62    effect(KILL cr);

mercurial