This is an alternative to #117866 that works by demanding a valid vtype instead of using a separate pass. The main advantage of this is that it allows coalesceVSETVLIs to just reuse an existing vsetvli later in the block. To do this we need to first transfer the vsetvli info to some arbitrary valid state in transferBefore when we encounter a vector copy. Then we add a new vill demanded field that will happily accept any other known vtype, which allows us to coalesce these where possible. Note we also need to check for vector copies in computeVLVTYPEChanges, otherwise the pass will completely skip over functions that only have vector copies and nothing else. This is one part of a fix for #114518. We still need to check if there's other cases where vector copies/whole register moves that are inserted after vsetvli insertion.
1274 lines
56 KiB
LLVM
1274 lines
56 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v -target-abi=ilp32d \
|
|
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
|
|
; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v -target-abi=lp64d \
|
|
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
|
|
; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v -target-abi=ilp32d \
|
|
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
|
|
; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v -target-abi=lp64d \
|
|
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
|
|
|
|
; This tests a mix of vfmacc and vfmadd by using different operand orders to
|
|
; trigger commuting in TwoAddressInstructionPass.
|
|
|
|
define <vscale x 1 x bfloat> @vfmadd_vv_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, <vscale x 1 x bfloat> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv1bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v10
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v9
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v12, v10, v11
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 1 x bfloat> @llvm.fma.v1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, <vscale x 1 x bfloat> %vc)
|
|
ret <vscale x 1 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 1 x bfloat> @vfmadd_vv_nxv1bf16_commuted(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, <vscale x 1 x bfloat> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv1bf16_commuted:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v9
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v10
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v9, v8, v11
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 1 x bfloat> @llvm.fma.v1bf16(<vscale x 1 x bfloat> %vb, <vscale x 1 x bfloat> %vc, <vscale x 1 x bfloat> %va)
|
|
ret <vscale x 1 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 1 x bfloat> @vfmadd_vf_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, bfloat %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv1bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: fmv.x.h a0, fa0
|
|
; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9
|
|
; CHECK-NEXT: vmv.v.x v9, a0
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v9
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v12, v11, v10
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 1 x bfloat> poison, bfloat %c, i32 0
|
|
%splat = shufflevector <vscale x 1 x bfloat> %head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer
|
|
%vd = call <vscale x 1 x bfloat> @llvm.fma.v1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %splat, <vscale x 1 x bfloat> %vb)
|
|
ret <vscale x 1 x bfloat> %vd
|
|
}
|
|
|
|
declare <vscale x 2 x bfloat> @llvm.fma.v2bf16(<vscale x 2 x bfloat>, <vscale x 2 x bfloat>, <vscale x 2 x bfloat>)
|
|
|
|
define <vscale x 2 x bfloat> @vfmadd_vv_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, <vscale x 2 x bfloat> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv2bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v9
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v10
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v12, v9, v11
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 2 x bfloat> @llvm.fma.v2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vc, <vscale x 2 x bfloat> %vb)
|
|
ret <vscale x 2 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 2 x bfloat> @vfmadd_vf_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, bfloat %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv2bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: fmv.x.h a0, fa0
|
|
; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8
|
|
; CHECK-NEXT: vmv.v.x v8, a0
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v9
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v9, v11, v10
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 2 x bfloat> poison, bfloat %c, i32 0
|
|
%splat = shufflevector <vscale x 2 x bfloat> %head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer
|
|
%vd = call <vscale x 2 x bfloat> @llvm.fma.v2bf16(<vscale x 2 x bfloat> %vb, <vscale x 2 x bfloat> %splat, <vscale x 2 x bfloat> %va)
|
|
ret <vscale x 2 x bfloat> %vd
|
|
}
|
|
|
|
declare <vscale x 4 x bfloat> @llvm.fma.v4bf16(<vscale x 4 x bfloat>, <vscale x 4 x bfloat>, <vscale x 4 x bfloat>)
|
|
|
|
define <vscale x 4 x bfloat> @vfmadd_vv_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, <vscale x 4 x bfloat> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv4bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v10
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v14, v8
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v14, v10, v12
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v14
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 4 x bfloat> @llvm.fma.v4bf16(<vscale x 4 x bfloat> %vb, <vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vc)
|
|
ret <vscale x 4 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 4 x bfloat> @vfmadd_vf_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, bfloat %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv4bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: fmv.x.h a0, fa0
|
|
; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9
|
|
; CHECK-NEXT: vmv.v.x v9, a0
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v14, v9
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v14, v12, v10
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v14
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 4 x bfloat> poison, bfloat %c, i32 0
|
|
%splat = shufflevector <vscale x 4 x bfloat> %head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer
|
|
%vd = call <vscale x 4 x bfloat> @llvm.fma.v4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %splat, <vscale x 4 x bfloat> %vb)
|
|
ret <vscale x 4 x bfloat> %vd
|
|
}
|
|
|
|
declare <vscale x 8 x bfloat> @llvm.fma.v8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
|
|
|
|
define <vscale x 8 x bfloat> @vfmadd_vv_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, <vscale x 8 x bfloat> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv8bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v20, v10
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v24, v20, v16
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v24
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 8 x bfloat> @llvm.fma.v8bf16(<vscale x 8 x bfloat> %vb, <vscale x 8 x bfloat> %vc, <vscale x 8 x bfloat> %va)
|
|
ret <vscale x 8 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 8 x bfloat> @vfmadd_vf_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, bfloat %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv8bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: fmv.x.h a0, fa0
|
|
; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8
|
|
; CHECK-NEXT: vmv.v.x v8, a0
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v10
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v20, v8
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v20, v16, v12
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v20
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 8 x bfloat> poison, bfloat %c, i32 0
|
|
%splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer
|
|
%vd = call <vscale x 8 x bfloat> @llvm.fma.v8bf16(<vscale x 8 x bfloat> %vb, <vscale x 8 x bfloat> %splat, <vscale x 8 x bfloat> %va)
|
|
ret <vscale x 8 x bfloat> %vd
|
|
}
|
|
|
|
declare <vscale x 16 x bfloat> @llvm.fma.v16bf16(<vscale x 16 x bfloat>, <vscale x 16 x bfloat>, <vscale x 16 x bfloat>)
|
|
|
|
define <vscale x 16 x bfloat> @vfmadd_vv_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, <vscale x 16 x bfloat> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv16bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v16
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v16, v0, v24
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v16
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 16 x bfloat> @llvm.fma.v16bf16(<vscale x 16 x bfloat> %vc, <vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb)
|
|
ret <vscale x 16 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 16 x bfloat> @vfmadd_vf_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, bfloat %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv16bf16:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: fmv.x.h a0, fa0
|
|
; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12
|
|
; CHECK-NEXT: vmv.v.x v12, a0
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v8
|
|
; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v12
|
|
; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v0, v24, v16
|
|
; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 16 x bfloat> poison, bfloat %c, i32 0
|
|
%splat = shufflevector <vscale x 16 x bfloat> %head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer
|
|
%vd = call <vscale x 16 x bfloat> @llvm.fma.v16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %splat, <vscale x 16 x bfloat> %vb)
|
|
ret <vscale x 16 x bfloat> %vd
|
|
}
|
|
|
|
declare <vscale x 32 x bfloat> @llvm.fma.v32bf16(<vscale x 32 x bfloat>, <vscale x 32 x bfloat>, <vscale x 32 x bfloat>)
|
|
|
|
define <vscale x 32 x bfloat> @vfmadd_vv_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, <vscale x 32 x bfloat> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv32bf16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: addi sp, sp, -16
|
|
; ZVFH-NEXT: .cfi_def_cfa_offset 16
|
|
; ZVFH-NEXT: csrr a1, vlenb
|
|
; ZVFH-NEXT: slli a1, a1, 5
|
|
; ZVFH-NEXT: sub sp, sp, a1
|
|
; ZVFH-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
|
|
; ZVFH-NEXT: vsetvli a1, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vmv8r.v v0, v16
|
|
; ZVFH-NEXT: addi a1, sp, 16
|
|
; ZVFH-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vmv8r.v v16, v8
|
|
; ZVFH-NEXT: vl8re16.v v8, (a0)
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 4
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v24, v16
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v24, v0
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v0, v8
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v0, v8, v24
|
|
; ZVFH-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v24, v20
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: addi a0, sp, 16
|
|
; ZVFH-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v8, v20
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 4
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v16, v28
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v16, v8, v24
|
|
; ZVFH-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfncvtbf16.f.f.w v8, v0
|
|
; ZVFH-NEXT: vfncvtbf16.f.f.w v12, v16
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 5
|
|
; ZVFH-NEXT: add sp, sp, a0
|
|
; ZVFH-NEXT: .cfi_def_cfa sp, 16
|
|
; ZVFH-NEXT: addi sp, sp, 16
|
|
; ZVFH-NEXT: .cfi_def_cfa_offset 0
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv32bf16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: addi sp, sp, -16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16
|
|
; ZVFHMIN-NEXT: csrr a1, vlenb
|
|
; ZVFHMIN-NEXT: slli a1, a1, 5
|
|
; ZVFHMIN-NEXT: sub sp, sp, a1
|
|
; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vmv8r.v v0, v16
|
|
; ZVFHMIN-NEXT: addi a1, sp, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vmv8r.v v16, v8
|
|
; ZVFHMIN-NEXT: vl8re16.v v8, (a0)
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v24, v16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v24, v0
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 3
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v0, v8
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 3
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v0, v8, v24
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v24, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: addi a0, sp, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v8, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v16, v28
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v16, v8, v24
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvtbf16.f.f.w v8, v0
|
|
; ZVFHMIN-NEXT: vfncvtbf16.f.f.w v12, v16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 5
|
|
; ZVFHMIN-NEXT: add sp, sp, a0
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16
|
|
; ZVFHMIN-NEXT: addi sp, sp, 16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 32 x bfloat> @llvm.fma.v32bf16(<vscale x 32 x bfloat> %vc, <vscale x 32 x bfloat> %vb, <vscale x 32 x bfloat> %va)
|
|
ret <vscale x 32 x bfloat> %vd
|
|
}
|
|
|
|
define <vscale x 32 x bfloat> @vfmadd_vf_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, bfloat %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv32bf16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: addi sp, sp, -16
|
|
; ZVFH-NEXT: .cfi_def_cfa_offset 16
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 5
|
|
; ZVFH-NEXT: sub sp, sp, a0
|
|
; ZVFH-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vmv8r.v v0, v16
|
|
; ZVFH-NEXT: addi a0, sp, 16
|
|
; ZVFH-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vmv8r.v v16, v8
|
|
; ZVFH-NEXT: fmv.x.h a0, fa0
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v24, v16
|
|
; ZVFH-NEXT: csrr a1, vlenb
|
|
; ZVFH-NEXT: slli a1, a1, 4
|
|
; ZVFH-NEXT: add a1, sp, a1
|
|
; ZVFH-NEXT: addi a1, a1, 16
|
|
; ZVFH-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v24, v0
|
|
; ZVFH-NEXT: csrr a1, vlenb
|
|
; ZVFH-NEXT: slli a1, a1, 3
|
|
; ZVFH-NEXT: add a1, sp, a1
|
|
; ZVFH-NEXT: addi a1, a1, 16
|
|
; ZVFH-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: vsetvli a1, zero, e16, m8, ta, ma
|
|
; ZVFH-NEXT: vmv.v.x v24, a0
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v8, v0
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 4
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v8, v24, v0
|
|
; ZVFH-NEXT: vmv.v.v v24, v8
|
|
; ZVFH-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v8, v20
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 4
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
|
|
; ZVFH-NEXT: addi a0, sp, 16
|
|
; ZVFH-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v8, v20
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 3
|
|
; ZVFH-NEXT: mv a1, a0
|
|
; ZVFH-NEXT: slli a0, a0, 1
|
|
; ZVFH-NEXT: add a0, a0, a1
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vfwcvtbf16.f.f.v v16, v4
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 4
|
|
; ZVFH-NEXT: add a0, sp, a0
|
|
; ZVFH-NEXT: addi a0, a0, 16
|
|
; ZVFH-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFH-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v16, v8, v0
|
|
; ZVFH-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfncvtbf16.f.f.w v8, v24
|
|
; ZVFH-NEXT: vfncvtbf16.f.f.w v12, v16
|
|
; ZVFH-NEXT: csrr a0, vlenb
|
|
; ZVFH-NEXT: slli a0, a0, 5
|
|
; ZVFH-NEXT: add sp, sp, a0
|
|
; ZVFH-NEXT: .cfi_def_cfa sp, 16
|
|
; ZVFH-NEXT: addi sp, sp, 16
|
|
; ZVFH-NEXT: .cfi_def_cfa_offset 0
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv32bf16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: addi sp, sp, -16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 5
|
|
; ZVFHMIN-NEXT: sub sp, sp, a0
|
|
; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vmv8r.v v0, v16
|
|
; ZVFHMIN-NEXT: addi a0, sp, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vmv8r.v v16, v8
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v24, v16
|
|
; ZVFHMIN-NEXT: csrr a1, vlenb
|
|
; ZVFHMIN-NEXT: slli a1, a1, 4
|
|
; ZVFHMIN-NEXT: add a1, sp, a1
|
|
; ZVFHMIN-NEXT: addi a1, a1, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v24, v0
|
|
; ZVFHMIN-NEXT: csrr a1, vlenb
|
|
; ZVFHMIN-NEXT: slli a1, a1, 3
|
|
; ZVFHMIN-NEXT: add a1, sp, a1
|
|
; ZVFHMIN-NEXT: addi a1, a1, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vmv.v.x v24, a0
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v8, v0
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 3
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v8, v24, v0
|
|
; ZVFHMIN-NEXT: vmv.v.v v24, v8
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v8, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: addi a0, sp, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v8, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvtbf16.f.f.v v16, v4
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v16, v8, v0
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvtbf16.f.f.w v8, v24
|
|
; ZVFHMIN-NEXT: vfncvtbf16.f.f.w v12, v16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 5
|
|
; ZVFHMIN-NEXT: add sp, sp, a0
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16
|
|
; ZVFHMIN-NEXT: addi sp, sp, 16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 32 x bfloat> poison, bfloat %c, i32 0
|
|
%splat = shufflevector <vscale x 32 x bfloat> %head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer
|
|
%vd = call <vscale x 32 x bfloat> @llvm.fma.v32bf16(<vscale x 32 x bfloat> %vb, <vscale x 32 x bfloat> %splat, <vscale x 32 x bfloat> %va)
|
|
ret <vscale x 32 x bfloat> %vd
|
|
}
|
|
|
|
declare <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half>, <vscale x 1 x half>, <vscale x 1 x half>)
|
|
|
|
define <vscale x 1 x half> @vfmadd_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv1f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v8, v9, v10
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv1f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v10
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v11
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc)
|
|
ret <vscale x 1 x half> %vd
|
|
}
|
|
|
|
define <vscale x 1 x half> @vfmadd_vv_nxv1f16_commuted(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv1f16_commuted:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; ZVFH-NEXT: vfmacc.vv v8, v10, v9
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv1f16_commuted:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v9, v8, v11
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %vb, <vscale x 1 x half> %vc, <vscale x 1 x half> %va)
|
|
ret <vscale x 1 x half> %vd
|
|
}
|
|
|
|
define <vscale x 1 x half> @vfmadd_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv1f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vf v8, fa0, v9
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv1f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9
|
|
; ZVFHMIN-NEXT: vmv.v.x v9, a0
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v12, v11, v10
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 1 x half> poison, half %c, i32 0
|
|
%splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
|
|
%vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %splat, <vscale x 1 x half> %vb)
|
|
ret <vscale x 1 x half> %vd
|
|
}
|
|
|
|
declare <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half>, <vscale x 2 x half>, <vscale x 2 x half>)
|
|
|
|
define <vscale x 2 x half> @vfmadd_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv2f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v8, v10, v9
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv2f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v11
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vc, <vscale x 2 x half> %vb)
|
|
ret <vscale x 2 x half> %vd
|
|
}
|
|
|
|
define <vscale x 2 x half> @vfmadd_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv2f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
|
|
; ZVFH-NEXT: vfmacc.vf v8, fa0, v9
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv2f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8
|
|
; ZVFHMIN-NEXT: vmv.v.x v8, a0
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v9, v11, v10
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 2 x half> poison, half %c, i32 0
|
|
%splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
|
|
%vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %vb, <vscale x 2 x half> %splat, <vscale x 2 x half> %va)
|
|
ret <vscale x 2 x half> %vd
|
|
}
|
|
|
|
declare <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half>, <vscale x 4 x half>, <vscale x 4 x half>)
|
|
|
|
define <vscale x 4 x half> @vfmadd_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv4f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v8, v9, v10
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv4f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v14, v10, v12
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %vb, <vscale x 4 x half> %va, <vscale x 4 x half> %vc)
|
|
ret <vscale x 4 x half> %vd
|
|
}
|
|
|
|
define <vscale x 4 x half> @vfmadd_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv4f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vf v8, fa0, v9
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv4f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9
|
|
; ZVFHMIN-NEXT: vmv.v.x v9, a0
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v14, v12, v10
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 4 x half> poison, half %c, i32 0
|
|
%splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
|
|
%vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %splat, <vscale x 4 x half> %vb)
|
|
ret <vscale x 4 x half> %vd
|
|
}
|
|
|
|
declare <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>)
|
|
|
|
define <vscale x 8 x half> @vfmadd_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv8f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma
|
|
; ZVFH-NEXT: vfmacc.vv v8, v12, v10
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv8f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v24, v20, v16
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %vc, <vscale x 8 x half> %va)
|
|
ret <vscale x 8 x half> %vd
|
|
}
|
|
|
|
define <vscale x 8 x half> @vfmadd_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv8f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma
|
|
; ZVFH-NEXT: vfmacc.vf v8, fa0, v10
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv8f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8
|
|
; ZVFHMIN-NEXT: vmv.v.x v8, a0
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v20, v16, v12
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 8 x half> poison, half %c, i32 0
|
|
%splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
|
|
%vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %splat, <vscale x 8 x half> %va)
|
|
ret <vscale x 8 x half> %vd
|
|
}
|
|
|
|
declare <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half>, <vscale x 16 x half>, <vscale x 16 x half>)
|
|
|
|
define <vscale x 16 x half> @vfmadd_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv16f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vv v8, v16, v12
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv16f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v16, v0, v24
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %vc, <vscale x 16 x half> %va, <vscale x 16 x half> %vb)
|
|
ret <vscale x 16 x half> %vd
|
|
}
|
|
|
|
define <vscale x 16 x half> @vfmadd_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv16f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFH-NEXT: vfmadd.vf v8, fa0, v12
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv16f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12
|
|
; ZVFHMIN-NEXT: vmv.v.x v12, a0
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v12
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v0, v24, v16
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 16 x half> poison, half %c, i32 0
|
|
%splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
|
|
%vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %splat, <vscale x 16 x half> %vb)
|
|
ret <vscale x 16 x half> %vd
|
|
}
|
|
|
|
declare <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half>, <vscale x 32 x half>, <vscale x 32 x half>)
|
|
|
|
define <vscale x 32 x half> @vfmadd_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) {
|
|
; ZVFH-LABEL: vfmadd_vv_nxv32f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vl8re16.v v24, (a0)
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma
|
|
; ZVFH-NEXT: vfmacc.vv v8, v16, v24
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vv_nxv32f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: addi sp, sp, -16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16
|
|
; ZVFHMIN-NEXT: csrr a1, vlenb
|
|
; ZVFHMIN-NEXT: slli a1, a1, 5
|
|
; ZVFHMIN-NEXT: sub sp, sp, a1
|
|
; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vmv8r.v v0, v16
|
|
; ZVFHMIN-NEXT: addi a1, sp, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vmv8r.v v16, v8
|
|
; ZVFHMIN-NEXT: vl8re16.v v8, (a0)
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v0
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 3
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 3
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v0, v8, v24
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: addi a0, sp, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v28
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v16, v8, v24
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 5
|
|
; ZVFHMIN-NEXT: add sp, sp, a0
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16
|
|
; ZVFHMIN-NEXT: addi sp, sp, 16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0
|
|
; ZVFHMIN-NEXT: ret
|
|
%vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %vc, <vscale x 32 x half> %vb, <vscale x 32 x half> %va)
|
|
ret <vscale x 32 x half> %vd
|
|
}
|
|
|
|
define <vscale x 32 x half> @vfmadd_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) {
|
|
; ZVFH-LABEL: vfmadd_vf_nxv32f16:
|
|
; ZVFH: # %bb.0:
|
|
; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma
|
|
; ZVFH-NEXT: vfmacc.vf v8, fa0, v16
|
|
; ZVFH-NEXT: ret
|
|
;
|
|
; ZVFHMIN-LABEL: vfmadd_vf_nxv32f16:
|
|
; ZVFHMIN: # %bb.0:
|
|
; ZVFHMIN-NEXT: addi sp, sp, -16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 5
|
|
; ZVFHMIN-NEXT: sub sp, sp, a0
|
|
; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vmv8r.v v0, v16
|
|
; ZVFHMIN-NEXT: addi a0, sp, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vmv8r.v v16, v8
|
|
; ZVFHMIN-NEXT: fmv.x.h a0, fa0
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16
|
|
; ZVFHMIN-NEXT: csrr a1, vlenb
|
|
; ZVFHMIN-NEXT: slli a1, a1, 4
|
|
; ZVFHMIN-NEXT: add a1, sp, a1
|
|
; ZVFHMIN-NEXT: addi a1, a1, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v0
|
|
; ZVFHMIN-NEXT: csrr a1, vlenb
|
|
; ZVFHMIN-NEXT: slli a1, a1, 3
|
|
; ZVFHMIN-NEXT: add a1, sp, a1
|
|
; ZVFHMIN-NEXT: addi a1, a1, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a1) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vmv.v.x v24, a0
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v0
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 3
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v8, v24, v0
|
|
; ZVFHMIN-NEXT: vmv.v.v v24, v8
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill
|
|
; ZVFHMIN-NEXT: addi a0, sp, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: li a1, 24
|
|
; ZVFHMIN-NEXT: mul a0, a0, a1
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v4
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 4
|
|
; ZVFHMIN-NEXT: add a0, sp, a0
|
|
; ZVFHMIN-NEXT: addi a0, a0, 16
|
|
; ZVFHMIN-NEXT: vl8r.v v0, (a0) # Unknown-size Folded Reload
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
|
|
; ZVFHMIN-NEXT: vfmadd.vv v16, v8, v0
|
|
; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24
|
|
; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16
|
|
; ZVFHMIN-NEXT: csrr a0, vlenb
|
|
; ZVFHMIN-NEXT: slli a0, a0, 5
|
|
; ZVFHMIN-NEXT: add sp, sp, a0
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16
|
|
; ZVFHMIN-NEXT: addi sp, sp, 16
|
|
; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0
|
|
; ZVFHMIN-NEXT: ret
|
|
%head = insertelement <vscale x 32 x half> poison, half %c, i32 0
|
|
%splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
|
|
%vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %vb, <vscale x 32 x half> %splat, <vscale x 32 x half> %va)
|
|
ret <vscale x 32 x half> %vd
|
|
}
|
|
|
|
declare <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>)
|
|
|
|
define <vscale x 1 x float> @vfmadd_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv1f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v9, v10
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc)
|
|
ret <vscale x 1 x float> %vd
|
|
}
|
|
|
|
define <vscale x 1 x float> @vfmadd_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv1f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vf v8, fa0, v9
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 1 x float> poison, float %c, i32 0
|
|
%splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
|
|
%vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %splat, <vscale x 1 x float> %vb)
|
|
ret <vscale x 1 x float> %vd
|
|
}
|
|
|
|
declare <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>)
|
|
|
|
define <vscale x 2 x float> @vfmadd_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv2f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v10, v9
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vc, <vscale x 2 x float> %vb)
|
|
ret <vscale x 2 x float> %vd
|
|
}
|
|
|
|
define <vscale x 2 x float> @vfmadd_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv2f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
|
|
; CHECK-NEXT: vfmacc.vf v8, fa0, v9
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 2 x float> poison, float %c, i32 0
|
|
%splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
|
|
%vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vb, <vscale x 2 x float> %splat, <vscale x 2 x float> %va)
|
|
ret <vscale x 2 x float> %vd
|
|
}
|
|
|
|
declare <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>)
|
|
|
|
define <vscale x 4 x float> @vfmadd_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv4f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v10, v12
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %va, <vscale x 4 x float> %vc)
|
|
ret <vscale x 4 x float> %vd
|
|
}
|
|
|
|
define <vscale x 4 x float> @vfmadd_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv4f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vf v8, fa0, v10
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 4 x float> poison, float %c, i32 0
|
|
%splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
|
|
%vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %splat, <vscale x 4 x float> %vb)
|
|
ret <vscale x 4 x float> %vd
|
|
}
|
|
|
|
declare <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>)
|
|
|
|
define <vscale x 8 x float> @vfmadd_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv8f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
|
|
; CHECK-NEXT: vfmacc.vv v8, v16, v12
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %vc, <vscale x 8 x float> %va)
|
|
ret <vscale x 8 x float> %vd
|
|
}
|
|
|
|
define <vscale x 8 x float> @vfmadd_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv8f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
|
|
; CHECK-NEXT: vfmacc.vf v8, fa0, v12
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 8 x float> poison, float %c, i32 0
|
|
%splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
|
|
%vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %splat, <vscale x 8 x float> %va)
|
|
ret <vscale x 8 x float> %vd
|
|
}
|
|
|
|
declare <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>)
|
|
|
|
define <vscale x 16 x float> @vfmadd_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv16f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vl8re32.v v24, (a0)
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v24, v16
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %va, <vscale x 16 x float> %vb)
|
|
ret <vscale x 16 x float> %vd
|
|
}
|
|
|
|
define <vscale x 16 x float> @vfmadd_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv16f32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
|
|
; CHECK-NEXT: vfmadd.vf v8, fa0, v16
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 16 x float> poison, float %c, i32 0
|
|
%splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
|
|
%vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %splat, <vscale x 16 x float> %vb)
|
|
ret <vscale x 16 x float> %vd
|
|
}
|
|
|
|
declare <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>)
|
|
|
|
define <vscale x 1 x double> @vfmadd_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv1f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v9, v10
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc)
|
|
ret <vscale x 1 x double> %vd
|
|
}
|
|
|
|
define <vscale x 1 x double> @vfmadd_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv1f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
|
|
; CHECK-NEXT: vfmadd.vf v8, fa0, v9
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 1 x double> poison, double %c, i32 0
|
|
%splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
|
|
%vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %splat, <vscale x 1 x double> %vb)
|
|
ret <vscale x 1 x double> %vd
|
|
}
|
|
|
|
declare <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>)
|
|
|
|
define <vscale x 2 x double> @vfmadd_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv2f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v12, v10
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vc, <vscale x 2 x double> %vb)
|
|
ret <vscale x 2 x double> %vd
|
|
}
|
|
|
|
define <vscale x 2 x double> @vfmadd_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv2f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
|
|
; CHECK-NEXT: vfmacc.vf v8, fa0, v10
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 2 x double> poison, double %c, i32 0
|
|
%splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
|
|
%vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vb, <vscale x 2 x double> %splat, <vscale x 2 x double> %va)
|
|
ret <vscale x 2 x double> %vd
|
|
}
|
|
|
|
declare <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>)
|
|
|
|
define <vscale x 4 x double> @vfmadd_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv4f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
|
|
; CHECK-NEXT: vfmadd.vv v8, v12, v16
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vb, <vscale x 4 x double> %va, <vscale x 4 x double> %vc)
|
|
ret <vscale x 4 x double> %vd
|
|
}
|
|
|
|
define <vscale x 4 x double> @vfmadd_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv4f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
|
|
; CHECK-NEXT: vfmadd.vf v8, fa0, v12
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 4 x double> poison, double %c, i32 0
|
|
%splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
|
|
%vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %splat, <vscale x 4 x double> %vb)
|
|
ret <vscale x 4 x double> %vd
|
|
}
|
|
|
|
declare <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>)
|
|
|
|
define <vscale x 8 x double> @vfmadd_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) {
|
|
; CHECK-LABEL: vfmadd_vv_nxv8f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vl8re64.v v24, (a0)
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
|
|
; CHECK-NEXT: vfmacc.vv v8, v16, v24
|
|
; CHECK-NEXT: ret
|
|
%vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %vc, <vscale x 8 x double> %va)
|
|
ret <vscale x 8 x double> %vd
|
|
}
|
|
|
|
define <vscale x 8 x double> @vfmadd_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) {
|
|
; CHECK-LABEL: vfmadd_vf_nxv8f64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
|
|
; CHECK-NEXT: vfmacc.vf v8, fa0, v16
|
|
; CHECK-NEXT: ret
|
|
%head = insertelement <vscale x 8 x double> poison, double %c, i32 0
|
|
%splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
|
|
%vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %splat, <vscale x 8 x double> %va)
|
|
ret <vscale x 8 x double> %vd
|
|
}
|