Fix for PR1613: added 64-bit rotate left PPC instructions and patterns.

llvm-svn: 41711
This commit is contained in:
Evan Cheng 2007-09-04 20:20:29 +00:00
parent 20711a8b9a
commit 4dbd9f254a
2 changed files with 30 additions and 0 deletions

View File

@ -338,6 +338,10 @@ def RLDIMI : MDForm_1<30, 3,
}
// Rotate instructions.
def RLDCL : MDForm_1<30, 0,
(outs G8RC:$rA), (ins G8RC:$rS, GPRC:$rB, u6imm:$MB),
"rldcl $rA, $rS, $rB, $MB", IntRotateD,
[]>, isPPC64;
def RLDICL : MDForm_1<30, 0,
(outs G8RC:$rA), (ins G8RC:$rS, u6imm:$SH, u6imm:$MB),
"rldicl $rA, $rS, $SH, $MB", IntRotateD,
@ -579,6 +583,12 @@ def : Pat<(shl G8RC:$in, (i32 imm:$imm)),
def : Pat<(srl G8RC:$in, (i32 imm:$imm)),
(RLDICL G8RC:$in, (SRL64 imm:$imm), imm:$imm)>;
// ROTL
def : Pat<(rotl G8RC:$in, GPRC:$sh),
(RLDCL G8RC:$in, GPRC:$sh, 0)>;
def : Pat<(rotl G8RC:$in, (i32 imm:$imm)),
(RLDICL G8RC:$in, imm:$imm, 0)>;
// Hi and Lo for Darwin Global Addresses.
def : Pat<(PPChi tglobaladdr:$in, 0), (LIS8 tglobaladdr:$in)>;
def : Pat<(PPClo tglobaladdr:$in, 0), (LI8 tglobaladdr:$in)>;

View File

@ -0,0 +1,20 @@
; RUN: llvm-as < %s | llc -march=ppc64 | grep rldicl
; RUN: llvm-as < %s | llc -march=ppc64 | grep rldcl
; PR1613
define i64 @t1(i64 %A) {
%tmp1 = lshr i64 %A, 57
%tmp2 = shl i64 %A, 7
%tmp3 = or i64 %tmp1, %tmp2
ret i64 %tmp3
}
define i64 @t2(i64 %A, i8 zeroext %Amt) {
%Amt1 = zext i8 %Amt to i64
%tmp1 = lshr i64 %A, %Amt1
%Amt2 = sub i8 64, %Amt
%Amt3 = zext i8 %Amt2 to i64
%tmp2 = shl i64 %A, %Amt3
%tmp3 = or i64 %tmp1, %tmp2
ret i64 %tmp3
}