@@ -71,6 +71,34 @@ define i32 @getC() {
7171 ret i32 %res
7272}
7373
74+ ; CHECK-LABEL: _getCPair
75+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
76+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
77+ ; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
78+ ; CHECK-NEXT: ldr {{[xw]}}[[LDRGOT_REG:[0-9]+]], [[[ADRP_REG]], _C@GOTPAGEOFF]
79+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
80+ ; CHECK-NEXT: ldp q0, q1, [x[[LDRGOT_REG]]]
81+ ; CHECK-NEXT: ret
82+ ; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
83+ define <8 x i32 > @getCPair () {
84+ %res = load <8 x i32 >, ptr @C , align 4
85+ ret <8 x i32 > %res
86+ }
87+
88+ ; CHECK-LABEL: _getCNontemporalPair
89+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
90+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
91+ ; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
92+ ; CHECK-NEXT: ldr {{[xw]}}[[LDRGOT_REG:[0-9]+]], [[[ADRP_REG]], _C@GOTPAGEOFF]
93+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
94+ ; CHECK-NEXT: ldnp q0, q1, [x[[LDRGOT_REG]]]
95+ ; CHECK-NEXT: ret
96+ ; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
97+ define <8 x i32 > @getCNontemporalPair () {
98+ %res = load <8 x i32 >, ptr @C , align 4 , !nontemporal !0
99+ ret <8 x i32 > %res
100+ }
101+
74102; LDRSW supports loading from a literal.
75103; Make sure we emit AdrpLdrGotLdr for those.
76104; CHECK-LABEL: _getSExtC
@@ -126,6 +154,36 @@ entry:
126154 ret void
127155}
128156
157+ ; CHECK-LABEL: _setCPair
158+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
159+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
160+ ; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
161+ ; CHECK-NEXT: ldr {{[xw]}}[[LDRGOT_REG:[0-9]+]], [[[ADRP_REG]], _C@GOTPAGEOFF]
162+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
163+ ; CHECK-NEXT: stp q0, q1, [x[[LDRGOT_REG]]]
164+ ; CHECK-NEXT: ret
165+ ; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
166+ define void @setCPair (<8 x i32 > %t ) {
167+ entry:
168+ store <8 x i32 > %t , ptr @C , align 4
169+ ret void
170+ }
171+
172+ ; CHECK-LABEL: _setCNontemporalPair
173+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
174+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
175+ ; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
176+ ; CHECK-NEXT: ldr {{[xw]}}[[LDRGOT_REG:[0-9]+]], [[[ADRP_REG]], _C@GOTPAGEOFF]
177+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
178+ ; CHECK-NEXT: stnp q0, q1, [x[[LDRGOT_REG]]]
179+ ; CHECK-NEXT: ret
180+ ; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
181+ define void @setCNontemporalPair (<8 x i32 > %t ) {
182+ entry:
183+ store <8 x i32 > %t , ptr @C , align 4 , !nontemporal !0
184+ ret void
185+ }
186+
129187; Perform the same tests for internal global and a displacement
130188; in the addressing mode.
131189; Indeed we will get an ADD for those instead of LOADGot.
@@ -148,6 +206,51 @@ define i32 @getInternalCPlus4() {
148206 ret i32 %res
149207}
150208
209+ ; CHECK-LABEL: _getInternalCUnscaled
210+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
211+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
212+ ; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
213+ ; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
214+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
215+ ; CHECK-NEXT: ldur w0, [[[ADDGOT_REG]], #-4]
216+ ; CHECK-NEXT: ret
217+ ; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
218+ define i32 @getInternalCUnscaled () {
219+ %addr = getelementptr inbounds i32 , ptr @InternalC , i32 -1
220+ %res = load i32 , ptr %addr , align 4
221+ ret i32 %res
222+ }
223+
224+ ; CHECK-LABEL: _getInternalCPair
225+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
226+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
227+ ; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
228+ ; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
229+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
230+ ; CHECK-NEXT: ldp q0, q1, [[[ADDGOT_REG]], #16]
231+ ; CHECK-NEXT: ret
232+ ; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
233+ define <8 x i32 > @getInternalCPair () {
234+ %addr = getelementptr inbounds i32 , ptr @InternalC , i32 4
235+ %res = load <8 x i32 >, ptr %addr , align 4
236+ ret <8 x i32 > %res
237+ }
238+
239+ ; CHECK-LABEL: _getInternalCNontemporalPair
240+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
241+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
242+ ; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
243+ ; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
244+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
245+ ; CHECK-NEXT: ldnp q0, q1, [[[ADDGOT_REG]], #16]
246+ ; CHECK-NEXT: ret
247+ ; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
248+ define <8 x i32 > @getInternalCNontemporalPair () {
249+ %addr = getelementptr inbounds i32 , ptr @InternalC , i32 4
250+ %res = load <8 x i32 >, ptr %addr , align 4 , !nontemporal !0
251+ ret <8 x i32 > %res
252+ }
253+
151254; LDRSW supports loading from a literal.
152255; Make sure we emit AdrpLdrGotLdr for those.
153256; CHECK-LABEL: _getSExtInternalCPlus4
@@ -206,6 +309,54 @@ entry:
206309 ret void
207310}
208311
312+ ; CHECK-LABEL: _setInternalCUnscaled
313+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
314+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
315+ ; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
316+ ; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
317+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
318+ ; CHECK-NEXT: stur w0, [[[ADDGOT_REG]], #-4]
319+ ; CHECK-NEXT: ret
320+ ; CHECK: .loh AdrpAddStr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
321+ define void @setInternalCUnscaled (i32 %t ) {
322+ entry:
323+ %addr = getelementptr inbounds i32 , ptr @InternalC , i32 -1
324+ store i32 %t , ptr %addr , align 4
325+ ret void
326+ }
327+
328+ ; CHECK-LABEL: _setInternalCPair
329+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
330+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
331+ ; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
332+ ; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
333+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
334+ ; CHECK-NEXT: stp q0, q1, [[[ADDGOT_REG]], #16]
335+ ; CHECK-NEXT: ret
336+ ; CHECK: .loh AdrpAddStr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
337+ define void @setInternalCPair (<8 x i32 > %t ) {
338+ entry:
339+ %addr = getelementptr inbounds i32 , ptr @InternalC , i32 4
340+ store <8 x i32 > %t , ptr %addr , align 4
341+ ret void
342+ }
343+
344+ ; CHECK-LABEL: _setInternalCNontemporalPair
345+ ; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
346+ ; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
347+ ; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
348+ ; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
349+ ; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
350+ ; CHECK-NEXT: stnp q0, q1, [[[ADDGOT_REG]], #16]
351+ ; CHECK-NEXT: ret
352+ ; CHECK: .loh AdrpAddStr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
353+ define void @_setInternalCNontemporalPair (<8 x i32 > %t ) {
354+ entry:
355+ %addr = getelementptr inbounds i32 , ptr @InternalC , i32 4
356+ store <8 x i32 > %t , ptr %addr , align 4 , !nontemporal !0
357+ ret void
358+ }
359+
209360; Check that we catch AdrpAddLdr case when we have a simple chain:
210361; adrp -> ldr.
211362; CHECK-LABEL: _getInternalC
@@ -679,4 +830,6 @@ if.end.i:
679830}
680831declare void @callee (ptr nocapture readonly , ...)
681832
833+ !0 = !{ i32 1 }
834+
682835attributes #0 = { "target-cpu" ="cyclone" }
0 commit comments