xref: /freebsd/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYInstrInfo16Instr.td (revision 0ad011ececb978e22a9bff2acf76633b094f1ff6)
1//===-- CSKYInstrInfo16Instr.td - CSKY 16-bit Instruction --*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file describes the CSKY 16-bit instructions in TableGen format.
10//
11//===----------------------------------------------------------------------===//
12
13//===----------------------------------------------------------------------===//
14// CSKY specific DAG Nodes.
15//===----------------------------------------------------------------------===//
16
17// Target-dependent nodes.
18def CSKY_NIE : SDNode<"CSKYISD::NIE", SDTNone,
19    [SDNPHasChain, SDNPOptInGlue]>;
20def CSKY_NIR : SDNode<"CSKYISD::NIR", SDTNone,
21    [SDNPHasChain, SDNPOptInGlue]>;
22
23//===----------------------------------------------------------------------===//
24// Operand and SDNode transformation definitions.
25//===----------------------------------------------------------------------===//
26
27def br_symbol_16bit : Operand<OtherVT> {
28  let EncoderMethod =
29    "getBranchSymbolOpValue<CSKY::fixup_csky_pcrel_imm10_scale2>";
30  let ParserMatchClass = CSKYSymbol;
31  let DecoderMethod = "decodeSImmOperand<10, 1>";
32  let PrintMethod = "printCSKYSymbolOperand";
33  let OperandType = "OPERAND_PCREL";
34}
35
36def constpool_symbol_16bit : Operand<iPTR> {
37  let ParserMatchClass = Constpool;
38  let EncoderMethod =
39    "getConstpoolSymbolOpValue<CSKY::fixup_csky_pcrel_uimm7_scale4>";
40  let DecoderMethod = "decodeLRW16Imm8";
41  let PrintMethod = "printConstpool";
42  let OperandType = "OPERAND_PCREL";
43}
44
45//===----------------------------------------------------------------------===//
46// Instruction Formats
47//===----------------------------------------------------------------------===//
48
49include "CSKYInstrFormats16Instr.td"
50
51//===----------------------------------------------------------------------===//
52// Instruction definitions.
53//===----------------------------------------------------------------------===//
54
55//===----------------------------------------------------------------------===//
56// Basic ALU instructions.
57//===----------------------------------------------------------------------===//
58
59let isCommutable = 1, isAdd = 1 in
60  def ADDU16 : R16_XYZ<0, "addu16", add>;
61let Pattern = [(set mGPR:$rz, (sub mGPR:$rx, mGPR:$ry))] in
62  def SUBU16 : R16_XYZ<1, "subu16", sub>;
63
64let isCommutable = 1, isAdd = 1 in
65  def ADDC16 : R16_XZ_BINOP_C<0b1000, 0b01, "addc16">;
66def SUBC16 : R16_XZ_BINOP_C<0b1000, 0b11, "subc16">;
67
68let isCommutable = 1 in {
69  let isAdd = 1 in
70  def ADDU16XZ : R16_XZ_BINOP<0b1000, 0b00, "addu16", BinOpFrag<(add node:$LHS, node:$RHS)>>;
71  def AND16 : R16_XZ_BINOP<0b1010, 0b00, "and16", BinOpFrag<(and node:$LHS, node:$RHS)>>;
72  def OR16 : R16_XZ_BINOP<0b1011, 0b00, "or16", BinOpFrag<(or node:$LHS, node:$RHS)>>;
73  def XOR16 : R16_XZ_BINOP<0b1011, 0b01, "xor16", BinOpFrag<(xor node:$LHS, node:$RHS)>>;
74  def NOR16 : R16_XZ_BINOP<0b1011, 0b10, "nor16", BinOpFrag<(not (or node:$LHS, node:$RHS))>>;
75  let isCodeGenOnly = 1 in
76  def NOT16 : R16_Z_UNOP<0b1011, 0b10, "not16">;
77  def MULT16 :  R16_XZ_BINOP<0b1111, 0b00, "mult16", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
78}
79def SUBU16XZ : R16_XZ_BINOP<0b1000, 0b10, "subu16", BinOpFrag<(sub node:$LHS, node:$RHS)>>;
80def ANDN16 : R16_XZ_BINOP<0b1010, 0b01, "andn16", BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
81def LSL16 : R16_XZ_BINOP<0b1100, 0b00, "lsl16", BinOpFrag<(shl node:$LHS, node:$RHS)>>;
82def LSR16 : R16_XZ_BINOP<0b1100, 0b01, "lsr16", BinOpFrag<(srl node:$LHS, node:$RHS)>>;
83def ASR16 : R16_XZ_BINOP<0b1100, 0b10, "asr16", BinOpFrag<(sra node:$LHS, node:$RHS)>>;
84def ROTL16 : R16_XZ_BINOP<0b1100, 0b11, "rotl16", BinOpFrag<(rotl node:$LHS, (and node:$RHS, 0x1f))>>;
85
86def MULSH16 : R16_XZ_BINOP_NOPat<0b1111, 0b01, "mulsh16">;
87
88def ZEXTB16 : R16_XZ_UNOP<0b1101, 0b00, "zextb16">;
89def ZEXTH16 : R16_XZ_UNOP<0b1101, 0b01, "zexth16">;
90def SEXTB16 : R16_XZ_UNOP<0b1101, 0b10, "sextb16">;
91def SEXTH16 : R16_XZ_UNOP<0b1101, 0b11, "sexth16">;
92
93let Constraints = "$rZ = $rz", isReMaterializable = 1, isAsCheapAsAMove = 1 in {
94  let isAdd = 1, Pattern = [(set mGPR:$rz, (add mGPR:$rZ, oimm8:$imm8))] in
95  def ADDI16 : I16_Z_8<0b100, (ins mGPR:$rZ, oimm8:$imm8), "addi16\t$rz, $imm8">;
96  let Pattern = [(set mGPR:$rz, (sub mGPR:$rZ, oimm8:$imm8))] in
97  def SUBI16 : I16_Z_8<0b101, (ins mGPR:$rZ, oimm8:$imm8), "subi16\t$rz, $imm8">;
98}
99
100def : Pat<(add GPR:$rs1, (oimm8_neg:$im)),
101          (SUBI16 GPR:$rs1, (imm_neg_XFORM oimm8_neg:$im))>;
102
103let isAdd = 1 in
104def ADDI16ZSP : I16_Z_8<0b011, (ins GPRSP:$sp, uimm8_2:$imm8),
105                        "addi16\t$rz, $sp, $imm8">;
106
107let isAdd = 1 in
108def ADDI16SPSP : I16_SP_IMM7<0b000,"addi16">;
109def SUBI16SPSP : I16_SP_IMM7<0b001,"subi16">;
110
111let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
112  def LSLI16 : I16_XZ_IMM5<0, "lsli16", shl>;
113  def LSRI16 : I16_XZ_IMM5<1, "lsri16", srl>;
114  def ASRI16 : I16_XZ_IMM5<2, "asri16", sra>;
115}
116
117let isAdd = 1 in
118def ADDI16XZ : I16_XZ_IMM3<0b10, "addi16", add>;
119def SUBI16XZ : I16_XZ_IMM3<0b11, "subi16", sub>;
120
121let Size = 4 in
122def NEG16 : CSKYPseudo<(outs mGPR:$rd), (ins mGPR:$rx), "neg16 $rd, $rx", []>;
123
124let Size = 4 in
125def RSUBI16 : CSKYPseudo<(outs mGPR:$rd),
126  (ins mGPR:$rx, uimm8:$imm8), "rsubi16 $rd, $rx, $imm8", []>;
127
128//===----------------------------------------------------------------------===//
129// Load & Store instructions.
130//===----------------------------------------------------------------------===//
131
132def LD16B : I16_XZ_LDST<AddrMode16B, 0b000, "ld16.b",
133  (outs mGPR:$rz), (ins mGPR:$rx, uimm5:$imm)>;
134def LD16H : I16_XZ_LDST<AddrMode16H, 0b001, "ld16.h",
135  (outs mGPR:$rz), (ins mGPR:$rx, uimm5_1:$imm)>;
136def LD16W : I16_XZ_LDST<AddrMode16W, 0b010, "ld16.w",
137  (outs mGPR:$rz), (ins mGPR:$rx, uimm5_2:$imm)>;
138def ST16B : I16_XZ_LDST<AddrMode16B, 0b100, "st16.b",
139  (outs), (ins mGPR:$rz, mGPR:$rx, uimm5:$imm)>;
140def ST16H : I16_XZ_LDST<AddrMode16H, 0b101, "st16.h",
141  (outs), (ins mGPR:$rz, mGPR:$rx, uimm5_1:$imm)>;
142def ST16W : I16_XZ_LDST<AddrMode16W, 0b110, "st16.w",
143  (outs), (ins mGPR:$rz, mGPR:$rx, uimm5_2:$imm)>;
144
145def LD16WSP : I16_ZSP_LDST<AddrMode16W, 0b011, "ld16.w",
146  (outs mGPR:$rz), (ins GPRSP:$sp, uimm8_2:$addr)>;
147def ST16WSP : I16_ZSP_LDST<AddrMode16W, 0b111, "st16.w",
148  (outs), (ins mGPR:$rz, GPRSP:$sp, uimm8_2:$addr)>;
149
150//===----------------------------------------------------------------------===//
151// Compare instructions.
152//===----------------------------------------------------------------------===//
153
154def CMPHS16 : R16_XY_CMP<0, "cmphs16">;
155def CMPLT16 : R16_XY_CMP<1, "cmplt16">;
156let isCommutable = 1 in
157def CMPNE16 : R16_XY_CMP<2, "cmpne16">;
158
159
160def CMPHSI16 : I16_X_CMP<0, "cmphsi16", oimm5>;
161def CMPLTI16 : I16_X_CMP<1, "cmplti16", oimm5>;
162def CMPLEI16 : CSKYPseudo<(outs CARRY:$ca), (ins mGPR:$rx, uimm5:$imm5),
163    "cmplei16\t$rx, $imm5", []>;
164def CMPNEI16 : I16_X_CMP<2, "cmpnei16", uimm5>;
165
166//===----------------------------------------------------------------------===//
167// Data move instructions.
168//===----------------------------------------------------------------------===//
169
170
171def MOVI16 : I16_Z_8<0b110, (ins uimm8:$imm8), "movi16\t$rz, $imm8"> {
172  let isReMaterializable = 1;
173  let isAsCheapAsAMove = 1;
174  let isMoveImm = 1;
175  let Pattern = [(set mGPR:$rz, uimm8:$imm8)];
176}
177
178def MOV16 : CSKY16Inst<AddrModeNone, (outs sGPR:$rz), (ins sGPR:$rx),
179                       "mov16\t$rz, $rx", []> {
180  bits<4> rz;
181  bits<4> rx;
182  let Inst{15,14} = 0b01;
183  let Inst{13 - 10} = 0b1011;
184  let Inst{9 - 6} = rz;
185  let Inst{5 - 2} = rx;
186  let Inst{1,0} = 0b11;
187}
188
189// MVC16 is not in "cskyv2 instructions reference manul"
190def MVCV16 : CSKY16Inst<AddrModeNone,
191  (outs sGPR:$rz), (ins CARRY:$ca), "mvcv16\t$rz", []> {
192  bits<4> rz;
193  let Inst{15,14} = 0b01;
194  let Inst{13 - 10} = 0b1001;
195  let Inst{9 - 6} = rz;
196  let Inst{5 - 2} = 0;
197  let Inst{1,0} = 0b11;
198}
199
200
201//===----------------------------------------------------------------------===//
202// Branch and call instructions.
203//===----------------------------------------------------------------------===//
204
205let isBranch = 1, isTerminator = 1 in {
206  let isBarrier = 1, isPredicable = 1 in
207    def BR16 : J16<1, "br16", (ins br_symbol_16bit:$offset)>;
208
209  def BT16 : J16_B<2, "bt16">;
210  def BF16 : J16_B<3, "bf16">;
211}
212
213def JMP16 : R16_X_J<0b11100000, 0b00, "jmp16"> {
214  let isBranch = 1;
215  let isTerminator = 1;
216  let isBarrier = 1;
217  let isIndirectBranch = 1;
218  let Pattern = [(brind sGPR:$rx)];
219}
220
221def JSR16 : R16_X_J<0b11101111, 0b01, "jsr16"> {
222  let isCall = 1;
223  let Defs = [ R15 ];
224}
225
226def RTS16 : CSKY16Inst<AddrModeNone, (outs), (ins), "rts16", [(CSKY_RET)]> {
227  let isTerminator = 1;
228  let isReturn = 1;
229  let isBarrier = 1;
230  let Inst = 0b0111100000111100;
231  let Uses = [R15];
232  let isCodeGenOnly = 1;
233}
234
235def JMPIX16 :  CSKY16Inst<AddrModeNone, (outs),
236  (ins mGPR:$rx, uimm2_jmpix:$indeximm2), "jmpix16\t$rx, $indeximm2", []> {
237  bits<3> rx;
238  bits<2> indeximm2;
239  let Inst{15,14} = 0b00;
240  let Inst{13 - 11} = 0b111;
241  let Inst{10 - 8} = rx;
242  let Inst{7 - 2} = 0b111000;
243  let Inst{1,0} = indeximm2;
244  let Predicates = [HasJAVA];
245  let Uses = [R30];
246}
247
248//===----------------------------------------------------------------------===//
249// Symbol address instructions.
250//===----------------------------------------------------------------------===//
251
252def LRW16 : CSKY16Inst<AddrModeNone, (outs mGPR:$rz),
253  (ins constpool_symbol_16bit:$label), "lrw16\t$rz, $label", []> {
254  bits<3> rz;
255  bits<8> label;
256  let Inst{15 - 13} = 0b000;
257  let Inst{12} = label{7};
258  let Inst{11,10} = 0b00;
259  let Inst{9,8} = label{6,5};
260  let Inst{7 - 5} = rz;
261  let Inst{4 - 0} = label{4-0};
262  let mayLoad = 1;
263  let mayStore = 0;
264}
265
266def LRW16_Gen : CSKY16Inst<AddrModeNone, (outs mGPR:$rz),
267  (ins bare_symbol:$src, constpool_symbol_16bit:$label),
268  "lrw16\t$rz, $label", []> {
269  bits<3> rz;
270  bits<8> label;
271  let Inst{15 - 13} = 0b000;
272  let Inst{12} = label{7};
273  let Inst{11,10} = 0b00;
274  let Inst{9,8} = label{6,5};
275  let Inst{7 - 5} = rz;
276  let Inst{4 - 0} = label{4-0};
277  let mayLoad = 1;
278  let mayStore = 0;
279  let isCodeGenOnly = 1;
280}
281
282
283//===----------------------------------------------------------------------===//
284// Other operation instructions.
285//===----------------------------------------------------------------------===//
286
287def REVB16 :  R16_XZ_UNOP<0b1110, 0b10, "revb16">;
288def REVH16 :  R16_XZ_UNOP<0b1110, 0b11, "revh16">;
289
290let isCodeGenOnly = 1 in
291def SETC16 : CSKY16Inst<AddrModeNone,
292  (outs CARRY:$ca), (ins), "setc16", []> {
293  let Inst{15, 14} = 0b01;
294  let Inst{13 - 10} = 0b1001;
295  let Inst{9 - 6} = 0;
296  let Inst{5 - 2} = 0;
297  let Inst{1, 0} = 0;
298  let isCompare = 1;
299}
300
301let isCodeGenOnly = 1 in
302def CLRC16 : CSKY16Inst<AddrModeNone,
303  (outs CARRY:$ca), (ins), "clrc16", []> {
304  let Inst{15, 14} = 0b01;
305  let Inst{13 - 10} = 0b1001;
306  let Inst{9 - 6} = 0;
307  let Inst{5 - 2} = 0;
308  let Inst{1, 0} = 2;
309  let isCompare = 1;
310}
311
312let Constraints = "$rZ = $rz" in {
313  def BCLRI16 : I16_Z_5<0b100, (outs mGPR:$rz), (ins mGPR:$rZ, uimm5:$imm5),
314                        "bclri16">;
315  def BSETI16 : I16_Z_5<0b101, (outs mGPR:$rz), (ins mGPR:$rZ, uimm5:$imm5),
316                        "bseti16">;
317}
318
319let Predicates = [HasBTST16] in
320  def BTSTI16 : I16_Z_5<0b110, (outs CARRY:$ca), (ins mGPR:$rz, uimm5:$imm5),
321                        "btsti16">;
322
323def TST16 : CSKY16Inst<AddrModeNone, (outs CARRY:$ca), (ins sGPR:$rx, sGPR:$ry),
324                        "tst16\t$rx, $ry", []> {
325  bits<4> ry;
326  bits<4> rx;
327  let Inst{15,14} = 0b01;
328  let Inst{13 - 10} = 0b1010;
329  let Inst{9 - 6} = ry;
330  let Inst{5 - 2} = rx;
331  let Inst{1,0} = 0b10;
332  let isCompare = 1;
333}
334
335def TSTNBZ16 : CSKY16Inst<AddrModeNone, (outs CARRY:$ca), (ins sGPR:$rx),
336                          "tstnbz16\t$rx", []> {
337  bits<4> rx;
338  let Inst{15,14} = 0b01;
339  let Inst{13 - 10} = 0b1010;
340  let Inst{9 - 6} = 0b0000;
341  let Inst{5 - 2} = rx;
342  let Inst{1,0} = 0b11;
343  let isCompare = 1;
344}
345
346//===----------------------------------------------------------------------===//
347// Special instructions.
348//===----------------------------------------------------------------------===//
349
350def BKPT : CSKY16Inst<AddrModeNone, (outs), (ins), "bkpt", []> {
351  let Inst = 0;
352}
353
354let mayStore = 1 in {
355def BPUSHH : I16_BPushPop<0b00010100111, 0, (outs), (ins mGPR:$rz), "bpush.h $rz">;
356def BPUSHW : I16_BPushPop<0b00010100111, 0b10, (outs), (ins mGPR:$rz), "bpush.w $rz">;
357}
358
359let mayLoad = 1 in {
360def BPOPH : I16_BPushPop<0b00010100101, 0, (outs mGPR:$rz), (ins),  "bpop.h $rz">;
361def BPOPW : I16_BPushPop<0b00010100101, 0b10, (outs mGPR:$rz), (ins), "bpop.w $rz">;
362}
363
364def NIE : CSKY16Inst<AddrModeNone, (outs), (ins), "nie", [(CSKY_NIE)]> {
365  let Inst = 0b0001010001100000;
366}
367
368let isBarrier = 1, isReturn = 1, isTerminator = 1 in
369def NIR : CSKY16Inst<AddrModeNone, (outs), (ins), "nir", [(CSKY_NIR)]> {
370  let Inst = 0b0001010001100001;
371}
372
373def IPUSH16 : CSKY16Inst<AddrModeNone, (outs), (ins), "ipush16", []> {
374  let Inst{15- 5} = 0b00010100011;
375  let Inst{4-0} = 0b00010;
376  let Predicates = [iHasE1];
377  let Defs  = [R14];
378  let Uses  = [R14, R0, R1, R2, R3, R12, R13];
379  let mayStore = 1;
380}
381
382def IPOP16 : CSKY16Inst<AddrModeNone, (outs), (ins), "ipop16", []> {
383  let Inst{15- 5} = 0b00010100011;
384  let Inst{4-0} = 0b00011;
385  let Predicates = [iHasE1];
386  let Defs  = [R14, R0, R1, R2, R3, R12, R13];
387  let Uses  = [R14];
388  let mayLoad = 1;
389}
390
391def PUSH16 : CSKY16Inst<AddrModeNone, (outs),
392  (ins reglist:$regs, variable_ops), "push16 $regs", []> {
393  bits<5> regs;
394
395  let Inst{15- 5} = 0b00010100110;
396  let Inst{4-0} = regs;
397  let Predicates = [iHasE1];
398  let Defs  = [R14];
399  let Uses  = [R14];
400  let mayStore = 1;
401}
402
403def POP16 : CSKY16Inst<AddrModeNone, (outs),
404  (ins reglist:$regs, variable_ops), "pop16 $regs", []> {
405  bits<5> regs;
406
407  let Inst{15- 5} = 0b00010100100;
408  let Inst{4-0} = regs;
409  let Predicates = [iHasE1];
410  let Defs  = [R14];
411  let Uses  = [R14];
412  let mayLoad = 1;
413}
414
415//===----------------------------------------------------------------------===//
416// CSKYPseudo
417//===----------------------------------------------------------------------===//
418
419let usesCustomInserter = 1 in  {
420  def ISEL16 : CSKYPseudo<(outs sGPR:$dst),
421    (ins CARRY:$cond, sGPR:$src1, sGPR:$src2),
422    "!isel16\t$dst, $src1, src2",
423    [(set sGPR:$dst, (select CARRY:$cond, sGPR:$src1, sGPR:$src2))]>;
424}
425
426class JBranchPseudo<dag out, dag ins, string opstr> :
427  CSKYPseudo<out, ins, opstr, []> {
428  let isBranch = 1;
429  let isTerminator = 1;
430  let isIndirectBranch = 1;
431  let mayLoad = 1;
432  let Size = 2;
433}
434
435let isBarrier = 1 in
436def JBR16 : JBranchPseudo<(outs),
437  (ins br_symbol_16bit:$src1), "jbr16\t$src1">;
438def JBT16 : JBranchPseudo<(outs),
439  (ins CARRY:$ca, br_symbol_16bit:$src1), "jbt16\t$src1">;
440def JBF16 : JBranchPseudo<(outs),
441  (ins CARRY:$ca, br_symbol_16bit:$src1), "jbf16\t$src1">;
442
443let mayLoad = 1, Size = 2, isCodeGenOnly = 0 in
444def PseudoLRW16 : CSKYPseudo<(outs mGPR:$rz),
445  (ins bare_symbol:$src), "lrw16 $rz, $src", []>;
446
447//===----------------------------------------------------------------------===//
448// Instruction Patterns.
449//===----------------------------------------------------------------------===//
450
451def : Pat<(sext_inreg mGPR:$src, i1), (ASRI16 (LSLI16 mGPR:$src, 7), 7)>;
452def : Pat<(sext_inreg sGPR:$src, i8), (SEXTB16 sGPR:$src)>;
453def : Pat<(sext_inreg sGPR:$src, i16), (SEXTH16 sGPR:$src)>;
454
455// Load & Store Patterns
456
457defm : LdPat<extloadi8, uimm5, LD16B, i32>;
458defm : LdPat<zextloadi8, uimm5, LD16B, i32>;
459
460defm : LdPat<extloadi16, uimm5_1, LD16H, i32>;
461defm : LdPat<zextloadi16, uimm5_1, LD16H, i32>;
462
463defm : LdPat<load, uimm5_2, LD16W, i32>;
464
465
466defm : StPat<truncstorei8, i32, uimm5, ST16B>;
467defm : StPat<truncstorei16, i32, uimm5_1, ST16H>;
468defm : StPat<store, i32, uimm5_2, ST16W>;
469
470def : Pat<(CSKY_CALLReg sGPR:$src), (JSR16 sGPR:$src)>;
471def : Pat<(CSKY_TAILReg sGPR:$src), (JMP16 sGPR:$src)>;
472
473// Symbol address Patterns
474def : Pat<(CSKY_LOAD_ADDR tglobaladdr, tconstpool:$src2), (LRW16 tconstpool:$src2)>;
475def : Pat<(CSKY_LOAD_ADDR tblockaddress, tconstpool:$src2), (LRW16 tconstpool:$src2)>;
476def : Pat<(CSKY_LOAD_ADDR tjumptable:$src1, tconstpool:$src2), (LRW16_Gen tjumptable:$src1, tconstpool:$src2)>;
477def : Pat<(CSKY_LOAD_ADDR texternalsym, tconstpool:$src2), (LRW16 tconstpool:$src2)>;
478def : Pat<(CSKY_LOAD_ADDR tconstpool:$src1, tconstpool:$src2), (LRW16_Gen tconstpool:$src1, tconstpool:$src2)>;
479
480def : Pat<(i32 (load constpool:$src)), (LRW16 (to_tconstpool tconstpool:$src))>;
481
482// Branch Patterns.
483
484def : Pat<(brcond CARRY:$ca, bb:$offset),
485          (BT16 CARRY:$ca, bb:$offset)>;
486
487def : Pat<(br bb:$offset), (BR16 bb:$offset)>;
488
489multiclass BTF16Pat0<PatFrag cond0, PatFrag cond1, ImmLeaf imm_ty, Instruction inst> {
490  def : Pat<(brcond (i32 (cond0 mGPR:$rs1, imm_ty:$rs2)), bb:$offset),
491            (BT16 (inst mGPR:$rs1, imm_ty:$rs2), bb:$offset)>;
492  def : Pat<(brcond (i32 (cond1 mGPR:$rs1, imm_ty:$rs2)), bb:$offset),
493            (BF16 (inst mGPR:$rs1, imm_ty:$rs2), bb:$offset)>;
494}
495
496defm : BTF16Pat0<setne, seteq, uimm5, CMPNEI16>;
497defm : BTF16Pat0<setuge, setult, oimm5, CMPHSI16>;
498defm : BTF16Pat0<setlt, setge, oimm5, CMPLTI16>;
499
500def : Pat<(brcond (i32 (setne sGPR:$rs1, sGPR:$rs2)), bb:$offset),
501          (BT16 (CMPNE16 sGPR:$rs1, sGPR:$rs2), bb:$offset)>;
502def : Pat<(brcond (i32 (seteq sGPR:$rs1, sGPR:$rs2)), bb:$offset),
503          (BF16 (CMPNE16 sGPR:$rs1, sGPR:$rs2), bb:$offset)>;
504
505multiclass BTF16Pat1<PatFrag cond0, PatFrag cond1, Instruction cmp,
506                     Instruction br>  {
507  def : Pat<(brcond (i32 (cond0 sGPR:$rs1, sGPR:$rs2)), bb:$offset),
508            (br (cmp sGPR:$rs1, sGPR:$rs2), bb:$offset)>;
509  def : Pat<(brcond (i32 (cond1 sGPR:$rs1, sGPR:$rs2)), bb:$offset),
510            (br (cmp sGPR:$rs2, sGPR:$rs1), bb:$offset)>;
511}
512
513defm : BTF16Pat1<setuge, setule, CMPHS16, BT16>;
514defm : BTF16Pat1<setult, setugt, CMPHS16, BF16>;
515defm : BTF16Pat1<setlt, setgt, CMPLT16, BT16>;
516defm : BTF16Pat1<setge, setle, CMPLT16, BF16>;
517
518// Compare Patterns.
519def : Pat<(setne sGPR:$rs1, sGPR:$rs2),
520          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPNE16 sGPR:$rs1, sGPR:$rs2)))>;
521def : Pat<(seteq sGPR:$rs1, sGPR:$rs2),
522          (MVCV16 (CMPNE16 sGPR:$rs1, sGPR:$rs2))>;
523def : Pat<(setuge sGPR:$rs1, sGPR:$rs2),
524          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPHS16 sGPR:$rs1, sGPR:$rs2)))>;
525def : Pat<(setule sGPR:$rs1, sGPR:$rs2),
526          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPHS16 sGPR:$rs2, sGPR:$rs1)))>;
527def : Pat<(setult sGPR:$rs1, sGPR:$rs2),
528          (MVCV16 (CMPHS16 sGPR:$rs1, sGPR:$rs2))>;
529def : Pat<(setugt sGPR:$rs1, sGPR:$rs2),
530          (MVCV16 (CMPHS16 sGPR:$rs2, sGPR:$rs1))>;
531def : Pat<(setlt sGPR:$rs1, sGPR:$rs2),
532          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPLT16 sGPR:$rs1, sGPR:$rs2)))>;
533def : Pat<(setgt sGPR:$rs1, sGPR:$rs2),
534          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPLT16 sGPR:$rs2, sGPR:$rs1)))>;
535def : Pat<(setge sGPR:$rs1, sGPR:$rs2),
536          (MVCV16 (CMPLT16 sGPR:$rs1, sGPR:$rs2))>;
537def : Pat<(setle sGPR:$rs1, sGPR:$rs2),
538          (MVCV16 (CMPLT16 sGPR:$rs2, sGPR:$rs1))>;
539
540
541def : Pat<(setne mGPR:$rs1, uimm5:$rs2),
542          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPNEI16 mGPR:$rs1, uimm5:$rs2)))>;
543def : Pat<(seteq mGPR:$rs1, uimm5:$rs2),
544          (MVCV16 (CMPNEI16 mGPR:$rs1, uimm5:$rs2))>;
545def : Pat<(setuge mGPR:$rs1, oimm5:$rs2),
546          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPHSI16 mGPR:$rs1, oimm5:$rs2)))>;
547def : Pat<(setult mGPR:$rs1, oimm5:$rs2),
548          (MVCV16 (CMPHSI16 mGPR:$rs1, oimm5:$rs2))>;
549def : Pat<(setlt mGPR:$rs1, oimm5:$rs2),
550          (SUBU16XZ (MOVI16 1), (MVCV16 (CMPLTI16 mGPR:$rs1, oimm5:$rs2)))>;
551def : Pat<(setge mGPR:$rs1, oimm5:$rs2),
552          (MVCV16 (CMPLTI16 mGPR:$rs1, oimm5:$rs2))>;
553
554def : Pat<(select CARRY:$ca, sGPR:$rx, sGPR:$false),
555          (ISEL16 CARRY:$ca, sGPR:$rx, sGPR:$false)>;
556def : Pat<(select (and CARRY:$ca, 1), sGPR:$rx, sGPR:$false),
557          (ISEL16 CARRY:$ca, sGPR:$rx, sGPR:$false)>;
558
559def : Pat<(rotl sGPR:$rs1, sGPR:$rs2),
560          (ROTL16 sGPR:$rs1, (AND16 sGPR:$rs2, (MOVI16 0x1f)))>;
561
562
563// FIXME: This is a temporary treatment for the e801.
564def : Pat<(i32 imm:$imm),
565          (OR16 (MOVI16 (uimm8SRL_0 imm:$imm)),
566	              (OR16 (LSLI16 (MOVI16 (uimm8SRL_8 imm:$imm)), 8),
567	                    (OR16 (LSLI16 (MOVI16 (uimm8SRL_16 imm:$imm)), 16),
568                            (LSLI16 (MOVI16 (uimm8SRL_24 imm:$imm)), 24))))>;
569
570// Other operations.
571let Predicates = [iHasE2] in {
572  def : Pat<(bswap sGPR:$rx), (REVB16 sGPR:$rx)>;
573}
574
575//===----------------------------------------------------------------------===//
576// Compress Instruction tablegen backend.
577//===----------------------------------------------------------------------===//
578
579def : CompressPat<(ADDU32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
580                  (ADDU16XZ sGPR:$rd, sGPR:$rs2)>;
581def : CompressPat<(ADDU32 sGPR:$rd, sGPR:$rs1, sGPR:$rd),
582                  (ADDU16XZ sGPR:$rd, sGPR:$rs1)>;
583def : CompressPat<(ADDU32 mGPR:$rd, mGPR:$rs1, mGPR:$rs2),
584                  (ADDU16 mGPR:$rd, mGPR:$rs1, mGPR:$rs2)>;
585def : CompressPat<(SUBU32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
586                  (SUBU16XZ sGPR:$rd, sGPR:$rs2)>;
587def : CompressPat<(SUBU32 mGPR:$rd, mGPR:$rs1, mGPR:$rs2),
588                  (SUBU16 mGPR:$rd, mGPR:$rs1, mGPR:$rs2)>;
589
590def : CompressPat<
591  (ADDC32 sGPR:$rd, CARRY:$cout, sGPR:$rd, sGPR:$rs2, CARRY:$cout),
592  (ADDC16 sGPR:$rd, CARRY:$cout, sGPR:$rs2, CARRY:$cout)
593  >;
594def : CompressPat<
595  (SUBC32 sGPR:$rd, CARRY:$cout, sGPR:$rd, sGPR:$rs2, CARRY:$cout),
596  (SUBC16 sGPR:$rd, CARRY:$cout, sGPR:$rs2, CARRY:$cout)
597  >;
598
599def : CompressPat<(ADDI32 mGPR:$rd, mGPR:$rs, oimm3:$imm),
600                  (ADDI16XZ mGPR:$rd, mGPR:$rs, oimm3:$imm)>;
601def : CompressPat<(SUBI32 mGPR:$rd, mGPR:$rs, oimm3:$imm),
602                  (SUBI16XZ mGPR:$rd, mGPR:$rs, oimm3:$imm)>;
603
604def : CompressPat<(ADDI32 mGPR:$rd, mGPR:$rd, oimm8:$imm),
605                  (ADDI16 mGPR:$rd, oimm8:$imm)>;
606def : CompressPat<(SUBI32 mGPR:$rd, mGPR:$rd, oimm8:$imm),
607                  (SUBI16 mGPR:$rd, oimm8:$imm)>;
608
609def : CompressPat<(ADDI32 GPRSP:$sp, GPRSP:$sp, uimm7_2:$imm),
610                  (ADDI16SPSP GPRSP:$sp, GPRSP:$sp, uimm7_2:$imm)>;
611def : CompressPat<(SUBI32 GPRSP:$sp, GPRSP:$sp, uimm7_2:$imm),
612                  (SUBI16SPSP GPRSP:$sp, GPRSP:$sp, uimm7_2:$imm)>;
613
614def : CompressPat<(ADDI32 mGPR:$rd, GPRSP:$sp, uimm8_2:$imm),
615                  (ADDI16ZSP mGPR:$rd, GPRSP:$sp, uimm8_2:$imm)>;
616
617def : CompressPat<(MULT32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
618                  (MULT16 sGPR:$rd, sGPR:$rs2)>;
619def : CompressPat<(MULT32 sGPR:$rd, sGPR:$rs1, sGPR:$rd),
620                  (MULT16 sGPR:$rd, sGPR:$rs1)>;
621def : CompressPat<(AND32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
622                  (AND16 sGPR:$rd, sGPR:$rs2)>;
623def : CompressPat<(AND32 sGPR:$rd, sGPR:$rs1, sGPR:$rd),
624                  (AND16 sGPR:$rd, sGPR:$rs1)>;
625def : CompressPat<(OR32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
626                  (OR16 sGPR:$rd, sGPR:$rs2)>;
627def : CompressPat<(OR32 sGPR:$rd, sGPR:$rs1, sGPR:$rd),
628                  (OR16 sGPR:$rd, sGPR:$rs1)>;
629def : CompressPat<(XOR32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
630                  (XOR16 sGPR:$rd, sGPR:$rs2)>;
631def : CompressPat<(XOR32 sGPR:$rd, sGPR:$rs1, sGPR:$rd),
632                  (XOR16 sGPR:$rd, sGPR:$rs1)>;
633
634def : CompressPat<(ANDN32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
635                  (ANDN16 sGPR:$rd, sGPR:$rs2)>;
636def : CompressPat<(NOR32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
637                  (NOR16 sGPR:$rd, sGPR:$rs2)>;
638def : CompressPat<(LSL32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
639                  (LSL16 sGPR:$rd, sGPR:$rs2)>;
640def : CompressPat<(LSR32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
641                  (LSR16 sGPR:$rd, sGPR:$rs2)>;
642def : CompressPat<(ASR32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
643                  (ASR16 sGPR:$rd, sGPR:$rs2)>;
644def : CompressPat<(ROTL32 sGPR:$rd, sGPR:$rd, sGPR:$rs2),
645                  (ROTL16 sGPR:$rd, sGPR:$rs2)>;
646
647def : CompressPat<(NOT32 sGPR:$rd, sGPR:$rd),
648                  (NOT16 sGPR:$rd)>;
649
650let Predicates = [iHas2E3] in
651def : CompressPat<(REVB32 sGPR:$rd, sGPR:$rs),
652                  (REVB16 sGPR:$rd, sGPR:$rs)>;
653
654def : CompressPat<(LSLI32 mGPR:$rd, mGPR:$rs, uimm5:$imm),
655                  (LSLI16 mGPR:$rd, mGPR:$rs, uimm5:$imm)>;
656def : CompressPat<(LSRI32 mGPR:$rd, mGPR:$rs, uimm5:$imm),
657                  (LSRI16 mGPR:$rd, mGPR:$rs, uimm5:$imm)>;
658def : CompressPat<(ASRI32 mGPR:$rd, mGPR:$rs, uimm5:$imm),
659                  (ASRI16 mGPR:$rd, mGPR:$rs, uimm5:$imm)>;
660
661def : CompressPat<(CMPHS32 CARRY:$ca, sGPR:$rs1, sGPR:$rs2),
662                  (CMPHS16 CARRY:$ca, sGPR:$rs1, sGPR:$rs2)>;
663def : CompressPat<(CMPLT32 CARRY:$ca, sGPR:$rs1, sGPR:$rs2),
664                  (CMPLT16 CARRY:$ca, sGPR:$rs1, sGPR:$rs2)>;
665def : CompressPat<(CMPNE32 CARRY:$ca, sGPR:$rs1, sGPR:$rs2),
666                  (CMPNE16 CARRY:$ca, sGPR:$rs1, sGPR:$rs2)>;
667
668def : CompressPat<(CMPHSI32 CARRY:$ca, mGPR:$rs, oimm5:$imm),
669                  (CMPHSI16 CARRY:$ca, mGPR:$rs, oimm5:$imm)>;
670def : CompressPat<(CMPLTI32 CARRY:$ca, mGPR:$rs, oimm5:$imm),
671                  (CMPLTI16 CARRY:$ca, mGPR:$rs, oimm5:$imm)>;
672def : CompressPat<(CMPNEI32 CARRY:$ca, mGPR:$rs, uimm5:$imm),
673                  (CMPNEI16 CARRY:$ca, mGPR:$rs, uimm5:$imm)>;
674
675def : CompressPat<(JSR32 sGPR:$rd),
676                  (JSR16 sGPR:$rd)>;
677
678
679def : CompressPat<(MVCV32 sGPR:$rd, CARRY:$ca),
680                  (MVCV16 sGPR:$rd, CARRY:$ca)>;
681def : CompressPat<(MOV32 sGPR:$rd, sGPR:$ca),
682                  (MOV16 sGPR:$rd, sGPR:$ca)>;
683def : CompressPat<(MOVI32 mGPR:$rd, uimm8:$imm),
684                  (MOVI16 mGPR:$rd, uimm8:$imm)>;
685
686def : CompressPat<(LD32B mGPR:$rd, mGPR:$rs, uimm5:$imm),
687                  (LD16B mGPR:$rd, mGPR:$rs, uimm5:$imm)>;
688def : CompressPat<(LD32H mGPR:$rd, mGPR:$rs, uimm5_1:$imm),
689                  (LD16H mGPR:$rd, mGPR:$rs, uimm5_1:$imm)>;
690def : CompressPat<(LD32W mGPR:$rd, mGPR:$rs, uimm5_2:$imm),
691                  (LD16W mGPR:$rd, mGPR:$rs, uimm5_2:$imm)>;
692def : CompressPat<(LD32W mGPR:$rd, GPRSP:$sp, uimm8_2:$imm),
693                  (LD16WSP mGPR:$rd, GPRSP:$sp, uimm8_2:$imm)>;
694
695def : CompressPat<(ST32B mGPR:$rd, mGPR:$rs, uimm5:$imm),
696                  (ST16B mGPR:$rd, mGPR:$rs, uimm5:$imm)>;
697def : CompressPat<(ST32H mGPR:$rd, mGPR:$rs, uimm5_1:$imm),
698                  (ST16H mGPR:$rd, mGPR:$rs, uimm5_1:$imm)>;
699def : CompressPat<(ST32W mGPR:$rd, mGPR:$rs, uimm5_2:$imm),
700                  (ST16W mGPR:$rd, mGPR:$rs, uimm5_2:$imm)>;
701def : CompressPat<(ST32W mGPR:$rd, GPRSP:$sp, uimm8_2:$imm),
702                  (ST16WSP mGPR:$rd, GPRSP:$sp, uimm8_2:$imm)>;
703
704let Predicates = [HasBTST16] in
705def : CompressPat<(BTSTI32 CARRY:$ca, mGPR:$rs, uimm5:$imm),
706                  (BTSTI16 CARRY:$ca, mGPR:$rs, uimm5:$imm)>;
707def : CompressPat<(BCLRI32 mGPR:$rd, mGPR:$rd, uimm5:$imm),
708                  (BCLRI16 mGPR:$rd, uimm5:$imm)>;
709def : CompressPat<(BSETI32 mGPR:$rd, mGPR:$rd, uimm5:$imm),
710                  (BSETI16 mGPR:$rd, uimm5:$imm)>;
711
712def : CompressPat<(ZEXTB32 sGPR:$rd, sGPR:$rs),
713                  (ZEXTB16 sGPR:$rd, sGPR:$rs)>;
714def : CompressPat<(ZEXTH32 sGPR:$rd, sGPR:$rs),
715                  (ZEXTH16 sGPR:$rd, sGPR:$rs)>;
716def : CompressPat<(SEXTB32 sGPR:$rd, sGPR:$rs),
717                  (SEXTB16 sGPR:$rd, sGPR:$rs)>;
718def : CompressPat<(SEXTH32 sGPR:$rd, sGPR:$rs),
719                  (SEXTH16 sGPR:$rd, sGPR:$rs)>;
720