diff options
| author | Mingming Liu <mingmingl@google.com> | 2025-09-10 15:25:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-10 15:25:31 -0700 |
| commit | 1417dafa1db9cb1b2b09438aa9f53ea5ab6e36e2 (patch) | |
| tree | 57f4b1f313c8cf74eed8819870f39c36ea263c68 /llvm/test/CodeGen/RISCV/float-arith.ll | |
| parent | 898b813bc8a6d0276bf0f4769f5f2f64b34e632d (diff) | |
| parent | b8cefcb601ddaa18482555c4ff363c01a270c2fe (diff) | |
Merge branch 'main' into users/mingmingl-llvm/samplefdo-profile-formatusers/mingmingl-llvm/samplefdo-profile-format
Diffstat (limited to 'llvm/test/CodeGen/RISCV/float-arith.ll')
| -rw-r--r-- | llvm/test/CodeGen/RISCV/float-arith.ll | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/RISCV/float-arith.ll b/llvm/test/CodeGen/RISCV/float-arith.ll index 57b3423da69a..95f1fc689920 100644 --- a/llvm/test/CodeGen/RISCV/float-arith.ll +++ b/llvm/test/CodeGen/RISCV/float-arith.ll @@ -529,6 +529,89 @@ define float @fmsub_s(float %a, float %b, float %c) nounwind { ret float %1 } +define float @fmsub_s_fmul_fneg(float %a, float %b, float %c, float %d) nounwind { +; CHECKIFD-LABEL: fmsub_d_fmul_fneg: +; CHECKIFD: # %bb.0: +; CHECKIFD-NEXT: fneg.d fa5, fa3 +; CHECKIFD-NEXT: fmul.d fa5, fa2, fa5 +; CHECKIFD-NEXT: fmadd.d fa0, fa0, fa1, fa5 +; CHECKIFD-NEXT: ret +; +; RV32IZFINXZDINX-LABEL: fmsub_d_fmul_fneg: +; RV32IZFINXZDINX: # %bb.0: +; RV32IZFINXZDINX-NEXT: fneg.d a6, a6 +; RV32IZFINXZDINX-NEXT: fmul.d a4, a4, a6 +; RV32IZFINXZDINX-NEXT: fmadd.d a0, a0, a2, a4 +; RV32IZFINXZDINX-NEXT: ret +; +; RV64IZFINXZDINX-LABEL: fmsub_d_fmul_fneg: +; RV64IZFINXZDINX: # %bb.0: +; RV64IZFINXZDINX-NEXT: fneg.d a3, a3 +; RV64IZFINXZDINX-NEXT: fmul.d a2, a2, a3 +; RV64IZFINXZDINX-NEXT: fmadd.d a0, a0, a1, a2 +; RV64IZFINXZDINX-NEXT: ret +; +; CHECKIF-LABEL: fmsub_s_fmul_fneg: +; CHECKIF: # %bb.0: +; CHECKIF-NEXT: fmul.s fa5, fa2, fa3 +; CHECKIF-NEXT: fmsub.s fa0, fa0, fa1, fa5 +; CHECKIF-NEXT: ret +; +; CHECKIZFINX-LABEL: fmsub_s_fmul_fneg: +; CHECKIZFINX: # %bb.0: +; CHECKIZFINX-NEXT: fmul.s a2, a2, a3 +; CHECKIZFINX-NEXT: fmsub.s a0, a0, a1, a2 +; CHECKIZFINX-NEXT: ret +; +; RV32I-LABEL: fmsub_s_fmul_fneg: +; RV32I: # %bb.0: +; RV32I-NEXT: addi sp, sp, -16 +; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill +; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill +; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill +; RV32I-NEXT: mv s0, a1 +; RV32I-NEXT: mv s1, a0 +; RV32I-NEXT: lui a1, 524288 +; RV32I-NEXT: xor a1, a3, a1 +; RV32I-NEXT: mv a0, a2 +; RV32I-NEXT: call __mulsf3 +; RV32I-NEXT: mv a2, a0 +; RV32I-NEXT: mv a0, s1 +; RV32I-NEXT: mv a1, s0 +; RV32I-NEXT: call fmaf +; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload +; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload +; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload +; RV32I-NEXT: addi sp, sp, 16 +; RV32I-NEXT: ret +; +; RV64I-LABEL: fmsub_s_fmul_fneg: +; RV64I: # %bb.0: +; RV64I-NEXT: addi sp, sp, -32 +; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill +; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill +; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill +; RV64I-NEXT: mv s0, a1 +; RV64I-NEXT: mv s1, a0 +; RV64I-NEXT: lui a1, 524288 +; RV64I-NEXT: xor a1, a3, a1 +; RV64I-NEXT: mv a0, a2 +; RV64I-NEXT: call __mulsf3 +; RV64I-NEXT: mv a2, a0 +; RV64I-NEXT: mv a0, s1 +; RV64I-NEXT: mv a1, s0 +; RV64I-NEXT: call fmaf +; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload +; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload +; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload +; RV64I-NEXT: addi sp, sp, 32 +; RV64I-NEXT: ret + %negd = fneg float %d + %fmul = fmul float %c, %negd + %1 = call float @llvm.fma.f32(float %a, float %b, float %fmul) + ret float %1 +} + define float @fnmadd_s(float %a, float %b, float %c) nounwind { ; CHECKIF-LABEL: fnmadd_s: ; CHECKIF: # %bb.0: @@ -738,6 +821,91 @@ define float @fnmadd_s_3(float %a, float %b, float %c) nounwind { ret float %neg } +define float @fnmadd_s_fmul_fneg(float %a, float %b, float %c, float %d) nounwind { +; CHECKIFD-LABEL: fnmadd_d_fmul_fneg: +; CHECKIFD: # %bb.0: +; CHECKIFD-NEXT: fneg.d fa5, fa0 +; CHECKIFD-NEXT: fmul.d fa5, fa1, fa5 +; CHECKIFD-NEXT: fmadd.d fa0, fa2, fa3, fa5 +; CHECKIFD-NEXT: ret +; +; RV32IZFINXZDINX-LABEL: fnmadd_d_fmul_fneg: +; RV32IZFINXZDINX: # %bb.0: +; RV32IZFINXZDINX-NEXT: fneg.d a0, a0 +; RV32IZFINXZDINX-NEXT: fmul.d a0, a2, a0 +; RV32IZFINXZDINX-NEXT: fmadd.d a0, a4, a6, a0 +; RV32IZFINXZDINX-NEXT: ret +; +; RV64IZFINXZDINX-LABEL: fnmadd_d_fmul_fneg: +; RV64IZFINXZDINX: # %bb.0: +; RV64IZFINXZDINX-NEXT: fneg.d a0, a0 +; RV64IZFINXZDINX-NEXT: fmul.d a0, a1, a0 +; RV64IZFINXZDINX-NEXT: fmadd.d a0, a2, a3, a0 +; RV64IZFINXZDINX-NEXT: ret +; +; CHECKIF-LABEL: fnmadd_s_fmul_fneg: +; CHECKIF: # %bb.0: +; CHECKIF-NEXT: fmul.s fa5, fa1, fa0 +; CHECKIF-NEXT: fmsub.s fa0, fa2, fa3, fa5 +; CHECKIF-NEXT: ret +; +; CHECKIZFINX-LABEL: fnmadd_s_fmul_fneg: +; CHECKIZFINX: # %bb.0: +; CHECKIZFINX-NEXT: fmul.s a0, a1, a0 +; CHECKIZFINX-NEXT: fmsub.s a0, a2, a3, a0 +; CHECKIZFINX-NEXT: ret +; +; RV32I-LABEL: fnmadd_s_fmul_fneg: +; RV32I: # %bb.0: +; RV32I-NEXT: addi sp, sp, -16 +; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill +; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill +; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill +; RV32I-NEXT: mv s0, a3 +; RV32I-NEXT: mv s1, a2 +; RV32I-NEXT: mv a2, a1 +; RV32I-NEXT: lui a1, 524288 +; RV32I-NEXT: xor a1, a0, a1 +; RV32I-NEXT: mv a0, a2 +; RV32I-NEXT: call __mulsf3 +; RV32I-NEXT: mv a2, a0 +; RV32I-NEXT: mv a0, s1 +; RV32I-NEXT: mv a1, s0 +; RV32I-NEXT: call fmaf +; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload +; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload +; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload +; RV32I-NEXT: addi sp, sp, 16 +; RV32I-NEXT: ret +; +; RV64I-LABEL: fnmadd_s_fmul_fneg: +; RV64I: # %bb.0: +; RV64I-NEXT: addi sp, sp, -32 +; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill +; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill +; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill +; RV64I-NEXT: mv s0, a3 +; RV64I-NEXT: mv s1, a2 +; RV64I-NEXT: mv a2, a1 +; RV64I-NEXT: lui a1, 524288 +; RV64I-NEXT: xor a1, a0, a1 +; RV64I-NEXT: mv a0, a2 +; RV64I-NEXT: call __mulsf3 +; RV64I-NEXT: mv a2, a0 +; RV64I-NEXT: mv a0, s1 +; RV64I-NEXT: mv a1, s0 +; RV64I-NEXT: call fmaf +; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload +; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload +; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload +; RV64I-NEXT: addi sp, sp, 32 +; RV64I-NEXT: ret + %nega = fneg float %a + %mul = fmul float %b, %nega + %1 = call float @llvm.fma.f32(float %c, float %d, float %mul) + ret float %1 +} + define float @fnmadd_nsz(float %a, float %b, float %c) nounwind { ; RV32IF-LABEL: fnmadd_nsz: ; RV32IF: # %bb.0: |
