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);