Skip to content

Commit ed551e3

Browse files
committed
[AArch64] Add PreTest for storing symmetry constant
1 parent 5e06050 commit ed551e3

File tree

2 files changed

+189
-0
lines changed

2 files changed

+189
-0
lines changed

llvm/test/CodeGen/AArch64/movimm-expand-ldst.ll

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,138 @@ define i64 @testuu0xf555f555f555f555() {
9393
; CHECK-NEXT: ret
9494
ret i64 u0xf555f555f555f555
9595
}
96+
97+
define void @test_store_0x1234567812345678(ptr %x) {
98+
; CHECK-LABEL: test_store_0x1234567812345678:
99+
; CHECK: // %bb.0:
100+
; CHECK-NEXT: mov x8, #22136 // =0x5678
101+
; CHECK-NEXT: movk x8, #4660, lsl #16
102+
; CHECK-NEXT: orr x8, x8, x8, lsl #32
103+
; CHECK-NEXT: str x8, [x0]
104+
; CHECK-NEXT: ret
105+
store i64 u0x1234567812345678, ptr %x
106+
ret void
107+
}
108+
109+
define void @test_store_0xff3456ffff3456ff(ptr %x) {
110+
; CHECK-LABEL: test_store_0xff3456ffff3456ff:
111+
; CHECK: // %bb.0:
112+
; CHECK-NEXT: mov x8, #22271 // =0x56ff
113+
; CHECK-NEXT: movk x8, #65332, lsl #16
114+
; CHECK-NEXT: orr x8, x8, x8, lsl #32
115+
; CHECK-NEXT: str x8, [x0]
116+
; CHECK-NEXT: ret
117+
store i64 u0xff3456ffff3456ff, ptr %x
118+
ret void
119+
}
120+
121+
define void @test_store_0x00345600345600(ptr %x) {
122+
; CHECK-LABEL: test_store_0x00345600345600:
123+
; CHECK: // %bb.0:
124+
; CHECK-NEXT: mov x8, #22016 // =0x5600
125+
; CHECK-NEXT: movk x8, #52, lsl #16
126+
; CHECK-NEXT: movk x8, #13398, lsl #32
127+
; CHECK-NEXT: str x8, [x0]
128+
; CHECK-NEXT: ret
129+
store i64 u0x00345600345600, ptr %x
130+
ret void
131+
}
132+
133+
define void @test_store_0x5555555555555555(ptr %x) {
134+
; CHECK-LABEL: test_store_0x5555555555555555:
135+
; CHECK: // %bb.0:
136+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
137+
; CHECK-NEXT: str x8, [x0]
138+
; CHECK-NEXT: ret
139+
store i64 u0x5555555555555555, ptr %x
140+
ret void
141+
}
142+
143+
define void @test_store_0x5055555550555555(ptr %x) {
144+
; CHECK-LABEL: test_store_0x5055555550555555:
145+
; CHECK: // %bb.0:
146+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
147+
; CHECK-NEXT: and x8, x8, #0xf0fffffff0ffffff
148+
; CHECK-NEXT: str x8, [x0]
149+
; CHECK-NEXT: ret
150+
store i64 u0x5055555550555555, ptr %x
151+
ret void
152+
}
153+
154+
define void @test_store_0x0000555555555555(ptr %x) {
155+
; CHECK-LABEL: test_store_0x0000555555555555:
156+
; CHECK: // %bb.0:
157+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
158+
; CHECK-NEXT: movk x8, #0, lsl #48
159+
; CHECK-NEXT: str x8, [x0]
160+
; CHECK-NEXT: ret
161+
store i64 u0x0000555555555555, ptr %x
162+
ret void
163+
}
164+
165+
define void @test_store_0x0000555500005555(ptr %x) {
166+
; CHECK-LABEL: test_store_0x0000555500005555:
167+
; CHECK: // %bb.0:
168+
; CHECK-NEXT: mov x8, #21845 // =0x5555
169+
; CHECK-NEXT: movk x8, #21845, lsl #32
170+
; CHECK-NEXT: str x8, [x0]
171+
; CHECK-NEXT: ret
172+
store i64 u0x0000555500005555, ptr %x
173+
ret void
174+
}
175+
176+
define void @test_store_0x5555000055550000(ptr %x) {
177+
; CHECK-LABEL: test_store_0x5555000055550000:
178+
; CHECK: // %bb.0:
179+
; CHECK-NEXT: mov x8, #1431633920 // =0x55550000
180+
; CHECK-NEXT: movk x8, #21845, lsl #48
181+
; CHECK-NEXT: str x8, [x0]
182+
; CHECK-NEXT: ret
183+
store i64 u0x5555000055550000, ptr %x
184+
ret void
185+
}
186+
187+
define void @test_store_u0xffff5555ffff5555(ptr %x) {
188+
; CHECK-LABEL: test_store_u0xffff5555ffff5555:
189+
; CHECK: // %bb.0:
190+
; CHECK-NEXT: mov x8, #-43691 // =0xffffffffffff5555
191+
; CHECK-NEXT: movk x8, #21845, lsl #32
192+
; CHECK-NEXT: str x8, [x0]
193+
; CHECK-NEXT: ret
194+
store i64 u0xffff5555ffff5555, ptr %x
195+
ret void
196+
}
197+
198+
define void @test_store_0x8888ffff8888ffff(ptr %x) {
199+
; CHECK-LABEL: test_store_0x8888ffff8888ffff:
200+
; CHECK: // %bb.0:
201+
; CHECK-NEXT: mov x8, #-2004287489 // =0xffffffff8888ffff
202+
; CHECK-NEXT: movk x8, #34952, lsl #48
203+
; CHECK-NEXT: str x8, [x0]
204+
; CHECK-NEXT: ret
205+
store i64 u0x8888ffff8888ffff, ptr %x
206+
ret void
207+
}
208+
209+
define void @test_store_uu0xfffff555f555f555(ptr %x) {
210+
; CHECK-LABEL: test_store_uu0xfffff555f555f555:
211+
; CHECK: // %bb.0:
212+
; CHECK-NEXT: mov x8, #-2731 // =0xfffffffffffff555
213+
; CHECK-NEXT: movk x8, #62805, lsl #16
214+
; CHECK-NEXT: movk x8, #62805, lsl #32
215+
; CHECK-NEXT: str x8, [x0]
216+
; CHECK-NEXT: ret
217+
store i64 u0xfffff555f555f555, ptr %x
218+
ret void
219+
}
220+
221+
define void @test_store_uu0xf555f555f555f555(ptr %x) {
222+
; CHECK-LABEL: test_store_uu0xf555f555f555f555:
223+
; CHECK: // %bb.0:
224+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
225+
; CHECK-NEXT: orr x8, x8, #0xe001e001e001e001
226+
; CHECK-NEXT: str x8, [x0]
227+
; CHECK-NEXT: ret
228+
store i64 u0xf555f555f555f555, ptr %x
229+
ret void
230+
}

