1*9880d681SAndroid Build Coastguard Worker//===-- AVRInstrInfo.td - AVR Instruction Formats ----------*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// AVR Instruction Format Definitions. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// A generic AVR instruction. 15*9880d681SAndroid Build Coastguard Workerclass AVRInst<dag outs, dag ins, string asmstr, list<dag> pattern> : Instruction 16*9880d681SAndroid Build Coastguard Worker{ 17*9880d681SAndroid Build Coastguard Worker let Namespace = "AVR"; 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker dag OutOperandList = outs; 20*9880d681SAndroid Build Coastguard Worker dag InOperandList = ins; 21*9880d681SAndroid Build Coastguard Worker let AsmString = asmstr; 22*9880d681SAndroid Build Coastguard Worker let Pattern = pattern; 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker/// A 16-bit AVR instruction. 26*9880d681SAndroid Build Coastguard Workerclass AVRInst16<dag outs, dag ins, string asmstr, list<dag> pattern> 27*9880d681SAndroid Build Coastguard Worker : AVRInst<outs, ins, asmstr, pattern> 28*9880d681SAndroid Build Coastguard Worker{ 29*9880d681SAndroid Build Coastguard Worker field bits<16> Inst; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker let Size = 2; 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker/// a 32-bit AVR instruction. 35*9880d681SAndroid Build Coastguard Workerclass AVRInst32<dag outs, dag ins, string asmstr, list<dag> pattern> 36*9880d681SAndroid Build Coastguard Worker : AVRInst<outs, ins, asmstr, pattern> 37*9880d681SAndroid Build Coastguard Worker{ 38*9880d681SAndroid Build Coastguard Worker field bits<32> Inst; 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker let Size = 4; 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker// A class for pseudo instructions. 44*9880d681SAndroid Build Coastguard Worker// Psuedo instructions are not real AVR instructions. The DAG stores 45*9880d681SAndroid Build Coastguard Worker// psuedo instructions which are replaced by real AVR instructions by 46*9880d681SAndroid Build Coastguard Worker// AVRExpandPseudoInsts.cpp. 47*9880d681SAndroid Build Coastguard Worker// 48*9880d681SAndroid Build Coastguard Worker// For example, the ADDW (add wide, as in add 16 bit values) instruction 49*9880d681SAndroid Build Coastguard Worker// is defined as a pseudo instruction. In AVRExpandPseudoInsts.cpp, 50*9880d681SAndroid Build Coastguard Worker// the instruction is then replaced by two add instructions - one for each byte. 51*9880d681SAndroid Build Coastguard Workerclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 52*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 53*9880d681SAndroid Build Coastguard Worker{ 54*9880d681SAndroid Build Coastguard Worker let Pattern = pattern; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 57*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 61*9880d681SAndroid Build Coastguard Worker// Register / register instruction: <|opcode|ffrd|dddd|rrrr|> 62*9880d681SAndroid Build Coastguard Worker// opcode = 4 bits. 63*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 2 bits 64*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits 65*9880d681SAndroid Build Coastguard Worker// r = source = 5 bits 66*9880d681SAndroid Build Coastguard Worker// (Accepts all registers) 67*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 68*9880d681SAndroid Build Coastguard Workerclass FRdRr<bits<4> opcode, bits<2> f, dag outs, dag ins, string asmstr, 69*9880d681SAndroid Build Coastguard Worker list<dag> pattern> : AVRInst16<outs, ins, asmstr, pattern> 70*9880d681SAndroid Build Coastguard Worker{ 71*9880d681SAndroid Build Coastguard Worker bits<5> rd; 72*9880d681SAndroid Build Coastguard Worker bits<5> rr; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 75*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = f; 76*9880d681SAndroid Build Coastguard Worker let Inst{9} = rr{4}; 77*9880d681SAndroid Build Coastguard Worker let Inst{8-4} = rd; 78*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = rr{3-0}; 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerclass FTST<bits<4> opcode, bits<2> f, dag outs, dag ins, string asmstr, 82*9880d681SAndroid Build Coastguard Worker list<dag> pattern> : AVRInst16<outs, ins, asmstr, pattern> 83*9880d681SAndroid Build Coastguard Worker{ 84*9880d681SAndroid Build Coastguard Worker bits<5> rd; 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 87*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = f; 88*9880d681SAndroid Build Coastguard Worker let Inst{9} = rd{4}; 89*9880d681SAndroid Build Coastguard Worker let Inst{8-4} = rd; 90*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = rd{3-0}; 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 94*9880d681SAndroid Build Coastguard Worker// Instruction of the format `<mnemonic> Z, Rd` 95*9880d681SAndroid Build Coastguard Worker// <|1001|001r|rrrr|0ttt> 96*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 97*9880d681SAndroid Build Coastguard Workerclass FZRd<bits<3> t, dag outs, dag ins, string asmstr, list<dag> pattern> 98*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 99*9880d681SAndroid Build Coastguard Worker{ 100*9880d681SAndroid Build Coastguard Worker bits<5> rd; 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1001; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker let Inst{11-9} = 0b001; 105*9880d681SAndroid Build Coastguard Worker let Inst{8} = rd{4}; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = rd{3-0}; 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker let Inst{3} = 0; 110*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = t; 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 114*9880d681SAndroid Build Coastguard Worker// Register / immediate8 instruction: <|opcode|KKKK|dddd|KKKK|> 115*9880d681SAndroid Build Coastguard Worker// opcode = 4 bits. 116*9880d681SAndroid Build Coastguard Worker// K = constant data = 8 bits 117*9880d681SAndroid Build Coastguard Worker// d = destination = 4 bits 118*9880d681SAndroid Build Coastguard Worker// (Only accepts r16-r31) 119*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 120*9880d681SAndroid Build Coastguard Workerclass FRdK<bits<4> opcode, dag outs, dag ins, string asmstr, list<dag> pattern> 121*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 122*9880d681SAndroid Build Coastguard Worker{ 123*9880d681SAndroid Build Coastguard Worker bits<4> rd; 124*9880d681SAndroid Build Coastguard Worker bits<8> k; 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 127*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = k{7-4}; 128*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = rd{3-0}; 129*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = k{3-0}; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker let isAsCheapAsAMove = 1; 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 135*9880d681SAndroid Build Coastguard Worker// Register instruction: <|opcode|fffd|dddd|ffff|> 136*9880d681SAndroid Build Coastguard Worker// opcode = 4 bits. 137*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 7 bits 138*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits 139*9880d681SAndroid Build Coastguard Worker// (Accepts all registers) 140*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 141*9880d681SAndroid Build Coastguard Workerclass FRd<bits<4> opcode, bits<7> f, dag outs, dag ins, string asmstr, 142*9880d681SAndroid Build Coastguard Worker list<dag> pattern> : AVRInst16<outs, ins, asmstr, pattern> 143*9880d681SAndroid Build Coastguard Worker{ 144*9880d681SAndroid Build Coastguard Worker bits<5> d; 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = opcode; 147*9880d681SAndroid Build Coastguard Worker let Inst{11-9} = f{6-4}; 148*9880d681SAndroid Build Coastguard Worker let Inst{8-4} = d; 149*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = f{3-0}; 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 153*9880d681SAndroid Build Coastguard Worker// [STD/LDD] P+q, Rr special encoding: <|10q0|qqtr|rrrr|pqqq> 154*9880d681SAndroid Build Coastguard Worker// t = type (1 for STD, 0 for LDD) 155*9880d681SAndroid Build Coastguard Worker// q = displacement (6 bits) 156*9880d681SAndroid Build Coastguard Worker// r = register (5 bits) 157*9880d681SAndroid Build Coastguard Worker// p = pointer register (1 bit) [1 for Y, 0 for Z] 158*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 159*9880d681SAndroid Build Coastguard Workerclass FSTDLDD<bit type, dag outs, dag ins, string asmstr, list<dag> pattern> 160*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 161*9880d681SAndroid Build Coastguard Worker{ 162*9880d681SAndroid Build Coastguard Worker bits<7> memri; 163*9880d681SAndroid Build Coastguard Worker bits<5> reg; // the GP register 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker let Inst{15-14} = 0b10; 166*9880d681SAndroid Build Coastguard Worker let Inst{13} = memri{5}; 167*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0; 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = memri{4-3}; 170*9880d681SAndroid Build Coastguard Worker let Inst{9} = type; 171*9880d681SAndroid Build Coastguard Worker let Inst{8} = reg{4}; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = reg{3-0}; 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker let Inst{3} = memri{6}; 176*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = memri{2-0}; 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 180*9880d681SAndroid Build Coastguard Worker// An ST/LD instruction. 181*9880d681SAndroid Build Coastguard Worker// <|100i|00tr|rrrr|ppaa|> 182*9880d681SAndroid Build Coastguard Worker// t = type (1 for store, 0 for load) 183*9880d681SAndroid Build Coastguard Worker// a = regular/postinc/predec (reg = 0b00, postinc = 0b01, predec = 0b10) 184*9880d681SAndroid Build Coastguard Worker// p = pointer register 185*9880d681SAndroid Build Coastguard Worker// r = src/dst register 186*9880d681SAndroid Build Coastguard Worker// 187*9880d681SAndroid Build Coastguard Worker// Note that the bit labelled 'i' above does not follow a simple pattern, 188*9880d681SAndroid Build Coastguard Worker// so there exists a post encoder method to set it manually. 189*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 190*9880d681SAndroid Build Coastguard Workerclass FSTLD<bit type, bits<2> mode, dag outs, dag ins, 191*9880d681SAndroid Build Coastguard Worker string asmstr, list<dag> pattern> 192*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 193*9880d681SAndroid Build Coastguard Worker{ 194*9880d681SAndroid Build Coastguard Worker bits<2> ptrreg; 195*9880d681SAndroid Build Coastguard Worker bits<5> reg; 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = 0b100; 198*9880d681SAndroid Build Coastguard Worker // This bit varies depending on the arguments and the mode. 199*9880d681SAndroid Build Coastguard Worker // We have a post encoder method to set this bit manually. 200*9880d681SAndroid Build Coastguard Worker let Inst{12} = 0; 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b00; 203*9880d681SAndroid Build Coastguard Worker let Inst{9} = type; 204*9880d681SAndroid Build Coastguard Worker let Inst{8} = reg{4}; 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = reg{3-0}; 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker let Inst{3-2} = ptrreg{1-0}; 209*9880d681SAndroid Build Coastguard Worker let Inst{1-0} = mode{1-0}; 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "loadStorePostEncoder"; 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 215*9880d681SAndroid Build Coastguard Worker// Special format for the LPM/ELPM instructions 216*9880d681SAndroid Build Coastguard Worker// [E]LPM Rd, Z[+] 217*9880d681SAndroid Build Coastguard Worker// <|1001|000d|dddd|01ep> 218*9880d681SAndroid Build Coastguard Worker// d = destination register 219*9880d681SAndroid Build Coastguard Worker// e = is elpm 220*9880d681SAndroid Build Coastguard Worker// p = is postincrement 221*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 222*9880d681SAndroid Build Coastguard Workerclass FLPMX<bit e, bit p, dag outs, dag ins, string asmstr, list<dag> pattern> 223*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 224*9880d681SAndroid Build Coastguard Worker{ 225*9880d681SAndroid Build Coastguard Worker bits<5> reg; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1001; 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker let Inst{11-9} = 0b000; 230*9880d681SAndroid Build Coastguard Worker let Inst{8} = reg{4}; 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = reg{3-0}; 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker let Inst{3-2} = 0b01; 235*9880d681SAndroid Build Coastguard Worker let Inst{1} = e; 236*9880d681SAndroid Build Coastguard Worker let Inst{0} = p; 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 240*9880d681SAndroid Build Coastguard Worker// MOVWRdRr special encoding: <|0000|0001|dddd|rrrr|> 241*9880d681SAndroid Build Coastguard Worker// d = destination = 4 bits 242*9880d681SAndroid Build Coastguard Worker// r = source = 4 bits 243*9880d681SAndroid Build Coastguard Worker// (Only accepts even registers) 244*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 245*9880d681SAndroid Build Coastguard Workerclass FMOVWRdRr<dag outs, dag ins, string asmstr, list<dag> pattern> 246*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 247*9880d681SAndroid Build Coastguard Worker{ 248*9880d681SAndroid Build Coastguard Worker bits<5> d; 249*9880d681SAndroid Build Coastguard Worker bits<5> r; 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker let Inst{15-8} = 0b00000001; 252*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = d{4-1}; 253*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = r{4-1}; 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 257*9880d681SAndroid Build Coastguard Worker// MULSrr special encoding: <|0000|0010|dddd|rrrr|> 258*9880d681SAndroid Build Coastguard Worker// d = multiplicand = 4 bits 259*9880d681SAndroid Build Coastguard Worker// r = multiplier = 4 bits 260*9880d681SAndroid Build Coastguard Worker// (Only accepts r16-r31) 261*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 262*9880d681SAndroid Build Coastguard Workerclass FMUL2RdRr<bit f, dag outs, dag ins, string asmstr, list<dag> pattern> 263*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 264*9880d681SAndroid Build Coastguard Worker{ 265*9880d681SAndroid Build Coastguard Worker bits<5> rd; // accept 5 bits but only encode the lower 4 266*9880d681SAndroid Build Coastguard Worker bits<5> rr; // accept 5 bits but only encode the lower 4 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker let Inst{15-9} = 0b0000001; 269*9880d681SAndroid Build Coastguard Worker let Inst{8} = f; 270*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = rd{3-0}; 271*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = rr{3-0}; 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker// Special encoding for the FMUL family of instructions. 275*9880d681SAndroid Build Coastguard Worker// 276*9880d681SAndroid Build Coastguard Worker// <0000|0011|fddd|frrr|> 277*9880d681SAndroid Build Coastguard Worker// 278*9880d681SAndroid Build Coastguard Worker// ff = 0b01 for FMUL 279*9880d681SAndroid Build Coastguard Worker// 0b10 for FMULS 280*9880d681SAndroid Build Coastguard Worker// 0b11 for FMULSU 281*9880d681SAndroid Build Coastguard Worker// 282*9880d681SAndroid Build Coastguard Worker// ddd = destination register 283*9880d681SAndroid Build Coastguard Worker// rrr = source register 284*9880d681SAndroid Build Coastguard Workerclass FFMULRdRr<bits<2> f, dag outs, dag ins, string asmstr, list<dag> pattern> 285*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 286*9880d681SAndroid Build Coastguard Worker{ 287*9880d681SAndroid Build Coastguard Worker bits<3> rd; 288*9880d681SAndroid Build Coastguard Worker bits<3> rr; 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker let Inst{15-8} = 0b00000011; 291*9880d681SAndroid Build Coastguard Worker let Inst{7} = f{1}; 292*9880d681SAndroid Build Coastguard Worker let Inst{6-4} = rd; 293*9880d681SAndroid Build Coastguard Worker let Inst{3} = f{0}; 294*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = rr; 295*9880d681SAndroid Build Coastguard Worker} 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 299*9880d681SAndroid Build Coastguard Worker// Arithmetic word instructions (ADIW / SBIW): <|1001|011f|kkdd|kkkk|> 300*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit 301*9880d681SAndroid Build Coastguard Worker// k = constant data = 6 bits 302*9880d681SAndroid Build Coastguard Worker// d = destination = 4 bits 303*9880d681SAndroid Build Coastguard Worker// (Only accepts r25:24 r27:26 r29:28 r31:30) 304*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 305*9880d681SAndroid Build Coastguard Workerclass FWRdK<bit f, dag outs, dag ins, string asmstr, list<dag> pattern> 306*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 307*9880d681SAndroid Build Coastguard Worker{ 308*9880d681SAndroid Build Coastguard Worker bits<5> dst; // accept 5 bits but only encode bits 1 and 2 309*9880d681SAndroid Build Coastguard Worker bits<6> k; 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker let Inst{15-9} = 0b1001011; 312*9880d681SAndroid Build Coastguard Worker let Inst{8} = f; 313*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = k{5-4}; 314*9880d681SAndroid Build Coastguard Worker let Inst{5-4} = dst{2-1}; 315*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = k{3-0}; 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 319*9880d681SAndroid Build Coastguard Worker// In I/O instruction: <|1011|0AAd|dddd|AAAA|> 320*9880d681SAndroid Build Coastguard Worker// A = I/O location address = 6 bits 321*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits 322*9880d681SAndroid Build Coastguard Worker// (Accepts all registers) 323*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 324*9880d681SAndroid Build Coastguard Workerclass FIORdA<dag outs, dag ins, string asmstr, list<dag> pattern> 325*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 326*9880d681SAndroid Build Coastguard Worker{ 327*9880d681SAndroid Build Coastguard Worker bits<5> d; 328*9880d681SAndroid Build Coastguard Worker bits<6> A; 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = 0b10110; 331*9880d681SAndroid Build Coastguard Worker let Inst{10-9} = A{5-4}; 332*9880d681SAndroid Build Coastguard Worker let Inst{8-4} = d; 333*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = A{3-0}; 334*9880d681SAndroid Build Coastguard Worker} 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 337*9880d681SAndroid Build Coastguard Worker// Out I/O instruction: <|1011|1AAr|rrrr|AAAA|> 338*9880d681SAndroid Build Coastguard Worker// A = I/O location address = 6 bits 339*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits 340*9880d681SAndroid Build Coastguard Worker// (Accepts all registers) 341*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 342*9880d681SAndroid Build Coastguard Workerclass FIOARr<dag outs, dag ins, string asmstr, list<dag> pattern> 343*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 344*9880d681SAndroid Build Coastguard Worker{ 345*9880d681SAndroid Build Coastguard Worker bits<6> A; 346*9880d681SAndroid Build Coastguard Worker bits<5> r; 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = 0b10111; 349*9880d681SAndroid Build Coastguard Worker let Inst{10-9} = A{5-4}; 350*9880d681SAndroid Build Coastguard Worker let Inst{8-4} = r; 351*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = A{3-0}; 352*9880d681SAndroid Build Coastguard Worker} 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 355*9880d681SAndroid Build Coastguard Worker// I/O bit instruction. 356*9880d681SAndroid Build Coastguard Worker// <|1001|10tt|AAAA|Abbb> 357*9880d681SAndroid Build Coastguard Worker// t = type (1 for SBI, 0 for CBI) 358*9880d681SAndroid Build Coastguard Worker// A = I/O location address (5 bits) 359*9880d681SAndroid Build Coastguard Worker// b = bit number 360*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 361*9880d681SAndroid Build Coastguard Workerclass FIOBIT<bits<2> t, dag outs, dag ins, string asmstr, list<dag> pattern> 362*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 363*9880d681SAndroid Build Coastguard Worker{ 364*9880d681SAndroid Build Coastguard Worker bits<5> A; 365*9880d681SAndroid Build Coastguard Worker bits<3> b; 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1001; 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker let Inst{11-10} = 0b10; 370*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = t; 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = A{4-1}; 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Worker let Inst{3} = A{0}; 375*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = b{2-0}; 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 379*9880d681SAndroid Build Coastguard Worker// BST/BLD instruction. 380*9880d681SAndroid Build Coastguard Worker// <|1111|1ttd|dddd|0bbb> 381*9880d681SAndroid Build Coastguard Worker// t = type (1 for BST, 0 for BLD) 382*9880d681SAndroid Build Coastguard Worker// d = destination register 383*9880d681SAndroid Build Coastguard Worker// b = bit 384*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 385*9880d681SAndroid Build Coastguard Workerclass FRdB<bits<2> t, dag outs, dag ins, string asmstr, list<dag> pattern> 386*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 387*9880d681SAndroid Build Coastguard Worker{ 388*9880d681SAndroid Build Coastguard Worker bits<5> rd; 389*9880d681SAndroid Build Coastguard Worker bits<3> b; 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1111; 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Worker let Inst{11} = 0b1; 394*9880d681SAndroid Build Coastguard Worker let Inst{10-9} = t; 395*9880d681SAndroid Build Coastguard Worker let Inst{8} = rd{4}; 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = rd{3-0}; 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker let Inst{3} = 0; 400*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = b; 401*9880d681SAndroid Build Coastguard Worker} 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Worker// Special encoding for the `DES K` instruction. 404*9880d681SAndroid Build Coastguard Worker// 405*9880d681SAndroid Build Coastguard Worker// <|1001|0100|KKKK|1011> 406*9880d681SAndroid Build Coastguard Worker// 407*9880d681SAndroid Build Coastguard Worker// KKKK = 4 bit immediate 408*9880d681SAndroid Build Coastguard Workerclass FDES<dag outs, dag ins, string asmstr, list<dag> pattern> 409*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 410*9880d681SAndroid Build Coastguard Worker{ 411*9880d681SAndroid Build Coastguard Worker bits<4> k; 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1001; 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = 0b0100; 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = k; 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b1011; 420*9880d681SAndroid Build Coastguard Worker} 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 423*9880d681SAndroid Build Coastguard Worker// Conditional Branching instructions: <|1111|0fkk|kkkk|ksss|> 424*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit 425*9880d681SAndroid Build Coastguard Worker// k = constant address = 7 bits 426*9880d681SAndroid Build Coastguard Worker// s = bit in status register = 3 bits 427*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 428*9880d681SAndroid Build Coastguard Workerclass FBRsk<bit f, bits<3> s, dag outs, dag ins, string asmstr, list<dag> pattern> 429*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 430*9880d681SAndroid Build Coastguard Worker{ 431*9880d681SAndroid Build Coastguard Worker bits<7> k; 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = 0b11110; 434*9880d681SAndroid Build Coastguard Worker let Inst{10} = f; 435*9880d681SAndroid Build Coastguard Worker let Inst{9-3} = k; 436*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = s; 437*9880d681SAndroid Build Coastguard Worker} 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 440*9880d681SAndroid Build Coastguard Worker// Special, opcode only instructions: <|opcode|> 441*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Workerclass F16<bits<16> opcode, dag outs, dag ins, string asmstr, list<dag> pattern> 444*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 445*9880d681SAndroid Build Coastguard Worker{ 446*9880d681SAndroid Build Coastguard Worker let Inst = opcode; 447*9880d681SAndroid Build Coastguard Worker} 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Workerclass F32<bits<32> opcode, dag outs, dag ins, string asmstr, list<dag> pattern> 450*9880d681SAndroid Build Coastguard Worker : AVRInst32<outs, ins, asmstr, pattern> 451*9880d681SAndroid Build Coastguard Worker{ 452*9880d681SAndroid Build Coastguard Worker let Inst = opcode; 453*9880d681SAndroid Build Coastguard Worker} 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 456*9880d681SAndroid Build Coastguard Worker// Branching instructions with immediate12: <|110f|kkkk|kkkk|kkkk|> 457*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit 458*9880d681SAndroid Build Coastguard Worker// k = constant address = 12 bits 459*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 460*9880d681SAndroid Build Coastguard Workerclass FBRk<bit f, dag outs, dag ins, string asmstr, list<dag> pattern> 461*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 462*9880d681SAndroid Build Coastguard Worker{ 463*9880d681SAndroid Build Coastguard Worker bits<12> k; 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker let Inst{15-13} = 0b110; 466*9880d681SAndroid Build Coastguard Worker let Inst{12} = f; 467*9880d681SAndroid Build Coastguard Worker let Inst{11-0} = k; 468*9880d681SAndroid Build Coastguard Worker} 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 471*9880d681SAndroid Build Coastguard Worker// 32 bits branching instructions: <|1001|010k|kkkk|fffk|kkkk|kkkk|kkkk|kkkk|> 472*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 3 bits 473*9880d681SAndroid Build Coastguard Worker// k = constant address = 22 bits 474*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 475*9880d681SAndroid Build Coastguard Workerclass F32BRk<bits<3> f, dag outs, dag ins, string asmstr, list<dag> pattern> 476*9880d681SAndroid Build Coastguard Worker : AVRInst32<outs, ins, asmstr, pattern> 477*9880d681SAndroid Build Coastguard Worker{ 478*9880d681SAndroid Build Coastguard Worker bits<22> k; 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Worker let Inst{31-25} = 0b1001010; 481*9880d681SAndroid Build Coastguard Worker let Inst{24-20} = k{21-17}; 482*9880d681SAndroid Build Coastguard Worker let Inst{19-17} = f; 483*9880d681SAndroid Build Coastguard Worker let Inst{16-0} = k{16-0}; 484*9880d681SAndroid Build Coastguard Worker} 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 487*9880d681SAndroid Build Coastguard Worker// 32 bits direct mem instructions: <|1001|00fd|dddd|0000|kkkk|kkkk|kkkk|kkkk|> 488*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit 489*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits 490*9880d681SAndroid Build Coastguard Worker// k = constant address = 16 bits 491*9880d681SAndroid Build Coastguard Worker// (Accepts all registers) 492*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 493*9880d681SAndroid Build Coastguard Workerclass F32DM<bit f, dag outs, dag ins, string asmstr, list<dag> pattern> 494*9880d681SAndroid Build Coastguard Worker : AVRInst32<outs, ins, asmstr, pattern> 495*9880d681SAndroid Build Coastguard Worker{ 496*9880d681SAndroid Build Coastguard Worker bits<5> rd; 497*9880d681SAndroid Build Coastguard Worker bits<16> k; 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker let Inst{31-28} = 0b1001; 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker let Inst{27-26} = 0b00; 502*9880d681SAndroid Build Coastguard Worker let Inst{25} = f; 503*9880d681SAndroid Build Coastguard Worker let Inst{24} = rd{4}; 504*9880d681SAndroid Build Coastguard Worker 505*9880d681SAndroid Build Coastguard Worker let Inst{23-20} = rd{3-0}; 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = 0b0000; 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = k; 510*9880d681SAndroid Build Coastguard Worker} 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Worker// <|1001|0100|bfff|1000> 513*9880d681SAndroid Build Coastguard Workerclass FS<bit b, dag outs, dag ins, string asmstr, list<dag> pattern> 514*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 515*9880d681SAndroid Build Coastguard Worker{ 516*9880d681SAndroid Build Coastguard Worker bits<3> s; 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1001; 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = 0b0100; 521*9880d681SAndroid Build Coastguard Worker 522*9880d681SAndroid Build Coastguard Worker let Inst{7} = b; 523*9880d681SAndroid Build Coastguard Worker let Inst{6-4} = s; 524*9880d681SAndroid Build Coastguard Worker 525*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b1000; 526*9880d681SAndroid Build Coastguard Worker} 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Worker// Set/clr bit in status flag instructions/ 529*9880d681SAndroid Build Coastguard Worker// <BRBS|BRBC> s, k 530*9880d681SAndroid Build Coastguard Worker// --------------------- 531*9880d681SAndroid Build Coastguard Worker// <|1111|0fkk|kkkk|ksss> 532*9880d681SAndroid Build Coastguard Workerclass FSK<bit f, dag outs, dag ins, string asmstr, list<dag> pattern> 533*9880d681SAndroid Build Coastguard Worker : AVRInst16<outs, ins, asmstr, pattern> 534*9880d681SAndroid Build Coastguard Worker{ 535*9880d681SAndroid Build Coastguard Worker bits<7> k; 536*9880d681SAndroid Build Coastguard Worker bits<3> s; 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0b1111; 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker let Inst{11} = 0; 541*9880d681SAndroid Build Coastguard Worker let Inst{10} = f; 542*9880d681SAndroid Build Coastguard Worker let Inst{9-8} = k{6-5}; 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = k{4-1}; 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Worker let Inst{3} = k{0}; 547*9880d681SAndroid Build Coastguard Worker let Inst{2-0} = s; 548*9880d681SAndroid Build Coastguard Worker} 549*9880d681SAndroid Build Coastguard Worker 550*9880d681SAndroid Build Coastguard Workerclass ExtensionPseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 551*9880d681SAndroid Build Coastguard Worker : Pseudo<outs, ins, asmstr, pattern> 552*9880d681SAndroid Build Coastguard Worker{ 553*9880d681SAndroid Build Coastguard Worker let Defs = [SREG]; 554*9880d681SAndroid Build Coastguard Worker} 555*9880d681SAndroid Build Coastguard Worker 556*9880d681SAndroid Build Coastguard Workerclass StorePseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 557*9880d681SAndroid Build Coastguard Worker : Pseudo<outs, ins, asmstr, pattern> 558*9880d681SAndroid Build Coastguard Worker{ 559*9880d681SAndroid Build Coastguard Worker let Defs = [SP]; 560*9880d681SAndroid Build Coastguard Worker} 561*9880d681SAndroid Build Coastguard Worker 562*9880d681SAndroid Build Coastguard Workerclass SelectPseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 563*9880d681SAndroid Build Coastguard Worker : Pseudo<outs, ins, asmstr, pattern> 564*9880d681SAndroid Build Coastguard Worker{ 565*9880d681SAndroid Build Coastguard Worker let usesCustomInserter = 1; 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Worker let Uses = [SREG]; 568*9880d681SAndroid Build Coastguard Worker} 569*9880d681SAndroid Build Coastguard Worker 570*9880d681SAndroid Build Coastguard Workerclass ShiftPseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 571*9880d681SAndroid Build Coastguard Worker : Pseudo<outs, ins, asmstr, pattern> 572*9880d681SAndroid Build Coastguard Worker{ 573*9880d681SAndroid Build Coastguard Worker let usesCustomInserter = 1; 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Worker let Defs = [SREG]; 576*9880d681SAndroid Build Coastguard Worker} 577*9880d681SAndroid Build Coastguard Worker 578