diff options
author | Michael Liao <michael.liao@intel.com> | 2012-09-26 08:24:51 +0000 |
---|---|---|
committer | Michael Liao <michael.liao@intel.com> | 2012-09-26 08:24:51 +0000 |
commit | 2de86af22d3e581ee1e82b2f14de2cc8b4ddaacb (patch) | |
tree | c6612e18e366e94506e5144a29fd395b980a351c /llvm/lib/Target/X86/X86InstrShiftRotate.td | |
parent | f9f7b5518ab21d0023fc73d233a4ef236f7e3846 (diff) | |
download | bcm5719-llvm-2de86af22d3e581ee1e82b2f14de2cc8b4ddaacb.tar.gz bcm5719-llvm-2de86af22d3e581ee1e82b2f14de2cc8b4ddaacb.zip |
Add RORX code generation support
llvm-svn: 164674
Diffstat (limited to 'llvm/lib/Target/X86/X86InstrShiftRotate.td')
-rw-r--r-- | llvm/lib/Target/X86/X86InstrShiftRotate.td | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrShiftRotate.td b/llvm/lib/Target/X86/X86InstrShiftRotate.td index bdeb63ffbd6..fe7d0ecf896 100644 --- a/llvm/lib/Target/X86/X86InstrShiftRotate.td +++ b/llvm/lib/Target/X86/X86InstrShiftRotate.td @@ -839,6 +839,16 @@ def SHRD64mri8 : RIi8<0xAC, MRMDestMem, } // Defs = [EFLAGS] +def ROT32L2R_imm8 : SDNodeXForm<imm, [{ + // Convert a ROTL shamt to a ROTR shamt on 32-bit integer. + return getI8Imm(32 - N->getZExtValue()); +}]>; + +def ROT64L2R_imm8 : SDNodeXForm<imm, [{ + // Convert a ROTL shamt to a ROTR shamt on 64-bit integer. + return getI8Imm(64 - N->getZExtValue()); +}]>; + multiclass bmi_rotate<string asm, RegisterClass RC, X86MemOperand x86memop> { let neverHasSideEffects = 1 in { def ri : Ii8<0xF0, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, i8imm:$src2), @@ -873,4 +883,17 @@ let Predicates = [HasBMI2] in { defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem>, T8XD, VEX_W; defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem>, T8, OpSize; defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem>, T8, OpSize, VEX_W; + + // Prefer RORX which is non-destructive and doesn't update EFLAGS. + let AddedComplexity = 10 in { + def : Pat<(rotl GR32:$src, (i8 imm:$shamt)), + (RORX32ri GR32:$src, (ROT32L2R_imm8 imm:$shamt))>; + def : Pat<(rotl GR64:$src, (i8 imm:$shamt)), + (RORX64ri GR64:$src, (ROT64L2R_imm8 imm:$shamt))>; + } + + def : Pat<(rotl (loadi32 addr:$src), (i8 imm:$shamt)), + (RORX32mi addr:$src, (ROT32L2R_imm8 imm:$shamt))>; + def : Pat<(rotl (loadi64 addr:$src), (i8 imm:$shamt)), + (RORX64mi addr:$src, (ROT64L2R_imm8 imm:$shamt))>; } |