Skip to content

Commit 75f4baa

Browse files
authored
SystemZ: Implement copyPhysReg between vr128 and gr128 (llvm#90616)
I have no idea if this is correct and I probably swapped the element ordering somewhere.
1 parent 928db7e commit 75f4baa

File tree

3 files changed

+173
-0
lines changed

3 files changed

+173
-0
lines changed

llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,31 @@ void SystemZInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
866866
return;
867867
}
868868

869+
if (SystemZ::GR128BitRegClass.contains(DestReg) &&
870+
SystemZ::VR128BitRegClass.contains(SrcReg)) {
871+
MCRegister DestH64 = RI.getSubReg(DestReg, SystemZ::subreg_h64);
872+
MCRegister DestL64 = RI.getSubReg(DestReg, SystemZ::subreg_l64);
873+
874+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLGVG), DestH64)
875+
.addReg(SrcReg)
876+
.addReg(SystemZ::NoRegister)
877+
.addImm(0)
878+
.addDef(DestReg, RegState::Implicit);
879+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLGVG), DestL64)
880+
.addReg(SrcReg, getKillRegState(KillSrc))
881+
.addReg(SystemZ::NoRegister)
882+
.addImm(1);
883+
return;
884+
}
885+
886+
if (SystemZ::VR128BitRegClass.contains(DestReg) &&
887+
SystemZ::GR128BitRegClass.contains(SrcReg)) {
888+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLVGP), DestReg)
889+
.addReg(RI.getSubReg(SrcReg, SystemZ::subreg_h64))
890+
.addReg(RI.getSubReg(SrcReg, SystemZ::subreg_l64));
891+
return;
892+
}
893+
869894
// Everything else needs only one instruction.
870895
unsigned Opcode;
871896
if (SystemZ::GR64BitRegClass.contains(DestReg, SrcReg))
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2+
# RUN: llc -mtriple=s390x-ibm-linux -mcpu=z13 -run-pass=postrapseudos -o - %s | FileCheck %s
3+
4+
---
5+
name: copy_gr128_to_vr128__r0q_to_v0
6+
tracksRegLiveness: true
7+
body: |
8+
bb.0:
9+
liveins: $r0q
10+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0
11+
; CHECK: liveins: $r0q
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: $v0 = VLVGP $r0d, $r1d
14+
; CHECK-NEXT: Return implicit $v0
15+
$v0 = COPY $r0q
16+
Return implicit $v0
17+
...
18+
19+
---
20+
name: copy_gr128_to_vr128__r0q_to_v0_killed
21+
tracksRegLiveness: true
22+
body: |
23+
bb.0:
24+
liveins: $r0q
25+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_killed
26+
; CHECK: liveins: $r0q
27+
; CHECK-NEXT: {{ $}}
28+
; CHECK-NEXT: $v0 = VLVGP $r0d, $r1d
29+
; CHECK-NEXT: Return implicit $v0
30+
$v0 = COPY killed $r0q
31+
Return implicit $v0
32+
...
33+
34+
---
35+
name: copy_gr128_to_vr128__r0q_to_v0_undef
36+
tracksRegLiveness: true
37+
body: |
38+
bb.0:
39+
liveins: $r0q
40+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_undef
41+
; CHECK: liveins: $r0q
42+
; CHECK-NEXT: {{ $}}
43+
; CHECK-NEXT: $v0 = KILL undef $r0q
44+
; CHECK-NEXT: Return implicit $v0
45+
$v0 = COPY undef $r0q
46+
Return implicit $v0
47+
...
48+
49+
---
50+
name: copy_gr128_to_vr128__r0q_to_v0_subreg0
51+
tracksRegLiveness: true
52+
body: |
53+
bb.0:
54+
liveins: $r0d
55+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_subreg0
56+
; CHECK: liveins: $r0d
57+
; CHECK-NEXT: {{ $}}
58+
; CHECK-NEXT: $v0 = VLVGP $r0d, $r1d
59+
; CHECK-NEXT: Return implicit $v0
60+
$v0 = COPY $r0q
61+
Return implicit $v0
62+
...
63+
64+
---
65+
name: copy_gr128_to_vr128__r0q_to_v0_subreg1
66+
tracksRegLiveness: true
67+
body: |
68+
bb.0:
69+
liveins: $r1d
70+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_subreg1
71+
; CHECK: liveins: $r1d
72+
; CHECK-NEXT: {{ $}}
73+
; CHECK-NEXT: $v0 = VLVGP $r0d, $r1d
74+
; CHECK-NEXT: Return implicit $v0
75+
$v0 = COPY $r0q
76+
Return implicit $v0
77+
...
78+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2+
# RUN: llc -mtriple=s390x-ibm-linux -mcpu=z13 -run-pass=postrapseudos -o - %s | FileCheck %s
3+
4+
---
5+
name: copy_vr128_to_gr128__v0_to_r0q
6+
tracksRegLiveness: true
7+
body: |
8+
bb.0:
9+
liveins: $v0
10+
; CHECK-LABEL: name: copy_vr128_to_gr128__v0_to_r0q
11+
; CHECK: liveins: $v0
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: $r0d = VLGVG $v0, $noreg, 0, implicit-def $r0q
14+
; CHECK-NEXT: $r1d = VLGVG $v0, $noreg, 1
15+
; CHECK-NEXT: Return implicit $r0q
16+
$r0q = COPY $v0
17+
Return implicit $r0q
18+
...
19+
20+
---
21+
name: copy_vr128_to_gr128__v0_to_r0q_killed
22+
tracksRegLiveness: true
23+
body: |
24+
bb.0:
25+
liveins: $v0
26+
; CHECK-LABEL: name: copy_vr128_to_gr128__v0_to_r0q_killed
27+
; CHECK: liveins: $v0
28+
; CHECK-NEXT: {{ $}}
29+
; CHECK-NEXT: $r0d = VLGVG $v0, $noreg, 0, implicit-def $r0q
30+
; CHECK-NEXT: $r1d = VLGVG killed $v0, $noreg, 1
31+
; CHECK-NEXT: Return implicit $r0q
32+
$r0q = COPY killed $v0
33+
Return implicit $r0q
34+
...
35+
36+
---
37+
name: copy_vr128_to_gr128__v0_to_r0q_undef
38+
tracksRegLiveness: true
39+
body: |
40+
bb.0:
41+
; CHECK-LABEL: name: copy_vr128_to_gr128__v0_to_r0q_undef
42+
; CHECK: $r0q = KILL undef $v0
43+
; CHECK-NEXT: Return implicit $r0q
44+
$r0q = COPY undef $v0
45+
Return implicit $r0q
46+
...
47+
48+
---
49+
name: copy_vr128_to_gr128__v0_to_r0q_undef_use_subreg0
50+
tracksRegLiveness: true
51+
body: |
52+
bb.0:
53+
; CHECK-LABEL: name: copy_vr128_to_gr128__v0_to_r0q_undef_use_subreg0
54+
; CHECK: $r0q = KILL undef $v0
55+
; CHECK-NEXT: Return implicit $r0d
56+
$r0q = COPY undef $v0
57+
Return implicit $r0d
58+
...
59+
60+
---
61+
name: copy_vr128_to_gr128__v0_to_r0q_undef_use_subreg1
62+
tracksRegLiveness: true
63+
body: |
64+
bb.0:
65+
; CHECK-LABEL: name: copy_vr128_to_gr128__v0_to_r0q_undef_use_subreg1
66+
; CHECK: $r0q = KILL undef $v0
67+
; CHECK-NEXT: Return implicit $r1d
68+
$r0q = COPY undef $v0
69+
Return implicit $r1d
70+
...

0 commit comments

Comments
 (0)