Skip to content

Commit 994bdb1

Browse files
committed
SystemZ: Implement copyPhysReg between vr128 and gr128
I have no idea if this is correct and I probably swapped the element ordering somewhere.
1 parent fe3f6c6 commit 994bdb1

File tree

3 files changed

+187
-0
lines changed

3 files changed

+187
-0
lines changed

llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,41 @@ void SystemZInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
840840
return;
841841
}
842842

843+
if (SystemZ::GR128BitRegClass.contains(DestReg) &&
844+
SystemZ::VR128BitRegClass.contains(SrcReg)) {
845+
MCRegister DestH64 = RI.getSubReg(DestReg, SystemZ::subreg_h64);
846+
MCRegister DestL64 = RI.getSubReg(DestReg, SystemZ::subreg_l64);
847+
848+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLGVG), DestL64)
849+
.addReg(SrcReg)
850+
.addReg(SystemZ::NoRegister)
851+
.addImm(0)
852+
.addDef(DestReg, RegState::Implicit);
853+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLGVG), DestH64)
854+
.addReg(SrcReg, getKillRegState(KillSrc))
855+
.addReg(SystemZ::NoRegister)
856+
.addImm(1);
857+
return;
858+
}
859+
860+
if (SystemZ::VR128BitRegClass.contains(DestReg) &&
861+
SystemZ::GR128BitRegClass.contains(SrcReg)) {
862+
MCRegister SrcH64 = RI.getSubReg(SrcReg, SystemZ::subreg_h64);
863+
MCRegister SrcL64 = RI.getSubReg(SrcReg, SystemZ::subreg_l64);
864+
865+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLVGG), DestReg)
866+
.addReg(DestReg, RegState::Undef)
867+
.addReg(SrcH64)
868+
.addReg(SystemZ::NoRegister)
869+
.addImm(0);
870+
BuildMI(MBB, MBBI, DL, get(SystemZ::VLVGG), DestReg)
871+
.addReg(DestReg)
872+
.addReg(SrcL64)
873+
.addReg(SystemZ::NoRegister)
874+
.addImm(1);
875+
return;
876+
}
877+
843878
// Everything else needs only one instruction.
844879
unsigned Opcode;
845880
if (SystemZ::GR64BitRegClass.contains(DestReg, SrcReg))
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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 = VLVGG undef $v0, $r0d, $noreg, 0
14+
; CHECK-NEXT: $v0 = VLVGG $v0, $r1d, $noreg, 1
15+
; CHECK-NEXT: Return implicit $v0
16+
$v0 = COPY $r0q
17+
Return implicit $v0
18+
...
19+
20+
---
21+
name: copy_gr128_to_vr128__r0q_to_v0_killed
22+
tracksRegLiveness: true
23+
body: |
24+
bb.0:
25+
liveins: $r0q
26+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_killed
27+
; CHECK: liveins: $r0q
28+
; CHECK-NEXT: {{ $}}
29+
; CHECK-NEXT: $v0 = VLVGG undef $v0, $r0d, $noreg, 0
30+
; CHECK-NEXT: $v0 = VLVGG $v0, $r1d, $noreg, 1
31+
; CHECK-NEXT: Return implicit $v0
32+
$v0 = COPY killed $r0q
33+
Return implicit $v0
34+
...
35+
36+
---
37+
name: copy_gr128_to_vr128__r0q_to_v0_undef
38+
tracksRegLiveness: true
39+
body: |
40+
bb.0:
41+
liveins: $r0q
42+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_undef
43+
; CHECK: liveins: $r0q
44+
; CHECK-NEXT: {{ $}}
45+
; CHECK-NEXT: $v0 = KILL undef $r0q
46+
; CHECK-NEXT: Return implicit $v0
47+
$v0 = COPY undef $r0q
48+
Return implicit $v0
49+
...
50+
51+
---
52+
name: copy_gr128_to_vr128__r0q_to_v0_subreg0
53+
tracksRegLiveness: true
54+
body: |
55+
bb.0:
56+
liveins: $r0d
57+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_subreg0
58+
; CHECK: liveins: $r0d
59+
; CHECK-NEXT: {{ $}}
60+
; CHECK-NEXT: $v0 = VLVGG undef $v0, $r0d, $noreg, 0
61+
; CHECK-NEXT: $v0 = VLVGG $v0, $r1d, $noreg, 1
62+
; CHECK-NEXT: Return implicit $v0
63+
$v0 = COPY $r0q
64+
Return implicit $v0
65+
...
66+
67+
---
68+
name: copy_gr128_to_vr128__r0q_to_v0_subreg1
69+
tracksRegLiveness: true
70+
body: |
71+
bb.0:
72+
liveins: $r1d
73+
; CHECK-LABEL: name: copy_gr128_to_vr128__r0q_to_v0_subreg1
74+
; CHECK: liveins: $r1d
75+
; CHECK-NEXT: {{ $}}
76+
; CHECK-NEXT: $v0 = VLVGG undef $v0, $r0d, $noreg, 0
77+
; CHECK-NEXT: $v0 = VLVGG $v0, $r1d, $noreg, 1
78+
; CHECK-NEXT: Return implicit $v0
79+
$v0 = COPY $r0q
80+
Return implicit $v0
81+
...
82+
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: $r1d = VLGVG $v0, $noreg, 0, implicit-def $r0q
14+
; CHECK-NEXT: $r0d = 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: $r1d = VLGVG $v0, $noreg, 0, implicit-def $r0q
30+
; CHECK-NEXT: $r0d = 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)