149 lines
5.3 KiB
LLVM
149 lines
5.3 KiB
LLVM
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||
|
; RUN: llc -mtriple=riscv32 -target-abi ilp32e -verify-machineinstrs < %s \
|
||
|
; RUN: | FileCheck -check-prefix=ILP32E %s
|
||
|
; RUN: llc -mtriple=riscv32 -target-abi ilp32e -frame-pointer=all -verify-machineinstrs < %s \
|
||
|
; RUN: | FileCheck -check-prefix=ILP32E-WITHFP %s
|
||
|
|
||
|
declare void @llvm.va_start(i8*)
|
||
|
declare void @llvm.va_end(i8*)
|
||
|
declare void @abort()
|
||
|
|
||
|
define i32 @caller(i32 %a) {
|
||
|
; ILP32E-LABEL: caller:
|
||
|
; ILP32E: # %bb.0: # %entry
|
||
|
; ILP32E-NEXT: addi sp, sp, -8
|
||
|
; ILP32E-NEXT: .cfi_def_cfa_offset 8
|
||
|
; ILP32E-NEXT: sw ra, 4(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-NEXT: sw s0, 0(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-NEXT: .cfi_offset ra, -4
|
||
|
; ILP32E-NEXT: .cfi_offset s0, -8
|
||
|
; ILP32E-NEXT: mv s0, a0
|
||
|
; ILP32E-NEXT: li a0, 1
|
||
|
; ILP32E-NEXT: lui a2, 262144
|
||
|
; ILP32E-NEXT: li a1, 0
|
||
|
; ILP32E-NEXT: call va_double
|
||
|
; ILP32E-NEXT: mv a0, s0
|
||
|
; ILP32E-NEXT: lw ra, 4(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-NEXT: lw s0, 0(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-NEXT: addi sp, sp, 8
|
||
|
; ILP32E-NEXT: ret
|
||
|
;
|
||
|
; ILP32E-WITHFP-LABEL: caller:
|
||
|
; ILP32E-WITHFP: # %bb.0: # %entry
|
||
|
; ILP32E-WITHFP-NEXT: addi sp, sp, -12
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_def_cfa_offset 12
|
||
|
; ILP32E-WITHFP-NEXT: sw ra, 8(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-WITHFP-NEXT: sw s0, 4(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-WITHFP-NEXT: sw s1, 0(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_offset ra, -4
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_offset s0, -8
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_offset s1, -12
|
||
|
; ILP32E-WITHFP-NEXT: addi s0, sp, 12
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_def_cfa s0, 0
|
||
|
; ILP32E-WITHFP-NEXT: mv s1, a0
|
||
|
; ILP32E-WITHFP-NEXT: li a0, 1
|
||
|
; ILP32E-WITHFP-NEXT: lui a2, 262144
|
||
|
; ILP32E-WITHFP-NEXT: li a1, 0
|
||
|
; ILP32E-WITHFP-NEXT: call va_double
|
||
|
; ILP32E-WITHFP-NEXT: mv a0, s1
|
||
|
; ILP32E-WITHFP-NEXT: lw ra, 8(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-WITHFP-NEXT: lw s0, 4(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-WITHFP-NEXT: lw s1, 0(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-WITHFP-NEXT: addi sp, sp, 12
|
||
|
; ILP32E-WITHFP-NEXT: ret
|
||
|
entry:
|
||
|
call void (i32, ...) @va_double(i32 1, double 2.000000e+00)
|
||
|
ret i32 %a
|
||
|
}
|
||
|
|
||
|
define void @va_double(i32 %n, ...) {
|
||
|
; ILP32E-LABEL: va_double:
|
||
|
; ILP32E: # %bb.0: # %entry
|
||
|
; ILP32E-NEXT: addi sp, sp, -32
|
||
|
; ILP32E-NEXT: .cfi_def_cfa_offset 32
|
||
|
; ILP32E-NEXT: sw ra, 4(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-NEXT: .cfi_offset ra, -28
|
||
|
; ILP32E-NEXT: sw a5, 28(sp)
|
||
|
; ILP32E-NEXT: sw a4, 24(sp)
|
||
|
; ILP32E-NEXT: sw a3, 20(sp)
|
||
|
; ILP32E-NEXT: sw a2, 16(sp)
|
||
|
; ILP32E-NEXT: sw a1, 12(sp)
|
||
|
; ILP32E-NEXT: addi a0, sp, 12
|
||
|
; ILP32E-NEXT: sw a0, 0(sp)
|
||
|
; ILP32E-NEXT: addi a0, sp, 19
|
||
|
; ILP32E-NEXT: andi a1, a0, -8
|
||
|
; ILP32E-NEXT: addi a0, a1, 8
|
||
|
; ILP32E-NEXT: sw a0, 0(sp)
|
||
|
; ILP32E-NEXT: lw a0, 0(a1)
|
||
|
; ILP32E-NEXT: lw a1, 4(a1)
|
||
|
; ILP32E-NEXT: lui a3, 262144
|
||
|
; ILP32E-NEXT: li a2, 0
|
||
|
; ILP32E-NEXT: call __eqdf2
|
||
|
; ILP32E-NEXT: bnez a0, .LBB1_2
|
||
|
; ILP32E-NEXT: # %bb.1: # %if.end
|
||
|
; ILP32E-NEXT: lw ra, 4(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-NEXT: addi sp, sp, 32
|
||
|
; ILP32E-NEXT: ret
|
||
|
; ILP32E-NEXT: .LBB1_2: # %if.then
|
||
|
; ILP32E-NEXT: call abort
|
||
|
;
|
||
|
; ILP32E-WITHFP-LABEL: va_double:
|
||
|
; ILP32E-WITHFP: # %bb.0: # %entry
|
||
|
; ILP32E-WITHFP-NEXT: addi sp, sp, -36
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_def_cfa_offset 36
|
||
|
; ILP32E-WITHFP-NEXT: sw ra, 8(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-WITHFP-NEXT: sw s0, 4(sp) # 4-byte Folded Spill
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_offset ra, -28
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_offset s0, -32
|
||
|
; ILP32E-WITHFP-NEXT: addi s0, sp, 12
|
||
|
; ILP32E-WITHFP-NEXT: .cfi_def_cfa s0, 24
|
||
|
; ILP32E-WITHFP-NEXT: sw a5, 20(s0)
|
||
|
; ILP32E-WITHFP-NEXT: sw a4, 16(s0)
|
||
|
; ILP32E-WITHFP-NEXT: sw a3, 12(s0)
|
||
|
; ILP32E-WITHFP-NEXT: sw a2, 8(s0)
|
||
|
; ILP32E-WITHFP-NEXT: sw a1, 4(s0)
|
||
|
; ILP32E-WITHFP-NEXT: addi a0, s0, 4
|
||
|
; ILP32E-WITHFP-NEXT: sw a0, -12(s0)
|
||
|
; ILP32E-WITHFP-NEXT: addi a0, s0, 11
|
||
|
; ILP32E-WITHFP-NEXT: andi a1, a0, -8
|
||
|
; ILP32E-WITHFP-NEXT: addi a0, a1, 8
|
||
|
; ILP32E-WITHFP-NEXT: sw a0, -12(s0)
|
||
|
; ILP32E-WITHFP-NEXT: lw a0, 0(a1)
|
||
|
; ILP32E-WITHFP-NEXT: lw a1, 4(a1)
|
||
|
; ILP32E-WITHFP-NEXT: lui a3, 262144
|
||
|
; ILP32E-WITHFP-NEXT: li a2, 0
|
||
|
; ILP32E-WITHFP-NEXT: call __eqdf2
|
||
|
; ILP32E-WITHFP-NEXT: bnez a0, .LBB1_2
|
||
|
; ILP32E-WITHFP-NEXT: # %bb.1: # %if.end
|
||
|
; ILP32E-WITHFP-NEXT: lw ra, 8(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-WITHFP-NEXT: lw s0, 4(sp) # 4-byte Folded Reload
|
||
|
; ILP32E-WITHFP-NEXT: addi sp, sp, 36
|
||
|
; ILP32E-WITHFP-NEXT: ret
|
||
|
; ILP32E-WITHFP-NEXT: .LBB1_2: # %if.then
|
||
|
; ILP32E-WITHFP-NEXT: call abort
|
||
|
entry:
|
||
|
%args = alloca i8*, align 4
|
||
|
%args1 = bitcast i8** %args to i8*
|
||
|
call void @llvm.va_start(i8* %args1)
|
||
|
%argp.cur = load i8*, i8** %args, align 4
|
||
|
%0 = ptrtoint i8* %argp.cur to i32
|
||
|
%1 = add i32 %0, 7
|
||
|
%2 = and i32 %1, -8
|
||
|
%argp.cur.aligned = inttoptr i32 %2 to i8*
|
||
|
%argp.next = getelementptr inbounds i8, i8* %argp.cur.aligned, i32 8
|
||
|
store i8* %argp.next, i8** %args, align 4
|
||
|
%3 = bitcast i8* %argp.cur.aligned to double*
|
||
|
%4 = load double, double* %3, align 8
|
||
|
%cmp = fcmp une double %4, 2.000000e+00
|
||
|
br i1 %cmp, label %if.then, label %if.end
|
||
|
|
||
|
if.then:
|
||
|
call void @abort()
|
||
|
unreachable
|
||
|
|
||
|
if.end:
|
||
|
%args2 = bitcast i8** %args to i8*
|
||
|
call void @llvm.va_end(i8* %args2)
|
||
|
ret void
|
||
|
}
|