mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 00:12:50 +01:00
4340c9449a
at more than those which define CPSR. You can have this situation: (1) subs ... (2) sub r6, r5, r4 (3) movge ... (4) cmp r6, 0 (5) movge ... We cannot convert (2) to "subs" because (3) is using the CPSR set by (1). There's an analogous situation here: (1) sub r1, r2, r3 (2) sub r4, r5, r6 (3) cmp r4, ... (5) movge ... (6) cmp r1, ... (7) movge ... We cannot convert (1) to "subs" because of the intervening use of CPSR. llvm-svn: 117950
46 lines
1004 B
LLVM
46 lines
1004 B
LLVM
; RUN: llc < %s -march=arm | FileCheck %s
|
|
|
|
define i64 @f0(i64 %A, i64 %B) {
|
|
; CHECK: f0
|
|
; CHECK: lsrs r3, r3, #1
|
|
; CHECK-NEXT: rrx r2, r2
|
|
; CHECK-NEXT: subs r0, r0, r2
|
|
; CHECK-NEXT: sbc r1, r1, r3
|
|
%tmp = bitcast i64 %A to i64
|
|
%tmp2 = lshr i64 %B, 1
|
|
%tmp3 = sub i64 %tmp, %tmp2
|
|
ret i64 %tmp3
|
|
}
|
|
|
|
define i32 @f1(i64 %x, i64 %y) {
|
|
; CHECK: f1
|
|
; CHECK: lsl{{.*}}r2
|
|
%a = shl i64 %x, %y
|
|
%b = trunc i64 %a to i32
|
|
ret i32 %b
|
|
}
|
|
|
|
define i32 @f2(i64 %x, i64 %y) {
|
|
; CHECK: f2
|
|
; CHECK: lsr{{.*}}r2
|
|
; CHECK-NEXT: rsb r3, r2, #32
|
|
; CHECK-NEXT: subs r2, r2, #32
|
|
; CHECK-NEXT: orr r0, r0, r1, lsl r3
|
|
; CHECK-NEXT: movge r0, r1, asr r2
|
|
%a = ashr i64 %x, %y
|
|
%b = trunc i64 %a to i32
|
|
ret i32 %b
|
|
}
|
|
|
|
define i32 @f3(i64 %x, i64 %y) {
|
|
; CHECK: f3
|
|
; CHECK: lsr{{.*}}r2
|
|
; CHECK-NEXT: rsb r3, r2, #32
|
|
; CHECK-NEXT: subs r2, r2, #32
|
|
; CHECK-NEXT: orr r0, r0, r1, lsl r3
|
|
; CHECK-NEXT: movge r0, r1, lsr r2
|
|
%a = lshr i64 %x, %y
|
|
%b = trunc i64 %a to i32
|
|
ret i32 %b
|
|
}
|