llvm/test/CodeGen/AArch64/movimm-expand-ldst.mir

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,57 @@ body: |
3232
; CHECK-NEXT: RET undef $lr, implicit $x0
3333
renamable $x0 = MOVi64imm -4550323095879417536
3434
RET_ReallyLR implicit $x0
35+
...
36+
---
37+
name: test_fold_repeating_constant_store
38+
tracksRegLiveness: true
39+
body: |
40+
bb.0:
41+
liveins: $x0
42+
; CHECK-LABEL: name: test_fold_repeating_constant_store
43+
; CHECK: liveins: $x0
44+
; CHECK-NEXT: {{ $}}
45+
; CHECK-NEXT: renamable $x8 = MOVZXi 49370, 0
46+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 320, 16
47+
; CHECK-NEXT: renamable $x8 = ORRXrs $x8, $x8, 32
48+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 0
49+
; CHECK-NEXT: RET undef $lr
50+
renamable $x8 = MOVi64imm 90284035103834330
51+
STRXui killed renamable $x8, killed renamable $x0, 0
52+
RET_ReallyLR
53+
...
54+
---
55+
name: test_fold_repeating_constant_store_neg
56+
tracksRegLiveness: true
57+
body: |
58+
bb.0:
59+
liveins: $x0
60+
; CHECK-LABEL: name: test_fold_repeating_constant_store_neg
61+
; CHECK: liveins: $x0
62+
; CHECK-NEXT: {{ $}}
63+
; CHECK-NEXT: renamable $x8 = MOVZXi 320, 0
64+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 49370, 16
65+
; CHECK-NEXT: renamable $x8 = ORRXrs $x8, $x8, 32
66+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 0
67+
; CHECK-NEXT: RET undef $lr
68+
renamable $x8 = MOVi64imm -4550323095879417536
69+
STRXui killed renamable $x8, killed renamable $x0, 0
70+
RET_ReallyLR
71+
...
72+
---
73+
name: test_fold_repeating_constant_store_16bit_unit
74+
tracksRegLiveness: true
75+
body: |
76+
bb.0:
77+
liveins: $x0
78+
; CHECK-LABEL: name: test_fold_repeating_constant_store_16bit_unit
79+
; CHECK: liveins: $x0
80+
; CHECK-NEXT: {{ $}}
81+
; CHECK-NEXT: renamable $x8 = MOVZXi 21845, 16
82+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 21845, 48
83+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 0
84+
; CHECK-NEXT: RET undef $lr
85+
renamable $x8 = MOVZXi 21845, 16
86+
renamable $x8 = MOVKXi $x8, 21845, 48
87+
STRXui killed renamable $x8, killed renamable $x0, 0
88+
RET undef $lr

0 commit comments

Comments
 (0)