[llvm] [AMDGPU] selecting v_sat_pk instruction, version 2 (PR #123297)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 28 00:55:05 PST 2025


================
@@ -6613,6 +6638,43 @@ void SITargetLowering::ReplaceNodeResults(SDNode *N,
     Results.push_back(lowerFSQRTF16(SDValue(N, 0), DAG));
     break;
   }
+  case ISD::TRUNCATE_SSAT_U: {
+    SDLoc SL(N);
+    SDValue Src = N->getOperand(0);
+    EVT SrcVT = Src.getValueType();
+    EVT DstVT = N->getValueType(0);
+
+    assert(SrcVT.isVector() && DstVT.isVector());
+
+    unsigned EleNo = SrcVT.getVectorNumElements();
+    assert(EleNo == DstVT.getVectorNumElements());
+
+    if (EleNo == 2) {
+      SDValue Op =
+          DAG.getNode(AMDGPUISD::SAT_PK_CAST, SL, MVT::i16, N->getOperand(0));
+      Op = DAG.getNode(ISD::BITCAST, SL, N->getValueType(0), Op);
+      Results.push_back(Op);
+    } else {
+      // Must be even number
+      assert((EleNo & 1) == 0);
+      SmallVector<SDValue> DstPairs;
+      EVT SrcEleVT = SrcVT.getVectorElementType();
+      EVT DstEleVT = DstVT.getVectorElementType();
+      EVT SrcPairVT = EVT::getVectorVT(*DAG.getContext(), SrcEleVT, 2);
+      EVT DstPairVT = EVT::getVectorVT(*DAG.getContext(), DstEleVT, 2);
+      for (unsigned i = 0; i + 1 < EleNo; i = i + 2) {
----------------
arsenm wrote:

```suggestion
      for (unsigned I = 0;  I != EleNo; I += 2) {
```

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


More information about the llvm-commits mailing list