Mercurial > hg > truffle
comparison src/cpu/x86/vm/x86_32.ad @ 71:3d62cb85208d
6662967: Optimize I2D conversion on new x86
Summary: Use CVTDQ2PS and CVTDQ2PD for integer values conversions to float and double values on new AMD cpu.
Reviewed-by: sgoldman, never
author | kvn |
---|---|
date | Wed, 19 Mar 2008 15:33:25 -0700 |
parents | a61af66fc99e |
children | ba764ed4b6f2 |
comparison
equal
deleted
inserted
replaced
70:b683f557224b | 71:3d62cb85208d |
---|---|
10968 ins_encode(Push_Mem_I(src), Pop_Reg_D(dst)); | 10968 ins_encode(Push_Mem_I(src), Pop_Reg_D(dst)); |
10969 ins_pipe( fpu_reg_mem ); | 10969 ins_pipe( fpu_reg_mem ); |
10970 %} | 10970 %} |
10971 | 10971 |
10972 instruct convI2XD_reg(regXD dst, eRegI src) %{ | 10972 instruct convI2XD_reg(regXD dst, eRegI src) %{ |
10973 predicate( UseSSE>=2 ); | 10973 predicate( UseSSE>=2 && !UseXmmI2D ); |
10974 match(Set dst (ConvI2D src)); | 10974 match(Set dst (ConvI2D src)); |
10975 format %{ "CVTSI2SD $dst,$src" %} | 10975 format %{ "CVTSI2SD $dst,$src" %} |
10976 opcode(0xF2, 0x0F, 0x2A); | 10976 opcode(0xF2, 0x0F, 0x2A); |
10977 ins_encode( OpcP, OpcS, Opcode(tertiary), RegReg(dst, src)); | 10977 ins_encode( OpcP, OpcS, Opcode(tertiary), RegReg(dst, src)); |
10978 ins_pipe( pipe_slow ); | 10978 ins_pipe( pipe_slow ); |
10983 match(Set dst (ConvI2D (LoadI mem))); | 10983 match(Set dst (ConvI2D (LoadI mem))); |
10984 format %{ "CVTSI2SD $dst,$mem" %} | 10984 format %{ "CVTSI2SD $dst,$mem" %} |
10985 opcode(0xF2, 0x0F, 0x2A); | 10985 opcode(0xF2, 0x0F, 0x2A); |
10986 ins_encode( OpcP, OpcS, Opcode(tertiary), RegMem(dst, mem)); | 10986 ins_encode( OpcP, OpcS, Opcode(tertiary), RegMem(dst, mem)); |
10987 ins_pipe( pipe_slow ); | 10987 ins_pipe( pipe_slow ); |
10988 %} | |
10989 | |
10990 instruct convXI2XD_reg(regXD dst, eRegI src) | |
10991 %{ | |
10992 predicate( UseSSE>=2 && UseXmmI2D ); | |
10993 match(Set dst (ConvI2D src)); | |
10994 | |
10995 format %{ "MOVD $dst,$src\n\t" | |
10996 "CVTDQ2PD $dst,$dst\t# i2d" %} | |
10997 ins_encode %{ | |
10998 __ movd($dst$$XMMRegister, $src$$Register); | |
10999 __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister); | |
11000 %} | |
11001 ins_pipe(pipe_slow); // XXX | |
10988 %} | 11002 %} |
10989 | 11003 |
10990 instruct convI2D_mem(regD dst, memory mem) %{ | 11004 instruct convI2D_mem(regD dst, memory mem) %{ |
10991 predicate( UseSSE<=1 && !Compile::current()->select_24_bit_instr()); | 11005 predicate( UseSSE<=1 && !Compile::current()->select_24_bit_instr()); |
10992 match(Set dst (ConvI2D (LoadI mem))); | 11006 match(Set dst (ConvI2D (LoadI mem))); |
11060 ins_pipe( fpu_reg_mem ); | 11074 ins_pipe( fpu_reg_mem ); |
11061 %} | 11075 %} |
11062 | 11076 |
11063 // Convert an int to a float in xmm; no rounding step needed. | 11077 // Convert an int to a float in xmm; no rounding step needed. |
11064 instruct convI2X_reg(regX dst, eRegI src) %{ | 11078 instruct convI2X_reg(regX dst, eRegI src) %{ |
11065 predicate(UseSSE>=1); | 11079 predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F ); |
11066 match(Set dst (ConvI2F src)); | 11080 match(Set dst (ConvI2F src)); |
11067 format %{ "CVTSI2SS $dst, $src" %} | 11081 format %{ "CVTSI2SS $dst, $src" %} |
11068 | 11082 |
11069 opcode(0xF3, 0x0F, 0x2A); /* F3 0F 2A /r */ | 11083 opcode(0xF3, 0x0F, 0x2A); /* F3 0F 2A /r */ |
11070 ins_encode( OpcP, OpcS, Opcode(tertiary), RegReg(dst, src)); | 11084 ins_encode( OpcP, OpcS, Opcode(tertiary), RegReg(dst, src)); |
11071 ins_pipe( pipe_slow ); | 11085 ins_pipe( pipe_slow ); |
11086 %} | |
11087 | |
11088 instruct convXI2X_reg(regX dst, eRegI src) | |
11089 %{ | |
11090 predicate( UseSSE>=2 && UseXmmI2F ); | |
11091 match(Set dst (ConvI2F src)); | |
11092 | |
11093 format %{ "MOVD $dst,$src\n\t" | |
11094 "CVTDQ2PS $dst,$dst\t# i2f" %} | |
11095 ins_encode %{ | |
11096 __ movd($dst$$XMMRegister, $src$$Register); | |
11097 __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister); | |
11098 %} | |
11099 ins_pipe(pipe_slow); // XXX | |
11072 %} | 11100 %} |
11073 | 11101 |
11074 instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{ | 11102 instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{ |
11075 match(Set dst (ConvI2L src)); | 11103 match(Set dst (ConvI2L src)); |
11076 effect(KILL cr); | 11104 effect(KILL cr); |