1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00
llvm-mirror/test/CodeGen/ARM/cls.ll
vhscampos d767cb8c50 [ARM][AArch64] Implement __cls, __clsl and __clsll intrinsics from ACLE
Summary:
Writing support for three ACLE functions:
  unsigned int __cls(uint32_t x)
  unsigned int __clsl(unsigned long x)
  unsigned int __clsll(uint64_t x)

CLS stands for "Count number of leading sign bits".

In AArch64, these two intrinsics can be translated into the 'cls'
instruction directly. In AArch32, on the other hand, this functionality
is achieved by implementing it in terms of clz (count number of leading
zeros).

Reviewers: compnerd

Reviewed By: compnerd

Subscribers: kristof.beyls, hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D69250
2019-10-28 11:06:58 +00:00

28 lines
793 B
LLVM

; RUN: llc -mtriple=armv5 %s -o - | FileCheck %s
; CHECK: eor [[T:r[0-9]+]], [[T]], [[T]], asr #31
; CHECK-NEXT: mov [[C1:r[0-9]+]], #1
; CHECK-NEXT: orr [[T]], [[C1]], [[T]], lsl #1
; CHECK-NEXT: clz [[T]], [[T]]
define i32 @cls(i32 %t) {
%cls.i = call i32 @llvm.arm.cls(i32 %t)
ret i32 %cls.i
}
; CHECK: cmp r1, #0
; CHECK: mvnne [[ADJUSTEDLO:r[0-9]+]], r0
; CHECK: clz [[CLZLO:r[0-9]+]], [[ADJUSTEDLO]]
; CHECK: eor [[A:r[0-9]+]], r1, r1, asr #31
; CHECK: mov r1, #1
; CHECK: orr [[A]], r1, [[A]], lsl #1
; CHECK: clz [[CLSHI:r[0-9]+]], [[A]]
; CHECK: cmp [[CLSHI]], #31
; CHECK: addeq r0, [[CLZLO]], #31
define i32 @cls64(i64 %t) {
%cls.i = call i32 @llvm.arm.cls64(i64 %t)
ret i32 %cls.i
}
declare i32 @llvm.arm.cls(i32) nounwind
declare i32 @llvm.arm.cls64(i64) nounwind