1234353Sdim//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===// 2193323Sed// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6193323Sed// 7193323Sed//===----------------------------------------------------------------------===// 8193323Sed 9193323Sed//===----------------------------------------------------------------------===// 10193323Sed// Describe MSP430 instructions format here 11193323Sed// 12193323Sed 13202878Srdivackyclass SourceMode<bits<2> val> { 14202878Srdivacky bits<2> Value = val; 15202878Srdivacky} 16202878Srdivacky 17344779Sdimdef SrcReg : SourceMode<0>; // r 18344779Sdimdef SrcMem : SourceMode<1>; // m 19344779Sdimdef SrcIndReg : SourceMode<2>; // n 20344779Sdimdef SrcPostInc : SourceMode<3>; // p 21344779Sdimdef SrcImm : SourceMode<3>; // i 22344779Sdim// SrcCGImm : SourceMode< >; // c 23202878Srdivacky 24202878Srdivackyclass DestMode<bit val> { 25202878Srdivacky bit Value = val; 26202878Srdivacky} 27202878Srdivacky 28344779Sdimdef DstReg : DestMode<0>; // r 29344779Sdimdef DstMem : DestMode<1>; // m 30202878Srdivacky 31193323Sed// Generic MSP430 Format 32344779Sdimclass MSP430Inst<dag outs, dag ins, int size, string asmstr> : Instruction { 33344779Sdim field bits<48> Inst; 34344779Sdim field bits<48> SoftFail = 0; 35193323Sed 36193323Sed let Namespace = "MSP430"; 37193323Sed 38193323Sed dag OutOperandList = outs; 39193323Sed dag InOperandList = ins; 40193323Sed 41344779Sdim let AsmString = asmstr; 42344779Sdim let Size = size; 43193323Sed} 44193323Sed 45193323Sed// MSP430 Double Operand (Format I) Instructions 46344779Sdimclass IForm<bits<4> opcode, DestMode ad, bit bw, SourceMode as, int size, 47193323Sed dag outs, dag ins, string asmstr, list<dag> pattern> 48344779Sdim : MSP430Inst<outs, ins, size, asmstr> { 49193323Sed let Pattern = pattern; 50202878Srdivacky 51344779Sdim bits<4> rs; 52344779Sdim bits<4> rd; 53344779Sdim 54344779Sdim let Inst{15-12} = opcode; 55344779Sdim let Inst{11-8} = rs; 56202878Srdivacky let Inst{7} = ad.Value; 57193323Sed let Inst{6} = bw; 58344779Sdim let Inst{5-4} = as.Value; 59344779Sdim let Inst{3-0} = rd; 60193323Sed} 61193323Sed 62202878Srdivacky// 8 bit IForm instructions 63344779Sdimclass IForm8<bits<4> opcode, DestMode dest, SourceMode src, int size, 64202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 65344779Sdim : IForm<opcode, dest, 1, src, size, outs, ins, asmstr, pattern>; 66202878Srdivacky 67202878Srdivackyclass I8rr<bits<4> opcode, 68202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 69344779Sdim : IForm8<opcode, DstReg, SrcReg, 2, outs, ins, asmstr, pattern> { 70344779Sdim let DecoderNamespace = "Alpha"; 71344779Sdim} 72202878Srdivacky 73202878Srdivackyclass I8ri<bits<4> opcode, 74202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 75344779Sdim : IForm8<opcode, DstReg, SrcImm, 4, outs, ins, asmstr, pattern> { 76344779Sdim let DecoderNamespace = "Gamma"; 77344779Sdim bits<16> imm; 78344779Sdim let Inst{31-16} = imm; 79344779Sdim let rs = 0b0000; 80344779Sdim} 81202878Srdivacky 82344779Sdimclass I8rc<bits<4> opcode, 83344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 84344779Sdim : MSP430Inst<outs, ins, 2, asmstr> { 85344779Sdim let DecoderNamespace = "Beta"; 86344779Sdim let Pattern = pattern; 87344779Sdim 88344779Sdim bits<6> imm; 89344779Sdim bits<4> rd; 90344779Sdim 91344779Sdim let Inst{15-12} = opcode; 92344779Sdim let Inst{11-8} = imm{3-0}; 93344779Sdim let Inst{7} = DstReg.Value; 94344779Sdim let Inst{6} = 1; 95344779Sdim let Inst{5-4} = imm{5-4}; 96344779Sdim let Inst{3-0} = rd; 97344779Sdim} 98344779Sdim 99202878Srdivackyclass I8rm<bits<4> opcode, 100202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 101344779Sdim : IForm8<opcode, DstReg, SrcMem, 4, outs, ins, asmstr, pattern> { 102344779Sdim let DecoderNamespace = "Gamma"; 103344779Sdim bits<20> src; 104344779Sdim let rs = src{3-0}; 105344779Sdim let Inst{31-16} = src{19-4}; 106344779Sdim} 107202878Srdivacky 108344779Sdimclass I8rn<bits<4> opcode, 109344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 110344779Sdim : IForm8<opcode, DstReg, SrcIndReg, 2, outs, ins, asmstr, pattern> { 111344779Sdim let DecoderNamespace = "Delta"; 112344779Sdim} 113344779Sdim 114344779Sdimclass I8rp<bits<4> opcode, 115344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 116344779Sdim : IForm8<opcode, DstReg, SrcPostInc, 2, outs, ins, asmstr, pattern> { 117344779Sdim let DecoderNamespace = "Delta"; 118344779Sdim} 119344779Sdim 120202878Srdivackyclass I8mr<bits<4> opcode, 121202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 122344779Sdim : IForm8<opcode, DstMem, SrcReg, 4, outs, ins, asmstr, pattern> { 123344779Sdim let DecoderNamespace = "Alpha"; 124344779Sdim bits<20> dst; 125344779Sdim let rd = dst{3-0}; 126344779Sdim let Inst{31-16} = dst{19-4}; 127344779Sdim} 128202878Srdivacky 129202878Srdivackyclass I8mi<bits<4> opcode, 130202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 131344779Sdim : IForm8<opcode, DstMem, SrcImm, 6, outs, ins, asmstr, pattern> { 132344779Sdim let DecoderNamespace = "Gamma"; 133344779Sdim bits<16> imm; 134344779Sdim bits<20> dst; 135344779Sdim let rs = 0b0000; 136344779Sdim let Inst{31-16} = imm; 137344779Sdim let rd = dst{3-0}; 138344779Sdim let Inst{47-32} = dst{19-4}; 139344779Sdim} 140202878Srdivacky 141344779Sdimclass I8mc<bits<4> opcode, 142344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 143344779Sdim : MSP430Inst<outs, ins, 4, asmstr> { 144344779Sdim let DecoderNamespace = "Beta"; 145344779Sdim let Pattern = pattern; 146344779Sdim 147344779Sdim bits<6> imm; 148344779Sdim bits<20> dst; 149344779Sdim 150344779Sdim let Inst{31-16} = dst{19-4}; 151344779Sdim let Inst{15-12} = opcode; 152344779Sdim let Inst{11-8} = imm{3-0}; 153344779Sdim let Inst{7} = DstMem.Value; 154344779Sdim let Inst{6} = 1; 155344779Sdim let Inst{5-4} = imm{5-4}; 156344779Sdim let Inst{3-0} = dst{3-0}; 157344779Sdim} 158344779Sdim 159202878Srdivackyclass I8mm<bits<4> opcode, 160202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 161344779Sdim : IForm8<opcode, DstMem, SrcMem, 6, outs, ins, asmstr, pattern> { 162344779Sdim let DecoderNamespace = "Gamma"; 163344779Sdim bits<20> src; 164344779Sdim bits<20> dst; 165344779Sdim let rs = src{3-0}; 166344779Sdim let Inst{31-16} = src{19-4}; 167344779Sdim let rd = dst{3-0}; 168344779Sdim let Inst{47-32} = dst{19-4}; 169344779Sdim} 170202878Srdivacky 171344779Sdimclass I8mn<bits<4> opcode, 172344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 173344779Sdim : IForm8<opcode, DstMem, SrcIndReg, 4, outs, ins, asmstr, pattern> { 174344779Sdim let DecoderNamespace = "Delta"; 175344779Sdim bits<20> dst; 176344779Sdim let rd = dst{3-0}; 177344779Sdim let Inst{31-16} = dst{19-4}; 178344779Sdim} 179344779Sdim 180344779Sdimclass I8mp<bits<4> opcode, 181344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 182344779Sdim : IForm8<opcode, DstMem, SrcPostInc, 4, outs, ins, asmstr, pattern> { 183344779Sdim let DecoderNamespace = "Delta"; 184344779Sdim bits<20> dst; 185344779Sdim let rd = dst{3-0}; 186344779Sdim let Inst{31-16} = dst{19-4}; 187344779Sdim} 188344779Sdim 189202878Srdivacky// 16 bit IForm instructions 190344779Sdimclass IForm16<bits<4> opcode, DestMode dest, SourceMode src, int size, 191202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 192344779Sdim : IForm<opcode, dest, 0, src, size, outs, ins, asmstr, pattern>; 193202878Srdivacky 194202878Srdivackyclass I16rr<bits<4> opcode, 195202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 196344779Sdim : IForm16<opcode, DstReg, SrcReg, 2, outs, ins, asmstr, pattern> { 197344779Sdim let DecoderNamespace = "Alpha"; 198344779Sdim} 199202878Srdivacky 200202878Srdivackyclass I16ri<bits<4> opcode, 201202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 202344779Sdim : IForm16<opcode, DstReg, SrcImm, 4, outs, ins, asmstr, pattern> { 203344779Sdim let DecoderNamespace = "Gamma"; 204344779Sdim bits<16> imm; 205344779Sdim let Inst{31-16} = imm; 206344779Sdim let rs = 0b0000; 207344779Sdim} 208202878Srdivacky 209344779Sdimclass I16rc<bits<4> opcode, 210344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 211344779Sdim : MSP430Inst<outs, ins, 2, asmstr> { 212344779Sdim let DecoderNamespace = "Beta"; 213344779Sdim let Pattern = pattern; 214344779Sdim 215344779Sdim bits<6> imm; 216344779Sdim bits<4> rd; 217344779Sdim 218344779Sdim let Inst{15-12} = opcode; 219344779Sdim let Inst{11-8} = imm{3-0}; 220344779Sdim let Inst{7} = DstReg.Value; 221344779Sdim let Inst{6} = 0; 222344779Sdim let Inst{5-4} = imm{5-4}; 223344779Sdim let Inst{3-0} = rd; 224344779Sdim} 225344779Sdim 226202878Srdivackyclass I16rm<bits<4> opcode, 227202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 228344779Sdim : IForm16<opcode, DstReg, SrcMem, 4, outs, ins, asmstr, pattern> { 229344779Sdim let DecoderNamespace = "Gamma"; 230344779Sdim bits<20> src; 231344779Sdim let rs = src{3-0}; 232344779Sdim let Inst{31-16} = src{19-4}; 233344779Sdim} 234202878Srdivacky 235344779Sdimclass I16rn<bits<4> opcode, 236344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 237344779Sdim : IForm16<opcode, DstReg, SrcIndReg, 2, outs, ins, asmstr, pattern> { 238344779Sdim let DecoderNamespace = "Delta"; 239344779Sdim} 240344779Sdim 241344779Sdimclass I16rp<bits<4> opcode, 242344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 243344779Sdim : IForm16<opcode, DstReg, SrcPostInc, 2, outs, ins, asmstr, pattern> { 244344779Sdim let DecoderNamespace = "Delta"; 245344779Sdim} 246344779Sdim 247202878Srdivackyclass I16mr<bits<4> opcode, 248202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 249344779Sdim : IForm16<opcode, DstMem, SrcReg, 4, outs, ins, asmstr, pattern> { 250344779Sdim let DecoderNamespace = "Alpha"; 251344779Sdim bits<20> dst; 252344779Sdim let rd = dst{3-0}; 253344779Sdim let Inst{31-16} = dst{19-4}; 254344779Sdim} 255202878Srdivacky 256202878Srdivackyclass I16mi<bits<4> opcode, 257202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 258344779Sdim : IForm16<opcode, DstMem, SrcImm, 6, outs, ins, asmstr, pattern> { 259344779Sdim let DecoderNamespace = "Gamma"; 260344779Sdim bits<16> imm; 261344779Sdim bits<20> dst; 262344779Sdim let Inst{31-16} = imm; 263344779Sdim let rs = 0b0000; 264344779Sdim let rd = dst{3-0}; 265344779Sdim let Inst{47-32} = dst{19-4}; 266344779Sdim} 267202878Srdivacky 268344779Sdimclass I16mc<bits<4> opcode, 269344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 270344779Sdim : MSP430Inst<outs, ins, 4, asmstr> { 271344779Sdim let DecoderNamespace = "Beta"; 272344779Sdim let Pattern = pattern; 273344779Sdim 274344779Sdim bits<6> imm; 275344779Sdim bits<20> dst; 276344779Sdim 277344779Sdim let Inst{31-16} = dst{19-4}; 278344779Sdim let Inst{15-12} = opcode; 279344779Sdim let Inst{11-8} = imm{3-0}; 280344779Sdim let Inst{7} = DstMem.Value; 281344779Sdim let Inst{6} = 0; 282344779Sdim let Inst{5-4} = imm{5-4}; 283344779Sdim let Inst{3-0} = dst{3-0}; 284344779Sdim} 285344779Sdim 286202878Srdivackyclass I16mm<bits<4> opcode, 287202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 288344779Sdim : IForm16<opcode, DstMem, SrcMem, 6, outs, ins, asmstr, pattern> { 289344779Sdim let DecoderNamespace = "Gamma"; 290344779Sdim bits<20> src; 291344779Sdim bits<20> dst; 292344779Sdim let rs = src{3-0}; 293344779Sdim let Inst{31-16} = src{19-4}; 294344779Sdim let rd = dst{3-0}; 295344779Sdim let Inst{47-32} = dst{19-4}; 296344779Sdim} 297202878Srdivacky 298344779Sdimclass I16mn<bits<4> opcode, 299344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 300344779Sdim : IForm16<opcode, DstMem, SrcIndReg, 4, outs, ins, asmstr, pattern> { 301344779Sdim let DecoderNamespace = "Delta"; 302344779Sdim bits<20> dst; 303344779Sdim let rd = dst{3-0}; 304344779Sdim let Inst{31-16} = dst{19-4}; 305344779Sdim} 306344779Sdim 307344779Sdimclass I16mp<bits<4> opcode, 308344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 309344779Sdim : IForm16<opcode, DstMem, SrcPostInc, 4, outs, ins, asmstr, pattern> { 310344779Sdim let DecoderNamespace = "Delta"; 311344779Sdim bits<20> dst; 312344779Sdim let rd = dst{3-0}; 313344779Sdim let Inst{31-16} = dst{19-4}; 314344779Sdim} 315344779Sdim 316193323Sed// MSP430 Single Operand (Format II) Instructions 317344779Sdimclass IIForm<bits<3> opcode, bit bw, SourceMode as, int size, 318193323Sed dag outs, dag ins, string asmstr, list<dag> pattern> 319344779Sdim : MSP430Inst<outs, ins, size, asmstr> { 320193323Sed let Pattern = pattern; 321202878Srdivacky 322344779Sdim bits<4> rs; 323344779Sdim 324344779Sdim let Inst{15-10} = 0b000100; 325344779Sdim let Inst{9-7} = opcode; 326344779Sdim let Inst{6} = bw; 327344779Sdim let Inst{5-4} = as.Value; 328344779Sdim let Inst{3-0} = rs; 329193323Sed} 330193323Sed 331202878Srdivacky// 8 bit IIForm instructions 332344779Sdimclass IIForm8<bits<3> opcode, SourceMode src, int size, 333202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 334344779Sdim : IIForm<opcode, 1, src, size, outs, ins, asmstr, pattern>; 335202878Srdivacky 336344779Sdimclass II8r<bits<3> opcode, 337202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 338344779Sdim : IIForm8<opcode, SrcReg, 2, outs, ins, asmstr, pattern>; 339202878Srdivacky 340344779Sdimclass II8m<bits<3> opcode, 341202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 342344779Sdim : IIForm8<opcode, SrcMem, 4, outs, ins, asmstr, pattern> { 343344779Sdim bits<20> src; 344344779Sdim let rs = src{3-0}; 345344779Sdim let Inst{31-16} = src{19-4}; 346344779Sdim} 347202878Srdivacky 348344779Sdimclass II8i<bits<3> opcode, 349202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 350344779Sdim : IIForm8<opcode, SrcImm, 4, outs, ins, asmstr, pattern> { 351344779Sdim bits<16> imm; 352344779Sdim let rs = 0b0000; 353344779Sdim let Inst{31-16} = imm; 354344779Sdim} 355202878Srdivacky 356344779Sdimclass II8c<bits<3> opcode, 357344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 358344779Sdim : MSP430Inst<outs, ins, 2, asmstr> { 359344779Sdim let Pattern = pattern; 360344779Sdim 361344779Sdim bits<6> imm; 362344779Sdim 363344779Sdim let Inst{15-10} = 0b000100; 364344779Sdim let Inst{9-7} = opcode; 365344779Sdim let Inst{6} = 1; 366344779Sdim let Inst{5-0} = imm; 367344779Sdim} 368344779Sdim 369344779Sdimclass II8n<bits<3> opcode, 370344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 371344779Sdim : IIForm8<opcode, SrcIndReg, 2, outs, ins, asmstr, pattern>; 372344779Sdim 373344779Sdimclass II8p<bits<3> opcode, 374344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 375344779Sdim : IIForm8<opcode, SrcPostInc, 2, outs, ins, asmstr, pattern>; 376344779Sdim 377202878Srdivacky// 16 bit IIForm instructions 378344779Sdimclass IIForm16<bits<3> opcode, SourceMode src, int size, 379202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 380344779Sdim : IIForm<opcode, 0, src, size, outs, ins, asmstr, pattern>; 381202878Srdivacky 382344779Sdimclass II16r<bits<3> opcode, 383202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 384344779Sdim : IIForm16<opcode, SrcReg, 2, outs, ins, asmstr, pattern>; 385202878Srdivacky 386344779Sdimclass II16m<bits<3> opcode, 387202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 388344779Sdim : IIForm16<opcode, SrcMem, 4, outs, ins, asmstr, pattern> { 389344779Sdim bits<20> src; 390344779Sdim let rs = src{3-0}; 391344779Sdim let Inst{31-16} = src{19-4}; 392344779Sdim} 393202878Srdivacky 394344779Sdimclass II16i<bits<3> opcode, 395202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 396344779Sdim : IIForm16<opcode, SrcImm, 4, outs, ins, asmstr, pattern> { 397344779Sdim bits<16> imm; 398344779Sdim let rs = 0b0000; 399344779Sdim let Inst{31-16} = imm; 400344779Sdim} 401202878Srdivacky 402344779Sdimclass II16c<bits<3> opcode, 403344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 404344779Sdim : MSP430Inst<outs, ins, 2, asmstr> { 405344779Sdim let Pattern = pattern; 406344779Sdim 407344779Sdim bits<6> imm; 408344779Sdim 409344779Sdim let Inst{15-10} = 0b000100; 410344779Sdim let Inst{9-7} = opcode; 411344779Sdim let Inst{6} = 0; 412344779Sdim let Inst{5-0} = imm; 413344779Sdim} 414344779Sdim 415344779Sdimclass II16n<bits<3> opcode, 416344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 417344779Sdim : IIForm16<opcode, SrcIndReg, 2, outs, ins, asmstr, pattern>; 418344779Sdim 419344779Sdimclass II16p<bits<3> opcode, 420344779Sdim dag outs, dag ins, string asmstr, list<dag> pattern> 421344779Sdim : IIForm16<opcode, SrcPostInc, 2, outs, ins, asmstr, pattern>; 422344779Sdim 423193323Sed// MSP430 Conditional Jumps Instructions 424344779Sdimclass CJForm<dag outs, dag ins, string asmstr, list<dag> pattern> 425344779Sdim : MSP430Inst<outs, ins, 2, asmstr> { 426193323Sed let Pattern = pattern; 427193323Sed 428344779Sdim bits<3> cond; 429344779Sdim bits<10> dst; 430344779Sdim 431344779Sdim let Inst{15-13} = 0b001; 432344779Sdim let Inst{12-10} = cond; 433344779Sdim let Inst{9-0} = dst; 434193323Sed} 435193323Sed 436193323Sed// Pseudo instructions 437193323Sedclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 438344779Sdim : MSP430Inst<outs, ins, 0, asmstr> { 439193323Sed let Pattern = pattern; 440193323Sed} 441