486 lines
12 KiB
TableGen
486 lines
12 KiB
TableGen
// LoongArchLSXInstrFormats.td - LoongArch LSX Instr Formats -*- tablegen -*-=//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Describe LoongArch LSX instructions format
|
|
//
|
|
// opcode - operation code.
|
|
// vd/rd/cd - destination register operand.
|
|
// {r/v}{j/k} - source register operand.
|
|
// immN - immediate data operand.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// 1RI13-type
|
|
// <opcode | I13 | vd>
|
|
class Fmt1RI13_VI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<13> imm13;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{17-5} = imm13;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2R-type
|
|
// <opcode | vj | vd>
|
|
class Fmt2R_VV<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | rj | vd>
|
|
class Fmt2R_VR<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | vj | cd>
|
|
class Fmt2R_CV<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> vj;
|
|
bits<3> cd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{9-5} = vj;
|
|
let Inst{2-0} = cd;
|
|
}
|
|
|
|
// 2RI1-type
|
|
// <opcode | I1 | vj | vd>
|
|
class Fmt2RI1_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<1> imm1;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{10} = imm1;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I1 | rj | vd>
|
|
class Fmt2RI1_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<1> imm1;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{10} = imm1;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I1 | vj | rd>
|
|
class Fmt2RI1_RVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<1> imm1;
|
|
bits<5> vj;
|
|
bits<5> rd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{10} = imm1;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = rd;
|
|
}
|
|
|
|
// 2RI2-type
|
|
// <opcode | I2 | vj | vd>
|
|
class Fmt2RI2_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<2> imm2;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{11-10} = imm2;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I2 | rj | vd>
|
|
class Fmt2RI2_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<2> imm2;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{11-10} = imm2;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I2 | vj | rd>
|
|
class Fmt2RI2_RVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<2> imm2;
|
|
bits<5> vj;
|
|
bits<5> rd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{11-10} = imm2;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = rd;
|
|
}
|
|
|
|
// 2RI3-type
|
|
// <opcode | I3 | vj | vd>
|
|
class Fmt2RI3_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<3> imm3;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{12-10} = imm3;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I3 | rj | vd>
|
|
class Fmt2RI3_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<3> imm3;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{12-10} = imm3;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I3 | vj | rd>
|
|
class Fmt2RI3_RVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<3> imm3;
|
|
bits<5> vj;
|
|
bits<5> rd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{12-10} = imm3;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = rd;
|
|
}
|
|
|
|
// 2RI4-type
|
|
// <opcode | I4 | vj | vd>
|
|
class Fmt2RI4_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<4> imm4;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{13-10} = imm4;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I4 | rj | vd>
|
|
class Fmt2RI4_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<4> imm4;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{13-10} = imm4;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | I4 | vj | rd>
|
|
class Fmt2RI4_RVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<4> imm4;
|
|
bits<5> vj;
|
|
bits<5> rd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{13-10} = imm4;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = rd;
|
|
}
|
|
|
|
// 2RI5-type
|
|
// <opcode | I5 | vj | vd>
|
|
class Fmt2RI5_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> imm5;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{14-10} = imm5;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI6-type
|
|
// <opcode | I6 | vj | vd>
|
|
class Fmt2RI6_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<6> imm6;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{15-10} = imm6;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI7-type
|
|
// <opcode | I7 | vj | vd>
|
|
class Fmt2RI7_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<7> imm7;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{16-10} = imm7;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI8-type
|
|
// <opcode | I8 | vj | vd>
|
|
class Fmt2RI8_VVI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<8> imm8;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{17-10} = imm8;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI8I1-type
|
|
// <opcode | I1 | I8 | vj | vd>
|
|
class Fmt2RI8I1_VRII<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<1> imm1;
|
|
bits<8> imm8;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{18} = imm1;
|
|
let Inst{17-10} = imm8;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI8I2-type
|
|
// <opcode | I2 | I8 | vj | vd>
|
|
class Fmt2RI8I2_VRII<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<2> imm2;
|
|
bits<8> imm8;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{19-18} = imm2;
|
|
let Inst{17-10} = imm8;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI8I3-type
|
|
// <opcode | I3 | I8 | vj | vd>
|
|
class Fmt2RI8I3_VRII<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<3> imm3;
|
|
bits<8> imm8;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{20-18} = imm3;
|
|
let Inst{17-10} = imm8;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI8I4-type
|
|
// <opcode | I4 | I8 | vj | vd>
|
|
class Fmt2RI8I4_VRII<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<4> imm4;
|
|
bits<8> imm8;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{21-18} = imm4;
|
|
let Inst{17-10} = imm8;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
// 2RI9-type
|
|
// <opcode | I9 | rj | vd>
|
|
class Fmt2RI9_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<9> imm9;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{18-10} = imm9;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI10-type
|
|
// <opcode | I10 | rj | vd>
|
|
class Fmt2RI10_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<10> imm10;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{19-10} = imm10;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI11-type
|
|
// <opcode | I11 | rj | vd>
|
|
class Fmt2RI11_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<11> imm11;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{20-10} = imm11;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 2RI12-type
|
|
// <opcode | I12 | rj | vd>
|
|
class Fmt2RI12_VRI<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<12> imm12;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{21-10} = imm12;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 3R-type
|
|
// <opcode | vk | vj | vd>
|
|
class Fmt3R_VVV<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> vk;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{14-10} = vk;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | rk | vj | vd>
|
|
class Fmt3R_VVR<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> rk;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{14-10} = rk;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// <opcode | rk | rj | vd>
|
|
class Fmt3R_VRR<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> rk;
|
|
bits<5> rj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{14-10} = rk;
|
|
let Inst{9-5} = rj;
|
|
let Inst{4-0} = vd;
|
|
}
|
|
|
|
// 4R-type
|
|
// <opcode | va | vk | vj | vd>
|
|
class Fmt4R_VVVV<bits<32> op, dag outs, dag ins, string opnstr,
|
|
list<dag> pattern = []>
|
|
: LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
|
|
bits<5> va;
|
|
bits<5> vk;
|
|
bits<5> vj;
|
|
bits<5> vd;
|
|
|
|
let Inst{31-0} = op;
|
|
let Inst{19-15} = va;
|
|
let Inst{14-10} = vk;
|
|
let Inst{9-5} = vj;
|
|
let Inst{4-0} = vd;
|
|
}
|