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