[llvm] SystemZ: Implement copyPhysReg between vr128 and gr128 (PR #90616)

Ulrich Weigand via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 30 09:46:23 PDT 2024


================
@@ -840,6 +840,41 @@ void SystemZInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
     return;
   }
 
+  if (SystemZ::GR128BitRegClass.contains(DestReg) &&
+      SystemZ::VR128BitRegClass.contains(SrcReg)) {
+    MCRegister DestH64 = RI.getSubReg(DestReg, SystemZ::subreg_h64);
+    MCRegister DestL64 = RI.getSubReg(DestReg, SystemZ::subreg_l64);
+
+    BuildMI(MBB, MBBI, DL, get(SystemZ::VLGVG), DestL64)
+        .addReg(SrcReg)
+        .addReg(SystemZ::NoRegister)
+        .addImm(0)
+        .addDef(DestReg, RegState::Implicit);
+    BuildMI(MBB, MBBI, DL, get(SystemZ::VLGVG), DestH64)
+        .addReg(SrcReg, getKillRegState(KillSrc))
+        .addReg(SystemZ::NoRegister)
+        .addImm(1);
+    return;
+  }
+
+  if (SystemZ::VR128BitRegClass.contains(DestReg) &&
+      SystemZ::GR128BitRegClass.contains(SrcReg)) {
+    MCRegister SrcH64 = RI.getSubReg(SrcReg, SystemZ::subreg_h64);
+    MCRegister SrcL64 = RI.getSubReg(SrcReg, SystemZ::subreg_l64);
+
+    BuildMI(MBB, MBBI, DL, get(SystemZ::VLVGG), DestReg)
----------------
uweigand wrote:

Here the order is correct, but it would actually be more efficient to use a single `VLVGP` instruction to load the full VR from two GRs.  Something like:
```
    BuildMI(MBB, MBBI, DL, get(SystemZ::VLVGP), DestReg)
        .addReg(SrcH64)
        .addReg(SrcL64);
```


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


More information about the llvm-commits mailing list