//===- 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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; }