xref: /llvm-project/llvm/test/CodeGen/RISCV/vararg-ilp32e.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
13ac9fe69SWang Pengcheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
23ac9fe69SWang Pengcheng; RUN: llc -mtriple=riscv32 -target-abi ilp32e -verify-machineinstrs < %s \
33ac9fe69SWang Pengcheng; RUN:   | FileCheck -check-prefix=ILP32E %s
43ac9fe69SWang Pengcheng; RUN: llc -mtriple=riscv32 -target-abi ilp32e -frame-pointer=all -verify-machineinstrs < %s \
53ac9fe69SWang Pengcheng; RUN:   | FileCheck -check-prefix=ILP32E-WITHFP %s
63ac9fe69SWang Pengcheng
7ff9af4c4SNikita Popovdeclare void @llvm.va_start(ptr)
8ff9af4c4SNikita Popovdeclare void @llvm.va_end(ptr)
93ac9fe69SWang Pengchengdeclare void @abort()
103ac9fe69SWang Pengcheng
113ac9fe69SWang Pengchengdefine i32 @caller(i32 %a) {
123ac9fe69SWang Pengcheng; ILP32E-LABEL: caller:
133ac9fe69SWang Pengcheng; ILP32E:       # %bb.0: # %entry
143ac9fe69SWang Pengcheng; ILP32E-NEXT:    addi sp, sp, -8
153ac9fe69SWang Pengcheng; ILP32E-NEXT:    .cfi_def_cfa_offset 8
163ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
173ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
183ac9fe69SWang Pengcheng; ILP32E-NEXT:    .cfi_offset ra, -4
193ac9fe69SWang Pengcheng; ILP32E-NEXT:    .cfi_offset s0, -8
203ac9fe69SWang Pengcheng; ILP32E-NEXT:    mv s0, a0
213ac9fe69SWang Pengcheng; ILP32E-NEXT:    li a0, 1
223ac9fe69SWang Pengcheng; ILP32E-NEXT:    lui a2, 262144
233ac9fe69SWang Pengcheng; ILP32E-NEXT:    li a1, 0
243ac9fe69SWang Pengcheng; ILP32E-NEXT:    call va_double
253ac9fe69SWang Pengcheng; ILP32E-NEXT:    mv a0, s0
263ac9fe69SWang Pengcheng; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
273ac9fe69SWang Pengcheng; ILP32E-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2897982a8cSdlav-sc; ILP32E-NEXT:    .cfi_restore ra
2997982a8cSdlav-sc; ILP32E-NEXT:    .cfi_restore s0
303ac9fe69SWang Pengcheng; ILP32E-NEXT:    addi sp, sp, 8
3197982a8cSdlav-sc; ILP32E-NEXT:    .cfi_def_cfa_offset 0
323ac9fe69SWang Pengcheng; ILP32E-NEXT:    ret
333ac9fe69SWang Pengcheng;
343ac9fe69SWang Pengcheng; ILP32E-WITHFP-LABEL: caller:
353ac9fe69SWang Pengcheng; ILP32E-WITHFP:       # %bb.0: # %entry
363ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi sp, sp, -12
373ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 12
383ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
393ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
403ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw s1, 0(sp) # 4-byte Folded Spill
413ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
423ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
433ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_offset s1, -12
443ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
453ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
463ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    mv s1, a0
473ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    li a0, 1
483ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lui a2, 262144
493ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    li a1, 0
503ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    call va_double
513ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    mv a0, s1
5297982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 12
533ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
543ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
553ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw s1, 0(sp) # 4-byte Folded Reload
5697982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_restore ra
5797982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_restore s0
5897982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_restore s1
593ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi sp, sp, 12
6097982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
613ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    ret
623ac9fe69SWang Pengchengentry:
633ac9fe69SWang Pengcheng  call void (i32, ...) @va_double(i32 1, double 2.000000e+00)
643ac9fe69SWang Pengcheng  ret i32 %a
653ac9fe69SWang Pengcheng}
663ac9fe69SWang Pengcheng
673ac9fe69SWang Pengchengdefine void @va_double(i32 %n, ...) {
683ac9fe69SWang Pengcheng; ILP32E-LABEL: va_double:
693ac9fe69SWang Pengcheng; ILP32E:       # %bb.0: # %entry
703ac9fe69SWang Pengcheng; ILP32E-NEXT:    addi sp, sp, -32
713ac9fe69SWang Pengcheng; ILP32E-NEXT:    .cfi_def_cfa_offset 32
723ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
733ac9fe69SWang Pengcheng; ILP32E-NEXT:    .cfi_offset ra, -28
7497982a8cSdlav-sc; ILP32E-NEXT:    .cfi_remember_state
753ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw a5, 28(sp)
763ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw a1, 12(sp)
772967e5f8SAlex Bradbury; ILP32E-NEXT:    sw a2, 16(sp)
782967e5f8SAlex Bradbury; ILP32E-NEXT:    sw a3, 20(sp)
792967e5f8SAlex Bradbury; ILP32E-NEXT:    sw a4, 24(sp)
803ac9fe69SWang Pengcheng; ILP32E-NEXT:    addi a0, sp, 12
81*9122c523SPengcheng Wang; ILP32E-NEXT:    addi a1, sp, 19
823ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw a0, 0(sp)
83*9122c523SPengcheng Wang; ILP32E-NEXT:    andi a1, a1, -8
843ac9fe69SWang Pengcheng; ILP32E-NEXT:    addi a0, a1, 8
853ac9fe69SWang Pengcheng; ILP32E-NEXT:    sw a0, 0(sp)
863ac9fe69SWang Pengcheng; ILP32E-NEXT:    lw a0, 0(a1)
873ac9fe69SWang Pengcheng; ILP32E-NEXT:    lw a1, 4(a1)
883ac9fe69SWang Pengcheng; ILP32E-NEXT:    lui a3, 262144
893ac9fe69SWang Pengcheng; ILP32E-NEXT:    li a2, 0
903ac9fe69SWang Pengcheng; ILP32E-NEXT:    call __eqdf2
913ac9fe69SWang Pengcheng; ILP32E-NEXT:    bnez a0, .LBB1_2
923ac9fe69SWang Pengcheng; ILP32E-NEXT:  # %bb.1: # %if.end
933ac9fe69SWang Pengcheng; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
9497982a8cSdlav-sc; ILP32E-NEXT:    .cfi_restore ra
953ac9fe69SWang Pengcheng; ILP32E-NEXT:    addi sp, sp, 32
9697982a8cSdlav-sc; ILP32E-NEXT:    .cfi_def_cfa_offset 0
973ac9fe69SWang Pengcheng; ILP32E-NEXT:    ret
983ac9fe69SWang Pengcheng; ILP32E-NEXT:  .LBB1_2: # %if.then
9997982a8cSdlav-sc; ILP32E-NEXT:    .cfi_restore_state
1003ac9fe69SWang Pengcheng; ILP32E-NEXT:    call abort
1013ac9fe69SWang Pengcheng;
1023ac9fe69SWang Pengcheng; ILP32E-WITHFP-LABEL: va_double:
1033ac9fe69SWang Pengcheng; ILP32E-WITHFP:       # %bb.0: # %entry
1043ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
1053ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 36
1063ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
1073ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
1083ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -28
1093ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -32
1103ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
1113ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 24
11297982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_remember_state
1133ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
1143ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
1152967e5f8SAlex Bradbury; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
1162967e5f8SAlex Bradbury; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
1172967e5f8SAlex Bradbury; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
1183ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi a0, s0, 4
119*9122c523SPengcheng Wang; ILP32E-WITHFP-NEXT:    addi a1, s0, 11
1203ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
121*9122c523SPengcheng Wang; ILP32E-WITHFP-NEXT:    andi a1, a1, -8
1223ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi a0, a1, 8
1233ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
1243ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw a0, 0(a1)
1253ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw a1, 4(a1)
1263ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lui a3, 262144
1273ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    li a2, 0
1283ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    call __eqdf2
1293ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    bnez a0, .LBB1_2
1303ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:  # %bb.1: # %if.end
13197982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 36
1323ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
1333ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
13497982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_restore ra
13597982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1363ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
13797982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1383ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    ret
1393ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:  .LBB1_2: # %if.then
14097982a8cSdlav-sc; ILP32E-WITHFP-NEXT:    .cfi_restore_state
1413ac9fe69SWang Pengcheng; ILP32E-WITHFP-NEXT:    call abort
1423ac9fe69SWang Pengchengentry:
143ff9af4c4SNikita Popov  %args = alloca ptr, align 4
144ff9af4c4SNikita Popov  %args1 = bitcast ptr %args to ptr
145ff9af4c4SNikita Popov  call void @llvm.va_start(ptr %args1)
146ff9af4c4SNikita Popov  %argp.cur = load ptr, ptr %args, align 4
147ff9af4c4SNikita Popov  %0 = ptrtoint ptr %argp.cur to i32
1483ac9fe69SWang Pengcheng  %1 = add i32 %0, 7
1493ac9fe69SWang Pengcheng  %2 = and i32 %1, -8
150ff9af4c4SNikita Popov  %argp.cur.aligned = inttoptr i32 %2 to ptr
151ff9af4c4SNikita Popov  %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 8
152ff9af4c4SNikita Popov  store ptr %argp.next, ptr %args, align 4
153ff9af4c4SNikita Popov  %3 = bitcast ptr %argp.cur.aligned to ptr
154ff9af4c4SNikita Popov  %4 = load double, ptr %3, align 8
1553ac9fe69SWang Pengcheng  %cmp = fcmp une double %4, 2.000000e+00
1563ac9fe69SWang Pengcheng  br i1 %cmp, label %if.then, label %if.end
1573ac9fe69SWang Pengcheng
1583ac9fe69SWang Pengchengif.then:
1593ac9fe69SWang Pengcheng  call void @abort()
1603ac9fe69SWang Pengcheng  unreachable
1613ac9fe69SWang Pengcheng
1623ac9fe69SWang Pengchengif.end:
163ff9af4c4SNikita Popov  %args2 = bitcast ptr %args to ptr
164ff9af4c4SNikita Popov  call void @llvm.va_end(ptr %args2)
1653ac9fe69SWang Pengcheng  ret void
1663ac9fe69SWang Pengcheng}
167