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 // multiclass for load instructions with base + register offset
420 multiclass ld_idxd_shl_pbase<string mnemonic, RegisterClass RC, bit isNot,
422 let PNewValue = #!if(isPredNew, "new", "") in
423 def #NAME# : LDInst2<(outs RC:$dst),
424 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$offset),
425 !if(isNot, "if (!$src1", "if ($src1")#!if(isPredNew, ".new) ",
426 ") ")#"$dst = "#mnemonic#"($src2+$src3<<#$offset)",
427 []>, Requires<[HasV4T]>;
430 multiclass ld_idxd_shl_pred<string mnemonic, RegisterClass RC, bit PredNot> {
431 let PredSense = #!if(PredNot, "false", "true") in {
432 defm _c#NAME# : ld_idxd_shl_pbase<mnemonic, RC, PredNot, 0>;
434 defm _cdn#NAME# : ld_idxd_shl_pbase<mnemonic, RC, PredNot, 1>;
438 let neverHasSideEffects = 1 in
439 multiclass ld_idxd_shl<string mnemonic, string CextOp, RegisterClass RC> {
440 let CextOpcode = CextOp, BaseOpcode = CextOp#_indexed_shl in {
441 let isPredicable = 1 in
442 def #NAME#_V4 : LDInst2<(outs RC:$dst),
443 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
444 "$dst = "#mnemonic#"($src1+$src2<<#$offset)",
445 []>, Requires<[HasV4T]>;
447 let isPredicated = 1 in {
448 defm Pt_V4 : ld_idxd_shl_pred<mnemonic, RC, 0 >;
449 defm NotPt_V4 : ld_idxd_shl_pred<mnemonic, RC, 1>;
454 let addrMode = BaseRegOffset in {
455 defm LDrib_indexed_shl: ld_idxd_shl<"memb", "LDrib", IntRegs>, AddrModeRel;
456 defm LDriub_indexed_shl: ld_idxd_shl<"memub", "LDriub", IntRegs>, AddrModeRel;
457 defm LDrih_indexed_shl: ld_idxd_shl<"memh", "LDrih", IntRegs>, AddrModeRel;
458 defm LDriuh_indexed_shl: ld_idxd_shl<"memuh", "LDriuh", IntRegs>, AddrModeRel;
459 defm LDriw_indexed_shl: ld_idxd_shl<"memw", "LDriw", IntRegs>, AddrModeRel;
460 defm LDrid_indexed_shl: ld_idxd_shl<"memd", "LDrid", DoubleRegs>, AddrModeRel;
463 // 'def pats' for load instructions with base + register offset and non-zero
464 // immediate value. Immediate value is used to left-shift the second
466 let AddedComplexity = 40 in {
467 def : Pat <(i32 (sextloadi8 (add IntRegs:$src1,
468 (shl IntRegs:$src2, u2ImmPred:$offset)))),
469 (LDrib_indexed_shl_V4 IntRegs:$src1,
470 IntRegs:$src2, u2ImmPred:$offset)>,
473 def : Pat <(i32 (zextloadi8 (add IntRegs:$src1,
474 (shl IntRegs:$src2, u2ImmPred:$offset)))),
475 (LDriub_indexed_shl_V4 IntRegs:$src1,
476 IntRegs:$src2, u2ImmPred:$offset)>,
479 def : Pat <(i32 (extloadi8 (add IntRegs:$src1,
480 (shl IntRegs:$src2, u2ImmPred:$offset)))),
481 (LDriub_indexed_shl_V4 IntRegs:$src1,
482 IntRegs:$src2, u2ImmPred:$offset)>,
485 def : Pat <(i32 (sextloadi16 (add IntRegs:$src1,
486 (shl IntRegs:$src2, u2ImmPred:$offset)))),
487 (LDrih_indexed_shl_V4 IntRegs:$src1,
488 IntRegs:$src2, u2ImmPred:$offset)>,
491 def : Pat <(i32 (zextloadi16 (add IntRegs:$src1,
492 (shl IntRegs:$src2, u2ImmPred:$offset)))),
493 (LDriuh_indexed_shl_V4 IntRegs:$src1,
494 IntRegs:$src2, u2ImmPred:$offset)>,
497 def : Pat <(i32 (extloadi16 (add IntRegs:$src1,
498 (shl IntRegs:$src2, u2ImmPred:$offset)))),
499 (LDriuh_indexed_shl_V4 IntRegs:$src1,
500 IntRegs:$src2, u2ImmPred:$offset)>,
503 def : Pat <(i32 (load (add IntRegs:$src1,
504 (shl IntRegs:$src2, u2ImmPred:$offset)))),
505 (LDriw_indexed_shl_V4 IntRegs:$src1,
506 IntRegs:$src2, u2ImmPred:$offset)>,
509 def : Pat <(i64 (load (add IntRegs:$src1,
510 (shl IntRegs:$src2, u2ImmPred:$offset)))),
511 (LDrid_indexed_shl_V4 IntRegs:$src1,
512 IntRegs:$src2, u2ImmPred:$offset)>,
516 //// Load doubleword conditionally.
517 // if ([!]Pv[.new]) Rd=memd(Rs+Rt<<#u2)
518 // if (Pv) Rd=memd(Rs+Rt<<#u2)
519 let AddedComplexity = 15, isPredicated = 1 in
520 def LDrid_indexed_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
521 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
522 "if ($src1) $dst=memd($src2+$src3<<#0)",
526 // if (Pv.new) Rd=memd(Rs+Rt<<#u2)
527 let AddedComplexity = 15, isPredicated = 1 in
528 def LDrid_indexed_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
529 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
530 "if ($src1.new) $dst=memd($src2+$src3<<#0)",
534 // if (!Pv) Rd=memd(Rs+Rt<<#u2)
535 let AddedComplexity = 15, isPredicated = 1 in
536 def LDrid_indexed_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
537 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
538 "if (!$src1) $dst=memd($src2+$src3<<#0)",
542 // if (!Pv.new) Rd=memd(Rs+Rt<<#u2)
543 let AddedComplexity = 15, isPredicated = 1 in
544 def LDrid_indexed_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
545 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
546 "if (!$src1.new) $dst=memd($src2+$src3<<#0)",
550 // Rdd=memd(Rt<<#u2+#U6)
553 // Rd=memb(Rs+Rt<<#u2)
554 let AddedComplexity = 10, isPredicable = 1 in
555 def LDrib_indexed_V4 : LDInst<(outs IntRegs:$dst),
556 (ins IntRegs:$src1, IntRegs:$src2),
557 "$dst=memb($src1+$src2<<#0)",
558 [(set (i32 IntRegs:$dst),
559 (i32 (sextloadi8 (add (i32 IntRegs:$src1),
560 (i32 IntRegs:$src2)))))]>,
563 let AddedComplexity = 10, isPredicable = 1 in
564 def LDriub_indexed_V4 : LDInst<(outs IntRegs:$dst),
565 (ins IntRegs:$src1, IntRegs:$src2),
566 "$dst=memub($src1+$src2<<#0)",
567 [(set (i32 IntRegs:$dst),
568 (i32 (zextloadi8 (add (i32 IntRegs:$src1),
569 (i32 IntRegs:$src2)))))]>,
572 let AddedComplexity = 10, isPredicable = 1 in
573 def LDriub_ae_indexed_V4 : LDInst<(outs IntRegs:$dst),
574 (ins IntRegs:$src1, IntRegs:$src2),
575 "$dst=memub($src1+$src2<<#0)",
576 [(set (i32 IntRegs:$dst),
577 (i32 (extloadi8 (add (i32 IntRegs:$src1),
578 (i32 IntRegs:$src2)))))]>,
581 let AddedComplexity = 40, isPredicable = 1 in
582 def LDriub_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
583 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
584 "$dst=memub($src1+$src2<<#$offset)",
585 [(set (i32 IntRegs:$dst),
586 (i32 (extloadi8 (add (i32 IntRegs:$src1),
587 (shl (i32 IntRegs:$src2),
588 u2ImmPred:$offset)))))]>,
591 //// Load byte conditionally.
592 // if ([!]Pv[.new]) Rd=memb(Rs+Rt<<#u2)
593 // if (Pv) Rd=memb(Rs+Rt<<#u2)
594 let AddedComplexity = 15, isPredicated = 1 in
595 def LDrib_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
596 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
597 "if ($src1) $dst=memb($src2+$src3<<#0)",
601 // if (Pv.new) Rd=memb(Rs+Rt<<#u2)
602 let AddedComplexity = 15, isPredicated = 1 in
603 def LDrib_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
604 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
605 "if ($src1.new) $dst=memb($src2+$src3<<#0)",
609 // if (!Pv) Rd=memb(Rs+Rt<<#u2)
610 let AddedComplexity = 15, isPredicated = 1 in
611 def LDrib_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
612 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
613 "if (!$src1) $dst=memb($src2+$src3<<#0)",
617 // if (!Pv.new) Rd=memb(Rs+Rt<<#u2)
618 let AddedComplexity = 15, isPredicated = 1 in
619 def LDrib_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
620 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
621 "if (!$src1.new) $dst=memb($src2+$src3<<#0)",
625 //// Load unsigned byte conditionally.
626 // if ([!]Pv[.new]) Rd=memub(Rs+Rt<<#u2)
627 // if (Pv) Rd=memub(Rs+Rt<<#u2)
628 let AddedComplexity = 15, isPredicated = 1 in
629 def LDriub_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
630 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
631 "if ($src1) $dst=memub($src2+$src3<<#0)",
635 // if (Pv.new) Rd=memub(Rs+Rt<<#u2)
636 let AddedComplexity = 15, isPredicated = 1 in
637 def LDriub_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
638 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
639 "if ($src1.new) $dst=memub($src2+$src3<<#0)",
643 // if (!Pv) Rd=memub(Rs+Rt<<#u2)
644 let AddedComplexity = 15, isPredicated = 1 in
645 def LDriub_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
646 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
647 "if (!$src1) $dst=memub($src2+$src3<<#0)",
651 // if (!Pv.new) Rd=memub(Rs+Rt<<#u2)
652 let AddedComplexity = 15, isPredicated = 1 in
653 def LDriub_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
654 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
655 "if (!$src1.new) $dst=memub($src2+$src3<<#0)",
659 // Rd=memb(Rt<<#u2+#U6)
662 // Rd=memh(Rs+Rt<<#u2)
663 let AddedComplexity = 10, isPredicable = 1 in
664 def LDrih_indexed_V4 : LDInst<(outs IntRegs:$dst),
665 (ins IntRegs:$src1, IntRegs:$src2),
666 "$dst=memh($src1+$src2<<#0)",
667 [(set (i32 IntRegs:$dst),
668 (i32 (sextloadi16 (add (i32 IntRegs:$src1),
669 (i32 IntRegs:$src2)))))]>,
672 let AddedComplexity = 10, isPredicable = 1 in
673 def LDriuh_indexed_V4 : LDInst<(outs IntRegs:$dst),
674 (ins IntRegs:$src1, IntRegs:$src2),
675 "$dst=memuh($src1+$src2<<#0)",
676 [(set (i32 IntRegs:$dst),
677 (i32 (zextloadi16 (add (i32 IntRegs:$src1),
678 (i32 IntRegs:$src2)))))]>,
681 let AddedComplexity = 10, isPredicable = 1 in
682 def LDriuh_ae_indexed_V4 : LDInst<(outs IntRegs:$dst),
683 (ins IntRegs:$src1, IntRegs:$src2),
684 "$dst=memuh($src1+$src2<<#0)",
685 [(set (i32 IntRegs:$dst),
686 (i32 (extloadi16 (add (i32 IntRegs:$src1),
687 (i32 IntRegs:$src2)))))]>,
690 let AddedComplexity = 40, isPredicable = 1 in
691 def LDriuh_ae_indexed_shl_V4 : LDInst<(outs IntRegs:$dst),
692 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$offset),
693 "$dst=memuh($src1+$src2<<#$offset)",
694 [(set (i32 IntRegs:$dst),
695 (i32 (extloadi16 (add (i32 IntRegs:$src1),
696 (shl (i32 IntRegs:$src2),
697 u2ImmPred:$offset)))))]>,
700 //// Load halfword conditionally.
701 // if ([!]Pv[.new]) Rd=memh(Rs+Rt<<#u2)
702 // if (Pv) Rd=memh(Rs+Rt<<#u2)
703 let AddedComplexity = 15, isPredicated = 1 in
704 def LDrih_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
705 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
706 "if ($src1) $dst=memh($src2+$src3<<#0)",
710 // if (Pv.new) Rd=memh(Rs+Rt<<#u2)
711 let AddedComplexity = 15, isPredicated = 1 in
712 def LDrih_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
713 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
714 "if ($src1.new) $dst=memh($src2+$src3<<#0)",
718 // if (!Pv) Rd=memh(Rs+Rt<<#u2)
719 let AddedComplexity = 15, isPredicated = 1 in
720 def LDrih_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
721 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
722 "if (!$src1) $dst=memh($src2+$src3<<#0)",
726 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2)
727 let AddedComplexity = 15, isPredicated = 1 in
728 def LDrih_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
729 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
730 "if (!$src1.new) $dst=memh($src2+$src3<<#0)",
734 //// Load unsigned halfword conditionally.
735 // if ([!]Pv[.new]) Rd=memuh(Rs+Rt<<#u2)
736 // if (Pv) Rd=memuh(Rs+Rt<<#u2)
737 let AddedComplexity = 15, isPredicated = 1 in
738 def LDriuh_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
739 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
740 "if ($src1) $dst=memuh($src2+$src3<<#0)",
744 // if (Pv.new) Rd=memuh(Rs+Rt<<#u2)
745 let AddedComplexity = 15, isPredicated = 1 in
746 def LDriuh_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
747 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
748 "if ($src1.new) $dst=memuh($src2+$src3<<#0)",
752 // if (!Pv) Rd=memuh(Rs+Rt<<#u2)
753 let AddedComplexity = 15, isPredicated = 1 in
754 def LDriuh_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
755 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
756 "if (!$src1) $dst=memuh($src2+$src3<<#0)",
760 // if (!Pv.new) Rd=memuh(Rs+Rt<<#u2)
761 let AddedComplexity = 15, isPredicated = 1 in
762 def LDriuh_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
763 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
764 "if (!$src1.new) $dst=memuh($src2+$src3<<#0)",
768 // Rd=memh(Rt<<#u2+#U6)
771 // Load predicate: Fix for bug 5279.
772 let neverHasSideEffects = 1 in
773 def LDriw_pred_V4 : LDInst2<(outs PredRegs:$dst),
775 "Error; should not emit",
781 // Rd=memw(Rs+Rt<<#u2)
782 let AddedComplexity = 10, isPredicable = 1 in
783 def LDriw_indexed_V4 : LDInst<(outs IntRegs:$dst),
784 (ins IntRegs:$src1, IntRegs:$src2),
785 "$dst=memw($src1+$src2<<#0)",
786 [(set (i32 IntRegs:$dst),
787 (i32 (load (add (i32 IntRegs:$src1),
788 (i32 IntRegs:$src2)))))]>,
791 //// Load word conditionally.
792 // if ([!]Pv[.new]) Rd=memw(Rs+Rt<<#u2)
793 // if (Pv) Rd=memw(Rs+Rt<<#u2)
794 let AddedComplexity = 15, isPredicated = 1 in
795 def LDriw_indexed_cPt_V4 : LDInst2<(outs IntRegs:$dst),
796 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
797 "if ($src1) $dst=memw($src2+$src3<<#0)",
801 // if (Pv.new) Rd=memh(Rs+Rt<<#u2)
802 let AddedComplexity = 15, isPredicated = 1 in
803 def LDriw_indexed_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
804 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
805 "if ($src1.new) $dst=memw($src2+$src3<<#0)",
809 // if (!Pv) Rd=memh(Rs+Rt<<#u2)
810 let AddedComplexity = 15, isPredicated = 1 in
811 def LDriw_indexed_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
812 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
813 "if (!$src1) $dst=memw($src2+$src3<<#0)",
817 // if (!Pv.new) Rd=memh(Rs+Rt<<#u2)
818 let AddedComplexity = 15, isPredicated = 1 in
819 def LDriw_indexed_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
820 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3),
821 "if (!$src1.new) $dst=memw($src2+$src3<<#0)",
825 /// Load from global offset
827 let isPredicable = 1, neverHasSideEffects = 1 in
828 def LDrid_GP_V4 : LDInst2<(outs DoubleRegs:$dst),
829 (ins globaladdress:$global, u16Imm:$offset),
830 "$dst=memd(#$global+$offset)",
834 let neverHasSideEffects = 1, isPredicated = 1 in
835 def LDrid_GP_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
836 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
837 "if ($src1) $dst=memd(##$global+$offset)",
841 let neverHasSideEffects = 1, isPredicated = 1 in
842 def LDrid_GP_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
843 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
844 "if (!$src1) $dst=memd(##$global+$offset)",
848 let neverHasSideEffects = 1, isPredicated = 1 in
849 def LDrid_GP_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
850 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
851 "if ($src1.new) $dst=memd(##$global+$offset)",
855 let neverHasSideEffects = 1, isPredicated = 1 in
856 def LDrid_GP_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
857 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
858 "if (!$src1.new) $dst=memd(##$global+$offset)",
862 let isPredicable = 1, neverHasSideEffects = 1 in
863 def LDrib_GP_V4 : LDInst2<(outs IntRegs:$dst),
864 (ins globaladdress:$global, u16Imm:$offset),
865 "$dst=memb(#$global+$offset)",
869 let neverHasSideEffects = 1, isPredicated = 1 in
870 def LDrib_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
871 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
872 "if ($src1) $dst=memb(##$global+$offset)",
876 let neverHasSideEffects = 1, isPredicated = 1 in
877 def LDrib_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
878 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
879 "if (!$src1) $dst=memb(##$global+$offset)",
883 let neverHasSideEffects = 1, isPredicated = 1 in
884 def LDrib_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
885 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
886 "if ($src1.new) $dst=memb(##$global+$offset)",
890 let neverHasSideEffects = 1, isPredicated = 1 in
891 def LDrib_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
892 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
893 "if (!$src1.new) $dst=memb(##$global+$offset)",
898 let isPredicable = 1, neverHasSideEffects = 1 in
899 def LDriub_GP_V4 : LDInst2<(outs IntRegs:$dst),
900 (ins globaladdress:$global, u16Imm:$offset),
901 "$dst=memub(#$global+$offset)",
906 let neverHasSideEffects = 1, isPredicated = 1 in
907 def LDriub_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
908 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
909 "if ($src1) $dst=memub(##$global+$offset)",
913 let neverHasSideEffects = 1, isPredicated = 1 in
914 def LDriub_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
915 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
916 "if (!$src1) $dst=memub(##$global+$offset)",
920 let neverHasSideEffects = 1, isPredicated = 1 in
921 def LDriub_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
922 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
923 "if ($src1.new) $dst=memub(##$global+$offset)",
927 let neverHasSideEffects = 1, isPredicated = 1 in
928 def LDriub_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
929 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
930 "if (!$src1.new) $dst=memub(##$global+$offset)",
935 let isPredicable = 1, neverHasSideEffects = 1 in
936 def LDrih_GP_V4 : LDInst2<(outs IntRegs:$dst),
937 (ins globaladdress:$global, u16Imm:$offset),
938 "$dst=memh(#$global+$offset)",
943 let neverHasSideEffects = 1, isPredicated = 1 in
944 def LDrih_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
945 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
946 "if ($src1) $dst=memh(##$global+$offset)",
950 let neverHasSideEffects = 1, isPredicated = 1 in
951 def LDrih_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
952 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
953 "if (!$src1) $dst=memh(##$global+$offset)",
957 let neverHasSideEffects = 1, isPredicated = 1 in
958 def LDrih_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
959 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
960 "if ($src1.new) $dst=memh(##$global+$offset)",
964 let neverHasSideEffects = 1, isPredicated = 1 in
965 def LDrih_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
966 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
967 "if (!$src1.new) $dst=memh(##$global+$offset)",
972 let isPredicable = 1, neverHasSideEffects = 1 in
973 def LDriuh_GP_V4 : LDInst2<(outs IntRegs:$dst),
974 (ins globaladdress:$global, u16Imm:$offset),
975 "$dst=memuh(#$global+$offset)",
979 let neverHasSideEffects = 1, isPredicated = 1 in
980 def LDriuh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
981 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
982 "if ($src1) $dst=memuh(##$global+$offset)",
986 let neverHasSideEffects = 1, isPredicated = 1 in
987 def LDriuh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
988 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
989 "if (!$src1) $dst=memuh(##$global+$offset)",
993 let neverHasSideEffects = 1, isPredicated = 1 in
994 def LDriuh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
995 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
996 "if ($src1.new) $dst=memuh(##$global+$offset)",
1000 let neverHasSideEffects = 1, isPredicated = 1 in
1001 def LDriuh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1002 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1003 "if (!$src1.new) $dst=memuh(##$global+$offset)",
1007 let isPredicable = 1, neverHasSideEffects = 1 in
1008 def LDriw_GP_V4 : LDInst2<(outs IntRegs:$dst),
1009 (ins globaladdress:$global, u16Imm:$offset),
1010 "$dst=memw(#$global+$offset)",
1015 let neverHasSideEffects = 1, isPredicated = 1 in
1016 def LDriw_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1017 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1018 "if ($src1) $dst=memw(##$global+$offset)",
1022 let neverHasSideEffects = 1, isPredicated = 1 in
1023 def LDriw_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1024 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1025 "if (!$src1) $dst=memw(##$global+$offset)",
1030 let neverHasSideEffects = 1, isPredicated = 1 in
1031 def LDriw_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1032 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1033 "if ($src1.new) $dst=memw(##$global+$offset)",
1037 let neverHasSideEffects = 1, isPredicated = 1 in
1038 def LDriw_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1039 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset),
1040 "if (!$src1.new) $dst=memw(##$global+$offset)",
1045 let isPredicable = 1, neverHasSideEffects = 1 in
1046 def LDd_GP_V4 : LDInst2<(outs DoubleRegs:$dst),
1047 (ins globaladdress:$global),
1048 "$dst=memd(#$global)",
1052 // if (Pv) Rtt=memd(##global)
1053 let neverHasSideEffects = 1, isPredicated = 1 in
1054 def LDd_GP_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1055 (ins PredRegs:$src1, globaladdress:$global),
1056 "if ($src1) $dst=memd(##$global)",
1061 // if (!Pv) Rtt=memd(##global)
1062 let neverHasSideEffects = 1, isPredicated = 1 in
1063 def LDd_GP_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1064 (ins PredRegs:$src1, globaladdress:$global),
1065 "if (!$src1) $dst=memd(##$global)",
1069 // if (Pv) Rtt=memd(##global)
1070 let neverHasSideEffects = 1, isPredicated = 1 in
1071 def LDd_GP_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1072 (ins PredRegs:$src1, globaladdress:$global),
1073 "if ($src1.new) $dst=memd(##$global)",
1078 // if (!Pv) Rtt=memd(##global)
1079 let neverHasSideEffects = 1, isPredicated = 1 in
1080 def LDd_GP_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
1081 (ins PredRegs:$src1, globaladdress:$global),
1082 "if (!$src1.new) $dst=memd(##$global)",
1086 let isPredicable = 1, neverHasSideEffects = 1 in
1087 def LDb_GP_V4 : LDInst2<(outs IntRegs:$dst),
1088 (ins globaladdress:$global),
1089 "$dst=memb(#$global)",
1093 // if (Pv) Rt=memb(##global)
1094 let neverHasSideEffects = 1, isPredicated = 1 in
1095 def LDb_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1096 (ins PredRegs:$src1, globaladdress:$global),
1097 "if ($src1) $dst=memb(##$global)",
1101 // if (!Pv) Rt=memb(##global)
1102 let neverHasSideEffects = 1, isPredicated = 1 in
1103 def LDb_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1104 (ins PredRegs:$src1, globaladdress:$global),
1105 "if (!$src1) $dst=memb(##$global)",
1109 // if (Pv) Rt=memb(##global)
1110 let neverHasSideEffects = 1, isPredicated = 1 in
1111 def LDb_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1112 (ins PredRegs:$src1, globaladdress:$global),
1113 "if ($src1.new) $dst=memb(##$global)",
1117 // if (!Pv) Rt=memb(##global)
1118 let neverHasSideEffects = 1, isPredicated = 1 in
1119 def LDb_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1120 (ins PredRegs:$src1, globaladdress:$global),
1121 "if (!$src1.new) $dst=memb(##$global)",
1125 let isPredicable = 1, neverHasSideEffects = 1 in
1126 def LDub_GP_V4 : LDInst2<(outs IntRegs:$dst),
1127 (ins globaladdress:$global),
1128 "$dst=memub(#$global)",
1132 // if (Pv) Rt=memub(##global)
1133 let neverHasSideEffects = 1, isPredicated = 1 in
1134 def LDub_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1135 (ins PredRegs:$src1, globaladdress:$global),
1136 "if ($src1) $dst=memub(##$global)",
1141 // if (!Pv) Rt=memub(##global)
1142 let neverHasSideEffects = 1, isPredicated = 1 in
1143 def LDub_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1144 (ins PredRegs:$src1, globaladdress:$global),
1145 "if (!$src1) $dst=memub(##$global)",
1149 // if (Pv) Rt=memub(##global)
1150 let neverHasSideEffects = 1, isPredicated = 1 in
1151 def LDub_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1152 (ins PredRegs:$src1, globaladdress:$global),
1153 "if ($src1.new) $dst=memub(##$global)",
1158 // if (!Pv) Rt=memub(##global)
1159 let neverHasSideEffects = 1, isPredicated = 1 in
1160 def LDub_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1161 (ins PredRegs:$src1, globaladdress:$global),
1162 "if (!$src1.new) $dst=memub(##$global)",
1166 let isPredicable = 1, neverHasSideEffects = 1 in
1167 def LDh_GP_V4 : LDInst2<(outs IntRegs:$dst),
1168 (ins globaladdress:$global),
1169 "$dst=memh(#$global)",
1173 // if (Pv) Rt=memh(##global)
1174 let neverHasSideEffects = 1, isPredicated = 1 in
1175 def LDh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1176 (ins PredRegs:$src1, globaladdress:$global),
1177 "if ($src1) $dst=memh(##$global)",
1181 // if (!Pv) Rt=memh(##global)
1182 let neverHasSideEffects = 1, isPredicated = 1 in
1183 def LDh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1184 (ins PredRegs:$src1, globaladdress:$global),
1185 "if (!$src1) $dst=memh(##$global)",
1189 // if (Pv) Rt=memh(##global)
1190 let neverHasSideEffects = 1, isPredicated = 1 in
1191 def LDh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1192 (ins PredRegs:$src1, globaladdress:$global),
1193 "if ($src1.new) $dst=memh(##$global)",
1197 // if (!Pv) Rt=memh(##global)
1198 let neverHasSideEffects = 1, isPredicated = 1 in
1199 def LDh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1200 (ins PredRegs:$src1, globaladdress:$global),
1201 "if (!$src1.new) $dst=memh(##$global)",
1205 let isPredicable = 1, neverHasSideEffects = 1 in
1206 def LDuh_GP_V4 : LDInst2<(outs IntRegs:$dst),
1207 (ins globaladdress:$global),
1208 "$dst=memuh(#$global)",
1212 // if (Pv) Rt=memuh(##global)
1213 let neverHasSideEffects = 1, isPredicated = 1 in
1214 def LDuh_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1215 (ins PredRegs:$src1, globaladdress:$global),
1216 "if ($src1) $dst=memuh(##$global)",
1220 // if (!Pv) Rt=memuh(##global)
1221 let neverHasSideEffects = 1, isPredicated = 1 in
1222 def LDuh_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1223 (ins PredRegs:$src1, globaladdress:$global),
1224 "if (!$src1) $dst=memuh(##$global)",
1228 // if (Pv) Rt=memuh(##global)
1229 let neverHasSideEffects = 1, isPredicated = 1 in
1230 def LDuh_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1231 (ins PredRegs:$src1, globaladdress:$global),
1232 "if ($src1.new) $dst=memuh(##$global)",
1236 // if (!Pv) Rt=memuh(##global)
1237 let neverHasSideEffects = 1, isPredicated = 1 in
1238 def LDuh_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1239 (ins PredRegs:$src1, globaladdress:$global),
1240 "if (!$src1.new) $dst=memuh(##$global)",
1244 let isPredicable = 1, neverHasSideEffects = 1 in
1245 def LDw_GP_V4 : LDInst2<(outs IntRegs:$dst),
1246 (ins globaladdress:$global),
1247 "$dst=memw(#$global)",
1251 // if (Pv) Rt=memw(##global)
1252 let neverHasSideEffects = 1, isPredicated = 1 in
1253 def LDw_GP_cPt_V4 : LDInst2<(outs IntRegs:$dst),
1254 (ins PredRegs:$src1, globaladdress:$global),
1255 "if ($src1) $dst=memw(##$global)",
1260 // if (!Pv) Rt=memw(##global)
1261 let neverHasSideEffects = 1, isPredicated = 1 in
1262 def LDw_GP_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1263 (ins PredRegs:$src1, globaladdress:$global),
1264 "if (!$src1) $dst=memw(##$global)",
1268 // if (Pv) Rt=memw(##global)
1269 let neverHasSideEffects = 1, isPredicated = 1 in
1270 def LDw_GP_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
1271 (ins PredRegs:$src1, globaladdress:$global),
1272 "if ($src1.new) $dst=memw(##$global)",
1277 // if (!Pv) Rt=memw(##global)
1278 let neverHasSideEffects = 1, isPredicated = 1 in
1279 def LDw_GP_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
1280 (ins PredRegs:$src1, globaladdress:$global),
1281 "if (!$src1.new) $dst=memw(##$global)",
1287 def : Pat <(atomic_load_64 (HexagonCONST32_GP tglobaladdr:$global)),
1288 (i64 (LDd_GP_V4 tglobaladdr:$global))>,
1291 def : Pat <(atomic_load_32 (HexagonCONST32_GP tglobaladdr:$global)),
1292 (i32 (LDw_GP_V4 tglobaladdr:$global))>,
1295 def : Pat <(atomic_load_16 (HexagonCONST32_GP tglobaladdr:$global)),
1296 (i32 (LDuh_GP_V4 tglobaladdr:$global))>,
1299 def : Pat <(atomic_load_8 (HexagonCONST32_GP tglobaladdr:$global)),
1300 (i32 (LDub_GP_V4 tglobaladdr:$global))>,
1303 // Map from load(globaladdress) -> memw(#foo + 0)
1304 let AddedComplexity = 100 in
1305 def : Pat <(i64 (load (HexagonCONST32_GP tglobaladdr:$global))),
1306 (i64 (LDd_GP_V4 tglobaladdr:$global))>,
1309 // Map from Pd = load(globaladdress) -> Rd = memb(globaladdress), Pd = Rd
1310 let AddedComplexity = 100 in
1311 def : Pat <(i1 (load (HexagonCONST32_GP tglobaladdr:$global))),
1312 (i1 (TFR_PdRs (i32 (LDb_GP_V4 tglobaladdr:$global))))>,
1315 // When the Interprocedural Global Variable optimizer realizes that a certain
1316 // global variable takes only two constant values, it shrinks the global to
1317 // a boolean. Catch those loads here in the following 3 patterns.
1318 let AddedComplexity = 100 in
1319 def : Pat <(i32 (extloadi1 (HexagonCONST32_GP tglobaladdr:$global))),
1320 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1323 let AddedComplexity = 100 in
1324 def : Pat <(i32 (sextloadi1 (HexagonCONST32_GP tglobaladdr:$global))),
1325 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1328 // Map from load(globaladdress) -> memb(#foo)
1329 let AddedComplexity = 100 in
1330 def : Pat <(i32 (extloadi8 (HexagonCONST32_GP tglobaladdr:$global))),
1331 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1334 // Map from load(globaladdress) -> memb(#foo)
1335 let AddedComplexity = 100 in
1336 def : Pat <(i32 (sextloadi8 (HexagonCONST32_GP tglobaladdr:$global))),
1337 (i32 (LDb_GP_V4 tglobaladdr:$global))>,
1340 let AddedComplexity = 100 in
1341 def : Pat <(i32 (zextloadi1 (HexagonCONST32_GP tglobaladdr:$global))),
1342 (i32 (LDub_GP_V4 tglobaladdr:$global))>,
1345 // Map from load(globaladdress) -> memub(#foo)
1346 let AddedComplexity = 100 in
1347 def : Pat <(i32 (zextloadi8 (HexagonCONST32_GP tglobaladdr:$global))),
1348 (i32 (LDub_GP_V4 tglobaladdr:$global))>,
1351 // Map from load(globaladdress) -> memh(#foo)
1352 let AddedComplexity = 100 in
1353 def : Pat <(i32 (extloadi16 (HexagonCONST32_GP tglobaladdr:$global))),
1354 (i32 (LDh_GP_V4 tglobaladdr:$global))>,
1357 // Map from load(globaladdress) -> memh(#foo)
1358 let AddedComplexity = 100 in
1359 def : Pat <(i32 (sextloadi16 (HexagonCONST32_GP tglobaladdr:$global))),
1360 (i32 (LDh_GP_V4 tglobaladdr:$global))>,
1363 // Map from load(globaladdress) -> memuh(#foo)
1364 let AddedComplexity = 100 in
1365 def : Pat <(i32 (zextloadi16 (HexagonCONST32_GP tglobaladdr:$global))),
1366 (i32 (LDuh_GP_V4 tglobaladdr:$global))>,
1369 // Map from load(globaladdress) -> memw(#foo)
1370 let AddedComplexity = 100 in
1371 def : Pat <(i32 (load (HexagonCONST32_GP tglobaladdr:$global))),
1372 (i32 (LDw_GP_V4 tglobaladdr:$global))>,
1375 def : Pat <(atomic_load_64 (add (HexagonCONST32_GP tglobaladdr:$global),
1376 u16ImmPred:$offset)),
1377 (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1380 def : Pat <(atomic_load_32 (add (HexagonCONST32_GP tglobaladdr:$global),
1381 u16ImmPred:$offset)),
1382 (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1385 def : Pat <(atomic_load_16 (add (HexagonCONST32_GP tglobaladdr:$global),
1386 u16ImmPred:$offset)),
1387 (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1390 def : Pat <(atomic_load_8 (add (HexagonCONST32_GP tglobaladdr:$global),
1391 u16ImmPred:$offset)),
1392 (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1395 // Map from load(globaladdress + x) -> memd(#foo + x)
1396 let AddedComplexity = 100 in
1397 def : Pat <(i64 (load (add (HexagonCONST32_GP tglobaladdr:$global),
1398 u16ImmPred:$offset))),
1399 (i64 (LDrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1402 // Map from load(globaladdress + x) -> memb(#foo + x)
1403 let AddedComplexity = 100 in
1404 def : Pat <(i32 (extloadi8 (add (HexagonCONST32_GP tglobaladdr:$global),
1405 u16ImmPred:$offset))),
1406 (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1409 // Map from load(globaladdress + x) -> memb(#foo + x)
1410 let AddedComplexity = 100 in
1411 def : Pat <(i32 (sextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global),
1412 u16ImmPred:$offset))),
1413 (i32 (LDrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1416 // Map from load(globaladdress + x) -> memub(#foo + x)
1417 let AddedComplexity = 100 in
1418 def : Pat <(i32 (zextloadi8 (add (HexagonCONST32_GP tglobaladdr:$global),
1419 u16ImmPred:$offset))),
1420 (i32 (LDriub_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1423 // Map from load(globaladdress + x) -> memuh(#foo + x)
1424 let AddedComplexity = 100 in
1425 def : Pat <(i32 (extloadi16 (add (HexagonCONST32_GP tglobaladdr:$global),
1426 u16ImmPred:$offset))),
1427 (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1430 // Map from load(globaladdress + x) -> memh(#foo + x)
1431 let AddedComplexity = 100 in
1432 def : Pat <(i32 (sextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global),
1433 u16ImmPred:$offset))),
1434 (i32 (LDrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1438 // Map from load(globaladdress + x) -> memuh(#foo + x)
1439 let AddedComplexity = 100 in
1440 def : Pat <(i32 (zextloadi16 (add (HexagonCONST32_GP tglobaladdr:$global),
1441 u16ImmPred:$offset))),
1442 (i32 (LDriuh_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1445 // Map from load(globaladdress + x) -> memw(#foo + x)
1446 let AddedComplexity = 100 in
1447 def : Pat <(i32 (load (add (HexagonCONST32_GP tglobaladdr:$global),
1448 u16ImmPred:$offset))),
1449 (i32 (LDriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset))>,
1453 //===----------------------------------------------------------------------===//
1455 //===----------------------------------------------------------------------===//
1457 //===----------------------------------------------------------------------===//
1459 //===----------------------------------------------------------------------===//
1461 /// Assumptions::: ****** DO NOT IGNORE ********
1462 /// 1. Make sure that in post increment store, the zero'th operand is always the
1463 /// post increment operand.
1464 /// 2. Make sure that the store value operand(Rt/Rtt) in a store is always the
1469 def STrid_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1470 (ins DoubleRegs:$src1, u6Imm:$src2),
1471 "memd($dst1=#$src2) = $src1",
1476 def STrib_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1477 (ins IntRegs:$src1, u6Imm:$src2),
1478 "memb($dst1=#$src2) = $src1",
1483 def STrih_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1484 (ins IntRegs:$src1, u6Imm:$src2),
1485 "memh($dst1=#$src2) = $src1",
1490 def STriw_abs_setimm_V4 : STInst2<(outs IntRegs:$dst1),
1491 (ins IntRegs:$src1, u6Imm:$src2),
1492 "memw($dst1=#$src2) = $src1",
1497 def STrid_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1498 (ins DoubleRegs:$src1, globaladdress:$src2),
1499 "memd($dst1=##$src2) = $src1",
1504 def STrib_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1505 (ins IntRegs:$src1, globaladdress:$src2),
1506 "memb($dst1=##$src2) = $src1",
1511 def STrih_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1512 (ins IntRegs:$src1, globaladdress:$src2),
1513 "memh($dst1=##$src2) = $src1",
1518 def STriw_abs_set_V4 : STInst2<(outs IntRegs:$dst1),
1519 (ins IntRegs:$src1, globaladdress:$src2),
1520 "memw($dst1=##$src2) = $src1",
1524 // memd(Rs+Ru<<#u2)=Rtt
1525 let AddedComplexity = 10, isPredicable = 1 in
1526 def STrid_indexed_shl_V4 : STInst<(outs),
1527 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, DoubleRegs:$src4),
1528 "memd($src1+$src2<<#$src3) = $src4",
1529 [(store (i64 DoubleRegs:$src4),
1530 (add (i32 IntRegs:$src1),
1531 (shl (i32 IntRegs:$src2), u2ImmPred:$src3)))]>,
1534 // memd(Ru<<#u2+#U6)=Rtt
1535 let AddedComplexity = 10 in
1536 def STrid_shl_V4 : STInst<(outs),
1537 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, DoubleRegs:$src4),
1538 "memd($src1<<#$src2+#$src3) = $src4",
1539 [(store (i64 DoubleRegs:$src4),
1540 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
1541 u6ImmPred:$src3))]>,
1544 // memd(Rx++#s4:3)=Rtt
1545 // memd(Rx++#s4:3:circ(Mu))=Rtt
1546 // memd(Rx++I:circ(Mu))=Rtt
1548 // memd(Rx++Mu:brev)=Rtt
1549 // memd(gp+#u16:3)=Rtt
1551 // Store doubleword conditionally.
1552 // if ([!]Pv[.new]) memd(#u6)=Rtt
1553 // TODO: needs to be implemented.
1555 // if ([!]Pv[.new]) memd(Rs+#u6:3)=Rtt
1556 // if (Pv) memd(Rs+#u6:3)=Rtt
1557 // if (Pv.new) memd(Rs+#u6:3)=Rtt
1558 let AddedComplexity = 10, neverHasSideEffects = 1,
1560 def STrid_cdnPt_V4 : STInst2<(outs),
1561 (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2),
1562 "if ($src1.new) memd($addr) = $src2",
1566 // if (!Pv) memd(Rs+#u6:3)=Rtt
1567 // if (!Pv.new) memd(Rs+#u6:3)=Rtt
1568 let AddedComplexity = 10, neverHasSideEffects = 1,
1570 def STrid_cdnNotPt_V4 : STInst2<(outs),
1571 (ins PredRegs:$src1, MEMri:$addr, DoubleRegs:$src2),
1572 "if (!$src1.new) memd($addr) = $src2",
1576 // if (Pv) memd(Rs+#u6:3)=Rtt
1577 // if (Pv.new) memd(Rs+#u6:3)=Rtt
1578 let AddedComplexity = 10, neverHasSideEffects = 1,
1580 def STrid_indexed_cdnPt_V4 : STInst2<(outs),
1581 (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3,
1583 "if ($src1.new) memd($src2+#$src3) = $src4",
1587 // if (!Pv) memd(Rs+#u6:3)=Rtt
1588 // if (!Pv.new) memd(Rs+#u6:3)=Rtt
1589 let AddedComplexity = 10, neverHasSideEffects = 1,
1591 def STrid_indexed_cdnNotPt_V4 : STInst2<(outs),
1592 (ins PredRegs:$src1, IntRegs:$src2, u6_3Imm:$src3,
1594 "if (!$src1.new) memd($src2+#$src3) = $src4",
1598 // if ([!]Pv[.new]) memd(Rs+Ru<<#u2)=Rtt
1599 // if (Pv) memd(Rs+Ru<<#u2)=Rtt
1600 let AddedComplexity = 10, neverHasSideEffects = 1,
1602 def STrid_indexed_shl_cPt_V4 : STInst2<(outs),
1603 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1605 "if ($src1) memd($src2+$src3<<#$src4) = $src5",
1609 // if (Pv.new) memd(Rs+Ru<<#u2)=Rtt
1610 let AddedComplexity = 10, neverHasSideEffects = 1,
1612 def STrid_indexed_shl_cdnPt_V4 : STInst2<(outs),
1613 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1615 "if ($src1.new) memd($src2+$src3<<#$src4) = $src5",
1618 // if (!Pv) memd(Rs+Ru<<#u2)=Rtt
1619 let AddedComplexity = 10, neverHasSideEffects = 1,
1621 def STrid_indexed_shl_cNotPt_V4 : STInst2<(outs),
1622 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1624 "if (!$src1) memd($src2+$src3<<#$src4) = $src5",
1627 // if (!Pv.new) memd(Rs+Ru<<#u2)=Rtt
1628 let AddedComplexity = 10, neverHasSideEffects = 1,
1630 def STrid_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
1631 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1633 "if (!$src1.new) memd($src2+$src3<<#$src4) = $src5",
1637 // if ([!]Pv[.new]) memd(Rx++#s4:3)=Rtt
1638 // if (Pv) memd(Rx++#s4:3)=Rtt
1639 // if (Pv.new) memd(Rx++#s4:3)=Rtt
1640 let AddedComplexity = 10, neverHasSideEffects = 1,
1642 def POST_STdri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
1643 (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3,
1645 "if ($src1.new) memd($src3++#$offset) = $src2",
1650 // if (!Pv) memd(Rx++#s4:3)=Rtt
1651 // if (!Pv.new) memd(Rx++#s4:3)=Rtt
1652 let AddedComplexity = 10, neverHasSideEffects = 1,
1654 def POST_STdri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
1655 (ins PredRegs:$src1, DoubleRegs:$src2, IntRegs:$src3,
1657 "if (!$src1.new) memd($src3++#$offset) = $src2",
1664 // memb(Rs+#u6:0)=#S8
1665 let AddedComplexity = 10, isPredicable = 1 in
1666 def STrib_imm_V4 : STInst<(outs),
1667 (ins IntRegs:$src1, u6_0Imm:$src2, s8Imm:$src3),
1668 "memb($src1+#$src2) = #$src3",
1669 [(truncstorei8 s8ImmPred:$src3, (add (i32 IntRegs:$src1),
1670 u6_0ImmPred:$src2))]>,
1673 // memb(Rs+Ru<<#u2)=Rt
1674 let AddedComplexity = 10, isPredicable = 1 in
1675 def STrib_indexed_shl_V4 : STInst<(outs),
1676 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
1677 "memb($src1+$src2<<#$src3) = $src4",
1678 [(truncstorei8 (i32 IntRegs:$src4),
1679 (add (i32 IntRegs:$src1),
1680 (shl (i32 IntRegs:$src2),
1681 u2ImmPred:$src3)))]>,
1684 // memb(Ru<<#u2+#U6)=Rt
1685 let AddedComplexity = 10 in
1686 def STrib_shl_V4 : STInst<(outs),
1687 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
1688 "memb($src1<<#$src2+#$src3) = $src4",
1689 [(truncstorei8 (i32 IntRegs:$src4),
1690 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
1691 u6ImmPred:$src3))]>,
1694 // memb(Rx++#s4:0:circ(Mu))=Rt
1695 // memb(Rx++I:circ(Mu))=Rt
1697 // memb(Rx++Mu:brev)=Rt
1698 // memb(gp+#u16:0)=Rt
1701 // Store byte conditionally.
1702 // if ([!]Pv[.new]) memb(#u6)=Rt
1703 // if ([!]Pv[.new]) memb(Rs+#u6:0)=#S6
1704 // if (Pv) memb(Rs+#u6:0)=#S6
1705 let neverHasSideEffects = 1,
1707 def STrib_imm_cPt_V4 : STInst2<(outs),
1708 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1709 "if ($src1) memb($src2+#$src3) = #$src4",
1713 // if (Pv.new) memb(Rs+#u6:0)=#S6
1714 let neverHasSideEffects = 1,
1716 def STrib_imm_cdnPt_V4 : STInst2<(outs),
1717 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1718 "if ($src1.new) memb($src2+#$src3) = #$src4",
1722 // if (!Pv) memb(Rs+#u6:0)=#S6
1723 let neverHasSideEffects = 1,
1725 def STrib_imm_cNotPt_V4 : STInst2<(outs),
1726 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1727 "if (!$src1) memb($src2+#$src3) = #$src4",
1731 // if (!Pv.new) memb(Rs+#u6:0)=#S6
1732 let neverHasSideEffects = 1,
1734 def STrib_imm_cdnNotPt_V4 : STInst2<(outs),
1735 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, s6Imm:$src4),
1736 "if (!$src1.new) memb($src2+#$src3) = #$src4",
1740 // if ([!]Pv[.new]) memb(Rs+#u6:0)=Rt
1741 // if (Pv) memb(Rs+#u6:0)=Rt
1742 // if (Pv.new) memb(Rs+#u6:0)=Rt
1743 let neverHasSideEffects = 1,
1745 def STrib_cdnPt_V4 : STInst2<(outs),
1746 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
1747 "if ($src1.new) memb($addr) = $src2",
1751 // if (!Pv) memb(Rs+#u6:0)=Rt
1752 // if (!Pv.new) memb(Rs+#u6:0)=Rt
1753 let neverHasSideEffects = 1,
1755 def STrib_cdnNotPt_V4 : STInst2<(outs),
1756 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
1757 "if (!$src1.new) memb($addr) = $src2",
1761 // if (Pv) memb(Rs+#u6:0)=Rt
1762 // if (!Pv) memb(Rs+#u6:0)=Rt
1763 // if (Pv.new) memb(Rs+#u6:0)=Rt
1764 let neverHasSideEffects = 1,
1766 def STrib_indexed_cdnPt_V4 : STInst2<(outs),
1767 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
1768 "if ($src1.new) memb($src2+#$src3) = $src4",
1772 // if (!Pv.new) memb(Rs+#u6:0)=Rt
1773 let neverHasSideEffects = 1,
1775 def STrib_indexed_cdnNotPt_V4 : STInst2<(outs),
1776 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
1777 "if (!$src1.new) memb($src2+#$src3) = $src4",
1781 // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Rt
1782 // if (Pv) memb(Rs+Ru<<#u2)=Rt
1783 let AddedComplexity = 10,
1785 def STrib_indexed_shl_cPt_V4 : STInst2<(outs),
1786 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1788 "if ($src1) memb($src2+$src3<<#$src4) = $src5",
1792 // if (Pv.new) memb(Rs+Ru<<#u2)=Rt
1793 let AddedComplexity = 10,
1795 def STrib_indexed_shl_cdnPt_V4 : STInst2<(outs),
1796 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1798 "if ($src1.new) memb($src2+$src3<<#$src4) = $src5",
1802 // if (!Pv) memb(Rs+Ru<<#u2)=Rt
1803 let AddedComplexity = 10,
1805 def STrib_indexed_shl_cNotPt_V4 : STInst2<(outs),
1806 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1808 "if (!$src1) memb($src2+$src3<<#$src4) = $src5",
1812 // if (!Pv.new) memb(Rs+Ru<<#u2)=Rt
1813 let AddedComplexity = 10,
1815 def STrib_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
1816 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1818 "if (!$src1.new) memb($src2+$src3<<#$src4) = $src5",
1822 // if ([!]Pv[.new]) memb(Rx++#s4:0)=Rt
1823 // if (Pv) memb(Rx++#s4:0)=Rt
1824 // if (Pv.new) memb(Rx++#s4:0)=Rt
1827 def POST_STbri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
1828 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
1829 "if ($src1.new) memb($src3++#$offset) = $src2",
1833 // if (!Pv) memb(Rx++#s4:0)=Rt
1834 // if (!Pv.new) memb(Rx++#s4:0)=Rt
1837 def POST_STbri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
1838 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
1839 "if (!$src1.new) memb($src3++#$offset) = $src2",
1845 // TODO: needs to be implemented
1846 // memh(Re=#U6)=Rt.H
1847 // memh(Rs+#s11:1)=Rt.H
1848 // memh(Rs+#u6:1)=#S8
1849 let AddedComplexity = 10, isPredicable = 1 in
1850 def STrih_imm_V4 : STInst<(outs),
1851 (ins IntRegs:$src1, u6_1Imm:$src2, s8Imm:$src3),
1852 "memh($src1+#$src2) = #$src3",
1853 [(truncstorei16 s8ImmPred:$src3, (add (i32 IntRegs:$src1),
1854 u6_1ImmPred:$src2))]>,
1857 // memh(Rs+Ru<<#u2)=Rt.H
1858 // TODO: needs to be implemented.
1860 // memh(Rs+Ru<<#u2)=Rt
1861 let AddedComplexity = 10, isPredicable = 1 in
1862 def STrih_indexed_shl_V4 : STInst<(outs),
1863 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
1864 "memh($src1+$src2<<#$src3) = $src4",
1865 [(truncstorei16 (i32 IntRegs:$src4),
1866 (add (i32 IntRegs:$src1),
1867 (shl (i32 IntRegs:$src2),
1868 u2ImmPred:$src3)))]>,
1871 // memh(Ru<<#u2+#U6)=Rt.H
1872 // memh(Ru<<#u2+#U6)=Rt
1873 let AddedComplexity = 10 in
1874 def STrih_shl_V4 : STInst<(outs),
1875 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
1876 "memh($src1<<#$src2+#$src3) = $src4",
1877 [(truncstorei16 (i32 IntRegs:$src4),
1878 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
1879 u6ImmPred:$src3))]>,
1882 // memh(Rx++#s4:1:circ(Mu))=Rt.H
1883 // memh(Rx++#s4:1:circ(Mu))=Rt
1884 // memh(Rx++I:circ(Mu))=Rt.H
1885 // memh(Rx++I:circ(Mu))=Rt
1886 // memh(Rx++Mu)=Rt.H
1888 // memh(Rx++Mu:brev)=Rt.H
1889 // memh(Rx++Mu:brev)=Rt
1890 // memh(gp+#u16:1)=Rt
1891 // if ([!]Pv[.new]) memh(#u6)=Rt.H
1892 // if ([!]Pv[.new]) memh(#u6)=Rt
1894 // if ([!]Pv[.new]) memh(Rs+#u6:1)=#S6
1895 // if (Pv) memh(Rs+#u6:1)=#S6
1896 let neverHasSideEffects = 1,
1898 def STrih_imm_cPt_V4 : STInst2<(outs),
1899 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
1900 "if ($src1) memh($src2+#$src3) = #$src4",
1904 // if (Pv.new) memh(Rs+#u6:1)=#S6
1905 let neverHasSideEffects = 1,
1907 def STrih_imm_cdnPt_V4 : STInst2<(outs),
1908 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
1909 "if ($src1.new) memh($src2+#$src3) = #$src4",
1913 // if (!Pv) memh(Rs+#u6:1)=#S6
1914 let neverHasSideEffects = 1,
1916 def STrih_imm_cNotPt_V4 : STInst2<(outs),
1917 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
1918 "if (!$src1) memh($src2+#$src3) = #$src4",
1922 // if (!Pv.new) memh(Rs+#u6:1)=#S6
1923 let neverHasSideEffects = 1,
1925 def STrih_imm_cdnNotPt_V4 : STInst2<(outs),
1926 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, s6Imm:$src4),
1927 "if (!$src1.new) memh($src2+#$src3) = #$src4",
1931 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt.H
1932 // TODO: needs to be implemented.
1934 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Rt
1935 // if (Pv) memh(Rs+#u6:1)=Rt
1936 // if (Pv.new) memh(Rs+#u6:1)=Rt
1937 let neverHasSideEffects = 1,
1939 def STrih_cdnPt_V4 : STInst2<(outs),
1940 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
1941 "if ($src1.new) memh($addr) = $src2",
1945 // if (!Pv) memh(Rs+#u6:1)=Rt
1946 // if (!Pv.new) memh(Rs+#u6:1)=Rt
1947 let neverHasSideEffects = 1,
1949 def STrih_cdnNotPt_V4 : STInst2<(outs),
1950 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
1951 "if (!$src1.new) memh($addr) = $src2",
1955 // if (Pv.new) memh(Rs+#u6:1)=Rt
1956 let neverHasSideEffects = 1,
1958 def STrih_indexed_cdnPt_V4 : STInst2<(outs),
1959 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
1960 "if ($src1.new) memh($src2+#$src3) = $src4",
1964 // if (!Pv.new) memh(Rs+#u6:1)=Rt
1965 let neverHasSideEffects = 1,
1967 def STrih_indexed_cdnNotPt_V4 : STInst2<(outs),
1968 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
1969 "if (!$src1.new) memh($src2+#$src3) = $src4",
1973 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt.H
1974 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Rt
1975 // if (Pv) memh(Rs+Ru<<#u2)=Rt
1976 let AddedComplexity = 10,
1978 def STrih_indexed_shl_cPt_V4 : STInst2<(outs),
1979 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1981 "if ($src1) memh($src2+$src3<<#$src4) = $src5",
1985 // if (Pv.new) memh(Rs+Ru<<#u2)=Rt
1986 let AddedComplexity = 10,
1988 def STrih_indexed_shl_cdnPt_V4 : STInst2<(outs),
1989 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
1991 "if ($src1.new) memh($src2+$src3<<#$src4) = $src5",
1995 // if (!Pv) memh(Rs+Ru<<#u2)=Rt
1996 let AddedComplexity = 10,
1998 def STrih_indexed_shl_cNotPt_V4 : STInst2<(outs),
1999 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2001 "if (!$src1) memh($src2+$src3<<#$src4) = $src5",
2005 // if (!Pv.new) memh(Rs+Ru<<#u2)=Rt
2006 let AddedComplexity = 10,
2008 def STrih_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
2009 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2011 "if (!$src1.new) memh($src2+$src3<<#$src4) = $src5",
2015 // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt.H
2016 // TODO: Needs to be implemented.
2018 // if ([!]Pv[.new]) memh(Rx++#s4:1)=Rt
2019 // if (Pv) memh(Rx++#s4:1)=Rt
2020 // if (Pv.new) memh(Rx++#s4:1)=Rt
2023 def POST_SThri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
2024 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
2025 "if ($src1.new) memh($src3++#$offset) = $src2",
2029 // if (!Pv) memh(Rx++#s4:1)=Rt
2030 // if (!Pv.new) memh(Rx++#s4:1)=Rt
2033 def POST_SThri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
2034 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
2035 "if (!$src1.new) memh($src3++#$offset) = $src2",
2042 // TODO: Needs to be implemented.
2045 let neverHasSideEffects = 1 in
2046 def STriw_pred_V4 : STInst2<(outs),
2047 (ins MEMri:$addr, PredRegs:$src1),
2048 "Error; should not emit",
2053 // memw(Rs+#u6:2)=#S8
2054 let AddedComplexity = 10, isPredicable = 1 in
2055 def STriw_imm_V4 : STInst<(outs),
2056 (ins IntRegs:$src1, u6_2Imm:$src2, s8Imm:$src3),
2057 "memw($src1+#$src2) = #$src3",
2058 [(store s8ImmPred:$src3, (add (i32 IntRegs:$src1),
2059 u6_2ImmPred:$src2))]>,
2062 // memw(Rs+Ru<<#u2)=Rt
2063 let AddedComplexity = 10, isPredicable = 1 in
2064 def STriw_indexed_shl_V4 : STInst<(outs),
2065 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
2066 "memw($src1+$src2<<#$src3) = $src4",
2067 [(store (i32 IntRegs:$src4), (add (i32 IntRegs:$src1),
2068 (shl (i32 IntRegs:$src2),
2069 u2ImmPred:$src3)))]>,
2072 // memw(Ru<<#u2+#U6)=Rt
2073 let AddedComplexity = 10 in
2074 def STriw_shl_V4 : STInst<(outs),
2075 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
2076 "memw($src1<<#$src2+#$src3) = $src4",
2077 [(store (i32 IntRegs:$src4),
2078 (add (shl (i32 IntRegs:$src1), u2ImmPred:$src2),
2079 u6ImmPred:$src3))]>,
2082 // memw(Rx++#s4:2)=Rt
2083 // memw(Rx++#s4:2:circ(Mu))=Rt
2084 // memw(Rx++I:circ(Mu))=Rt
2086 // memw(Rx++Mu:brev)=Rt
2087 // memw(gp+#u16:2)=Rt
2090 // Store word conditionally.
2092 // if ([!]Pv[.new]) memw(Rs+#u6:2)=#S6
2093 // if (Pv) memw(Rs+#u6:2)=#S6
2094 let neverHasSideEffects = 1,
2096 def STriw_imm_cPt_V4 : STInst2<(outs),
2097 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2098 "if ($src1) memw($src2+#$src3) = #$src4",
2102 // if (Pv.new) memw(Rs+#u6:2)=#S6
2103 let neverHasSideEffects = 1,
2105 def STriw_imm_cdnPt_V4 : STInst2<(outs),
2106 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2107 "if ($src1.new) memw($src2+#$src3) = #$src4",
2111 // if (!Pv) memw(Rs+#u6:2)=#S6
2112 let neverHasSideEffects = 1,
2114 def STriw_imm_cNotPt_V4 : STInst2<(outs),
2115 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2116 "if (!$src1) memw($src2+#$src3) = #$src4",
2120 // if (!Pv.new) memw(Rs+#u6:2)=#S6
2121 let neverHasSideEffects = 1,
2123 def STriw_imm_cdnNotPt_V4 : STInst2<(outs),
2124 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, s6Imm:$src4),
2125 "if (!$src1.new) memw($src2+#$src3) = #$src4",
2129 // if ([!]Pv[.new]) memw(Rs+#u6:2)=Rt
2130 // if (Pv) memw(Rs+#u6:2)=Rt
2131 // if (Pv.new) memw(Rs+#u6:2)=Rt
2132 let neverHasSideEffects = 1,
2134 def STriw_cdnPt_V4 : STInst2<(outs),
2135 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2136 "if ($src1.new) memw($addr) = $src2",
2140 // if (!Pv) memw(Rs+#u6:2)=Rt
2141 // if (!Pv.new) memw(Rs+#u6:2)=Rt
2142 let neverHasSideEffects = 1,
2144 def STriw_cdnNotPt_V4 : STInst2<(outs),
2145 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2146 "if (!$src1.new) memw($addr) = $src2",
2150 // if (Pv) memw(Rs+#u6:2)=Rt
2151 // if (!Pv) memw(Rs+#u6:2)=Rt
2152 // if (Pv.new) memw(Rs+#u6:2)=Rt
2153 let neverHasSideEffects = 1,
2155 def STriw_indexed_cdnPt_V4 : STInst2<(outs),
2156 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
2157 "if ($src1.new) memw($src2+#$src3) = $src4",
2161 // if (!Pv.new) memw(Rs+#u6:2)=Rt
2162 let neverHasSideEffects = 1,
2164 def STriw_indexed_cdnNotPt_V4 : STInst2<(outs),
2165 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
2166 "if (!$src1.new) memw($src2+#$src3) = $src4",
2170 // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Rt
2171 // if (Pv) memw(Rs+Ru<<#u2)=Rt
2172 let AddedComplexity = 10,
2174 def STriw_indexed_shl_cPt_V4 : STInst2<(outs),
2175 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2177 "if ($src1) memw($src2+$src3<<#$src4) = $src5",
2181 // if (Pv.new) memw(Rs+Ru<<#u2)=Rt
2182 let AddedComplexity = 10,
2184 def STriw_indexed_shl_cdnPt_V4 : STInst2<(outs),
2185 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2187 "if ($src1.new) memw($src2+$src3<<#$src4) = $src5",
2191 // if (!Pv) memw(Rs+Ru<<#u2)=Rt
2192 let AddedComplexity = 10,
2194 def STriw_indexed_shl_cNotPt_V4 : STInst2<(outs),
2195 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2197 "if (!$src1) memw($src2+$src3<<#$src4) = $src5",
2201 // if (!Pv.new) memw(Rs+Ru<<#u2)=Rt
2202 let AddedComplexity = 10,
2204 def STriw_indexed_shl_cdnNotPt_V4 : STInst2<(outs),
2205 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2207 "if (!$src1.new) memw($src2+$src3<<#$src4) = $src5",
2211 // if ([!]Pv[.new]) memw(Rx++#s4:2)=Rt
2212 // if (Pv) memw(Rx++#s4:2)=Rt
2213 // if (Pv.new) memw(Rx++#s4:2)=Rt
2216 def POST_STwri_cdnPt_V4 : STInst2PI<(outs IntRegs:$dst),
2217 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
2218 "if ($src1.new) memw($src3++#$offset) = $src2",
2222 // if (!Pv) memw(Rx++#s4:2)=Rt
2223 // if (!Pv.new) memw(Rx++#s4:2)=Rt
2226 def POST_STwri_cdnNotPt_V4 : STInst2PI<(outs IntRegs:$dst),
2227 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
2228 "if (!$src1.new) memw($src3++#$offset) = $src2",
2233 /// store to global address
2235 let isPredicable = 1, neverHasSideEffects = 1 in
2236 def STrid_GP_V4 : STInst2<(outs),
2237 (ins globaladdress:$global, u16Imm:$offset, DoubleRegs:$src),
2238 "memd(#$global+$offset) = $src",
2242 let neverHasSideEffects = 1, isPredicated = 1 in
2243 def STrid_GP_cPt_V4 : STInst2<(outs),
2244 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2246 "if ($src1) memd(##$global+$offset) = $src2",
2250 let neverHasSideEffects = 1, isPredicated = 1 in
2251 def STrid_GP_cNotPt_V4 : STInst2<(outs),
2252 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2254 "if (!$src1) memd(##$global+$offset) = $src2",
2258 let neverHasSideEffects = 1, isPredicated = 1 in
2259 def STrid_GP_cdnPt_V4 : STInst2<(outs),
2260 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2262 "if ($src1.new) memd(##$global+$offset) = $src2",
2266 let neverHasSideEffects = 1, isPredicated = 1 in
2267 def STrid_GP_cdnNotPt_V4 : STInst2<(outs),
2268 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2270 "if (!$src1.new) memd(##$global+$offset) = $src2",
2274 let isPredicable = 1, neverHasSideEffects = 1 in
2275 def STrib_GP_V4 : STInst2<(outs),
2276 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2277 "memb(#$global+$offset) = $src",
2281 let neverHasSideEffects = 1, isPredicated = 1 in
2282 def STrib_GP_cPt_V4 : STInst2<(outs),
2283 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2285 "if ($src1) memb(##$global+$offset) = $src2",
2289 let neverHasSideEffects = 1, isPredicated = 1 in
2290 def STrib_GP_cNotPt_V4 : STInst2<(outs),
2291 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2293 "if (!$src1) memb(##$global+$offset) = $src2",
2297 let neverHasSideEffects = 1, isPredicated = 1 in
2298 def STrib_GP_cdnPt_V4 : STInst2<(outs),
2299 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2301 "if ($src1.new) memb(##$global+$offset) = $src2",
2305 let neverHasSideEffects = 1, isPredicated = 1 in
2306 def STrib_GP_cdnNotPt_V4 : STInst2<(outs),
2307 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2309 "if (!$src1.new) memb(##$global+$offset) = $src2",
2313 let isPredicable = 1, neverHasSideEffects = 1 in
2314 def STrih_GP_V4 : STInst2<(outs),
2315 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2316 "memh(#$global+$offset) = $src",
2320 let neverHasSideEffects = 1, isPredicated = 1 in
2321 def STrih_GP_cPt_V4 : STInst2<(outs),
2322 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2324 "if ($src1) memh(##$global+$offset) = $src2",
2328 let neverHasSideEffects = 1, isPredicated = 1 in
2329 def STrih_GP_cNotPt_V4 : STInst2<(outs),
2330 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2332 "if (!$src1) memh(##$global+$offset) = $src2",
2336 let neverHasSideEffects = 1, isPredicated = 1 in
2337 def STrih_GP_cdnPt_V4 : STInst2<(outs),
2338 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2340 "if ($src1.new) memh(##$global+$offset) = $src2",
2344 let neverHasSideEffects = 1, isPredicated = 1 in
2345 def STrih_GP_cdnNotPt_V4 : STInst2<(outs),
2346 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2348 "if (!$src1.new) memh(##$global+$offset) = $src2",
2352 let isPredicable = 1, neverHasSideEffects = 1 in
2353 def STriw_GP_V4 : STInst2<(outs),
2354 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2355 "memw(#$global+$offset) = $src",
2359 let neverHasSideEffects = 1, isPredicated = 1 in
2360 def STriw_GP_cPt_V4 : STInst2<(outs),
2361 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2363 "if ($src1) memw(##$global+$offset) = $src2",
2367 let neverHasSideEffects = 1, isPredicated = 1 in
2368 def STriw_GP_cNotPt_V4 : STInst2<(outs),
2369 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2371 "if (!$src1) memw(##$global+$offset) = $src2",
2375 let neverHasSideEffects = 1, isPredicated = 1 in
2376 def STriw_GP_cdnPt_V4 : STInst2<(outs),
2377 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2379 "if ($src1.new) memw(##$global+$offset) = $src2",
2383 let neverHasSideEffects = 1, isPredicated = 1 in
2384 def STriw_GP_cdnNotPt_V4 : STInst2<(outs),
2385 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
2387 "if (!$src1.new) memw(##$global+$offset) = $src2",
2391 // memd(#global)=Rtt
2392 let isPredicable = 1, neverHasSideEffects = 1 in
2393 def STd_GP_V4 : STInst2<(outs),
2394 (ins globaladdress:$global, DoubleRegs:$src),
2395 "memd(#$global) = $src",
2399 // if (Pv) memd(##global) = Rtt
2400 let neverHasSideEffects = 1, isPredicated = 1 in
2401 def STd_GP_cPt_V4 : STInst2<(outs),
2402 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2403 "if ($src1) memd(##$global) = $src2",
2407 // if (!Pv) memd(##global) = Rtt
2408 let neverHasSideEffects = 1, isPredicated = 1 in
2409 def STd_GP_cNotPt_V4 : STInst2<(outs),
2410 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2411 "if (!$src1) memd(##$global) = $src2",
2415 // if (Pv) memd(##global) = Rtt
2416 let neverHasSideEffects = 1, isPredicated = 1 in
2417 def STd_GP_cdnPt_V4 : STInst2<(outs),
2418 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2419 "if ($src1.new) memd(##$global) = $src2",
2423 // if (!Pv) memd(##global) = Rtt
2424 let neverHasSideEffects = 1, isPredicated = 1 in
2425 def STd_GP_cdnNotPt_V4 : STInst2<(outs),
2426 (ins PredRegs:$src1, globaladdress:$global, DoubleRegs:$src2),
2427 "if (!$src1.new) memd(##$global) = $src2",
2432 let isPredicable = 1, neverHasSideEffects = 1 in
2433 def STb_GP_V4 : STInst2<(outs),
2434 (ins globaladdress:$global, IntRegs:$src),
2435 "memb(#$global) = $src",
2439 // if (Pv) memb(##global) = Rt
2440 let neverHasSideEffects = 1, isPredicated = 1 in
2441 def STb_GP_cPt_V4 : STInst2<(outs),
2442 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2443 "if ($src1) memb(##$global) = $src2",
2447 // if (!Pv) memb(##global) = Rt
2448 let neverHasSideEffects = 1, isPredicated = 1 in
2449 def STb_GP_cNotPt_V4 : STInst2<(outs),
2450 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2451 "if (!$src1) memb(##$global) = $src2",
2455 // if (Pv) memb(##global) = Rt
2456 let neverHasSideEffects = 1, isPredicated = 1 in
2457 def STb_GP_cdnPt_V4 : STInst2<(outs),
2458 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2459 "if ($src1.new) memb(##$global) = $src2",
2463 // if (!Pv) memb(##global) = Rt
2464 let neverHasSideEffects = 1, isPredicated = 1 in
2465 def STb_GP_cdnNotPt_V4 : STInst2<(outs),
2466 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2467 "if (!$src1.new) memb(##$global) = $src2",
2472 let isPredicable = 1, neverHasSideEffects = 1 in
2473 def STh_GP_V4 : STInst2<(outs),
2474 (ins globaladdress:$global, IntRegs:$src),
2475 "memh(#$global) = $src",
2479 // if (Pv) memh(##global) = Rt
2480 let neverHasSideEffects = 1, isPredicated = 1 in
2481 def STh_GP_cPt_V4 : STInst2<(outs),
2482 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2483 "if ($src1) memh(##$global) = $src2",
2487 // if (!Pv) memh(##global) = Rt
2488 let neverHasSideEffects = 1, isPredicated = 1 in
2489 def STh_GP_cNotPt_V4 : STInst2<(outs),
2490 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2491 "if (!$src1) memh(##$global) = $src2",
2495 // if (Pv) memh(##global) = Rt
2496 let neverHasSideEffects = 1, isPredicated = 1 in
2497 def STh_GP_cdnPt_V4 : STInst2<(outs),
2498 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2499 "if ($src1.new) memh(##$global) = $src2",
2503 // if (!Pv) memh(##global) = Rt
2504 let neverHasSideEffects = 1, isPredicated = 1 in
2505 def STh_GP_cdnNotPt_V4 : STInst2<(outs),
2506 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2507 "if (!$src1.new) memh(##$global) = $src2",
2512 let isPredicable = 1, neverHasSideEffects = 1 in
2513 def STw_GP_V4 : STInst2<(outs),
2514 (ins globaladdress:$global, IntRegs:$src),
2515 "memw(#$global) = $src",
2519 // if (Pv) memw(##global) = Rt
2520 let neverHasSideEffects = 1, isPredicated = 1 in
2521 def STw_GP_cPt_V4 : STInst2<(outs),
2522 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2523 "if ($src1) memw(##$global) = $src2",
2527 // if (!Pv) memw(##global) = Rt
2528 let neverHasSideEffects = 1, isPredicated = 1 in
2529 def STw_GP_cNotPt_V4 : STInst2<(outs),
2530 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2531 "if (!$src1) memw(##$global) = $src2",
2535 // if (Pv) memw(##global) = Rt
2536 let neverHasSideEffects = 1, isPredicated = 1 in
2537 def STw_GP_cdnPt_V4 : STInst2<(outs),
2538 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2539 "if ($src1.new) memw(##$global) = $src2",
2543 // if (!Pv) memw(##global) = Rt
2544 let neverHasSideEffects = 1, isPredicated = 1 in
2545 def STw_GP_cdnNotPt_V4 : STInst2<(outs),
2546 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
2547 "if (!$src1.new) memw(##$global) = $src2",
2551 // 64 bit atomic store
2552 def : Pat <(atomic_store_64 (HexagonCONST32_GP tglobaladdr:$global),
2553 (i64 DoubleRegs:$src1)),
2554 (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>,
2557 // Map from store(globaladdress) -> memd(#foo)
2558 let AddedComplexity = 100 in
2559 def : Pat <(store (i64 DoubleRegs:$src1),
2560 (HexagonCONST32_GP tglobaladdr:$global)),
2561 (STd_GP_V4 tglobaladdr:$global, (i64 DoubleRegs:$src1))>,
2564 // 8 bit atomic store
2565 def : Pat < (atomic_store_8 (HexagonCONST32_GP tglobaladdr:$global),
2566 (i32 IntRegs:$src1)),
2567 (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2570 // Map from store(globaladdress) -> memb(#foo)
2571 let AddedComplexity = 100 in
2572 def : Pat<(truncstorei8 (i32 IntRegs:$src1),
2573 (HexagonCONST32_GP tglobaladdr:$global)),
2574 (STb_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2577 // Map from "i1 = constant<-1>; memw(CONST32(#foo)) = i1"
2578 // to "r0 = 1; memw(#foo) = r0"
2579 let AddedComplexity = 100 in
2580 def : Pat<(store (i1 -1), (HexagonCONST32_GP tglobaladdr:$global)),
2581 (STb_GP_V4 tglobaladdr:$global, (TFRI 1))>,
2584 def : Pat<(atomic_store_16 (HexagonCONST32_GP tglobaladdr:$global),
2585 (i32 IntRegs:$src1)),
2586 (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2589 // Map from store(globaladdress) -> memh(#foo)
2590 let AddedComplexity = 100 in
2591 def : Pat<(truncstorei16 (i32 IntRegs:$src1),
2592 (HexagonCONST32_GP tglobaladdr:$global)),
2593 (STh_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2596 // 32 bit atomic store
2597 def : Pat<(atomic_store_32 (HexagonCONST32_GP tglobaladdr:$global),
2598 (i32 IntRegs:$src1)),
2599 (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2602 // Map from store(globaladdress) -> memw(#foo)
2603 let AddedComplexity = 100 in
2604 def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32_GP tglobaladdr:$global)),
2605 (STw_GP_V4 tglobaladdr:$global, (i32 IntRegs:$src1))>,
2608 def : Pat<(atomic_store_64 (add (HexagonCONST32_GP tglobaladdr:$global),
2609 u16ImmPred:$offset),
2610 (i64 DoubleRegs:$src1)),
2611 (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2612 (i64 DoubleRegs:$src1))>,
2615 def : Pat<(atomic_store_32 (add (HexagonCONST32_GP tglobaladdr:$global),
2616 u16ImmPred:$offset),
2617 (i32 IntRegs:$src1)),
2618 (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2619 (i32 IntRegs:$src1))>,
2622 def : Pat<(atomic_store_16 (add (HexagonCONST32_GP tglobaladdr:$global),
2623 u16ImmPred:$offset),
2624 (i32 IntRegs:$src1)),
2625 (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2626 (i32 IntRegs:$src1))>,
2629 def : Pat<(atomic_store_8 (add (HexagonCONST32_GP tglobaladdr:$global),
2630 u16ImmPred:$offset),
2631 (i32 IntRegs:$src1)),
2632 (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2633 (i32 IntRegs:$src1))>,
2636 // Map from store(globaladdress + x) -> memd(#foo + x)
2637 let AddedComplexity = 100 in
2638 def : Pat<(store (i64 DoubleRegs:$src1),
2639 (add (HexagonCONST32_GP tglobaladdr:$global),
2640 u16ImmPred:$offset)),
2641 (STrid_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2642 (i64 DoubleRegs:$src1))>,
2645 // Map from store(globaladdress + x) -> memb(#foo + x)
2646 let AddedComplexity = 100 in
2647 def : Pat<(truncstorei8 (i32 IntRegs:$src1),
2648 (add (HexagonCONST32_GP tglobaladdr:$global),
2649 u16ImmPred:$offset)),
2650 (STrib_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2651 (i32 IntRegs:$src1))>,
2654 // Map from store(globaladdress + x) -> memh(#foo + x)
2655 let AddedComplexity = 100 in
2656 def : Pat<(truncstorei16 (i32 IntRegs:$src1),
2657 (add (HexagonCONST32_GP tglobaladdr:$global),
2658 u16ImmPred:$offset)),
2659 (STrih_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2660 (i32 IntRegs:$src1))>,
2663 // Map from store(globaladdress + x) -> memw(#foo + x)
2664 let AddedComplexity = 100 in
2665 def : Pat<(store (i32 IntRegs:$src1),
2666 (add (HexagonCONST32_GP tglobaladdr:$global),
2667 u16ImmPred:$offset)),
2668 (STriw_GP_V4 tglobaladdr:$global, u16ImmPred:$offset,
2669 (i32 IntRegs:$src1))>,
2674 //===----------------------------------------------------------------------===
2676 //===----------------------------------------------------------------------===
2679 //===----------------------------------------------------------------------===//
2681 //===----------------------------------------------------------------------===//
2683 // Store new-value byte.
2685 // memb(Re=#U6)=Nt.new
2686 // memb(Rs+#s11:0)=Nt.new
2687 let mayStore = 1, isPredicable = 1 in
2688 def STrib_nv_V4 : NVInst_V4<(outs), (ins MEMri:$addr, IntRegs:$src1),
2689 "memb($addr) = $src1.new",
2693 let mayStore = 1, isPredicable = 1 in
2694 def STrib_indexed_nv_V4 : NVInst_V4<(outs),
2695 (ins IntRegs:$src1, s11_0Imm:$src2, IntRegs:$src3),
2696 "memb($src1+#$src2) = $src3.new",
2700 // memb(Rs+Ru<<#u2)=Nt.new
2701 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in
2702 def STrib_indexed_shl_nv_V4 : NVInst_V4<(outs),
2703 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
2704 "memb($src1+$src2<<#$src3) = $src4.new",
2708 // memb(Ru<<#u2+#U6)=Nt.new
2709 let mayStore = 1, AddedComplexity = 10 in
2710 def STrib_shl_nv_V4 : NVInst_V4<(outs),
2711 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
2712 "memb($src1<<#$src2+#$src3) = $src4.new",
2716 // memb(Rx++#s4:0)=Nt.new
2717 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in
2718 def POST_STbri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2719 (ins IntRegs:$src1, IntRegs:$src2, s4_0Imm:$offset),
2720 "memb($src2++#$offset) = $src1.new",
2725 // memb(Rx++#s4:0:circ(Mu))=Nt.new
2726 // memb(Rx++I:circ(Mu))=Nt.new
2727 // memb(Rx++Mu)=Nt.new
2728 // memb(Rx++Mu:brev)=Nt.new
2730 // memb(gp+#u16:0)=Nt.new
2731 let mayStore = 1, neverHasSideEffects = 1 in
2732 def STrib_GP_nv_V4 : NVInst_V4<(outs),
2733 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2734 "memb(#$global+$offset) = $src.new",
2738 // memb(#global)=Nt.new
2739 let mayStore = 1, neverHasSideEffects = 1 in
2740 def STb_GP_nv_V4 : NVInst_V4<(outs),
2741 (ins globaladdress:$global, IntRegs:$src),
2742 "memb(#$global) = $src.new",
2746 // Store new-value byte conditionally.
2747 // if ([!]Pv[.new]) memb(#u6)=Nt.new
2748 // if (Pv) memb(Rs+#u6:0)=Nt.new
2749 let mayStore = 1, neverHasSideEffects = 1,
2751 def STrib_cPt_nv_V4 : NVInst_V4<(outs),
2752 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2753 "if ($src1) memb($addr) = $src2.new",
2757 // if (Pv.new) memb(Rs+#u6:0)=Nt.new
2758 let mayStore = 1, neverHasSideEffects = 1,
2760 def STrib_cdnPt_nv_V4 : NVInst_V4<(outs),
2761 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2762 "if ($src1.new) memb($addr) = $src2.new",
2766 // if (!Pv) memb(Rs+#u6:0)=Nt.new
2767 let mayStore = 1, neverHasSideEffects = 1,
2769 def STrib_cNotPt_nv_V4 : NVInst_V4<(outs),
2770 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2771 "if (!$src1) memb($addr) = $src2.new",
2775 // if (!Pv.new) memb(Rs+#u6:0)=Nt.new
2776 let mayStore = 1, neverHasSideEffects = 1,
2778 def STrib_cdnNotPt_nv_V4 : NVInst_V4<(outs),
2779 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2780 "if (!$src1.new) memb($addr) = $src2.new",
2784 // if (Pv) memb(Rs+#u6:0)=Nt.new
2785 let mayStore = 1, neverHasSideEffects = 1,
2787 def STrib_indexed_cPt_nv_V4 : NVInst_V4<(outs),
2788 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2789 "if ($src1) memb($src2+#$src3) = $src4.new",
2793 // if (Pv.new) memb(Rs+#u6:0)=Nt.new
2794 let mayStore = 1, neverHasSideEffects = 1,
2796 def STrib_indexed_cdnPt_nv_V4 : NVInst_V4<(outs),
2797 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2798 "if ($src1.new) memb($src2+#$src3) = $src4.new",
2802 // if (!Pv) memb(Rs+#u6:0)=Nt.new
2803 let mayStore = 1, neverHasSideEffects = 1,
2805 def STrib_indexed_cNotPt_nv_V4 : NVInst_V4<(outs),
2806 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2807 "if (!$src1) memb($src2+#$src3) = $src4.new",
2811 // if (!Pv.new) memb(Rs+#u6:0)=Nt.new
2812 let mayStore = 1, neverHasSideEffects = 1,
2814 def STrib_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs),
2815 (ins PredRegs:$src1, IntRegs:$src2, u6_0Imm:$src3, IntRegs:$src4),
2816 "if (!$src1.new) memb($src2+#$src3) = $src4.new",
2821 // if ([!]Pv[.new]) memb(Rs+Ru<<#u2)=Nt.new
2822 // if (Pv) memb(Rs+Ru<<#u2)=Nt.new
2823 let mayStore = 1, AddedComplexity = 10,
2825 def STrib_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs),
2826 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2828 "if ($src1) memb($src2+$src3<<#$src4) = $src5.new",
2832 // if (Pv.new) memb(Rs+Ru<<#u2)=Nt.new
2833 let mayStore = 1, AddedComplexity = 10,
2835 def STrib_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs),
2836 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2838 "if ($src1.new) memb($src2+$src3<<#$src4) = $src5.new",
2842 // if (!Pv) memb(Rs+Ru<<#u2)=Nt.new
2843 let mayStore = 1, AddedComplexity = 10,
2845 def STrib_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs),
2846 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2848 "if (!$src1) memb($src2+$src3<<#$src4) = $src5.new",
2852 // if (!Pv.new) memb(Rs+Ru<<#u2)=Nt.new
2853 let mayStore = 1, AddedComplexity = 10,
2855 def STrib_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs),
2856 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
2858 "if (!$src1.new) memb($src2+$src3<<#$src4) = $src5.new",
2862 // if ([!]Pv[.new]) memb(Rx++#s4:0)=Nt.new
2863 // if (Pv) memb(Rx++#s4:0)=Nt.new
2864 let mayStore = 1, hasCtrlDep = 1,
2866 def POST_STbri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2867 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
2868 "if ($src1) memb($src3++#$offset) = $src2.new",
2872 // if (Pv.new) memb(Rx++#s4:0)=Nt.new
2873 let mayStore = 1, hasCtrlDep = 1,
2875 def POST_STbri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2876 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
2877 "if ($src1.new) memb($src3++#$offset) = $src2.new",
2881 // if (!Pv) memb(Rx++#s4:0)=Nt.new
2882 let mayStore = 1, hasCtrlDep = 1,
2884 def POST_STbri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2885 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
2886 "if (!$src1) memb($src3++#$offset) = $src2.new",
2890 // if (!Pv.new) memb(Rx++#s4:0)=Nt.new
2891 let mayStore = 1, hasCtrlDep = 1,
2893 def POST_STbri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2894 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_0Imm:$offset),
2895 "if (!$src1.new) memb($src3++#$offset) = $src2.new",
2900 // Store new-value halfword.
2901 // memh(Re=#U6)=Nt.new
2902 // memh(Rs+#s11:1)=Nt.new
2903 let mayStore = 1, isPredicable = 1 in
2904 def STrih_nv_V4 : NVInst_V4<(outs), (ins MEMri:$addr, IntRegs:$src1),
2905 "memh($addr) = $src1.new",
2909 let mayStore = 1, isPredicable = 1 in
2910 def STrih_indexed_nv_V4 : NVInst_V4<(outs),
2911 (ins IntRegs:$src1, s11_1Imm:$src2, IntRegs:$src3),
2912 "memh($src1+#$src2) = $src3.new",
2916 // memh(Rs+Ru<<#u2)=Nt.new
2917 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in
2918 def STrih_indexed_shl_nv_V4 : NVInst_V4<(outs),
2919 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
2920 "memh($src1+$src2<<#$src3) = $src4.new",
2924 // memh(Ru<<#u2+#U6)=Nt.new
2925 let mayStore = 1, AddedComplexity = 10 in
2926 def STrih_shl_nv_V4 : NVInst_V4<(outs),
2927 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
2928 "memh($src1<<#$src2+#$src3) = $src4.new",
2932 // memh(Rx++#s4:1)=Nt.new
2933 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in
2934 def POST_SThri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
2935 (ins IntRegs:$src1, IntRegs:$src2, s4_1Imm:$offset),
2936 "memh($src2++#$offset) = $src1.new",
2941 // memh(Rx++#s4:1:circ(Mu))=Nt.new
2942 // memh(Rx++I:circ(Mu))=Nt.new
2943 // memh(Rx++Mu)=Nt.new
2944 // memh(Rx++Mu:brev)=Nt.new
2946 // memh(gp+#u16:1)=Nt.new
2947 let mayStore = 1, neverHasSideEffects = 1 in
2948 def STrih_GP_nv_V4 : NVInst_V4<(outs),
2949 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
2950 "memh(#$global+$offset) = $src.new",
2954 // memh(#global)=Nt.new
2955 let mayStore = 1, neverHasSideEffects = 1 in
2956 def STh_GP_nv_V4 : NVInst_V4<(outs),
2957 (ins globaladdress:$global, IntRegs:$src),
2958 "memh(#$global) = $src.new",
2963 // Store new-value halfword conditionally.
2965 // if ([!]Pv[.new]) memh(#u6)=Nt.new
2967 // if ([!]Pv[.new]) memh(Rs+#u6:1)=Nt.new
2968 // if (Pv) memh(Rs+#u6:1)=Nt.new
2969 let mayStore = 1, neverHasSideEffects = 1,
2971 def STrih_cPt_nv_V4 : NVInst_V4<(outs),
2972 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2973 "if ($src1) memh($addr) = $src2.new",
2977 // if (Pv.new) memh(Rs+#u6:1)=Nt.new
2978 let mayStore = 1, neverHasSideEffects = 1,
2980 def STrih_cdnPt_nv_V4 : NVInst_V4<(outs),
2981 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2982 "if ($src1.new) memh($addr) = $src2.new",
2986 // if (!Pv) memh(Rs+#u6:1)=Nt.new
2987 let mayStore = 1, neverHasSideEffects = 1,
2989 def STrih_cNotPt_nv_V4 : NVInst_V4<(outs),
2990 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
2991 "if (!$src1) memh($addr) = $src2.new",
2995 // if (!Pv.new) memh(Rs+#u6:1)=Nt.new
2996 let mayStore = 1, neverHasSideEffects = 1,
2998 def STrih_cdnNotPt_nv_V4 : NVInst_V4<(outs),
2999 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3000 "if (!$src1.new) memh($addr) = $src2.new",
3004 // if (Pv) memh(Rs+#u6:1)=Nt.new
3005 let mayStore = 1, neverHasSideEffects = 1,
3007 def STrih_indexed_cPt_nv_V4 : NVInst_V4<(outs),
3008 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3009 "if ($src1) memh($src2+#$src3) = $src4.new",
3013 // if (Pv.new) memh(Rs+#u6:1)=Nt.new
3014 let mayStore = 1, neverHasSideEffects = 1,
3016 def STrih_indexed_cdnPt_nv_V4 : NVInst_V4<(outs),
3017 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3018 "if ($src1.new) memh($src2+#$src3) = $src4.new",
3022 // if (!Pv) memh(Rs+#u6:1)=Nt.new
3023 let mayStore = 1, neverHasSideEffects = 1,
3025 def STrih_indexed_cNotPt_nv_V4 : NVInst_V4<(outs),
3026 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3027 "if (!$src1) memh($src2+#$src3) = $src4.new",
3031 // if (!Pv.new) memh(Rs+#u6:1)=Nt.new
3032 let mayStore = 1, neverHasSideEffects = 1,
3034 def STrih_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3035 (ins PredRegs:$src1, IntRegs:$src2, u6_1Imm:$src3, IntRegs:$src4),
3036 "if (!$src1.new) memh($src2+#$src3) = $src4.new",
3040 // if ([!]Pv[.new]) memh(Rs+Ru<<#u2)=Nt.new
3041 // if (Pv) memh(Rs+Ru<<#u2)=Nt.new
3042 let mayStore = 1, AddedComplexity = 10,
3044 def STrih_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs),
3045 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3047 "if ($src1) memh($src2+$src3<<#$src4) = $src5.new",
3051 // if (Pv.new) memh(Rs+Ru<<#u2)=Nt.new
3052 let mayStore = 1, AddedComplexity = 10,
3054 def STrih_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs),
3055 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3057 "if ($src1.new) memh($src2+$src3<<#$src4) = $src5.new",
3061 // if (!Pv) memh(Rs+Ru<<#u2)=Nt.new
3062 let mayStore = 1, AddedComplexity = 10,
3064 def STrih_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs),
3065 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3067 "if (!$src1) memh($src2+$src3<<#$src4) = $src5.new",
3071 // if (!Pv.new) memh(Rs+Ru<<#u2)=Nt.new
3072 let mayStore = 1, AddedComplexity = 10,
3074 def STrih_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3075 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3077 "if (!$src1.new) memh($src2+$src3<<#$src4) = $src5.new",
3081 // if ([!]Pv[]) memh(Rx++#s4:1)=Nt.new
3082 // if (Pv) memh(Rx++#s4:1)=Nt.new
3083 let mayStore = 1, hasCtrlDep = 1,
3085 def POST_SThri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3086 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3087 "if ($src1) memh($src3++#$offset) = $src2.new",
3091 // if (Pv.new) memh(Rx++#s4:1)=Nt.new
3092 let mayStore = 1, hasCtrlDep = 1,
3094 def POST_SThri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3095 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3096 "if ($src1.new) memh($src3++#$offset) = $src2.new",
3100 // if (!Pv) memh(Rx++#s4:1)=Nt.new
3101 let mayStore = 1, hasCtrlDep = 1,
3103 def POST_SThri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3104 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3105 "if (!$src1) memh($src3++#$offset) = $src2.new",
3109 // if (!Pv.new) memh(Rx++#s4:1)=Nt.new
3110 let mayStore = 1, hasCtrlDep = 1,
3112 def POST_SThri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3113 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_1Imm:$offset),
3114 "if (!$src1.new) memh($src3++#$offset) = $src2.new",
3119 // Store new-value word.
3121 // memw(Re=#U6)=Nt.new
3122 // memw(Rs+#s11:2)=Nt.new
3123 let mayStore = 1, isPredicable = 1 in
3124 def STriw_nv_V4 : NVInst_V4<(outs),
3125 (ins MEMri:$addr, IntRegs:$src1),
3126 "memw($addr) = $src1.new",
3130 let mayStore = 1, isPredicable = 1 in
3131 def STriw_indexed_nv_V4 : NVInst_V4<(outs),
3132 (ins IntRegs:$src1, s11_2Imm:$src2, IntRegs:$src3),
3133 "memw($src1+#$src2) = $src3.new",
3137 // memw(Rs+Ru<<#u2)=Nt.new
3138 let mayStore = 1, AddedComplexity = 10, isPredicable = 1 in
3139 def STriw_indexed_shl_nv_V4 : NVInst_V4<(outs),
3140 (ins IntRegs:$src1, IntRegs:$src2, u2Imm:$src3, IntRegs:$src4),
3141 "memw($src1+$src2<<#$src3) = $src4.new",
3145 // memw(Ru<<#u2+#U6)=Nt.new
3146 let mayStore = 1, AddedComplexity = 10 in
3147 def STriw_shl_nv_V4 : NVInst_V4<(outs),
3148 (ins IntRegs:$src1, u2Imm:$src2, u6Imm:$src3, IntRegs:$src4),
3149 "memw($src1<<#$src2+#$src3) = $src4.new",
3153 // memw(Rx++#s4:2)=Nt.new
3154 let mayStore = 1, hasCtrlDep = 1, isPredicable = 1 in
3155 def POST_STwri_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3156 (ins IntRegs:$src1, IntRegs:$src2, s4_2Imm:$offset),
3157 "memw($src2++#$offset) = $src1.new",
3162 // memw(Rx++#s4:2:circ(Mu))=Nt.new
3163 // memw(Rx++I:circ(Mu))=Nt.new
3164 // memw(Rx++Mu)=Nt.new
3165 // memw(Rx++Mu:brev)=Nt.new
3166 // memw(gp+#u16:2)=Nt.new
3167 let mayStore = 1, neverHasSideEffects = 1 in
3168 def STriw_GP_nv_V4 : NVInst_V4<(outs),
3169 (ins globaladdress:$global, u16Imm:$offset, IntRegs:$src),
3170 "memw(#$global+$offset) = $src.new",
3174 let mayStore = 1, neverHasSideEffects = 1 in
3175 def STw_GP_nv_V4 : NVInst_V4<(outs),
3176 (ins globaladdress:$global, IntRegs:$src),
3177 "memw(#$global) = $src.new",
3181 // Store new-value word conditionally.
3183 // if ([!]Pv[.new]) memw(#u6)=Nt.new
3185 // if ([!]Pv[.new]) memw(Rs+#u6:2)=Nt.new
3186 // if (Pv) memw(Rs+#u6:2)=Nt.new
3187 let mayStore = 1, neverHasSideEffects = 1,
3189 def STriw_cPt_nv_V4 : NVInst_V4<(outs),
3190 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3191 "if ($src1) memw($addr) = $src2.new",
3195 // if (Pv.new) memw(Rs+#u6:2)=Nt.new
3196 let mayStore = 1, neverHasSideEffects = 1,
3198 def STriw_cdnPt_nv_V4 : NVInst_V4<(outs),
3199 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3200 "if ($src1.new) memw($addr) = $src2.new",
3204 // if (!Pv) memw(Rs+#u6:2)=Nt.new
3205 let mayStore = 1, neverHasSideEffects = 1,
3207 def STriw_cNotPt_nv_V4 : NVInst_V4<(outs),
3208 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3209 "if (!$src1) memw($addr) = $src2.new",
3213 // if (!Pv.new) memw(Rs+#u6:2)=Nt.new
3214 let mayStore = 1, neverHasSideEffects = 1,
3216 def STriw_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3217 (ins PredRegs:$src1, MEMri:$addr, IntRegs:$src2),
3218 "if (!$src1.new) memw($addr) = $src2.new",
3222 // if (Pv) memw(Rs+#u6:2)=Nt.new
3223 let mayStore = 1, neverHasSideEffects = 1,
3225 def STriw_indexed_cPt_nv_V4 : NVInst_V4<(outs),
3226 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3227 "if ($src1) memw($src2+#$src3) = $src4.new",
3231 // if (Pv.new) memw(Rs+#u6:2)=Nt.new
3232 let mayStore = 1, neverHasSideEffects = 1,
3234 def STriw_indexed_cdnPt_nv_V4 : NVInst_V4<(outs),
3235 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3236 "if ($src1.new) memw($src2+#$src3) = $src4.new",
3240 // if (!Pv) memw(Rs+#u6:2)=Nt.new
3241 let mayStore = 1, neverHasSideEffects = 1,
3243 def STriw_indexed_cNotPt_nv_V4 : NVInst_V4<(outs),
3244 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3245 "if (!$src1) memw($src2+#$src3) = $src4.new",
3249 // if (!Pv.new) memw(Rs+#u6:2)=Nt.new
3250 let mayStore = 1, neverHasSideEffects = 1,
3252 def STriw_indexed_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3253 (ins PredRegs:$src1, IntRegs:$src2, u6_2Imm:$src3, IntRegs:$src4),
3254 "if (!$src1.new) memw($src2+#$src3) = $src4.new",
3259 // if ([!]Pv[.new]) memw(Rs+Ru<<#u2)=Nt.new
3260 // if (Pv) memw(Rs+Ru<<#u2)=Nt.new
3261 let mayStore = 1, AddedComplexity = 10,
3263 def STriw_indexed_shl_cPt_nv_V4 : NVInst_V4<(outs),
3264 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3266 "if ($src1) memw($src2+$src3<<#$src4) = $src5.new",
3270 // if (Pv.new) memw(Rs+Ru<<#u2)=Nt.new
3271 let mayStore = 1, AddedComplexity = 10,
3273 def STriw_indexed_shl_cdnPt_nv_V4 : NVInst_V4<(outs),
3274 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3276 "if ($src1.new) memw($src2+$src3<<#$src4) = $src5.new",
3280 // if (!Pv) memw(Rs+Ru<<#u2)=Nt.new
3281 let mayStore = 1, AddedComplexity = 10,
3283 def STriw_indexed_shl_cNotPt_nv_V4 : NVInst_V4<(outs),
3284 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3286 "if (!$src1) memw($src2+$src3<<#$src4) = $src5.new",
3290 // if (!Pv.new) memw(Rs+Ru<<#u2)=Nt.new
3291 let mayStore = 1, AddedComplexity = 10,
3293 def STriw_indexed_shl_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3294 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, u2Imm:$src4,
3296 "if (!$src1.new) memw($src2+$src3<<#$src4) = $src5.new",
3300 // if ([!]Pv[.new]) memw(Rx++#s4:2)=Nt.new
3301 // if (Pv) memw(Rx++#s4:2)=Nt.new
3302 let mayStore = 1, hasCtrlDep = 1,
3304 def POST_STwri_cPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3305 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3306 "if ($src1) memw($src3++#$offset) = $src2.new",
3310 // if (Pv.new) memw(Rx++#s4:2)=Nt.new
3311 let mayStore = 1, hasCtrlDep = 1,
3313 def POST_STwri_cdnPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3314 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3315 "if ($src1.new) memw($src3++#$offset) = $src2.new",
3319 // if (!Pv) memw(Rx++#s4:2)=Nt.new
3320 let mayStore = 1, hasCtrlDep = 1,
3322 def POST_STwri_cNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3323 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3324 "if (!$src1) memw($src3++#$offset) = $src2.new",
3328 // if (!Pv.new) memw(Rx++#s4:2)=Nt.new
3329 let mayStore = 1, hasCtrlDep = 1,
3331 def POST_STwri_cdnNotPt_nv_V4 : NVInstPI_V4<(outs IntRegs:$dst),
3332 (ins PredRegs:$src1, IntRegs:$src2, IntRegs:$src3, s4_2Imm:$offset),
3333 "if (!$src1.new) memw($src3++#$offset) = $src2.new",
3339 // if (Pv) memb(##global) = Rt
3340 let mayStore = 1, neverHasSideEffects = 1 in
3341 def STb_GP_cPt_nv_V4 : NVInst_V4<(outs),
3342 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3343 "if ($src1) memb(##$global) = $src2.new",
3347 // if (!Pv) memb(##global) = Rt
3348 let mayStore = 1, neverHasSideEffects = 1 in
3349 def STb_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3350 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3351 "if (!$src1) memb(##$global) = $src2.new",
3355 // if (Pv) memb(##global) = Rt
3356 let mayStore = 1, neverHasSideEffects = 1 in
3357 def STb_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3358 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3359 "if ($src1.new) memb(##$global) = $src2.new",
3363 // if (!Pv) memb(##global) = Rt
3364 let mayStore = 1, neverHasSideEffects = 1 in
3365 def STb_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3366 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3367 "if (!$src1.new) memb(##$global) = $src2.new",
3371 // if (Pv) memh(##global) = Rt
3372 let mayStore = 1, neverHasSideEffects = 1 in
3373 def STh_GP_cPt_nv_V4 : NVInst_V4<(outs),
3374 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3375 "if ($src1) memh(##$global) = $src2.new",
3379 // if (!Pv) memh(##global) = Rt
3380 let mayStore = 1, neverHasSideEffects = 1 in
3381 def STh_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3382 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3383 "if (!$src1) memh(##$global) = $src2.new",
3387 // if (Pv) memh(##global) = Rt
3388 let mayStore = 1, neverHasSideEffects = 1 in
3389 def STh_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3390 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3391 "if ($src1.new) memh(##$global) = $src2.new",
3395 // if (!Pv) memh(##global) = Rt
3396 let mayStore = 1, neverHasSideEffects = 1 in
3397 def STh_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3398 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3399 "if (!$src1.new) memh(##$global) = $src2.new",
3403 // if (Pv) memw(##global) = Rt
3404 let mayStore = 1, neverHasSideEffects = 1 in
3405 def STw_GP_cPt_nv_V4 : NVInst_V4<(outs),
3406 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3407 "if ($src1) memw(##$global) = $src2.new",
3411 // if (!Pv) memw(##global) = Rt
3412 let mayStore = 1, neverHasSideEffects = 1 in
3413 def STw_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3414 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3415 "if (!$src1) memw(##$global) = $src2.new",
3419 // if (Pv) memw(##global) = Rt
3420 let mayStore = 1, neverHasSideEffects = 1 in
3421 def STw_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3422 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3423 "if ($src1.new) memw(##$global) = $src2.new",
3427 // if (!Pv) memw(##global) = Rt
3428 let mayStore = 1, neverHasSideEffects = 1 in
3429 def STw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3430 (ins PredRegs:$src1, globaladdress:$global, IntRegs:$src2),
3431 "if (!$src1.new) memw(##$global) = $src2.new",
3435 let mayStore = 1, neverHasSideEffects = 1 in
3436 def STrib_GP_cPt_nv_V4 : NVInst_V4<(outs),
3437 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3439 "if ($src1) memb(##$global+$offset) = $src2.new",
3443 let mayStore = 1, neverHasSideEffects = 1 in
3444 def STrib_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3445 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3447 "if (!$src1) memb(##$global+$offset) = $src2.new",
3451 let mayStore = 1, neverHasSideEffects = 1 in
3452 def STrib_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3453 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3455 "if ($src1.new) memb(##$global+$offset) = $src2.new",
3459 let mayStore = 1, neverHasSideEffects = 1 in
3460 def STrib_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3461 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3463 "if (!$src1.new) memb(##$global+$offset) = $src2.new",
3467 let mayStore = 1, neverHasSideEffects = 1 in
3468 def STrih_GP_cPt_nv_V4 : NVInst_V4<(outs),
3469 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3471 "if ($src1) memh(##$global+$offset) = $src2.new",
3475 let mayStore = 1, neverHasSideEffects = 1 in
3476 def STrih_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3477 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3479 "if (!$src1) memh(##$global+$offset) = $src2.new",
3483 let mayStore = 1, neverHasSideEffects = 1 in
3484 def STrih_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3485 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3487 "if ($src1.new) memh(##$global+$offset) = $src2.new",
3491 let mayStore = 1, neverHasSideEffects = 1 in
3492 def STrih_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3493 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3495 "if (!$src1.new) memh(##$global+$offset) = $src2.new",
3499 let mayStore = 1, neverHasSideEffects = 1 in
3500 def STriw_GP_cPt_nv_V4 : NVInst_V4<(outs),
3501 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3503 "if ($src1) memw(##$global+$offset) = $src2.new",
3507 let mayStore = 1, neverHasSideEffects = 1 in
3508 def STriw_GP_cNotPt_nv_V4 : NVInst_V4<(outs),
3509 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3511 "if (!$src1) memw(##$global+$offset) = $src2.new",
3515 let mayStore = 1, neverHasSideEffects = 1 in
3516 def STriw_GP_cdnPt_nv_V4 : NVInst_V4<(outs),
3517 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3519 "if ($src1.new) memw(##$global+$offset) = $src2.new",
3523 let mayStore = 1, neverHasSideEffects = 1 in
3524 def STriw_GP_cdnNotPt_nv_V4 : NVInst_V4<(outs),
3525 (ins PredRegs:$src1, globaladdress:$global, u16Imm:$offset,
3527 "if (!$src1.new) memw(##$global+$offset) = $src2.new",
3531 //===----------------------------------------------------------------------===//
3533 //===----------------------------------------------------------------------===//
3535 //===----------------------------------------------------------------------===//
3537 //===----------------------------------------------------------------------===//
3539 multiclass NVJ_type_basic_reg<string NotStr, string OpcStr, string TakenStr> {
3540 def _ie_nv_V4 : NVInst_V4<(outs),
3541 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3542 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3543 !strconcat("($src1.new, $src2)) jump:",
3544 !strconcat(TakenStr, " $offset"))))),
3548 def _nv_V4 : NVInst_V4<(outs),
3549 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3550 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3551 !strconcat("($src1.new, $src2)) jump:",
3552 !strconcat(TakenStr, " $offset"))))),
3557 multiclass NVJ_type_basic_2ndDotNew<string NotStr, string OpcStr,
3559 def _ie_nv_V4 : NVInst_V4<(outs),
3560 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3561 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3562 !strconcat("($src1, $src2.new)) jump:",
3563 !strconcat(TakenStr, " $offset"))))),
3567 def _nv_V4 : NVInst_V4<(outs),
3568 (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset),
3569 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3570 !strconcat("($src1, $src2.new)) jump:",
3571 !strconcat(TakenStr, " $offset"))))),
3576 multiclass NVJ_type_basic_imm<string NotStr, string OpcStr, string TakenStr> {
3577 def _ie_nv_V4 : NVInst_V4<(outs),
3578 (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset),
3579 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3580 !strconcat("($src1.new, #$src2)) jump:",
3581 !strconcat(TakenStr, " $offset"))))),
3585 def _nv_V4 : NVInst_V4<(outs),
3586 (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset),
3587 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3588 !strconcat("($src1.new, #$src2)) jump:",
3589 !strconcat(TakenStr, " $offset"))))),
3594 multiclass NVJ_type_basic_neg<string NotStr, string OpcStr, string TakenStr> {
3595 def _ie_nv_V4 : NVInst_V4<(outs),
3596 (ins IntRegs:$src1, nOneImm:$src2, brtarget:$offset),
3597 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3598 !strconcat("($src1.new, #$src2)) jump:",
3599 !strconcat(TakenStr, " $offset"))))),
3603 def _nv_V4 : NVInst_V4<(outs),
3604 (ins IntRegs:$src1, nOneImm:$src2, brtarget:$offset),
3605 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3606 !strconcat("($src1.new, #$src2)) jump:",
3607 !strconcat(TakenStr, " $offset"))))),
3612 multiclass NVJ_type_basic_tstbit<string NotStr, string OpcStr,
3614 def _ie_nv_V4 : NVInst_V4<(outs),
3615 (ins IntRegs:$src1, u1Imm:$src2, brtarget:$offset),
3616 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3617 !strconcat("($src1.new, #$src2)) jump:",
3618 !strconcat(TakenStr, " $offset"))))),
3622 def _nv_V4 : NVInst_V4<(outs),
3623 (ins IntRegs:$src1, u1Imm:$src2, brtarget:$offset),
3624 !strconcat("if (", !strconcat(NotStr, !strconcat(OpcStr,
3625 !strconcat("($src1.new, #$src2)) jump:",
3626 !strconcat(TakenStr, " $offset"))))),
3631 // Multiclass for regular dot new of Ist operand register.
3632 multiclass NVJ_type_br_pred_reg<string NotStr, string OpcStr> {
3633 defm Pt : NVJ_type_basic_reg<NotStr, OpcStr, "t">;
3634 defm Pnt : NVJ_type_basic_reg<NotStr, OpcStr, "nt">;
3637 // Multiclass for dot new of 2nd operand register.
3638 multiclass NVJ_type_br_pred_2ndDotNew<string NotStr, string OpcStr> {
3639 defm Pt : NVJ_type_basic_2ndDotNew<NotStr, OpcStr, "t">;
3640 defm Pnt : NVJ_type_basic_2ndDotNew<NotStr, OpcStr, "nt">;
3643 // Multiclass for 2nd operand immediate, including -1.
3644 multiclass NVJ_type_br_pred_imm<string NotStr, string OpcStr> {
3645 defm Pt : NVJ_type_basic_imm<NotStr, OpcStr, "t">;
3646 defm Pnt : NVJ_type_basic_imm<NotStr, OpcStr, "nt">;
3647 defm Ptneg : NVJ_type_basic_neg<NotStr, OpcStr, "t">;
3648 defm Pntneg : NVJ_type_basic_neg<NotStr, OpcStr, "nt">;
3651 // Multiclass for 2nd operand immediate, excluding -1.
3652 multiclass NVJ_type_br_pred_imm_only<string NotStr, string OpcStr> {
3653 defm Pt : NVJ_type_basic_imm<NotStr, OpcStr, "t">;
3654 defm Pnt : NVJ_type_basic_imm<NotStr, OpcStr, "nt">;
3657 // Multiclass for tstbit, where 2nd operand is always #0.
3658 multiclass NVJ_type_br_pred_tstbit<string NotStr, string OpcStr> {
3659 defm Pt : NVJ_type_basic_tstbit<NotStr, OpcStr, "t">;
3660 defm Pnt : NVJ_type_basic_tstbit<NotStr, OpcStr, "nt">;
3663 // Multiclass for GT.
3664 multiclass NVJ_type_rr_ri<string OpcStr> {
3665 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>;
3666 defm rr : NVJ_type_br_pred_reg<"", OpcStr>;
3667 defm rrdnNot : NVJ_type_br_pred_2ndDotNew<"!", OpcStr>;
3668 defm rrdn : NVJ_type_br_pred_2ndDotNew<"", OpcStr>;
3669 defm riNot : NVJ_type_br_pred_imm<"!", OpcStr>;
3670 defm ri : NVJ_type_br_pred_imm<"", OpcStr>;
3673 // Multiclass for EQ.
3674 multiclass NVJ_type_rr_ri_no_2ndDotNew<string OpcStr> {
3675 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>;
3676 defm rr : NVJ_type_br_pred_reg<"", OpcStr>;
3677 defm riNot : NVJ_type_br_pred_imm<"!", OpcStr>;
3678 defm ri : NVJ_type_br_pred_imm<"", OpcStr>;
3681 // Multiclass for GTU.
3682 multiclass NVJ_type_rr_ri_no_nOne<string OpcStr> {
3683 defm rrNot : NVJ_type_br_pred_reg<"!", OpcStr>;
3684 defm rr : NVJ_type_br_pred_reg<"", OpcStr>;
3685 defm rrdnNot : NVJ_type_br_pred_2ndDotNew<"!", OpcStr>;
3686 defm rrdn : NVJ_type_br_pred_2ndDotNew<"", OpcStr>;
3687 defm riNot : NVJ_type_br_pred_imm_only<"!", OpcStr>;
3688 defm ri : NVJ_type_br_pred_imm_only<"", OpcStr>;
3691 // Multiclass for tstbit.
3692 multiclass NVJ_type_r0<string OpcStr> {
3693 defm r0Not : NVJ_type_br_pred_tstbit<"!", OpcStr>;
3694 defm r0 : NVJ_type_br_pred_tstbit<"", OpcStr>;
3697 // Base Multiclass for New Value Jump.
3698 multiclass NVJ_type {
3699 defm GT : NVJ_type_rr_ri<"cmp.gt">;
3700 defm EQ : NVJ_type_rr_ri_no_2ndDotNew<"cmp.eq">;
3701 defm GTU : NVJ_type_rr_ri_no_nOne<"cmp.gtu">;
3702 defm TSTBIT : NVJ_type_r0<"tstbit">;
3705 let isBranch = 1, isTerminator=1, neverHasSideEffects = 1, Defs = [PC] in {
3706 defm JMP_ : NVJ_type;
3709 //===----------------------------------------------------------------------===//
3711 //===----------------------------------------------------------------------===//
3713 //===----------------------------------------------------------------------===//
3715 //===----------------------------------------------------------------------===//
3717 // Add and accumulate.
3718 // Rd=add(Rs,add(Ru,#s6))
3719 def ADDr_ADDri_V4 : MInst<(outs IntRegs:$dst),
3720 (ins IntRegs:$src1, IntRegs:$src2, s6Imm:$src3),
3721 "$dst = add($src1, add($src2, #$src3))",
3722 [(set (i32 IntRegs:$dst),
3723 (add (i32 IntRegs:$src1), (add (i32 IntRegs:$src2),
3724 s6ImmPred:$src3)))]>,
3727 // Rd=add(Rs,sub(#s6,Ru))
3728 def ADDr_SUBri_V4 : MInst<(outs IntRegs:$dst),
3729 (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3),
3730 "$dst = add($src1, sub(#$src2, $src3))",
3731 [(set (i32 IntRegs:$dst),
3732 (add (i32 IntRegs:$src1), (sub s6ImmPred:$src2,
3733 (i32 IntRegs:$src3))))]>,
3736 // Generates the same instruction as ADDr_SUBri_V4 but matches different
3738 // Rd=add(Rs,sub(#s6,Ru))
3739 def ADDri_SUBr_V4 : MInst<(outs IntRegs:$dst),
3740 (ins IntRegs:$src1, s6Imm:$src2, IntRegs:$src3),
3741 "$dst = add($src1, sub(#$src2, $src3))",
3742 [(set (i32 IntRegs:$dst),
3743 (sub (add (i32 IntRegs:$src1), s6ImmPred:$src2),
3744 (i32 IntRegs:$src3)))]>,
3748 // Add or subtract doublewords with carry.
3750 // Rdd=add(Rss,Rtt,Px):carry
3752 // Rdd=sub(Rss,Rtt,Px):carry
3755 // Logical doublewords.
3756 // Rdd=and(Rtt,~Rss)
3757 def ANDd_NOTd_V4 : MInst<(outs DoubleRegs:$dst),
3758 (ins DoubleRegs:$src1, DoubleRegs:$src2),
3759 "$dst = and($src1, ~$src2)",
3760 [(set (i64 DoubleRegs:$dst), (and (i64 DoubleRegs:$src1),
3761 (not (i64 DoubleRegs:$src2))))]>,
3765 def ORd_NOTd_V4 : MInst<(outs DoubleRegs:$dst),
3766 (ins DoubleRegs:$src1, DoubleRegs:$src2),
3767 "$dst = or($src1, ~$src2)",
3768 [(set (i64 DoubleRegs:$dst),
3769 (or (i64 DoubleRegs:$src1), (not (i64 DoubleRegs:$src2))))]>,
3773 // Logical-logical doublewords.
3774 // Rxx^=xor(Rss,Rtt)
3775 def XORd_XORdd: MInst_acc<(outs DoubleRegs:$dst),
3776 (ins DoubleRegs:$src1, DoubleRegs:$src2, DoubleRegs:$src3),
3777 "$dst ^= xor($src2, $src3)",
3778 [(set (i64 DoubleRegs:$dst),
3779 (xor (i64 DoubleRegs:$src1), (xor (i64 DoubleRegs:$src2),
3780 (i64 DoubleRegs:$src3))))],
3785 // Logical-logical words.
3786 // Rx=or(Ru,and(Rx,#s10))
3787 def ORr_ANDri_V4 : MInst_acc<(outs IntRegs:$dst),
3788 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3),
3789 "$dst = or($src1, and($src2, #$src3))",
3790 [(set (i32 IntRegs:$dst),
3791 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3792 s10ImmPred:$src3)))],
3796 // Rx[&|^]=and(Rs,Rt)
3798 def ANDr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst),
3799 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3800 "$dst &= and($src2, $src3)",
3801 [(set (i32 IntRegs:$dst),
3802 (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3803 (i32 IntRegs:$src3))))],
3808 def ORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst),
3809 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3810 "$dst |= and($src2, $src3)",
3811 [(set (i32 IntRegs:$dst),
3812 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3813 (i32 IntRegs:$src3))))],
3818 def XORr_ANDrr_V4 : MInst_acc<(outs IntRegs:$dst),
3819 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3820 "$dst ^= and($src2, $src3)",
3821 [(set (i32 IntRegs:$dst),
3822 (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3823 (i32 IntRegs:$src3))))],
3827 // Rx[&|^]=and(Rs,~Rt)
3829 def ANDr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst),
3830 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3831 "$dst &= and($src2, ~$src3)",
3832 [(set (i32 IntRegs:$dst),
3833 (and (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3834 (not (i32 IntRegs:$src3)))))],
3839 def ORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst),
3840 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3841 "$dst |= and($src2, ~$src3)",
3842 [(set (i32 IntRegs:$dst),
3843 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3844 (not (i32 IntRegs:$src3)))))],
3849 def XORr_ANDr_NOTr_V4 : MInst_acc<(outs IntRegs:$dst),
3850 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3851 "$dst ^= and($src2, ~$src3)",
3852 [(set (i32 IntRegs:$dst),
3853 (xor (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3854 (not (i32 IntRegs:$src3)))))],
3858 // Rx[&|^]=or(Rs,Rt)
3860 def ANDr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst),
3861 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3862 "$dst &= or($src2, $src3)",
3863 [(set (i32 IntRegs:$dst),
3864 (and (i32 IntRegs:$src1), (or (i32 IntRegs:$src2),
3865 (i32 IntRegs:$src3))))],
3870 def ORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst),
3871 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3872 "$dst |= or($src2, $src3)",
3873 [(set (i32 IntRegs:$dst),
3874 (or (i32 IntRegs:$src1), (or (i32 IntRegs:$src2),
3875 (i32 IntRegs:$src3))))],
3880 def XORr_ORrr_V4 : MInst_acc<(outs IntRegs:$dst),
3881 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3882 "$dst ^= or($src2, $src3)",
3883 [(set (i32 IntRegs:$dst),
3884 (xor (i32 IntRegs:$src1), (or (i32 IntRegs:$src2),
3885 (i32 IntRegs:$src3))))],
3889 // Rx[&|^]=xor(Rs,Rt)
3891 def ANDr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst),
3892 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3893 "$dst &= xor($src2, $src3)",
3894 [(set (i32 IntRegs:$dst),
3895 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2),
3896 (i32 IntRegs:$src3))))],
3901 def ORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst),
3902 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3903 "$dst |= xor($src2, $src3)",
3904 [(set (i32 IntRegs:$dst),
3905 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2),
3906 (i32 IntRegs:$src3))))],
3911 def XORr_XORrr_V4 : MInst_acc<(outs IntRegs:$dst),
3912 (ins IntRegs:$src1, IntRegs: $src2, IntRegs:$src3),
3913 "$dst ^= xor($src2, $src3)",
3914 [(set (i32 IntRegs:$dst),
3915 (and (i32 IntRegs:$src1), (xor (i32 IntRegs:$src2),
3916 (i32 IntRegs:$src3))))],
3921 def ORr_ANDri2_V4 : MInst_acc<(outs IntRegs:$dst),
3922 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3),
3923 "$dst |= and($src2, #$src3)",
3924 [(set (i32 IntRegs:$dst),
3925 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3926 s10ImmPred:$src3)))],
3931 def ORr_ORri_V4 : MInst_acc<(outs IntRegs:$dst),
3932 (ins IntRegs:$src1, IntRegs: $src2, s10Imm:$src3),
3933 "$dst |= or($src2, #$src3)",
3934 [(set (i32 IntRegs:$dst),
3935 (or (i32 IntRegs:$src1), (and (i32 IntRegs:$src2),
3936 s10ImmPred:$src3)))],
3942 // Rd=modwrap(Rs,Rt)
3944 // Rd=cround(Rs,#u5)
3946 // Rd=round(Rs,#u5)[:sat]
3947 // Rd=round(Rs,Rt)[:sat]
3948 // Vector reduce add unsigned halfwords
3949 // Rd=vraddh(Rss,Rtt)
3951 // Rdd=vaddb(Rss,Rtt)
3952 // Vector conditional negate
3953 // Rdd=vcnegh(Rss,Rt)
3954 // Rxx+=vrcnegh(Rss,Rt)
3955 // Vector maximum bytes
3956 // Rdd=vmaxb(Rtt,Rss)
3957 // Vector reduce maximum halfwords
3958 // Rxx=vrmaxh(Rss,Ru)
3959 // Rxx=vrmaxuh(Rss,Ru)
3960 // Vector reduce maximum words
3961 // Rxx=vrmaxuw(Rss,Ru)
3962 // Rxx=vrmaxw(Rss,Ru)
3963 // Vector minimum bytes
3964 // Rdd=vminb(Rtt,Rss)
3965 // Vector reduce minimum halfwords
3966 // Rxx=vrminh(Rss,Ru)
3967 // Rxx=vrminuh(Rss,Ru)
3968 // Vector reduce minimum words
3969 // Rxx=vrminuw(Rss,Ru)
3970 // Rxx=vrminw(Rss,Ru)
3971 // Vector subtract bytes
3972 // Rdd=vsubb(Rss,Rtt)
3974 //===----------------------------------------------------------------------===//
3976 //===----------------------------------------------------------------------===//
3979 //===----------------------------------------------------------------------===//
3981 //===----------------------------------------------------------------------===//
3983 // Multiply and user lower result.
3984 // Rd=add(#u6,mpyi(Rs,#U6))
3985 def ADDi_MPYri_V4 : MInst<(outs IntRegs:$dst),
3986 (ins u6Imm:$src1, IntRegs:$src2, u6Imm:$src3),
3987 "$dst = add(#$src1, mpyi($src2, #$src3))",
3988 [(set (i32 IntRegs:$dst),
3989 (add (mul (i32 IntRegs:$src2), u6ImmPred:$src3),
3990 u6ImmPred:$src1))]>,
3993 // Rd=add(#u6,mpyi(Rs,Rt))
3995 def ADDi_MPYrr_V4 : MInst<(outs IntRegs:$dst),
3996 (ins u6Imm:$src1, IntRegs:$src2, IntRegs:$src3),
3997 "$dst = add(#$src1, mpyi($src2, $src3))",
3998 [(set (i32 IntRegs:$dst),
3999 (add (mul (i32 IntRegs:$src2), (i32 IntRegs:$src3)),
4000 u6ImmPred:$src1))]>,
4003 // Rd=add(Ru,mpyi(#u6:2,Rs))
4004 def ADDr_MPYir_V4 : MInst<(outs IntRegs:$dst),
4005 (ins IntRegs:$src1, u6Imm:$src2, IntRegs:$src3),
4006 "$dst = add($src1, mpyi(#$src2, $src3))",
4007 [(set (i32 IntRegs:$dst),
4008 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src3),
4009 u6_2ImmPred:$src2)))]>,
4012 // Rd=add(Ru,mpyi(Rs,#u6))
4013 def ADDr_MPYri_V4 : MInst<(outs IntRegs:$dst),
4014 (ins IntRegs:$src1, IntRegs:$src2, u6Imm:$src3),
4015 "$dst = add($src1, mpyi($src2, #$src3))",
4016 [(set (i32 IntRegs:$dst),
4017 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2),
4018 u6ImmPred:$src3)))]>,
4021 // Rx=add(Ru,mpyi(Rx,Rs))
4022 def ADDr_MPYrr_V4 : MInst_acc<(outs IntRegs:$dst),
4023 (ins IntRegs:$src1, IntRegs:$src2, IntRegs:$src3),
4024 "$dst = add($src1, mpyi($src2, $src3))",
4025 [(set (i32 IntRegs:$dst),
4026 (add (i32 IntRegs:$src1), (mul (i32 IntRegs:$src2),
4027 (i32 IntRegs:$src3))))],
4032 // Polynomial multiply words
4034 // Rxx^=pmpyw(Rs,Rt)
4036 // Vector reduce multiply word by signed half (32x16)
4037 // Rdd=vrmpyweh(Rss,Rtt)[:<<1]
4038 // Rdd=vrmpywoh(Rss,Rtt)[:<<1]
4039 // Rxx+=vrmpyweh(Rss,Rtt)[:<<1]
4040 // Rxx+=vrmpywoh(Rss,Rtt)[:<<1]
4042 // Multiply and use upper result
4043 // Rd=mpy(Rs,Rt.H):<<1:sat
4044 // Rd=mpy(Rs,Rt.L):<<1:sat
4045 // Rd=mpy(Rs,Rt):<<1
4046 // Rd=mpy(Rs,Rt):<<1:sat
4048 // Rx+=mpy(Rs,Rt):<<1:sat
4049 // Rx-=mpy(Rs,Rt):<<1:sat
4051 // Vector multiply bytes
4052 // Rdd=vmpybsu(Rs,Rt)
4053 // Rdd=vmpybu(Rs,Rt)
4054 // Rxx+=vmpybsu(Rs,Rt)
4055 // Rxx+=vmpybu(Rs,Rt)
4057 // Vector polynomial multiply halfwords
4058 // Rdd=vpmpyh(Rs,Rt)
4059 // Rxx^=vpmpyh(Rs,Rt)
4061 //===----------------------------------------------------------------------===//
4063 //===----------------------------------------------------------------------===//
4066 //===----------------------------------------------------------------------===//
4068 //===----------------------------------------------------------------------===//
4070 // Shift by immediate and accumulate.
4071 // Rx=add(#u8,asl(Rx,#U5))
4072 def ADDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4073 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4074 "$dst = add(#$src1, asl($src2, #$src3))",
4075 [(set (i32 IntRegs:$dst),
4076 (add (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4081 // Rx=add(#u8,lsr(Rx,#U5))
4082 def ADDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4083 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4084 "$dst = add(#$src1, lsr($src2, #$src3))",
4085 [(set (i32 IntRegs:$dst),
4086 (add (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4091 // Rx=sub(#u8,asl(Rx,#U5))
4092 def SUBi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4093 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4094 "$dst = sub(#$src1, asl($src2, #$src3))",
4095 [(set (i32 IntRegs:$dst),
4096 (sub (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4101 // Rx=sub(#u8,lsr(Rx,#U5))
4102 def SUBi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4103 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4104 "$dst = sub(#$src1, lsr($src2, #$src3))",
4105 [(set (i32 IntRegs:$dst),
4106 (sub (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4112 //Shift by immediate and logical.
4113 //Rx=and(#u8,asl(Rx,#U5))
4114 def ANDi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4115 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4116 "$dst = and(#$src1, asl($src2, #$src3))",
4117 [(set (i32 IntRegs:$dst),
4118 (and (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4123 //Rx=and(#u8,lsr(Rx,#U5))
4124 def ANDi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4125 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4126 "$dst = and(#$src1, lsr($src2, #$src3))",
4127 [(set (i32 IntRegs:$dst),
4128 (and (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4133 //Rx=or(#u8,asl(Rx,#U5))
4134 let AddedComplexity = 30 in
4135 def ORi_ASLri_V4 : MInst_acc<(outs IntRegs:$dst),
4136 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4137 "$dst = or(#$src1, asl($src2, #$src3))",
4138 [(set (i32 IntRegs:$dst),
4139 (or (shl (i32 IntRegs:$src2), u5ImmPred:$src3),
4144 //Rx=or(#u8,lsr(Rx,#U5))
4145 let AddedComplexity = 30 in
4146 def ORi_LSRri_V4 : MInst_acc<(outs IntRegs:$dst),
4147 (ins u8Imm:$src1, IntRegs:$src2, u5Imm:$src3),
4148 "$dst = or(#$src1, lsr($src2, #$src3))",
4149 [(set (i32 IntRegs:$dst),
4150 (or (srl (i32 IntRegs:$src2), u5ImmPred:$src3),
4156 //Shift by register.
4158 def LSLi_V4 : MInst<(outs IntRegs:$dst), (ins s6Imm:$src1, IntRegs:$src2),
4159 "$dst = lsl(#$src1, $src2)",
4160 [(set (i32 IntRegs:$dst), (shl s6ImmPred:$src1,
4161 (i32 IntRegs:$src2)))]>,
4165 //Shift by register and logical.
4167 def ASLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4168 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4169 "$dst ^= asl($src2, $src3)",
4170 [(set (i64 DoubleRegs:$dst),
4171 (xor (i64 DoubleRegs:$src1), (shl (i64 DoubleRegs:$src2),
4172 (i32 IntRegs:$src3))))],
4177 def ASRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4178 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4179 "$dst ^= asr($src2, $src3)",
4180 [(set (i64 DoubleRegs:$dst),
4181 (xor (i64 DoubleRegs:$src1), (sra (i64 DoubleRegs:$src2),
4182 (i32 IntRegs:$src3))))],
4187 def LSLd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4188 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4189 "$dst ^= lsl($src2, $src3)",
4190 [(set (i64 DoubleRegs:$dst), (xor (i64 DoubleRegs:$src1),
4191 (shl (i64 DoubleRegs:$src2),
4192 (i32 IntRegs:$src3))))],
4197 def LSRd_rr_xor_V4 : MInst_acc<(outs DoubleRegs:$dst),
4198 (ins DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3),
4199 "$dst ^= lsr($src2, $src3)",
4200 [(set (i64 DoubleRegs:$dst),
4201 (xor (i64 DoubleRegs:$src1), (srl (i64 DoubleRegs:$src2),
4202 (i32 IntRegs:$src3))))],
4207 //===----------------------------------------------------------------------===//
4209 //===----------------------------------------------------------------------===//
4211 //===----------------------------------------------------------------------===//
4212 // MEMOP: Word, Half, Byte
4213 //===----------------------------------------------------------------------===//
4215 //===----------------------------------------------------------------------===//
4219 // MEMw_ADDi_indexed_V4 : memw(Rs+#u6:2)+=#U5
4220 // MEMw_SUBi_indexed_V4 : memw(Rs+#u6:2)-=#U5
4221 // MEMw_ADDr_indexed_V4 : memw(Rs+#u6:2)+=Rt
4222 // MEMw_SUBr_indexed_V4 : memw(Rs+#u6:2)-=Rt
4223 // MEMw_CLRr_indexed_V4 : memw(Rs+#u6:2)&=Rt
4224 // MEMw_SETr_indexed_V4 : memw(Rs+#u6:2)|=Rt
4225 // MEMw_ADDi_V4 : memw(Rs+#u6:2)+=#U5
4226 // MEMw_SUBi_V4 : memw(Rs+#u6:2)-=#U5
4227 // MEMw_ADDr_V4 : memw(Rs+#u6:2)+=Rt
4228 // MEMw_SUBr_V4 : memw(Rs+#u6:2)-=Rt
4229 // MEMw_CLRr_V4 : memw(Rs+#u6:2)&=Rt
4230 // MEMw_SETr_V4 : memw(Rs+#u6:2)|=Rt
4233 // MEMw_CLRi_indexed_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4234 // MEMw_SETi_indexed_V4 : memw(Rs+#u6:2)=setbit(#U5)
4235 // MEMw_CLRi_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4236 // MEMw_SETi_V4 : memw(Rs+#u6:2)=setbit(#U5)
4237 //===----------------------------------------------------------------------===//
4241 // memw(Rs+#u6:2) += #U5
4242 let AddedComplexity = 30 in
4243 def MEMw_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs),
4244 (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$addend),
4245 "memw($base+#$offset) += #$addend",
4247 Requires<[HasV4T, UseMEMOP]>;
4249 // memw(Rs+#u6:2) -= #U5
4250 let AddedComplexity = 30 in
4251 def MEMw_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs),
4252 (ins IntRegs:$base, u6_2Imm:$offset, u5Imm:$subend),
4253 "memw($base+#$offset) -= #$subend",
4255 Requires<[HasV4T, UseMEMOP]>;
4257 // memw(Rs+#u6:2) += Rt
4258 let AddedComplexity = 30 in
4259 def MEMw_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4260 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$addend),
4261 "memw($base+#$offset) += $addend",
4262 [(store (add (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4263 (i32 IntRegs:$addend)),
4264 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4265 Requires<[HasV4T, UseMEMOP]>;
4267 // memw(Rs+#u6:2) -= Rt
4268 let AddedComplexity = 30 in
4269 def MEMw_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs),
4270 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$subend),
4271 "memw($base+#$offset) -= $subend",
4272 [(store (sub (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4273 (i32 IntRegs:$subend)),
4274 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4275 Requires<[HasV4T, UseMEMOP]>;
4277 // memw(Rs+#u6:2) &= Rt
4278 let AddedComplexity = 30 in
4279 def MEMw_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4280 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$andend),
4281 "memw($base+#$offset) &= $andend",
4282 [(store (and (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4283 (i32 IntRegs:$andend)),
4284 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4285 Requires<[HasV4T, UseMEMOP]>;
4287 // memw(Rs+#u6:2) |= Rt
4288 let AddedComplexity = 30 in
4289 def MEMw_ORr_indexed_MEM_V4 : MEMInst_V4<(outs),
4290 (ins IntRegs:$base, u6_2Imm:$offset, IntRegs:$orend),
4291 "memw($base+#$offset) |= $orend",
4292 [(store (or (load (add (i32 IntRegs:$base), u6_2ImmPred:$offset)),
4293 (i32 IntRegs:$orend)),
4294 (add (i32 IntRegs:$base), u6_2ImmPred:$offset))]>,
4295 Requires<[HasV4T, UseMEMOP]>;
4297 // memw(Rs+#u6:2) += #U5
4298 let AddedComplexity = 30 in
4299 def MEMw_ADDi_MEM_V4 : MEMInst_V4<(outs),
4300 (ins MEMri:$addr, u5Imm:$addend),
4301 "memw($addr) += $addend",
4303 Requires<[HasV4T, UseMEMOP]>;
4305 // memw(Rs+#u6:2) -= #U5
4306 let AddedComplexity = 30 in
4307 def MEMw_SUBi_MEM_V4 : MEMInst_V4<(outs),
4308 (ins MEMri:$addr, u5Imm:$subend),
4309 "memw($addr) -= $subend",
4311 Requires<[HasV4T, UseMEMOP]>;
4313 // memw(Rs+#u6:2) += Rt
4314 let AddedComplexity = 30 in
4315 def MEMw_ADDr_MEM_V4 : MEMInst_V4<(outs),
4316 (ins MEMri:$addr, IntRegs:$addend),
4317 "memw($addr) += $addend",
4318 [(store (add (load ADDRriU6_2:$addr), (i32 IntRegs:$addend)),
4319 ADDRriU6_2:$addr)]>,
4320 Requires<[HasV4T, UseMEMOP]>;
4322 // memw(Rs+#u6:2) -= Rt
4323 let AddedComplexity = 30 in
4324 def MEMw_SUBr_MEM_V4 : MEMInst_V4<(outs),
4325 (ins MEMri:$addr, IntRegs:$subend),
4326 "memw($addr) -= $subend",
4327 [(store (sub (load ADDRriU6_2:$addr), (i32 IntRegs:$subend)),
4328 ADDRriU6_2:$addr)]>,
4329 Requires<[HasV4T, UseMEMOP]>;
4331 // memw(Rs+#u6:2) &= Rt
4332 let AddedComplexity = 30 in
4333 def MEMw_ANDr_MEM_V4 : MEMInst_V4<(outs),
4334 (ins MEMri:$addr, IntRegs:$andend),
4335 "memw($addr) &= $andend",
4336 [(store (and (load ADDRriU6_2:$addr), (i32 IntRegs:$andend)),
4337 ADDRriU6_2:$addr)]>,
4338 Requires<[HasV4T, UseMEMOP]>;
4340 // memw(Rs+#u6:2) |= Rt
4341 let AddedComplexity = 30 in
4342 def MEMw_ORr_MEM_V4 : MEMInst_V4<(outs),
4343 (ins MEMri:$addr, IntRegs:$orend),
4344 "memw($addr) |= $orend",
4345 [(store (or (load ADDRriU6_2:$addr), (i32 IntRegs:$orend)),
4346 ADDRriU6_2:$addr)]>,
4347 Requires<[HasV4T, UseMEMOP]>;
4349 //===----------------------------------------------------------------------===//
4353 // MEMh_ADDi_indexed_V4 : memw(Rs+#u6:2)+=#U5
4354 // MEMh_SUBi_indexed_V4 : memw(Rs+#u6:2)-=#U5
4355 // MEMh_ADDr_indexed_V4 : memw(Rs+#u6:2)+=Rt
4356 // MEMh_SUBr_indexed_V4 : memw(Rs+#u6:2)-=Rt
4357 // MEMh_CLRr_indexed_V4 : memw(Rs+#u6:2)&=Rt
4358 // MEMh_SETr_indexed_V4 : memw(Rs+#u6:2)|=Rt
4359 // MEMh_ADDi_V4 : memw(Rs+#u6:2)+=#U5
4360 // MEMh_SUBi_V4 : memw(Rs+#u6:2)-=#U5
4361 // MEMh_ADDr_V4 : memw(Rs+#u6:2)+=Rt
4362 // MEMh_SUBr_V4 : memw(Rs+#u6:2)-=Rt
4363 // MEMh_CLRr_V4 : memw(Rs+#u6:2)&=Rt
4364 // MEMh_SETr_V4 : memw(Rs+#u6:2)|=Rt
4367 // MEMh_CLRi_indexed_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4368 // MEMh_SETi_indexed_V4 : memw(Rs+#u6:2)=setbit(#U5)
4369 // MEMh_CLRi_V4 : memw(Rs+#u6:2)=clrbit(#U5)
4370 // MEMh_SETi_V4 : memw(Rs+#u6:2)=setbit(#U5)
4371 //===----------------------------------------------------------------------===//
4374 // memh(Rs+#u6:1) += #U5
4375 let AddedComplexity = 30 in
4376 def MEMh_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs),
4377 (ins IntRegs:$base, u6_1Imm:$offset, u5Imm:$addend),
4378 "memh($base+#$offset) += $addend",
4380 Requires<[HasV4T, UseMEMOP]>;
4382 // memh(Rs+#u6:1) -= #U5
4383 let AddedComplexity = 30 in
4384 def MEMh_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs),
4385 (ins IntRegs:$base, u6_1Imm:$offset, u5Imm:$subend),
4386 "memh($base+#$offset) -= $subend",
4388 Requires<[HasV4T, UseMEMOP]>;
4390 // memh(Rs+#u6:1) += Rt
4391 let AddedComplexity = 30 in
4392 def MEMh_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4393 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$addend),
4394 "memh($base+#$offset) += $addend",
4395 [(truncstorei16 (add (sextloadi16 (add (i32 IntRegs:$base),
4396 u6_1ImmPred:$offset)),
4397 (i32 IntRegs:$addend)),
4398 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4399 Requires<[HasV4T, UseMEMOP]>;
4401 // memh(Rs+#u6:1) -= Rt
4402 let AddedComplexity = 30 in
4403 def MEMh_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs),
4404 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$subend),
4405 "memh($base+#$offset) -= $subend",
4406 [(truncstorei16 (sub (sextloadi16 (add (i32 IntRegs:$base),
4407 u6_1ImmPred:$offset)),
4408 (i32 IntRegs:$subend)),
4409 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4410 Requires<[HasV4T, UseMEMOP]>;
4412 // memh(Rs+#u6:1) &= Rt
4413 let AddedComplexity = 30 in
4414 def MEMh_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4415 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$andend),
4416 "memh($base+#$offset) += $andend",
4417 [(truncstorei16 (and (sextloadi16 (add (i32 IntRegs:$base),
4418 u6_1ImmPred:$offset)),
4419 (i32 IntRegs:$andend)),
4420 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4421 Requires<[HasV4T, UseMEMOP]>;
4423 // memh(Rs+#u6:1) |= Rt
4424 let AddedComplexity = 30 in
4425 def MEMh_ORr_indexed_MEM_V4 : MEMInst_V4<(outs),
4426 (ins IntRegs:$base, u6_1Imm:$offset, IntRegs:$orend),
4427 "memh($base+#$offset) |= $orend",
4428 [(truncstorei16 (or (sextloadi16 (add (i32 IntRegs:$base),
4429 u6_1ImmPred:$offset)),
4430 (i32 IntRegs:$orend)),
4431 (add (i32 IntRegs:$base), u6_1ImmPred:$offset))]>,
4432 Requires<[HasV4T, UseMEMOP]>;
4434 // memh(Rs+#u6:1) += #U5
4435 let AddedComplexity = 30 in
4436 def MEMh_ADDi_MEM_V4 : MEMInst_V4<(outs),
4437 (ins MEMri:$addr, u5Imm:$addend),
4438 "memh($addr) += $addend",
4440 Requires<[HasV4T, UseMEMOP]>;
4442 // memh(Rs+#u6:1) -= #U5
4443 let AddedComplexity = 30 in
4444 def MEMh_SUBi_MEM_V4 : MEMInst_V4<(outs),
4445 (ins MEMri:$addr, u5Imm:$subend),
4446 "memh($addr) -= $subend",
4448 Requires<[HasV4T, UseMEMOP]>;
4450 // memh(Rs+#u6:1) += Rt
4451 let AddedComplexity = 30 in
4452 def MEMh_ADDr_MEM_V4 : MEMInst_V4<(outs),
4453 (ins MEMri:$addr, IntRegs:$addend),
4454 "memh($addr) += $addend",
4455 [(truncstorei16 (add (sextloadi16 ADDRriU6_1:$addr),
4456 (i32 IntRegs:$addend)), ADDRriU6_1:$addr)]>,
4457 Requires<[HasV4T, UseMEMOP]>;
4459 // memh(Rs+#u6:1) -= Rt
4460 let AddedComplexity = 30 in
4461 def MEMh_SUBr_MEM_V4 : MEMInst_V4<(outs),
4462 (ins MEMri:$addr, IntRegs:$subend),
4463 "memh($addr) -= $subend",
4464 [(truncstorei16 (sub (sextloadi16 ADDRriU6_1:$addr),
4465 (i32 IntRegs:$subend)), ADDRriU6_1:$addr)]>,
4466 Requires<[HasV4T, UseMEMOP]>;
4468 // memh(Rs+#u6:1) &= Rt
4469 let AddedComplexity = 30 in
4470 def MEMh_ANDr_MEM_V4 : MEMInst_V4<(outs),
4471 (ins MEMri:$addr, IntRegs:$andend),
4472 "memh($addr) &= $andend",
4473 [(truncstorei16 (and (sextloadi16 ADDRriU6_1:$addr),
4474 (i32 IntRegs:$andend)), ADDRriU6_1:$addr)]>,
4475 Requires<[HasV4T, UseMEMOP]>;
4477 // memh(Rs+#u6:1) |= Rt
4478 let AddedComplexity = 30 in
4479 def MEMh_ORr_MEM_V4 : MEMInst_V4<(outs),
4480 (ins MEMri:$addr, IntRegs:$orend),
4481 "memh($addr) |= $orend",
4482 [(truncstorei16 (or (sextloadi16 ADDRriU6_1:$addr),
4483 (i32 IntRegs:$orend)), ADDRriU6_1:$addr)]>,
4484 Requires<[HasV4T, UseMEMOP]>;
4487 //===----------------------------------------------------------------------===//
4491 // MEMb_ADDi_indexed_V4 : memb(Rs+#u6:0)+=#U5
4492 // MEMb_SUBi_indexed_V4 : memb(Rs+#u6:0)-=#U5
4493 // MEMb_ADDr_indexed_V4 : memb(Rs+#u6:0)+=Rt
4494 // MEMb_SUBr_indexed_V4 : memb(Rs+#u6:0)-=Rt
4495 // MEMb_CLRr_indexed_V4 : memb(Rs+#u6:0)&=Rt
4496 // MEMb_SETr_indexed_V4 : memb(Rs+#u6:0)|=Rt
4497 // MEMb_ADDi_V4 : memb(Rs+#u6:0)+=#U5
4498 // MEMb_SUBi_V4 : memb(Rs+#u6:0)-=#U5
4499 // MEMb_ADDr_V4 : memb(Rs+#u6:0)+=Rt
4500 // MEMb_SUBr_V4 : memb(Rs+#u6:0)-=Rt
4501 // MEMb_CLRr_V4 : memb(Rs+#u6:0)&=Rt
4502 // MEMb_SETr_V4 : memb(Rs+#u6:0)|=Rt
4505 // MEMb_CLRi_indexed_V4 : memb(Rs+#u6:0)=clrbit(#U5)
4506 // MEMb_SETi_indexed_V4 : memb(Rs+#u6:0)=setbit(#U5)
4507 // MEMb_CLRi_V4 : memb(Rs+#u6:0)=clrbit(#U5)
4508 // MEMb_SETi_V4 : memb(Rs+#u6:0)=setbit(#U5)
4509 //===----------------------------------------------------------------------===//
4511 // memb(Rs+#u6:0) += #U5
4512 let AddedComplexity = 30 in
4513 def MEMb_ADDi_indexed_MEM_V4 : MEMInst_V4<(outs),
4514 (ins IntRegs:$base, u6_0Imm:$offset, u5Imm:$addend),
4515 "memb($base+#$offset) += $addend",
4517 Requires<[HasV4T, UseMEMOP]>;
4519 // memb(Rs+#u6:0) -= #U5
4520 let AddedComplexity = 30 in
4521 def MEMb_SUBi_indexed_MEM_V4 : MEMInst_V4<(outs),
4522 (ins IntRegs:$base, u6_0Imm:$offset, u5Imm:$subend),
4523 "memb($base+#$offset) -= $subend",
4525 Requires<[HasV4T, UseMEMOP]>;
4527 // memb(Rs+#u6:0) += Rt
4528 let AddedComplexity = 30 in
4529 def MEMb_ADDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4530 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$addend),
4531 "memb($base+#$offset) += $addend",
4532 [(truncstorei8 (add (sextloadi8 (add (i32 IntRegs:$base),
4533 u6_0ImmPred:$offset)),
4534 (i32 IntRegs:$addend)),
4535 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4536 Requires<[HasV4T, UseMEMOP]>;
4538 // memb(Rs+#u6:0) -= Rt
4539 let AddedComplexity = 30 in
4540 def MEMb_SUBr_indexed_MEM_V4 : MEMInst_V4<(outs),
4541 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$subend),
4542 "memb($base+#$offset) -= $subend",
4543 [(truncstorei8 (sub (sextloadi8 (add (i32 IntRegs:$base),
4544 u6_0ImmPred:$offset)),
4545 (i32 IntRegs:$subend)),
4546 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4547 Requires<[HasV4T, UseMEMOP]>;
4549 // memb(Rs+#u6:0) &= Rt
4550 let AddedComplexity = 30 in
4551 def MEMb_ANDr_indexed_MEM_V4 : MEMInst_V4<(outs),
4552 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$andend),
4553 "memb($base+#$offset) += $andend",
4554 [(truncstorei8 (and (sextloadi8 (add (i32 IntRegs:$base),
4555 u6_0ImmPred:$offset)),
4556 (i32 IntRegs:$andend)),
4557 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4558 Requires<[HasV4T, UseMEMOP]>;
4560 // memb(Rs+#u6:0) |= Rt
4561 let AddedComplexity = 30 in
4562 def MEMb_ORr_indexed_MEM_V4 : MEMInst_V4<(outs),
4563 (ins IntRegs:$base, u6_0Imm:$offset, IntRegs:$orend),
4564 "memb($base+#$offset) |= $orend",
4565 [(truncstorei8 (or (sextloadi8 (add (i32 IntRegs:$base),
4566 u6_0ImmPred:$offset)),
4567 (i32 IntRegs:$orend)),
4568 (add (i32 IntRegs:$base), u6_0ImmPred:$offset))]>,
4569 Requires<[HasV4T, UseMEMOP]>;
4571 // memb(Rs+#u6:0) += #U5
4572 let AddedComplexity = 30 in
4573 def MEMb_ADDi_MEM_V4 : MEMInst_V4<(outs),
4574 (ins MEMri:$addr, u5Imm:$addend),
4575 "memb($addr) += $addend",
4577 Requires<[HasV4T, UseMEMOP]>;
4579 // memb(Rs+#u6:0) -= #U5
4580 let AddedComplexity = 30 in
4581 def MEMb_SUBi_MEM_V4 : MEMInst_V4<(outs),
4582 (ins MEMri:$addr, u5Imm:$subend),
4583 "memb($addr) -= $subend",
4585 Requires<[HasV4T, UseMEMOP]>;
4587 // memb(Rs+#u6:0) += Rt
4588 let AddedComplexity = 30 in
4589 def MEMb_ADDr_MEM_V4 : MEMInst_V4<(outs),
4590 (ins MEMri:$addr, IntRegs:$addend),
4591 "memb($addr) += $addend",
4592 [(truncstorei8 (add (sextloadi8 ADDRriU6_0:$addr),
4593 (i32 IntRegs:$addend)), ADDRriU6_0:$addr)]>,
4594 Requires<[HasV4T, UseMEMOP]>;
4596 // memb(Rs+#u6:0) -= Rt
4597 let AddedComplexity = 30 in
4598 def MEMb_SUBr_MEM_V4 : MEMInst_V4<(outs),
4599 (ins MEMri:$addr, IntRegs:$subend),
4600 "memb($addr) -= $subend",
4601 [(truncstorei8 (sub (sextloadi8 ADDRriU6_0:$addr),
4602 (i32 IntRegs:$subend)), ADDRriU6_0:$addr)]>,
4603 Requires<[HasV4T, UseMEMOP]>;
4605 // memb(Rs+#u6:0) &= Rt
4606 let AddedComplexity = 30 in
4607 def MEMb_ANDr_MEM_V4 : MEMInst_V4<(outs),
4608 (ins MEMri:$addr, IntRegs:$andend),
4609 "memb($addr) &= $andend",
4610 [(truncstorei8 (and (sextloadi8 ADDRriU6_0:$addr),
4611 (i32 IntRegs:$andend)), ADDRriU6_0:$addr)]>,
4612 Requires<[HasV4T, UseMEMOP]>;
4614 // memb(Rs+#u6:0) |= Rt
4615 let AddedComplexity = 30 in
4616 def MEMb_ORr_MEM_V4 : MEMInst_V4<(outs),
4617 (ins MEMri:$addr, IntRegs:$orend),
4618 "memb($addr) |= $orend",
4619 [(truncstorei8 (or (sextloadi8 ADDRriU6_0:$addr),
4620 (i32 IntRegs:$orend)), ADDRriU6_0:$addr)]>,
4621 Requires<[HasV4T, UseMEMOP]>;
4624 //===----------------------------------------------------------------------===//
4626 //===----------------------------------------------------------------------===//
4628 // Hexagon V4 only supports these flavors of byte/half compare instructions:
4629 // EQ/GT/GTU. Other flavors like GE/GEU/LT/LTU/LE/LEU are not supported by
4630 // hardware. However, compiler can still implement these patterns through
4631 // appropriate patterns combinations based on current implemented patterns.
4632 // The implemented patterns are: EQ/GT/GTU.
4633 // Missing patterns are: GE/GEU/LT/LTU/LE/LEU.
4635 // Following instruction is not being extended as it results into the
4636 // incorrect code for negative numbers.
4637 // Pd=cmpb.eq(Rs,#u8)
4639 let isCompare = 1 in
4640 def CMPbEQri_V4 : MInst<(outs PredRegs:$dst),
4641 (ins IntRegs:$src1, u8Imm:$src2),
4642 "$dst = cmpb.eq($src1, #$src2)",
4643 [(set (i1 PredRegs:$dst),
4644 (seteq (and (i32 IntRegs:$src1), 255), u8ImmPred:$src2))]>,
4647 // Pd=cmpb.eq(Rs,Rt)
4648 let isCompare = 1 in
4649 def CMPbEQrr_ubub_V4 : MInst<(outs PredRegs:$dst),
4650 (ins IntRegs:$src1, IntRegs:$src2),
4651 "$dst = cmpb.eq($src1, $src2)",
4652 [(set (i1 PredRegs:$dst),
4653 (seteq (and (xor (i32 IntRegs:$src1),
4654 (i32 IntRegs:$src2)), 255), 0))]>,
4657 // Pd=cmpb.eq(Rs,Rt)
4658 let isCompare = 1 in
4659 def CMPbEQrr_sbsb_V4 : MInst<(outs PredRegs:$dst),
4660 (ins IntRegs:$src1, IntRegs:$src2),
4661 "$dst = cmpb.eq($src1, $src2)",
4662 [(set (i1 PredRegs:$dst),
4663 (seteq (shl (i32 IntRegs:$src1), (i32 24)),
4664 (shl (i32 IntRegs:$src2), (i32 24))))]>,
4667 // Pd=cmpb.gt(Rs,Rt)
4668 let isCompare = 1 in
4669 def CMPbGTrr_V4 : MInst<(outs PredRegs:$dst),
4670 (ins IntRegs:$src1, IntRegs:$src2),
4671 "$dst = cmpb.gt($src1, $src2)",
4672 [(set (i1 PredRegs:$dst),
4673 (setgt (shl (i32 IntRegs:$src1), (i32 24)),
4674 (shl (i32 IntRegs:$src2), (i32 24))))]>,
4677 // Pd=cmpb.gtu(Rs,#u7)
4678 let isCompare = 1 in
4679 def CMPbGTUri_V4 : MInst<(outs PredRegs:$dst),
4680 (ins IntRegs:$src1, u7Imm:$src2),
4681 "$dst = cmpb.gtu($src1, #$src2)",
4682 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255),
4683 u7ImmPred:$src2))]>,
4686 // Pd=cmpb.gtu(Rs,Rt)
4687 let isCompare = 1 in
4688 def CMPbGTUrr_V4 : MInst<(outs PredRegs:$dst),
4689 (ins IntRegs:$src1, IntRegs:$src2),
4690 "$dst = cmpb.gtu($src1, $src2)",
4691 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 255),
4692 (and (i32 IntRegs:$src2), 255)))]>,
4695 // Following instruction is not being extended as it results into the incorrect
4696 // code for negative numbers.
4698 // Signed half compare(.eq) ri.
4699 // Pd=cmph.eq(Rs,#s8)
4700 let isCompare = 1 in
4701 def CMPhEQri_V4 : MInst<(outs PredRegs:$dst),
4702 (ins IntRegs:$src1, s8Imm:$src2),
4703 "$dst = cmph.eq($src1, #$src2)",
4704 [(set (i1 PredRegs:$dst), (seteq (and (i32 IntRegs:$src1), 65535),
4705 s8ImmPred:$src2))]>,
4708 // Signed half compare(.eq) rr.
4709 // Case 1: xor + and, then compare:
4711 // r0=and(r0,#0xffff)
4713 // Pd=cmph.eq(Rs,Rt)
4714 let isCompare = 1 in
4715 def CMPhEQrr_xor_V4 : MInst<(outs PredRegs:$dst),
4716 (ins IntRegs:$src1, IntRegs:$src2),
4717 "$dst = cmph.eq($src1, $src2)",
4718 [(set (i1 PredRegs:$dst), (seteq (and (xor (i32 IntRegs:$src1),
4719 (i32 IntRegs:$src2)),
4723 // Signed half compare(.eq) rr.
4724 // Case 2: shift left 16 bits then compare:
4728 // Pd=cmph.eq(Rs,Rt)
4729 let isCompare = 1 in
4730 def CMPhEQrr_shl_V4 : MInst<(outs PredRegs:$dst),
4731 (ins IntRegs:$src1, IntRegs:$src2),
4732 "$dst = cmph.eq($src1, $src2)",
4733 [(set (i1 PredRegs:$dst),
4734 (seteq (shl (i32 IntRegs:$src1), (i32 16)),
4735 (shl (i32 IntRegs:$src2), (i32 16))))]>,
4738 /* Incorrect Pattern -- immediate should be right shifted before being
4739 used in the cmph.gt instruction.
4740 // Signed half compare(.gt) ri.
4741 // Pd=cmph.gt(Rs,#s8)
4743 let isCompare = 1 in
4744 def CMPhGTri_V4 : MInst<(outs PredRegs:$dst),
4745 (ins IntRegs:$src1, s8Imm:$src2),
4746 "$dst = cmph.gt($src1, #$src2)",
4747 [(set (i1 PredRegs:$dst),
4748 (setgt (shl (i32 IntRegs:$src1), (i32 16)),
4749 s8ImmPred:$src2))]>,
4753 // Signed half compare(.gt) rr.
4754 // Pd=cmph.gt(Rs,Rt)
4755 let isCompare = 1 in
4756 def CMPhGTrr_shl_V4 : MInst<(outs PredRegs:$dst),
4757 (ins IntRegs:$src1, IntRegs:$src2),
4758 "$dst = cmph.gt($src1, $src2)",
4759 [(set (i1 PredRegs:$dst),
4760 (setgt (shl (i32 IntRegs:$src1), (i32 16)),
4761 (shl (i32 IntRegs:$src2), (i32 16))))]>,
4764 // Unsigned half compare rr (.gtu).
4765 // Pd=cmph.gtu(Rs,Rt)
4766 let isCompare = 1 in
4767 def CMPhGTUrr_V4 : MInst<(outs PredRegs:$dst),
4768 (ins IntRegs:$src1, IntRegs:$src2),
4769 "$dst = cmph.gtu($src1, $src2)",
4770 [(set (i1 PredRegs:$dst),
4771 (setugt (and (i32 IntRegs:$src1), 65535),
4772 (and (i32 IntRegs:$src2), 65535)))]>,
4775 // Unsigned half compare ri (.gtu).
4776 // Pd=cmph.gtu(Rs,#u7)
4777 let isCompare = 1 in
4778 def CMPhGTUri_V4 : MInst<(outs PredRegs:$dst),
4779 (ins IntRegs:$src1, u7Imm:$src2),
4780 "$dst = cmph.gtu($src1, #$src2)",
4781 [(set (i1 PredRegs:$dst), (setugt (and (i32 IntRegs:$src1), 65535),
4782 u7ImmPred:$src2))]>,
4785 //===----------------------------------------------------------------------===//
4787 //===----------------------------------------------------------------------===//
4789 //Deallocate frame and return.
4791 let isReturn = 1, isTerminator = 1, isBarrier = 1, isPredicable = 1,
4792 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1 in {
4793 def DEALLOC_RET_V4 : NVInst_V4<(outs), (ins i32imm:$amt1),
4799 // Restore registers and dealloc return function call.
4800 let isCall = 1, isBarrier = 1, isReturn = 1, isTerminator = 1,
4801 Defs = [R29, R30, R31, PC] in {
4802 def RESTORE_DEALLOC_RET_JMP_V4 : JInst<(outs),
4803 (ins calltarget:$dst),
4804 "jump $dst // Restore_and_dealloc_return",
4809 // Restore registers and dealloc frame before a tail call.
4810 let isCall = 1, isBarrier = 1,
4811 Defs = [R29, R30, R31, PC] in {
4812 def RESTORE_DEALLOC_BEFORE_TAILCALL_V4 : JInst<(outs),
4813 (ins calltarget:$dst),
4814 "call $dst // Restore_and_dealloc_before_tailcall",
4819 // Save registers function call.
4820 let isCall = 1, isBarrier = 1,
4821 Uses = [R29, R31] in {
4822 def SAVE_REGISTERS_CALL_V4 : JInst<(outs),
4823 (ins calltarget:$dst),
4824 "call $dst // Save_calle_saved_registers",
4829 // if (Ps) dealloc_return
4830 let isReturn = 1, isTerminator = 1,
4831 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
4832 isPredicated = 1 in {
4833 def DEALLOC_RET_cPt_V4 : NVInst_V4<(outs),
4834 (ins PredRegs:$src1, i32imm:$amt1),
4835 "if ($src1) dealloc_return",
4840 // if (!Ps) dealloc_return
4841 let isReturn = 1, isTerminator = 1,
4842 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
4843 isPredicated = 1 in {
4844 def DEALLOC_RET_cNotPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
4846 "if (!$src1) dealloc_return",
4851 // if (Ps.new) dealloc_return:nt
4852 let isReturn = 1, isTerminator = 1,
4853 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
4854 isPredicated = 1 in {
4855 def DEALLOC_RET_cdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
4857 "if ($src1.new) dealloc_return:nt",
4862 // if (!Ps.new) dealloc_return:nt
4863 let isReturn = 1, isTerminator = 1,
4864 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
4865 isPredicated = 1 in {
4866 def DEALLOC_RET_cNotdnPnt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
4868 "if (!$src1.new) dealloc_return:nt",
4873 // if (Ps.new) dealloc_return:t
4874 let isReturn = 1, isTerminator = 1,
4875 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
4876 isPredicated = 1 in {
4877 def DEALLOC_RET_cdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
4879 "if ($src1.new) dealloc_return:t",
4884 // if (!Ps.new) dealloc_return:nt
4885 let isReturn = 1, isTerminator = 1,
4886 Defs = [R29, R30, R31, PC], Uses = [R29, R31], neverHasSideEffects = 1,
4887 isPredicated = 1 in {
4888 def DEALLOC_RET_cNotdnPt_V4 : NVInst_V4<(outs), (ins PredRegs:$src1,
4890 "if (!$src1.new) dealloc_return:t",
4896 // Load/Store with absolute addressing mode
4899 multiclass ST_abs<string OpcStr> {
4900 let isPredicable = 1 in
4901 def _abs_V4 : STInst2<(outs),
4902 (ins globaladdress:$absaddr, IntRegs:$src),
4903 !strconcat(OpcStr, "(##$absaddr) = $src"),
4907 let isPredicated = 1 in
4908 def _abs_cPt_V4 : STInst2<(outs),
4909 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4910 !strconcat("if ($src1)",
4911 !strconcat(OpcStr, "(##$absaddr) = $src2")),
4915 let isPredicated = 1 in
4916 def _abs_cNotPt_V4 : STInst2<(outs),
4917 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4918 !strconcat("if (!$src1)",
4919 !strconcat(OpcStr, "(##$absaddr) = $src2")),
4923 let isPredicated = 1 in
4924 def _abs_cdnPt_V4 : STInst2<(outs),
4925 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4926 !strconcat("if ($src1.new)",
4927 !strconcat(OpcStr, "(##$absaddr) = $src2")),
4931 let isPredicated = 1 in
4932 def _abs_cdnNotPt_V4 : STInst2<(outs),
4933 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4934 !strconcat("if (!$src1.new)",
4935 !strconcat(OpcStr, "(##$absaddr) = $src2")),
4939 def _abs_nv_V4 : STInst2<(outs),
4940 (ins globaladdress:$absaddr, IntRegs:$src),
4941 !strconcat(OpcStr, "(##$absaddr) = $src.new"),
4945 let isPredicated = 1 in
4946 def _abs_cPt_nv_V4 : STInst2<(outs),
4947 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4948 !strconcat("if ($src1)",
4949 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
4953 let isPredicated = 1 in
4954 def _abs_cNotPt_nv_V4 : STInst2<(outs),
4955 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4956 !strconcat("if (!$src1)",
4957 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
4961 let isPredicated = 1 in
4962 def _abs_cdnPt_nv_V4 : STInst2<(outs),
4963 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4964 !strconcat("if ($src1.new)",
4965 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
4969 let isPredicated = 1 in
4970 def _abs_cdnNotPt_nv_V4 : STInst2<(outs),
4971 (ins PredRegs:$src1, globaladdress:$absaddr, IntRegs:$src2),
4972 !strconcat("if (!$src1.new)",
4973 !strconcat(OpcStr, "(##$absaddr) = $src2.new")),
4978 let AddedComplexity = 30, isPredicable = 1 in
4979 def STrid_abs_V4 : STInst<(outs),
4980 (ins globaladdress:$absaddr, DoubleRegs:$src),
4981 "memd(##$absaddr) = $src",
4982 [(store (i64 DoubleRegs:$src),
4983 (HexagonCONST32 tglobaladdr:$absaddr))]>,
4986 let AddedComplexity = 30, isPredicated = 1 in
4987 def STrid_abs_cPt_V4 : STInst2<(outs),
4988 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
4989 "if ($src1) memd(##$absaddr) = $src2",
4993 let AddedComplexity = 30, isPredicated = 1 in
4994 def STrid_abs_cNotPt_V4 : STInst2<(outs),
4995 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
4996 "if (!$src1) memd(##$absaddr) = $src2",
5000 let AddedComplexity = 30, isPredicated = 1 in
5001 def STrid_abs_cdnPt_V4 : STInst2<(outs),
5002 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
5003 "if ($src1.new) memd(##$absaddr) = $src2",
5007 let AddedComplexity = 30, isPredicated = 1 in
5008 def STrid_abs_cdnNotPt_V4 : STInst2<(outs),
5009 (ins PredRegs:$src1, globaladdress:$absaddr, DoubleRegs:$src2),
5010 "if (!$src1.new) memd(##$absaddr) = $src2",
5014 defm STrib : ST_abs<"memb">;
5015 defm STrih : ST_abs<"memh">;
5016 defm STriw : ST_abs<"memw">;
5018 let Predicates = [HasV4T], AddedComplexity = 30 in
5019 def : Pat<(truncstorei8 (i32 IntRegs:$src1),
5020 (HexagonCONST32 tglobaladdr:$absaddr)),
5021 (STrib_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>;
5023 let Predicates = [HasV4T], AddedComplexity = 30 in
5024 def : Pat<(truncstorei16 (i32 IntRegs:$src1),
5025 (HexagonCONST32 tglobaladdr:$absaddr)),
5026 (STrih_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>;
5028 let Predicates = [HasV4T], AddedComplexity = 30 in
5029 def : Pat<(store (i32 IntRegs:$src1), (HexagonCONST32 tglobaladdr:$absaddr)),
5030 (STriw_abs_V4 tglobaladdr: $absaddr, IntRegs: $src1)>;
5033 multiclass LD_abs<string OpcStr> {
5034 let isPredicable = 1 in
5035 def _abs_V4 : LDInst2<(outs IntRegs:$dst),
5036 (ins globaladdress:$absaddr),
5037 !strconcat("$dst = ", !strconcat(OpcStr, "(##$absaddr)")),
5041 let isPredicated = 1 in
5042 def _abs_cPt_V4 : LDInst2<(outs IntRegs:$dst),
5043 (ins PredRegs:$src1, globaladdress:$absaddr),
5044 !strconcat("if ($src1) $dst = ",
5045 !strconcat(OpcStr, "(##$absaddr)")),
5049 let isPredicated = 1 in
5050 def _abs_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5051 (ins PredRegs:$src1, globaladdress:$absaddr),
5052 !strconcat("if (!$src1) $dst = ",
5053 !strconcat(OpcStr, "(##$absaddr)")),
5057 let isPredicated = 1 in
5058 def _abs_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
5059 (ins PredRegs:$src1, globaladdress:$absaddr),
5060 !strconcat("if ($src1.new) $dst = ",
5061 !strconcat(OpcStr, "(##$absaddr)")),
5065 let isPredicated = 1 in
5066 def _abs_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5067 (ins PredRegs:$src1, globaladdress:$absaddr),
5068 !strconcat("if (!$src1.new) $dst = ",
5069 !strconcat(OpcStr, "(##$absaddr)")),
5074 let AddedComplexity = 30 in
5075 def LDrid_abs_V4 : LDInst<(outs DoubleRegs:$dst),
5076 (ins globaladdress:$absaddr),
5077 "$dst = memd(##$absaddr)",
5078 [(set (i64 DoubleRegs:$dst),
5079 (load (HexagonCONST32 tglobaladdr:$absaddr)))]>,
5082 let AddedComplexity = 30, isPredicated = 1 in
5083 def LDrid_abs_cPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5084 (ins PredRegs:$src1, globaladdress:$absaddr),
5085 "if ($src1) $dst = memd(##$absaddr)",
5089 let AddedComplexity = 30, isPredicated = 1 in
5090 def LDrid_abs_cNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5091 (ins PredRegs:$src1, globaladdress:$absaddr),
5092 "if (!$src1) $dst = memd(##$absaddr)",
5096 let AddedComplexity = 30, isPredicated = 1 in
5097 def LDrid_abs_cdnPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5098 (ins PredRegs:$src1, globaladdress:$absaddr),
5099 "if ($src1.new) $dst = memd(##$absaddr)",
5103 let AddedComplexity = 30, isPredicated = 1 in
5104 def LDrid_abs_cdnNotPt_V4 : LDInst2<(outs DoubleRegs:$dst),
5105 (ins PredRegs:$src1, globaladdress:$absaddr),
5106 "if (!$src1.new) $dst = memd(##$absaddr)",
5110 defm LDrib : LD_abs<"memb">;
5111 defm LDriub : LD_abs<"memub">;
5112 defm LDrih : LD_abs<"memh">;
5113 defm LDriuh : LD_abs<"memuh">;
5114 defm LDriw : LD_abs<"memw">;
5117 let Predicates = [HasV4T], AddedComplexity = 30 in
5118 def : Pat<(i32 (load (HexagonCONST32 tglobaladdr:$absaddr))),
5119 (LDriw_abs_V4 tglobaladdr: $absaddr)>;
5121 let Predicates = [HasV4T], AddedComplexity=30 in
5122 def : Pat<(i32 (sextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))),
5123 (LDrib_abs_V4 tglobaladdr:$absaddr)>;
5125 let Predicates = [HasV4T], AddedComplexity=30 in
5126 def : Pat<(i32 (zextloadi8 (HexagonCONST32 tglobaladdr:$absaddr))),
5127 (LDriub_abs_V4 tglobaladdr:$absaddr)>;
5129 let Predicates = [HasV4T], AddedComplexity=30 in
5130 def : Pat<(i32 (sextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))),
5131 (LDrih_abs_V4 tglobaladdr:$absaddr)>;
5133 let Predicates = [HasV4T], AddedComplexity=30 in
5134 def : Pat<(i32 (zextloadi16 (HexagonCONST32 tglobaladdr:$absaddr))),
5135 (LDriuh_abs_V4 tglobaladdr:$absaddr)>;
5137 // Transfer global address into a register
5138 let AddedComplexity=50, isMoveImm = 1, isReMaterializable = 1 in
5139 def TFRI_V4 : ALU32_ri<(outs IntRegs:$dst), (ins globaladdress:$src1),
5141 [(set IntRegs:$dst, (HexagonCONST32 tglobaladdr:$src1))]>,
5144 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5145 def TFRI_cPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5146 (ins PredRegs:$src1, globaladdress:$src2),
5147 "if($src1) $dst = ##$src2",
5151 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5152 def TFRI_cNotPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5153 (ins PredRegs:$src1, globaladdress:$src2),
5154 "if(!$src1) $dst = ##$src2",
5158 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5159 def TFRI_cdnPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5160 (ins PredRegs:$src1, globaladdress:$src2),
5161 "if($src1.new) $dst = ##$src2",
5165 let AddedComplexity=50, neverHasSideEffects = 1, isPredicated = 1 in
5166 def TFRI_cdnNotPt_V4 : ALU32_ri<(outs IntRegs:$dst),
5167 (ins PredRegs:$src1, globaladdress:$src2),
5168 "if(!$src1.new) $dst = ##$src2",
5172 let AddedComplexity = 50, Predicates = [HasV4T] in
5173 def : Pat<(HexagonCONST32_GP tglobaladdr:$src1),
5174 (TFRI_V4 tglobaladdr:$src1)>;
5177 // Load - Indirect with long offset: These instructions take global address
5179 let AddedComplexity = 10 in
5180 def LDrid_ind_lo_V4 : LDInst<(outs DoubleRegs:$dst),
5181 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset),
5182 "$dst=memd($src1<<#$src2+##$offset)",
5183 [(set (i64 DoubleRegs:$dst),
5184 (load (add (shl IntRegs:$src1, u2ImmPred:$src2),
5185 (HexagonCONST32 tglobaladdr:$offset))))]>,
5188 let AddedComplexity = 10 in
5189 multiclass LD_indirect_lo<string OpcStr, PatFrag OpNode> {
5190 def _lo_V4 : LDInst<(outs IntRegs:$dst),
5191 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$offset),
5192 !strconcat("$dst = ",
5193 !strconcat(OpcStr, "($src1<<#$src2+##$offset)")),
5195 (i32 (OpNode (add (shl IntRegs:$src1, u2ImmPred:$src2),
5196 (HexagonCONST32 tglobaladdr:$offset)))))]>,
5200 defm LDrib_ind : LD_indirect_lo<"memb", sextloadi8>;
5201 defm LDriub_ind : LD_indirect_lo<"memub", zextloadi8>;
5202 defm LDrih_ind : LD_indirect_lo<"memh", sextloadi16>;
5203 defm LDriuh_ind : LD_indirect_lo<"memuh", zextloadi16>;
5204 defm LDriw_ind : LD_indirect_lo<"memw", load>;
5206 // Store - Indirect with long offset: These instructions take global address
5208 let AddedComplexity = 10 in
5209 def STrid_ind_lo_V4 : STInst<(outs),
5210 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3,
5212 "memd($src1<<#$src2+#$src3) = $src4",
5213 [(store (i64 DoubleRegs:$src4),
5214 (add (shl IntRegs:$src1, u2ImmPred:$src2),
5215 (HexagonCONST32 tglobaladdr:$src3)))]>,
5218 let AddedComplexity = 10 in
5219 multiclass ST_indirect_lo<string OpcStr, PatFrag OpNode> {
5220 def _lo_V4 : STInst<(outs),
5221 (ins IntRegs:$src1, u2Imm:$src2, globaladdress:$src3,
5223 !strconcat(OpcStr, "($src1<<#$src2+##$src3) = $src4"),
5224 [(OpNode (i32 IntRegs:$src4),
5225 (add (shl IntRegs:$src1, u2ImmPred:$src2),
5226 (HexagonCONST32 tglobaladdr:$src3)))]>,
5230 defm STrib_ind : ST_indirect_lo<"memb", truncstorei8>;
5231 defm STrih_ind : ST_indirect_lo<"memh", truncstorei16>;
5232 defm STriw_ind : ST_indirect_lo<"memw", store>;
5234 // Store - absolute addressing mode: These instruction take constant
5235 // value as the extended operand
5236 multiclass ST_absimm<string OpcStr> {
5237 let isPredicable = 1 in
5238 def _abs_V4 : STInst2<(outs),
5239 (ins u6Imm:$src1, IntRegs:$src2),
5240 !strconcat(OpcStr, "(#$src1) = $src2"),
5244 let isPredicated = 1 in
5245 def _abs_cPt_V4 : STInst2<(outs),
5246 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5247 !strconcat("if ($src1)", !strconcat(OpcStr, "(#$src2) = $src3")),
5251 let isPredicated = 1 in
5252 def _abs_cNotPt_V4 : STInst2<(outs),
5253 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5254 !strconcat("if (!$src1)", !strconcat(OpcStr, "(#$src2) = $src3")),
5258 let isPredicated = 1 in
5259 def _abs_cdnPt_V4 : STInst2<(outs),
5260 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5261 !strconcat("if ($src1.new)",
5262 !strconcat(OpcStr, "(#$src2) = $src3")),
5266 let isPredicated = 1 in
5267 def _abs_cdnNotPt_V4 : STInst2<(outs),
5268 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5269 !strconcat("if (!$src1.new)",
5270 !strconcat(OpcStr, "(#$src2) = $src3")),
5274 def _abs_nv_V4 : STInst2<(outs),
5275 (ins u6Imm:$src1, IntRegs:$src2),
5276 !strconcat(OpcStr, "(#$src1) = $src2.new"),
5280 let isPredicated = 1 in
5281 def _abs_cPt_nv_V4 : STInst2<(outs),
5282 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5283 !strconcat("if ($src1)",
5284 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5288 let isPredicated = 1 in
5289 def _abs_cNotPt_nv_V4 : STInst2<(outs),
5290 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5291 !strconcat("if (!$src1)",
5292 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5296 let isPredicated = 1 in
5297 def _abs_cdnPt_nv_V4 : STInst2<(outs),
5298 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5299 !strconcat("if ($src1.new)",
5300 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5304 let isPredicated = 1 in
5305 def _abs_cdnNotPt_nv_V4 : STInst2<(outs),
5306 (ins PredRegs:$src1, u6Imm:$src2, IntRegs:$src3),
5307 !strconcat("if (!$src1.new)",
5308 !strconcat(OpcStr, "(#$src2) = $src3.new")),
5313 defm STrib_imm : ST_absimm<"memb">;
5314 defm STrih_imm : ST_absimm<"memh">;
5315 defm STriw_imm : ST_absimm<"memw">;
5317 let Predicates = [HasV4T], AddedComplexity = 30 in
5318 def : Pat<(truncstorei8 (i32 IntRegs:$src1), u6ImmPred:$src2),
5319 (STrib_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>;
5321 let Predicates = [HasV4T], AddedComplexity = 30 in
5322 def : Pat<(truncstorei16 (i32 IntRegs:$src1), u6ImmPred:$src2),
5323 (STrih_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>;
5325 let Predicates = [HasV4T], AddedComplexity = 30 in
5326 def : Pat<(store (i32 IntRegs:$src1), u6ImmPred:$src2),
5327 (STriw_imm_abs_V4 u6ImmPred:$src2, IntRegs: $src1)>;
5330 // Load - absolute addressing mode: These instruction take constant
5331 // value as the extended operand
5333 multiclass LD_absimm<string OpcStr> {
5334 let isPredicable = 1 in
5335 def _abs_V4 : LDInst2<(outs IntRegs:$dst),
5337 !strconcat("$dst = ",
5338 !strconcat(OpcStr, "(#$src)")),
5342 let isPredicated = 1 in
5343 def _abs_cPt_V4 : LDInst2<(outs IntRegs:$dst),
5344 (ins PredRegs:$src1, u6Imm:$src2),
5345 !strconcat("if ($src1) $dst = ",
5346 !strconcat(OpcStr, "(#$src2)")),
5350 let isPredicated = 1 in
5351 def _abs_cNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5352 (ins PredRegs:$src1, u6Imm:$src2),
5353 !strconcat("if (!$src1) $dst = ",
5354 !strconcat(OpcStr, "(#$src2)")),
5358 let isPredicated = 1 in
5359 def _abs_cdnPt_V4 : LDInst2<(outs IntRegs:$dst),
5360 (ins PredRegs:$src1, u6Imm:$src2),
5361 !strconcat("if ($src1.new) $dst = ",
5362 !strconcat(OpcStr, "(#$src2)")),
5366 let isPredicated = 1 in
5367 def _abs_cdnNotPt_V4 : LDInst2<(outs IntRegs:$dst),
5368 (ins PredRegs:$src1, u6Imm:$src2),
5369 !strconcat("if (!$src1.new) $dst = ",
5370 !strconcat(OpcStr, "(#$src2)")),
5375 defm LDrib_imm : LD_absimm<"memb">;
5376 defm LDriub_imm : LD_absimm<"memub">;
5377 defm LDrih_imm : LD_absimm<"memh">;
5378 defm LDriuh_imm : LD_absimm<"memuh">;
5379 defm LDriw_imm : LD_absimm<"memw">;
5381 let Predicates = [HasV4T], AddedComplexity = 30 in
5382 def : Pat<(i32 (load u6ImmPred:$src)),
5383 (LDriw_imm_abs_V4 u6ImmPred:$src)>;
5385 let Predicates = [HasV4T], AddedComplexity=30 in
5386 def : Pat<(i32 (sextloadi8 u6ImmPred:$src)),
5387 (LDrib_imm_abs_V4 u6ImmPred:$src)>;
5389 let Predicates = [HasV4T], AddedComplexity=30 in
5390 def : Pat<(i32 (zextloadi8 u6ImmPred:$src)),
5391 (LDriub_imm_abs_V4 u6ImmPred:$src)>;
5393 let Predicates = [HasV4T], AddedComplexity=30 in
5394 def : Pat<(i32 (sextloadi16 u6ImmPred:$src)),
5395 (LDrih_imm_abs_V4 u6ImmPred:$src)>;
5397 let Predicates = [HasV4T], AddedComplexity=30 in
5398 def : Pat<(i32 (zextloadi16 u6ImmPred:$src)),
5399 (LDriuh_imm_abs_V4 u6ImmPred:$src)>;
5402 // Indexed store double word - global address.
5403 // memw(Rs+#u6:2)=#S8
5404 let AddedComplexity = 10 in
5405 def STriw_offset_ext_V4 : STInst<(outs),
5406 (ins IntRegs:$src1, u6_2Imm:$src2, globaladdress:$src3),
5407 "memw($src1+#$src2) = ##$src3",
5408 [(store (HexagonCONST32 tglobaladdr:$src3),
5409 (add IntRegs:$src1, u6_2ImmPred:$src2))]>,
5413 // Indexed store double word - global address.
5414 // memw(Rs+#u6:2)=#S8
5415 let AddedComplexity = 10 in
5416 def STrih_offset_ext_V4 : STInst<(outs),
5417 (ins IntRegs:$src1, u6_1Imm:$src2, globaladdress:$src3),
5418 "memh($src1+#$src2) = ##$src3",
5419 [(truncstorei16 (HexagonCONST32 tglobaladdr:$src3),
5420 (add IntRegs:$src1, u6_1ImmPred:$src2))]>,