; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc -mtriple=xtensa -mattr=+fp -verify-machineinstrs < %s | FileCheck -check-prefix=XTENSA %s define float @fadd_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fadd_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %res = fadd float %a, %b ret float %res } define float @fsub_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fsub_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: sub.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %res = fsub float %a, %b ret float %res } define float @fmul_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fmul_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: mul.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %res = fmul float %a, %b ret float %res } define float @fdiv_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fdiv_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI3_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = fdiv float %a, %b ret float %res } declare float @llvm.sqrt.f32(float) define float @fsqrt_s(float %a) nounwind { ; XTENSA-LABEL: fsqrt_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI4_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.sqrt.f32(float %a) ret float %res } declare float @llvm.fabs.f32(float) define float @fabs_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fabs_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: abs.s f9, f8 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %fa = fadd float %a, %b %call_res = call float @llvm.fabs.f32(float %fa) %res = fadd float %call_res, %fa ret float %res } declare float @llvm.minnum.f32(float, float) define float @fmin_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fmin_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI6_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.minnum.f32(float %a, float %b) ret float %res } declare float @llvm.maxnum.f32(float, float) define float @fmax_s(float %a, float %b) nounwind { ; XTENSA-LABEL: fmax_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI7_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.maxnum.f32(float %a, float %b) ret float %res } declare float @llvm.fma.f32(float, float, float) define float @fmadd_s(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fmadd_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: madd.s f10, f9, f8 ; XTENSA-NEXT: rfr a2, f10 ; XTENSA-NEXT: ret %res = call float @llvm.fma.f32(float %a, float %b, float %c) ret float %res } define float @fmsub_s(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fmsub_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI9_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a4 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: neg.s f8, f8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: wfr f10, a2 ; XTENSA-NEXT: madd.s f8, f10, f9 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %c_ = fadd float 0.0, %c ; avoid negation using xor %negc = fsub float -0.0, %c_ %res = call float @llvm.fma.f32(float %a, float %b, float %negc) ret float %res } define float @fnmadd_s(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmadd_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI10_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: add.s f9, f9, f8 ; XTENSA-NEXT: neg.s f9, f9 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: add.s f8, f10, f8 ; XTENSA-NEXT: neg.s f8, f8 ; XTENSA-NEXT: wfr f10, a3 ; XTENSA-NEXT: madd.s f8, f9, f10 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %a_ = fadd float 0.0, %a %c_ = fadd float 0.0, %c %nega = fsub float -0.0, %a_ %negc = fsub float -0.0, %c_ %res = call float @llvm.fma.f32(float %nega, float %b, float %negc) ret float %res } define float @fnmadd_s_2(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmadd_s_2: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI11_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: add.s f9, f9, f8 ; XTENSA-NEXT: neg.s f9, f9 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: add.s f8, f10, f8 ; XTENSA-NEXT: neg.s f8, f8 ; XTENSA-NEXT: wfr f10, a2 ; XTENSA-NEXT: madd.s f8, f10, f9 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %b_ = fadd float 0.0, %b %c_ = fadd float 0.0, %c %negb = fsub float -0.0, %b_ %negc = fsub float -0.0, %c_ %res = call float @llvm.fma.f32(float %a, float %negb, float %negc) ret float %res } define float @fnmadd_s_3(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmadd_s_3: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: madd.s f10, f9, f8 ; XTENSA-NEXT: rfr a8, f10 ; XTENSA-NEXT: l32r a9, .LCPI12_0 ; XTENSA-NEXT: xor a2, a8, a9 ; XTENSA-NEXT: ret %res = call float @llvm.fma.f32(float %a, float %b, float %c) %neg = fneg float %res ret float %neg } define float @fnmadd_nsz(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmadd_nsz: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: madd.s f10, f9, f8 ; XTENSA-NEXT: rfr a8, f10 ; XTENSA-NEXT: l32r a9, .LCPI13_0 ; XTENSA-NEXT: xor a2, a8, a9 ; XTENSA-NEXT: ret %res = call nsz float @llvm.fma.f32(float %a, float %b, float %c) %neg = fneg nsz float %res ret float %neg } define float @fnmsub_s(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmsub_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI14_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: neg.s f8, f8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: madd.s f10, f8, f9 ; XTENSA-NEXT: rfr a2, f10 ; XTENSA-NEXT: ret %a_ = fadd float 0.0, %a %nega = fsub float -0.0, %a_ %res = call float @llvm.fma.f32(float %nega, float %b, float %c) ret float %res } define float @fnmsub_s_2(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmsub_s_2: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI15_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: neg.s f8, f8 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: madd.s f10, f9, f8 ; XTENSA-NEXT: rfr a2, f10 ; XTENSA-NEXT: ret %b_ = fadd float 0.0, %b %negb = fsub float -0.0, %b_ %res = call float @llvm.fma.f32(float %a, float %negb, float %c) ret float %res } define float @fmadd_s_contract(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fmadd_s_contract: ; XTENSA: # %bb.0: ; XTENSA-NEXT: wfr f8, a3 ; XTENSA-NEXT: wfr f9, a2 ; XTENSA-NEXT: mul.s f8, f9, f8 ; XTENSA-NEXT: wfr f9, a4 ; XTENSA-NEXT: add.s f8, f8, f9 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %fm = fmul contract float %a, %b %res = fadd contract float %fm, %c ret float %res } define float @fmsub_s_contract(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fmsub_s_contract: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI17_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a4 ; XTENSA-NEXT: add.s f8, f9, f8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: wfr f10, a2 ; XTENSA-NEXT: mul.s f9, f10, f9 ; XTENSA-NEXT: sub.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %c_ = fadd float 0.0, %c ; avoid negation using xor %fm = fmul contract float %a, %b %res = fsub contract float %fm, %c_ ret float %res } define float @fnmadd_s_contract(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmadd_s_contract: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI18_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: add.s f9, f9, f8 ; XTENSA-NEXT: wfr f10, a2 ; XTENSA-NEXT: add.s f10, f10, f8 ; XTENSA-NEXT: mul.s f9, f10, f9 ; XTENSA-NEXT: neg.s f9, f9 ; XTENSA-NEXT: wfr f10, a4 ; XTENSA-NEXT: add.s f8, f10, f8 ; XTENSA-NEXT: sub.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %a_ = fadd float 0.0, %a ; avoid negation using xor %b_ = fadd float 0.0, %b ; avoid negation using xor %c_ = fadd float 0.0, %c ; avoid negation using xor %fm = fmul contract float %a_, %b_ %fn = fneg float %fm %res = fsub contract float %fn, %c_ ret float %res } define float @fnmsub_s_contract(float %a, float %b, float %c) nounwind { ; XTENSA-LABEL: fnmsub_s_contract: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI19_0 ; XTENSA-NEXT: wfr f8, a8 ; XTENSA-NEXT: wfr f9, a3 ; XTENSA-NEXT: add.s f9, f9, f8 ; XTENSA-NEXT: wfr f10, a2 ; XTENSA-NEXT: add.s f8, f10, f8 ; XTENSA-NEXT: mul.s f8, f8, f9 ; XTENSA-NEXT: wfr f9, a4 ; XTENSA-NEXT: sub.s f8, f9, f8 ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret %a_ = fadd float 0.0, %a ; avoid negation using xor %b_ = fadd float 0.0, %b ; avoid negation using xor %fm = fmul contract float %a_, %b_ %res = fsub contract float %c, %fm ret float %res } declare float @llvm.powi.f32(float, i32) define float @powi_f32(float %a, i32 %b) nounwind { ; XTENSA-LABEL: powi_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI20_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.powi.f32(float %a, i32 %b) ret float %res } declare float @llvm.sin.f32(float) define float @sin_f32(float %a) nounwind { ; XTENSA-LABEL: sin_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI21_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.sin.f32(float %a) ret float %res } declare float @llvm.cos.f32(float) define float @cos_f32(float %a) nounwind { ; XTENSA-LABEL: cos_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI22_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.cos.f32(float %a) ret float %res } declare float @llvm.exp.f32(float) define float @exp_f32(float %a) nounwind { ; XTENSA-LABEL: exp_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI23_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.exp.f32(float %a) ret float %res } define float @log_f32(float %a) nounwind { ; XTENSA-LABEL: log_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI24_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.log.f32(float %a) ret float %res } declare float @llvm.log10.f32(float) define float @log10_f32(float %a) nounwind { ; XTENSA-LABEL: log10_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI25_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.log10.f32(float %a) ret float %res } declare float @llvm.log2.f32(float) define float @log2_f32(float %a) nounwind { ; XTENSA-LABEL: log2_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI26_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.log2.f32(float %a) ret float %res } declare float @llvm.floor.f32(float) define float @floor_f32(float %a) nounwind { ; XTENSA-LABEL: floor_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI27_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.floor.f32(float %a) ret float %res } declare float @llvm.ceil.f32(float) define float @ceil_f32(float %a) nounwind { ; XTENSA-LABEL: ceil_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI28_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.ceil.f32(float %a) ret float %res } declare float @llvm.rint.f32(float) define float @rint_f32(float %a) nounwind { ; XTENSA-LABEL: rint_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI29_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.rint.f32(float %a) ret float %res } declare float @llvm.nearbyint.f32(float) define float @nearbyint_f32(float %a) nounwind { ; XTENSA-LABEL: nearbyint_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI30_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.nearbyint.f32(float %a) ret float %res } declare float @llvm.round.f32(float) define float @round_f32(float %a) nounwind { ; XTENSA-LABEL: round_f32: ; XTENSA: # %bb.0: ; XTENSA-NEXT: addi a8, a1, -16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: s32i a0, a1, 0 # 4-byte Folded Spill ; XTENSA-NEXT: l32r a8, .LCPI31_0 ; XTENSA-NEXT: callx0 a8 ; XTENSA-NEXT: l32i a0, a1, 0 # 4-byte Folded Reload ; XTENSA-NEXT: addi a8, a1, 16 ; XTENSA-NEXT: or a1, a8, a8 ; XTENSA-NEXT: ret %res = call float @llvm.round.f32(float %a) ret float %res } define float @fneg_s(float %a) nounwind { ; XTENSA-LABEL: fneg_s: ; XTENSA: # %bb.0: ; XTENSA-NEXT: l32r a8, .LCPI32_0 ; XTENSA-NEXT: and a2, a2, a8 ; XTENSA-NEXT: ret %res = call float @llvm.fabs.f32(float %a) ret float %res } define i32 @fptosi(float %f) { ; XTENSA-LABEL: fptosi: ; XTENSA: .cfi_startproc ; XTENSA-NEXT: # %bb.0: ; XTENSA-NEXT: wfr f8, a2 ; XTENSA-NEXT: trunc.s a2, f8, 0 ; XTENSA-NEXT: ret %conv = fptosi float %f to i32 ret i32 %conv } define i32 @fptoui(float %f) { ; XTENSA-LABEL: fptoui: ; XTENSA: .cfi_startproc ; XTENSA-NEXT: # %bb.0: ; XTENSA-NEXT: wfr f8, a2 ; XTENSA-NEXT: utrunc.s a2, f8, 0 ; XTENSA-NEXT: ret %conv = fptoui float %f to i32 ret i32 %conv } define float @copysign_f32(float %a, float %b) { ; XTENSA-LABEL: copysign_f32: ; XTENSA: .cfi_startproc ; XTENSA-NEXT: # %bb.0: # %entry ; XTENSA-NEXT: l32r a8, .LCPI35_0 ; XTENSA-NEXT: and a8, a3, a8 ; XTENSA-NEXT: l32r a9, .LCPI35_1 ; XTENSA-NEXT: and a9, a2, a9 ; XTENSA-NEXT: wfr f8, a9 ; XTENSA-NEXT: movi a9, 0 ; XTENSA-NEXT: beq a8, a9, .LBB35_2 ; XTENSA-NEXT: # %bb.1: ; XTENSA-NEXT: neg.s f8, f8 ; XTENSA-NEXT: .LBB35_2: # %entry ; XTENSA-NEXT: rfr a2, f8 ; XTENSA-NEXT: ret entry: %c = call float @llvm.copysign.f32(float %a, float %b) ret float %c }