[llvm] [LLVM][CodeGen] Add lowering for scalable vector bfloat operations. (PR #109803)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 25 08:59:24 PDT 2024
================
@@ -28466,6 +28520,40 @@ SDValue AArch64TargetLowering::LowerFixedLengthInsertVectorElt(
return convertFromScalableVector(DAG, VT, ScalableRes);
}
+// Lower bfloat16 operations by upcasting to float32, performing the operation
+// and then downcasting the result back to bfloat16.
+SDValue AArch64TargetLowering::LowerBFloatOp(SDValue Op,
+ SelectionDAG &DAG) const {
+ SDLoc DL(Op);
+ EVT VT = Op.getValueType();
+ assert(isTypeLegal(VT) && VT.isScalableVector() && "Unexpected type!");
+
+ // Split the vector and try again.
+ if (VT == MVT::nxv8bf16) {
+ SmallVector<SDValue, 4> LoOps, HiOps;
+ for (const SDValue &V : Op->op_values()) {
+ LoOps.push_back(DAG.getExtractSubvector(DL, MVT::nxv4bf16, V, 0));
+ HiOps.push_back(DAG.getExtractSubvector(DL, MVT::nxv4bf16, V, 4));
+ }
+
+ unsigned Opc = Op.getOpcode();
+ SDValue SplitOpLo = DAG.getNode(Opc, DL, MVT::nxv4bf16, LoOps);
+ SDValue SplitOpHi = DAG.getNode(Opc, DL, MVT::nxv4bf16, HiOps);
+ return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, SplitOpLo, SplitOpHi);
+ }
----------------
paulwalker-arm wrote:
I was perhaps being too adventurous but by restricting the expansion to bf16 vectors the fallout shrank significantly so I've kept it with this PR to maintain sufficient testing.
https://github.com/llvm/llvm-project/pull/109803
More information about the llvm-commits
mailing list