Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-non-pow2-ldst.ll
blobc2ec0502d83bd78ac49c0a2dc6466eff0b15d33e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm64-eabi -verify-machineinstrs | FileCheck %s
4 define i24 @ldi24(ptr %p) nounwind {
5 ; CHECK-LABEL: ldi24:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    ldrb w8, [x0, #2]
8 ; CHECK-NEXT:    ldrh w9, [x0]
9 ; CHECK-NEXT:    orr w0, w9, w8, lsl #16
10 ; CHECK-NEXT:    ret
11     %r = load i24, ptr %p
12     ret i24 %r
15 define i56 @ldi56(ptr %p) nounwind {
16 ; CHECK-LABEL: ldi56:
17 ; CHECK:       // %bb.0:
18 ; CHECK-NEXT:    ldrb w8, [x0, #6]
19 ; CHECK-NEXT:    ldrh w9, [x0, #4]
20 ; CHECK-NEXT:    orr w8, w9, w8, lsl #16
21 ; CHECK-NEXT:    ldr w9, [x0]
22 ; CHECK-NEXT:    orr x0, x9, x8, lsl #32
23 ; CHECK-NEXT:    ret
24     %r = load i56, ptr %p
25     ret i56 %r
28 define i80 @ldi80(ptr %p) nounwind {
29 ; CHECK-LABEL: ldi80:
30 ; CHECK:       // %bb.0:
31 ; CHECK-NEXT:    ldr x8, [x0]
32 ; CHECK-NEXT:    ldrh w1, [x0, #8]
33 ; CHECK-NEXT:    mov x0, x8
34 ; CHECK-NEXT:    ret
35     %r = load i80, ptr %p
36     ret i80 %r
39 define i120 @ldi120(ptr %p) nounwind {
40 ; CHECK-LABEL: ldi120:
41 ; CHECK:       // %bb.0:
42 ; CHECK-NEXT:    ldrb w8, [x0, #14]
43 ; CHECK-NEXT:    ldrh w9, [x0, #12]
44 ; CHECK-NEXT:    orr w8, w9, w8, lsl #16
45 ; CHECK-NEXT:    ldr w9, [x0, #8]
46 ; CHECK-NEXT:    ldr x0, [x0]
47 ; CHECK-NEXT:    orr x1, x9, x8, lsl #32
48 ; CHECK-NEXT:    ret
49     %r = load i120, ptr %p
50     ret i120 %r
53 define i280 @ldi280(ptr %p) nounwind {
54 ; CHECK-LABEL: ldi280:
55 ; CHECK:       // %bb.0:
56 ; CHECK-NEXT:    ldrb w9, [x0, #34]
57 ; CHECK-NEXT:    ldrh w10, [x0, #32]
58 ; CHECK-NEXT:    ldp x8, x1, [x0]
59 ; CHECK-NEXT:    ldp x2, x3, [x0, #16]
60 ; CHECK-NEXT:    orr x4, x10, x9, lsl #16
61 ; CHECK-NEXT:    mov x0, x8
62 ; CHECK-NEXT:    ret
63     %r = load i280, ptr %p
64     ret i280 %r
67 define void @sti24(ptr %p, i24 %a) nounwind {
68 ; CHECK-LABEL: sti24:
69 ; CHECK:       // %bb.0:
70 ; CHECK-NEXT:    lsr w8, w1, #16
71 ; CHECK-NEXT:    strh w1, [x0]
72 ; CHECK-NEXT:    strb w8, [x0, #2]
73 ; CHECK-NEXT:    ret
74     store i24 %a, ptr %p
75     ret void
78 define void @sti56(ptr %p, i56 %a) nounwind {
79 ; CHECK-LABEL: sti56:
80 ; CHECK:       // %bb.0:
81 ; CHECK-NEXT:    lsr x8, x1, #48
82 ; CHECK-NEXT:    lsr x9, x1, #32
83 ; CHECK-NEXT:    str w1, [x0]
84 ; CHECK-NEXT:    strb w8, [x0, #6]
85 ; CHECK-NEXT:    strh w9, [x0, #4]
86 ; CHECK-NEXT:    ret
87     store i56 %a, ptr %p
88     ret void
91 define void @sti80(ptr %p, i80 %a) nounwind {
92 ; CHECK-LABEL: sti80:
93 ; CHECK:       // %bb.0:
94 ; CHECK-NEXT:    str x2, [x0]
95 ; CHECK-NEXT:    strh w3, [x0, #8]
96 ; CHECK-NEXT:    ret
97     store i80 %a, ptr %p
98     ret void
101 define void @sti120(ptr %p, i120 %a) nounwind {
102 ; CHECK-LABEL: sti120:
103 ; CHECK:       // %bb.0:
104 ; CHECK-NEXT:    lsr x8, x3, #48
105 ; CHECK-NEXT:    lsr x9, x3, #32
106 ; CHECK-NEXT:    str x2, [x0]
107 ; CHECK-NEXT:    str w3, [x0, #8]
108 ; CHECK-NEXT:    strb w8, [x0, #14]
109 ; CHECK-NEXT:    strh w9, [x0, #12]
110 ; CHECK-NEXT:    ret
111     store i120 %a, ptr %p
112     ret void
115 define void @sti280(ptr %p, i280 %a) nounwind {
116 ; CHECK-LABEL: sti280:
117 ; CHECK:       // %bb.0:
118 ; CHECK-NEXT:    lsr x8, x6, #16
119 ; CHECK-NEXT:    stp x4, x5, [x0, #16]
120 ; CHECK-NEXT:    stp x2, x3, [x0]
121 ; CHECK-NEXT:    strh w6, [x0, #32]
122 ; CHECK-NEXT:    strb w8, [x0, #34]
123 ; CHECK-NEXT:    ret
124     store i280 %a, ptr %p
125     ret void
128 define void @i56_or(ptr %a) {
129 ; CHECK-LABEL: i56_or:
130 ; CHECK:       // %bb.0:
131 ; CHECK-NEXT:    ldr w8, [x0]
132 ; CHECK-NEXT:    mov x9, x0
133 ; CHECK-NEXT:    ldrh w10, [x9, #4]!
134 ; CHECK-NEXT:    ldrb w11, [x9, #2]
135 ; CHECK-NEXT:    orr w8, w8, #0x180
136 ; CHECK-NEXT:    str w8, [x0]
137 ; CHECK-NEXT:    orr w8, w10, w11, lsl #16
138 ; CHECK-NEXT:    strb w11, [x9, #2]
139 ; CHECK-NEXT:    strh w8, [x9]
140 ; CHECK-NEXT:    ret
141   %aa = load i56, ptr %a, align 1
142   %b = or i56 %aa, 384
143   store i56 %b, ptr %a, align 1
144   ret void
147 define void @i56_and_or(ptr %a) {
148 ; CHECK-LABEL: i56_and_or:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    ldr w8, [x0]
151 ; CHECK-NEXT:    mov x9, x0
152 ; CHECK-NEXT:    ldrh w10, [x9, #4]!
153 ; CHECK-NEXT:    ldrb w11, [x9, #2]
154 ; CHECK-NEXT:    orr w8, w8, #0x180
155 ; CHECK-NEXT:    and w8, w8, #0xffffff80
156 ; CHECK-NEXT:    strb w11, [x9, #2]
157 ; CHECK-NEXT:    str w8, [x0]
158 ; CHECK-NEXT:    orr w8, w10, w11, lsl #16
159 ; CHECK-NEXT:    strh w8, [x9]
160 ; CHECK-NEXT:    ret
161   %b = load i56, ptr %a, align 1
162   %c = and i56 %b, -128
163   %d = or i56 %c, 384
164   store i56 %d, ptr %a, align 1
165   ret void
168 define void @i56_insert_bit(ptr %a, i1 zeroext %bit) {
169 ; CHECK-LABEL: i56_insert_bit:
170 ; CHECK:       // %bb.0:
171 ; CHECK-NEXT:    mov x8, x0
172 ; CHECK-NEXT:    ldr w11, [x0]
173 ; CHECK-NEXT:    ldrh w9, [x8, #4]!
174 ; CHECK-NEXT:    ldrb w10, [x8, #2]
175 ; CHECK-NEXT:    orr w9, w9, w10, lsl #16
176 ; CHECK-NEXT:    strb w10, [x8, #2]
177 ; CHECK-NEXT:    orr x11, x11, x9, lsl #32
178 ; CHECK-NEXT:    strh w9, [x8]
179 ; CHECK-NEXT:    and x11, x11, #0xffffffffffffdfff
180 ; CHECK-NEXT:    orr w11, w11, w1, lsl #13
181 ; CHECK-NEXT:    str w11, [x0]
182 ; CHECK-NEXT:    ret
183   %extbit = zext i1 %bit to i56
184   %b = load i56, ptr %a, align 1
185   %extbit.shl = shl nuw nsw i56 %extbit, 13
186   %c = and i56 %b, -8193
187   %d = or i56 %c, %extbit.shl
188   store i56 %d, ptr %a, align 1
189   ret void