1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -slp-vectorizer -S -mtriple=x86_64-- -mattr=avx2 | FileCheck %s
4 %v8i8 = type { i8, i8, i8, i8, i8, i8, i8, i8 }
6 ; https://bugs.llvm.org/show_bug.cgi?id=43146
8 define i64 @load_bswap(%v8i8* %p) {
9 ; CHECK-LABEL: @load_bswap(
10 ; CHECK-NEXT: [[G0:%.*]] = getelementptr inbounds [[V8I8:%.*]], %v8i8* [[P:%.*]], i64 0, i32 0
11 ; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 1
12 ; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 2
13 ; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 3
14 ; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 4
15 ; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 5
16 ; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 6
17 ; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 7
18 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[G0]] to <4 x i8>*
19 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, <4 x i8>* [[TMP1]], align 1
20 ; CHECK-NEXT: [[T4:%.*]] = load i8, i8* [[G4]]
21 ; CHECK-NEXT: [[T5:%.*]] = load i8, i8* [[G5]]
22 ; CHECK-NEXT: [[T6:%.*]] = load i8, i8* [[G6]]
23 ; CHECK-NEXT: [[T7:%.*]] = load i8, i8* [[G7]]
24 ; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[TMP2]] to <4 x i64>
25 ; CHECK-NEXT: [[Z4:%.*]] = zext i8 [[T4]] to i64
26 ; CHECK-NEXT: [[Z5:%.*]] = zext i8 [[T5]] to i64
27 ; CHECK-NEXT: [[Z6:%.*]] = zext i8 [[T6]] to i64
28 ; CHECK-NEXT: [[Z7:%.*]] = zext i8 [[T7]] to i64
29 ; CHECK-NEXT: [[TMP4:%.*]] = shl nuw <4 x i64> [[TMP3]], <i64 56, i64 48, i64 40, i64 32>
30 ; CHECK-NEXT: [[SH4:%.*]] = shl nuw nsw i64 [[Z4]], 24
31 ; CHECK-NEXT: [[SH5:%.*]] = shl nuw nsw i64 [[Z5]], 16
32 ; CHECK-NEXT: [[SH6:%.*]] = shl nuw nsw i64 [[Z6]], 8
33 ; CHECK-NEXT: [[RDX_SHUF:%.*]] = shufflevector <4 x i64> [[TMP4]], <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
34 ; CHECK-NEXT: [[BIN_RDX:%.*]] = or <4 x i64> [[TMP4]], [[RDX_SHUF]]
35 ; CHECK-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <4 x i64> [[BIN_RDX]], <4 x i64> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
36 ; CHECK-NEXT: [[BIN_RDX2:%.*]] = or <4 x i64> [[BIN_RDX]], [[RDX_SHUF1]]
37 ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i64> [[BIN_RDX2]], i32 0
38 ; CHECK-NEXT: [[TMP6:%.*]] = or i64 [[TMP5]], [[SH4]]
39 ; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[TMP6]], [[SH5]]
40 ; CHECK-NEXT: [[TMP8:%.*]] = or i64 [[TMP7]], [[SH6]]
41 ; CHECK-NEXT: [[OP_EXTRA:%.*]] = or i64 [[TMP8]], [[Z7]]
42 ; CHECK-NEXT: ret i64 [[OP_EXTRA]]
44 %g0 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 0
45 %g1 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 1
46 %g2 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 2
47 %g3 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 3
48 %g4 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 4
49 %g5 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 5
50 %g6 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 6
51 %g7 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 7
53 %t0 = load i8, i8* %g0
54 %t1 = load i8, i8* %g1
55 %t2 = load i8, i8* %g2
56 %t3 = load i8, i8* %g3
57 %t4 = load i8, i8* %g4
58 %t5 = load i8, i8* %g5
59 %t6 = load i8, i8* %g6
60 %t7 = load i8, i8* %g7
62 %z0 = zext i8 %t0 to i64
63 %z1 = zext i8 %t1 to i64
64 %z2 = zext i8 %t2 to i64
65 %z3 = zext i8 %t3 to i64
66 %z4 = zext i8 %t4 to i64
67 %z5 = zext i8 %t5 to i64
68 %z6 = zext i8 %t6 to i64
69 %z7 = zext i8 %t7 to i64
71 %sh0 = shl nuw i64 %z0, 56
72 %sh1 = shl nuw nsw i64 %z1, 48
73 %sh2 = shl nuw nsw i64 %z2, 40
74 %sh3 = shl nuw nsw i64 %z3, 32
75 %sh4 = shl nuw nsw i64 %z4, 24
76 %sh5 = shl nuw nsw i64 %z5, 16
77 %sh6 = shl nuw nsw i64 %z6, 8
78 ; %sh7 = shl nuw nsw i64 %z7, 0 <-- missing phantom shift
80 %or01 = or i64 %sh0, %sh1
81 %or012 = or i64 %or01, %sh2
82 %or0123 = or i64 %or012, %sh3
83 %or01234 = or i64 %or0123, %sh4
84 %or012345 = or i64 %or01234, %sh5
85 %or0123456 = or i64 %or012345, %sh6
86 %or01234567 = or i64 %or0123456, %z7
90 define i64 @load_bswap_nop_shift(%v8i8* %p) {
91 ; CHECK-LABEL: @load_bswap_nop_shift(
92 ; CHECK-NEXT: [[G0:%.*]] = getelementptr inbounds [[V8I8:%.*]], %v8i8* [[P:%.*]], i64 0, i32 0
93 ; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 1
94 ; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 2
95 ; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 3
96 ; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 4
97 ; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 5
98 ; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 6
99 ; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 7
100 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[G0]] to <8 x i8>*
101 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1
102 ; CHECK-NEXT: [[TMP3:%.*]] = zext <8 x i8> [[TMP2]] to <8 x i64>
103 ; CHECK-NEXT: [[TMP4:%.*]] = shl nuw <8 x i64> [[TMP3]], <i64 56, i64 48, i64 40, i64 32, i64 24, i64 16, i64 8, i64 0>
104 ; CHECK-NEXT: [[RDX_SHUF:%.*]] = shufflevector <8 x i64> [[TMP4]], <8 x i64> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
105 ; CHECK-NEXT: [[BIN_RDX:%.*]] = or <8 x i64> [[TMP4]], [[RDX_SHUF]]
106 ; CHECK-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <8 x i64> [[BIN_RDX]], <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
107 ; CHECK-NEXT: [[BIN_RDX2:%.*]] = or <8 x i64> [[BIN_RDX]], [[RDX_SHUF1]]
108 ; CHECK-NEXT: [[RDX_SHUF3:%.*]] = shufflevector <8 x i64> [[BIN_RDX2]], <8 x i64> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
109 ; CHECK-NEXT: [[BIN_RDX4:%.*]] = or <8 x i64> [[BIN_RDX2]], [[RDX_SHUF3]]
110 ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <8 x i64> [[BIN_RDX4]], i32 0
111 ; CHECK-NEXT: ret i64 [[TMP5]]
113 %g0 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 0
114 %g1 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 1
115 %g2 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 2
116 %g3 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 3
117 %g4 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 4
118 %g5 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 5
119 %g6 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 6
120 %g7 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 7
122 %t0 = load i8, i8* %g0
123 %t1 = load i8, i8* %g1
124 %t2 = load i8, i8* %g2
125 %t3 = load i8, i8* %g3
126 %t4 = load i8, i8* %g4
127 %t5 = load i8, i8* %g5
128 %t6 = load i8, i8* %g6
129 %t7 = load i8, i8* %g7
131 %z0 = zext i8 %t0 to i64
132 %z1 = zext i8 %t1 to i64
133 %z2 = zext i8 %t2 to i64
134 %z3 = zext i8 %t3 to i64
135 %z4 = zext i8 %t4 to i64
136 %z5 = zext i8 %t5 to i64
137 %z6 = zext i8 %t6 to i64
138 %z7 = zext i8 %t7 to i64
140 %sh0 = shl nuw i64 %z0, 56
141 %sh1 = shl nuw nsw i64 %z1, 48
142 %sh2 = shl nuw nsw i64 %z2, 40
143 %sh3 = shl nuw nsw i64 %z3, 32
144 %sh4 = shl nuw nsw i64 %z4, 24
145 %sh5 = shl nuw nsw i64 %z5, 16
146 %sh6 = shl nuw nsw i64 %z6, 8
147 %sh7 = shl nuw nsw i64 %z7, 0
149 %or01 = or i64 %sh0, %sh1
150 %or012 = or i64 %or01, %sh2
151 %or0123 = or i64 %or012, %sh3
152 %or01234 = or i64 %or0123, %sh4
153 %or012345 = or i64 %or01234, %sh5
154 %or0123456 = or i64 %or012345, %sh6
155 %or01234567 = or i64 %or0123456, %sh7
159 ; https://bugs.llvm.org/show_bug.cgi?id=42708
161 define i64 @load64le(i8* %arg) {
162 ; CHECK-LABEL: @load64le(
163 ; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds i8, i8* [[ARG:%.*]], i64 1
164 ; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 2
165 ; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 3
166 ; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 4
167 ; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 5
168 ; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 6
169 ; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 7
170 ; CHECK-NEXT: [[LD0:%.*]] = load i8, i8* [[ARG]], align 1
171 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[G1]] to <4 x i8>*
172 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, <4 x i8>* [[TMP1]], align 1
173 ; CHECK-NEXT: [[LD5:%.*]] = load i8, i8* [[G5]], align 1
174 ; CHECK-NEXT: [[LD6:%.*]] = load i8, i8* [[G6]], align 1
175 ; CHECK-NEXT: [[LD7:%.*]] = load i8, i8* [[G7]], align 1
176 ; CHECK-NEXT: [[Z0:%.*]] = zext i8 [[LD0]] to i64
177 ; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[TMP2]] to <4 x i64>
178 ; CHECK-NEXT: [[Z5:%.*]] = zext i8 [[LD5]] to i64
179 ; CHECK-NEXT: [[Z6:%.*]] = zext i8 [[LD6]] to i64
180 ; CHECK-NEXT: [[Z7:%.*]] = zext i8 [[LD7]] to i64
181 ; CHECK-NEXT: [[TMP4:%.*]] = shl nuw nsw <4 x i64> [[TMP3]], <i64 8, i64 16, i64 24, i64 32>
182 ; CHECK-NEXT: [[S5:%.*]] = shl nuw nsw i64 [[Z5]], 40
183 ; CHECK-NEXT: [[S6:%.*]] = shl nuw nsw i64 [[Z6]], 48
184 ; CHECK-NEXT: [[S7:%.*]] = shl nuw i64 [[Z7]], 56
185 ; CHECK-NEXT: [[RDX_SHUF:%.*]] = shufflevector <4 x i64> [[TMP4]], <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
186 ; CHECK-NEXT: [[BIN_RDX:%.*]] = or <4 x i64> [[TMP4]], [[RDX_SHUF]]
187 ; CHECK-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <4 x i64> [[BIN_RDX]], <4 x i64> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
188 ; CHECK-NEXT: [[BIN_RDX2:%.*]] = or <4 x i64> [[BIN_RDX]], [[RDX_SHUF1]]
189 ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i64> [[BIN_RDX2]], i32 0
190 ; CHECK-NEXT: [[TMP6:%.*]] = or i64 [[TMP5]], [[S5]]
191 ; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[TMP6]], [[S6]]
192 ; CHECK-NEXT: [[TMP8:%.*]] = or i64 [[TMP7]], [[S7]]
193 ; CHECK-NEXT: [[OP_EXTRA:%.*]] = or i64 [[TMP8]], [[Z0]]
194 ; CHECK-NEXT: ret i64 [[OP_EXTRA]]
196 %g1 = getelementptr inbounds i8, i8* %arg, i64 1
197 %g2 = getelementptr inbounds i8, i8* %arg, i64 2
198 %g3 = getelementptr inbounds i8, i8* %arg, i64 3
199 %g4 = getelementptr inbounds i8, i8* %arg, i64 4
200 %g5 = getelementptr inbounds i8, i8* %arg, i64 5
201 %g6 = getelementptr inbounds i8, i8* %arg, i64 6
202 %g7 = getelementptr inbounds i8, i8* %arg, i64 7
204 %ld0 = load i8, i8* %arg, align 1
205 %ld1 = load i8, i8* %g1, align 1
206 %ld2 = load i8, i8* %g2, align 1
207 %ld3 = load i8, i8* %g3, align 1
208 %ld4 = load i8, i8* %g4, align 1
209 %ld5 = load i8, i8* %g5, align 1
210 %ld6 = load i8, i8* %g6, align 1
211 %ld7 = load i8, i8* %g7, align 1
213 %z0 = zext i8 %ld0 to i64
214 %z1 = zext i8 %ld1 to i64
215 %z2 = zext i8 %ld2 to i64
216 %z3 = zext i8 %ld3 to i64
217 %z4 = zext i8 %ld4 to i64
218 %z5 = zext i8 %ld5 to i64
219 %z6 = zext i8 %ld6 to i64
220 %z7 = zext i8 %ld7 to i64
222 ; %s0 = shl nuw nsw i64 %z0, 0 <-- missing phantom shift
223 %s1 = shl nuw nsw i64 %z1, 8
224 %s2 = shl nuw nsw i64 %z2, 16
225 %s3 = shl nuw nsw i64 %z3, 24
226 %s4 = shl nuw nsw i64 %z4, 32
227 %s5 = shl nuw nsw i64 %z5, 40
228 %s6 = shl nuw nsw i64 %z6, 48
229 %s7 = shl nuw i64 %z7, 56
231 %o1 = or i64 %s1, %z0
232 %o2 = or i64 %o1, %s2
233 %o3 = or i64 %o2, %s3
234 %o4 = or i64 %o3, %s4
235 %o5 = or i64 %o4, %s5
236 %o6 = or i64 %o5, %s6
237 %o7 = or i64 %o6, %s7
241 define i64 @load64le_nop_shift(i8* %arg) {
242 ; CHECK-LABEL: @load64le_nop_shift(
243 ; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds i8, i8* [[ARG:%.*]], i64 1
244 ; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 2
245 ; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 3
246 ; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 4
247 ; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 5
248 ; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 6
249 ; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 7
250 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[ARG]] to <8 x i8>*
251 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i8>, <8 x i8>* [[TMP1]], align 1
252 ; CHECK-NEXT: [[TMP3:%.*]] = zext <8 x i8> [[TMP2]] to <8 x i64>
253 ; CHECK-NEXT: [[TMP4:%.*]] = shl nuw <8 x i64> [[TMP3]], <i64 0, i64 8, i64 16, i64 24, i64 32, i64 40, i64 48, i64 56>
254 ; CHECK-NEXT: [[RDX_SHUF:%.*]] = shufflevector <8 x i64> [[TMP4]], <8 x i64> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
255 ; CHECK-NEXT: [[BIN_RDX:%.*]] = or <8 x i64> [[TMP4]], [[RDX_SHUF]]
256 ; CHECK-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <8 x i64> [[BIN_RDX]], <8 x i64> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
257 ; CHECK-NEXT: [[BIN_RDX2:%.*]] = or <8 x i64> [[BIN_RDX]], [[RDX_SHUF1]]
258 ; CHECK-NEXT: [[RDX_SHUF3:%.*]] = shufflevector <8 x i64> [[BIN_RDX2]], <8 x i64> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
259 ; CHECK-NEXT: [[BIN_RDX4:%.*]] = or <8 x i64> [[BIN_RDX2]], [[RDX_SHUF3]]
260 ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <8 x i64> [[BIN_RDX4]], i32 0
261 ; CHECK-NEXT: ret i64 [[TMP5]]
263 %g1 = getelementptr inbounds i8, i8* %arg, i64 1
264 %g2 = getelementptr inbounds i8, i8* %arg, i64 2
265 %g3 = getelementptr inbounds i8, i8* %arg, i64 3
266 %g4 = getelementptr inbounds i8, i8* %arg, i64 4
267 %g5 = getelementptr inbounds i8, i8* %arg, i64 5
268 %g6 = getelementptr inbounds i8, i8* %arg, i64 6
269 %g7 = getelementptr inbounds i8, i8* %arg, i64 7
271 %ld0 = load i8, i8* %arg, align 1
272 %ld1 = load i8, i8* %g1, align 1
273 %ld2 = load i8, i8* %g2, align 1
274 %ld3 = load i8, i8* %g3, align 1
275 %ld4 = load i8, i8* %g4, align 1
276 %ld5 = load i8, i8* %g5, align 1
277 %ld6 = load i8, i8* %g6, align 1
278 %ld7 = load i8, i8* %g7, align 1
280 %z0 = zext i8 %ld0 to i64
281 %z1 = zext i8 %ld1 to i64
282 %z2 = zext i8 %ld2 to i64
283 %z3 = zext i8 %ld3 to i64
284 %z4 = zext i8 %ld4 to i64
285 %z5 = zext i8 %ld5 to i64
286 %z6 = zext i8 %ld6 to i64
287 %z7 = zext i8 %ld7 to i64
289 %s0 = shl nuw nsw i64 %z0, 0
290 %s1 = shl nuw nsw i64 %z1, 8
291 %s2 = shl nuw nsw i64 %z2, 16
292 %s3 = shl nuw nsw i64 %z3, 24
293 %s4 = shl nuw nsw i64 %z4, 32
294 %s5 = shl nuw nsw i64 %z5, 40
295 %s6 = shl nuw nsw i64 %z6, 48
296 %s7 = shl nuw i64 %z7, 56
298 %o1 = or i64 %s1, %s0
299 %o2 = or i64 %o1, %s2
300 %o3 = or i64 %o2, %s3
301 %o4 = or i64 %o3, %s4
302 %o5 = or i64 %o4, %s5
303 %o6 = or i64 %o5, %s6
304 %o7 = or i64 %o6, %s7