602 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs -target-abi=ilp32d < %s \3; RUN: | FileCheck -check-prefixes=RV32-ALL,F-ABI-ALL,D-ABI-ALL,RV32IFD-ILP32D %s4; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs -target-abi=ilp32f < %s \5; RUN: | FileCheck -check-prefixes=RV32-ALL,F-ABI-ALL,RV32IF-ILP32F %s6; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs -target-abi=ilp32 < %s \7; RUN: | FileCheck -check-prefixes=RV32-ALL,RV32-ILP32-ALL,RV32IFD-ILP32 %s8; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefixes=RV32-ALL,RV32-ILP32-ALL,RV32I-ILP32 %s10; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -target-abi=lp64d < %s \11; RUN: | FileCheck -check-prefixes=RV64-ALL,F-ABI-ALL,D-ABI-ALL,RV64IFD-LP64D %s12; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs -target-abi=lp64f < %s \13; RUN: | FileCheck -check-prefixes=RV64-ALL,F-ABI-ALL,RV64IF-LP64F %s14; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -target-abi=lp64 < %s \15; RUN: | FileCheck -check-prefixes=RV64-ALL,RV64-LP64-ALL,RV64IFD-LP64 %s16; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \17; RUN: | FileCheck -check-prefixes=RV64-ALL,RV64-LP64-ALL,RV64I-LP64 %s18 19; This file checks for the backend's ability to tailcall libcalls. While other20; tests exhaustively check for selection of libcalls, this file is focused on21; testing a representative selection of libcalls under all relevant ABI and22; ISA combinations.23 24; Integer arithmetic libcalls:25 26define zeroext i8 @udiv8(i8 zeroext %a, i8 zeroext %b) nounwind {27; RV32-ALL-LABEL: udiv8:28; RV32-ALL: # %bb.0:29; RV32-ALL-NEXT: addi sp, sp, -1630; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill31; RV32-ALL-NEXT: call __udivsi332; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload33; RV32-ALL-NEXT: addi sp, sp, 1634; RV32-ALL-NEXT: ret35;36; RV64-ALL-LABEL: udiv8:37; RV64-ALL: # %bb.0:38; RV64-ALL-NEXT: addi sp, sp, -1639; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill40; RV64-ALL-NEXT: call __udivdi341; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload42; RV64-ALL-NEXT: addi sp, sp, 1643; RV64-ALL-NEXT: ret44 %1 = udiv i8 %a, %b45 ret i8 %146}47 48define signext i16 @sdiv16(i16 signext %a, i16 signext %b) nounwind {49; RV32-ALL-LABEL: sdiv16:50; RV32-ALL: # %bb.0:51; RV32-ALL-NEXT: addi sp, sp, -1652; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill53; RV32-ALL-NEXT: call __divsi354; RV32-ALL-NEXT: slli a0, a0, 1655; RV32-ALL-NEXT: srai a0, a0, 1656; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload57; RV32-ALL-NEXT: addi sp, sp, 1658; RV32-ALL-NEXT: ret59;60; RV64-ALL-LABEL: sdiv16:61; RV64-ALL: # %bb.0:62; RV64-ALL-NEXT: addi sp, sp, -1663; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill64; RV64-ALL-NEXT: call __divdi365; RV64-ALL-NEXT: slli a0, a0, 4866; RV64-ALL-NEXT: srai a0, a0, 4867; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload68; RV64-ALL-NEXT: addi sp, sp, 1669; RV64-ALL-NEXT: ret70 %1 = sdiv i16 %a, %b71 ret i16 %172}73 74define signext i32 @mul32(i32 %a, i32 %b) nounwind {75; RV32-ALL-LABEL: mul32:76; RV32-ALL: # %bb.0:77; RV32-ALL-NEXT: addi sp, sp, -1678; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill79; RV32-ALL-NEXT: call __mulsi380; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload81; RV32-ALL-NEXT: addi sp, sp, 1682; RV32-ALL-NEXT: ret83;84; RV64-ALL-LABEL: mul32:85; RV64-ALL: # %bb.0:86; RV64-ALL-NEXT: addi sp, sp, -1687; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill88; RV64-ALL-NEXT: call __muldi389; RV64-ALL-NEXT: sext.w a0, a090; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload91; RV64-ALL-NEXT: addi sp, sp, 1692; RV64-ALL-NEXT: ret93 %1 = mul i32 %a, %b94 ret i32 %195}96 97define i64 @mul64(i64 %a, i64 %b) nounwind {98; RV32-ALL-LABEL: mul64:99; RV32-ALL: # %bb.0:100; RV32-ALL-NEXT: addi sp, sp, -16101; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill102; RV32-ALL-NEXT: call __muldi3103; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload104; RV32-ALL-NEXT: addi sp, sp, 16105; RV32-ALL-NEXT: ret106;107; RV64-ALL-LABEL: mul64:108; RV64-ALL: # %bb.0:109; RV64-ALL-NEXT: tail __muldi3110 %1 = mul i64 %a, %b111 ret i64 %1112}113 114; Half libcalls:115 116define half @sin_f16(half %a) nounwind {117; RV32IFD-ILP32D-LABEL: sin_f16:118; RV32IFD-ILP32D: # %bb.0:119; RV32IFD-ILP32D-NEXT: addi sp, sp, -16120; RV32IFD-ILP32D-NEXT: sw ra, 12(sp) # 4-byte Folded Spill121; RV32IFD-ILP32D-NEXT: call __extendhfsf2122; RV32IFD-ILP32D-NEXT: call sinf123; RV32IFD-ILP32D-NEXT: call __truncsfhf2124; RV32IFD-ILP32D-NEXT: fmv.x.w a0, fa0125; RV32IFD-ILP32D-NEXT: lui a1, 1048560126; RV32IFD-ILP32D-NEXT: or a0, a0, a1127; RV32IFD-ILP32D-NEXT: fmv.w.x fa0, a0128; RV32IFD-ILP32D-NEXT: lw ra, 12(sp) # 4-byte Folded Reload129; RV32IFD-ILP32D-NEXT: addi sp, sp, 16130; RV32IFD-ILP32D-NEXT: ret131;132; RV32IF-ILP32F-LABEL: sin_f16:133; RV32IF-ILP32F: # %bb.0:134; RV32IF-ILP32F-NEXT: addi sp, sp, -16135; RV32IF-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill136; RV32IF-ILP32F-NEXT: call __extendhfsf2137; RV32IF-ILP32F-NEXT: call sinf138; RV32IF-ILP32F-NEXT: call __truncsfhf2139; RV32IF-ILP32F-NEXT: fmv.x.w a0, fa0140; RV32IF-ILP32F-NEXT: lui a1, 1048560141; RV32IF-ILP32F-NEXT: or a0, a0, a1142; RV32IF-ILP32F-NEXT: fmv.w.x fa0, a0143; RV32IF-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload144; RV32IF-ILP32F-NEXT: addi sp, sp, 16145; RV32IF-ILP32F-NEXT: ret146;147; RV32IFD-ILP32-LABEL: sin_f16:148; RV32IFD-ILP32: # %bb.0:149; RV32IFD-ILP32-NEXT: addi sp, sp, -16150; RV32IFD-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill151; RV32IFD-ILP32-NEXT: call __extendhfsf2152; RV32IFD-ILP32-NEXT: call sinf153; RV32IFD-ILP32-NEXT: call __truncsfhf2154; RV32IFD-ILP32-NEXT: lui a1, 1048560155; RV32IFD-ILP32-NEXT: or a0, a0, a1156; RV32IFD-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload157; RV32IFD-ILP32-NEXT: addi sp, sp, 16158; RV32IFD-ILP32-NEXT: ret159;160; RV32I-ILP32-LABEL: sin_f16:161; RV32I-ILP32: # %bb.0:162; RV32I-ILP32-NEXT: addi sp, sp, -16163; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill164; RV32I-ILP32-NEXT: slli a0, a0, 16165; RV32I-ILP32-NEXT: srli a0, a0, 16166; RV32I-ILP32-NEXT: call __extendhfsf2167; RV32I-ILP32-NEXT: call sinf168; RV32I-ILP32-NEXT: call __truncsfhf2169; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload170; RV32I-ILP32-NEXT: addi sp, sp, 16171; RV32I-ILP32-NEXT: ret172;173; RV64IFD-LP64D-LABEL: sin_f16:174; RV64IFD-LP64D: # %bb.0:175; RV64IFD-LP64D-NEXT: addi sp, sp, -16176; RV64IFD-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill177; RV64IFD-LP64D-NEXT: call __extendhfsf2178; RV64IFD-LP64D-NEXT: call sinf179; RV64IFD-LP64D-NEXT: call __truncsfhf2180; RV64IFD-LP64D-NEXT: fmv.x.w a0, fa0181; RV64IFD-LP64D-NEXT: lui a1, 1048560182; RV64IFD-LP64D-NEXT: or a0, a0, a1183; RV64IFD-LP64D-NEXT: fmv.w.x fa0, a0184; RV64IFD-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload185; RV64IFD-LP64D-NEXT: addi sp, sp, 16186; RV64IFD-LP64D-NEXT: ret187;188; RV64IF-LP64F-LABEL: sin_f16:189; RV64IF-LP64F: # %bb.0:190; RV64IF-LP64F-NEXT: addi sp, sp, -16191; RV64IF-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill192; RV64IF-LP64F-NEXT: call __extendhfsf2193; RV64IF-LP64F-NEXT: call sinf194; RV64IF-LP64F-NEXT: call __truncsfhf2195; RV64IF-LP64F-NEXT: fmv.x.w a0, fa0196; RV64IF-LP64F-NEXT: lui a1, 1048560197; RV64IF-LP64F-NEXT: or a0, a0, a1198; RV64IF-LP64F-NEXT: fmv.w.x fa0, a0199; RV64IF-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload200; RV64IF-LP64F-NEXT: addi sp, sp, 16201; RV64IF-LP64F-NEXT: ret202;203; RV64IFD-LP64-LABEL: sin_f16:204; RV64IFD-LP64: # %bb.0:205; RV64IFD-LP64-NEXT: addi sp, sp, -16206; RV64IFD-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill207; RV64IFD-LP64-NEXT: call __extendhfsf2208; RV64IFD-LP64-NEXT: call sinf209; RV64IFD-LP64-NEXT: call __truncsfhf2210; RV64IFD-LP64-NEXT: lui a1, 1048560211; RV64IFD-LP64-NEXT: or a0, a0, a1212; RV64IFD-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload213; RV64IFD-LP64-NEXT: addi sp, sp, 16214; RV64IFD-LP64-NEXT: ret215;216; RV64I-LP64-LABEL: sin_f16:217; RV64I-LP64: # %bb.0:218; RV64I-LP64-NEXT: addi sp, sp, -16219; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill220; RV64I-LP64-NEXT: slli a0, a0, 48221; RV64I-LP64-NEXT: srli a0, a0, 48222; RV64I-LP64-NEXT: call __extendhfsf2223; RV64I-LP64-NEXT: call sinf224; RV64I-LP64-NEXT: call __truncsfhf2225; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload226; RV64I-LP64-NEXT: addi sp, sp, 16227; RV64I-LP64-NEXT: ret228 %1 = call half @llvm.sin.f16(half %a)229 ret half %1230}231 232; Float libcalls:233 234define float @sin_f32(float %a) nounwind {235; F-ABI-ALL-LABEL: sin_f32:236; F-ABI-ALL: # %bb.0:237; F-ABI-ALL-NEXT: tail sinf238;239; RV32IFD-ILP32-LABEL: sin_f32:240; RV32IFD-ILP32: # %bb.0:241; RV32IFD-ILP32-NEXT: tail sinf242;243; RV32I-ILP32-LABEL: sin_f32:244; RV32I-ILP32: # %bb.0:245; RV32I-ILP32-NEXT: addi sp, sp, -16246; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill247; RV32I-ILP32-NEXT: call sinf248; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload249; RV32I-ILP32-NEXT: addi sp, sp, 16250; RV32I-ILP32-NEXT: ret251;252; RV64-LP64-ALL-LABEL: sin_f32:253; RV64-LP64-ALL: # %bb.0:254; RV64-LP64-ALL-NEXT: addi sp, sp, -16255; RV64-LP64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill256; RV64-LP64-ALL-NEXT: call sinf257; RV64-LP64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload258; RV64-LP64-ALL-NEXT: addi sp, sp, 16259; RV64-LP64-ALL-NEXT: ret260 %1 = call float @llvm.sin.f32(float %a)261 ret float %1262}263 264define float @powi_f32(float %a, i32 %b) nounwind {265; RV32IFD-ILP32D-LABEL: powi_f32:266; RV32IFD-ILP32D: # %bb.0:267; RV32IFD-ILP32D-NEXT: tail __powisf2268;269; RV32IF-ILP32F-LABEL: powi_f32:270; RV32IF-ILP32F: # %bb.0:271; RV32IF-ILP32F-NEXT: tail __powisf2272;273; RV32IFD-ILP32-LABEL: powi_f32:274; RV32IFD-ILP32: # %bb.0:275; RV32IFD-ILP32-NEXT: tail __powisf2276;277; RV32I-ILP32-LABEL: powi_f32:278; RV32I-ILP32: # %bb.0:279; RV32I-ILP32-NEXT: addi sp, sp, -16280; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill281; RV32I-ILP32-NEXT: call __powisf2282; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload283; RV32I-ILP32-NEXT: addi sp, sp, 16284; RV32I-ILP32-NEXT: ret285;286; RV64IFD-LP64D-LABEL: powi_f32:287; RV64IFD-LP64D: # %bb.0:288; RV64IFD-LP64D-NEXT: addi sp, sp, -16289; RV64IFD-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill290; RV64IFD-LP64D-NEXT: sext.w a0, a0291; RV64IFD-LP64D-NEXT: call __powisf2292; RV64IFD-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload293; RV64IFD-LP64D-NEXT: addi sp, sp, 16294; RV64IFD-LP64D-NEXT: ret295;296; RV64IF-LP64F-LABEL: powi_f32:297; RV64IF-LP64F: # %bb.0:298; RV64IF-LP64F-NEXT: addi sp, sp, -16299; RV64IF-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill300; RV64IF-LP64F-NEXT: sext.w a0, a0301; RV64IF-LP64F-NEXT: call __powisf2302; RV64IF-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload303; RV64IF-LP64F-NEXT: addi sp, sp, 16304; RV64IF-LP64F-NEXT: ret305;306; RV64-LP64-ALL-LABEL: powi_f32:307; RV64-LP64-ALL: # %bb.0:308; RV64-LP64-ALL-NEXT: addi sp, sp, -16309; RV64-LP64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill310; RV64-LP64-ALL-NEXT: sext.w a1, a1311; RV64-LP64-ALL-NEXT: call __powisf2312; RV64-LP64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload313; RV64-LP64-ALL-NEXT: addi sp, sp, 16314; RV64-LP64-ALL-NEXT: ret315 %1 = call float @llvm.powi.f32.i32(float %a, i32 %b)316 ret float %1317}318 319define i64 @llround_f32(float %a) nounwind {320; RV32-ALL-LABEL: llround_f32:321; RV32-ALL: # %bb.0:322; RV32-ALL-NEXT: addi sp, sp, -16323; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill324; RV32-ALL-NEXT: call llroundf325; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload326; RV32-ALL-NEXT: addi sp, sp, 16327; RV32-ALL-NEXT: ret328;329; RV64IFD-LP64D-LABEL: llround_f32:330; RV64IFD-LP64D: # %bb.0:331; RV64IFD-LP64D-NEXT: fcvt.l.s a0, fa0, rmm332; RV64IFD-LP64D-NEXT: ret333;334; RV64IF-LP64F-LABEL: llround_f32:335; RV64IF-LP64F: # %bb.0:336; RV64IF-LP64F-NEXT: fcvt.l.s a0, fa0, rmm337; RV64IF-LP64F-NEXT: ret338;339; RV64IFD-LP64-LABEL: llround_f32:340; RV64IFD-LP64: # %bb.0:341; RV64IFD-LP64-NEXT: fmv.w.x fa5, a0342; RV64IFD-LP64-NEXT: fcvt.l.s a0, fa5, rmm343; RV64IFD-LP64-NEXT: ret344;345; RV64I-LP64-LABEL: llround_f32:346; RV64I-LP64: # %bb.0:347; RV64I-LP64-NEXT: addi sp, sp, -16348; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill349; RV64I-LP64-NEXT: call llroundf350; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload351; RV64I-LP64-NEXT: addi sp, sp, 16352; RV64I-LP64-NEXT: ret353 %1 = call i64 @llvm.llround.i64.f32(float %a)354 ret i64 %1355}356 357; Double libcalls:358 359define double @sin_f64(double %a) nounwind {360; D-ABI-ALL-LABEL: sin_f64:361; D-ABI-ALL: # %bb.0:362; D-ABI-ALL-NEXT: tail sin363;364; RV32IF-ILP32F-LABEL: sin_f64:365; RV32IF-ILP32F: # %bb.0:366; RV32IF-ILP32F-NEXT: addi sp, sp, -16367; RV32IF-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill368; RV32IF-ILP32F-NEXT: call sin369; RV32IF-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload370; RV32IF-ILP32F-NEXT: addi sp, sp, 16371; RV32IF-ILP32F-NEXT: ret372;373; RV32-ILP32-ALL-LABEL: sin_f64:374; RV32-ILP32-ALL: # %bb.0:375; RV32-ILP32-ALL-NEXT: addi sp, sp, -16376; RV32-ILP32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill377; RV32-ILP32-ALL-NEXT: call sin378; RV32-ILP32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload379; RV32-ILP32-ALL-NEXT: addi sp, sp, 16380; RV32-ILP32-ALL-NEXT: ret381;382; RV64IF-LP64F-LABEL: sin_f64:383; RV64IF-LP64F: # %bb.0:384; RV64IF-LP64F-NEXT: addi sp, sp, -16385; RV64IF-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill386; RV64IF-LP64F-NEXT: call sin387; RV64IF-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload388; RV64IF-LP64F-NEXT: addi sp, sp, 16389; RV64IF-LP64F-NEXT: ret390;391; RV64IFD-LP64-LABEL: sin_f64:392; RV64IFD-LP64: # %bb.0:393; RV64IFD-LP64-NEXT: tail sin394;395; RV64I-LP64-LABEL: sin_f64:396; RV64I-LP64: # %bb.0:397; RV64I-LP64-NEXT: addi sp, sp, -16398; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill399; RV64I-LP64-NEXT: call sin400; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload401; RV64I-LP64-NEXT: addi sp, sp, 16402; RV64I-LP64-NEXT: ret403 %1 = call double @llvm.sin.f64(double %a)404 ret double %1405}406 407define double @powi_f64(double %a, i32 %b) nounwind {408; RV32IFD-ILP32D-LABEL: powi_f64:409; RV32IFD-ILP32D: # %bb.0:410; RV32IFD-ILP32D-NEXT: tail __powidf2411;412; RV32IF-ILP32F-LABEL: powi_f64:413; RV32IF-ILP32F: # %bb.0:414; RV32IF-ILP32F-NEXT: addi sp, sp, -16415; RV32IF-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill416; RV32IF-ILP32F-NEXT: call __powidf2417; RV32IF-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload418; RV32IF-ILP32F-NEXT: addi sp, sp, 16419; RV32IF-ILP32F-NEXT: ret420;421; RV32-ILP32-ALL-LABEL: powi_f64:422; RV32-ILP32-ALL: # %bb.0:423; RV32-ILP32-ALL-NEXT: addi sp, sp, -16424; RV32-ILP32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill425; RV32-ILP32-ALL-NEXT: call __powidf2426; RV32-ILP32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload427; RV32-ILP32-ALL-NEXT: addi sp, sp, 16428; RV32-ILP32-ALL-NEXT: ret429;430; RV64IFD-LP64D-LABEL: powi_f64:431; RV64IFD-LP64D: # %bb.0:432; RV64IFD-LP64D-NEXT: addi sp, sp, -16433; RV64IFD-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill434; RV64IFD-LP64D-NEXT: sext.w a0, a0435; RV64IFD-LP64D-NEXT: call __powidf2436; RV64IFD-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload437; RV64IFD-LP64D-NEXT: addi sp, sp, 16438; RV64IFD-LP64D-NEXT: ret439;440; RV64IF-LP64F-LABEL: powi_f64:441; RV64IF-LP64F: # %bb.0:442; RV64IF-LP64F-NEXT: addi sp, sp, -16443; RV64IF-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill444; RV64IF-LP64F-NEXT: sext.w a1, a1445; RV64IF-LP64F-NEXT: call __powidf2446; RV64IF-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload447; RV64IF-LP64F-NEXT: addi sp, sp, 16448; RV64IF-LP64F-NEXT: ret449;450; RV64-LP64-ALL-LABEL: powi_f64:451; RV64-LP64-ALL: # %bb.0:452; RV64-LP64-ALL-NEXT: addi sp, sp, -16453; RV64-LP64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill454; RV64-LP64-ALL-NEXT: sext.w a1, a1455; RV64-LP64-ALL-NEXT: call __powidf2456; RV64-LP64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload457; RV64-LP64-ALL-NEXT: addi sp, sp, 16458; RV64-LP64-ALL-NEXT: ret459 %1 = call double @llvm.powi.f64.i32(double %a, i32 %b)460 ret double %1461}462 463define i64 @llround_f64(double %a) nounwind {464; RV32-ALL-LABEL: llround_f64:465; RV32-ALL: # %bb.0:466; RV32-ALL-NEXT: addi sp, sp, -16467; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill468; RV32-ALL-NEXT: call llround469; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload470; RV32-ALL-NEXT: addi sp, sp, 16471; RV32-ALL-NEXT: ret472;473; RV64IFD-LP64D-LABEL: llround_f64:474; RV64IFD-LP64D: # %bb.0:475; RV64IFD-LP64D-NEXT: fcvt.l.d a0, fa0, rmm476; RV64IFD-LP64D-NEXT: ret477;478; RV64IF-LP64F-LABEL: llround_f64:479; RV64IF-LP64F: # %bb.0:480; RV64IF-LP64F-NEXT: addi sp, sp, -16481; RV64IF-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill482; RV64IF-LP64F-NEXT: call llround483; RV64IF-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload484; RV64IF-LP64F-NEXT: addi sp, sp, 16485; RV64IF-LP64F-NEXT: ret486;487; RV64IFD-LP64-LABEL: llround_f64:488; RV64IFD-LP64: # %bb.0:489; RV64IFD-LP64-NEXT: fmv.d.x fa5, a0490; RV64IFD-LP64-NEXT: fcvt.l.d a0, fa5, rmm491; RV64IFD-LP64-NEXT: ret492;493; RV64I-LP64-LABEL: llround_f64:494; RV64I-LP64: # %bb.0:495; RV64I-LP64-NEXT: addi sp, sp, -16496; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill497; RV64I-LP64-NEXT: call llround498; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload499; RV64I-LP64-NEXT: addi sp, sp, 16500; RV64I-LP64-NEXT: ret501 %1 = call i64 @llvm.llround.i64.f64(double %a)502 ret i64 %1503}504 505; Atomics libcalls:506 507define i8 @atomic_load_i8_unordered(ptr %a) nounwind {508; RV32-ALL-LABEL: atomic_load_i8_unordered:509; RV32-ALL: # %bb.0:510; RV32-ALL-NEXT: addi sp, sp, -16511; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill512; RV32-ALL-NEXT: li a1, 0513; RV32-ALL-NEXT: call __atomic_load_1514; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload515; RV32-ALL-NEXT: addi sp, sp, 16516; RV32-ALL-NEXT: ret517;518; RV64-ALL-LABEL: atomic_load_i8_unordered:519; RV64-ALL: # %bb.0:520; RV64-ALL-NEXT: addi sp, sp, -16521; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill522; RV64-ALL-NEXT: li a1, 0523; RV64-ALL-NEXT: call __atomic_load_1524; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload525; RV64-ALL-NEXT: addi sp, sp, 16526; RV64-ALL-NEXT: ret527 %1 = load atomic i8, ptr %a unordered, align 1528 ret i8 %1529}530 531define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {532; RV32-ALL-LABEL: atomicrmw_add_i16_release:533; RV32-ALL: # %bb.0:534; RV32-ALL-NEXT: addi sp, sp, -16535; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill536; RV32-ALL-NEXT: li a2, 3537; RV32-ALL-NEXT: call __atomic_fetch_add_2538; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload539; RV32-ALL-NEXT: addi sp, sp, 16540; RV32-ALL-NEXT: ret541;542; RV64-ALL-LABEL: atomicrmw_add_i16_release:543; RV64-ALL: # %bb.0:544; RV64-ALL-NEXT: addi sp, sp, -16545; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill546; RV64-ALL-NEXT: li a2, 3547; RV64-ALL-NEXT: call __atomic_fetch_add_2548; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload549; RV64-ALL-NEXT: addi sp, sp, 16550; RV64-ALL-NEXT: ret551 %1 = atomicrmw add ptr %a, i16 %b release552 ret i16 %1553}554 555define i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind {556; RV32-ALL-LABEL: atomicrmw_xor_i32_acq_rel:557; RV32-ALL: # %bb.0:558; RV32-ALL-NEXT: addi sp, sp, -16559; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill560; RV32-ALL-NEXT: li a2, 4561; RV32-ALL-NEXT: call __atomic_fetch_xor_4562; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload563; RV32-ALL-NEXT: addi sp, sp, 16564; RV32-ALL-NEXT: ret565;566; RV64-ALL-LABEL: atomicrmw_xor_i32_acq_rel:567; RV64-ALL: # %bb.0:568; RV64-ALL-NEXT: addi sp, sp, -16569; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill570; RV64-ALL-NEXT: li a2, 4571; RV64-ALL-NEXT: call __atomic_fetch_xor_4572; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload573; RV64-ALL-NEXT: addi sp, sp, 16574; RV64-ALL-NEXT: ret575 %1 = atomicrmw xor ptr %a, i32 %b acq_rel576 ret i32 %1577}578 579define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {580; RV32-ALL-LABEL: atomicrmw_nand_i64_seq_cst:581; RV32-ALL: # %bb.0:582; RV32-ALL-NEXT: addi sp, sp, -16583; RV32-ALL-NEXT: sw ra, 12(sp) # 4-byte Folded Spill584; RV32-ALL-NEXT: li a3, 5585; RV32-ALL-NEXT: call __atomic_fetch_nand_8586; RV32-ALL-NEXT: lw ra, 12(sp) # 4-byte Folded Reload587; RV32-ALL-NEXT: addi sp, sp, 16588; RV32-ALL-NEXT: ret589;590; RV64-ALL-LABEL: atomicrmw_nand_i64_seq_cst:591; RV64-ALL: # %bb.0:592; RV64-ALL-NEXT: addi sp, sp, -16593; RV64-ALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill594; RV64-ALL-NEXT: li a2, 5595; RV64-ALL-NEXT: call __atomic_fetch_nand_8596; RV64-ALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload597; RV64-ALL-NEXT: addi sp, sp, 16598; RV64-ALL-NEXT: ret599 %1 = atomicrmw nand ptr %a, i64 %b seq_cst600 ret i64 %1601}602