354 lines
10 KiB
TableGen
354 lines
10 KiB
TableGen
//===- XtensaDSPInstrInfo.td - Xtensa Target Description ---*- tablegen -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file describes the Xtensa DSP instructions in TableGen format.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Multiply
|
|
class UMUL_AA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x07, (outs), (ins AR:$s, AR:$t),
|
|
instrAsm#"\t$s, $t", []>, Requires<[HasMAC16]> {
|
|
let r = 0;
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def UMUL_AA_LL : UMUL_AA<0x00, "umul.aa.ll">;
|
|
def UMUL_AA_HL : UMUL_AA<0x01, "umul.aa.hl">;
|
|
def UMUL_AA_LH : UMUL_AA<0x02, "umul.aa.lh">;
|
|
def UMUL_AA_HH : UMUL_AA<0x03, "umul.aa.hh">;
|
|
|
|
class MUL_AA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x07, (outs), (ins AR:$s, AR:$t),
|
|
instrAsm#"\t$s, $t", []>, Requires<[HasMAC16]> {
|
|
let r = 0;
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MUL_AA_LL : MUL_AA<0x04, "mul.aa.ll">;
|
|
def MUL_AA_HL : MUL_AA<0x05, "mul.aa.hl">;
|
|
def MUL_AA_LH : MUL_AA<0x06, "mul.aa.lh">;
|
|
def MUL_AA_HH : MUL_AA<0x07, "mul.aa.hh">;
|
|
|
|
class MUL_AD<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x03, (outs), (ins AR:$s, MR23:$y),
|
|
instrAsm#"\t$s, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> y;
|
|
|
|
let r = 0;
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MUL_AD_LL : MUL_AD<0x04, "mul.ad.ll">;
|
|
def MUL_AD_HL : MUL_AD<0x05, "mul.ad.hl">;
|
|
def MUL_AD_LH : MUL_AD<0x06, "mul.ad.lh">;
|
|
def MUL_AD_HH : MUL_AD<0x07, "mul.ad.hh">;
|
|
|
|
class MUL_DA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x06, (outs), (ins MR01:$x, AR:$t),
|
|
instrAsm#"\t$x, $t", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = 0;
|
|
let s = 0;
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MUL_DA_LL : MUL_DA<0x04, "mul.da.ll">;
|
|
def MUL_DA_HL : MUL_DA<0x05, "mul.da.hl">;
|
|
def MUL_DA_LH : MUL_DA<0x06, "mul.da.lh">;
|
|
def MUL_DA_HH : MUL_DA<0x07, "mul.da.hh">;
|
|
|
|
class MUL_DD<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x02, (outs), (ins MR01:$x, MR23:$y),
|
|
instrAsm#"\t$x, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
bits<2> y;
|
|
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = 0;
|
|
let s = 0;
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MUL_DD_LL : MUL_DD<0x04, "mul.dd.ll">;
|
|
def MUL_DD_HL : MUL_DD<0x05, "mul.dd.hl">;
|
|
def MUL_DD_LH : MUL_DD<0x06, "mul.dd.lh">;
|
|
def MUL_DD_HH : MUL_DD<0x07, "mul.dd.hh">;
|
|
|
|
class MULA_AA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x07, (outs), (ins AR:$s, AR:$t),
|
|
instrAsm#"\t$s, $t", []>, Requires<[HasMAC16]> {
|
|
let r = 0;
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_AA_LL : MULA_AA<0x08, "mula.aa.ll">;
|
|
def MULA_AA_HL : MULA_AA<0x09, "mula.aa.hl">;
|
|
def MULA_AA_LH : MULA_AA<0x0A, "mula.aa.lh">;
|
|
def MULA_AA_HH : MULA_AA<0x0B, "mula.aa.hh">;
|
|
|
|
class MULA_AD<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x03, (outs), (ins AR:$s, MR23:$y),
|
|
instrAsm#"\t$s, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> y;
|
|
|
|
let r = 0;
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_AD_LL : MULA_AD<0x08, "mula.ad.ll">;
|
|
def MULA_AD_HL : MULA_AD<0x09, "mula.ad.hl">;
|
|
def MULA_AD_LH : MULA_AD<0x0A, "mula.ad.lh">;
|
|
def MULA_AD_HH : MULA_AD<0x0B, "mula.ad.hh">;
|
|
|
|
class MULA_DA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x06, (outs), (ins MR01:$x, AR:$t),
|
|
instrAsm#"\t$x, $t", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = 0;
|
|
let s = 0;
|
|
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_DA_LL : MULA_DA<0x08, "mula.da.ll">;
|
|
def MULA_DA_HL : MULA_DA<0x09, "mula.da.hl">;
|
|
def MULA_DA_LH : MULA_DA<0x0A, "mula.da.lh">;
|
|
def MULA_DA_HH : MULA_DA<0x0B, "mula.da.hh">;
|
|
|
|
class MULA_DD<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x02, (outs), (ins MR01:$x, MR23:$y),
|
|
instrAsm#"\t$x, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
bits<2> y;
|
|
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = 0;
|
|
let s = 0;
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_DD_LL : MULA_DD<0x08, "mula.dd.ll">;
|
|
def MULA_DD_HL : MULA_DD<0x09, "mula.dd.hl">;
|
|
def MULA_DD_LH : MULA_DD<0x0A, "mula.dd.lh">;
|
|
def MULA_DD_HH : MULA_DD<0x0B, "mula.dd.hh">;
|
|
|
|
class MULS_AA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x07, (outs), (ins AR:$s, AR:$t),
|
|
instrAsm#"\t$s, $t", []>, Requires<[HasMAC16]> {
|
|
let r = 0;
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULS_AA_LL : MULS_AA<0x0C, "muls.aa.ll">;
|
|
def MULS_AA_HL : MULS_AA<0x0D, "muls.aa.hl">;
|
|
def MULS_AA_LH : MULS_AA<0x0E, "muls.aa.lh">;
|
|
def MULS_AA_HH : MULS_AA<0x0F, "muls.aa.hh">;
|
|
|
|
class MULS_AD<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x03, (outs), (ins AR:$s, MR23:$y),
|
|
instrAsm#"\t$s, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> y;
|
|
|
|
let r = 0;
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULS_AD_LL : MULS_AD<0x0C, "muls.ad.ll">;
|
|
def MULS_AD_HL : MULS_AD<0x0D, "muls.ad.hl">;
|
|
def MULS_AD_LH : MULS_AD<0x0E, "muls.ad.lh">;
|
|
def MULS_AD_HH : MULS_AD<0x0F, "muls.ad.hh">;
|
|
|
|
class MULS_DA<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x06, (outs), (ins MR01:$x, AR:$t),
|
|
instrAsm#"\t$x, $t", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = 0;
|
|
let s = 0;
|
|
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULS_DA_LL : MULS_DA<0x0C, "muls.da.ll">;
|
|
def MULS_DA_HL : MULS_DA<0x0D, "muls.da.hl">;
|
|
def MULS_DA_LH : MULS_DA<0x0E, "muls.da.lh">;
|
|
def MULS_DA_HH : MULS_DA<0x0F, "muls.da.hh">;
|
|
|
|
class MULS_DD<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x02, (outs), (ins MR01:$x, MR23:$y),
|
|
instrAsm#"\t$x, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
bits<2> y;
|
|
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = 0;
|
|
let s = 0;
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULS_DD_LL : MULS_DD<0x0C, "muls.dd.ll">;
|
|
def MULS_DD_HL : MULS_DD<0x0D, "muls.dd.hl">;
|
|
def MULS_DD_LH : MULS_DD<0x0E, "muls.dd.lh">;
|
|
def MULS_DD_HH : MULS_DD<0x0F, "muls.dd.hh">;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Multiply-accumulate with load
|
|
|
|
class MULA_DA_LDDEC<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x05, (outs MR:$w, AR:$d), (ins AR:$s, MR01:$x, AR:$t),
|
|
instrAsm#"\t $w, $s, $x, $t", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
bits<2> w;
|
|
|
|
let Constraints = "$s = $d";
|
|
let mayLoad = 1;
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = w{1-0};
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_DA_LL_LDDEC : MULA_DA_LDDEC<0x08, "mula.da.ll.lddec">;
|
|
def MULA_DA_HL_LDDEC : MULA_DA_LDDEC<0x09, "mula.da.hl.lddec">;
|
|
def MULA_DA_LH_LDDEC : MULA_DA_LDDEC<0x0A, "mula.da.lh.lddec">;
|
|
def MULA_DA_HH_LDDEC : MULA_DA_LDDEC<0x0B, "mula.da.hh.lddec">;
|
|
|
|
class MULA_DA_LDINC<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x04, (outs MR:$w, AR:$d), (ins AR:$s, MR:$x, AR:$t),
|
|
instrAsm#"\t $w, $s, $x, $t", []>, Requires<[HasMAC16]> {
|
|
bits<1> x;
|
|
bits<2> w;
|
|
|
|
let Constraints = "$s = $d";
|
|
let mayLoad = 1;
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = w{1-0};
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_DA_LL_LDINC: MULA_DA_LDINC<0x08, "mula.da.ll.ldinc">;
|
|
def MULA_DA_HL_LDINC: MULA_DA_LDINC<0x09, "mula.da.hl.ldinc">;
|
|
def MULA_DA_LH_LDINC: MULA_DA_LDINC<0x0A, "mula.da.lh.ldinc">;
|
|
def MULA_DA_HH_LDINC: MULA_DA_LDINC<0x0B, "mula.da.hh.ldinc">;
|
|
|
|
class MULA_DD_LDDEC<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x01, (outs MR:$w, AR:$d), (ins AR:$s, MR01:$x, MR23:$y),
|
|
instrAsm#"\t $w, $s, $x, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
bits<2> y;
|
|
bits<2> w;
|
|
|
|
let Constraints = "$s = $d";
|
|
let mayLoad = 1;
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = w{1-0};
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_DD_LL_LDDEC : MULA_DD_LDDEC<0x08, "mula.dd.ll.lddec">;
|
|
def MULA_DD_HL_LDDEC : MULA_DD_LDDEC<0x09, "mula.dd.hl.lddec">;
|
|
def MULA_DD_LH_LDDEC : MULA_DD_LDDEC<0x0A, "mula.dd.lh.lddec">;
|
|
def MULA_DD_HH_LDDEC : MULA_DD_LDDEC<0x0B, "mula.dd.hh.lddec">;
|
|
|
|
class MULA_DD_LDINC<bits<4> oper1, string instrAsm>
|
|
: RRR_Inst<0x04, oper1, 0x00, (outs MR:$w, AR:$d), (ins AR:$s, MR01:$x, MR23:$y),
|
|
instrAsm#"\t $w, $s, $x, $y", []>, Requires<[HasMAC16]> {
|
|
bits<2> x;
|
|
bits<2> y;
|
|
bits<2> w;
|
|
|
|
let Constraints = "$s = $d";
|
|
let mayLoad = 1;
|
|
let r{3} = 0;
|
|
let r{2} = x{0};
|
|
let r{1-0} = w{1-0};
|
|
let t{3} = 0;
|
|
let t{2} = y{0};
|
|
let t{1-0} = 0;
|
|
let Uses = [ACCLO, ACCHI];
|
|
let Defs = [M1, M2, ACCLO, ACCHI];
|
|
}
|
|
|
|
def MULA_DD_LL_LDINC : MULA_DD_LDINC<0x08, "mula.dd.ll.ldinc">;
|
|
def MULA_DD_HL_LDINC : MULA_DD_LDINC<0x09, "mula.dd.hl.ldinc">;
|
|
def MULA_DD_LH_LDINC : MULA_DD_LDINC<0x0A, "mula.dd.lh.ldinc">;
|
|
def MULA_DD_HH_LDINC : MULA_DD_LDINC<0x0B, "mula.dd.hh.ldinc">;
|
|
|
|
def LDDEC : RRR_Inst<0x04, 0x00, 0x09, (outs MR:$w, AR:$d), (ins AR:$s),
|
|
"lddec\t $w, $s", []>, Requires<[HasMAC16]> {
|
|
bits<2> w;
|
|
|
|
let Constraints = "$s = $d";
|
|
let mayLoad = 1;
|
|
let r{3-2} = 0;
|
|
let r{1-0} = w{1-0};
|
|
let t = 0x00;
|
|
}
|
|
|
|
def LDINC : RRR_Inst<0x04, 0x00, 0x08, (outs MR:$w, AR:$d), (ins AR:$s),
|
|
"ldinc\t $w, $s", []>, Requires<[HasMAC16]> {
|
|
bits<2> w;
|
|
|
|
let Constraints = "$s = $d";
|
|
let mayLoad = 1;
|
|
let r{3-2} = 0;
|
|
let r{1-0} = w{1-0};
|
|
let t = 0;
|
|
}
|