Skip to content

Commit

Permalink
SystemZ: Handle gr128 to fp128 copies in copyPhysReg (#90861)
Browse files Browse the repository at this point in the history
  • Loading branch information
arsenm committed May 2, 2024
1 parent eb3a671 commit d11afe1
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
16 changes: 16 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,22 @@ void SystemZInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
return;
}

if (SystemZ::FP128BitRegClass.contains(DestReg) &&
SystemZ::GR128BitRegClass.contains(SrcReg)) {
MCRegister DestRegHi = RI.getSubReg(DestReg, SystemZ::subreg_h64);
MCRegister DestRegLo = RI.getSubReg(DestReg, SystemZ::subreg_l64);
MCRegister SrcRegHi = RI.getSubReg(SrcReg, SystemZ::subreg_h64);
MCRegister SrcRegLo = RI.getSubReg(SrcReg, SystemZ::subreg_l64);

BuildMI(MBB, MBBI, DL, get(SystemZ::LDGR), DestRegHi)
.addReg(SrcRegHi)
.addReg(DestReg, RegState::ImplicitDefine);

BuildMI(MBB, MBBI, DL, get(SystemZ::LDGR), DestRegLo)
.addReg(SrcRegLo, getKillRegState(KillSrc));
return;
}

// Move CC value from a GR32.
if (DestReg == SystemZ::CC) {
unsigned Opcode =
Expand Down
49 changes: 49 additions & 0 deletions llvm/test/CodeGen/SystemZ/copy-phys-reg-gr128-to-fp128.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
# RUN: llc -mtriple=s390x-ibm-linux -mcpu=z13 -run-pass=postrapseudos -verify-machineinstrs -o - %s | FileCheck %s

---
name: copy_gr128_to_fp128__r0q_to_f0q
tracksRegLiveness: true
body: |
bb.0:
liveins: $r0q
; CHECK-LABEL: name: copy_gr128_to_fp128__r0q_to_f0q
; CHECK: liveins: $r0q
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $f0d = LDGR $r0d, implicit-def $f0q
; CHECK-NEXT: $f2d = LDGR $r1d
; CHECK-NEXT: Return implicit $f0q
$f0q = COPY $r0q
Return implicit $f0q
...

---
name: copy_gr128_to_fp128__r0q_to_f0q_killed
tracksRegLiveness: true
body: |
bb.0:
liveins: $r0q
; CHECK-LABEL: name: copy_gr128_to_fp128__r0q_to_f0q_killed
; CHECK: liveins: $r0q
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $f0d = LDGR $r0d, implicit-def $f0q
; CHECK-NEXT: $f2d = LDGR killed $r1d
; CHECK-NEXT: Return implicit $f0q
$f0q = COPY killed $r0q
Return implicit $f0q
...

---
name: copy_gr128_to_fp128__r0q_to_f0q_undef
tracksRegLiveness: true
body: |
bb.0:
liveins: $r0q
; CHECK-LABEL: name: copy_gr128_to_fp128__r0q_to_f0q_undef
; CHECK: liveins: $r0q
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $f0q = KILL undef $r0q
; CHECK-NEXT: Return implicit $f0q
$f0q = COPY undef $r0q
Return implicit $f0q
...

0 comments on commit d11afe1

Please sign in to comment.