xref: /llvm-project/llvm/test/CodeGen/RISCV/libcall-tail-calls.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
19e966dd2SAlex Bradbury; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
29e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs -target-abi=ilp32d < %s \
337b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV32-ALL,F-ABI-ALL,D-ABI-ALL,RV32IFD-ILP32D %s
49e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs -target-abi=ilp32f < %s \
537b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV32-ALL,F-ABI-ALL,RV32IF-ILP32F %s
69e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs -target-abi=ilp32 < %s \
737b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV32-ALL,RV32-ILP32-ALL,RV32IFD-ILP32 %s
89e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
937b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV32-ALL,RV32-ILP32-ALL,RV32I-ILP32 %s
109e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -target-abi=lp64d < %s \
1137b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV64-ALL,F-ABI-ALL,D-ABI-ALL,RV64IFD-LP64D %s
129e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs -target-abi=lp64f < %s \
1337b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV64-ALL,F-ABI-ALL,RV64IF-LP64F %s
149e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -target-abi=lp64 < %s \
1537b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV64-ALL,RV64-LP64-ALL,RV64IFD-LP64 %s
169e966dd2SAlex Bradbury; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
1737b474a2SJim Lin; RUN:   | FileCheck -check-prefixes=RV64-ALL,RV64-LP64-ALL,RV64I-LP64 %s
189e966dd2SAlex Bradbury
199e966dd2SAlex Bradbury; This file checks for the backend's ability to tailcall libcalls. While other
209e966dd2SAlex Bradbury; tests exhaustively check for selection of libcalls, this file is focused on
219e966dd2SAlex Bradbury; testing a representative selection of libcalls under all relevant ABI and
229e966dd2SAlex Bradbury; ISA combinations.
239e966dd2SAlex Bradbury
249e966dd2SAlex Bradbury; Integer arithmetic libcalls:
259e966dd2SAlex Bradbury
269e966dd2SAlex Bradburydefine zeroext i8 @udiv8(i8 zeroext %a, i8 zeroext %b) nounwind {
279e966dd2SAlex Bradbury; RV32-ALL-LABEL: udiv8:
289e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
299e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
309e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
31*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __udivsi3
329e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
339e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
349e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
359e966dd2SAlex Bradbury;
369e966dd2SAlex Bradbury; RV64-ALL-LABEL: udiv8:
379e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
389e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
399e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
40*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __udivdi3
419e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
429e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
439e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
449e966dd2SAlex Bradbury  %1 = udiv i8 %a, %b
459e966dd2SAlex Bradbury  ret i8 %1
469e966dd2SAlex Bradbury}
479e966dd2SAlex Bradbury
489e966dd2SAlex Bradburydefine signext i16 @sdiv16(i16 signext %a, i16 signext %b) nounwind {
499e966dd2SAlex Bradbury; RV32-ALL-LABEL: sdiv16:
509e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
519e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
529e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
53*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __divsi3
549e966dd2SAlex Bradbury; RV32-ALL-NEXT:    slli a0, a0, 16
559e966dd2SAlex Bradbury; RV32-ALL-NEXT:    srai a0, a0, 16
569e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
579e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
589e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
599e966dd2SAlex Bradbury;
609e966dd2SAlex Bradbury; RV64-ALL-LABEL: sdiv16:
619e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
629e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
639e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
64*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __divdi3
659e966dd2SAlex Bradbury; RV64-ALL-NEXT:    slli a0, a0, 48
669e966dd2SAlex Bradbury; RV64-ALL-NEXT:    srai a0, a0, 48
679e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
689e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
699e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
709e966dd2SAlex Bradbury  %1 = sdiv i16 %a, %b
719e966dd2SAlex Bradbury  ret i16 %1
729e966dd2SAlex Bradbury}
739e966dd2SAlex Bradbury
749e966dd2SAlex Bradburydefine signext i32 @mul32(i32 %a, i32 %b) nounwind {
759e966dd2SAlex Bradbury; RV32-ALL-LABEL: mul32:
769e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
779e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
789e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
79*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __mulsi3
809e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
819e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
829e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
839e966dd2SAlex Bradbury;
849e966dd2SAlex Bradbury; RV64-ALL-LABEL: mul32:
859e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
869e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
879e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
88*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __muldi3
899e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sext.w a0, a0
909e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
919e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
929e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
939e966dd2SAlex Bradbury  %1 = mul i32 %a, %b
949e966dd2SAlex Bradbury  ret i32 %1
959e966dd2SAlex Bradbury}
969e966dd2SAlex Bradbury
979e966dd2SAlex Bradburydefine i64 @mul64(i64 %a, i64 %b) nounwind {
989e966dd2SAlex Bradbury; RV32-ALL-LABEL: mul64:
999e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
1009e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
1019e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
102*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __muldi3
1039e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1049e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
1059e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
1069e966dd2SAlex Bradbury;
1079e966dd2SAlex Bradbury; RV64-ALL-LABEL: mul64:
1089e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
109*eabaee0cSFangrui Song; RV64-ALL-NEXT:    tail __muldi3
1109e966dd2SAlex Bradbury  %1 = mul i64 %a, %b
1119e966dd2SAlex Bradbury  ret i64 %1
1129e966dd2SAlex Bradbury}
1139e966dd2SAlex Bradbury
1149e966dd2SAlex Bradbury; Half libcalls:
1159e966dd2SAlex Bradbury
1169e966dd2SAlex Bradburydeclare half @llvm.sin.f16(half)
1179e966dd2SAlex Bradbury
1189e966dd2SAlex Bradburydefine half @sin_f16(half %a) nounwind {
1199e966dd2SAlex Bradbury; RV32IFD-ILP32D-LABEL: sin_f16:
1209e966dd2SAlex Bradbury; RV32IFD-ILP32D:       # %bb.0:
1219e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    addi sp, sp, -16
1229e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
123*eabaee0cSFangrui Song; RV32IFD-ILP32D-NEXT:    call __extendhfsf2
124*eabaee0cSFangrui Song; RV32IFD-ILP32D-NEXT:    call sinf
125*eabaee0cSFangrui Song; RV32IFD-ILP32D-NEXT:    call __truncsfhf2
1265ba40c7bSAlex Bradbury; RV32IFD-ILP32D-NEXT:    fmv.x.w a0, fa0
1279e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    lui a1, 1048560
1289e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    or a0, a0, a1
1299e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    fmv.w.x fa0, a0
1309e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1319e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    addi sp, sp, 16
1329e966dd2SAlex Bradbury; RV32IFD-ILP32D-NEXT:    ret
1339e966dd2SAlex Bradbury;
1349e966dd2SAlex Bradbury; RV32IF-ILP32F-LABEL: sin_f16:
1359e966dd2SAlex Bradbury; RV32IF-ILP32F:       # %bb.0:
1369e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    addi sp, sp, -16
1379e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
138*eabaee0cSFangrui Song; RV32IF-ILP32F-NEXT:    call __extendhfsf2
139*eabaee0cSFangrui Song; RV32IF-ILP32F-NEXT:    call sinf
140*eabaee0cSFangrui Song; RV32IF-ILP32F-NEXT:    call __truncsfhf2
1415ba40c7bSAlex Bradbury; RV32IF-ILP32F-NEXT:    fmv.x.w a0, fa0
1429e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    lui a1, 1048560
1439e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    or a0, a0, a1
1449e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    fmv.w.x fa0, a0
1459e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1469e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    addi sp, sp, 16
1479e966dd2SAlex Bradbury; RV32IF-ILP32F-NEXT:    ret
1489e966dd2SAlex Bradbury;
1499e966dd2SAlex Bradbury; RV32IFD-ILP32-LABEL: sin_f16:
1509e966dd2SAlex Bradbury; RV32IFD-ILP32:       # %bb.0:
1519e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    addi sp, sp, -16
1529e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
153*eabaee0cSFangrui Song; RV32IFD-ILP32-NEXT:    call __extendhfsf2
154*eabaee0cSFangrui Song; RV32IFD-ILP32-NEXT:    call sinf
155*eabaee0cSFangrui Song; RV32IFD-ILP32-NEXT:    call __truncsfhf2
1569e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    lui a1, 1048560
1579e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    or a0, a0, a1
1589e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1599e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    addi sp, sp, 16
1609e966dd2SAlex Bradbury; RV32IFD-ILP32-NEXT:    ret
1619e966dd2SAlex Bradbury;
1629e966dd2SAlex Bradbury; RV32I-ILP32-LABEL: sin_f16:
1639e966dd2SAlex Bradbury; RV32I-ILP32:       # %bb.0:
1649e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
1659e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1669e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    slli a0, a0, 16
1679e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    srli a0, a0, 16
168*eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __extendhfsf2
169*eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call sinf
170*eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __truncsfhf2
1719e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1729e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
1739e966dd2SAlex Bradbury; RV32I-ILP32-NEXT:    ret
1749e966dd2SAlex Bradbury;
1759e966dd2SAlex Bradbury; RV64IFD-LP64D-LABEL: sin_f16:
1769e966dd2SAlex Bradbury; RV64IFD-LP64D:       # %bb.0:
1779e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    addi sp, sp, -16
1789e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
179*eabaee0cSFangrui Song; RV64IFD-LP64D-NEXT:    call __extendhfsf2
180*eabaee0cSFangrui Song; RV64IFD-LP64D-NEXT:    call sinf
181*eabaee0cSFangrui Song; RV64IFD-LP64D-NEXT:    call __truncsfhf2
1825ba40c7bSAlex Bradbury; RV64IFD-LP64D-NEXT:    fmv.x.w a0, fa0
1839e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    lui a1, 1048560
1849e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    or a0, a0, a1
1859e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    fmv.w.x fa0, a0
1869e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1879e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    addi sp, sp, 16
1889e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ret
1899e966dd2SAlex Bradbury;
1909e966dd2SAlex Bradbury; RV64IF-LP64F-LABEL: sin_f16:
1919e966dd2SAlex Bradbury; RV64IF-LP64F:       # %bb.0:
1929e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, -16
1939e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
194*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call __extendhfsf2
195*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call sinf
196*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call __truncsfhf2
1975ba40c7bSAlex Bradbury; RV64IF-LP64F-NEXT:    fmv.x.w a0, fa0
1989e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    lui a1, 1048560
1999e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    or a0, a0, a1
2009e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    fmv.w.x fa0, a0
2019e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2029e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, 16
2039e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ret
2049e966dd2SAlex Bradbury;
2059e966dd2SAlex Bradbury; RV64IFD-LP64-LABEL: sin_f16:
2069e966dd2SAlex Bradbury; RV64IFD-LP64:       # %bb.0:
2079e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    addi sp, sp, -16
2089e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
209*eabaee0cSFangrui Song; RV64IFD-LP64-NEXT:    call __extendhfsf2
210*eabaee0cSFangrui Song; RV64IFD-LP64-NEXT:    call sinf
211*eabaee0cSFangrui Song; RV64IFD-LP64-NEXT:    call __truncsfhf2
2129e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    lui a1, 1048560
2139e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    or a0, a0, a1
2149e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2159e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    addi sp, sp, 16
2169e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    ret
2179e966dd2SAlex Bradbury;
2189e966dd2SAlex Bradbury; RV64I-LP64-LABEL: sin_f16:
2199e966dd2SAlex Bradbury; RV64I-LP64:       # %bb.0:
2209e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
2219e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2229e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    slli a0, a0, 48
2239e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    srli a0, a0, 48
224*eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __extendhfsf2
225*eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call sinf
226*eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __truncsfhf2
2279e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2289e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
2299e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    ret
2309e966dd2SAlex Bradbury  %1 = call half @llvm.sin.f16(half %a)
2319e966dd2SAlex Bradbury  ret half %1
2329e966dd2SAlex Bradbury}
2339e966dd2SAlex Bradbury
2349e966dd2SAlex Bradbury; Float libcalls:
2359e966dd2SAlex Bradbury
2369e966dd2SAlex Bradburydeclare float @llvm.sin.f32(float)
2379e966dd2SAlex Bradbury
2389e966dd2SAlex Bradburydefine float @sin_f32(float %a) nounwind {
23947b1f836SAlex Bradbury; F-ABI-ALL-LABEL: sin_f32:
24047b1f836SAlex Bradbury; F-ABI-ALL:       # %bb.0:
241*eabaee0cSFangrui Song; F-ABI-ALL-NEXT:    tail sinf
2429e966dd2SAlex Bradbury;
243d255e0f9SLuke Lau; RV32IFD-ILP32-LABEL: sin_f32:
244d255e0f9SLuke Lau; RV32IFD-ILP32:       # %bb.0:
245*eabaee0cSFangrui Song; RV32IFD-ILP32-NEXT:    tail sinf
246d255e0f9SLuke Lau;
247d255e0f9SLuke Lau; RV32I-ILP32-LABEL: sin_f32:
248d255e0f9SLuke Lau; RV32I-ILP32:       # %bb.0:
249d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    addi sp, sp, -16
250d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
251*eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call sinf
252d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
253d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    addi sp, sp, 16
254d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    ret
25547b1f836SAlex Bradbury;
25647b1f836SAlex Bradbury; RV64-LP64-ALL-LABEL: sin_f32:
25747b1f836SAlex Bradbury; RV64-LP64-ALL:       # %bb.0:
25847b1f836SAlex Bradbury; RV64-LP64-ALL-NEXT:    addi sp, sp, -16
25947b1f836SAlex Bradbury; RV64-LP64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
260*eabaee0cSFangrui Song; RV64-LP64-ALL-NEXT:    call sinf
26147b1f836SAlex Bradbury; RV64-LP64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
26247b1f836SAlex Bradbury; RV64-LP64-ALL-NEXT:    addi sp, sp, 16
26347b1f836SAlex Bradbury; RV64-LP64-ALL-NEXT:    ret
2649e966dd2SAlex Bradbury  %1 = call float @llvm.sin.f32(float %a)
2659e966dd2SAlex Bradbury  ret float %1
2669e966dd2SAlex Bradbury}
2679e966dd2SAlex Bradbury
2689e966dd2SAlex Bradburydeclare float @llvm.powi.f32.i32(float, i32)
2699e966dd2SAlex Bradbury
2709e966dd2SAlex Bradburydefine float @powi_f32(float %a, i32 %b) nounwind {
27147b1f836SAlex Bradbury; RV32IFD-ILP32D-LABEL: powi_f32:
27247b1f836SAlex Bradbury; RV32IFD-ILP32D:       # %bb.0:
273*eabaee0cSFangrui Song; RV32IFD-ILP32D-NEXT:    tail __powisf2
27447b1f836SAlex Bradbury;
27547b1f836SAlex Bradbury; RV32IF-ILP32F-LABEL: powi_f32:
27647b1f836SAlex Bradbury; RV32IF-ILP32F:       # %bb.0:
277*eabaee0cSFangrui Song; RV32IF-ILP32F-NEXT:    tail __powisf2
27847b1f836SAlex Bradbury;
279d255e0f9SLuke Lau; RV32IFD-ILP32-LABEL: powi_f32:
280d255e0f9SLuke Lau; RV32IFD-ILP32:       # %bb.0:
281*eabaee0cSFangrui Song; RV32IFD-ILP32-NEXT:    tail __powisf2
282d255e0f9SLuke Lau;
283d255e0f9SLuke Lau; RV32I-ILP32-LABEL: powi_f32:
284d255e0f9SLuke Lau; RV32I-ILP32:       # %bb.0:
285d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    addi sp, sp, -16
286d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
287*eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __powisf2
288d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
289d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    addi sp, sp, 16
290d255e0f9SLuke Lau; RV32I-ILP32-NEXT:    ret
2919e966dd2SAlex Bradbury;
2929e966dd2SAlex Bradbury; RV64IFD-LP64D-LABEL: powi_f32:
2939e966dd2SAlex Bradbury; RV64IFD-LP64D:       # %bb.0:
2949e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    addi sp, sp, -16
2959e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2969e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    sext.w a0, a0
297*eabaee0cSFangrui Song; RV64IFD-LP64D-NEXT:    call __powisf2
2989e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2999e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    addi sp, sp, 16
3009e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ret
3019e966dd2SAlex Bradbury;
3029e966dd2SAlex Bradbury; RV64IF-LP64F-LABEL: powi_f32:
3039e966dd2SAlex Bradbury; RV64IF-LP64F:       # %bb.0:
3049e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, -16
3059e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3069e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    sext.w a0, a0
307*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call __powisf2
3089e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3099e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, 16
3109e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ret
3119e966dd2SAlex Bradbury;
3129e966dd2SAlex Bradbury; RV64-LP64-ALL-LABEL: powi_f32:
3139e966dd2SAlex Bradbury; RV64-LP64-ALL:       # %bb.0:
3149e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    addi sp, sp, -16
3159e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3169e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    sext.w a1, a1
317*eabaee0cSFangrui Song; RV64-LP64-ALL-NEXT:    call __powisf2
3189e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3199e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    addi sp, sp, 16
3209e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    ret
3219e966dd2SAlex Bradbury  %1 = call float @llvm.powi.f32.i32(float %a, i32 %b)
3229e966dd2SAlex Bradbury  ret float %1
3239e966dd2SAlex Bradbury}
3249e966dd2SAlex Bradbury
3259e966dd2SAlex Bradburydeclare i64 @llvm.llround.i64.f32(float)
3269e966dd2SAlex Bradbury
3279e966dd2SAlex Bradburydefine i64 @llround_f32(float %a) nounwind {
3289e966dd2SAlex Bradbury; RV32-ALL-LABEL: llround_f32:
3299e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
3309e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
3319e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
332*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call llroundf
3339e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3349e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
3359e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
3369e966dd2SAlex Bradbury;
3379e966dd2SAlex Bradbury; RV64IFD-LP64D-LABEL: llround_f32:
3389e966dd2SAlex Bradbury; RV64IFD-LP64D:       # %bb.0:
3399e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    fcvt.l.s a0, fa0, rmm
3409e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ret
3419e966dd2SAlex Bradbury;
3429e966dd2SAlex Bradbury; RV64IF-LP64F-LABEL: llround_f32:
3439e966dd2SAlex Bradbury; RV64IF-LP64F:       # %bb.0:
3449e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    fcvt.l.s a0, fa0, rmm
3459e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ret
3469e966dd2SAlex Bradbury;
3479e966dd2SAlex Bradbury; RV64IFD-LP64-LABEL: llround_f32:
3489e966dd2SAlex Bradbury; RV64IFD-LP64:       # %bb.0:
3497b0c4184SCraig Topper; RV64IFD-LP64-NEXT:    fmv.w.x fa5, a0
3507b0c4184SCraig Topper; RV64IFD-LP64-NEXT:    fcvt.l.s a0, fa5, rmm
3519e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    ret
3529e966dd2SAlex Bradbury;
3539e966dd2SAlex Bradbury; RV64I-LP64-LABEL: llround_f32:
3549e966dd2SAlex Bradbury; RV64I-LP64:       # %bb.0:
3559e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
3569e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
357*eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call llroundf
3589e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3599e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
3609e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    ret
3619e966dd2SAlex Bradbury  %1 = call i64 @llvm.llround.i64.f32(float %a)
3629e966dd2SAlex Bradbury  ret i64 %1
3639e966dd2SAlex Bradbury}
3649e966dd2SAlex Bradbury
3659e966dd2SAlex Bradbury; Double libcalls:
3669e966dd2SAlex Bradbury
3679e966dd2SAlex Bradburydeclare double @llvm.sin.f64(double)
3689e966dd2SAlex Bradbury
3699e966dd2SAlex Bradburydefine double @sin_f64(double %a) nounwind {
37047b1f836SAlex Bradbury; D-ABI-ALL-LABEL: sin_f64:
37147b1f836SAlex Bradbury; D-ABI-ALL:       # %bb.0:
372*eabaee0cSFangrui Song; D-ABI-ALL-NEXT:    tail sin
3739e966dd2SAlex Bradbury;
37447b1f836SAlex Bradbury; RV32IF-ILP32F-LABEL: sin_f64:
37547b1f836SAlex Bradbury; RV32IF-ILP32F:       # %bb.0:
37647b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    addi sp, sp, -16
37747b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
378*eabaee0cSFangrui Song; RV32IF-ILP32F-NEXT:    call sin
37947b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
38047b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    addi sp, sp, 16
38147b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    ret
38247b1f836SAlex Bradbury;
38347b1f836SAlex Bradbury; RV32-ILP32-ALL-LABEL: sin_f64:
38447b1f836SAlex Bradbury; RV32-ILP32-ALL:       # %bb.0:
38547b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    addi sp, sp, -16
38647b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
387*eabaee0cSFangrui Song; RV32-ILP32-ALL-NEXT:    call sin
38847b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
38947b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    addi sp, sp, 16
39047b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    ret
39147b1f836SAlex Bradbury;
39247b1f836SAlex Bradbury; RV64IF-LP64F-LABEL: sin_f64:
39347b1f836SAlex Bradbury; RV64IF-LP64F:       # %bb.0:
39447b1f836SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, -16
39547b1f836SAlex Bradbury; RV64IF-LP64F-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
396*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call sin
39747b1f836SAlex Bradbury; RV64IF-LP64F-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
39847b1f836SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, 16
39947b1f836SAlex Bradbury; RV64IF-LP64F-NEXT:    ret
40047b1f836SAlex Bradbury;
401d255e0f9SLuke Lau; RV64IFD-LP64-LABEL: sin_f64:
402d255e0f9SLuke Lau; RV64IFD-LP64:       # %bb.0:
403*eabaee0cSFangrui Song; RV64IFD-LP64-NEXT:    tail sin
404d255e0f9SLuke Lau;
405d255e0f9SLuke Lau; RV64I-LP64-LABEL: sin_f64:
406d255e0f9SLuke Lau; RV64I-LP64:       # %bb.0:
407d255e0f9SLuke Lau; RV64I-LP64-NEXT:    addi sp, sp, -16
408d255e0f9SLuke Lau; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
409*eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call sin
410d255e0f9SLuke Lau; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
411d255e0f9SLuke Lau; RV64I-LP64-NEXT:    addi sp, sp, 16
412d255e0f9SLuke Lau; RV64I-LP64-NEXT:    ret
4139e966dd2SAlex Bradbury  %1 = call double @llvm.sin.f64(double %a)
4149e966dd2SAlex Bradbury  ret double %1
4159e966dd2SAlex Bradbury}
4169e966dd2SAlex Bradbury
4179e966dd2SAlex Bradburydeclare double @llvm.powi.f64.i32(double, i32)
4189e966dd2SAlex Bradbury
4199e966dd2SAlex Bradburydefine double @powi_f64(double %a, i32 %b) nounwind {
42047b1f836SAlex Bradbury; RV32IFD-ILP32D-LABEL: powi_f64:
42147b1f836SAlex Bradbury; RV32IFD-ILP32D:       # %bb.0:
422*eabaee0cSFangrui Song; RV32IFD-ILP32D-NEXT:    tail __powidf2
42347b1f836SAlex Bradbury;
42447b1f836SAlex Bradbury; RV32IF-ILP32F-LABEL: powi_f64:
42547b1f836SAlex Bradbury; RV32IF-ILP32F:       # %bb.0:
42647b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    addi sp, sp, -16
42747b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
428*eabaee0cSFangrui Song; RV32IF-ILP32F-NEXT:    call __powidf2
42947b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
43047b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    addi sp, sp, 16
43147b1f836SAlex Bradbury; RV32IF-ILP32F-NEXT:    ret
43247b1f836SAlex Bradbury;
43347b1f836SAlex Bradbury; RV32-ILP32-ALL-LABEL: powi_f64:
43447b1f836SAlex Bradbury; RV32-ILP32-ALL:       # %bb.0:
43547b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    addi sp, sp, -16
43647b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
437*eabaee0cSFangrui Song; RV32-ILP32-ALL-NEXT:    call __powidf2
43847b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
43947b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    addi sp, sp, 16
44047b1f836SAlex Bradbury; RV32-ILP32-ALL-NEXT:    ret
4419e966dd2SAlex Bradbury;
4429e966dd2SAlex Bradbury; RV64IFD-LP64D-LABEL: powi_f64:
4439e966dd2SAlex Bradbury; RV64IFD-LP64D:       # %bb.0:
4449e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    addi sp, sp, -16
4459e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4469e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    sext.w a0, a0
447*eabaee0cSFangrui Song; RV64IFD-LP64D-NEXT:    call __powidf2
4489e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4499e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    addi sp, sp, 16
4509e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ret
4519e966dd2SAlex Bradbury;
4529e966dd2SAlex Bradbury; RV64IF-LP64F-LABEL: powi_f64:
4539e966dd2SAlex Bradbury; RV64IF-LP64F:       # %bb.0:
4549e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, -16
4559e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4569e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    sext.w a1, a1
457*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call __powidf2
4589e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4599e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, 16
4609e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ret
4619e966dd2SAlex Bradbury;
4629e966dd2SAlex Bradbury; RV64-LP64-ALL-LABEL: powi_f64:
4639e966dd2SAlex Bradbury; RV64-LP64-ALL:       # %bb.0:
4649e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    addi sp, sp, -16
4659e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4669e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    sext.w a1, a1
467*eabaee0cSFangrui Song; RV64-LP64-ALL-NEXT:    call __powidf2
4689e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4699e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    addi sp, sp, 16
4709e966dd2SAlex Bradbury; RV64-LP64-ALL-NEXT:    ret
4719e966dd2SAlex Bradbury  %1 = call double @llvm.powi.f64.i32(double %a, i32 %b)
4729e966dd2SAlex Bradbury  ret double %1
4739e966dd2SAlex Bradbury}
4749e966dd2SAlex Bradbury
4759e966dd2SAlex Bradburydeclare i64 @llvm.llround.i64.f64(double)
4769e966dd2SAlex Bradbury
4779e966dd2SAlex Bradburydefine i64 @llround_f64(double %a) nounwind {
4789e966dd2SAlex Bradbury; RV32-ALL-LABEL: llround_f64:
4799e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
4809e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
4819e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
482*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call llround
4839e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4849e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
4859e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
4869e966dd2SAlex Bradbury;
4879e966dd2SAlex Bradbury; RV64IFD-LP64D-LABEL: llround_f64:
4889e966dd2SAlex Bradbury; RV64IFD-LP64D:       # %bb.0:
4899e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    fcvt.l.d a0, fa0, rmm
4909e966dd2SAlex Bradbury; RV64IFD-LP64D-NEXT:    ret
4919e966dd2SAlex Bradbury;
4929e966dd2SAlex Bradbury; RV64IF-LP64F-LABEL: llround_f64:
4939e966dd2SAlex Bradbury; RV64IF-LP64F:       # %bb.0:
4949e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, -16
4959e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
496*eabaee0cSFangrui Song; RV64IF-LP64F-NEXT:    call llround
4979e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4989e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    addi sp, sp, 16
4999e966dd2SAlex Bradbury; RV64IF-LP64F-NEXT:    ret
5009e966dd2SAlex Bradbury;
5019e966dd2SAlex Bradbury; RV64IFD-LP64-LABEL: llround_f64:
5029e966dd2SAlex Bradbury; RV64IFD-LP64:       # %bb.0:
5037b0c4184SCraig Topper; RV64IFD-LP64-NEXT:    fmv.d.x fa5, a0
5047b0c4184SCraig Topper; RV64IFD-LP64-NEXT:    fcvt.l.d a0, fa5, rmm
5059e966dd2SAlex Bradbury; RV64IFD-LP64-NEXT:    ret
5069e966dd2SAlex Bradbury;
5079e966dd2SAlex Bradbury; RV64I-LP64-LABEL: llround_f64:
5089e966dd2SAlex Bradbury; RV64I-LP64:       # %bb.0:
5099e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
5109e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
511*eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call llround
5129e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5139e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
5149e966dd2SAlex Bradbury; RV64I-LP64-NEXT:    ret
5159e966dd2SAlex Bradbury  %1 = call i64 @llvm.llround.i64.f64(double %a)
5169e966dd2SAlex Bradbury  ret i64 %1
5179e966dd2SAlex Bradbury}
5189e966dd2SAlex Bradbury
5199e966dd2SAlex Bradbury; Atomics libcalls:
5209e966dd2SAlex Bradbury
5211456b686SNikita Popovdefine i8 @atomic_load_i8_unordered(ptr %a) nounwind {
5229e966dd2SAlex Bradbury; RV32-ALL-LABEL: atomic_load_i8_unordered:
5239e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
5249e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
5259e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5269e966dd2SAlex Bradbury; RV32-ALL-NEXT:    li a1, 0
527*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __atomic_load_1
5289e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5299e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
5309e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
5319e966dd2SAlex Bradbury;
5329e966dd2SAlex Bradbury; RV64-ALL-LABEL: atomic_load_i8_unordered:
5339e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
5349e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
5359e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5369e966dd2SAlex Bradbury; RV64-ALL-NEXT:    li a1, 0
537*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __atomic_load_1
5389e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5399e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
5409e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
5411456b686SNikita Popov  %1 = load atomic i8, ptr %a unordered, align 1
5429e966dd2SAlex Bradbury  ret i8 %1
5439e966dd2SAlex Bradbury}
5449e966dd2SAlex Bradbury
5451456b686SNikita Popovdefine i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {
5469e966dd2SAlex Bradbury; RV32-ALL-LABEL: atomicrmw_add_i16_release:
5479e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
5489e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
5499e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5509e966dd2SAlex Bradbury; RV32-ALL-NEXT:    li a2, 3
551*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __atomic_fetch_add_2
5529e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5539e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
5549e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
5559e966dd2SAlex Bradbury;
5569e966dd2SAlex Bradbury; RV64-ALL-LABEL: atomicrmw_add_i16_release:
5579e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
5589e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
5599e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5609e966dd2SAlex Bradbury; RV64-ALL-NEXT:    li a2, 3
561*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __atomic_fetch_add_2
5629e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5639e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
5649e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
5651456b686SNikita Popov  %1 = atomicrmw add ptr %a, i16 %b release
5669e966dd2SAlex Bradbury  ret i16 %1
5679e966dd2SAlex Bradbury}
5689e966dd2SAlex Bradbury
5691456b686SNikita Popovdefine i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind {
5709e966dd2SAlex Bradbury; RV32-ALL-LABEL: atomicrmw_xor_i32_acq_rel:
5719e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
5729e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
5739e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5749e966dd2SAlex Bradbury; RV32-ALL-NEXT:    li a2, 4
575*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __atomic_fetch_xor_4
5769e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5779e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
5789e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
5799e966dd2SAlex Bradbury;
5809e966dd2SAlex Bradbury; RV64-ALL-LABEL: atomicrmw_xor_i32_acq_rel:
5819e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
5829e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
5839e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5849e966dd2SAlex Bradbury; RV64-ALL-NEXT:    li a2, 4
585*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __atomic_fetch_xor_4
5869e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5879e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
5889e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
5891456b686SNikita Popov  %1 = atomicrmw xor ptr %a, i32 %b acq_rel
5909e966dd2SAlex Bradbury  ret i32 %1
5919e966dd2SAlex Bradbury}
5929e966dd2SAlex Bradbury
5931456b686SNikita Popovdefine i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
5949e966dd2SAlex Bradbury; RV32-ALL-LABEL: atomicrmw_nand_i64_seq_cst:
5959e966dd2SAlex Bradbury; RV32-ALL:       # %bb.0:
5969e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, -16
5979e966dd2SAlex Bradbury; RV32-ALL-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5989e966dd2SAlex Bradbury; RV32-ALL-NEXT:    li a3, 5
599*eabaee0cSFangrui Song; RV32-ALL-NEXT:    call __atomic_fetch_nand_8
6009e966dd2SAlex Bradbury; RV32-ALL-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6019e966dd2SAlex Bradbury; RV32-ALL-NEXT:    addi sp, sp, 16
6029e966dd2SAlex Bradbury; RV32-ALL-NEXT:    ret
6039e966dd2SAlex Bradbury;
6049e966dd2SAlex Bradbury; RV64-ALL-LABEL: atomicrmw_nand_i64_seq_cst:
6059e966dd2SAlex Bradbury; RV64-ALL:       # %bb.0:
6069e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, -16
6079e966dd2SAlex Bradbury; RV64-ALL-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6089e966dd2SAlex Bradbury; RV64-ALL-NEXT:    li a2, 5
609*eabaee0cSFangrui Song; RV64-ALL-NEXT:    call __atomic_fetch_nand_8
6109e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6119e966dd2SAlex Bradbury; RV64-ALL-NEXT:    addi sp, sp, 16
6129e966dd2SAlex Bradbury; RV64-ALL-NEXT:    ret
6131456b686SNikita Popov  %1 = atomicrmw nand ptr %a, i64 %b seq_cst
6149e966dd2SAlex Bradbury  ret i64 %1
6159e966dd2SAlex Bradbury}
616