blob: 31ceba37996c4b16d5ef57cc3c5fc6b1e0c3b915 [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.
91def PIC16Load : SDNode<"PIC16ISD::PIC16Load", SDT_PIC16Load, [SDNPHasChain]>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +000092def PIC16LdWF : SDNode<"PIC16ISD::PIC16LdWF", SDT_PIC16Load,
93 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +000094
Sanjiv Gupta1b046942009-01-13 19:18:47 +000095// Node to match PIC16 call
96def PIC16call : SDNode<"PIC16ISD::CALL", SDT_PIC16call,
97 [SDNPHasChain , SDNPOptInFlag, SDNPOutFlag]>;
98
99// Node to match a comparison instruction.
100def PIC16Subcc : SDNode<"PIC16ISD::SUBCC", SDTI8BinOp, [SDNPOutFlag]>;
101
102// Node to match a conditional branch.
103def PIC16Brcond : SDNode<"PIC16ISD::BRCOND", SDT_PIC16Brcond,
104 [SDNPHasChain, SDNPInFlag]>;
105
106def PIC16Selecticc : SDNode<"PIC16ISD::SELECT_ICC", SDT_PIC16Selecticc,
107 [SDNPInFlag]>;
108
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000109//===----------------------------------------------------------------------===//
110// PIC16 Operand Definitions.
111//===----------------------------------------------------------------------===//
112def i8mem : Operand<i8>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000113def brtarget: Operand<OtherVT>;
114
115// Operand for printing out a condition code.
116let PrintMethod = "printCCOperand" in
117 def CCOp : Operand<i8>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000118
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000119include "PIC16InstrFormats.td"
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000120
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000121//===----------------------------------------------------------------------===//
122// PIC16 Common Classes.
123//===----------------------------------------------------------------------===//
124
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000125// W = W Op F : Load the value from F and do Op to W.
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000126class BinOpFW<bits<6> OpCode, string OpcStr, SDNode OpNode>:
127 ByteFormat<OpCode, (outs GPR:$dst),
128 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
129 !strconcat(OpcStr, " $ptrlo + $offset, W"),
130 [(set GPR:$dst, (OpNode GPR:$src, (PIC16Load diraddr:$ptrlo,
131 (i8 imm:$ptrhi),
132 (i8 imm:$offset))))]>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000133
134// F = F Op W : Load the value from F, do op with W and store in F.
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000135class BinOpWF<bits<6> OpCode, string OpcStr, SDNode OpNode>:
136 ByteFormat<OpCode, (outs),
137 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
138 !strconcat(OpcStr, " $ptrlo + $offset"),
139 [(PIC16Store (OpNode GPR:$src, (PIC16Load diraddr:$ptrlo,
140 (i8 imm:$ptrhi),
141 (i8 imm:$offset))),
142 diraddr:$ptrlo,
143 (i8 imm:$ptrhi), (i8 imm:$offset)
144 )]>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000145
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000146// W = W Op L : Do Op of L with W and place result in W.
147class BinOpLW<bits<6> opcode, string OpcStr, SDNode OpNode> :
148 LiteralFormat<opcode, (outs GPR:$dst),
149 (ins GPR:$src, i8imm:$literal),
150 !strconcat(OpcStr, " $literal"),
151 [(set GPR:$dst, (OpNode GPR:$src, (i8 imm:$literal)))]>;
152
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000153//===----------------------------------------------------------------------===//
154// PIC16 Instructions.
155//===----------------------------------------------------------------------===//
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000156
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000157// Pseudo-instructions.
158def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i8imm:$amt),
159 "!ADJCALLSTACKDOWN $amt",
160 [(PIC16callseq_start imm:$amt)]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000161
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000162def ADJCALLSTACKUP : Pseudo<(outs), (ins i8imm:$amt),
163 "!ADJCALLSTACKUP $amt",
164 [(PIC16callseq_end imm:$amt)]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000165
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000166//-----------------------------------
167// Vaious movlw insn patterns.
168//-----------------------------------
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000169let isReMaterializable = 1 in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000170// Move 8-bit literal to W.
171def movlw : BitFormat<12, (outs GPR:$dst), (ins i8imm:$src),
172 "movlw $src",
173 [(set GPR:$dst, (i8 imm:$src))]>;
174
175// Move a Lo(TGA) to W.
176def movlw_lo : BitFormat<12, (outs GPR:$dst), (ins i8imm:$src),
177 "movlw LOW(${src})",
178 [(set GPR:$dst, (PIC16Lo tglobaladdr:$src))]>;
179
180// Move a Hi(TGA) to W.
181def movlw_hi : BitFormat<12, (outs GPR:$dst), (ins i8imm:$src),
182 "movlw HIGH(${src})",
183 [(set GPR:$dst, (PIC16Hi tglobaladdr:$src))]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000184}
185
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000186//-------------------
187// FSR setting insns.
188//-------------------
189// These insns are matched via a DAG replacement pattern.
190def set_fsrlo:
191 ByteFormat<0, (outs FSR16:$fsr),
192 (ins GPR:$val),
193 "movwf ${fsr}L",
194 []>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000195
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000196let isTwoAddress = 1 in
197def set_fsrhi:
198 ByteFormat<0, (outs FSR16:$dst),
199 (ins FSR16:$src, GPR:$val),
200 "movwf ${dst}H",
201 []>;
202
203def copy_fsr:
204 Pseudo<(outs FSR16:$dst), (ins FSR16:$src), "copy_fsr $dst, $src", []>;
205
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000206def copy_w:
207 Pseudo<(outs GPR:$dst), (ins GPR:$src), "copy_w $dst, $src", []>;
208
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000209//--------------------------
210// Store to memory
211//-------------------------
212// Direct store.
213def movwf :
214 ByteFormat<0, (outs),
215 (ins GPR:$val, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
216 "movwf ${ptrlo} + ${offset}",
217 [(PIC16Store GPR:$val, tglobaladdr:$ptrlo, (i8 imm:$ptrhi),
218 (i8 imm:$offset))]>;
219
220def movwf_1 :
221 ByteFormat<0, (outs),
222 (ins GPR:$val, i8mem:$ptrlo, i8imm:$ptrhi, i8imm:$offset),
223 "movwf ${ptrlo} + ${offset}",
224 [(PIC16Store GPR:$val, texternalsym:$ptrlo, (i8 imm:$ptrhi),
225 (i8 imm:$offset))]>;
226
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000227// Store with InFlag and OutFlag
228def movwf_2 :
229 ByteFormat<0, (outs),
230 (ins GPR:$val, i8mem:$ptrlo, i8imm:$ptrhi, i8imm:$offset),
231 "movwf ${ptrlo} + ${offset}",
232 [(PIC16StWF GPR:$val, texternalsym:$ptrlo, (i8 imm:$ptrhi),
233 (i8 imm:$offset))]>;
234
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000235// Indirect store. Matched via a DAG replacement pattern.
236def store_indirect :
237 ByteFormat<0, (outs),
238 (ins GPR:$val, FSR16:$fsr, i8imm:$offset),
239 "movwi $offset[$fsr]",
240 []>;
241
242//----------------------------
243// Load from memory
244//----------------------------
245// Direct load.
246def movf :
247 ByteFormat<0, (outs GPR:$dst),
248 (ins i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
249 "movf ${ptrlo} + ${offset}, W",
250 [(set GPR:$dst,
251 (PIC16Load tglobaladdr:$ptrlo, (i8 imm:$ptrhi),
252 (i8 imm:$offset)))]>;
253
254def movf_1 :
255 ByteFormat<0, (outs GPR:$dst),
256 (ins i8mem:$ptrlo, i8imm:$ptrhi, i8imm:$offset),
257 "movf ${ptrlo} + ${offset}, W",
258 [(set GPR:$dst,
259 (PIC16Load texternalsym:$ptrlo, (i8 imm:$ptrhi),
260 (i8 imm:$offset)))]>;
261
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000262// Load with InFlag and OutFlag
263def movf_2 :
264 ByteFormat<0, (outs GPR:$dst),
265 (ins i8mem:$ptrlo, i8imm:$ptrhi, i8imm:$offset),
266 "movf ${ptrlo} + ${offset}, W",
267 [(set GPR:$dst,
268 (PIC16LdWF texternalsym:$ptrlo, (i8 imm:$ptrhi),
269 (i8 imm:$offset)))]>;
270
271
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000272// Indirect load. Matched via a DAG replacement pattern.
273def load_indirect :
274 ByteFormat<0, (outs GPR:$dst),
275 (ins FSR16:$fsr, i8imm:$offset),
276 "moviw $offset[$fsr]",
277 []>;
278
279//-------------------------
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000280// Bitwise operations patterns
281//--------------------------
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000282let isTwoAddress = 1 in {
283def OrFW : BinOpFW<0, "iorwf", or>;
284def XOrFW : BinOpFW<0, "xorwf", xor>;
285def AndFW : BinOpFW<0, "andwf", and>;
286}
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000287
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000288def OrWF : BinOpWF<0, "iorwf", or>;
289def XOrWF : BinOpWF<0, "xorwf", xor>;
290def AndWF : BinOpWF<0, "andwf", and>;
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000291
292//-------------------------
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000293// Various add/sub patterns.
294//-------------------------
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000295
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000296let isTwoAddress = 1 in {
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000297def addfw_1: BinOpFW<0, "addwf", add>;
298def addfw_2: BinOpFW<0, "addwf", addc>;
299def addfwc: BinOpFW<0, "addwfc", adde>; // With Carry.
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000300}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000301
Sanjiv Gupta8f78fa82008-11-26 10:53:50 +0000302def addwf_1: BinOpWF<0, "addwf", add>;
303def addwf_2: BinOpWF<0, "addwf", addc>;
304def addwfc: BinOpWF<0, "addwfc", adde>; // With Carry.
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000305
306// W -= [F] ; load from F and sub the value from W.
307class SUBFW<bits<6> OpCode, string OpcStr, SDNode OpNode>:
308 ByteFormat<OpCode, (outs GPR:$dst),
309 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
310 !strconcat(OpcStr, " $ptrlo + $offset, W"),
311 [(set GPR:$dst, (OpNode (PIC16Load diraddr:$ptrlo,
312 (i8 imm:$ptrhi), (i8 imm:$offset)),
313 GPR:$src))]>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000314let isTwoAddress = 1 in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000315def subfw_1: SUBFW<0, "subwf", sub>;
316def subfw_2: SUBFW<0, "subwf", subc>;
317def subfwb: SUBFW<0, "subwfb", sube>; // With Borrow.
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000318def subfw_cc: SUBFW<0, "subwf", PIC16Subcc>;
319}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000320
321// [F] -= W ;
322class SUBWF<bits<6> OpCode, string OpcStr, SDNode OpNode>:
323 ByteFormat<OpCode, (outs),
324 (ins GPR:$src, i8imm:$offset, i8mem:$ptrlo, i8imm:$ptrhi),
325 !strconcat(OpcStr, " $ptrlo + $offset"),
326 [(PIC16Store (OpNode (PIC16Load diraddr:$ptrlo,
327 (i8 imm:$ptrhi), (i8 imm:$offset)),
328 GPR:$src), diraddr:$ptrlo,
329 (i8 imm:$ptrhi), (i8 imm:$offset))]>;
330
331def subwf_1: SUBWF<0, "subwf", sub>;
332def subwf_2: SUBWF<0, "subwf", subc>;
333def subwfb: SUBWF<0, "subwfb", sube>; // With Borrow.
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000334def subwf_cc: SUBWF<0, "subwf", PIC16Subcc>;
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000335
336// addlw
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000337let isTwoAddress = 1 in {
338def addlw_1 : BinOpLW<0, "addlw", add>;
339def addlw_2 : BinOpLW<0, "addlw", addc>;
340def addlwc : BinOpLW<0, "addlwc", adde>; // With Carry. (Assembler macro).
341}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000342
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000343// bitwise operations involving a literal and w.
344let isTwoAddress = 1 in {
345def andlw : BinOpLW<0, "andlw", and>;
346def xorlw : BinOpLW<0, "xorlw", xor>;
347def orlw : BinOpLW<0, "iorlw", or>;
348}
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000349
350// sublw
351// W = C - W ; sub W from literal. (Without borrow).
352class SUBLW<bits<6> opcode, SDNode OpNode> :
353 LiteralFormat<opcode, (outs GPR:$dst),
354 (ins GPR:$src, i8imm:$literal),
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000355 "sublw $literal",
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000356 [(set GPR:$dst, (OpNode (i8 imm:$literal), GPR:$src))]>;
357
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000358let isTwoAddress = 1 in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000359def sublw_1 : SUBLW<0, sub>;
360def sublw_2 : SUBLW<0, subc>;
Sanjiv Gupta1b046942009-01-13 19:18:47 +0000361def sublw_cc : SUBLW<0, PIC16Subcc>;
362}
363
364// Call instruction.
365let isCall = 1 in {
366 def CALL: LiteralFormat<0x1, (outs), (ins i8imm:$func),
367 "call ${func}",
368 [(PIC16call diraddr:$func)]>;
369}
370
371def pic16brcond: ControlFormat<0x0, (outs), (ins brtarget:$dst, CCOp:$cc),
372 "b$cc $dst",
373 [(PIC16Brcond bb:$dst, imm:$cc)]>;
374
375// Unconditional branch.
376def br_uncond: ControlFormat<0x0, (outs), (ins brtarget:$dst),
377 "goto $dst",
378 [(br bb:$dst)]>;
379
380// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded by the
381// scheduler into a branch sequence.
382let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
383 def SELECT_CC_Int_ICC
384 : Pseudo<(outs GPR:$dst), (ins GPR:$T, GPR:$F, i8imm:$Cond),
385 "; SELECT_CC_Int_ICC PSEUDO!",
386 [(set GPR:$dst, (PIC16Selecticc GPR:$T, GPR:$F,
387 imm:$Cond))]>;
388}
389
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000390
391// Banksel.
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000392let isReMaterializable = 1 in {
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000393def banksel :
394 Pseudo<(outs BSR:$dst),
395 (ins i8mem:$ptr),
396 "banksel $ptr",
397 [(set BSR:$dst, (Banksel tglobaladdr:$ptr))]>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000398}
399
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000400// Return insn.
401def Return :
402 ControlFormat<0, (outs), (ins), "return", [(ret)]>;
403
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000404//===----------------------------------------------------------------------===//
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000405// PIC16 Replacment Patterns.
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000406//===----------------------------------------------------------------------===//
407
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000408// Identify an indirect store and select insns for it.
409def : Pat<(PIC16Store GPR:$val, (MTLO GPR:$loaddr), (MTHI GPR:$hiaddr),
410 imm:$offset),
411 (store_indirect GPR:$val,
412 (set_fsrhi (set_fsrlo GPR:$loaddr), GPR:$hiaddr),
413 imm:$offset)>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000414
Sanjiv Guptab1b5ffd2008-11-19 11:00:54 +0000415// Identify an indirect load and select insns for it.
416def : Pat<(PIC16Load (MTLO GPR:$loaddr), (MTHI GPR:$hiaddr),
417 imm:$offset),
418 (load_indirect (set_fsrhi (set_fsrlo GPR:$loaddr), GPR:$hiaddr),
419 imm:$offset)>;
Sanjiv Gupta0e687712008-05-13 09:02:57 +0000420