mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117950 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			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
 | 
						|
}
 |