90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
 | |
| 
 | |
| ; Check the GHC call convention works (aarch64)
 | |
| 
 | |
| @base  = external global i64 ; assigned to register: r19
 | |
| @sp    = external global i64 ; assigned to register: r20
 | |
| @hp    = external global i64 ; assigned to register: r21
 | |
| @r1    = external global i64 ; assigned to register: r22
 | |
| @r2    = external global i64 ; assigned to register: r23
 | |
| @r3    = external global i64 ; assigned to register: r24
 | |
| @r4    = external global i64 ; assigned to register: r25
 | |
| @r5    = external global i64 ; assigned to register: r26
 | |
| @r6    = external global i64 ; assigned to register: r27
 | |
| @splim = external global i64 ; assigned to register: r28
 | |
| 
 | |
| @f1 = external global float  ; assigned to register: s8
 | |
| @f2 = external global float  ; assigned to register: s9
 | |
| @f3 = external global float  ; assigned to register: s10
 | |
| @f4 = external global float  ; assigned to register: s11
 | |
| 
 | |
| @d1 = external global double ; assigned to register: d12
 | |
| @d2 = external global double ; assigned to register: d13
 | |
| @d3 = external global double ; assigned to register: d14
 | |
| @d4 = external global double ; assigned to register: d15
 | |
| 
 | |
| define ghccc i64 @addtwo(i64 %x, i64 %y) nounwind {
 | |
| entry:
 | |
|   ; CHECK-LABEL: addtwo
 | |
|   ; CHECK:       add      x0, x19, x20
 | |
|   ; CHECK-NEXT:  ret
 | |
|   %0 = add i64 %x, %y
 | |
|   ret i64 %0
 | |
| }
 | |
| 
 | |
| define void @zap(i64 %a, i64 %b) nounwind {
 | |
| entry:
 | |
|   ; CHECK-LABEL: zap
 | |
|   ; CHECK-NOT:   mov   {{x[0-9]+}}, sp
 | |
|   ; CHECK:       bl    addtwo
 | |
|   ; CHECK-NEXT:  bl    foo
 | |
|   %0 = call ghccc i64 @addtwo(i64 %a, i64 %b)
 | |
|   call void @foo() nounwind
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define ghccc void @foo_i64 () nounwind {
 | |
| entry:
 | |
|   ; CHECK-LABEL: foo_i64
 | |
|   ; CHECK:       adrp    {{x[0-9]+}}, base
 | |
|   ; CHECK-NEXT:  ldr     x19, [{{x[0-9]+}}, :lo12:base]
 | |
|   ; CHECK-NEXT:  bl      bar_i64
 | |
|   ; CHECK-NEXT:  ret
 | |
| 
 | |
|   %0 = load i64, i64* @base
 | |
|   tail call ghccc void @bar_i64( i64 %0 ) nounwind
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define ghccc void @foo_float () nounwind {
 | |
| entry:
 | |
|   ; CHECK-LABEL: foo_float
 | |
|   ; CHECK:       adrp    {{x[0-9]+}}, f1
 | |
|   ; CHECK-NEXT:  ldr     s8, [{{x[0-9]+}}, :lo12:f1]
 | |
|   ; CHECK-NEXT:  bl      bar_float
 | |
|   ; CHECK-NEXT:  ret
 | |
| 
 | |
|   %0 = load float, float* @f1
 | |
|   tail call ghccc void @bar_float( float %0 ) nounwind
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define ghccc void @foo_double () nounwind {
 | |
| entry:
 | |
|   ; CHECK-LABEL: foo_double
 | |
|   ; CHECK:       adrp    {{x[0-9]+}}, d1
 | |
|   ; CHECK-NEXT:  ldr     d12, [{{x[0-9]+}}, :lo12:d1]
 | |
|   ; CHECK-NEXT:  bl      bar_double
 | |
|   ; CHECK-NEXT:  ret
 | |
| 
 | |
|   %0 = load double, double* @d1
 | |
|   tail call ghccc void @bar_double( double %0 ) nounwind
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| declare ghccc void @foo ()
 | |
| 
 | |
| declare ghccc void @bar_i64 (i64)
 | |
| declare ghccc void @bar_float (float)
 | |
| declare ghccc void @bar_double (double)
 |