[llvm] [X86] Lower mathlib call ldexp into scalef when avx512 is enabled (PR #166839)

Kavin Gnanapandithan via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 17 08:12:55 PST 2025


================
@@ -19153,6 +19155,89 @@ SDValue X86TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
   return SDValue();
 }
 
+static SDValue LowerFLDEXP(SDValue Op, const X86Subtarget &Subtarget,
+                           SelectionDAG &DAG) {
+  SDLoc DL(Op);
+  SDValue X = Op.getOperand(0);
+  MVT XTy = X.getSimpleValueType();
+  SDValue Exp = Op.getOperand(1);
+  MVT ExtVT;
+
+  switch (XTy.SimpleTy) {
+  default:
+    return SDValue();
+  case MVT::f16:
+    if (!Subtarget.hasFP16()) {
+      X = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, X);
+    }
+    break;
+  case MVT::f32:
+  case MVT::f64:
+    break;
+  case MVT::v4f32:
+  case MVT::v2f64:
+  case MVT::v8f32:
+  case MVT::v4f64:
+  case MVT::v16f32:
+  case MVT::v8f64:
+    if (XTy.getSizeInBits() == 512 || Subtarget.hasVLX()) {
+      Exp = DAG.getNode(ISD::SINT_TO_FP, DL, XTy, Exp);
+      return DAG.getNode(X86ISD::SCALEF, DL, XTy, X, Exp, X);
+    }
+    Exp = DAG.getNode(ISD::SINT_TO_FP, DL, X.getValueType(), Exp);
+    break;
+  case MVT::v8f16:
+  case MVT::v16f16:
+    if (Subtarget.hasFP16()) {
+      if (Subtarget.hasVLX()) {
+        Exp = DAG.getNode(ISD::SINT_TO_FP, DL, XTy, Exp);
+        return DAG.getNode(X86ISD::SCALEF, DL, XTy, X, Exp, X);
+      }
+      break;
+    }
+    ExtVT = XTy.changeVectorElementType(MVT::f32);
+    X = DAG.getNode(ISD::FP_EXTEND, DL, ExtVT, X);
+    Exp = DAG.getNode(ISD::SIGN_EXTEND, DL, ExtVT.changeTypeToInteger(), Exp);
+    break;
+  case MVT::v32f16:
+    if (Subtarget.hasFP16()) {
+      Exp = DAG.getNode(ISD::SINT_TO_FP, DL, XTy, Exp);
+      return DAG.getNode(X86ISD::SCALEF, DL, XTy, X, Exp, X);
+    }
+    return splitVectorOp(Op, DAG, DL);
+  }
+
+  if (XTy.isVector()) {
+    SDValue WideX = widenSubVector(X, true, Subtarget, DAG, DL, 512);
+    SDValue WideExp = widenSubVector(Exp, true, Subtarget, DAG, DL, 512);
+    if (XTy.getScalarType() == MVT::f16 && !Subtarget.hasFP16()) {
+      WideExp =
+          DAG.getNode(ISD::SINT_TO_FP, DL, WideX.getSimpleValueType(), WideExp);
+      SDValue Scalef = DAG.getNode(X86ISD::SCALEF, DL, WideX.getValueType(),
+                                   WideX, WideExp, WideX);
+      SDValue Final =
+          DAG.getExtractSubvector(DL, X.getSimpleValueType(), Scalef, 0);
+      return DAG.getNode(ISD::FP_ROUND, DL, XTy, Final,
+                         DAG.getTargetConstant(0, DL, MVT::i32));
+    }
+    SDValue Scalef = DAG.getNode(X86ISD::SCALEF, DL, WideX.getValueType(),
+                                 WideX, WideExp, WideX);
+    return DAG.getExtractSubvector(DL, XTy, Scalef, 0);
+  } else {
+    MVT VT = MVT::getVectorVT(X.getSimpleValueType(),
----------------
KavinTheG wrote:

Will fix. I'll opt for the latter. 

https://github.com/llvm/llvm-project/pull/166839


More information about the llvm-commits mailing list