forked from OSchip/llvm-project
Add ARM64 CLS patterns
This patch adds patterns to generate the cls instruction ARM64. Includes tests for 64 bit and 32 bit operands. rdar://15611957 llvm-svn: 206079
This commit is contained in:
parent
e06e801a67
commit
b9a0551862
|
@ -652,6 +652,12 @@ def : Pat<(cttz GPR32:$Rn),
|
|||
(CLZWr (RBITWr GPR32:$Rn))>;
|
||||
def : Pat<(cttz GPR64:$Rn),
|
||||
(CLZXr (RBITXr GPR64:$Rn))>;
|
||||
def : Pat<(ctlz (or (shl (xor (sra GPR32:$Rn, (i64 31)), GPR32:$Rn), (i64 1)),
|
||||
(i32 1))),
|
||||
(CLSWr GPR32:$Rn)>;
|
||||
def : Pat<(ctlz (or (shl (xor (sra GPR64:$Rn, (i64 63)), GPR64:$Rn), (i64 1)),
|
||||
(i64 1))),
|
||||
(CLSXr GPR64:$Rn)>;
|
||||
|
||||
// Unlike the other one operand instructions, the instructions with the "rev"
|
||||
// mnemonic do *not* just different in the size bit, but actually use different
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
; RUN: llc < %s -march=arm64 | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "arm64-apple-ios7.0.0"
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare i32 @llvm.ctlz.i32(i32, i1) #0
|
||||
declare i64 @llvm.ctlz.i64(i64, i1) #1
|
||||
|
||||
; Function Attrs: nounwind ssp
|
||||
define i32 @clrsb32(i32 %x) #2 {
|
||||
entry:
|
||||
%shr = ashr i32 %x, 31
|
||||
%xor = xor i32 %shr, %x
|
||||
%mul = shl i32 %xor, 1
|
||||
%add = or i32 %mul, 1
|
||||
%0 = tail call i32 @llvm.ctlz.i32(i32 %add, i1 false)
|
||||
|
||||
ret i32 %0
|
||||
; CHECK-LABEL: clrsb32
|
||||
; CHECK: cls [[TEMP:w[0-9]+]], [[TEMP]]
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind ssp
|
||||
define i64 @clrsb64(i64 %x) #3 {
|
||||
entry:
|
||||
%shr = ashr i64 %x, 63
|
||||
%xor = xor i64 %shr, %x
|
||||
%mul = shl nsw i64 %xor, 1
|
||||
%add = or i64 %mul, 1
|
||||
%0 = tail call i64 @llvm.ctlz.i64(i64 %add, i1 false)
|
||||
|
||||
ret i64 %0
|
||||
; CHECK-LABEL: clrsb64
|
||||
; CHECK: cls [[TEMP:x[0-9]+]], [[TEMP]]
|
||||
}
|
Loading…
Reference in New Issue