blob: 471180fa491647f4f4de00a4065267a4d0a65651 [file] [log] [blame]
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +00001//===- PIC16InstrInfo.td - PIC16 Instruction defs -------------*- tblgen-*-===//
Sanjiv Gupta0e687712008-05-13 09:02:57 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +00009//
Sanjiv Gupta5af3ee22009-01-30 09:01:44 +000010// This file describes the PIC16 instructions in TableGen format.
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000011//
Sanjiv Gupta0e687712008-05-13 09:02:57 +000012//===----------------------------------------------------------------------===//
13
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000014//===----------------------------------------------------------------------===//
15// PIC16 Specific Type Constraints.
16//===----------------------------------------------------------------------===//
17class SDTCisI8<int OpNum> : SDTCisVT<OpNum, i8>;
18class SDTCisI16<int OpNum> : SDTCisVT<OpNum, i16>;
19
20//===----------------------------------------------------------------------===//
21// PIC16 Specific Type Profiles.
22//===----------------------------------------------------------------------===//
23
24// Generic type profiles for i8/i16 unary/binary operations.
25// Taking one i8 or i16 and producing void.
26def SDTI8VoidOp : SDTypeProfile<0, 1, [SDTCisI8<0>]>;
27def SDTI16VoidOp : SDTypeProfile<0, 1, [SDTCisI16<0>]>;
28
29// Taking one value and producing an output of same type.
30def SDTI8UnaryOp : SDTypeProfile<1, 1, [SDTCisI8<0>, SDTCisI8<1>]>;
31def SDTI16UnaryOp : SDTypeProfile<1, 1, [SDTCisI16<0>, SDTCisI16<1>]>;
32
33// Taking two values and producing an output of same type.
34def SDTI8BinOp : SDTypeProfile<1, 2, [SDTCisI8<0>, SDTCisI8<1>, SDTCisI8<2>]>;
35def SDTI16BinOp : SDTypeProfile<1, 2, [SDTCisI16<0>, SDTCisI16<1>,
36 SDTCisI16<2>]>;
37
38// Node specific type profiles.
39def SDT_PIC16Load : SDTypeProfile<1, 3, [SDTCisI8<0>, SDTCisI8<1>,
40 SDTCisI8<2>, SDTCisI8<3>]>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +000041
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000042def SDT_PIC16Store : SDTypeProfile<0, 4, [SDTCisI8<0>, SDTCisI8<1>,
43 SDTCisI8<2>, SDTCisI8<3>]>;
44
Sanjiv Gupta1b046942009-01-13 19:18:47 +000045// PIC16ISD::CALL type prorile
46def SDT_PIC16call : SDTypeProfile<0, -1, [SDTCisInt<0>]>;
47
48// PIC16ISD::BRCOND
49def SDT_PIC16Brcond: SDTypeProfile<0, 2,
50 [SDTCisVT<0, OtherVT>, SDTCisI8<1>]>;
51
52// PIC16ISD::BRCOND
53def SDT_PIC16Selecticc: SDTypeProfile<1, 3,
54 [SDTCisI8<0>, SDTCisI8<1>, SDTCisI8<2>,
55 SDTCisI8<3>]>;
56
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000057//===----------------------------------------------------------------------===//
58// PIC16 addressing modes matching via DAG.
59//===----------------------------------------------------------------------===//
60def diraddr : ComplexPattern<i8, 1, "SelectDirectAddr", [], []>;
61
62//===----------------------------------------------------------------------===//
63// PIC16 Specific Node Definitions.
64//===----------------------------------------------------------------------===//
65def PIC16callseq_start : SDNode<"ISD::CALLSEQ_START", SDTI8VoidOp,
66 [SDNPHasChain, SDNPOutFlag]>;
67def PIC16callseq_end : SDNode<"ISD::CALLSEQ_END", SDTI8VoidOp,
Sanjiv Gupta1b046942009-01-13 19:18:47 +000068 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000069
70// Low 8-bits of GlobalAddress.
71def PIC16Lo : SDNode<"PIC16ISD::Lo", SDTI8UnaryOp>;
72
73// High 8-bits of GlobalAddress.
74def PIC16Hi : SDNode<"PIC16ISD::Hi", SDTI8UnaryOp>;
75
76// The MTHI and MTLO nodes are used only to match them in the incoming
77// DAG for replacement by corresponding set_fsrhi, set_fsrlo insntructions.
78// These nodes are not used for defining any instructions.
79def MTLO : SDNode<"PIC16ISD::MTLO", SDTI8UnaryOp>;
80def MTHI : SDNode<"PIC16ISD::MTHI", SDTI8UnaryOp>;
81
82// Node to generate Bank Select for a GlobalAddress.
83def Banksel : SDNode<"PIC16ISD::Banksel", SDTI8UnaryOp>;
84
85// Node to match a direct store operation.
86def PIC16Store : SDNode<"PIC16ISD::PIC16Store", SDT_PIC16Store, [SDNPHasChain]>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +000087def PIC16StWF : SDNode<"PIC16ISD::PIC16StWF", SDT_PIC16Store,
88 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000089
90// Node to match a direct load operation.
Sanjiv Guptab84d5a42009-04-02 17:42:00 +000091def PIC16Load : SDNode<"PIC16ISD::PIC16Load", SDT_PIC16Load, [SDNPHasChain]>;
92def PIC16LdArg : SDNode<"PIC16ISD::PIC16LdArg", SDT_PIC16Load, [SDNPHasChain]>;
93def PIC16LdWF : SDNode<"PIC16ISD::PIC16LdWF", SDT_PIC16Load,
Sanjiv Gupta1b046942009-01-13 19:18:47 +000094 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000095
Sanjiv Gupta1b046942009-01-13 19:18:47 +000096// Node to match PIC16 call
97def PIC16call : SDNode<"PIC16ISD::CALL", SDT_PIC16call,
98 [SDNPHasChain , SDNPOptInFlag, SDNPOutFlag]>;
99
100// Node to match a comparison instruction.
101def PIC16Subcc : SDNode<"PIC16ISD::SUBCC", SDTI8BinOp, [SDNPOutFlag]>;
102
103// Node to match a conditional branch.
104def PIC16Brcond : SDNode<"PIC16ISD::BRCOND", SDT_PIC16Brcond,
105 [SDNPHasChain, SDNPInFlag]>;
106
107def PIC16Selecticc : SDNode<"PIC16ISD::SELECT_ICC", SDT_PIC16Selecticc,
108 [SDNPInFlag]>;
109
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000110//===----------------------------------------------------------------------===//
111// PIC16 Operand Definitions.
112//===----------------------------------------------------------------------===//
113def i8mem : Operand<i8>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000114def brtarget: Operand<OtherVT>;
115
116// Operand for printing out a condition code.
117let PrintMethod = "printCCOperand" in
118 def CCOp : Operand<i8>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000119
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000120include "PIC16InstrFormats.td"
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000121
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000122//===----------------------------------------------------------------------===//
123// PIC16 Common Classes.
124//===----------------------------------------------------------------------===//
125
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000126// W = W Op F : Load the value from F and do Op to W.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000127let isTwoAddress = 1 in
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000128class BinOpFW<bits<6> OpCode, string OpcStr, SDNode OpNode>:
129 ByteFormat<OpCode, (outs GPR:$dst),
130 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
131 !strconcat(OpcStr, " $ptrlo + $offset, W"),
132 [(set GPR:$dst, (OpNode GPR:$src, (PIC16Load diraddr:$ptrlo,
133 (i8 imm:$ptrhi),
134 (i8 imm:$offset))))]>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000135
136// F = F Op W : Load the value from F, do op with W and store in F.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000137// This insn class is not marked as TwoAddress because the reg is
138// being used as a source operand only. (Remember a TwoAddress insn
139// needs a copyRegToReg.)
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000140class BinOpWF<bits<6> OpCode, string OpcStr, SDNode OpNode>:
141 ByteFormat<OpCode, (outs),
142 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
143 !strconcat(OpcStr, " $ptrlo + $offset"),
144 [(PIC16Store (OpNode GPR:$src, (PIC16Load diraddr:$ptrlo,
145 (i8 imm:$ptrhi),
146 (i8 imm:$offset))),
147 diraddr:$ptrlo,
148 (i8 imm:$ptrhi), (i8 imm:$offset)
149 )]>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000150
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000151// W = W Op L : Do Op of L with W and place result in W.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000152let isTwoAddress = 1 in
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000153class BinOpLW<bits<6> opcode, string OpcStr, SDNode OpNode> :
154 LiteralFormat<opcode, (outs GPR:$dst),
155 (ins GPR:$src, i8imm:$literal),
156 !strconcat(OpcStr, " $literal"),
157 [(set GPR:$dst, (OpNode GPR:$src, (i8 imm:$literal)))]>;
158
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000159//===----------------------------------------------------------------------===//
160// PIC16 Instructions.
161//===----------------------------------------------------------------------===//
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000162
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000163// Pseudo-instructions.
164def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i8imm:$amt),
165 "!ADJCALLSTACKDOWN $amt",
166 [(PIC16callseq_start imm:$amt)]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000167
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000168def ADJCALLSTACKUP : Pseudo<(outs), (ins i8imm:$amt),
169 "!ADJCALLSTACKUP $amt",
170 [(PIC16callseq_end imm:$amt)]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000171
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000172//-----------------------------------
173// Vaious movlw insn patterns.
174//-----------------------------------
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000175let isReMaterializable = 1 in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000176// Move 8-bit literal to W.
177def movlw : BitFormat<12, (outs GPR:$dst), (ins i8imm:$src),
178 "movlw $src",
179 [(set GPR:$dst, (i8 imm:$src))]>;
180
181// Move a Lo(TGA) to W.
182def movlw_lo : BitFormat<12, (outs GPR:$dst), (ins i8imm:$src),
183 "movlw LOW(${src})",
184 [(set GPR:$dst, (PIC16Lo tglobaladdr:$src))]>;
185
186// Move a Hi(TGA) to W.
187def movlw_hi : BitFormat<12, (outs GPR:$dst), (ins i8imm:$src),
188 "movlw HIGH(${src})",
189 [(set GPR:$dst, (PIC16Hi tglobaladdr:$src))]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000190}
191
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000192//-------------------
193// FSR setting insns.
194//-------------------
195// These insns are matched via a DAG replacement pattern.
196def set_fsrlo:
197 ByteFormat<0, (outs FSR16:$fsr),
198 (ins GPR:$val),
199 "movwf ${fsr}L",
200 []>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000201
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000202let isTwoAddress = 1 in
203def set_fsrhi:
204 ByteFormat<0, (outs FSR16:$dst),
205 (ins FSR16:$src, GPR:$val),
206 "movwf ${dst}H",
207 []>;
208
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000209//----------------------------
210// copyRegToReg
211// copyRegToReg insns. These are dummy. They should always be deleted
212// by the optimizer and never be present in the final generated code.
213// if they are, then we have to write correct macros for these insns.
214//----------------------------
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000215def copy_fsr:
216 Pseudo<(outs FSR16:$dst), (ins FSR16:$src), "copy_fsr $dst, $src", []>;
217
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000218def copy_w:
219 Pseudo<(outs GPR:$dst), (ins GPR:$src), "copy_w $dst, $src", []>;
220
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000221//--------------------------
222// Store to memory
223//-------------------------
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000224
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000225// Direct store.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000226// Input operands are: val = W, ptrlo = GA, offset = offset, ptrhi = banksel.
227class MOVWF_INSN<bits<6> OpCode, SDNode OpNodeDest, SDNode Op>:
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000228 ByteFormat<0, (outs),
229 (ins GPR:$val, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
230 "movwf ${ptrlo} + ${offset}",
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000231 [(Op GPR:$val, OpNodeDest:$ptrlo, (i8 imm:$ptrhi),
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000232 (i8 imm:$offset))]>;
233
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000234// Store W to a Global Address.
235def movwf : MOVWF_INSN<0, tglobaladdr, PIC16Store>;
236
237// Store W to an External Symobol.
238def movwf_1 : MOVWF_INSN<0, texternalsym, PIC16Store>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000239
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000240// Store with InFlag and OutFlag
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000241// This is same as movwf_1 but has a flag. A flag is required to
242// order the stores while passing the params to function.
243def movwf_2 : MOVWF_INSN<0, texternalsym, PIC16StWF>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000244
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000245// Indirect store. Matched via a DAG replacement pattern.
246def store_indirect :
247 ByteFormat<0, (outs),
248 (ins GPR:$val, FSR16:$fsr, i8imm:$offset),
249 "movwi $offset[$fsr]",
250 []>;
251
252//----------------------------
253// Load from memory
254//----------------------------
255// Direct load.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000256// Input Operands are: ptrlo = GA, offset = offset, ptrhi = banksel.
257// Output: dst = W
258class MOVF_INSN<bits<6> OpCode, SDNode OpNodeSrc, SDNode Op>:
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000259 ByteFormat<0, (outs GPR:$dst),
260 (ins i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
261 "movf ${ptrlo} + ${offset}, W",
262 [(set GPR:$dst,
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000263 (Op OpNodeSrc:$ptrlo, (i8 imm:$ptrhi),
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000264 (i8 imm:$offset)))]>;
265
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000266// Load from a GA.
267def movf : MOVF_INSN<0, tglobaladdr, PIC16Load>;
268
269// Load from an ES.
270def movf_1 : MOVF_INSN<0, texternalsym, PIC16Load>;
Sanjiv Guptab84d5a42009-04-02 17:42:00 +0000271def movf_1_1 : MOVF_INSN<0, texternalsym, PIC16LdArg>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000272
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000273// Load with InFlag and OutFlag
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000274// This is same as movf_1 but has a flag. A flag is required to
275// order the loads while copying the return value of a function.
276def movf_2 : MOVF_INSN<0, texternalsym, PIC16LdWF>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000277
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000278// Indirect load. Matched via a DAG replacement pattern.
279def load_indirect :
280 ByteFormat<0, (outs GPR:$dst),
281 (ins FSR16:$fsr, i8imm:$offset),
282 "moviw $offset[$fsr]",
283 []>;
284
285//-------------------------
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000286// Bitwise operations patterns
287//--------------------------
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000288// W = W op [F]
289let Defs = [STATUS] in {
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000290def OrFW : BinOpFW<0, "iorwf", or>;
291def XOrFW : BinOpFW<0, "xorwf", xor>;
292def AndFW : BinOpFW<0, "andwf", and>;
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000293
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000294// F = W op [F]
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000295def OrWF : BinOpWF<0, "iorwf", or>;
296def XOrWF : BinOpWF<0, "xorwf", xor>;
297def AndWF : BinOpWF<0, "andwf", and>;
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000298
299//-------------------------
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000300// Various add/sub patterns.
301//-------------------------
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000302
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000303// W = W + [F]
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000304def addfw_1: BinOpFW<0, "addwf", add>;
305def addfw_2: BinOpFW<0, "addwf", addc>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000306
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000307let Uses = [STATUS] in
308def addfwc: BinOpFW<0, "addwfc", adde>; // With Carry.
309
310// F = W + [F]
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000311def addwf_1: BinOpWF<0, "addwf", add>;
312def addwf_2: BinOpWF<0, "addwf", addc>;
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000313let Uses = [STATUS] in
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000314def addwfc: BinOpWF<0, "addwfc", adde>; // With Carry.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000315}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000316
317// W -= [F] ; load from F and sub the value from W.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000318let isTwoAddress = 1 in
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000319class SUBFW<bits<6> OpCode, string OpcStr, SDNode OpNode>:
320 ByteFormat<OpCode, (outs GPR:$dst),
321 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
322 !strconcat(OpcStr, " $ptrlo + $offset, W"),
323 [(set GPR:$dst, (OpNode (PIC16Load diraddr:$ptrlo,
324 (i8 imm:$ptrhi), (i8 imm:$offset)),
325 GPR:$src))]>;
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000326let Defs = [STATUS] in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000327def subfw_1: SUBFW<0, "subwf", sub>;
328def subfw_2: SUBFW<0, "subwf", subc>;
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000329
330let Uses = [STATUS] in
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000331def subfwb: SUBFW<0, "subwfb", sube>; // With Borrow.
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000332
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000333def subfw_cc: SUBFW<0, "subwf", PIC16Subcc>;
334}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000335
336// [F] -= W ;
337class SUBWF<bits<6> OpCode, string OpcStr, SDNode OpNode>:
338 ByteFormat<OpCode, (outs),
339 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
340 !strconcat(OpcStr, " $ptrlo + $offset"),
341 [(PIC16Store (OpNode (PIC16Load diraddr:$ptrlo,
342 (i8 imm:$ptrhi), (i8 imm:$offset)),
343 GPR:$src), diraddr:$ptrlo,
344 (i8 imm:$ptrhi), (i8 imm:$offset))]>;
345
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000346let Defs = [STATUS] in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000347def subwf_1: SUBWF<0, "subwf", sub>;
348def subwf_2: SUBWF<0, "subwf", subc>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000349
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000350let Uses = [STATUS] in
351 def subwfb: SUBWF<0, "subwfb", sube>; // With Borrow.
352
353def subwf_cc: SUBWF<0, "subwf", PIC16Subcc>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000354}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000355
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000356// addlw
357let Defs = [STATUS] in {
358def addlw_1 : BinOpLW<0, "addlw", add>;
359def addlw_2 : BinOpLW<0, "addlw", addc>;
360
361let Uses = [STATUS] in
362def addlwc : BinOpLW<0, "addlwc", adde>; // With Carry. (Assembler macro).
363
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000364// bitwise operations involving a literal and w.
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000365def andlw : BinOpLW<0, "andlw", and>;
366def xorlw : BinOpLW<0, "xorlw", xor>;
367def orlw : BinOpLW<0, "iorlw", or>;
368}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000369
370// sublw
371// W = C - W ; sub W from literal. (Without borrow).
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000372let isTwoAddress = 1 in
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000373class SUBLW<bits<6> opcode, SDNode OpNode> :
374 LiteralFormat<opcode, (outs GPR:$dst),
375 (ins GPR:$src, i8imm:$literal),
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000376 "sublw $literal",
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000377 [(set GPR:$dst, (OpNode (i8 imm:$literal), GPR:$src))]>;
378
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000379let Defs = [STATUS] in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000380def sublw_1 : SUBLW<0, sub>;
381def sublw_2 : SUBLW<0, subc>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000382def sublw_cc : SUBLW<0, PIC16Subcc>;
383}
384
385// Call instruction.
386let isCall = 1 in {
387 def CALL: LiteralFormat<0x1, (outs), (ins i8imm:$func),
388 "call ${func}",
389 [(PIC16call diraddr:$func)]>;
390}
391
Sanjiv Guptac29f0c72009-03-10 10:35:34 +0000392let Uses = [STATUS] in
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000393def pic16brcond: ControlFormat<0x0, (outs), (ins brtarget:$dst, CCOp:$cc),
394 "b$cc $dst",
395 [(PIC16Brcond bb:$dst, imm:$cc)]>;
396
397// Unconditional branch.
398def br_uncond: ControlFormat<0x0, (outs), (ins brtarget:$dst),
399 "goto $dst",
400 [(br bb:$dst)]>;
401
402// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded by the
403// scheduler into a branch sequence.
404let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
405 def SELECT_CC_Int_ICC
406 : Pseudo<(outs GPR:$dst), (ins GPR:$T, GPR:$F, i8imm:$Cond),
407 "; SELECT_CC_Int_ICC PSEUDO!",
408 [(set GPR:$dst, (PIC16Selecticc GPR:$T, GPR:$F,
409 imm:$Cond))]>;
410}
411
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000412
413// Banksel.
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000414let isReMaterializable = 1 in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000415def banksel :
416 Pseudo<(outs BSR:$dst),
417 (ins i8mem:$ptr),
418 "banksel $ptr",
419 [(set BSR:$dst, (Banksel tglobaladdr:$ptr))]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000420}
421
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000422// Return insn.
423def Return :
424 ControlFormat<0, (outs), (ins), "return", [(ret)]>;
425
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000426//===----------------------------------------------------------------------===//
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000427// PIC16 Replacment Patterns.
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000428//===----------------------------------------------------------------------===//
429
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000430// Identify an indirect store and select insns for it.
431def : Pat<(PIC16Store GPR:$val, (MTLO GPR:$loaddr), (MTHI GPR:$hiaddr),
432 imm:$offset),
433 (store_indirect GPR:$val,
434 (set_fsrhi (set_fsrlo GPR:$loaddr), GPR:$hiaddr),
435 imm:$offset)>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000436
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000437// Identify an indirect load and select insns for it.
438def : Pat<(PIC16Load (MTLO GPR:$loaddr), (MTHI GPR:$hiaddr),
439 imm:$offset),
440 (load_indirect (set_fsrhi (set_fsrlo GPR:$loaddr), GPR:$hiaddr),
441 imm:$offset)>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000442