blob: d80df46320643258255eac7ccb02183f9275983a [file] [log] [blame]
//===- 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;
}