62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: llc -mtriple=armv7-linux < %s | FileCheck %s
 | 
						|
 | 
						|
declare arm_aapcscc void @addrof_i32(i32*)
 | 
						|
declare arm_aapcscc void @addrof_i64(i64*)
 | 
						|
 | 
						|
define arm_aapcscc void @simple(i32, i32, i32, i32, i32 %x) {
 | 
						|
entry:
 | 
						|
  %x.addr = alloca i32
 | 
						|
  store i32 %x, i32* %x.addr
 | 
						|
  call void @addrof_i32(i32* %x.addr)
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: simple:
 | 
						|
; CHECK: push {r11, lr}
 | 
						|
; CHECK: add r0, sp, #8
 | 
						|
; CHECK: bl addrof_i32
 | 
						|
; CHECK: pop {r11, pc}
 | 
						|
 | 
						|
 | 
						|
; We need to load %x before calling addrof_i32 now because it could mutate %x in
 | 
						|
; place.
 | 
						|
 | 
						|
define arm_aapcscc i32 @use_arg(i32, i32, i32, i32, i32 %x) {
 | 
						|
entry:
 | 
						|
  %x.addr = alloca i32
 | 
						|
  store i32 %x, i32* %x.addr
 | 
						|
  call void @addrof_i32(i32* %x.addr)
 | 
						|
  ret i32 %x
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: use_arg:
 | 
						|
; CHECK: push {[[csr:[^ ]*]], lr}
 | 
						|
; CHECK: add r0, sp, #8
 | 
						|
; CHECK: ldr [[csr]], [sp, #8]
 | 
						|
; CHECK: bl addrof_i32
 | 
						|
; CHECK: mov r0, [[csr]]
 | 
						|
; CHECK: pop {[[csr]], pc}
 | 
						|
 | 
						|
 | 
						|
define arm_aapcscc i64 @split_i64(i32, i32, i32, i32, i64 %x) {
 | 
						|
entry:
 | 
						|
  %x.addr = alloca i64, align 4
 | 
						|
  store i64 %x, i64* %x.addr, align 4
 | 
						|
  call void @addrof_i64(i64* %x.addr)
 | 
						|
  ret i64 %x
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: split_i64:
 | 
						|
; CHECK: push    {r4, r5, r11, lr}
 | 
						|
; CHECK: sub     sp, sp, #8
 | 
						|
; CHECK: ldr     r4, [sp, #28]
 | 
						|
; CHECK: mov     r0, sp
 | 
						|
; CHECK: ldr     r5, [sp, #24]
 | 
						|
; CHECK: str     r4, [sp, #4]
 | 
						|
; CHECK: str     r5, [sp]
 | 
						|
; CHECK: bl      addrof_i64
 | 
						|
; CHECK: mov     r0, r5
 | 
						|
; CHECK: mov     r1, r4
 | 
						|
; CHECK: add     sp, sp, #8
 | 
						|
; CHECK: pop     {r4, r5, r11, pc}
 |