1 //=- HexagonInstrInfoV4.td - Target Desc. for Hexagon Target -*- tablegen -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file describes the Hexagon V4 instructions in TableGen format.
12 //===----------------------------------------------------------------------===//
14 let neverHasSideEffects = 1 in
15 def IMMEXT : Immext<(outs), (ins),
20 // Hexagon V4 Architecture spec defines 8 instruction classes:
21 // LD ST ALU32 XTYPE J JR MEMOP NV CR SYSTEM(system is not implemented in the
25 // ========================================
26 // Loads (8/16/32/64 bit)
30 // ========================================
31 // Stores (8/16/32/64 bit)
34 // ALU32 Instructions:
35 // ========================================
36 // Arithmetic / Logical (32 bit)
39 // XTYPE Instructions (32/64 bit):
40 // ========================================
41 // Arithmetic, Logical, Bit Manipulation
42 // Multiply (Integer, Fractional, Complex)
43 // Permute / Vector Permute Operations
44 // Predicate Operations
45 // Shift / Shift with Add/Sub/Logical
47 // Vector Halfword (ALU, Shift, Multiply)
48 // Vector Word (ALU, Shift)
51 // ========================================
52 // Jump/Call PC-relative
55 // ========================================
58 // MEMOP Instructions:
59 // ========================================
60 // Operation on memory (8/16/32 bit)
63 // ========================================
68 // ========================================
69 // Control-Register Transfers
70 // Hardware Loop Setup
71 // Predicate Logicals & Reductions
73 // SYSTEM Instructions (not implemented in the compiler):
74 // ========================================
80 //===----------------------------------------------------------------------===//
82 //===----------------------------------------------------------------------===//
86 let isPredicated = 1 in
87 def ASLH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst),
88 (ins PredRegs:$src1, IntRegs:$src2),
89 "if ($src1) $dst = aslh($src2)",
93 let isPredicated = 1 in
94 def ASLH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
95 (ins PredRegs:$src1, IntRegs:$src2),
96 "if (!$src1) $dst = aslh($src2)",
100 let isPredicated = 1 in
101 def ASLH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst),
102 (ins PredRegs:$src1, IntRegs:$src2),
103 "if ($src1.new) $dst = aslh($src2)",
107 let isPredicated = 1 in
108 def ASLH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
109 (ins PredRegs:$src1, IntRegs:$src2),
110 "if (!$src1.new) $dst = aslh($src2)",
114 let isPredicated = 1 in
115 def ASRH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst),
116 (ins PredRegs:$src1, IntRegs:$src2),
117 "if ($src1) $dst = asrh($src2)",
121 let isPredicated = 1 in
122 def ASRH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
123 (ins PredRegs:$src1, IntRegs:$src2),
124 "if (!$src1) $dst = asrh($src2)",
128 let isPredicated = 1 in
129 def ASRH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst),
130 (ins PredRegs:$src1, IntRegs:$src2),
131 "if ($src1.new) $dst = asrh($src2)",
135 let isPredicated = 1 in
136 def ASRH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
137 (ins PredRegs:$src1, IntRegs:$src2),
138 "if (!$src1.new) $dst = asrh($src2)",
144 let isPredicated = 1 in
145 def SXTB_cPt_V4 : ALU32_rr<(outs IntRegs:$dst),
146 (ins PredRegs:$src1, IntRegs:$src2),
147 "if ($src1) $dst = sxtb($src2)",
151 let isPredicated = 1 in
152 def SXTB_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
153 (ins PredRegs:$src1, IntRegs:$src2),
154 "if (!$src1) $dst = sxtb($src2)",
158 let isPredicated = 1 in
159 def SXTB_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst),
160 (ins PredRegs:$src1, IntRegs:$src2),
161 "if ($src1.new) $dst = sxtb($src2)",
165 let isPredicated = 1 in
166 def SXTB_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
167 (ins PredRegs:$src1, IntRegs:$src2),
168 "if (!$src1.new) $dst = sxtb($src2)",
173 let isPredicated = 1 in
174 def SXTH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst),
175 (ins PredRegs:$src1, IntRegs:$src2),
176 "if ($src1) $dst = sxth($src2)",
180 let isPredicated = 1 in
181 def SXTH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
182 (ins PredRegs:$src1, IntRegs:$src2),
183 "if (!$src1) $dst = sxth($src2)",
187 let isPredicated = 1 in
188 def SXTH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst),
189 (ins PredRegs:$src1, IntRegs:$src2),
190 "if ($src1.new) $dst = sxth($src2)",
194 let isPredicated = 1 in
195 def SXTH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
196 (ins PredRegs:$src1, IntRegs:$src2),
197 "if (!$src1.new) $dst = sxth($src2)",
203 let neverHasSideEffects = 1, isPredicated = 1 in
204 def ZXTB_cPt_V4 : ALU32_rr<(outs IntRegs:$dst),
205 (ins PredRegs:$src1, IntRegs:$src2),
206 "if ($src1) $dst = zxtb($src2)",
210 let neverHasSideEffects = 1, isPredicated = 1 in
211 def ZXTB_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
212 (ins PredRegs:$src1, IntRegs:$src2),
213 "if (!$src1) $dst = zxtb($src2)",
217 let neverHasSideEffects = 1, isPredicated = 1 in
218 def ZXTB_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst),
219 (ins PredRegs:$src1, IntRegs:$src2),
220 "if ($src1.new) $dst = zxtb($src2)",
224 let neverHasSideEffects = 1, isPredicated = 1 in
225 def ZXTB_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
226 (ins PredRegs:$src1, IntRegs:$src2),
227 "if (!$src1.new) $dst = zxtb($src2)",
231 let neverHasSideEffects = 1, isPredicated = 1 in
232 def ZXTH_cPt_V4 : ALU32_rr<(outs IntRegs:$dst),
233 (ins PredRegs:$src1, IntRegs:$src2),
234 "if ($src1) $dst = zxth($src2)",
238 let neverHasSideEffects = 1, isPredicated = 1 in
239 def ZXTH_cNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
240 (ins PredRegs:$src1, IntRegs:$src2),
241 "if (!$src1) $dst = zxth($src2)",
245 let neverHasSideEffects = 1, isPredicated = 1 in
246 def ZXTH_cdnPt_V4 : ALU32_rr<(outs IntRegs:$dst),
247 (ins PredRegs:$src1, IntRegs:$src2),
248 "if ($src1.new) $dst = zxth($src2)",
252 let neverHasSideEffects = 1, isPredicated = 1 in
253 def ZXTH_cdnNotPt_V4 : ALU32_rr<(outs IntRegs:$dst),
254 (ins PredRegs:$src1, IntRegs:$src2),
255 "if (!$src1.new) $dst = zxth($src2)",
259 // Generate frame index addresses.
260 let neverHasSideEffects = 1, isReMaterializable = 1 in
261 def TFR_FI_immext_V4 : ALU32_ri<(outs IntRegs:$dst),
262 (ins IntRegs:$src1, s32Imm:$offset),
263 "$dst = add($src1, ##$offset)",
268 //===----------------------------------------------------------------------===//
270 //===----------------------------------------------------------------------===//
273 //===----------------------------------------------------------------------===//
275 //===----------------------------------------------------------------------===//
278 // Rdd=combine(Rs, #s8)
279 let neverHasSideEffects = 1 in
280 def COMBINE_ri_V4 : ALU32_ri<(outs DoubleRegs:$dst),
281 (ins IntRegs:$src1, s8Imm:$src2),
282 "$dst = combine($src1, #$src2)",
285 // Rdd=combine(#s8, Rs)
286 let neverHasSideEffects = 1 in
287 def COMBINE_ir_V4 : ALU32_ir<(outs DoubleRegs:$dst),
288 (ins s8Imm:$src1, IntRegs:$src2),
289 "$dst = combine(#$src1, $src2)",
292 //===----------------------------------------------------------------------===//
294 //===----------------------------------------------------------------------===//
296 //===----------------------------------------------------------------------===//
298 //===----------------------------------------------------------------------===//
300 // These absolute set addressing mode instructions accept immediate as
301 // an operand. We have duplicated these patterns to take global address.
303 let neverHasSideEffects = 1 in
304 def LDrid_abs_setimm_V4 : LDInst2<(outs DoubleRegs:$dst1, IntRegs:$dst2),
306 "$dst1 = memd($dst2=#$addr)",
311 let neverHasSideEffects = 1 in
312 def LDrib_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
314 "$dst1 = memb($dst2=#$addr)",
319 let neverHasSideEffects = 1 in
320 def LDrih_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
322 "$dst1 = memh($dst2=#$addr)",
327 let neverHasSideEffects = 1 in
328 def LDriub_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
330 "$dst1 = memub($dst2=#$addr)",
335 let neverHasSideEffects = 1 in
336 def LDriuh_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
338 "$dst1 = memuh($dst2=#$addr)",
343 let neverHasSideEffects = 1 in
344 def LDriw_abs_setimm_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
346 "$dst1 = memw($dst2=#$addr)",
350 // Following patterns are defined for absolute set addressing mode
351 // instruction which take global address as operand.
352 let neverHasSideEffects = 1 in
353 def LDrid_abs_set_V4 : LDInst2<(outs DoubleRegs:$dst1, IntRegs:$dst2),
354 (ins globaladdress:$addr),
355 "$dst1 = memd($dst2=##$addr)",
360 let neverHasSideEffects = 1 in
361 def LDrib_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
362 (ins globaladdress:$addr),
363 "$dst1 = memb($dst2=##$addr)",
368 let neverHasSideEffects = 1 in
369 def LDrih_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
370 (ins globaladdress:$addr),
371 "$dst1 = memh($dst2=##$addr)",
376 let neverHasSideEffects = 1 in
377 def LDriub_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
378 (ins globaladdress:$addr),
379 "$dst1 = memub($dst2=##$addr)",
384 let neverHasSideEffects = 1 in
385 def LDriuh_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
386 (ins globaladdress:$addr),
387 "$dst1 = memuh($dst2=##$addr)",
392 let neverHasSideEffects = 1 in
393 def LDriw_abs_set_V4 : LDInst2<(outs IntRegs:$dst1, IntRegs:$dst2),
394 (ins globaladdress:$addr),
395 "$dst1 = memw($dst2=##$addr)",
401 // Make sure that in post increment load, the first operand is always the post
402 // increment operand.
404 // Rdd=memd(Rs+Rt<<#u2)
405 // Special case pattern for indexed load without offset which is easier to
406 // match. AddedComplexity of this pattern should be lower than base+offset load
407 // and lower yet than the more generic version with offset/shift below
408 // Similar approach is taken for all other base+index loads.
409 let AddedComplexity = 10, isPredicable = 1 in
410 def LDrid_indexed_V4 : LDInst<(outs DoubleRegs:$dst),
411 (ins IntRegs:$src1, IntRegs:$src2),
412 "$dst=memd($src1+$src2<<#0)",
413 [(set (i64 DoubleRegs:$dst),
414 (i64 (load (add (i32 IntRegs:$src1),
415 (i32 IntRegs:$src2)))))]>,
418 let AddedComplexity = 40, isPredicable = 1 in
419 def LDrid_indexed_shl_V4 : LDInst<(outs DoubleRegs:$dst),
420 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
421 "$dst=memd($src1+$src2<<#$offset)",
422 [(set (i64 DoubleRegs:$dst),
423 (i64 (load (add (i32 IntRegs:$src1),
424 (shl (i32 IntRegs:$src2),
425 u2ImmPred:$offset)))))]>,
428 //// Load doubleword conditionally.
429 // if ([!]Pv[.new]) Rd=memd(Rs+Rt<<#u2)
430 // if (Pv) Rd=memd(Rs+Rt<<#u2)
431 let AddedComplexity = 15, isPredicated = 1 in
432 def LDrid_indexed_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
433 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
434 "if ($src1) $dst=memd($src2+$src3<<#0)",
438 // if (Pv.new) Rd=memd(Rs+Rt<<#u2)
439 let AddedComplexity = 15, isPredicated = 1 in
440 def LDrid_indexed_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
441 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
442 "if ($src1.new) $dst=memd($src2+$src3<<#0)",
446 // if (!Pv) Rd=memd(Rs+Rt<<#u2)
447 let AddedComplexity = 15, isPredicated = 1 in
448 def LDrid_indexed_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
449 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
450 "if (!$src1) $dst=memd($src2+$src3<<#0)",
454 // if (!Pv.new) Rd=memd(Rs+Rt<<#u2)
455 let AddedComplexity = 15, isPredicated = 1 in
456 def LDrid_indexed_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
457 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
458 "if (!$src1.new) $dst=memd($src2+$src3<<#0)",
462 // if (Pv) Rd=memd(Rs+Rt<<#u2)
463 let AddedComplexity = 45, isPredicated = 1 in
464 def LDrid_indexed_shl_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
465 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
467 "if ($src1) $dst=memd($src2+$src3<<#$offset)",
471 // if (Pv.new) Rd=memd(Rs+Rt<<#u2)
472 let AddedComplexity = 45, isPredicated = 1 in
473 def LDrid_indexed_shl_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
474 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
476 "if ($src1.new) $dst=memd($src2+$src3<<#$offset)",
480 // if (!Pv) Rd=memd(Rs+Rt<<#u2)
481 let AddedComplexity = 45, isPredicated = 1 in
482 def LDrid_indexed_shl_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
483 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
485 "if (!$src1) $dst=memd($src2+$src3<<#$offset)",
489 // if (!Pv.new) Rd=memd(Rs+Rt<<#u2)
490 let AddedComplexity = 45, isPredicated = 1 in
491 def LDrid_indexed_shl_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
492 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
494 "if (!$src1.new) $dst=memd($src2+$src3<<#$offset)",
498 // Rdd=memd(Rt<<#u2+#U6)
501 // Rd=memb(Rs+Rt<<#u2)
502 let AddedComplexity = 10, isPredicable = 1 in
503 def LDrib_indexed_V4 : LDInst<(outs IntRegs:$dst),
504 (ins IntRegs:$src1, IntRegs:$src2),
505 "$dst=memb($src1+$src2<<#0)",
506 [(set (i32 IntRegs:$dst),
507 (i32 (sextloadi8 (add (i32 IntRegs:$src1),
508 (i32 IntRegs:$src2)))))]>,
511 let AddedComplexity = 10, isPredicable = 1 in
512 def LDriub_indexed_V4 : LDInst<(outs IntRegs:$dst),
513 (ins IntRegs:$src1, IntRegs:$src2),
514 "$dst=memub($src1+$src2<<#0)",
515 [(set (i32 IntRegs:$dst),
516 (i32 (zextloadi8 (add (i32 IntRegs:$src1),
517 (i32 IntRegs:$src2)))))]>,
520 let AddedComplexity = 10, isPredicable = 1 in
521 def LDriub_ae_indexed_V4 : LDInst<(outs IntRegs:$dst),
522 (ins IntRegs:$src1, IntRegs:$src2),
523 "$dst=memub($src1+$src2<<#0)",
524 [(set (i32 IntRegs:$dst),
525 (i32 (extloadi8 (add (i32 IntRegs:$src1),
526 (i32 IntRegs:$src2)))))]>,
529 let AddedComplexity = 40, isPredicable = 1 in
530 def LDrib_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
531 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
532 "$dst=memb($src1+$src2<<#$offset)",
533 [(set (i32 IntRegs:$dst),
534 (i32 (sextloadi8 (add (i32 IntRegs:$src1),
535 (shl (i32 IntRegs:$src2),
536 u2ImmPred:$offset)))))]>,
539 let AddedComplexity = 40, isPredicable = 1 in
540 def LDriub_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
541 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
542 "$dst=memub($src1+$src2<<#$offset)",
543 [(set (i32 IntRegs:$dst),
544 (i32 (zextloadi8 (add (i32 IntRegs:$src1),
545 (shl (i32 IntRegs:$src2),
546 u2ImmPred:$offset)))))]>,
549 let AddedComplexity = 40, isPredicable = 1 in
550 def LDriub_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
551 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
552 "$dst=memub($src1+$src2<<#$offset)",
553 [(set (i32 IntRegs:$dst),
554 (i32 (extloadi8 (add (i32 IntRegs:$src1),
555 (shl (i32 IntRegs:$src2),
556 u2ImmPred:$offset)))))]>,
559 //// Load byte conditionally.
560 // if ([!]Pv[.new]) Rd=memb(Rs+Rt<<#u2)
561 // if (Pv) Rd=memb(Rs+Rt<<#u2)
562 let AddedComplexity = 15, isPredicated = 1 in
563 def LDrib_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
564 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
565 "if ($src1) $dst=memb($src2+$src3<<#0)",
569 // if (Pv.new) Rd=memb(Rs+Rt<<#u2)
570 let AddedComplexity = 15, isPredicated = 1 in
571 def LDrib_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
572 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
573 "if ($src1.new) $dst=memb($src2+$src3<<#0)",
577 // if (!Pv) Rd=memb(Rs+Rt<<#u2)
578 let AddedComplexity = 15, isPredicated = 1 in
579 def LDrib_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
580 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
581 "if (!$src1) $dst=memb($src2+$src3<<#0)",
585 // if (!Pv.new) Rd=memb(Rs+Rt<<#u2)
586 let AddedComplexity = 15, isPredicated = 1 in
587 def LDrib_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
588 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
589 "if (!$src1.new) $dst=memb($src2+$src3<<#0)",
593 // if (Pv) Rd=memb(Rs+Rt<<#u2)
594 let AddedComplexity = 45, isPredicated = 1 in
595 def LDrib_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst),
596 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
598 "if ($src1) $dst=memb($src2+$src3<<#$offset)",
602 // if (Pv.new) Rd=memb(Rs+Rt<<#u2)
603 let AddedComplexity = 45, isPredicated = 1 in
604 def LDrib_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
605 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
607 "if ($src1.new) $dst=memb($src2+$src3<<#$offset)",
611 // if (!Pv) Rd=memb(Rs+Rt<<#u2)
612 let AddedComplexity = 45, isPredicated = 1 in
613 def LDrib_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
614 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
616 "if (!$src1) $dst=memb($src2+$src3<<#$offset)",
620 // if (!Pv.new) Rd=memb(Rs+Rt<<#u2)
621 let AddedComplexity = 45, isPredicated = 1 in
622 def LDrib_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
623 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
625 "if (!$src1.new) $dst=memb($src2+$src3<<#$offset)",
629 //// Load unsigned byte conditionally.
630 // if ([!]Pv[.new]) Rd=memub(Rs+Rt<<#u2)
631 // if (Pv) Rd=memub(Rs+Rt<<#u2)
632 let AddedComplexity = 15, isPredicated = 1 in
633 def LDriub_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
634 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
635 "if ($src1) $dst=memub($src2+$src3<<#0)",
639 // if (Pv.new) Rd=memub(Rs+Rt<<#u2)
640 let AddedComplexity = 15, isPredicated = 1 in
641 def LDriub_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
642 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
643 "if ($src1.new) $dst=memub($src2+$src3<<#0)",
647 // if (!Pv) Rd=memub(Rs+Rt<<#u2)
648 let AddedComplexity = 15, isPredicated = 1 in
649 def LDriub_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
650 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
651 "if (!$src1) $dst=memub($src2+$src3<<#0)",
655 // if (!Pv.new) Rd=memub(Rs+Rt<<#u2)
656 let AddedComplexity = 15, isPredicated = 1 in
657 def LDriub_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
658 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
659 "if (!$src1.new) $dst=memub($src2+$src3<<#0)",
663 // if (Pv) Rd=memub(Rs+Rt<<#u2)
664 let AddedComplexity = 45, isPredicated = 1 in
665 def LDriub_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst),
666 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
668 "if ($src1) $dst=memub($src2+$src3<<#$offset)",
672 // if (Pv.new) Rd=memub(Rs+Rt<<#u2)
673 let AddedComplexity = 45, isPredicated = 1 in
674 def LDriub_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
675 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
677 "if ($src1.new) $dst=memub($src2+$src3<<#$offset)",
681 // if (!Pv) Rd=memub(Rs+Rt<<#u2)
682 let AddedComplexity = 45, isPredicated = 1 in
683 def LDriub_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
684 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
686 "if (!$src1) $dst=memub($src2+$src3<<#$offset)",
690 // if (!Pv.new) Rd=memub(Rs+Rt<<#u2)
691 let AddedComplexity = 45, isPredicated = 1 in
692 def LDriub_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
693 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
695 "if (!$src1.new) $dst=memub($src2+$src3<<#$offset)",
699 // Rd=memb(Rt<<#u2+#U6)
702 // Rd=memh(Rs+Rt<<#u2)
703 let AddedComplexity = 10, isPredicable = 1 in
704 def LDrih_indexed_V4 : LDInst<(outs IntRegs:$dst),
705 (ins IntRegs:$src1, IntRegs:$src2),
706 "$dst=memh($src1+$src2<<#0)",
707 [(set (i32 IntRegs:$dst),
708 (i32 (sextloadi16 (add (i32 IntRegs:$src1),
709 (i32 IntRegs:$src2)))))]>,
712 let AddedComplexity = 10, isPredicable = 1 in
713 def LDriuh_indexed_V4 : LDInst<(outs IntRegs:$dst),
714 (ins IntRegs:$src1, IntRegs:$src2),
715 "$dst=memuh($src1+$src2<<#0)",
716 [(set (i32 IntRegs:$dst),
717 (i32 (zextloadi16 (add (i32 IntRegs:$src1),
718 (i32 IntRegs:$src2)))))]>,
721 let AddedComplexity = 10, isPredicable = 1 in
722 def LDriuh_ae_indexed_V4 : LDInst<(outs IntRegs:$dst),
723 (ins IntRegs:$src1, IntRegs:$src2),
724 "$dst=memuh($src1+$src2<<#0)",
725 [(set (i32 IntRegs:$dst),
726 (i32 (extloadi16 (add (i32 IntRegs:$src1),
727 (i32 IntRegs:$src2)))))]>,
730 // Rd=memh(Rs+Rt<<#u2)
731 let AddedComplexity = 40, isPredicable = 1 in
732 def LDrih_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
733 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
734 "$dst=memh($src1+$src2<<#$offset)",
735 [(set (i32 IntRegs:$dst),
736 (i32 (sextloadi16 (add (i32 IntRegs:$src1),
737 (shl (i32 IntRegs:$src2),
738 u2ImmPred:$offset)))))]>,
741 let AddedComplexity = 40, isPredicable = 1 in
742 def LDriuh_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
743 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
744 "$dst=memuh($src1+$src2<<#$offset)",
745 [(set (i32 IntRegs:$dst),
746 (i32 (zextloadi16 (add (i32 IntRegs:$src1),
747 (shl (i32 IntRegs:$src2),
748 u2ImmPred:$offset)))))]>,
751 let AddedComplexity = 40, isPredicable = 1 in
752 def LDriuh_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
753 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
754 "$dst=memuh($src1+$src2<<#$offset)",
755 [(set (i32 IntRegs:$dst),
756 (i32 (extloadi16 (add (i32 IntRegs:$src1),
757 (shl (i32 IntRegs:$src2),
758 u2ImmPred:$offset)))))]>,
761 //// Load halfword conditionally.
762 // if ([!]Pv[.new]) Rd=memh(Rs+Rt<<#u2)
763 // if (Pv) Rd=memh(Rs+Rt<<#u2)
764 let AddedComplexity = 15, isPredicated = 1 in
765 def LDrih_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
766 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
767 "if ($src1) $dst=memh($src2+$src3<<#0)",
771 // if (Pv.new) Rd=memh(Rs+Rt<<#u2)
772 let AddedComplexity = 15, isPredicated = 1 in
773 def LDrih_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
774 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
775 "if ($src1.new) $dst=memh($src2+$src3<<#0)",
779 // if (!Pv) Rd=memh(Rs+Rt<<#u2)
780 let AddedComplexity = 15, isPredicated = 1 in
781 def LDrih_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
782 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
783 "if (!$src1) $dst=memh($src2+$src3<<#0)",
787 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2)
788 let AddedComplexity = 15, isPredicated = 1 in
789 def LDrih_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
790 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
791 "if (!$src1.new) $dst=memh($src2+$src3<<#0)",
795 // if (Pv) Rd=memh(Rs+Rt<<#u2)
796 let AddedComplexity = 45, isPredicated = 1 in
797 def LDrih_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst),
798 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
800 "if ($src1) $dst=memh($src2+$src3<<#$offset)",
804 // if (Pv.new) Rd=memh(Rs+Rt<<#u2)
805 let AddedComplexity = 45, isPredicated = 1 in
806 def LDrih_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
807 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
809 "if ($src1.new) $dst=memh($src2+$src3<<#$offset)",
813 // if (!Pv) Rd=memh(Rs+Rt<<#u2)
814 let AddedComplexity = 45, isPredicated = 1 in
815 def LDrih_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
816 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
818 "if (!$src1) $dst=memh($src2+$src3<<#$offset)",
822 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2)
823 let AddedComplexity = 45, isPredicated = 1 in
824 def LDrih_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
825 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
827 "if (!$src1.new) $dst=memh($src2+$src3<<#$offset)",
831 //// Load unsigned halfword conditionally.
832 // if ([!]Pv[.new]) Rd=memuh(Rs+Rt<<#u2)
833 // if (Pv) Rd=memuh(Rs+Rt<<#u2)
834 let AddedComplexity = 15, isPredicated = 1 in
835 def LDriuh_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
836 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
837 "if ($src1) $dst=memuh($src2+$src3<<#0)",
841 // if (Pv.new) Rd=memuh(Rs+Rt<<#u2)
842 let AddedComplexity = 15, isPredicated = 1 in
843 def LDriuh_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
844 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
845 "if ($src1.new) $dst=memuh($src2+$src3<<#0)",
849 // if (!Pv) Rd=memuh(Rs+Rt<<#u2)
850 let AddedComplexity = 15, isPredicated = 1 in
851 def LDriuh_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
852 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
853 "if (!$src1) $dst=memuh($src2+$src3<<#0)",
857 // if (!Pv.new) Rd=memuh(Rs+Rt<<#u2)
858 let AddedComplexity = 15, isPredicated = 1 in
859 def LDriuh_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
860 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
861 "if (!$src1.new) $dst=memuh($src2+$src3<<#0)",
865 // if (Pv) Rd=memuh(Rs+Rt<<#u2)
866 let AddedComplexity = 45, isPredicated = 1 in
867 def LDriuh_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst),
868 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
870 "if ($src1) $dst=memuh($src2+$src3<<#$offset)",
874 // if (Pv.new) Rd=memuh(Rs+Rt<<#u2)
875 let AddedComplexity = 45, isPredicated = 1 in
876 def LDriuh_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
877 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
879 "if ($src1.new) $dst=memuh($src2+$src3<<#$offset)",
883 // if (!Pv) Rd=memuh(Rs+Rt<<#u2)
884 let AddedComplexity = 45, isPredicated = 1 in
885 def LDriuh_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
886 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
888 "if (!$src1) $dst=memuh($src2+$src3<<#$offset)",
892 // if (!Pv.new) Rd=memuh(Rs+Rt<<#u2)
893 let AddedComplexity = 45, isPredicated = 1 in
894 def LDriuh_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
895 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
897 "if (!$src1.new) $dst=memuh($src2+$src3<<#$offset)",
901 // Rd=memh(Rt<<#u2+#U6)
904 // Load predicate: Fix for bug 5279.
905 let neverHasSideEffects = 1 in
906 def LDriw_pred_V4 : LDInst2<(outs PredRegs:$dst),
908 "Error; should not emit",
914 // Rd=memw(Rs+Rt<<#u2)
915 let AddedComplexity = 10, isPredicable = 1 in
916 def LDriw_indexed_V4 : LDInst<(outs IntRegs:$dst),
917 (ins IntRegs:$src1, IntRegs:$src2),
918 "$dst=memw($src1+$src2<<#0)",
919 [(set (i32 IntRegs:$dst),
920 (i32 (load (add (i32 IntRegs:$src1),
921 (i32 IntRegs:$src2)))))]>,
924 // Rd=memw(Rs+Rt<<#u2)
925 let AddedComplexity = 40, isPredicable = 1 in
926 def LDriw_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
927 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
928 "$dst=memw($src1+$src2<<#$offset)",
929 [(set (i32 IntRegs:$dst),
930 (i32 (load (add (i32 IntRegs:$src1),
931 (shl (i32 IntRegs:$src2),
932 u2ImmPred:$offset)))))]>,
935 //// Load word conditionally.
936 // if ([!]Pv[.new]) Rd=memw(Rs+Rt<<#u2)
937 // if (Pv) Rd=memw(Rs+Rt<<#u2)
938 let AddedComplexity = 15, isPredicated = 1 in
939 def LDriw_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
940 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
941 "if ($src1) $dst=memw($src2+$src3<<#0)",
945 // if (Pv.new) Rd=memh(Rs+Rt<<#u2)
946 let AddedComplexity = 15, isPredicated = 1 in
947 def LDriw_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
948 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
949 "if ($src1.new) $dst=memw($src2+$src3<<#0)",
953 // if (!Pv) Rd=memh(Rs+Rt<<#u2)
954 let AddedComplexity = 15, isPredicated = 1 in
955 def LDriw_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
956 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
957 "if (!$src1) $dst=memw($src2+$src3<<#0)",
961 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2)
962 let AddedComplexity = 15, isPredicated = 1 in
963 def LDriw_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
964 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
965 "if (!$src1.new) $dst=memw($src2+$src3<<#0)",
969 // if (Pv) Rd=memh(Rs+Rt<<#u2)
970 let AddedComplexity = 45, isPredicated = 1 in
971 def LDriw_indexed_shl_cPt_V4 : LDInst2<(outs IntRegs:$dst),
972 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
974 "if ($src1) $dst=memw($src2+$src3<<#$offset)",
978 // if (Pv.new) Rd=memh(Rs+Rt<<#u2)
979 let AddedComplexity = 45, isPredicated = 1 in
980 def LDriw_indexed_shl_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
981 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
983 "if ($src1.new) $dst=memw($src2+$src3<<#$offset)",
987 // if (!Pv) Rd=memh(Rs+Rt<<#u2)
988 let AddedComplexity = 45, isPredicated = 1 in
989 def LDriw_indexed_shl_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
990 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
992 "if (!$src1) $dst=memw($src2+$src3<<#$offset)",
996 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2)
997 let AddedComplexity = 45, isPredicated = 1 in
998 def LDriw_indexed_shl_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
999 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3,
1001 "if (!$src1.new) $dst=memw($src2+$src3<<#$offset)",
1005 /// Load from global offset
1007 let isPredicable = 1, neverHasSideEffects = 1 in
1008 def LDrid_GP_V4 : LDInst2<(outs DoubleRegs:$dst),
1009 (ins globaladdress:$global, u16Imm:$offset),
1010 "$dst=memd(#$global+$offset)",
1014 let neverHasSideEffects = 1, isPredicated = 1 in
1015 def LDrid_GP_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1016 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1017 "if ($src1) $dst=memd(##$global+$offset)",
1021 let neverHasSideEffects = 1, isPredicated = 1 in
1022 def LDrid_GP_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1023 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1024 "if (!$src1) $dst=memd(##$global+$offset)",
1028 let neverHasSideEffects = 1, isPredicated = 1 in
1029 def LDrid_GP_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1030 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1031 "if ($src1.new) $dst=memd(##$global+$offset)",
1035 let neverHasSideEffects = 1, isPredicated = 1 in
1036 def LDrid_GP_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1037 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1038 "if (!$src1.new) $dst=memd(##$global+$offset)",
1042 let isPredicable = 1, neverHasSideEffects = 1 in
1043 def LDrib_GP_V4 : LDInst2<(outs IntRegs:$dst),
1044 (ins globaladdress:$global, u16Imm:$offset),
1045 "$dst=memb(#$global+$offset)",
1049 let neverHasSideEffects = 1, isPredicated = 1 in
1050 def LDrib_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1051 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1052 "if ($src1) $dst=memb(##$global+$offset)",
1056 let neverHasSideEffects = 1, isPredicated = 1 in
1057 def LDrib_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1058 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1059 "if (!$src1) $dst=memb(##$global+$offset)",
1063 let neverHasSideEffects = 1, isPredicated = 1 in
1064 def LDrib_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1065 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1066 "if ($src1.new) $dst=memb(##$global+$offset)",
1070 let neverHasSideEffects = 1, isPredicated = 1 in
1071 def LDrib_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1072 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1073 "if (!$src1.new) $dst=memb(##$global+$offset)",
1078 let isPredicable = 1, neverHasSideEffects = 1 in
1079 def LDriub_GP_V4 : LDInst2<(outs IntRegs:$dst),
1080 (ins globaladdress:$global, u16Imm:$offset),
1081 "$dst=memub(#$global+$offset)",
1086 let neverHasSideEffects = 1, isPredicated = 1 in
1087 def LDriub_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1088 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1089 "if ($src1) $dst=memub(##$global+$offset)",
1093 let neverHasSideEffects = 1, isPredicated = 1 in
1094 def LDriub_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1095 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1096 "if (!$src1) $dst=memub(##$global+$offset)",
1100 let neverHasSideEffects = 1, isPredicated = 1 in
1101 def LDriub_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1102 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1103 "if ($src1.new) $dst=memub(##$global+$offset)",
1107 let neverHasSideEffects = 1, isPredicated = 1 in
1108 def LDriub_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1109 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1110 "if (!$src1.new) $dst=memub(##$global+$offset)",
1115 let isPredicable = 1, neverHasSideEffects = 1 in
1116 def LDrih_GP_V4 : LDInst2<(outs IntRegs:$dst),
1117 (ins globaladdress:$global, u16Imm:$offset),
1118 "$dst=memh(#$global+$offset)",
1123 let neverHasSideEffects = 1, isPredicated = 1 in
1124 def LDrih_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1125 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1126 "if ($src1) $dst=memh(##$global+$offset)",
1130 let neverHasSideEffects = 1, isPredicated = 1 in
1131 def LDrih_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1132 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1133 "if (!$src1) $dst=memh(##$global+$offset)",
1137 let neverHasSideEffects = 1, isPredicated = 1 in
1138 def LDrih_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1139 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1140 "if ($src1.new) $dst=memh(##$global+$offset)",
1144 let neverHasSideEffects = 1, isPredicated = 1 in
1145 def LDrih_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1146 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1147 "if (!$src1.new) $dst=memh(##$global+$offset)",
1152 let isPredicable = 1, neverHasSideEffects = 1 in
1153 def LDriuh_GP_V4 : LDInst2<(outs IntRegs:$dst),
1154 (ins globaladdress:$global, u16Imm:$offset),
1155 "$dst=memuh(#$global+$offset)",
1159 let neverHasSideEffects = 1, isPredicated = 1 in
1160 def LDriuh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1161 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1162 "if ($src1) $dst=memuh(##$global+$offset)",
1166 let neverHasSideEffects = 1, isPredicated = 1 in
1167 def LDriuh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1168 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1169 "if (!$src1) $dst=memuh(##$global+$offset)",
1173 let neverHasSideEffects = 1, isPredicated = 1 in
1174 def LDriuh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1175 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1176 "if ($src1.new) $dst=memuh(##$global+$offset)",
1180 let neverHasSideEffects = 1, isPredicated = 1 in
1181 def LDriuh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1182 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1183 "if (!$src1.new) $dst=memuh(##$global+$offset)",
1187 let isPredicable = 1, neverHasSideEffects = 1 in
1188 def LDriw_GP_V4 : LDInst2<(outs IntRegs:$dst),
1189 (ins globaladdress:$global, u16Imm:$offset),
1190 "$dst=memw(#$global+$offset)",
1195 let neverHasSideEffects = 1, isPredicated = 1 in
1196 def LDriw_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1197 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1198 "if ($src1) $dst=memw(##$global+$offset)",
1202 let neverHasSideEffects = 1, isPredicated = 1 in
1203 def LDriw_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1204 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1205 "if (!$src1) $dst=memw(##$global+$offset)",
1210 let neverHasSideEffects = 1, isPredicated = 1 in
1211 def LDriw_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1212 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1213 "if ($src1.new) $dst=memw(##$global+$offset)",
1217 let neverHasSideEffects = 1, isPredicated = 1 in
1218 def LDriw_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1219 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1220 "if (!$src1.new) $dst=memw(##$global+$offset)",
1225 let isPredicable = 1, neverHasSideEffects = 1 in
1226 def LDd_GP_V4 : LDInst2<(outs DoubleRegs:$dst),
1227 (ins globaladdress:$global),
1228 "$dst=memd(#$global)",
1232 // if (Pv) Rtt=memd(##global)
1233 let neverHasSideEffects = 1, isPredicated = 1 in
1234 def LDd_GP_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1235 (ins PredRegs:$src1, globaladdress:$global),
1236 "if ($src1) $dst=memd(##$global)",
1241 // if (!Pv) Rtt=memd(##global)
1242 let neverHasSideEffects = 1, isPredicated = 1 in
1243 def LDd_GP_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1244 (ins PredRegs:$src1, globaladdress:$global),
1245 "if (!$src1) $dst=memd(##$global)",
1249 // if (Pv) Rtt=memd(##global)
1250 let neverHasSideEffects = 1, isPredicated = 1 in
1251 def LDd_GP_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1252 (ins PredRegs:$src1, globaladdress:$global),
1253 "if ($src1.new) $dst=memd(##$global)",
1258 // if (!Pv) Rtt=memd(##global)
1259 let neverHasSideEffects = 1, isPredicated = 1 in
1260 def LDd_GP_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1261 (ins PredRegs:$src1, globaladdress:$global),
1262 "if (!$src1.new) $dst=memd(##$global)",
1266 let isPredicable = 1, neverHasSideEffects = 1 in
1267 def LDb_GP_V4 : LDInst2<(outs IntRegs:$dst),
1268 (ins globaladdress:$global),
1269 "$dst=memb(#$global)",
1273 // if (Pv) Rt=memb(##global)
1274 let neverHasSideEffects = 1, isPredicated = 1 in
1275 def LDb_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1276 (ins PredRegs:$src1, globaladdress:$global),
1277 "if ($src1) $dst=memb(##$global)",
1281 // if (!Pv) Rt=memb(##global)
1282 let neverHasSideEffects = 1, isPredicated = 1 in
1283 def LDb_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1284 (ins PredRegs:$src1, globaladdress:$global),
1285 "if (!$src1) $dst=memb(##$global)",
1289 // if (Pv) Rt=memb(##global)
1290 let neverHasSideEffects = 1, isPredicated = 1 in
1291 def LDb_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1292 (ins PredRegs:$src1, globaladdress:$global),
1293 "if ($src1.new) $dst=memb(##$global)",
1297 // if (!Pv) Rt=memb(##global)
1298 let neverHasSideEffects = 1, isPredicated = 1 in
1299 def LDb_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1300 (ins PredRegs:$src1, globaladdress:$global),
1301 "if (!$src1.new) $dst=memb(##$global)",
1305 let isPredicable = 1, neverHasSideEffects = 1 in
1306 def LDub_GP_V4 : LDInst2<(outs IntRegs:$dst),
1307 (ins globaladdress:$global),
1308 "$dst=memub(#$global)",
1312 // if (Pv) Rt=memub(##global)
1313 let neverHasSideEffects = 1, isPredicated = 1 in
1314 def LDub_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1315 (ins PredRegs:$src1, globaladdress:$global),
1316 "if ($src1) $dst=memub(##$global)",
1321 // if (!Pv) Rt=memub(##global)
1322 let neverHasSideEffects = 1, isPredicated = 1 in
1323 def LDub_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1324 (ins PredRegs:$src1, globaladdress:$global),
1325 "if (!$src1) $dst=memub(##$global)",
1329 // if (Pv) Rt=memub(##global)
1330 let neverHasSideEffects = 1, isPredicated = 1 in
1331 def LDub_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1332 (ins PredRegs:$src1, globaladdress:$global),
1333 "if ($src1.new) $dst=memub(##$global)",
1338 // if (!Pv) Rt=memub(##global)
1339 let neverHasSideEffects = 1, isPredicated = 1 in
1340 def LDub_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1341 (ins PredRegs:$src1, globaladdress:$global),
1342 "if (!$src1.new) $dst=memub(##$global)",
1346 let isPredicable = 1, neverHasSideEffects = 1 in
1347 def LDh_GP_V4 : LDInst2<(outs IntRegs:$dst),
1348 (ins globaladdress:$global),
1349 "$dst=memh(#$global)",
1353 // if (Pv) Rt=memh(##global)
1354 let neverHasSideEffects = 1, isPredicated = 1 in
1355 def LDh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1356 (ins PredRegs:$src1, globaladdress:$global),
1357 "if ($src1) $dst=memh(##$global)",
1361 // if (!Pv) Rt=memh(##global)
1362 let neverHasSideEffects = 1, isPredicated = 1 in
1363 def LDh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1364 (ins PredRegs:$src1, globaladdress:$global),
1365 "if (!$src1) $dst=memh(##$global)",
1369 // if (Pv) Rt=memh(##global)
1370 let neverHasSideEffects = 1, isPredicated = 1 in
1371 def LDh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1372 (ins PredRegs:$src1, globaladdress:$global),
1373 "if ($src1.new) $dst=memh(##$global)",
1377 // if (!Pv) Rt=memh(##global)
1378 let neverHasSideEffects = 1, isPredicated = 1 in
1379 def LDh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1380 (ins PredRegs:$src1, globaladdress:$global),
1381 "if (!$src1.new) $dst=memh(##$global)",
1385 let isPredicable = 1, neverHasSideEffects = 1 in
1386 def LDuh_GP_V4 : LDInst2<(outs IntRegs:$dst),
1387 (ins globaladdress:$global),
1388 "$dst=memuh(#$global)",
1392 // if (Pv) Rt=memuh(##global)
1393 let neverHasSideEffects = 1, isPredicated = 1 in
1394 def LDuh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1395 (ins PredRegs:$src1, globaladdress:$global),
1396 "if ($src1) $dst=memuh(##$global)",
1400 // if (!Pv) Rt=memuh(##global)
1401 let neverHasSideEffects = 1, isPredicated = 1 in
1402 def LDuh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1403 (ins PredRegs:$src1, globaladdress:$global),
1404 "if (!$src1) $dst=memuh(##$global)",
1408 // if (Pv) Rt=memuh(##global)
1409 let neverHasSideEffects = 1, isPredicated = 1 in
1410 def LDuh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1411 (ins PredRegs:$src1, globaladdress:$global),
1412 "if ($src1.new) $dst=memuh(##$global)",
1416 // if (!Pv) Rt=memuh(##global)
1417 let neverHasSideEffects = 1, isPredicated = 1 in
1418 def LDuh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1419 (ins PredRegs:$src1, globaladdress:$global),
1420 "if (!$src1.new) $dst=memuh(##$global)",
1424 let isPredicable = 1, neverHasSideEffects = 1 in
1425 def LDw_GP_V4 : LDInst2<(outs IntRegs:$dst),
1426 (ins globaladdress:$global),
1427 "$dst=memw(#$global)",
1431 // if (Pv) Rt=memw(##global)
1432 let neverHasSideEffects = 1, isPredicated = 1 in
1433 def LDw_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1434 (ins PredRegs:$src1, globaladdress:$global),
1435 "if ($src1) $dst=memw(##$global)",
1440 // if (!Pv) Rt=memw(##global)
1441 let neverHasSideEffects = 1, isPredicated = 1 in
1442 def LDw_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1443 (ins PredRegs:$src1, globaladdress:$global),
1444 "if (!$src1) $dst=memw(##$global)",
1448 // if (Pv) Rt=memw(##global)
1449 let neverHasSideEffects = 1, isPredicated = 1 in
1450 def LDw_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1451 (ins PredRegs:$src1, globaladdress:$global),
1452 "if ($src1.new) $dst=memw(##$global)",
1457 // if (!Pv) Rt=memw(##global)
1458 let neverHasSideEffects = 1, isPredicated = 1 in
1459 def LDw_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1460 (ins PredRegs:$src1, globaladdress:$global),
1461 "if (!$src1.new) $dst=memw(##$global)",
1467 def : Pat <(atomic_load_64 (HexagonCONST32_GP tglobaladdr:$global)),
1468 (i64 (LDd_GP_V4 tglobaladdr:$global))>,
1471 def : Pat <(atomic_load_32 (HexagonCONST32_GP tglobaladdr:$global)),
1472 (i32 (LDw_GP_V4 tglobaladdr:$global))>,
1475 def : Pat <(atomic_load_16 (HexagonCONST32_GP tglobaladdr:$global)),
1476 (i32 (LDuh_GP_V4 tglobaladdr:$global))>,
1479 def : Pat <(atomic_load_8 (HexagonCONST32_GP tglobaladdr:$global)),
1480 (i32 (LDub_GP_V4 tglobaladdr:$global))>,
1483 // Map from load(globaladdress) -> memw(#foo + 0)
1484 let AddedComplexity = 100 in
1485 def : Pat <(i64 (load (HexagonCONST32_GP tglobaladdr:$global))),
1486 (i64 (LDd_GP_V4 tglobaladdr:$global))>,
1489 // Map from Pd = load(globaladdress) -> Rd = memb(globaladdress), Pd = Rd
1490 let AddedComplexity = 100 in
1491 def : Pat <(i1 (load (HexagonCONST32_GP tglobaladdr:$global))),
1492 (i1 (TFR_PdRs (i32 (LDb_GP_V4 tglobaladdr:$global))))>,
1495 // When the Interprocedural Global Variable optimizer realizes that a certain
1496 // global variable takes only two constant values, it shrinks the global to
1497 // a boolean. Catch those loads here in the following 3 patterns.
1498 let AddedComplexity = 100 in
1499 def : Pat <(i32 (extloadi1 (HexagonCONST32_GP tglobaladdr:$global))),
1500 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1503 let AddedComplexity = 100 in
1504 def : Pat <(i32 (sextloadi1 (HexagonCONST32_GP tglobaladdr:$global))),
1505 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1508 // Map from load(globaladdress) -> memb(#foo)
1509 let AddedComplexity = 100 in
1510 def : Pat <(i32 (extloadi8 (HexagonCONST32_GP tglobaladdr:$global))),
1511 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1514 // Map from load(globaladdress) -> memb(#foo)
1515 let AddedComplexity = 100 in
1516 def : Pat <(i32 (sextloadi8 (HexagonCONST32_GP tglobaladdr:$global))),
1517 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1520 let AddedComplexity = 100 in
1521 def : Pat <(i32 (zextloadi1 (HexagonCONST32_GP tglobaladdr:$global))),
1522 (i32 (LDub_GP_V4 tglobaladdr:$global))>,
1525 // Map from load(globaladdress) -> memub(#foo)
1526 let AddedComplexity = 100 in
1527 def : Pat <(i32 (zextloadi8 (HexagonCONST32_GP tglobaladdr:$global))),
1528 (i32 (LDub_GP_V4 tglobaladdr:$global))>,
1531 // Map from load(globaladdress) -> memh(#foo)
1532 let AddedComplexity = 100 in
1533 def : Pat <(i32 (extloadi16 (HexagonCONST32_GP tglobaladdr:$global))),
1534 (i32 (LDh_GP_V4 tglobaladdr:$global))>,
1537 // Map from load(globaladdress) -> memh(#foo)
1538 let AddedComplexity = 100 in
1539 def : Pat <(i32 (sextloadi16 (HexagonCONST32_GP tglobaladdr:$global))),
1540 (i32 (LDh_GP_V4 tglobaladdr:$global))>,
1543 // Map from load(globaladdress) -> memuh(#foo)
1544 let AddedComplexity = 100 in
1545 def : Pat <(i32 (zextloadi16 (HexagonCONST32_GP tglobaladdr:$global))),
1546 (i32 (LDuh_GP_V4 tglobaladdr:$global))>,
1549 // Map from load(globaladdress) -> memw(#foo)
1550 let AddedComplexity = 100 in
1551 def : Pat <(i32 (load (HexagonCONST32_GP tglobaladdr:$global))),
1552 (i32 (LDw_GP_V4 tglobaladdr:$global))>,
1555 def : Pat <(atomic_load_64 (add (HexagonCONST32_GP tglobaladdr:$global),
1556 u16ImmPred:$offset)),
1557 (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1560 def : Pat <(atomic_load_32 (add (HexagonCONST32_GP tglobaladdr:$global),
1561 u16ImmPred:$offset)),
1562 (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1565 def : Pat <(atomic_load_16 (add (HexagonCONST32_GP tglobaladdr:$global),
1566 u16ImmPred:$offset)),
1567 (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1570 def : Pat <(atomic_load_8 (add (HexagonCONST32_GP tglobaladdr:$global),
1571 u16ImmPred:$offset)),
1572 (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1575 // Map from load(globaladdress + x) -> memd(#foo + x)
1576 let AddedComplexity = 100 in
1577 def : Pat <(i64 (load (add (HexagonCONST32_GP tglobaladdr:$global),
1578 u16ImmPred:$offset))),
1579 (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1582 // Map from load(globaladdress + x) -> memb(#foo + x)
1583 let AddedComplexity = 100 in
1584 def : Pat <(i32 (extloadi8 (add (HexagonCONST32_GP tglobaladdr:$global),
1585 u16ImmPred:$offset))),
1586 (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1589 // Map from load(globaladdress + x) -> memb(#foo + x)
1590 let AddedComplexity = 100 in
1591 def : Pat <(i32 (sextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global),
1592 u16ImmPred:$offset))),
1593 (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1596 // Map from load(globaladdress + x) -> memub(#foo + x)
1597 let AddedComplexity = 100 in
1598 def : Pat <(i32 (zextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global),
1599 u16ImmPred:$offset))),
1600 (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1603 // Map from load(globaladdress + x) -> memuh(#foo + x)
1604 let AddedComplexity = 100 in
1605 def : Pat <(i32 (extloadi16 (add (HexagonCONST32_GP tglobaladdr:$global),
1606 u16ImmPred:$offset))),
1607 (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1610 // Map from load(globaladdress + x) -> memh(#foo + x)
1611 let AddedComplexity = 100 in
1612 def : Pat <(i32 (sextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global),
1613 u16ImmPred:$offset))),
1614 (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1618 // Map from load(globaladdress + x) -> memuh(#foo + x)
1619 let AddedComplexity = 100 in
1620 def : Pat <(i32 (zextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global),
1621 u16ImmPred:$offset))),
1622 (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1625 // Map from load(globaladdress + x) -> memw(#foo + x)
1626 let AddedComplexity = 100 in
1627 def : Pat <(i32 (load (add (HexagonCONST32_GP tglobaladdr:$global),
1628 u16ImmPred:$offset))),
1629 (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1633 //===----------------------------------------------------------------------===//
1635 //===----------------------------------------------------------------------===//
1637 //===----------------------------------------------------------------------===//
1639 //===----------------------------------------------------------------------===//
1641 /// Assumptions::: ****** DO NOT IGNORE ********
1642 /// 1. Make sure that in post increment store, the zero'th operand is always the
1643 /// post increment operand.
1644 /// 2. Make sure that the store value operand(Rt/Rtt) in a store is always the
1649 def STrid_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1650 (ins DoubleRegs:$src1, u6Imm:$src2),
1651 "memd($dst1=#$src2) = $src1",
1656 def STrib_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1657 (ins IntRegs:$src1, u6Imm:$src2),
1658 "memb($dst1=#$src2) = $src1",
1663 def STrih_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1664 (ins IntRegs:$src1, u6Imm:$src2),
1665 "memh($dst1=#$src2) = $src1",
1670 def STriw_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1671 (ins IntRegs:$src1, u6Imm:$src2),
1672 "memw($dst1=#$src2) = $src1",
1677 def STrid_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1678 (ins DoubleRegs:$src1, globaladdress:$src2),
1679 "memd($dst1=##$src2) = $src1",
1684 def STrib_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1685 (ins IntRegs:$src1, globaladdress:$src2),
1686 "memb($dst1=##$src2) = $src1",
1691 def STrih_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1692 (ins IntRegs:$src1, globaladdress:$src2),
1693 "memh($dst1=##$src2) = $src1",
1698 def STriw_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1699 (ins IntRegs:$src1, globaladdress:$src2),
1700 "memw($dst1=##$src2) = $src1",
1704 // memd(Rs+Ru<<#u2)=Rtt
1705 let AddedComplexity = 10, isPredicable = 1 in
1706 def STrid_indexed_shl_V4 : STInst<(outs),
1707 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, DoubleRegs:$src4),
1708 "memd($src1+$src2<<#$src3) = $src4",
1709 [(store (i64 DoubleRegs:$src4),
1710 (add (i32 IntRegs:$src1),
1711 (shl (i32 IntRegs:$src2), u2ImmPred:$src3)))]>,
1714 // memd(Ru<<#u2+#U6)=Rtt
1715 let AddedComplexity = 10 in
1716 def STrid_shl_V4 : STInst<(outs),
1717 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, DoubleRegs:$src4),
1718 "memd($src1<<#$src2+#$src3) = $src4",
1719 [(store (i64 DoubleRegs:$src4),
1720 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
1721 u6ImmPred:$src3))]>,
1724 // memd(Rx++#s4:3)=Rtt
1725 // memd(Rx++#s4:3:circ(Mu))=Rtt
1726 // memd(Rx++I:circ(Mu))=Rtt
1728 // memd(Rx++Mu:brev)=Rtt
1729 // memd(gp+#u16:3)=Rtt
1731 // Store doubleword conditionally.
1732 // if ([!]Pv[.new]) memd(#u6)=Rtt
1733 // TODO: needs to be implemented.
1735 // if ([!]Pv[.new]) memd(Rs+#u6:3)=Rtt
1736 // if (Pv) memd(Rs+#u6:3)=Rtt
1737 // if (Pv.new) memd(Rs+#u6:3)=Rtt
1738 let AddedComplexity = 10, neverHasSideEffects = 1,
1740 def STrid_cdnPt_V4 : STInst2<(outs),
1741 (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2),
1742 "if ($src1.new) memd($addr) = $src2",
1746 // if (!Pv) memd(Rs+#u6:3)=Rtt
1747 // if (!Pv.new) memd(Rs+#u6:3)=Rtt
1748 let AddedComplexity = 10, neverHasSideEffects = 1,
1750 def STrid_cdnNotPt_V4 : STInst2<(outs),
1751 (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2),
1752 "if (!$src1.new) memd($addr) = $src2",
1756 // if (Pv) memd(Rs+#u6:3)=Rtt
1757 // if (Pv.new) memd(Rs+#u6:3)=Rtt
1758 let AddedComplexity = 10, neverHasSideEffects = 1,
1760 def STrid_indexed_cdnPt_V4 : STInst2<(outs),
1761 (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3,
1763 "if ($src1.new) memd($src2+#$src3) = $src4",
1767 // if (!Pv) memd(Rs+#u6:3)=Rtt
1768 // if (!Pv.new) memd(Rs+#u6:3)=Rtt
1769 let AddedComplexity = 10, neverHasSideEffects = 1,
1771 def STrid_indexed_cdnNotPt_V4 : STInst2<(outs),
1772 (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3,
1774 "if (!$src1.new) memd($src2+#$src3) = $src4",
1778 // if ([!]Pv[.new]) memd(Rs+Ru<<#u2)=Rtt
1779 // if (Pv) memd(Rs+Ru<<#u2)=Rtt
1780 let AddedComplexity = 10, neverHasSideEffects = 1,
1782 def STrid_indexed_shl_cPt_V4 : STInst2<(outs),
1783 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1785 "if ($src1) memd($src2+$src3<<#$src4) = $src5",
1789 // if (Pv.new) memd(Rs+Ru<<#u2)=Rtt
1790 let AddedComplexity = 10, neverHasSideEffects = 1,
1792 def STrid_indexed_shl_cdnPt_V4 : STInst2<(outs),
1793 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1795 "if ($src1.new) memd($src2+$src3<<#$src4) = $src5",
1798 // if (!Pv) memd(Rs+Ru<<#u2)=Rtt
1799 let AddedComplexity = 10, neverHasSideEffects = 1,
1801 def STrid_indexed_shl_cNotPt_V4 : STInst2<(outs),
1802 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1804 "if (!$src1) memd($src2+$src3<<#$src4) = $src5",
1807 // if (!Pv.new) memd(Rs+Ru<<#u2)=Rtt
1808 let AddedComplexity = 10, neverHasSideEffects = 1,
1810 def STrid_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
1811 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1813 "if (!$src1.new) memd($src2+$src3<<#$src4) = $src5",
1817 // if ([!]Pv[.new]) memd(Rx++#s4:3)=Rtt
1818 // if (Pv) memd(Rx++#s4:3)=Rtt
1819 // if (Pv.new) memd(Rx++#s4:3)=Rtt
1820 let AddedComplexity = 10, neverHasSideEffects = 1,
1822 def POST_STdri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
1823 (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3,
1825 "if ($src1.new) memd($src3++#$offset) = $src2",
1830 // if (!Pv) memd(Rx++#s4:3)=Rtt
1831 // if (!Pv.new) memd(Rx++#s4:3)=Rtt
1832 let AddedComplexity = 10, neverHasSideEffects = 1,
1834 def POST_STdri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
1835 (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3,
1837 "if (!$src1.new) memd($src3++#$offset) = $src2",
1844 // memb(Rs+#u6:0)=#S8
1845 let AddedComplexity = 10, isPredicable = 1 in
1846 def STrib_imm_V4 : STInst<(outs),
1847 (ins IntRegs:$src1, u6_0Imm:$src2, s8Imm:$src3),
1848 "memb($src1+#$src2) = #$src3",
1849 [(truncstorei8 s8ImmPred:$src3, (add (i32 IntRegs:$src1),
1850 u6_0ImmPred:$src2))]>,
1853 // memb(Rs+Ru<<#u2)=Rt
1854 let AddedComplexity = 10, isPredicable = 1 in
1855 def STrib_indexed_shl_V4 : STInst<(outs),
1856 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
1857 "memb($src1+$src2<<#$src3) = $src4",
1858 [(truncstorei8 (i32 IntRegs:$src4),
1859 (add (i32 IntRegs:$src1),
1860 (shl (i32 IntRegs:$src2),
1861 u2ImmPred:$src3)))]>,
1864 // memb(Ru<<#u2+#U6)=Rt
1865 let AddedComplexity = 10 in
1866 def STrib_shl_V4 : STInst<(outs),
1867 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
1868 "memb($src1<<#$src2+#$src3) = $src4",
1869 [(truncstorei8 (i32 IntRegs:$src4),
1870 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
1871 u6ImmPred:$src3))]>,
1874 // memb(Rx++#s4:0:circ(Mu))=Rt
1875 // memb(Rx++I:circ(Mu))=Rt
1877 // memb(Rx++Mu:brev)=Rt
1878 // memb(gp+#u16:0)=Rt
1881 // Store byte conditionally.
1882 // if ([!]Pv[.new]) memb(#u6)=Rt
1883 // if ([!]Pv[.new]) memb(Rs+#u6:0)=#S6
1884 // if (Pv) memb(Rs+#u6:0)=#S6
1885 let neverHasSideEffects = 1,
1887 def STrib_imm_cPt_V4 : STInst2<(outs),
1888 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1889 "if ($src1) memb($src2+#$src3) = #$src4",
1893 // if (Pv.new) memb(Rs+#u6:0)=#S6
1894 let neverHasSideEffects = 1,
1896 def STrib_imm_cdnPt_V4 : STInst2<(outs),
1897 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1898 "if ($src1.new) memb($src2+#$src3) = #$src4",
1902 // if (!Pv) memb(Rs+#u6:0)=#S6
1903 let neverHasSideEffects = 1,
1905 def STrib_imm_cNotPt_V4 : STInst2<(outs),
1906 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1907 "if (!$src1) memb($src2+#$src3) = #$src4",
1911 // if (!Pv.new) memb(Rs+#u6:0)=#S6
1912 let neverHasSideEffects = 1,
1914 def STrib_imm_cdnNotPt_V4 : STInst2<(outs),
1915 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1916 "if (!$src1.new) memb($src2+#$src3) = #$src4",
1920 // if ([!]Pv[.new]) memb(Rs+#u6:0)=Rt
1921 // if (Pv) memb(Rs+#u6:0)=Rt
1922 // if (Pv.new) memb(Rs+#u6:0)=Rt
1923 let neverHasSideEffects = 1,
1925 def STrib_cdnPt_V4 : STInst2<(outs),
1926 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
1927 "if ($src1.new) memb($addr) = $src2",
1931 // if (!Pv) memb(Rs+#u6:0)=Rt
1932 // if (!Pv.new) memb(Rs+#u6:0)=Rt
1933 let neverHasSideEffects = 1,
1935 def STrib_cdnNotPt_V4 : STInst2<(outs),
1936 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
1937 "if (!$src1.new) memb($addr) = $src2",
1941 // if (Pv) memb(Rs+#u6:0)=Rt
1942 // if (!Pv) memb(Rs+#u6:0)=Rt
1943 // if (Pv.new) memb(Rs+#u6:0)=Rt
1944 let neverHasSideEffects = 1,
1946 def STrib_indexed_cdnPt_V4 : STInst2<(outs),
1947 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
1948 "if ($src1.new) memb($src2+#$src3) = $src4",
1952 // if (!Pv.new) memb(Rs+#u6:0)=Rt
1953 let neverHasSideEffects = 1,
1955 def STrib_indexed_cdnNotPt_V4 : STInst2<(outs),
1956 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
1957 "if (!$src1.new) memb($src2+#$src3) = $src4",
1961 // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Rt
1962 // if (Pv) memb(Rs+Ru<<#u2)=Rt
1963 let AddedComplexity = 10,
1965 def STrib_indexed_shl_cPt_V4 : STInst2<(outs),
1966 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1968 "if ($src1) memb($src2+$src3<<#$src4) = $src5",
1972 // if (Pv.new) memb(Rs+Ru<<#u2)=Rt
1973 let AddedComplexity = 10,
1975 def STrib_indexed_shl_cdnPt_V4 : STInst2<(outs),
1976 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1978 "if ($src1.new) memb($src2+$src3<<#$src4) = $src5",
1982 // if (!Pv) memb(Rs+Ru<<#u2)=Rt
1983 let AddedComplexity = 10,
1985 def STrib_indexed_shl_cNotPt_V4 : STInst2<(outs),
1986 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1988 "if (!$src1) memb($src2+$src3<<#$src4) = $src5",
1992 // if (!Pv.new) memb(Rs+Ru<<#u2)=Rt
1993 let AddedComplexity = 10,
1995 def STrib_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
1996 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1998 "if (!$src1.new) memb($src2+$src3<<#$src4) = $src5",
2002 // if ([!]Pv[.new]) memb(Rx++#s4:0)=Rt
2003 // if (Pv) memb(Rx++#s4:0)=Rt
2004 // if (Pv.new) memb(Rx++#s4:0)=Rt
2007 def POST_STbri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
2008 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
2009 "if ($src1.new) memb($src3++#$offset) = $src2",
2013 // if (!Pv) memb(Rx++#s4:0)=Rt
2014 // if (!Pv.new) memb(Rx++#s4:0)=Rt
2017 def POST_STbri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
2018 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
2019 "if (!$src1.new) memb($src3++#$offset) = $src2",
2025 // TODO: needs to be implemented
2026 // memh(Re=#U6)=Rt.H
2027 // memh(Rs+#s11:1)=Rt.H
2028 // memh(Rs+#u6:1)=#S8
2029 let AddedComplexity = 10, isPredicable = 1 in
2030 def STrih_imm_V4 : STInst<(outs),
2031 (ins IntRegs:$src1, u6_1Imm:$src2, s8Imm:$src3),
2032 "memh($src1+#$src2) = #$src3",
2033 [(truncstorei16 s8ImmPred:$src3, (add (i32 IntRegs:$src1),
2034 u6_1ImmPred:$src2))]>,
2037 // memh(Rs+Ru<<#u2)=Rt.H
2038 // TODO: needs to be implemented.
2040 // memh(Rs+Ru<<#u2)=Rt
2041 let AddedComplexity = 10, isPredicable = 1 in
2042 def STrih_indexed_shl_V4 : STInst<(outs),
2043 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
2044 "memh($src1+$src2<<#$src3) = $src4",
2045 [(truncstorei16 (i32 IntRegs:$src4),
2046 (add (i32 IntRegs:$src1),
2047 (shl (i32 IntRegs:$src2),
2048 u2ImmPred:$src3)))]>,
2051 // memh(Ru<<#u2+#U6)=Rt.H
2052 // memh(Ru<<#u2+#U6)=Rt
2053 let AddedComplexity = 10 in
2054 def STrih_shl_V4 : STInst<(outs),
2055 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
2056 "memh($src1<<#$src2+#$src3) = $src4",
2057 [(truncstorei16 (i32 IntRegs:$src4),
2058 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
2059 u6ImmPred:$src3))]>,
2062 // memh(Rx++#s4:1:circ(Mu))=Rt.H
2063 // memh(Rx++#s4:1:circ(Mu))=Rt
2064 // memh(Rx++I:circ(Mu))=Rt.H
2065 // memh(Rx++I:circ(Mu))=Rt
2066 // memh(Rx++Mu)=Rt.H
2068 // memh(Rx++Mu:brev)=Rt.H
2069 // memh(Rx++Mu:brev)=Rt
2070 // memh(gp+#u16:1)=Rt
2071 // if ([!]Pv[.new]) memh(#u6)=Rt.H
2072 // if ([!]Pv[.new]) memh(#u6)=Rt
2074 // if ([!]Pv[.new]) memh(Rs+#u6:1)=#S6
2075 // if (Pv) memh(Rs+#u6:1)=#S6
2076 let neverHasSideEffects = 1,
2078 def STrih_imm_cPt_V4 : STInst2<(outs),
2079 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
2080 "if ($src1) memh($src2+#$src3) = #$src4",
2084 // if (Pv.new) memh(Rs+#u6:1)=#S6
2085 let neverHasSideEffects = 1,
2087 def STrih_imm_cdnPt_V4 : STInst2<(outs),
2088 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
2089 "if ($src1.new) memh($src2+#$src3) = #$src4",
2093 // if (!Pv) memh(Rs+#u6:1)=#S6
2094 let neverHasSideEffects = 1,
2096 def STrih_imm_cNotPt_V4 : STInst2<(outs),
2097 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
2098 "if (!$src1) memh($src2+#$src3) = #$src4",
2102 // if (!Pv.new) memh(Rs+#u6:1)=#S6
2103 let neverHasSideEffects = 1,
2105 def STrih_imm_cdnNotPt_V4 : STInst2<(outs),
2106 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
2107 "if (!$src1.new) memh($src2+#$src3) = #$src4",
2111 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt.H
2112 // TODO: needs to be implemented.
2114 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt
2115 // if (Pv) memh(Rs+#u6:1)=Rt
2116 // if (Pv.new) memh(Rs+#u6:1)=Rt
2117 let neverHasSideEffects = 1,
2119 def STrih_cdnPt_V4 : STInst2<(outs),
2120 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2121 "if ($src1.new) memh($addr) = $src2",
2125 // if (!Pv) memh(Rs+#u6:1)=Rt
2126 // if (!Pv.new) memh(Rs+#u6:1)=Rt
2127 let neverHasSideEffects = 1,
2129 def STrih_cdnNotPt_V4 : STInst2<(outs),
2130 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2131 "if (!$src1.new) memh($addr) = $src2",
2135 // if (Pv.new) memh(Rs+#u6:1)=Rt
2136 let neverHasSideEffects = 1,
2138 def STrih_indexed_cdnPt_V4 : STInst2<(outs),
2139 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
2140 "if ($src1.new) memh($src2+#$src3) = $src4",
2144 // if (!Pv.new) memh(Rs+#u6:1)=Rt
2145 let neverHasSideEffects = 1,
2147 def STrih_indexed_cdnNotPt_V4 : STInst2<(outs),
2148 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
2149 "if (!$src1.new) memh($src2+#$src3) = $src4",
2153 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt.H
2154 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt
2155 // if (Pv) memh(Rs+Ru<<#u2)=Rt
2156 let AddedComplexity = 10,
2158 def STrih_indexed_shl_cPt_V4 : STInst2<(outs),
2159 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2161 "if ($src1) memh($src2+$src3<<#$src4) = $src5",
2165 // if (Pv.new) memh(Rs+Ru<<#u2)=Rt
2166 let AddedComplexity = 10,
2168 def STrih_indexed_shl_cdnPt_V4 : STInst2<(outs),
2169 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2171 "if ($src1.new) memh($src2+$src3<<#$src4) = $src5",
2175 // if (!Pv) memh(Rs+Ru<<#u2)=Rt
2176 let AddedComplexity = 10,
2178 def STrih_indexed_shl_cNotPt_V4 : STInst2<(outs),
2179 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2181 "if (!$src1) memh($src2+$src3<<#$src4) = $src5",
2185 // if (!Pv.new) memh(Rs+Ru<<#u2)=Rt
2186 let AddedComplexity = 10,
2188 def STrih_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
2189 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2191 "if (!$src1.new) memh($src2+$src3<<#$src4) = $src5",
2195 // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt.H
2196 // TODO: Needs to be implemented.
2198 // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt
2199 // if (Pv) memh(Rx++#s4:1)=Rt
2200 // if (Pv.new) memh(Rx++#s4:1)=Rt
2203 def POST_SThri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
2204 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
2205 "if ($src1.new) memh($src3++#$offset) = $src2",
2209 // if (!Pv) memh(Rx++#s4:1)=Rt
2210 // if (!Pv.new) memh(Rx++#s4:1)=Rt
2213 def POST_SThri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
2214 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
2215 "if (!$src1.new) memh($src3++#$offset) = $src2",
2222 // TODO: Needs to be implemented.
2225 let neverHasSideEffects = 1 in
2226 def STriw_pred_V4 : STInst2<(outs),
2227 (ins MEMri:$addr, PredRegs:$src1),
2228 "Error; should not emit",
2233 // memw(Rs+#u6:2)=#S8
2234 let AddedComplexity = 10, isPredicable = 1 in
2235 def STriw_imm_V4 : STInst<(outs),
2236 (ins IntRegs:$src1, u6_2Imm:$src2, s8Imm:$src3),
2237 "memw($src1+#$src2) = #$src3",
2238 [(store s8ImmPred:$src3, (add (i32 IntRegs:$src1),
2239 u6_2ImmPred:$src2))]>,
2242 // memw(Rs+Ru<<#u2)=Rt
2243 let AddedComplexity = 10, isPredicable = 1 in
2244 def STriw_indexed_shl_V4 : STInst<(outs),
2245 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
2246 "memw($src1+$src2<<#$src3) = $src4",
2247 [(store (i32 IntRegs:$src4), (add (i32 IntRegs:$src1),
2248 (shl (i32 IntRegs:$src2),
2249 u2ImmPred:$src3)))]>,
2252 // memw(Ru<<#u2+#U6)=Rt
2253 let AddedComplexity = 10 in
2254 def STriw_shl_V4 : STInst<(outs),
2255 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
2256 "memw($src1<<#$src2+#$src3) = $src4",
2257 [(store (i32 IntRegs:$src4),
2258 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
2259 u6ImmPred:$src3))]>,
2262 // memw(Rx++#s4:2)=Rt
2263 // memw(Rx++#s4:2:circ(Mu))=Rt
2264 // memw(Rx++I:circ(Mu))=Rt
2266 // memw(Rx++Mu:brev)=Rt
2267 // memw(gp+#u16:2)=Rt
2270 // Store word conditionally.
2272 // if ([!]Pv[.new]) memw(Rs+#u6:2)=#S6
2273 // if (Pv) memw(Rs+#u6:2)=#S6
2274 let neverHasSideEffects = 1,
2276 def STriw_imm_cPt_V4 : STInst2<(outs),
2277 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2278 "if ($src1) memw($src2+#$src3) = #$src4",
2282 // if (Pv.new) memw(Rs+#u6:2)=#S6
2283 let neverHasSideEffects = 1,
2285 def STriw_imm_cdnPt_V4 : STInst2<(outs),
2286 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2287 "if ($src1.new) memw($src2+#$src3) = #$src4",
2291 // if (!Pv) memw(Rs+#u6:2)=#S6
2292 let neverHasSideEffects = 1,
2294 def STriw_imm_cNotPt_V4 : STInst2<(outs),
2295 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2296 "if (!$src1) memw($src2+#$src3) = #$src4",
2300 // if (!Pv.new) memw(Rs+#u6:2)=#S6
2301 let neverHasSideEffects = 1,
2303 def STriw_imm_cdnNotPt_V4 : STInst2<(outs),
2304 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2305 "if (!$src1.new) memw($src2+#$src3) = #$src4",
2309 // if ([!]Pv[.new]) memw(Rs+#u6:2)=Rt
2310 // if (Pv) memw(Rs+#u6:2)=Rt
2311 // if (Pv.new) memw(Rs+#u6:2)=Rt
2312 let neverHasSideEffects = 1,
2314 def STriw_cdnPt_V4 : STInst2<(outs),
2315 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2316 "if ($src1.new) memw($addr) = $src2",
2320 // if (!Pv) memw(Rs+#u6:2)=Rt
2321 // if (!Pv.new) memw(Rs+#u6:2)=Rt
2322 let neverHasSideEffects = 1,
2324 def STriw_cdnNotPt_V4 : STInst2<(outs),
2325 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2326 "if (!$src1.new) memw($addr) = $src2",
2330 // if (Pv) memw(Rs+#u6:2)=Rt
2331 // if (!Pv) memw(Rs+#u6:2)=Rt
2332 // if (Pv.new) memw(Rs+#u6:2)=Rt
2333 let neverHasSideEffects = 1,
2335 def STriw_indexed_cdnPt_V4 : STInst2<(outs),
2336 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
2337 "if ($src1.new) memw($src2+#$src3) = $src4",
2341 // if (!Pv.new) memw(Rs+#u6:2)=Rt
2342 let neverHasSideEffects = 1,
2344 def STriw_indexed_cdnNotPt_V4 : STInst2<(outs),
2345 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
2346 "if (!$src1.new) memw($src2+#$src3) = $src4",
2350 // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Rt
2351 // if (Pv) memw(Rs+Ru<<#u2)=Rt
2352 let AddedComplexity = 10,
2354 def STriw_indexed_shl_cPt_V4 : STInst2<(outs),
2355 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2357 "if ($src1) memw($src2+$src3<<#$src4) = $src5",
2361 // if (Pv.new) memw(Rs+Ru<<#u2)=Rt
2362 let AddedComplexity = 10,
2364 def STriw_indexed_shl_cdnPt_V4 : STInst2<(outs),
2365 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2367 "if ($src1.new) memw($src2+$src3<<#$src4) = $src5",
2371 // if (!Pv) memw(Rs+Ru<<#u2)=Rt
2372 let AddedComplexity = 10,
2374 def STriw_indexed_shl_cNotPt_V4 : STInst2<(outs),
2375 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2377 "if (!$src1) memw($src2+$src3<<#$src4) = $src5",
2381 // if (!Pv.new) memw(Rs+Ru<<#u2)=Rt
2382 let AddedComplexity = 10,
2384 def STriw_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
2385 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2387 "if (!$src1.new) memw($src2+$src3<<#$src4) = $src5",
2391 // if ([!]Pv[.new]) memw(Rx++#s4:2)=Rt
2392 // if (Pv) memw(Rx++#s4:2)=Rt
2393 // if (Pv.new) memw(Rx++#s4:2)=Rt
2396 def POST_STwri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
2397 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
2398 "if ($src1.new) memw($src3++#$offset) = $src2",
2402 // if (!Pv) memw(Rx++#s4:2)=Rt
2403 // if (!Pv.new) memw(Rx++#s4:2)=Rt
2406 def POST_STwri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
2407 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
2408 "if (!$src1.new) memw($src3++#$offset) = $src2",
2413 /// store to global address
2415 let isPredicable = 1, neverHasSideEffects = 1 in
2416 def STrid_GP_V4 : STInst2<(outs),
2417 (ins globaladdress:$global, u16Imm:$offset, DoubleRegs:$src),
2418 "memd(#$global+$offset) = $src",
2422 let neverHasSideEffects = 1, isPredicated = 1 in
2423 def STrid_GP_cPt_V4 : STInst2<(outs),
2424 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2426 "if ($src1) memd(##$global+$offset) = $src2",
2430 let neverHasSideEffects = 1, isPredicated = 1 in
2431 def STrid_GP_cNotPt_V4 : STInst2<(outs),
2432 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2434 "if (!$src1) memd(##$global+$offset) = $src2",
2438 let neverHasSideEffects = 1, isPredicated = 1 in
2439 def STrid_GP_cdnPt_V4 : STInst2<(outs),
2440 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2442 "if ($src1.new) memd(##$global+$offset) = $src2",
2446 let neverHasSideEffects = 1, isPredicated = 1 in
2447 def STrid_GP_cdnNotPt_V4 : STInst2<(outs),
2448 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2450 "if (!$src1.new) memd(##$global+$offset) = $src2",
2454 let isPredicable = 1, neverHasSideEffects = 1 in
2455 def STrib_GP_V4 : STInst2<(outs),
2456 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2457 "memb(#$global+$offset) = $src",
2461 let neverHasSideEffects = 1, isPredicated = 1 in
2462 def STrib_GP_cPt_V4 : STInst2<(outs),
2463 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2465 "if ($src1) memb(##$global+$offset) = $src2",
2469 let neverHasSideEffects = 1, isPredicated = 1 in
2470 def STrib_GP_cNotPt_V4 : STInst2<(outs),
2471 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2473 "if (!$src1) memb(##$global+$offset) = $src2",
2477 let neverHasSideEffects = 1, isPredicated = 1 in
2478 def STrib_GP_cdnPt_V4 : STInst2<(outs),
2479 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2481 "if ($src1.new) memb(##$global+$offset) = $src2",
2485 let neverHasSideEffects = 1, isPredicated = 1 in
2486 def STrib_GP_cdnNotPt_V4 : STInst2<(outs),
2487 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2489 "if (!$src1.new) memb(##$global+$offset) = $src2",
2493 let isPredicable = 1, neverHasSideEffects = 1 in
2494 def STrih_GP_V4 : STInst2<(outs),
2495 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2496 "memh(#$global+$offset) = $src",
2500 let neverHasSideEffects = 1, isPredicated = 1 in
2501 def STrih_GP_cPt_V4 : STInst2<(outs),
2502 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2504 "if ($src1) memh(##$global+$offset) = $src2",
2508 let neverHasSideEffects = 1, isPredicated = 1 in
2509 def STrih_GP_cNotPt_V4 : STInst2<(outs),
2510 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2512 "if (!$src1) memh(##$global+$offset) = $src2",
2516 let neverHasSideEffects = 1, isPredicated = 1 in
2517 def STrih_GP_cdnPt_V4 : STInst2<(outs),
2518 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2520 "if ($src1.new) memh(##$global+$offset) = $src2",
2524 let neverHasSideEffects = 1, isPredicated = 1 in
2525 def STrih_GP_cdnNotPt_V4 : STInst2<(outs),
2526 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2528 "if (!$src1.new) memh(##$global+$offset) = $src2",
2532 let isPredicable = 1, neverHasSideEffects = 1 in
2533 def STriw_GP_V4 : STInst2<(outs),
2534 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2535 "memw(#$global+$offset) = $src",
2539 let neverHasSideEffects = 1, isPredicated = 1 in
2540 def STriw_GP_cPt_V4 : STInst2<(outs),
2541 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2543 "if ($src1) memw(##$global+$offset) = $src2",
2547 let neverHasSideEffects = 1, isPredicated = 1 in
2548 def STriw_GP_cNotPt_V4 : STInst2<(outs),
2549 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2551 "if (!$src1) memw(##$global+$offset) = $src2",
2555 let neverHasSideEffects = 1, isPredicated = 1 in
2556 def STriw_GP_cdnPt_V4 : STInst2<(outs),
2557 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2559 "if ($src1.new) memw(##$global+$offset) = $src2",
2563 let neverHasSideEffects = 1, isPredicated = 1 in
2564 def STriw_GP_cdnNotPt_V4 : STInst2<(outs),
2565 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2567 "if (!$src1.new) memw(##$global+$offset) = $src2",
2571 // memd(#global)=Rtt
2572 let isPredicable = 1, neverHasSideEffects = 1 in
2573 def STd_GP_V4 : STInst2<(outs),
2574 (ins globaladdress:$global, DoubleRegs:$src),
2575 "memd(#$global) = $src",
2579 // if (Pv) memd(##global) = Rtt
2580 let neverHasSideEffects = 1, isPredicated = 1 in
2581 def STd_GP_cPt_V4 : STInst2<(outs),
2582 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2583 "if ($src1) memd(##$global) = $src2",
2587 // if (!Pv) memd(##global) = Rtt
2588 let neverHasSideEffects = 1, isPredicated = 1 in
2589 def STd_GP_cNotPt_V4 : STInst2<(outs),
2590 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2591 "if (!$src1) memd(##$global) = $src2",
2595 // if (Pv) memd(##global) = Rtt
2596 let neverHasSideEffects = 1, isPredicated = 1 in
2597 def STd_GP_cdnPt_V4 : STInst2<(outs),
2598 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2599 "if ($src1.new) memd(##$global) = $src2",
2603 // if (!Pv) memd(##global) = Rtt
2604 let neverHasSideEffects = 1, isPredicated = 1 in
2605 def STd_GP_cdnNotPt_V4 : STInst2<(outs),
2606 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2607 "if (!$src1.new) memd(##$global) = $src2",
2612 let isPredicable = 1, neverHasSideEffects = 1 in
2613 def STb_GP_V4 : STInst2<(outs),
2614 (ins globaladdress:$global, IntRegs:$src),
2615 "memb(#$global) = $src",
2619 // if (Pv) memb(##global) = Rt
2620 let neverHasSideEffects = 1, isPredicated = 1 in
2621 def STb_GP_cPt_V4 : STInst2<(outs),
2622 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2623 "if ($src1) memb(##$global) = $src2",
2627 // if (!Pv) memb(##global) = Rt
2628 let neverHasSideEffects = 1, isPredicated = 1 in
2629 def STb_GP_cNotPt_V4 : STInst2<(outs),
2630 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2631 "if (!$src1) memb(##$global) = $src2",
2635 // if (Pv) memb(##global) = Rt
2636 let neverHasSideEffects = 1, isPredicated = 1 in
2637 def STb_GP_cdnPt_V4 : STInst2<(outs),
2638 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2639 "if ($src1.new) memb(##$global) = $src2",
2643 // if (!Pv) memb(##global) = Rt
2644 let neverHasSideEffects = 1, isPredicated = 1 in
2645 def STb_GP_cdnNotPt_V4 : STInst2<(outs),
2646 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2647 "if (!$src1.new) memb(##$global) = $src2",
2652 let isPredicable = 1, neverHasSideEffects = 1 in
2653 def STh_GP_V4 : STInst2<(outs),
2654 (ins globaladdress:$global, IntRegs:$src),
2655 "memh(#$global) = $src",
2659 // if (Pv) memh(##global) = Rt
2660 let neverHasSideEffects = 1, isPredicated = 1 in
2661 def STh_GP_cPt_V4 : STInst2<(outs),
2662 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2663 "if ($src1) memh(##$global) = $src2",
2667 // if (!Pv) memh(##global) = Rt
2668 let neverHasSideEffects = 1, isPredicated = 1 in
2669 def STh_GP_cNotPt_V4 : STInst2<(outs),
2670 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2671 "if (!$src1) memh(##$global) = $src2",
2675 // if (Pv) memh(##global) = Rt
2676 let neverHasSideEffects = 1, isPredicated = 1 in
2677 def STh_GP_cdnPt_V4 : STInst2<(outs),
2678 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2679 "if ($src1.new) memh(##$global) = $src2",
2683 // if (!Pv) memh(##global) = Rt
2684 let neverHasSideEffects = 1, isPredicated = 1 in
2685 def STh_GP_cdnNotPt_V4 : STInst2<(outs),
2686 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2687 "if (!$src1.new) memh(##$global) = $src2",
2692 let isPredicable = 1, neverHasSideEffects = 1 in
2693 def STw_GP_V4 : STInst2<(outs),
2694 (ins globaladdress:$global, IntRegs:$src),
2695 "memw(#$global) = $src",
2699 // if (Pv) memw(##global) = Rt
2700 let neverHasSideEffects = 1, isPredicated = 1 in
2701 def STw_GP_cPt_V4 : STInst2<(outs),
2702 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2703 "if ($src1) memw(##$global) = $src2",
2707 // if (!Pv) memw(##global) = Rt
2708 let neverHasSideEffects = 1, isPredicated = 1 in
2709 def STw_GP_cNotPt_V4 : STInst2<(outs),
2710 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2711 "if (!$src1) memw(##$global) = $src2",
2715 // if (Pv) memw(##global) = Rt
2716 let neverHasSideEffects = 1, isPredicated = 1 in
2717 def STw_GP_cdnPt_V4 : STInst2<(outs),
2718 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2719 "if ($src1.new) memw(##$global) = $src2",
2723 // if (!Pv) memw(##global) = Rt
2724 let neverHasSideEffects = 1, isPredicated = 1 in
2725 def STw_GP_cdnNotPt_V4 : STInst2<(outs),
2726 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2727 "if (!$src1.new) memw(##$global) = $src2",
2731 // 64 bit atomic store
2732 def : Pat <(atomic_store_64 (HexagonCONST32_GP tglobaladdr:$global),
2733 (i64 DoubleRegs:$src1)),
2734 (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>,
2737 // Map from store(globaladdress) -> memd(#foo)
2738 let AddedComplexity = 100 in
2739 def : Pat <(store (i64 DoubleRegs:$src1),
2740 (HexagonCONST32_GP tglobaladdr:$global)),
2741 (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>,
2744 // 8 bit atomic store
2745 def : Pat < (atomic_store_8 (HexagonCONST32_GP tglobaladdr:$global),
2746 (i32 IntRegs:$src1)),
2747 (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2750 // Map from store(globaladdress) -> memb(#foo)
2751 let AddedComplexity = 100 in
2752 def : Pat<(truncstorei8 (i32 IntRegs:$src1),
2753 (HexagonCONST32_GP tglobaladdr:$global)),
2754 (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2757 // Map from "i1 = constant<-1>; memw(CONST32(#foo)) = i1"
2758 // to "r0 = 1; memw(#foo) = r0"
2759 let AddedComplexity = 100 in
2760 def : Pat<(store (i1 -1), (HexagonCONST32_GP tglobaladdr:$global)),
2761 (STb_GP_V4 tglobaladdr:$global, (TFRI 1))>,
2764 def : Pat<(atomic_store_16 (HexagonCONST32_GP tglobaladdr:$global),
2765 (i32 IntRegs:$src1)),
2766 (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2769 // Map from store(globaladdress) -> memh(#foo)
2770 let AddedComplexity = 100 in
2771 def : Pat<(truncstorei16 (i32 IntRegs:$src1),
2772 (HexagonCONST32_GP tglobaladdr:$global)),
2773 (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2776 // 32 bit atomic store
2777 def : Pat<(atomic_store_32 (HexagonCONST32_GP tglobaladdr:$global),
2778 (i32 IntRegs:$src1)),
2779 (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2782 // Map from store(globaladdress) -> memw(#foo)
2783 let AddedComplexity = 100 in
2784 def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32_GP tglobaladdr:$global)),
2785 (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2788 def : Pat<(atomic_store_64 (add (HexagonCONST32_GP tglobaladdr:$global),
2789 u16ImmPred:$offset),
2790 (i64 DoubleRegs:$src1)),
2791 (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2792 (i64 DoubleRegs:$src1))>,
2795 def : Pat<(atomic_store_32 (add (HexagonCONST32_GP tglobaladdr:$global),
2796 u16ImmPred:$offset),
2797 (i32 IntRegs:$src1)),
2798 (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2799 (i32 IntRegs:$src1))>,
2802 def : Pat<(atomic_store_16 (add (HexagonCONST32_GP tglobaladdr:$global),
2803 u16ImmPred:$offset),
2804 (i32 IntRegs:$src1)),
2805 (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2806 (i32 IntRegs:$src1))>,
2809 def : Pat<(atomic_store_8 (add (HexagonCONST32_GP tglobaladdr:$global),
2810 u16ImmPred:$offset),
2811 (i32 IntRegs:$src1)),
2812 (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2813 (i32 IntRegs:$src1))>,
2816 // Map from store(globaladdress + x) -> memd(#foo + x)
2817 let AddedComplexity = 100 in
2818 def : Pat<(store (i64 DoubleRegs:$src1),
2819 (add (HexagonCONST32_GP tglobaladdr:$global),
2820 u16ImmPred:$offset)),
2821 (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2822 (i64 DoubleRegs:$src1))>,
2825 // Map from store(globaladdress + x) -> memb(#foo + x)
2826 let AddedComplexity = 100 in
2827 def : Pat<(truncstorei8 (i32 IntRegs:$src1),
2828 (add (HexagonCONST32_GP tglobaladdr:$global),
2829 u16ImmPred:$offset)),
2830 (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2831 (i32 IntRegs:$src1))>,
2834 // Map from store(globaladdress + x) -> memh(#foo + x)
2835 let AddedComplexity = 100 in
2836 def : Pat<(truncstorei16 (i32 IntRegs:$src1),
2837 (add (HexagonCONST32_GP tglobaladdr:$global),
2838 u16ImmPred:$offset)),
2839 (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2840 (i32 IntRegs:$src1))>,
2843 // Map from store(globaladdress + x) -> memw(#foo + x)
2844 let AddedComplexity = 100 in
2845 def : Pat<(store (i32 IntRegs:$src1),
2846 (add (HexagonCONST32_GP tglobaladdr:$global),
2847 u16ImmPred:$offset)),
2848 (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2849 (i32 IntRegs:$src1))>,
2854 //===----------------------------------------------------------------------===
2856 //===----------------------------------------------------------------------===
2859 //===----------------------------------------------------------------------===//
2861 //===----------------------------------------------------------------------===//
2863 // Store new-value byte.
2865 // memb(Re=#U6)=Nt.new
2866 // memb(Rs+#s11:0)=Nt.new
2867 let mayStore = 1, isPredicable = 1 in
2868 def STrib_nv_V4 : NVInst_V4<(outs), (ins MEMri:$addr, IntRegs:$src1),
2869 "memb($addr) = $src1.new",
2873 let mayStore = 1, isPredicable = 1 in
2874 def STrib_indexed_nv_V4 : NVInst_V4<(outs),
2875 (ins IntRegs:$src1, s11_0Imm:$src2, IntRegs:$src3),
2876 "memb($src1+#$src2) = $src3.new",
2880 // memb(Rs+Ru<<#u2)=Nt.new
2881 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in
2882 def STrib_indexed_shl_nv_V4 : NVInst_V4<(outs),
2883 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
2884 "memb($src1+$src2<<#$src3) = $src4.new",
2888 // memb(Ru<<#u2+#U6)=Nt.new
2889 let mayStore = 1, AddedComplexity = 10 in
2890 def STrib_shl_nv_V4 : NVInst_V4<(outs),
2891 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
2892 "memb($src1<<#$src2+#$src3) = $src4.new",
2896 // memb(Rx++#s4:0)=Nt.new
2897 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in
2898 def POST_STbri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2899 (ins IntRegs:$src1, IntRegs:$src2, s4_0Imm:$offset),
2900 "memb($src2++#$offset) = $src1.new",
2905 // memb(Rx++#s4:0:circ(Mu))=Nt.new
2906 // memb(Rx++I:circ(Mu))=Nt.new
2907 // memb(Rx++Mu)=Nt.new
2908 // memb(Rx++Mu:brev)=Nt.new
2910 // memb(gp+#u16:0)=Nt.new
2911 let mayStore = 1, neverHasSideEffects = 1 in
2912 def STrib_GP_nv_V4 : NVInst_V4<(outs),
2913 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2914 "memb(#$global+$offset) = $src.new",
2918 // memb(#global)=Nt.new
2919 let mayStore = 1, neverHasSideEffects = 1 in
2920 def STb_GP_nv_V4 : NVInst_V4<(outs),
2921 (ins globaladdress:$global, IntRegs:$src),
2922 "memb(#$global) = $src.new",
2926 // Store new-value byte conditionally.
2927 // if ([!]Pv[.new]) memb(#u6)=Nt.new
2928 // if (Pv) memb(Rs+#u6:0)=Nt.new
2929 let mayStore = 1, neverHasSideEffects = 1,
2931 def STrib_cPt_nv_V4 : NVInst_V4<(outs),
2932 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2933 "if ($src1) memb($addr) = $src2.new",
2937 // if (Pv.new) memb(Rs+#u6:0)=Nt.new
2938 let mayStore = 1, neverHasSideEffects = 1,
2940 def STrib_cdnPt_nv_V4 : NVInst_V4<(outs),
2941 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2942 "if ($src1.new) memb($addr) = $src2.new",
2946 // if (!Pv) memb(Rs+#u6:0)=Nt.new
2947 let mayStore = 1, neverHasSideEffects = 1,
2949 def STrib_cNotPt_nv_V4 : NVInst_V4<(outs),
2950 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2951 "if (!$src1) memb($addr) = $src2.new",
2955 // if (!Pv.new) memb(Rs+#u6:0)=Nt.new
2956 let mayStore = 1, neverHasSideEffects = 1,
2958 def STrib_cdnNotPt_nv_V4 : NVInst_V4<(outs),
2959 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2960 "if (!$src1.new) memb($addr) = $src2.new",
2964 // if (Pv) memb(Rs+#u6:0)=Nt.new
2965 let mayStore = 1, neverHasSideEffects = 1,
2967 def STrib_indexed_cPt_nv_V4 : NVInst_V4<(outs),
2968 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2969 "if ($src1) memb($src2+#$src3) = $src4.new",
2973 // if (Pv.new) memb(Rs+#u6:0)=Nt.new
2974 let mayStore = 1, neverHasSideEffects = 1,
2976 def STrib_indexed_cdnPt_nv_V4 : NVInst_V4<(outs),
2977 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2978 "if ($src1.new) memb($src2+#$src3) = $src4.new",
2982 // if (!Pv) memb(Rs+#u6:0)=Nt.new
2983 let mayStore = 1, neverHasSideEffects = 1,
2985 def STrib_indexed_cNotPt_nv_V4 : NVInst_V4<(outs),
2986 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2987 "if (!$src1) memb($src2+#$src3) = $src4.new",
2991 // if (!Pv.new) memb(Rs+#u6:0)=Nt.new
2992 let mayStore = 1, neverHasSideEffects = 1,
2994 def STrib_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs),
2995 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2996 "if (!$src1.new) memb($src2+#$src3) = $src4.new",
3001 // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Nt.new
3002 // if (Pv) memb(Rs+Ru<<#u2)=Nt.new
3003 let mayStore = 1, AddedComplexity = 10,
3005 def STrib_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs),
3006 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3008 "if ($src1) memb($src2+$src3<<#$src4) = $src5.new",
3012 // if (Pv.new) memb(Rs+Ru<<#u2)=Nt.new
3013 let mayStore = 1, AddedComplexity = 10,
3015 def STrib_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs),
3016 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3018 "if ($src1.new) memb($src2+$src3<<#$src4) = $src5.new",
3022 // if (!Pv) memb(Rs+Ru<<#u2)=Nt.new
3023 let mayStore = 1, AddedComplexity = 10,
3025 def STrib_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs),
3026 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3028 "if (!$src1) memb($src2+$src3<<#$src4) = $src5.new",
3032 // if (!Pv.new) memb(Rs+Ru<<#u2)=Nt.new
3033 let mayStore = 1, AddedComplexity = 10,
3035 def STrib_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3036 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3038 "if (!$src1.new) memb($src2+$src3<<#$src4) = $src5.new",
3042 // if ([!]Pv[.new]) memb(Rx++#s4:0)=Nt.new
3043 // if (Pv) memb(Rx++#s4:0)=Nt.new
3044 let mayStore = 1, hasCtrlDep = 1,
3046 def POST_STbri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3047 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
3048 "if ($src1) memb($src3++#$offset) = $src2.new",
3052 // if (Pv.new) memb(Rx++#s4:0)=Nt.new
3053 let mayStore = 1, hasCtrlDep = 1,
3055 def POST_STbri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3056 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
3057 "if ($src1.new) memb($src3++#$offset) = $src2.new",
3061 // if (!Pv) memb(Rx++#s4:0)=Nt.new
3062 let mayStore = 1, hasCtrlDep = 1,
3064 def POST_STbri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3065 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
3066 "if (!$src1) memb($src3++#$offset) = $src2.new",
3070 // if (!Pv.new) memb(Rx++#s4:0)=Nt.new
3071 let mayStore = 1, hasCtrlDep = 1,
3073 def POST_STbri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3074 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
3075 "if (!$src1.new) memb($src3++#$offset) = $src2.new",
3080 // Store new-value halfword.
3081 // memh(Re=#U6)=Nt.new
3082 // memh(Rs+#s11:1)=Nt.new
3083 let mayStore = 1, isPredicable = 1 in
3084 def STrih_nv_V4 : NVInst_V4<(outs), (ins MEMri:$addr, IntRegs:$src1),
3085 "memh($addr) = $src1.new",
3089 let mayStore = 1, isPredicable = 1 in
3090 def STrih_indexed_nv_V4 : NVInst_V4<(outs),
3091 (ins IntRegs:$src1, s11_1Imm:$src2, IntRegs:$src3),
3092 "memh($src1+#$src2) = $src3.new",
3096 // memh(Rs+Ru<<#u2)=Nt.new
3097 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in
3098 def STrih_indexed_shl_nv_V4 : NVInst_V4<(outs),
3099 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
3100 "memh($src1+$src2<<#$src3) = $src4.new",
3104 // memh(Ru<<#u2+#U6)=Nt.new
3105 let mayStore = 1, AddedComplexity = 10 in
3106 def STrih_shl_nv_V4 : NVInst_V4<(outs),
3107 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
3108 "memh($src1<<#$src2+#$src3) = $src4.new",
3112 // memh(Rx++#s4:1)=Nt.new
3113 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in
3114 def POST_SThri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3115 (ins IntRegs:$src1, IntRegs:$src2, s4_1Imm:$offset),
3116 "memh($src2++#$offset) = $src1.new",
3121 // memh(Rx++#s4:1:circ(Mu))=Nt.new
3122 // memh(Rx++I:circ(Mu))=Nt.new
3123 // memh(Rx++Mu)=Nt.new
3124 // memh(Rx++Mu:brev)=Nt.new
3126 // memh(gp+#u16:1)=Nt.new
3127 let mayStore = 1, neverHasSideEffects = 1 in
3128 def STrih_GP_nv_V4 : NVInst_V4<(outs),
3129 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
3130 "memh(#$global+$offset) = $src.new",
3134 // memh(#global)=Nt.new
3135 let mayStore = 1, neverHasSideEffects = 1 in
3136 def STh_GP_nv_V4 : NVInst_V4<(outs),
3137 (ins globaladdress:$global, IntRegs:$src),
3138 "memh(#$global) = $src.new",
3143 // Store new-value halfword conditionally.
3145 // if ([!]Pv[.new]) memh(#u6)=Nt.new
3147 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Nt.new
3148 // if (Pv) memh(Rs+#u6:1)=Nt.new
3149 let mayStore = 1, neverHasSideEffects = 1,
3151 def STrih_cPt_nv_V4 : NVInst_V4<(outs),
3152 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3153 "if ($src1) memh($addr) = $src2.new",
3157 // if (Pv.new) memh(Rs+#u6:1)=Nt.new
3158 let mayStore = 1, neverHasSideEffects = 1,
3160 def STrih_cdnPt_nv_V4 : NVInst_V4<(outs),
3161 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3162 "if ($src1.new) memh($addr) = $src2.new",
3166 // if (!Pv) memh(Rs+#u6:1)=Nt.new
3167 let mayStore = 1, neverHasSideEffects = 1,
3169 def STrih_cNotPt_nv_V4 : NVInst_V4<(outs),
3170 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3171 "if (!$src1) memh($addr) = $src2.new",
3175 // if (!Pv.new) memh(Rs+#u6:1)=Nt.new
3176 let mayStore = 1, neverHasSideEffects = 1,
3178 def STrih_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3179 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3180 "if (!$src1.new) memh($addr) = $src2.new",
3184 // if (Pv) memh(Rs+#u6:1)=Nt.new
3185 let mayStore = 1, neverHasSideEffects = 1,
3187 def STrih_indexed_cPt_nv_V4 : NVInst_V4<(outs),
3188 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3189 "if ($src1) memh($src2+#$src3) = $src4.new",
3193 // if (Pv.new) memh(Rs+#u6:1)=Nt.new
3194 let mayStore = 1, neverHasSideEffects = 1,
3196 def STrih_indexed_cdnPt_nv_V4 : NVInst_V4<(outs),
3197 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3198 "if ($src1.new) memh($src2+#$src3) = $src4.new",
3202 // if (!Pv) memh(Rs+#u6:1)=Nt.new
3203 let mayStore = 1, neverHasSideEffects = 1,
3205 def STrih_indexed_cNotPt_nv_V4 : NVInst_V4<(outs),
3206 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3207 "if (!$src1) memh($src2+#$src3) = $src4.new",
3211 // if (!Pv.new) memh(Rs+#u6:1)=Nt.new
3212 let mayStore = 1, neverHasSideEffects = 1,
3214 def STrih_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3215 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3216 "if (!$src1.new) memh($src2+#$src3) = $src4.new",
3220 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Nt.new
3221 // if (Pv) memh(Rs+Ru<<#u2)=Nt.new
3222 let mayStore = 1, AddedComplexity = 10,
3224 def STrih_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs),
3225 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3227 "if ($src1) memh($src2+$src3<<#$src4) = $src5.new",
3231 // if (Pv.new) memh(Rs+Ru<<#u2)=Nt.new
3232 let mayStore = 1, AddedComplexity = 10,
3234 def STrih_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs),
3235 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3237 "if ($src1.new) memh($src2+$src3<<#$src4) = $src5.new",
3241 // if (!Pv) memh(Rs+Ru<<#u2)=Nt.new
3242 let mayStore = 1, AddedComplexity = 10,
3244 def STrih_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs),
3245 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3247 "if (!$src1) memh($src2+$src3<<#$src4) = $src5.new",
3251 // if (!Pv.new) memh(Rs+Ru<<#u2)=Nt.new
3252 let mayStore = 1, AddedComplexity = 10,
3254 def STrih_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3255 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3257 "if (!$src1.new) memh($src2+$src3<<#$src4) = $src5.new",
3261 // if ([!]Pv[]) memh(Rx++#s4:1)=Nt.new
3262 // if (Pv) memh(Rx++#s4:1)=Nt.new
3263 let mayStore = 1, hasCtrlDep = 1,
3265 def POST_SThri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3266 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3267 "if ($src1) memh($src3++#$offset) = $src2.new",
3271 // if (Pv.new) memh(Rx++#s4:1)=Nt.new
3272 let mayStore = 1, hasCtrlDep = 1,
3274 def POST_SThri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3275 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3276 "if ($src1.new) memh($src3++#$offset) = $src2.new",
3280 // if (!Pv) memh(Rx++#s4:1)=Nt.new
3281 let mayStore = 1, hasCtrlDep = 1,
3283 def POST_SThri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3284 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3285 "if (!$src1) memh($src3++#$offset) = $src2.new",
3289 // if (!Pv.new) memh(Rx++#s4:1)=Nt.new
3290 let mayStore = 1, hasCtrlDep = 1,
3292 def POST_SThri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3293 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3294 "if (!$src1.new) memh($src3++#$offset) = $src2.new",
3299 // Store new-value word.
3301 // memw(Re=#U6)=Nt.new
3302 // memw(Rs+#s11:2)=Nt.new
3303 let mayStore = 1, isPredicable = 1 in
3304 def STriw_nv_V4 : NVInst_V4<(outs),
3305 (ins MEMri:$addr, IntRegs:$src1),
3306 "memw($addr) = $src1.new",
3310 let mayStore = 1, isPredicable = 1 in
3311 def STriw_indexed_nv_V4 : NVInst_V4<(outs),
3312 (ins IntRegs:$src1, s11_2Imm:$src2, IntRegs:$src3),
3313 "memw($src1+#$src2) = $src3.new",
3317 // memw(Rs+Ru<<#u2)=Nt.new
3318 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in
3319 def STriw_indexed_shl_nv_V4 : NVInst_V4<(outs),
3320 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
3321 "memw($src1+$src2<<#$src3) = $src4.new",
3325 // memw(Ru<<#u2+#U6)=Nt.new
3326 let mayStore = 1, AddedComplexity = 10 in
3327 def STriw_shl_nv_V4 : NVInst_V4<(outs),
3328 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
3329 "memw($src1<<#$src2+#$src3) = $src4.new",
3333 // memw(Rx++#s4:2)=Nt.new
3334 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in
3335 def POST_STwri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3336 (ins IntRegs:$src1, IntRegs:$src2, s4_2Imm:$offset),
3337 "memw($src2++#$offset) = $src1.new",
3342 // memw(Rx++#s4:2:circ(Mu))=Nt.new
3343 // memw(Rx++I:circ(Mu))=Nt.new
3344 // memw(Rx++Mu)=Nt.new
3345 // memw(Rx++Mu:brev)=Nt.new
3346 // memw(gp+#u16:2)=Nt.new
3347 let mayStore = 1, neverHasSideEffects = 1 in
3348 def STriw_GP_nv_V4 : NVInst_V4<(outs),
3349 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
3350 "memw(#$global+$offset) = $src.new",
3354 let mayStore = 1, neverHasSideEffects = 1 in
3355 def STw_GP_nv_V4 : NVInst_V4<(outs),
3356 (ins globaladdress:$global, IntRegs:$src),
3357 "memw(#$global) = $src.new",
3361 // Store new-value word conditionally.
3363 // if ([!]Pv[.new]) memw(#u6)=Nt.new
3365 // if ([!]Pv[.new]) memw(Rs+#u6:2)=Nt.new
3366 // if (Pv) memw(Rs+#u6:2)=Nt.new
3367 let mayStore = 1, neverHasSideEffects = 1,
3369 def STriw_cPt_nv_V4 : NVInst_V4<(outs),
3370 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3371 "if ($src1) memw($addr) = $src2.new",
3375 // if (Pv.new) memw(Rs+#u6:2)=Nt.new
3376 let mayStore = 1, neverHasSideEffects = 1,
3378 def STriw_cdnPt_nv_V4 : NVInst_V4<(outs),
3379 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3380 "if ($src1.new) memw($addr) = $src2.new",
3384 // if (!Pv) memw(Rs+#u6:2)=Nt.new
3385 let mayStore = 1, neverHasSideEffects = 1,
3387 def STriw_cNotPt_nv_V4 : NVInst_V4<(outs),
3388 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3389 "if (!$src1) memw($addr) = $src2.new",
3393 // if (!Pv.new) memw(Rs+#u6:2)=Nt.new
3394 let mayStore = 1, neverHasSideEffects = 1,
3396 def STriw_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3397 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3398 "if (!$src1.new) memw($addr) = $src2.new",
3402 // if (Pv) memw(Rs+#u6:2)=Nt.new
3403 let mayStore = 1, neverHasSideEffects = 1,
3405 def STriw_indexed_cPt_nv_V4 : NVInst_V4<(outs),
3406 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3407 "if ($src1) memw($src2+#$src3) = $src4.new",
3411 // if (Pv.new) memw(Rs+#u6:2)=Nt.new
3412 let mayStore = 1, neverHasSideEffects = 1,
3414 def STriw_indexed_cdnPt_nv_V4 : NVInst_V4<(outs),
3415 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3416 "if ($src1.new) memw($src2+#$src3) = $src4.new",
3420 // if (!Pv) memw(Rs+#u6:2)=Nt.new
3421 let mayStore = 1, neverHasSideEffects = 1,
3423 def STriw_indexed_cNotPt_nv_V4 : NVInst_V4<(outs),
3424 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3425 "if (!$src1) memw($src2+#$src3) = $src4.new",
3429 // if (!Pv.new) memw(Rs+#u6:2)=Nt.new
3430 let mayStore = 1, neverHasSideEffects = 1,
3432 def STriw_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3433 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3434 "if (!$src1.new) memw($src2+#$src3) = $src4.new",
3439 // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Nt.new
3440 // if (Pv) memw(Rs+Ru<<#u2)=Nt.new
3441 let mayStore = 1, AddedComplexity = 10,
3443 def STriw_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs),
3444 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3446 "if ($src1) memw($src2+$src3<<#$src4) = $src5.new",
3450 // if (Pv.new) memw(Rs+Ru<<#u2)=Nt.new
3451 let mayStore = 1, AddedComplexity = 10,
3453 def STriw_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs),
3454 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3456 "if ($src1.new) memw($src2+$src3<<#$src4) = $src5.new",
3460 // if (!Pv) memw(Rs+Ru<<#u2)=Nt.new
3461 let mayStore = 1, AddedComplexity = 10,
3463 def STriw_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs),
3464 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3466 "if (!$src1) memw($src2+$src3<<#$src4) = $src5.new",
3470 // if (!Pv.new) memw(Rs+Ru<<#u2)=Nt.new
3471 let mayStore = 1, AddedComplexity = 10,
3473 def STriw_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3474 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3476 "if (!$src1.new) memw($src2+$src3<<#$src4) = $src5.new",
3480 // if ([!]Pv[.new]) memw(Rx++#s4:2)=Nt.new
3481 // if (Pv) memw(Rx++#s4:2)=Nt.new
3482 let mayStore = 1, hasCtrlDep = 1,
3484 def POST_STwri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3485 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3486 "if ($src1) memw($src3++#$offset) = $src2.new",
3490 // if (Pv.new) memw(Rx++#s4:2)=Nt.new
3491 let mayStore = 1, hasCtrlDep = 1,
3493 def POST_STwri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3494 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3495 "if ($src1.new) memw($src3++#$offset) = $src2.new",
3499 // if (!Pv) memw(Rx++#s4:2)=Nt.new
3500 let mayStore = 1, hasCtrlDep = 1,
3502 def POST_STwri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3503 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3504 "if (!$src1) memw($src3++#$offset) = $src2.new",
3508 // if (!Pv.new) memw(Rx++#s4:2)=Nt.new
3509 let mayStore = 1, hasCtrlDep = 1,
3511 def POST_STwri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3512 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3513 "if (!$src1.new) memw($src3++#$offset) = $src2.new",
3519 // if (Pv) memb(##global) = Rt
3520 let mayStore = 1, neverHasSideEffects = 1 in
3521 def STb_GP_cPt_nv_V4 : NVInst_V4<(outs),
3522 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3523 "if ($src1) memb(##$global) = $src2.new",
3527 // if (!Pv) memb(##global) = Rt
3528 let mayStore = 1, neverHasSideEffects = 1 in
3529 def STb_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3530 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3531 "if (!$src1) memb(##$global) = $src2.new",
3535 // if (Pv) memb(##global) = Rt
3536 let mayStore = 1, neverHasSideEffects = 1 in
3537 def STb_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3538 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3539 "if ($src1.new) memb(##$global) = $src2.new",
3543 // if (!Pv) memb(##global) = Rt
3544 let mayStore = 1, neverHasSideEffects = 1 in
3545 def STb_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3546 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3547 "if (!$src1.new) memb(##$global) = $src2.new",
3551 // if (Pv) memh(##global) = Rt
3552 let mayStore = 1, neverHasSideEffects = 1 in
3553 def STh_GP_cPt_nv_V4 : NVInst_V4<(outs),
3554 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3555 "if ($src1) memh(##$global) = $src2.new",
3559 // if (!Pv) memh(##global) = Rt
3560 let mayStore = 1, neverHasSideEffects = 1 in
3561 def STh_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3562 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3563 "if (!$src1) memh(##$global) = $src2.new",
3567 // if (Pv) memh(##global) = Rt
3568 let mayStore = 1, neverHasSideEffects = 1 in
3569 def STh_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3570 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3571 "if ($src1.new) memh(##$global) = $src2.new",
3575 // if (!Pv) memh(##global) = Rt
3576 let mayStore = 1, neverHasSideEffects = 1 in
3577 def STh_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3578 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3579 "if (!$src1.new) memh(##$global) = $src2.new",
3583 // if (Pv) memw(##global) = Rt
3584 let mayStore = 1, neverHasSideEffects = 1 in
3585 def STw_GP_cPt_nv_V4 : NVInst_V4<(outs),
3586 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3587 "if ($src1) memw(##$global) = $src2.new",
3591 // if (!Pv) memw(##global) = Rt
3592 let mayStore = 1, neverHasSideEffects = 1 in
3593 def STw_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3594 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3595 "if (!$src1) memw(##$global) = $src2.new",
3599 // if (Pv) memw(##global) = Rt
3600 let mayStore = 1, neverHasSideEffects = 1 in
3601 def STw_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3602 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3603 "if ($src1.new) memw(##$global) = $src2.new",
3607 // if (!Pv) memw(##global) = Rt
3608 let mayStore = 1, neverHasSideEffects = 1 in
3609 def STw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3610 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3611 "if (!$src1.new) memw(##$global) = $src2.new",
3615 let mayStore = 1, neverHasSideEffects = 1 in
3616 def STrib_GP_cPt_nv_V4 : NVInst_V4<(outs),
3617 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3619 "if ($src1) memb(##$global+$offset) = $src2.new",
3623 let mayStore = 1, neverHasSideEffects = 1 in
3624 def STrib_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3625 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3627 "if (!$src1) memb(##$global+$offset) = $src2.new",
3631 let mayStore = 1, neverHasSideEffects = 1 in
3632 def STrib_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3633 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3635 "if ($src1.new) memb(##$global+$offset) = $src2.new",
3639 let mayStore = 1, neverHasSideEffects = 1 in
3640 def STrib_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3641 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3643 "if (!$src1.new) memb(##$global+$offset) = $src2.new",
3647 let mayStore = 1, neverHasSideEffects = 1 in
3648 def STrih_GP_cPt_nv_V4 : NVInst_V4<(outs),
3649 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3651 "if ($src1) memh(##$global+$offset) = $src2.new",
3655 let mayStore = 1, neverHasSideEffects = 1 in
3656 def STrih_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3657 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3659 "if (!$src1) memh(##$global+$offset) = $src2.new",
3663 let mayStore = 1, neverHasSideEffects = 1 in
3664 def STrih_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3665 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3667 "if ($src1.new) memh(##$global+$offset) = $src2.new",
3671 let mayStore = 1, neverHasSideEffects = 1 in
3672 def STrih_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3673 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3675 "if (!$src1.new) memh(##$global+$offset) = $src2.new",
3679 let mayStore = 1, neverHasSideEffects = 1 in
3680 def STriw_GP_cPt_nv_V4 : NVInst_V4<(outs),
3681 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3683 "if ($src1) memw(##$global+$offset) = $src2.new",
3687 let mayStore = 1, neverHasSideEffects = 1 in
3688 def STriw_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3689 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3691 "if (!$src1) memw(##$global+$offset) = $src2.new",
3695 let mayStore = 1, neverHasSideEffects = 1 in
3696 def STriw_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3697 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3699 "if ($src1.new) memw(##$global+$offset) = $src2.new",
3703 let mayStore = 1, neverHasSideEffects = 1 in
3704 def STriw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3705 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3707 "if (!$src1.new) memw(##$global+$offset) = $src2.new",
3711 //===----------------------------------------------------------------------===//
3713 //===----------------------------------------------------------------------===//
3715 //===----------------------------------------------------------------------===//
3717 //===----------------------------------------------------------------------===//
3719 multiclass NVJ_type_basic_reg<string NotStr, string OpcStr, string TakenStr> {
3720 def _ie_nv_V4 : NVInst_V4<(outs),
3721 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3722 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3723 !strconcat("($src1.new, $src2)) jump:",
3724 !strconcat(TakenStr, " $offset"))))),
3728 def _nv_V4 : NVInst_V4<(outs),
3729 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3730 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3731 !strconcat("($src1.new, $src2)) jump:",
3732 !strconcat(TakenStr, " $offset"))))),
3737 multiclass NVJ_type_basic_2ndDotNew<string NotStr, string OpcStr,
3739 def _ie_nv_V4 : NVInst_V4<(outs),
3740 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3741 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3742 !strconcat("($src1, $src2.new)) jump:",
3743 !strconcat(TakenStr, " $offset"))))),
3747 def _nv_V4 : NVInst_V4<(outs),
3748 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3749 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3750 !strconcat("($src1, $src2.new)) jump:",
3751 !strconcat(TakenStr, " $offset"))))),
3756 multiclass NVJ_type_basic_imm<string NotStr, string OpcStr, string TakenStr> {
3757 def _ie_nv_V4 : NVInst_V4<(outs),
3758 (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset),
3759 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3760 !strconcat("($src1.new, #$src2)) jump:",
3761 !strconcat(TakenStr, " $offset"))))),
3765 def _nv_V4 : NVInst_V4<(outs),
3766 (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset),
3767 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3768 !strconcat("($src1.new, #$src2)) jump:",
3769 !strconcat(TakenStr, " $offset"))))),
3774 multiclass NVJ_type_basic_neg<string NotStr, string OpcStr, string TakenStr> {
3775 def _ie_nv_V4 : NVInst_V4<(outs),
3776 (ins IntRegs:$src1, nOneImm:$src2, brtarget:$offset),
3777 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3778 !strconcat("($src1.new, #$src2)) jump:",
3779 !strconcat(TakenStr, " $offset"))))),
3783 def _nv_V4 : NVInst_V4<(outs),
3784 (ins IntRegs:$src1, nOneImm:$src2, brtarget:$offset),
3785 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3786 !strconcat("($src1.new, #$src2)) jump:",
3787 !strconcat(TakenStr, " $offset"))))),
3792 multiclass NVJ_type_basic_tstbit<string NotStr, string OpcStr,
3794 def _ie_nv_V4 : NVInst_V4<(outs),
3795 (ins IntRegs:$src1, u1Imm:$src2, brtarget:$offset),
3796 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3797 !strconcat("($src1.new, #$src2)) jump:",
3798 !strconcat(TakenStr, " $offset"))))),
3802 def _nv_V4 : NVInst_V4<(outs),
3803 (ins IntRegs:$src1, u1Imm:$src2, brtarget:$offset),
3804 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3805 !strconcat("($src1.new, #$src2)) jump:",
3806 !strconcat(TakenStr, " $offset"))))),
3811 // Multiclass for regular dot new of Ist operand register.
3812 multiclass NVJ_type_br_pred_reg<string NotStr, string OpcStr> {
3813 defm Pt : NVJ_type_basic_reg<NotStr, OpcStr, "t">;
3814 defm Pnt : NVJ_type_basic_reg<NotStr, OpcStr, "nt">;
3817 // Multiclass for dot new of 2nd operand register.
3818 multiclass NVJ_type_br_pred_2ndDotNew<string NotStr, string OpcStr> {
3819 defm Pt : NVJ_type_basic_2ndDotNew<NotStr, OpcStr, "t">;
3820 defm Pnt : NVJ_type_basic_2ndDotNew<NotStr, OpcStr, "nt">;
3823 // Multiclass for 2nd operand immediate, including -1.
3824 multiclass NVJ_type_br_pred_imm<string NotStr, string OpcStr> {
3825 defm Pt : NVJ_type_basic_imm<NotStr, OpcStr, "t">;
3826 defm Pnt : NVJ_type_basic_imm<NotStr, OpcStr, "nt">;
3827 defm Ptneg : NVJ_type_basic_neg<NotStr, OpcStr, "t">;
3828 defm Pntneg : NVJ_type_basic_neg<NotStr, OpcStr, "nt">;
3831 // Multiclass for 2nd operand immediate, excluding -1.
3832 multiclass NVJ_type_br_pred_imm_only<string NotStr, string OpcStr> {
3833 defm Pt : NVJ_type_basic_imm<NotStr, OpcStr, "t">;
3834 defm Pnt : NVJ_type_basic_imm<NotStr, OpcStr, "nt">;
3837 // Multiclass for tstbit, where 2nd operand is always #0.
3838 multiclass NVJ_type_br_pred_tstbit<string NotStr, string OpcStr> {
3839 defm Pt : NVJ_type_basic_tstbit<NotStr, OpcStr, "t">;
3840 defm Pnt : NVJ_type_basic_tstbit<NotStr, OpcStr, "nt">;
3843 // Multiclass for GT.
3844 multiclass NVJ_type_rr_ri<string OpcStr> {
3845 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>;
3846 defm rr : NVJ_type_br_pred_reg<"", OpcStr>;
3847 defm rrdnNot : NVJ_type_br_pred_2ndDotNew<"!", OpcStr>;
3848 defm rrdn : NVJ_type_br_pred_2ndDotNew<"", OpcStr>;
3849 defm riNot : NVJ_type_br_pred_imm<"!", OpcStr>;
3850 defm ri : NVJ_type_br_pred_imm<"", OpcStr>;
3853 // Multiclass for EQ.
3854 multiclass NVJ_type_rr_ri_no_2ndDotNew<string OpcStr> {
3855 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>;
3856 defm rr : NVJ_type_br_pred_reg<"", OpcStr>;
3857 defm riNot : NVJ_type_br_pred_imm<"!", OpcStr>;
3858 defm ri : NVJ_type_br_pred_imm<"", OpcStr>;
3861 // Multiclass for GTU.
3862 multiclass NVJ_type_rr_ri_no_nOne<string OpcStr> {
3863 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>;
3864 defm rr : NVJ_type_br_pred_reg<"", OpcStr>;
3865 defm rrdnNot : NVJ_type_br_pred_2ndDotNew<"!", OpcStr>;
3866 defm rrdn : NVJ_type_br_pred_2ndDotNew<"", OpcStr>;
3867 defm riNot : NVJ_type_br_pred_imm_only<"!", OpcStr>;
3868 defm ri : NVJ_type_br_pred_imm_only<"", OpcStr>;
3871 // Multiclass for tstbit.
3872 multiclass NVJ_type_r0<string OpcStr> {
3873 defm r0Not : NVJ_type_br_pred_tstbit<"!", OpcStr>;
3874 defm r0 : NVJ_type_br_pred_tstbit<"", OpcStr>;
3877 // Base Multiclass for New Value Jump.
3878 multiclass NVJ_type {
3879 defm GT : NVJ_type_rr_ri<"cmp.gt">;
3880 defm EQ : NVJ_type_rr_ri_no_2ndDotNew<"cmp.eq">;
3881 defm GTU : NVJ_type_rr_ri_no_nOne<"cmp.gtu">;
3882 defm TSTBIT : NVJ_type_r0<"tstbit">;
3885 let isBranch = 1, isTerminator=1, neverHasSideEffects = 1, Defs = [PC] in {
3886 defm JMP_ : NVJ_type;
3889 //===----------------------------------------------------------------------===//
3891 //===----------------------------------------------------------------------===//
3893 //===----------------------------------------------------------------------===//
3895 //===----------------------------------------------------------------------===//
3897 // Add and accumulate.
3898 // Rd=add(Rs,add(Ru,#s6))
3899 def ADDr_ADDri_V4 : MInst<(outs IntRegs:$dst),
3900 (ins IntRegs:$src1, IntRegs:$src2, s6Imm:$src3),
3901 "$dst = add($src1, add($src2, #$src3))",
3902 [(set (i32 IntRegs:$dst),
3903 (add (i32 IntRegs:$src1), (add (i32 IntRegs:$src2),
3904 s6ImmPred:$src3)))]>,
3907 // Rd=add(Rs,sub(#s6,Ru))
3908 def ADDr_SUBri_V4 : MInst<(outs IntRegs:$dst),
3909 (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3),
3910 "$dst = add($src1, sub(#$src2, $src3))",
3911 [(set (i32 IntRegs:$dst),
3912 (add (i32 IntRegs:$src1), (sub s6ImmPred:$src2,
3913 (i32 IntRegs:$src3))))]>,
3916 // Generates the same instruction as ADDr_SUBri_V4 but matches different
3918 // Rd=add(Rs,sub(#s6,Ru))
3919 def ADDri_SUBr_V4 : MInst<(outs IntRegs:$dst),
3920 (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3),
3921 "$dst = add($src1, sub(#$src2, $src3))",
3922 [(set (i32 IntRegs:$dst),
3923 (sub (add (i32 IntRegs:$src1), s6ImmPred:$src2),
3924 (i32 IntRegs:$src3)))]>,
3928 // Add or subtract doublewords with carry.
3930 // Rdd=add(Rss,Rtt,Px):carry
3932 // Rdd=sub(Rss,Rtt,Px):carry
3935 // Logical doublewords.
3936 // Rdd=and(Rtt,~Rss)
3937 def ANDd_NOTd_V4 : MInst<(outs DoubleRegs:$dst),
3938 (ins DoubleRegs:$src1, DoubleRegs:$src2),
3939 "$dst = and($src1, ~$src2)",
3940 [(set (i64 DoubleRegs:$dst), (and (i64 DoubleRegs:$src1),
3941 (not (i64 DoubleRegs:$src2))))]>,
3945 def ORd_NOTd_V4 : MInst<(outs DoubleRegs:$dst),
3946 (ins DoubleRegs:$src1, DoubleRegs:$src2),
3947 "$dst = or($src1, ~$src2)",
3948 [(set (i64 DoubleRegs:$dst),
3949 (or (i64 DoubleRegs:$src1), (not (i64 DoubleRegs:$src2))))]>,
3953 // Logical-logical doublewords.
3954 // Rxx^=xor(Rss,Rtt)
3955 def XORd_XORdd: MInst_acc<(outs DoubleRegs:$dst),
3956 (ins DoubleRegs:$src1, DoubleRegs:$src2, DoubleRegs:$src3),
3957 "$dst ^= xor($src2, $src3)",
3958 [(set (i64 DoubleRegs:$dst),
3959 (xor (i64 DoubleRegs:$src1), (xor (i64 DoubleRegs:$src2),
3960 (i64 DoubleRegs:$src3))))],
3965 // Logical-logical words.
3966 // Rx=or(Ru,and(Rx,#s10))
3967 def ORr_ANDri_V4 : MInst_acc<(outs IntRegs:$dst),
3968 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3),
3969 "$dst = or($src1, and($src2, #$src3))",
3970 [(set (i32 IntRegs:$dst),
3971 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3972 s10ImmPred:$src3)))],
3976 // Rx[&|^]=and(Rs,Rt)
3978 def ANDr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst),
3979 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3980 "$dst &= and($src2, $src3)",
3981 [(set (i32 IntRegs:$dst),
3982 (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3983 (i32 IntRegs:$src3))))],
3988 def ORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst),
3989 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3990 "$dst |= and($src2, $src3)",
3991 [(set (i32 IntRegs:$dst),
3992 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3993 (i32 IntRegs:$src3))))],
3998 def XORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst),
3999 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4000 "$dst ^= and($src2, $src3)",
4001 [(set (i32 IntRegs:$dst),
4002 (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
4003 (i32 IntRegs:$src3))))],
4007 // Rx[&|^]=and(Rs,~Rt)
4009 def ANDr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst),
4010 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4011 "$dst &= and($src2, ~$src3)",
4012 [(set (i32 IntRegs:$dst),
4013 (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
4014 (not (i32 IntRegs:$src3)))))],
4019 def ORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst),
4020 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4021 "$dst |= and($src2, ~$src3)",
4022 [(set (i32 IntRegs:$dst),
4023 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
4024 (not (i32 IntRegs:$src3)))))],
4029 def XORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst),
4030 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4031 "$dst ^= and($src2, ~$src3)",
4032 [(set (i32 IntRegs:$dst),
4033 (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
4034 (not (i32 IntRegs:$src3)))))],
4038 // Rx[&|^]=or(Rs,Rt)
4040 def ANDr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst),
4041 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4042 "$dst &= or($src2, $src3)",
4043 [(set (i32 IntRegs:$dst),
4044 (and (i32 IntRegs:$src1), (or (i32 IntRegs:$src2),
4045 (i32 IntRegs:$src3))))],
4050 def ORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst),
4051 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4052 "$dst |= or($src2, $src3)",
4053 [(set (i32 IntRegs:$dst),
4054 (or (i32 IntRegs:$src1), (or (i32 IntRegs:$src2),
4055 (i32 IntRegs:$src3))))],
4060 def XORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst),
4061 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4062 "$dst ^= or($src2, $src3)",
4063 [(set (i32 IntRegs:$dst),
4064 (xor (i32 IntRegs:$src1), (or (i32 IntRegs:$src2),
4065 (i32 IntRegs:$src3))))],
4069 // Rx[&|^]=xor(Rs,Rt)
4071 def ANDr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst),
4072 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4073 "$dst &= xor($src2, $src3)",
4074 [(set (i32 IntRegs:$dst),
4075 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2),
4076 (i32 IntRegs:$src3))))],
4081 def ORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst),
4082 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4083 "$dst |= xor($src2, $src3)",
4084 [(set (i32 IntRegs:$dst),
4085 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2),
4086 (i32 IntRegs:$src3))))],
4091 def XORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst),
4092 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
4093 "$dst ^= xor($src2, $src3)",
4094 [(set (i32 IntRegs:$dst),
4095 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2),
4096 (i32 IntRegs:$src3))))],
4101 def ORr_ANDri2_V4 : MInst_acc<(outs IntRegs:$dst),
4102 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3),
4103 "$dst |= and($src2, #$src3)",
4104 [(set (i32 IntRegs:$dst),
4105 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
4106 s10ImmPred:$src3)))],
4111 def ORr_ORri_V4 : MInst_acc<(outs IntRegs:$dst),
4112 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3),
4113 "$dst |= or($src2, #$src3)",
4114 [(set (i32 IntRegs:$dst),
4115 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
4116 s10ImmPred:$src3)))],
4122 // Rd=modwrap(Rs,Rt)
4124 // Rd=cround(Rs,#u5)
4126 // Rd=round(Rs,#u5)[:sat]
4127 // Rd=round(Rs,Rt)[:sat]
4128 // Vector reduce add unsigned halfwords
4129 // Rd=vraddh(Rss,Rtt)
4131 // Rdd=vaddb(Rss,Rtt)
4132 // Vector conditional negate
4133 // Rdd=vcnegh(Rss,Rt)
4134 // Rxx+=vrcnegh(Rss,Rt)
4135 // Vector maximum bytes
4136 // Rdd=vmaxb(Rtt,Rss)
4137 // Vector reduce maximum halfwords
4138 // Rxx=vrmaxh(Rss,Ru)
4139 // Rxx=vrmaxuh(Rss,Ru)
4140 // Vector reduce maximum words
4141 // Rxx=vrmaxuw(Rss,Ru)
4142 // Rxx=vrmaxw(Rss,Ru)
4143 // Vector minimum bytes
4144 // Rdd=vminb(Rtt,Rss)
4145 // Vector reduce minimum halfwords
4146 // Rxx=vrminh(Rss,Ru)
4147 // Rxx=vrminuh(Rss,Ru)
4148 // Vector reduce minimum words
4149 // Rxx=vrminuw(Rss,Ru)
4150 // Rxx=vrminw(Rss,Ru)
4151 // Vector subtract bytes
4152 // Rdd=vsubb(Rss,Rtt)
4154 //===----------------------------------------------------------------------===//
4156 //===----------------------------------------------------------------------===//
4159 //===----------------------------------------------------------------------===//
4161 //===----------------------------------------------------------------------===//
4163 // Multiply and user lower result.
4164 // Rd=add(#u6,mpyi(Rs,#U6))
4165 def ADDi_MPYri_V4 : MInst<(outs IntRegs:$dst),
4166 (ins u6Imm:$src1, IntRegs:$src2, u6Imm:$src3),
4167 "$dst = add(#$src1, mpyi($src2, #$src3))",
4168 [(set (i32 IntRegs:$dst),
4169 (add (mul (i32 IntRegs:$src2), u6ImmPred:$src3),
4170 u6ImmPred:$src1))]>,
4173 // Rd=add(#u6,mpyi(Rs,Rt))
4175 def ADDi_MPYrr_V4 : MInst<(outs IntRegs:$dst),
4176 (ins u6Imm:$src1, IntRegs:$src2, IntRegs:$src3),
4177 "$dst = add(#$src1, mpyi($src2, $src3))",
4178 [(set (i32 IntRegs:$dst),
4179 (add (mul (i32 IntRegs:$src2), (i32 IntRegs:$src3)),
4180 u6ImmPred:$src1))]>,
4183 // Rd=add(Ru,mpyi(#u6:2,Rs))
4184 def ADDr_MPYir_V4 : MInst<(outs IntRegs:$dst),
4185 (ins IntRegs:$src1, u6Imm:$src2, IntRegs:$src3),
4186 "$dst = add($src1, mpyi(#$src2, $src3))",
4187 [(set (i32 IntRegs:$dst),
4188 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src3),
4189 u6_2ImmPred:$src2)))]>,
4192 // Rd=add(Ru,mpyi(Rs,#u6))
4193 def ADDr_MPYri_V4 : MInst<(outs IntRegs:$dst),
4194 (ins IntRegs:$src1, IntRegs:$src2, u6Imm:$src3),
4195 "$dst = add($src1, mpyi($src2, #$src3))",
4196 [(set (i32 IntRegs:$dst),
4197 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2),
4198 u6ImmPred:$src3)))]>,
4201 // Rx=add(Ru,mpyi(Rx,Rs))
4202 def ADDr_MPYrr_V4 : MInst_acc<(outs IntRegs:$dst),
4203 (ins IntRegs:$src1, IntRegs:$src2, IntRegs:$src3),
4204 "$dst = add($src1, mpyi($src2, $src3))",
4205 [(set (i32 IntRegs:$dst),
4206 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2),
4207 (i32 IntRegs:$src3))))],
4212 // Polynomial multiply words
4214 // Rxx^=pmpyw(Rs,Rt)
4216 // Vector reduce multiply word by signed half (32x16)
4217 // Rdd=vrmpyweh(Rss,Rtt)[:<<1]
4218 // Rdd=vrmpywoh(Rss,Rtt)[:<<1]
4219 // Rxx+=vrmpyweh(Rss,Rtt)[:<<1]
4220 // Rxx+=vrmpywoh(Rss,Rtt)[:<<1]
4222 // Multiply and use upper result
4223 // Rd=mpy(Rs,Rt.H):<<1:sat
4224 // Rd=mpy(Rs,Rt.L):<<1:sat
4225 // Rd=mpy(Rs,Rt):<<1
4226 // Rd=mpy(Rs,Rt):<<1:sat
4228 // Rx+=mpy(Rs,Rt):<<1:sat
4229 // Rx-=mpy(Rs,Rt):<<1:sat
4231 // Vector multiply bytes
4232 // Rdd=vmpybsu(Rs,Rt)
4233 // Rdd=vmpybu(Rs,Rt)
4234 // Rxx+=vmpybsu(Rs,Rt)
4235 // Rxx+=vmpybu(Rs,Rt)
4237 // Vector polynomial multiply halfwords
4238 // Rdd=vpmpyh(Rs,Rt)
4239 // Rxx^=vpmpyh(Rs,Rt)
4241 //===----------------------------------------------------------------------===//
4243 //===----------------------------------------------------------------------===//
4246 //===----------------------------------------------------------------------===//
4248 //===----------------------------------------------------------------------===//
4250 // Shift by immediate and accumulate.
4251 // Rx=add(#u8,asl(Rx,#U5))
4252 def ADDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4253 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4254 "$dst = add(#$src1, asl($src2, #$src3))",
4255 [(set (i32 IntRegs:$dst),
4256 (add (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4261 // Rx=add(#u8,lsr(Rx,#U5))
4262 def ADDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4263 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4264 "$dst = add(#$src1, lsr($src2, #$src3))",
4265 [(set (i32 IntRegs:$dst),
4266 (add (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4271 // Rx=sub(#u8,asl(Rx,#U5))
4272 def SUBi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4273 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4274 "$dst = sub(#$src1, asl($src2, #$src3))",
4275 [(set (i32 IntRegs:$dst),
4276 (sub (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4281 // Rx=sub(#u8,lsr(Rx,#U5))
4282 def SUBi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4283 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4284 "$dst = sub(#$src1, lsr($src2, #$src3))",
4285 [(set (i32 IntRegs:$dst),
4286 (sub (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4292 //Shift by immediate and logical.
4293 //Rx=and(#u8,asl(Rx,#U5))
4294 def ANDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4295 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4296 "$dst = and(#$src1, asl($src2, #$src3))",
4297 [(set (i32 IntRegs:$dst),
4298 (and (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4303 //Rx=and(#u8,lsr(Rx,#U5))
4304 def ANDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4305 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4306 "$dst = and(#$src1, lsr($src2, #$src3))",
4307 [(set (i32 IntRegs:$dst),
4308 (and (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4313 //Rx=or(#u8,asl(Rx,#U5))
4314 let AddedComplexity = 30 in
4315 def ORi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4316 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4317 "$dst = or(#$src1, asl($src2, #$src3))",
4318 [(set (i32 IntRegs:$dst),
4319 (or (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4324 //Rx=or(#u8,lsr(Rx,#U5))
4325 let AddedComplexity = 30 in
4326 def ORi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4327 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4328 "$dst = or(#$src1, lsr($src2, #$src3))",
4329 [(set (i32 IntRegs:$dst),
4330 (or (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4336 //Shift by register.
4338 def LSLi_V4 : MInst<(outs IntRegs:$dst), (ins s6Imm:$src1, IntRegs:$src2),
4339 "$dst = lsl(#$src1, $src2)",
4340 [(set (i32 IntRegs:$dst), (shl s6ImmPred:$src1,
4341 (i32 IntRegs:$src2)))]>,
4345 //Shift by register and logical.
4347 def ASLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4348 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4349 "$dst ^= asl($src2, $src3)",
4350 [(set (i64 DoubleRegs:$dst),
4351 (xor (i64 DoubleRegs:$src1), (shl (i64 DoubleRegs:$src2),
4352 (i32 IntRegs:$src3))))],
4357 def ASRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4358 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4359 "$dst ^= asr($src2, $src3)",
4360 [(set (i64 DoubleRegs:$dst),
4361 (xor (i64 DoubleRegs:$src1), (sra (i64 DoubleRegs:$src2),
4362 (i32 IntRegs:$src3))))],
4367 def LSLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4368 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4369 "$dst ^= lsl($src2, $src3)",
4370 [(set (i64 DoubleRegs:$dst), (xor (i64 DoubleRegs:$src1),
4371 (shl (i64 DoubleRegs:$src2),
4372 (i32 IntRegs:$src3))))],
4377 def LSRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4378 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4379 "$dst ^= lsr($src2, $src3)",
4380 [(set (i64 DoubleRegs:$dst),
4381 (xor (i64 DoubleRegs:$src1), (srl (i64 DoubleRegs:$src2),
4382 (i32 IntRegs:$src3))))],
4387 //===----------------------------------------------------------------------===//
4389 //===----------------------------------------------------------------------===//
4391 //===----------------------------------------------------------------------===//
4392 // MEMOP: Word, Half, Byte
4393 //===----------------------------------------------------------------------===//
4395 //===----------------------------------------------------------------------===//
4399 // MEMw_ADDi_indexed_V4 : memw(Rs+#u6:2)+=#U5
4400 // MEMw_SUBi_indexed_V4 : memw(Rs+#u6:2)-=#U5
4401 // MEMw_ADDr_indexed_V4 : memw(Rs+#u6:2)+=Rt
4402 // MEMw_SUBr_indexed_V4 : memw(Rs+#u6:2)-=Rt
4403 // MEMw_CLRr_indexed_V4 : memw(Rs+#u6:2)&=Rt
4404 // MEMw_SETr_indexed_V4 : memw(Rs+#u6:2)|=Rt
4405 // MEMw_ADDi_V4 : memw(Rs+#u6:2)+=#U5
4406 // MEMw_SUBi_V4 : memw(Rs+#u6:2)-=#U5
4407 // MEMw_ADDr_V4 : memw(Rs+#u6:2)+=Rt
4408 // MEMw_SUBr_V4 : memw(Rs+#u6:2)-=Rt
4409 // MEMw_CLRr_V4 : memw(Rs+#u6:2)&=Rt
4410 // MEMw_SETr_V4 : memw(Rs+#u6:2)|=Rt
4413 // MEMw_CLRi_indexed_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4414 // MEMw_SETi_indexed_V4 : memw(Rs+#u6:2)=setbit(#U5)
4415 // MEMw_CLRi_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4416 // MEMw_SETi_V4 : memw(Rs+#u6:2)=setbit(#U5)
4417 //===----------------------------------------------------------------------===//
4421 // memw(Rs+#u6:2) += #U5
4422 let AddedComplexity = 30 in
4423 def MEMw_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs),
4424 (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$addend),
4425 "memw($base+#$offset) += #$addend",
4427 Requires<[HasV4T, UseMEMOP]>;
4429 // memw(Rs+#u6:2) -= #U5
4430 let AddedComplexity = 30 in
4431 def MEMw_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs),
4432 (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$subend),
4433 "memw($base+#$offset) -= #$subend",
4435 Requires<[HasV4T, UseMEMOP]>;
4437 // memw(Rs+#u6:2) += Rt
4438 let AddedComplexity = 30 in
4439 def MEMw_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4440 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$addend),
4441 "memw($base+#$offset) += $addend",
4442 [(store (add (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4443 (i32 IntRegs:$addend)),
4444 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4445 Requires<[HasV4T, UseMEMOP]>;
4447 // memw(Rs+#u6:2) -= Rt
4448 let AddedComplexity = 30 in
4449 def MEMw_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs),
4450 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$subend),
4451 "memw($base+#$offset) -= $subend",
4452 [(store (sub (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4453 (i32 IntRegs:$subend)),
4454 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4455 Requires<[HasV4T, UseMEMOP]>;
4457 // memw(Rs+#u6:2) &= Rt
4458 let AddedComplexity = 30 in
4459 def MEMw_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4460 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$andend),
4461 "memw($base+#$offset) &= $andend",
4462 [(store (and (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4463 (i32 IntRegs:$andend)),
4464 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4465 Requires<[HasV4T, UseMEMOP]>;
4467 // memw(Rs+#u6:2) |= Rt
4468 let AddedComplexity = 30 in
4469 def MEMw_ORr_indexed_MEM_V4 : MEMInst_V4<(outs),
4470 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$orend),
4471 "memw($base+#$offset) |= $orend",
4472 [(store (or (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4473 (i32 IntRegs:$orend)),
4474 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4475 Requires<[HasV4T, UseMEMOP]>;
4477 // memw(Rs+#u6:2) += #U5
4478 let AddedComplexity = 30 in
4479 def MEMw_ADDi_MEM_V4 : MEMInst_V4<(outs),
4480 (ins MEMri:$addr, u5Imm:$addend),
4481 "memw($addr) += $addend",
4483 Requires<[HasV4T, UseMEMOP]>;
4485 // memw(Rs+#u6:2) -= #U5
4486 let AddedComplexity = 30 in
4487 def MEMw_SUBi_MEM_V4 : MEMInst_V4<(outs),
4488 (ins MEMri:$addr, u5Imm:$subend),
4489 "memw($addr) -= $subend",
4491 Requires<[HasV4T, UseMEMOP]>;
4493 // memw(Rs+#u6:2) += Rt
4494 let AddedComplexity = 30 in
4495 def MEMw_ADDr_MEM_V4 : MEMInst_V4<(outs),
4496 (ins MEMri:$addr, IntRegs:$addend),
4497 "memw($addr) += $addend",
4498 [(store (add (load ADDRriU6_2:$addr), (i32 IntRegs:$addend)),
4499 ADDRriU6_2:$addr)]>,
4500 Requires<[HasV4T, UseMEMOP]>;
4502 // memw(Rs+#u6:2) -= Rt
4503 let AddedComplexity = 30 in
4504 def MEMw_SUBr_MEM_V4 : MEMInst_V4<(outs),
4505 (ins MEMri:$addr, IntRegs:$subend),
4506 "memw($addr) -= $subend",
4507 [(store (sub (load ADDRriU6_2:$addr), (i32 IntRegs:$subend)),
4508 ADDRriU6_2:$addr)]>,
4509 Requires<[HasV4T, UseMEMOP]>;
4511 // memw(Rs+#u6:2) &= Rt
4512 let AddedComplexity = 30 in
4513 def MEMw_ANDr_MEM_V4 : MEMInst_V4<(outs),
4514 (ins MEMri:$addr, IntRegs:$andend),
4515 "memw($addr) &= $andend",
4516 [(store (and (load ADDRriU6_2:$addr), (i32 IntRegs:$andend)),
4517 ADDRriU6_2:$addr)]>,
4518 Requires<[HasV4T, UseMEMOP]>;
4520 // memw(Rs+#u6:2) |= Rt
4521 let AddedComplexity = 30 in
4522 def MEMw_ORr_MEM_V4 : MEMInst_V4<(outs),
4523 (ins MEMri:$addr, IntRegs:$orend),
4524 "memw($addr) |= $orend",
4525 [(store (or (load ADDRriU6_2:$addr), (i32 IntRegs:$orend)),
4526 ADDRriU6_2:$addr)]>,
4527 Requires<[HasV4T, UseMEMOP]>;
4529 //===----------------------------------------------------------------------===//
4533 // MEMh_ADDi_indexed_V4 : memw(Rs+#u6:2)+=#U5
4534 // MEMh_SUBi_indexed_V4 : memw(Rs+#u6:2)-=#U5
4535 // MEMh_ADDr_indexed_V4 : memw(Rs+#u6:2)+=Rt
4536 // MEMh_SUBr_indexed_V4 : memw(Rs+#u6:2)-=Rt
4537 // MEMh_CLRr_indexed_V4 : memw(Rs+#u6:2)&=Rt
4538 // MEMh_SETr_indexed_V4 : memw(Rs+#u6:2)|=Rt
4539 // MEMh_ADDi_V4 : memw(Rs+#u6:2)+=#U5
4540 // MEMh_SUBi_V4 : memw(Rs+#u6:2)-=#U5
4541 // MEMh_ADDr_V4 : memw(Rs+#u6:2)+=Rt
4542 // MEMh_SUBr_V4 : memw(Rs+#u6:2)-=Rt
4543 // MEMh_CLRr_V4 : memw(Rs+#u6:2)&=Rt
4544 // MEMh_SETr_V4 : memw(Rs+#u6:2)|=Rt
4547 // MEMh_CLRi_indexed_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4548 // MEMh_SETi_indexed_V4 : memw(Rs+#u6:2)=setbit(#U5)
4549 // MEMh_CLRi_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4550 // MEMh_SETi_V4 : memw(Rs+#u6:2)=setbit(#U5)
4551 //===----------------------------------------------------------------------===//
4554 // memh(Rs+#u6:1) += #U5
4555 let AddedComplexity = 30 in
4556 def MEMh_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs),
4557 (ins IntRegs:$base, u6_1Imm:$offset, u5Imm:$addend),
4558 "memh($base+#$offset) += $addend",
4560 Requires<[HasV4T, UseMEMOP]>;
4562 // memh(Rs+#u6:1) -= #U5
4563 let AddedComplexity = 30 in
4564 def MEMh_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs),
4565 (ins IntRegs:$base, u6_1Imm:$offset, u5Imm:$subend),
4566 "memh($base+#$offset) -= $subend",
4568 Requires<[HasV4T, UseMEMOP]>;
4570 // memh(Rs+#u6:1) += Rt
4571 let AddedComplexity = 30 in
4572 def MEMh_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4573 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$addend),
4574 "memh($base+#$offset) += $addend",
4575 [(truncstorei16 (add (sextloadi16 (add (i32 IntRegs:$base),
4576 u6_1ImmPred:$offset)),
4577 (i32 IntRegs:$addend)),
4578 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4579 Requires<[HasV4T, UseMEMOP]>;
4581 // memh(Rs+#u6:1) -= Rt
4582 let AddedComplexity = 30 in
4583 def MEMh_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs),
4584 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$subend),
4585 "memh($base+#$offset) -= $subend",
4586 [(truncstorei16 (sub (sextloadi16 (add (i32 IntRegs:$base),
4587 u6_1ImmPred:$offset)),
4588 (i32 IntRegs:$subend)),
4589 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4590 Requires<[HasV4T, UseMEMOP]>;
4592 // memh(Rs+#u6:1) &= Rt
4593 let AddedComplexity = 30 in
4594 def MEMh_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4595 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$andend),
4596 "memh($base+#$offset) += $andend",
4597 [(truncstorei16 (and (sextloadi16 (add (i32 IntRegs:$base),
4598 u6_1ImmPred:$offset)),
4599 (i32 IntRegs:$andend)),
4600 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4601 Requires<[HasV4T, UseMEMOP]>;
4603 // memh(Rs+#u6:1) |= Rt
4604 let AddedComplexity = 30 in
4605 def MEMh_ORr_indexed_MEM_V4 : MEMInst_V4<(outs),
4606 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$orend),
4607 "memh($base+#$offset) |= $orend",
4608 [(truncstorei16 (or (sextloadi16 (add (i32 IntRegs:$base),
4609 u6_1ImmPred:$offset)),
4610 (i32 IntRegs:$orend)),
4611 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4612 Requires<[HasV4T, UseMEMOP]>;
4614 // memh(Rs+#u6:1) += #U5
4615 let AddedComplexity = 30 in
4616 def MEMh_ADDi_MEM_V4 : MEMInst_V4<(outs),
4617 (ins MEMri:$addr, u5Imm:$addend),
4618 "memh($addr) += $addend",
4620 Requires<[HasV4T, UseMEMOP]>;
4622 // memh(Rs+#u6:1) -= #U5
4623 let AddedComplexity = 30 in
4624 def MEMh_SUBi_MEM_V4 : MEMInst_V4<(outs),
4625 (ins MEMri:$addr, u5Imm:$subend),
4626 "memh($addr) -= $subend",
4628 Requires<[HasV4T, UseMEMOP]>;
4630 // memh(Rs+#u6:1) += Rt
4631 let AddedComplexity = 30 in
4632 def MEMh_ADDr_MEM_V4 : MEMInst_V4<(outs),
4633 (ins MEMri:$addr, IntRegs:$addend),
4634 "memh($addr) += $addend",
4635 [(truncstorei16 (add (sextloadi16 ADDRriU6_1:$addr),
4636 (i32 IntRegs:$addend)), ADDRriU6_1:$addr)]>,
4637 Requires<[HasV4T, UseMEMOP]>;
4639 // memh(Rs+#u6:1) -= Rt
4640 let AddedComplexity = 30 in
4641 def MEMh_SUBr_MEM_V4 : MEMInst_V4<(outs),
4642 (ins MEMri:$addr, IntRegs:$subend),
4643 "memh($addr) -= $subend",
4644 [(truncstorei16 (sub (sextloadi16 ADDRriU6_1:$addr),
4645 (i32 IntRegs:$subend)), ADDRriU6_1:$addr)]>,
4646 Requires<[HasV4T, UseMEMOP]>;
4648 // memh(Rs+#u6:1) &= Rt
4649 let AddedComplexity = 30 in
4650 def MEMh_ANDr_MEM_V4 : MEMInst_V4<(outs),
4651 (ins MEMri:$addr, IntRegs:$andend),
4652 "memh($addr) &= $andend",
4653 [(truncstorei16 (and (sextloadi16 ADDRriU6_1:$addr),
4654 (i32 IntRegs:$andend)), ADDRriU6_1:$addr)]>,
4655 Requires<[HasV4T, UseMEMOP]>;
4657 // memh(Rs+#u6:1) |= Rt
4658 let AddedComplexity = 30 in
4659 def MEMh_ORr_MEM_V4 : MEMInst_V4<(outs),
4660 (ins MEMri:$addr, IntRegs:$orend),
4661 "memh($addr) |= $orend",
4662 [(truncstorei16 (or (sextloadi16 ADDRriU6_1:$addr),
4663 (i32 IntRegs:$orend)), ADDRriU6_1:$addr)]>,
4664 Requires<[HasV4T, UseMEMOP]>;
4667 //===----------------------------------------------------------------------===//
4671 // MEMb_ADDi_indexed_V4 : memb(Rs+#u6:0)+=#U5
4672 // MEMb_SUBi_indexed_V4 : memb(Rs+#u6:0)-=#U5
4673 // MEMb_ADDr_indexed_V4 : memb(Rs+#u6:0)+=Rt
4674 // MEMb_SUBr_indexed_V4 : memb(Rs+#u6:0)-=Rt
4675 // MEMb_CLRr_indexed_V4 : memb(Rs+#u6:0)&=Rt
4676 // MEMb_SETr_indexed_V4 : memb(Rs+#u6:0)|=Rt
4677 // MEMb_ADDi_V4 : memb(Rs+#u6:0)+=#U5
4678 // MEMb_SUBi_V4 : memb(Rs+#u6:0)-=#U5
4679 // MEMb_ADDr_V4 : memb(Rs+#u6:0)+=Rt
4680 // MEMb_SUBr_V4 : memb(Rs+#u6:0)-=Rt
4681 // MEMb_CLRr_V4 : memb(Rs+#u6:0)&=Rt
4682 // MEMb_SETr_V4 : memb(Rs+#u6:0)|=Rt
4685 // MEMb_CLRi_indexed_V4 : memb(Rs+#u6:0)=clrbit(#U5)
4686 // MEMb_SETi_indexed_V4 : memb(Rs+#u6:0)=setbit(#U5)
4687 // MEMb_CLRi_V4 : memb(Rs+#u6:0)=clrbit(#U5)
4688 // MEMb_SETi_V4 : memb(Rs+#u6:0)=setbit(#U5)
4689 //===----------------------------------------------------------------------===//
4691 // memb(Rs+#u6:0) += #U5
4692 let AddedComplexity = 30 in
4693 def MEMb_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs),
4694 (ins IntRegs:$base, u6_0Imm:$offset, u5Imm:$addend),
4695 "memb($base+#$offset) += $addend",
4697 Requires<[HasV4T, UseMEMOP]>;
4699 // memb(Rs+#u6:0) -= #U5
4700 let AddedComplexity = 30 in
4701 def MEMb_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs),
4702 (ins IntRegs:$base, u6_0Imm:$offset, u5Imm:$subend),
4703 "memb($base+#$offset) -= $subend",
4705 Requires<[HasV4T, UseMEMOP]>;
4707 // memb(Rs+#u6:0) += Rt
4708 let AddedComplexity = 30 in
4709 def MEMb_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4710 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$addend),
4711 "memb($base+#$offset) += $addend",
4712 [(truncstorei8 (add (sextloadi8 (add (i32 IntRegs:$base),
4713 u6_0ImmPred:$offset)),
4714 (i32 IntRegs:$addend)),
4715 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4716 Requires<[HasV4T, UseMEMOP]>;
4718 // memb(Rs+#u6:0) -= Rt
4719 let AddedComplexity = 30 in
4720 def MEMb_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs),
4721 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$subend),
4722 "memb($base+#$offset) -= $subend",
4723 [(truncstorei8 (sub (sextloadi8 (add (i32 IntRegs:$base),
4724 u6_0ImmPred:$offset)),
4725 (i32 IntRegs:$subend)),
4726 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4727 Requires<[HasV4T, UseMEMOP]>;
4729 // memb(Rs+#u6:0) &= Rt
4730 let AddedComplexity = 30 in
4731 def MEMb_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4732 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$andend),
4733 "memb($base+#$offset) += $andend",
4734 [(truncstorei8 (and (sextloadi8 (add (i32 IntRegs:$base),
4735 u6_0ImmPred:$offset)),
4736 (i32 IntRegs:$andend)),
4737 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4738 Requires<[HasV4T, UseMEMOP]>;
4740 // memb(Rs+#u6:0) |= Rt
4741 let AddedComplexity = 30 in
4742 def MEMb_ORr_indexed_MEM_V4 : MEMInst_V4<(outs),
4743 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$orend),
4744 "memb($base+#$offset) |= $orend",
4745 [(truncstorei8 (or (sextloadi8 (add (i32 IntRegs:$base),
4746 u6_0ImmPred:$offset)),
4747 (i32 IntRegs:$orend)),
4748 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4749 Requires<[HasV4T, UseMEMOP]>;
4751 // memb(Rs+#u6:0) += #U5
4752 let AddedComplexity = 30 in
4753 def MEMb_ADDi_MEM_V4 : MEMInst_V4<(outs),
4754 (ins MEMri:$addr, u5Imm:$addend),
4755 "memb($addr) += $addend",
4757 Requires<[HasV4T, UseMEMOP]>;
4759 // memb(Rs+#u6:0) -= #U5
4760 let AddedComplexity = 30 in
4761 def MEMb_SUBi_MEM_V4 : MEMInst_V4<(outs),
4762 (ins MEMri:$addr, u5Imm:$subend),
4763 "memb($addr) -= $subend",
4765 Requires<[HasV4T, UseMEMOP]>;
4767 // memb(Rs+#u6:0) += Rt
4768 let AddedComplexity = 30 in
4769 def MEMb_ADDr_MEM_V4 : MEMInst_V4<(outs),
4770 (ins MEMri:$addr, IntRegs:$addend),
4771 "memb($addr) += $addend",
4772 [(truncstorei8 (add (sextloadi8 ADDRriU6_0:$addr),
4773 (i32 IntRegs:$addend)), ADDRriU6_0:$addr)]>,
4774 Requires<[HasV4T, UseMEMOP]>;
4776 // memb(Rs+#u6:0) -= Rt
4777 let AddedComplexity = 30 in
4778 def MEMb_SUBr_MEM_V4 : MEMInst_V4<(outs),
4779 (ins MEMri:$addr, IntRegs:$subend),
4780 "memb($addr) -= $subend",
4781 [(truncstorei8 (sub (sextloadi8 ADDRriU6_0:$addr),
4782 (i32 IntRegs:$subend)), ADDRriU6_0:$addr)]>,
4783 Requires<[HasV4T, UseMEMOP]>;
4785 // memb(Rs+#u6:0) &= Rt
4786 let AddedComplexity = 30 in
4787 def MEMb_ANDr_MEM_V4 : MEMInst_V4<(outs),
4788 (ins MEMri:$addr, IntRegs:$andend),
4789 "memb($addr) &= $andend",
4790 [(truncstorei8 (and (sextloadi8 ADDRriU6_0:$addr),
4791 (i32 IntRegs:$andend)), ADDRriU6_0:$addr)]>,
4792 Requires<[HasV4T, UseMEMOP]>;
4794 // memb(Rs+#u6:0) |= Rt
4795 let AddedComplexity = 30 in
4796 def MEMb_ORr_MEM_V4 : MEMInst_V4<(outs),
4797 (ins MEMri:$addr, IntRegs:$orend),
4798 "memb($addr) |= $orend",
4799 [(truncstorei8 (or (sextloadi8 ADDRriU6_0:$addr),
4800 (i32 IntRegs:$orend)), ADDRriU6_0:$addr)]>,
4801 Requires<[HasV4T, UseMEMOP]>;
4804 //===----------------------------------------------------------------------===//
4806 //===----------------------------------------------------------------------===//
4808 // Hexagon V4 only supports these flavors of byte/half compare instructions:
4809 // EQ/GT/GTU. Other flavors like GE/GEU/LT/LTU/LE/LEU are not supported by
4810 // hardware. However, compiler can still implement these patterns through
4811 // appropriate patterns combinations based on current implemented patterns.
4812 // The implemented patterns are: EQ/GT/GTU.
4813 // Missing patterns are: GE/GEU/LT/LTU/LE/LEU.
4815 // Following instruction is not being extended as it results into the
4816 // incorrect code for negative numbers.
4817 // Pd=cmpb.eq(Rs,#u8)
4819 let isCompare = 1 in
4820 def CMPbEQri_V4 : MInst<(outs PredRegs:$dst),
4821 (ins IntRegs:$src1, u8Imm:$src2),
4822 "$dst = cmpb.eq($src1, #$src2)",
4823 [(set (i1 PredRegs:$dst),
4824 (seteq (and (i32 IntRegs:$src1), 255), u8ImmPred:$src2))]>,
4827 // Pd=cmpb.eq(Rs,Rt)
4828 let isCompare = 1 in
4829 def CMPbEQrr_ubub_V4 : MInst<(outs PredRegs:$dst),
4830 (ins IntRegs:$src1, IntRegs:$src2),
4831 "$dst = cmpb.eq($src1, $src2)",
4832 [(set (i1 PredRegs:$dst),
4833 (seteq (and (xor (i32 IntRegs:$src1),
4834 (i32 IntRegs:$src2)), 255), 0))]>,
4837 // Pd=cmpb.eq(Rs,Rt)
4838 let isCompare = 1 in
4839 def CMPbEQrr_sbsb_V4 : MInst<(outs PredRegs:$dst),
4840 (ins IntRegs:$src1, IntRegs:$src2),
4841 "$dst = cmpb.eq($src1, $src2)",
4842 [(set (i1 PredRegs:$dst),
4843 (seteq (shl (i32 IntRegs:$src1), (i32 24)),
4844 (shl (i32 IntRegs:$src2), (i32 24))))]>,
4847 // Pd=cmpb.gt(Rs,Rt)
4848 let isCompare = 1 in
4849 def CMPbGTrr_V4 : MInst<(outs PredRegs:$dst),
4850 (ins IntRegs:$src1, IntRegs:$src2),
4851 "$dst = cmpb.gt($src1, $src2)",
4852 [(set (i1 PredRegs:$dst),
4853 (setgt (shl (i32 IntRegs:$src1), (i32 24)),
4854 (shl (i32 IntRegs:$src2), (i32 24))))]>,
4857 // Pd=cmpb.gtu(Rs,#u7)
4858 let isCompare = 1 in
4859 def CMPbGTUri_V4 : MInst<(outs PredRegs:$dst),
4860 (ins IntRegs:$src1, u7Imm:$src2),
4861 "$dst = cmpb.gtu($src1, #$src2)",
4862 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255),
4863 u7ImmPred:$src2))]>,
4866 // Pd=cmpb.gtu(Rs,Rt)
4867 let isCompare = 1 in
4868 def CMPbGTUrr_V4 : MInst<(outs PredRegs:$dst),
4869 (ins IntRegs:$src1, IntRegs:$src2),
4870 "$dst = cmpb.gtu($src1, $src2)",
4871 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255),
4872 (and (i32 IntRegs:$src2), 255)))]>,
4875 // Following instruction is not being extended as it results into the incorrect
4876 // code for negative numbers.
4878 // Signed half compare(.eq) ri.
4879 // Pd=cmph.eq(Rs,#s8)
4880 let isCompare = 1 in
4881 def CMPhEQri_V4 : MInst<(outs PredRegs:$dst),
4882 (ins IntRegs:$src1, s8Imm:$src2),
4883 "$dst = cmph.eq($src1, #$src2)",
4884 [(set (i1 PredRegs:$dst), (seteq (and (i32 IntRegs:$src1), 65535),
4885 s8ImmPred:$src2))]>,
4888 // Signed half compare(.eq) rr.
4889 // Case 1: xor + and, then compare:
4891 // r0=and(r0,#0xffff)
4893 // Pd=cmph.eq(Rs,Rt)
4894 let isCompare = 1 in
4895 def CMPhEQrr_xor_V4 : MInst<(outs PredRegs:$dst),
4896 (ins IntRegs:$src1, IntRegs:$src2),
4897 "$dst = cmph.eq($src1, $src2)",
4898 [(set (i1 PredRegs:$dst), (seteq (and (xor (i32 IntRegs:$src1),
4899 (i32 IntRegs:$src2)),
4903 // Signed half compare(.eq) rr.
4904 // Case 2: shift left 16 bits then compare:
4908 // Pd=cmph.eq(Rs,Rt)
4909 let isCompare = 1 in
4910 def CMPhEQrr_shl_V4 : MInst<(outs PredRegs:$dst),
4911 (ins IntRegs:$src1, IntRegs:$src2),
4912 "$dst = cmph.eq($src1, $src2)",
4913 [(set (i1 PredRegs:$dst),
4914 (seteq (shl (i32 IntRegs:$src1), (i32 16)),
4915 (shl (i32 IntRegs:$src2), (i32 16))))]>,
4918 /* Incorrect Pattern -- immediate should be right shifted before being
4919 used in the cmph.gt instruction.
4920 // Signed half compare(.gt) ri.
4921 // Pd=cmph.gt(Rs,#s8)
4923 let isCompare = 1 in
4924 def CMPhGTri_V4 : MInst<(outs PredRegs:$dst),
4925 (ins IntRegs:$src1, s8Imm:$src2),
4926 "$dst = cmph.gt($src1, #$src2)",
4927 [(set (i1 PredRegs:$dst),
4928 (setgt (shl (i32 IntRegs:$src1), (i32 16)),
4929 s8ImmPred:$src2))]>,
4933 // Signed half compare(.gt) rr.
4934 // Pd=cmph.gt(Rs,Rt)
4935 let isCompare = 1 in
4936 def CMPhGTrr_shl_V4 : MInst<(outs PredRegs:$dst),
4937 (ins IntRegs:$src1, IntRegs:$src2),
4938 "$dst = cmph.gt($src1, $src2)",
4939 [(set (i1 PredRegs:$dst),
4940 (setgt (shl (i32 IntRegs:$src1), (i32 16)),
4941 (shl (i32 IntRegs:$src2), (i32 16))))]>,
4944 // Unsigned half compare rr (.gtu).
4945 // Pd=cmph.gtu(Rs,Rt)
4946 let isCompare = 1 in
4947 def CMPhGTUrr_V4 : MInst<(outs PredRegs:$dst),
4948 (ins IntRegs:$src1, IntRegs:$src2),
4949 "$dst = cmph.gtu($src1, $src2)",
4950 [(set (i1 PredRegs:$dst),
4951 (setugt (and (i32 IntRegs:$src1), 65535),
4952 (and (i32 IntRegs:$src2), 65535)))]>,
4955 // Unsigned half compare ri (.gtu).
4956 // Pd=cmph.gtu(Rs,#u7)
4957 let isCompare = 1 in
4958 def CMPhGTUri_V4 : MInst<(outs PredRegs:$dst),
4959 (ins IntRegs:$src1, u7Imm:$src2),
4960 "$dst = cmph.gtu($src1, #$src2)",
4961 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 65535),
4962 u7ImmPred:$src2))]>,
4965 //===----------------------------------------------------------------------===//
4967 //===----------------------------------------------------------------------===//
4969 //Deallocate frame and return.
4971 let isReturn = 1, isTerminator = 1, isBarrier = 1, isPredicable = 1,
4972 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in {
4973 def DEALLOC_RET_V4 : NVInst_V4<(outs), (ins i32imm:$amt1),
4979 // Restore registers and dealloc return function call.
4980 let isCall = 1, isBarrier = 1, isReturn = 1, isTerminator = 1,
4981 Defs = [R29, R30, R31, PC] in {
4982 def RESTORE_DEALLOC_RET_JMP_V4 : JInst<(outs),
4983 (ins calltarget:$dst),
4984 "jump $dst // Restore_and_dealloc_return",
4989 // Restore registers and dealloc frame before a tail call.
4990 let isCall = 1, isBarrier = 1,
4991 Defs = [R29, R30, R31, PC] in {
4992 def RESTORE_DEALLOC_BEFORE_TAILCALL_V4 : JInst<(outs),
4993 (ins calltarget:$dst),
4994 "call $dst // Restore_and_dealloc_before_tailcall",
4999 // Save registers function call.
5000 let isCall = 1, isBarrier = 1,
5001 Uses = [R29, R31] in {
5002 def SAVE_REGISTERS_CALL_V4 : JInst<(outs),
5003 (ins calltarget:$dst),
5004 "call $dst // Save_calle_saved_registers",
5009 // if (Ps) dealloc_return
5010 let isReturn = 1, isTerminator = 1,
5011 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
5012 isPredicated = 1 in {
5013 def DEALLOC_RET_cPt_V4 : NVInst_V4<(outs),
5014 (ins PredRegs:$src1, i32imm:$amt1),
5015 "if ($src1) dealloc_return",
5020 // if (!Ps) dealloc_return
5021 let isReturn = 1, isTerminator = 1,
5022 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
5023 isPredicated = 1 in {
5024 def DEALLOC_RET_cNotPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
5026 "if (!$src1) dealloc_return",
5031 // if (Ps.new) dealloc_return:nt
5032 let isReturn = 1, isTerminator = 1,
5033 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
5034 isPredicated = 1 in {
5035 def DEALLOC_RET_cdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
5037 "if ($src1.new) dealloc_return:nt",
5042 // if (!Ps.new) dealloc_return:nt
5043 let isReturn = 1, isTerminator = 1,
5044 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
5045 isPredicated = 1 in {
5046 def DEALLOC_RET_cNotdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
5048 "if (!$src1.new) dealloc_return:nt",
5053 // if (Ps.new) dealloc_return:t
5054 let isReturn = 1, isTerminator = 1,
5055 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
5056 isPredicated = 1 in {
5057 def DEALLOC_RET_cdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
5059 "if ($src1.new) dealloc_return:t",
5064 // if (!Ps.new) dealloc_return:nt
5065 let isReturn = 1, isTerminator = 1,
5066 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
5067 isPredicated = 1 in {
5068 def DEALLOC_RET_cNotdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
5070 "if (!$src1.new) dealloc_return:t",
5076 // Load/Store with absolute addressing mode
5079 multiclass ST_abs<string OpcStr> {
5080 let isPredicable = 1 in
5081 def _abs_V4 : STInst2<(outs),
5082 (ins globaladdress:$absaddr, IntRegs:$src),
5083 !strconcat(OpcStr, "(##$absaddr) = $src"),
5087 let isPredicated = 1 in
5088 def _abs_cPt_V4 : STInst2<(outs),
5089 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5090 !strconcat("if ($src1)",
5091 !strconcat(OpcStr, "(##$absaddr) = $src2")),
5095 let isPredicated = 1 in
5096 def _abs_cNotPt_V4 : STInst2<(outs),
5097 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5098 !strconcat("if (!$src1)",
5099 !strconcat(OpcStr, "(##$absaddr) = $src2")),
5103 let isPredicated = 1 in
5104 def _abs_cdnPt_V4 : STInst2<(outs),
5105 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5106 !strconcat("if ($src1.new)",
5107 !strconcat(OpcStr, "(##$absaddr) = $src2")),
5111 let isPredicated = 1 in
5112 def _abs_cdnNotPt_V4 : STInst2<(outs),
5113 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5114 !strconcat("if (!$src1.new)",
5115 !strconcat(OpcStr, "(##$absaddr) = $src2")),
5119 def _abs_nv_V4 : STInst2<(outs),
5120 (ins globaladdress:$absaddr, IntRegs:$src),
5121 !strconcat(OpcStr, "(##$absaddr) = $src.new"),
5125 let isPredicated = 1 in
5126 def _abs_cPt_nv_V4 : STInst2<(outs),
5127 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5128 !strconcat("if ($src1)",
5129 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
5133 let isPredicated = 1 in
5134 def _abs_cNotPt_nv_V4 : STInst2<(outs),
5135 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5136 !strconcat("if (!$src1)",
5137 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
5141 let isPredicated = 1 in
5142 def _abs_cdnPt_nv_V4 : STInst2<(outs),
5143 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5144 !strconcat("if ($src1.new)",
5145 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
5149 let isPredicated = 1 in
5150 def _abs_cdnNotPt_nv_V4 : STInst2<(outs),
5151 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
5152 !strconcat("if (!$src1.new)",
5153 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
5158 let AddedComplexity = 30, isPredicable = 1 in
5159 def STrid_abs_V4 : STInst<(outs),
5160 (ins globaladdress:$absaddr, DoubleRegs:$src),
5161 "memd(##$absaddr) = $src",
5162 [(store (i64 DoubleRegs:$src),
5163 (HexagonCONST32 tglobaladdr:$absaddr))]>,
5166 let AddedComplexity = 30, isPredicated = 1 in
5167 def STrid_abs_cPt_V4 : STInst2<(outs),
5168 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
5169 "if ($src1) memd(##$absaddr) = $src2",
5173 let AddedComplexity = 30, isPredicated = 1 in
5174 def STrid_abs_cNotPt_V4 : STInst2<(outs),
5175 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
5176 "if (!$src1) memd(##$absaddr) = $src2",
5180 let AddedComplexity = 30, isPredicated = 1 in
5181 def STrid_abs_cdnPt_V4 : STInst2<(outs),
5182 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
5183 "if ($src1.new) memd(##$absaddr) = $src2",
5187 let AddedComplexity = 30, isPredicated = 1 in
5188 def STrid_abs_cdnNotPt_V4 : STInst2<(outs),
5189 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
5190 "if (!$src1.new) memd(##$absaddr) = $src2",
5194 defm STrib : ST_abs<"memb">;
5195 defm STrih : ST_abs<"memh">;
5196 defm STriw : ST_abs<"memw">;
5198 let Predicates = [HasV4T], AddedComplexity = 30 in
5199 def : Pat<(truncstorei8 (i32 IntRegs:$src1),
5200 (HexagonCONST32 tglobaladdr:$absaddr)),
5201 (STrib_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>;
5203 let Predicates = [HasV4T], AddedComplexity = 30 in
5204 def : Pat<(truncstorei16 (i32 IntRegs:$src1),
5205 (HexagonCONST32 tglobaladdr:$absaddr)),
5206 (STrih_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>;
5208 let Predicates = [HasV4T], AddedComplexity = 30 in
5209 def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32 tglobaladdr:$absaddr)),
5210 (STriw_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>;
5213 multiclass LD_abs<string OpcStr> {
5214 let isPredicable = 1 in
5215 def _abs_V4 : LDInst2<(outs IntRegs:$dst),
5216 (ins globaladdress:$absaddr),
5217 !strconcat("$dst = ", !strconcat(OpcStr, "(##$absaddr)")),
5221 let isPredicated = 1 in
5222 def _abs_cPt_V4 : LDInst2<(outs IntRegs:$dst),
5223 (ins PredRegs:$src1, globaladdress:$absaddr),
5224 !strconcat("if ($src1) $dst = ",
5225 !strconcat(OpcStr, "(##$absaddr)")),
5229 let isPredicated = 1 in
5230 def _abs_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5231 (ins PredRegs:$src1, globaladdress:$absaddr),
5232 !strconcat("if (!$src1) $dst = ",
5233 !strconcat(OpcStr, "(##$absaddr)")),
5237 let isPredicated = 1 in
5238 def _abs_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
5239 (ins PredRegs:$src1, globaladdress:$absaddr),
5240 !strconcat("if ($src1.new) $dst = ",
5241 !strconcat(OpcStr, "(##$absaddr)")),
5245 let isPredicated = 1 in
5246 def _abs_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5247 (ins PredRegs:$src1, globaladdress:$absaddr),
5248 !strconcat("if (!$src1.new) $dst = ",
5249 !strconcat(OpcStr, "(##$absaddr)")),
5254 let AddedComplexity = 30 in
5255 def LDrid_abs_V4 : LDInst<(outs DoubleRegs:$dst),
5256 (ins globaladdress:$absaddr),
5257 "$dst = memd(##$absaddr)",
5258 [(set (i64 DoubleRegs:$dst),
5259 (load (HexagonCONST32 tglobaladdr:$absaddr)))]>,
5262 let AddedComplexity = 30, isPredicated = 1 in
5263 def LDrid_abs_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5264 (ins PredRegs:$src1, globaladdress:$absaddr),
5265 "if ($src1) $dst = memd(##$absaddr)",
5269 let AddedComplexity = 30, isPredicated = 1 in
5270 def LDrid_abs_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5271 (ins PredRegs:$src1, globaladdress:$absaddr),
5272 "if (!$src1) $dst = memd(##$absaddr)",
5276 let AddedComplexity = 30, isPredicated = 1 in
5277 def LDrid_abs_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5278 (ins PredRegs:$src1, globaladdress:$absaddr),
5279 "if ($src1.new) $dst = memd(##$absaddr)",
5283 let AddedComplexity = 30, isPredicated = 1 in
5284 def LDrid_abs_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5285 (ins PredRegs:$src1, globaladdress:$absaddr),
5286 "if (!$src1.new) $dst = memd(##$absaddr)",
5290 defm LDrib : LD_abs<"memb">;
5291 defm LDriub : LD_abs<"memub">;
5292 defm LDrih : LD_abs<"memh">;
5293 defm LDriuh : LD_abs<"memuh">;
5294 defm LDriw : LD_abs<"memw">;
5297 let Predicates = [HasV4T], AddedComplexity = 30 in
5298 def : Pat<(i32 (load (HexagonCONST32 tglobaladdr:$absaddr))),
5299 (LDriw_abs_V4 tglobaladdr: $absaddr)>;
5301 let Predicates = [HasV4T], AddedComplexity=30 in
5302 def : Pat<(i32 (sextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))),
5303 (LDrib_abs_V4 tglobaladdr:$absaddr)>;
5305 let Predicates = [HasV4T], AddedComplexity=30 in
5306 def : Pat<(i32 (zextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))),
5307 (LDriub_abs_V4 tglobaladdr:$absaddr)>;
5309 let Predicates = [HasV4T], AddedComplexity=30 in
5310 def : Pat<(i32 (sextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))),
5311 (LDrih_abs_V4 tglobaladdr:$absaddr)>;
5313 let Predicates = [HasV4T], AddedComplexity=30 in
5314 def : Pat<(i32 (zextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))),
5315 (LDriuh_abs_V4 tglobaladdr:$absaddr)>;
5317 // Transfer global address into a register
5318 let AddedComplexity=50, isMoveImm = 1, isReMaterializable = 1 in
5319 def TFRI_V4 : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$src1),
5321 [(set IntRegs:$dst, (HexagonCONST32 tglobaladdr:$src1))]>,
5324 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5325 def TFRI_cPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5326 (ins PredRegs:$src1, globaladdress:$src2),
5327 "if($src1) $dst = ##$src2",
5331 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5332 def TFRI_cNotPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5333 (ins PredRegs:$src1, globaladdress:$src2),
5334 "if(!$src1) $dst = ##$src2",
5338 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5339 def TFRI_cdnPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5340 (ins PredRegs:$src1, globaladdress:$src2),
5341 "if($src1.new) $dst = ##$src2",
5345 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5346 def TFRI_cdnNotPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5347 (ins PredRegs:$src1, globaladdress:$src2),
5348 "if(!$src1.new) $dst = ##$src2",
5352 let AddedComplexity = 50, Predicates = [HasV4T] in
5353 def : Pat<(HexagonCONST32_GP tglobaladdr:$src1),
5354 (TFRI_V4 tglobaladdr:$src1)>;
5357 // Load - Indirect with long offset: These instructions take global address
5359 let AddedComplexity = 10 in
5360 def LDrid_ind_lo_V4 : LDInst<(outs DoubleRegs:$dst),
5361 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset),
5362 "$dst=memd($src1<<#$src2+##$offset)",
5363 [(set (i64 DoubleRegs:$dst),
5364 (load (add (shl IntRegs:$src1, u2ImmPred:$src2),
5365 (HexagonCONST32 tglobaladdr:$offset))))]>,
5368 let AddedComplexity = 10 in
5369 multiclass LD_indirect_lo<string OpcStr, PatFrag OpNode> {
5370 def _lo_V4 : LDInst<(outs IntRegs:$dst),
5371 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset),
5372 !strconcat("$dst = ",
5373 !strconcat(OpcStr, "($src1<<#$src2+##$offset)")),
5375 (i32 (OpNode (add (shl IntRegs:$src1, u2ImmPred:$src2),
5376 (HexagonCONST32 tglobaladdr:$offset)))))]>,
5380 defm LDrib_ind : LD_indirect_lo<"memb", sextloadi8>;
5381 defm LDriub_ind : LD_indirect_lo<"memub", zextloadi8>;
5382 defm LDrih_ind : LD_indirect_lo<"memh", sextloadi16>;
5383 defm LDriuh_ind : LD_indirect_lo<"memuh", zextloadi16>;
5384 defm LDriw_ind : LD_indirect_lo<"memw", load>;
5386 // Store - Indirect with long offset: These instructions take global address
5388 let AddedComplexity = 10 in
5389 def STrid_ind_lo_V4 : STInst<(outs),
5390 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3,
5392 "memd($src1<<#$src2+#$src3) = $src4",
5393 [(store (i64 DoubleRegs:$src4),
5394 (add (shl IntRegs:$src1, u2ImmPred:$src2),
5395 (HexagonCONST32 tglobaladdr:$src3)))]>,
5398 let AddedComplexity = 10 in
5399 multiclass ST_indirect_lo<string OpcStr, PatFrag OpNode> {
5400 def _lo_V4 : STInst<(outs),
5401 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3,
5403 !strconcat(OpcStr, "($src1<<#$src2+##$src3) = $src4"),
5404 [(OpNode (i32 IntRegs:$src4),
5405 (add (shl IntRegs:$src1, u2ImmPred:$src2),
5406 (HexagonCONST32 tglobaladdr:$src3)))]>,
5410 defm STrib_ind : ST_indirect_lo<"memb", truncstorei8>;
5411 defm STrih_ind : ST_indirect_lo<"memh", truncstorei16>;
5412 defm STriw_ind : ST_indirect_lo<"memw", store>;
5414 // Store - absolute addressing mode: These instruction take constant
5415 // value as the extended operand
5416 multiclass ST_absimm<string OpcStr> {
5417 let isPredicable = 1 in
5418 def _abs_V4 : STInst2<(outs),
5419 (ins u6Imm:$src1, IntRegs:$src2),
5420 !strconcat(OpcStr, "(#$src1) = $src2"),
5424 let isPredicated = 1 in
5425 def _abs_cPt_V4 : STInst2<(outs),
5426 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5427 !strconcat("if ($src1)", !strconcat(OpcStr, "(#$src2) = $src3")),
5431 let isPredicated = 1 in
5432 def _abs_cNotPt_V4 : STInst2<(outs),
5433 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5434 !strconcat("if (!$src1)", !strconcat(OpcStr, "(#$src2) = $src3")),
5438 let isPredicated = 1 in
5439 def _abs_cdnPt_V4 : STInst2<(outs),
5440 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5441 !strconcat("if ($src1.new)",
5442 !strconcat(OpcStr, "(#$src2) = $src3")),
5446 let isPredicated = 1 in
5447 def _abs_cdnNotPt_V4 : STInst2<(outs),
5448 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5449 !strconcat("if (!$src1.new)",
5450 !strconcat(OpcStr, "(#$src2) = $src3")),
5454 def _abs_nv_V4 : STInst2<(outs),
5455 (ins u6Imm:$src1, IntRegs:$src2),
5456 !strconcat(OpcStr, "(#$src1) = $src2.new"),
5460 let isPredicated = 1 in
5461 def _abs_cPt_nv_V4 : STInst2<(outs),
5462 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5463 !strconcat("if ($src1)",
5464 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5468 let isPredicated = 1 in
5469 def _abs_cNotPt_nv_V4 : STInst2<(outs),
5470 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5471 !strconcat("if (!$src1)",
5472 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5476 let isPredicated = 1 in
5477 def _abs_cdnPt_nv_V4 : STInst2<(outs),
5478 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5479 !strconcat("if ($src1.new)",
5480 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5484 let isPredicated = 1 in
5485 def _abs_cdnNotPt_nv_V4 : STInst2<(outs),
5486 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5487 !strconcat("if (!$src1.new)",
5488 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5493 defm STrib_imm : ST_absimm<"memb">;
5494 defm STrih_imm : ST_absimm<"memh">;
5495 defm STriw_imm : ST_absimm<"memw">;
5497 let Predicates = [HasV4T], AddedComplexity = 30 in
5498 def : Pat<(truncstorei8 (i32 IntRegs:$src1), u6ImmPred:$src2),
5499 (STrib_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>;
5501 let Predicates = [HasV4T], AddedComplexity = 30 in
5502 def : Pat<(truncstorei16 (i32 IntRegs:$src1), u6ImmPred:$src2),
5503 (STrih_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>;
5505 let Predicates = [HasV4T], AddedComplexity = 30 in
5506 def : Pat<(store (i32 IntRegs:$src1), u6ImmPred:$src2),
5507 (STriw_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>;
5510 // Load - absolute addressing mode: These instruction take constant
5511 // value as the extended operand
5513 multiclass LD_absimm<string OpcStr> {
5514 let isPredicable = 1 in
5515 def _abs_V4 : LDInst2<(outs IntRegs:$dst),
5517 !strconcat("$dst = ",
5518 !strconcat(OpcStr, "(#$src)")),
5522 let isPredicated = 1 in
5523 def _abs_cPt_V4 : LDInst2<(outs IntRegs:$dst),
5524 (ins PredRegs:$src1, u6Imm:$src2),
5525 !strconcat("if ($src1) $dst = ",
5526 !strconcat(OpcStr, "(#$src2)")),
5530 let isPredicated = 1 in
5531 def _abs_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5532 (ins PredRegs:$src1, u6Imm:$src2),
5533 !strconcat("if (!$src1) $dst = ",
5534 !strconcat(OpcStr, "(#$src2)")),
5538 let isPredicated = 1 in
5539 def _abs_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
5540 (ins PredRegs:$src1, u6Imm:$src2),
5541 !strconcat("if ($src1.new) $dst = ",
5542 !strconcat(OpcStr, "(#$src2)")),
5546 let isPredicated = 1 in
5547 def _abs_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5548 (ins PredRegs:$src1, u6Imm:$src2),
5549 !strconcat("if (!$src1.new) $dst = ",
5550 !strconcat(OpcStr, "(#$src2)")),
5555 defm LDrib_imm : LD_absimm<"memb">;
5556 defm LDriub_imm : LD_absimm<"memub">;
5557 defm LDrih_imm : LD_absimm<"memh">;
5558 defm LDriuh_imm : LD_absimm<"memuh">;
5559 defm LDriw_imm : LD_absimm<"memw">;
5561 let Predicates = [HasV4T], AddedComplexity = 30 in
5562 def : Pat<(i32 (load u6ImmPred:$src)),
5563 (LDriw_imm_abs_V4 u6ImmPred:$src)>;
5565 let Predicates = [HasV4T], AddedComplexity=30 in
5566 def : Pat<(i32 (sextloadi8 u6ImmPred:$src)),
5567 (LDrib_imm_abs_V4 u6ImmPred:$src)>;
5569 let Predicates = [HasV4T], AddedComplexity=30 in
5570 def : Pat<(i32 (zextloadi8 u6ImmPred:$src)),
5571 (LDriub_imm_abs_V4 u6ImmPred:$src)>;
5573 let Predicates = [HasV4T], AddedComplexity=30 in
5574 def : Pat<(i32 (sextloadi16 u6ImmPred:$src)),
5575 (LDrih_imm_abs_V4 u6ImmPred:$src)>;
5577 let Predicates = [HasV4T], AddedComplexity=30 in
5578 def : Pat<(i32 (zextloadi16 u6ImmPred:$src)),
5579 (LDriuh_imm_abs_V4 u6ImmPred:$src)>;
5582 // Indexed store double word - global address.
5583 // memw(Rs+#u6:2)=#S8
5584 let AddedComplexity = 10 in
5585 def STriw_offset_ext_V4 : STInst<(outs),
5586 (ins IntRegs:$src1, u6_2Imm:$src2, globaladdress:$src3),
5587 "memw($src1+#$src2) = ##$src3",
5588 [(store (HexagonCONST32 tglobaladdr:$src3),
5589 (add IntRegs:$src1, u6_2ImmPred:$src2))]>,
5593 // Indexed store double word - global address.
5594 // memw(Rs+#u6:2)=#S8
5595 let AddedComplexity = 10 in
5596 def STrih_offset_ext_V4 : STInst<(outs),
5597 (ins IntRegs:$src1, u6_1Imm:$src2, globaladdress:$src3),
5598 "memh($src1+#$src2) = ##$src3",
5599 [(truncstorei16 (HexagonCONST32 tglobaladdr:$src3),
5600 (add IntRegs:$src1, u6_1ImmPred:$src2))]>,