mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
9ae1cdf437
The original code attempted to do this, but the std::abs() call didn't actually do anything due to implicit type conversions. Fix the type conversions, and perform the correct check for negative immediates. This probably has very little practical impact, but it's worth fixing just to avoid confusion in the future, I think. Differential Revision: https://reviews.llvm.org/D48907 llvm-svn: 336742
300 lines
5.2 KiB
LLVM
300 lines
5.2 KiB
LLVM
; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck %s
|
|
|
|
; These tests would be improved by 'movs r0, #0' being rematerialized below the
|
|
; test as 'mov.w r0, #0'.
|
|
|
|
; 0x000000bb = 187
|
|
define i32 @f1(i32 %a) {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: cmp {{.*}}, #187
|
|
%tmp = icmp ne i32 %a, 187
|
|
%ret = select i1 %tmp, i32 42, i32 24
|
|
ret i32 %ret
|
|
}
|
|
|
|
; 0x00aa00aa = 11141290
|
|
define i32 @f2(i32 %a) {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: cmp.w {{.*}}, #11141290
|
|
%tmp = icmp eq i32 %a, 11141290
|
|
%ret = select i1 %tmp, i32 42, i32 24
|
|
ret i32 %ret
|
|
}
|
|
|
|
; 0xcc00cc00 = 3422604288
|
|
define i32 @f3(i32 %a) {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: cmp.w {{.*}}, #-872363008
|
|
%tmp = icmp ne i32 %a, 3422604288
|
|
%ret = select i1 %tmp, i32 42, i32 24
|
|
ret i32 %ret
|
|
}
|
|
|
|
; 0xdddddddd = 3722304989
|
|
define i32 @f4(i32 %a) {
|
|
; CHECK-LABEL: f4:
|
|
; CHECK: cmp.w {{.*}}, #-572662307
|
|
%tmp = icmp ne i32 %a, 3722304989
|
|
%ret = select i1 %tmp, i32 42, i32 24
|
|
ret i32 %ret
|
|
}
|
|
|
|
; 0x00110000 = 1114112
|
|
define i32 @f5(i32 %a) {
|
|
; CHECK-LABEL: f5:
|
|
; CHECK: cmp.w {{.*}}, #1114112
|
|
%tmp = icmp eq i32 %a, 1114112
|
|
%ret = select i1 %tmp, i32 42, i32 24
|
|
ret i32 %ret
|
|
}
|
|
|
|
; Check that we don't do an invalid (a > b) --> !(a < b + 1) transform.
|
|
;
|
|
; CHECK-LABEL: f6:
|
|
; CHECK-NOT: cmp.w {{.*}}, #-2147483648
|
|
; CHECK: bx lr
|
|
define i32 @f6(i32 %a) {
|
|
%tmp = icmp sgt i32 %a, 2147483647
|
|
br i1 %tmp, label %true, label %false
|
|
true:
|
|
ret i32 2
|
|
false:
|
|
ret i32 0
|
|
}
|
|
|
|
define i32 @slt_poweroftwo(i32 %a) {
|
|
; CHECK-LABEL: slt_poweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp slt i32 %a, 4096
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sle_poweroftwo(i32 %a) {
|
|
; CHECK-LABEL: sle_poweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp sle i32 %a, 4096
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sge_poweroftwo(i32 %a) {
|
|
; CHECK-LABEL: sge_poweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp sge i32 %a, 4096
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sgt_poweroftwo(i32 %a) {
|
|
; CHECK-LABEL: sgt_poweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp sgt i32 %a, 4096
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @slt_nearpoweroftwo(i32 %a) {
|
|
; CHECK-LABEL: slt_nearpoweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp slt i32 %a, 4097
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sle_nearpoweroftwo(i32 %a) {
|
|
; CHECK-LABEL: sle_nearpoweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp sle i32 %a, 4095
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
|
|
define i32 @sge_nearpoweroftwo(i32 %a) {
|
|
; CHECK-LABEL: sge_nearpoweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp sge i32 %a, 4097
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sgt_nearpoweroftwo(i32 %a) {
|
|
; CHECK-LABEL: sgt_nearpoweroftwo:
|
|
; CHECK: cmp.w r0, #4096
|
|
%b = icmp sgt i32 %a, 4095
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @slt_neg_soimm(i32 %a) {
|
|
; CHECK-LABEL: slt_neg_soimm:
|
|
; CHECK: cmn.w r0, #7929856
|
|
%b = icmp slt i32 %a, -7929856
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sle_neg_soimm(i32 %a) {
|
|
; CHECK-LABEL: sle_neg_soimm:
|
|
; CHECK: cmn.w r0, #7929856
|
|
%b = icmp sle i32 %a, -7929856
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sge_neg_soimm(i32 %a) {
|
|
; CHECK-LABEL: sge_neg_soimm:
|
|
; CHECK: cmn.w r0, #7929856
|
|
%b = icmp sge i32 %a, -7929856
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sgt_neg_soimm(i32 %a) {
|
|
; CHECK-LABEL: sgt_neg_soimm:
|
|
; CHECK: cmn.w r0, #7929856
|
|
%b = icmp sgt i32 %a, -7929856
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @slt_notneg_soimm(i32 %a) {
|
|
; CHECK-LABEL: slt_notneg_soimm:
|
|
; CHECK: cmp.w r0, #-2013231104
|
|
%b = icmp slt i32 %a, -2013231104
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sle_notneg_soimm(i32 %a) {
|
|
; CHECK-LABEL: sle_notneg_soimm:
|
|
; CHECK: cmp.w r0, #-2013231104
|
|
%b = icmp sle i32 %a, -2013231104
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sge_notneg_soimm(i32 %a) {
|
|
; CHECK-LABEL: sge_notneg_soimm:
|
|
; CHECK: cmp.w r0, #-2013231104
|
|
%b = icmp sge i32 %a, -2013231104
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sgt_notneg_soimm(i32 %a) {
|
|
; CHECK-LABEL: sgt_notneg_soimm:
|
|
; CHECK: cmp.w r0, #-2013231104
|
|
%b = icmp sgt i32 %a, -2013231104
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sgt_movw(i32 %a) {
|
|
; CHECK-LABEL: sgt_movw:
|
|
; CHECK: movw r1, #2167
|
|
%b = icmp sgt i32 %a, 2166
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|
|
|
|
define i32 @sgt_neg_movw(i32 %a) {
|
|
; CHECK-LABEL: sgt_neg_movw:
|
|
; CHECK: movw r1, #63371
|
|
; CHECK: movt r1, #65535
|
|
%b = icmp sgt i32 %a, -2166
|
|
br i1 %b, label %true, label %false
|
|
|
|
true:
|
|
ret i32 1
|
|
|
|
false:
|
|
ret i32 2
|
|
}
|