1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - \
4 # RUN: llc -mtriple=riscv32 -mattr=+unaligned-scalar-mem -run-pass=legalizer %s -o - \
5 # RUN: | FileCheck %s --check-prefix=UNALIGNED
10 tracksRegLiveness: true
24 ; CHECK-LABEL: name: load_i8
25 ; CHECK: liveins: $x10
27 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
28 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s8))
29 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
30 ; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s32)
31 ; CHECK-NEXT: PseudoRET implicit $x10
33 ; UNALIGNED-LABEL: name: load_i8
34 ; UNALIGNED: liveins: $x10
35 ; UNALIGNED-NEXT: {{ $}}
36 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
37 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s8))
38 ; UNALIGNED-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
39 ; UNALIGNED-NEXT: $x10 = COPY [[ANYEXT]](s32)
40 ; UNALIGNED-NEXT: PseudoRET implicit $x10
42 %1:_(s8) = G_LOAD %0(p0) :: (load (s8))
43 %2:_(s32) = G_ANYEXT %1(s8)
45 PseudoRET implicit $x10
51 tracksRegLiveness: true
65 ; CHECK-LABEL: name: load_i16
66 ; CHECK: liveins: $x10
68 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
69 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
70 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
71 ; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s32)
72 ; CHECK-NEXT: PseudoRET implicit $x10
74 ; UNALIGNED-LABEL: name: load_i16
75 ; UNALIGNED: liveins: $x10
76 ; UNALIGNED-NEXT: {{ $}}
77 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
78 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
79 ; UNALIGNED-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
80 ; UNALIGNED-NEXT: $x10 = COPY [[ANYEXT]](s32)
81 ; UNALIGNED-NEXT: PseudoRET implicit $x10
83 %1:_(s16) = G_LOAD %0(p0) :: (load (s16))
84 %2:_(s32) = G_ANYEXT %1(s16)
86 PseudoRET implicit $x10
92 tracksRegLiveness: true
105 ; CHECK-LABEL: name: load_i32
106 ; CHECK: liveins: $x10
108 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
109 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
110 ; CHECK-NEXT: $x10 = COPY [[LOAD]](s32)
111 ; CHECK-NEXT: PseudoRET implicit $x10
113 ; UNALIGNED-LABEL: name: load_i32
114 ; UNALIGNED: liveins: $x10
115 ; UNALIGNED-NEXT: {{ $}}
116 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
117 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
118 ; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
119 ; UNALIGNED-NEXT: PseudoRET implicit $x10
121 %1:_(s32) = G_LOAD %0(p0) :: (load (s32))
123 PseudoRET implicit $x10
129 tracksRegLiveness: true
131 - { id: 0, class: _ }
132 - { id: 1, class: _ }
133 - { id: 2, class: _ }
134 - { id: 3, class: _ }
144 ; CHECK-LABEL: name: load_i64
145 ; CHECK: liveins: $x10
147 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
148 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 8)
149 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
150 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
151 ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32) from unknown-address + 4)
152 ; CHECK-NEXT: $x10 = COPY [[LOAD]](s32)
153 ; CHECK-NEXT: $x11 = COPY [[LOAD1]](s32)
154 ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
156 ; UNALIGNED-LABEL: name: load_i64
157 ; UNALIGNED: liveins: $x10
158 ; UNALIGNED-NEXT: {{ $}}
159 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
160 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 8)
161 ; UNALIGNED-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
162 ; UNALIGNED-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
163 ; UNALIGNED-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32) from unknown-address + 4)
164 ; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
165 ; UNALIGNED-NEXT: $x11 = COPY [[LOAD1]](s32)
166 ; UNALIGNED-NEXT: PseudoRET implicit $x10, implicit $x11
168 %1:_(s64) = G_LOAD %0(p0) :: (load (s64))
169 %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %1(s64)
172 PseudoRET implicit $x10, implicit $x11
178 tracksRegLiveness: true
180 - { id: 0, class: _ }
181 - { id: 1, class: _ }
191 ; CHECK-LABEL: name: load_ptr
192 ; CHECK: liveins: $x10
194 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
195 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load (p0), align 8)
196 ; CHECK-NEXT: $x10 = COPY [[LOAD]](p0)
197 ; CHECK-NEXT: PseudoRET implicit $x10
199 ; UNALIGNED-LABEL: name: load_ptr
200 ; UNALIGNED: liveins: $x10
201 ; UNALIGNED-NEXT: {{ $}}
202 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
203 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load (p0), align 8)
204 ; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](p0)
205 ; UNALIGNED-NEXT: PseudoRET implicit $x10
207 %1:_(p0) = G_LOAD %0(p0) :: (load (p0), align 8)
209 PseudoRET implicit $x10
213 name: load_i16_unaligned
215 tracksRegLiveness: true
217 - { id: 0, class: _ }
218 - { id: 1, class: _ }
219 - { id: 2, class: _ }
229 ; CHECK-LABEL: name: load_i16_unaligned
230 ; CHECK: liveins: $x10
232 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
233 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8))
234 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
235 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
236 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[PTR_ADD]](p0) :: (load (s8) from unknown-address + 1)
237 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
238 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
239 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ANYEXT]], [[C1]](s32)
240 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[SHL]], [[ZEXTLOAD]]
241 ; CHECK-NEXT: $x10 = COPY [[OR]](s32)
242 ; CHECK-NEXT: PseudoRET implicit $x10
244 ; UNALIGNED-LABEL: name: load_i16_unaligned
245 ; UNALIGNED: liveins: $x10
246 ; UNALIGNED-NEXT: {{ $}}
247 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
248 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s16), align 1)
249 ; UNALIGNED-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
250 ; UNALIGNED-NEXT: $x10 = COPY [[ANYEXT]](s32)
251 ; UNALIGNED-NEXT: PseudoRET implicit $x10
253 %1:_(s16) = G_LOAD %0(p0) :: (load (s16), align 1)
254 %2:_(s32) = G_ANYEXT %1(s16)
256 PseudoRET implicit $x10
260 name: load_i32_unaligned
262 tracksRegLiveness: true
264 - { id: 0, class: _ }
265 - { id: 1, class: _ }
275 ; CHECK-LABEL: name: load_i32_unaligned
276 ; CHECK: liveins: $x10
278 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
279 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8))
280 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
281 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
282 ; CHECK-NEXT: [[ZEXTLOAD1:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD]](p0) :: (load (s8) from unknown-address + 1)
283 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
284 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ZEXTLOAD1]], [[C1]](s32)
285 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[SHL]], [[ZEXTLOAD]]
286 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
287 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C2]](s32)
288 ; CHECK-NEXT: [[ZEXTLOAD2:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD1]](p0) :: (load (s8) from unknown-address + 2)
289 ; CHECK-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD1]], [[C]](s32)
290 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD2]](p0) :: (load (s8) from unknown-address + 3)
291 ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[LOAD]], [[C1]](s32)
292 ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[SHL1]], [[ZEXTLOAD2]]
293 ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
294 ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[OR1]], [[C3]](s32)
295 ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[SHL2]], [[OR]]
296 ; CHECK-NEXT: $x10 = COPY [[OR2]](s32)
297 ; CHECK-NEXT: PseudoRET implicit $x10
299 ; UNALIGNED-LABEL: name: load_i32_unaligned
300 ; UNALIGNED: liveins: $x10
301 ; UNALIGNED-NEXT: {{ $}}
302 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
303 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 1)
304 ; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
305 ; UNALIGNED-NEXT: PseudoRET implicit $x10
307 %1:_(s32) = G_LOAD %0(p0) :: (load (s32), align 1)
309 PseudoRET implicit $x10
313 name: load_i32_align2
315 tracksRegLiveness: true
317 - { id: 0, class: _ }
318 - { id: 1, class: _ }
328 ; CHECK-LABEL: name: load_i32_align2
329 ; CHECK: liveins: $x10
331 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
332 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s16))
333 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
334 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
335 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s16) from unknown-address + 2)
336 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
337 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[LOAD]], [[C1]](s32)
338 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[SHL]], [[ZEXTLOAD]]
339 ; CHECK-NEXT: $x10 = COPY [[OR]](s32)
340 ; CHECK-NEXT: PseudoRET implicit $x10
342 ; UNALIGNED-LABEL: name: load_i32_align2
343 ; UNALIGNED: liveins: $x10
344 ; UNALIGNED-NEXT: {{ $}}
345 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
346 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 2)
347 ; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
348 ; UNALIGNED-NEXT: PseudoRET implicit $x10
350 %1:_(s32) = G_LOAD %0(p0) :: (load (s32), align 2)
352 PseudoRET implicit $x10
356 name: load_i64_unaligned
358 tracksRegLiveness: true
360 - { id: 0, class: _ }
361 - { id: 1, class: _ }
362 - { id: 2, class: _ }
363 - { id: 3, class: _ }
373 ; CHECK-LABEL: name: load_i64_unaligned
374 ; CHECK: liveins: $x10
376 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
377 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8))
378 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
379 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
380 ; CHECK-NEXT: [[ZEXTLOAD1:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD]](p0) :: (load (s8) from unknown-address + 1)
381 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
382 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ZEXTLOAD1]], [[C1]](s32)
383 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[SHL]], [[ZEXTLOAD]]
384 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
385 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C2]](s32)
386 ; CHECK-NEXT: [[ZEXTLOAD2:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD1]](p0) :: (load (s8) from unknown-address + 2)
387 ; CHECK-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD1]], [[C]](s32)
388 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD2]](p0) :: (load (s8) from unknown-address + 3)
389 ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[LOAD]], [[C1]](s32)
390 ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[SHL1]], [[ZEXTLOAD2]]
391 ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
392 ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[OR1]], [[C3]](s32)
393 ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[SHL2]], [[OR]]
394 ; CHECK-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
395 ; CHECK-NEXT: [[PTR_ADD3:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C4]](s32)
396 ; CHECK-NEXT: [[ZEXTLOAD3:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD3]](p0) :: (load (s8) from unknown-address + 4)
397 ; CHECK-NEXT: [[PTR_ADD4:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD3]], [[C]](s32)
398 ; CHECK-NEXT: [[ZEXTLOAD4:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD4]](p0) :: (load (s8) from unknown-address + 5)
399 ; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[ZEXTLOAD4]], [[C1]](s32)
400 ; CHECK-NEXT: [[OR3:%[0-9]+]]:_(s32) = G_OR [[SHL3]], [[ZEXTLOAD3]]
401 ; CHECK-NEXT: [[PTR_ADD5:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD3]], [[C2]](s32)
402 ; CHECK-NEXT: [[ZEXTLOAD5:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[PTR_ADD5]](p0) :: (load (s8) from unknown-address + 6)
403 ; CHECK-NEXT: [[PTR_ADD6:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD5]], [[C]](s32)
404 ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD6]](p0) :: (load (s8) from unknown-address + 7)
405 ; CHECK-NEXT: [[SHL4:%[0-9]+]]:_(s32) = G_SHL [[LOAD1]], [[C1]](s32)
406 ; CHECK-NEXT: [[OR4:%[0-9]+]]:_(s32) = G_OR [[SHL4]], [[ZEXTLOAD5]]
407 ; CHECK-NEXT: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[OR4]], [[C3]](s32)
408 ; CHECK-NEXT: [[OR5:%[0-9]+]]:_(s32) = G_OR [[SHL5]], [[OR3]]
409 ; CHECK-NEXT: $x10 = COPY [[OR2]](s32)
410 ; CHECK-NEXT: $x11 = COPY [[OR5]](s32)
411 ; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
413 ; UNALIGNED-LABEL: name: load_i64_unaligned
414 ; UNALIGNED: liveins: $x10
415 ; UNALIGNED-NEXT: {{ $}}
416 ; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
417 ; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 1)
418 ; UNALIGNED-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
419 ; UNALIGNED-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
420 ; UNALIGNED-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32) from unknown-address + 4, align 1)
421 ; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
422 ; UNALIGNED-NEXT: $x11 = COPY [[LOAD1]](s32)
423 ; UNALIGNED-NEXT: PseudoRET implicit $x10, implicit $x11
425 %1:_(s64) = G_LOAD %0(p0) :: (load (s64), align 1)
426 %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %1(s64)
429 PseudoRET implicit $x10, implicit $x11