mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
[Hexagon] Adding vector multiplies. Cleaning up tests.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227609 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9dbaae6fae
commit
a6c6e1ec6c
@ -2506,6 +2506,50 @@ def M2_vcmpy_s1_sat_r: T_M2_vmpy <"vcmpyr", 0b101, 0b110, 1, 0, 1>;
|
|||||||
def M2_vcmpy_s0_sat_r: T_M2_vmpy <"vcmpyr", 0b001, 0b110, 0, 0, 1>;
|
def M2_vcmpy_s0_sat_r: T_M2_vmpy <"vcmpyr", 0b001, 0b110, 0, 0, 1>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Vector dual multiply: Rdd=vdmpy(Rss,Rtt)[:<<1]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vdmpys_s1: T_M2_vmpy <"vdmpy", 0b100, 0b100, 1, 0, 1>;
|
||||||
|
def M2_vdmpys_s0: T_M2_vmpy <"vdmpy", 0b000, 0b100, 0, 0, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vector multiply even halfwords: Rdd=vmpyeh(Rss,Rtt)[:<<1]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vmpy2es_s1: T_M2_vmpy <"vmpyeh", 0b100, 0b110, 1, 0, 1>;
|
||||||
|
def M2_vmpy2es_s0: T_M2_vmpy <"vmpyeh", 0b000, 0b110, 0, 0, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rdd=vmpywoh(Rss,Rtt)[:<<1][:rnd]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_mmpyh_s0: T_M2_vmpy <"vmpywoh", 0b000, 0b111, 0, 0, 1>;
|
||||||
|
def M2_mmpyh_s1: T_M2_vmpy <"vmpywoh", 0b100, 0b111, 1, 0, 1>;
|
||||||
|
def M2_mmpyh_rs0: T_M2_vmpy <"vmpywoh", 0b001, 0b111, 0, 1, 1>;
|
||||||
|
def M2_mmpyh_rs1: T_M2_vmpy <"vmpywoh", 0b101, 0b111, 1, 1, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rdd=vmpyweh(Rss,Rtt)[:<<1][:rnd]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_mmpyl_s0: T_M2_vmpy <"vmpyweh", 0b000, 0b101, 0, 0, 1>;
|
||||||
|
def M2_mmpyl_s1: T_M2_vmpy <"vmpyweh", 0b100, 0b101, 1, 0, 1>;
|
||||||
|
def M2_mmpyl_rs0: T_M2_vmpy <"vmpyweh", 0b001, 0b101, 0, 1, 1>;
|
||||||
|
def M2_mmpyl_rs1: T_M2_vmpy <"vmpyweh", 0b101, 0b101, 1, 1, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rdd=vmpywouh(Rss,Rtt)[:<<1][:rnd]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_mmpyuh_s0: T_M2_vmpy <"vmpywouh", 0b010, 0b111, 0, 0, 1>;
|
||||||
|
def M2_mmpyuh_s1: T_M2_vmpy <"vmpywouh", 0b110, 0b111, 1, 0, 1>;
|
||||||
|
def M2_mmpyuh_rs0: T_M2_vmpy <"vmpywouh", 0b011, 0b111, 0, 1, 1>;
|
||||||
|
def M2_mmpyuh_rs1: T_M2_vmpy <"vmpywouh", 0b111, 0b111, 1, 1, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rdd=vmpyweuh(Rss,Rtt)[:<<1][:rnd]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_mmpyul_s0: T_M2_vmpy <"vmpyweuh", 0b010, 0b101, 0, 0, 1>;
|
||||||
|
def M2_mmpyul_s1: T_M2_vmpy <"vmpyweuh", 0b110, 0b101, 1, 0, 1>;
|
||||||
|
def M2_mmpyul_rs0: T_M2_vmpy <"vmpyweuh", 0b011, 0b101, 0, 1, 1>;
|
||||||
|
def M2_mmpyul_rs1: T_M2_vmpy <"vmpyweuh", 0b111, 0b101, 1, 1, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
let hasNewValue = 1, opNewValue = 0 in
|
let hasNewValue = 1, opNewValue = 0 in
|
||||||
class T_MType_mpy <string mnemonic, bits<4> RegTyBits, RegisterClass RC,
|
class T_MType_mpy <string mnemonic, bits<4> RegTyBits, RegisterClass RC,
|
||||||
bits<3> MajOp, bits<3> MinOp, bit isSat = 0, bit isRnd = 0,
|
bits<3> MajOp, bits<3> MinOp, bit isSat = 0, bit isRnd = 0,
|
||||||
@ -2547,8 +2591,11 @@ class T_MType_rr2 <string mnemonic, bits<3> MajOp, bits<3> MinOp,
|
|||||||
bit isSat = 0, bit isRnd = 0, string op2str = "" >
|
bit isSat = 0, bit isRnd = 0, string op2str = "" >
|
||||||
: T_MType_mpy<mnemonic, 0b1101, IntRegs, MajOp, MinOp, isSat, isRnd, op2str>;
|
: T_MType_mpy<mnemonic, 0b1101, IntRegs, MajOp, MinOp, isSat, isRnd, op2str>;
|
||||||
|
|
||||||
let isCodeGenOnly = 0 in
|
let isCodeGenOnly = 0 in {
|
||||||
def M2_vradduh : T_MType_dd <"vradduh", 0b000, 0b001, 0, 0>;
|
def M2_vradduh : T_MType_dd <"vradduh", 0b000, 0b001, 0, 0>;
|
||||||
|
def M2_vdmpyrs_s0 : T_MType_dd <"vdmpy", 0b000, 0b000, 1, 1>;
|
||||||
|
def M2_vdmpyrs_s1 : T_MType_dd <"vdmpy", 0b100, 0b000, 1, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
let CextOpcode = "mpyi", InputType = "reg", isCodeGenOnly = 0 in
|
let CextOpcode = "mpyi", InputType = "reg", isCodeGenOnly = 0 in
|
||||||
def M2_mpyi : T_MType_rr1 <"mpyi", 0b000, 0b000>, ImmRegRel;
|
def M2_mpyi : T_MType_rr1 <"mpyi", 0b000, 0b000>, ImmRegRel;
|
||||||
@ -2561,6 +2608,11 @@ def M2_mpyu_up : T_MType_rr1 <"mpyu", 0b010, 0b001>;
|
|||||||
let isCodeGenOnly = 0 in
|
let isCodeGenOnly = 0 in
|
||||||
def M2_dpmpyss_rnd_s0 : T_MType_rr1 <"mpy", 0b001, 0b001, 0, 1>;
|
def M2_dpmpyss_rnd_s0 : T_MType_rr1 <"mpy", 0b001, 0b001, 0, 1>;
|
||||||
|
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vmpy2s_s0pack : T_MType_rr1 <"vmpyh", 0b001, 0b111, 1, 1>;
|
||||||
|
def M2_vmpy2s_s1pack : T_MType_rr1 <"vmpyh", 0b101, 0b111, 1, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
let isCodeGenOnly = 0 in {
|
let isCodeGenOnly = 0 in {
|
||||||
def M2_hmmpyh_rs1 : T_MType_rr2 <"mpy", 0b101, 0b100, 1, 1, ".h">;
|
def M2_hmmpyh_rs1 : T_MType_rr2 <"mpy", 0b101, 0b100, 1, 1, ".h">;
|
||||||
def M2_hmmpyl_rs1 : T_MType_rr2 <"mpy", 0b111, 0b100, 1, 1, ".l">;
|
def M2_hmmpyl_rs1 : T_MType_rr2 <"mpy", 0b111, 0b100, 1, 1, ".l">;
|
||||||
@ -2823,6 +2875,12 @@ def M2_vrcmpyr_s0c: T_XTYPE_Vect <"vrcmpyr", 0b011, 0b001, 1>;
|
|||||||
def M2_vrcmacr_s0: T_XTYPE_Vect_acc <"vrcmpyr", 0b000, 0b001, 0>;
|
def M2_vrcmacr_s0: T_XTYPE_Vect_acc <"vrcmpyr", 0b000, 0b001, 0>;
|
||||||
def M2_vrcmacr_s0c: T_XTYPE_Vect_acc <"vrcmpyr", 0b011, 0b001, 1>;
|
def M2_vrcmacr_s0c: T_XTYPE_Vect_acc <"vrcmpyr", 0b011, 0b001, 1>;
|
||||||
}
|
}
|
||||||
|
// Vector reduce halfwords:
|
||||||
|
// Rdd[+]=vrmpyh(Rss,Rtt)
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vrmpy_s0: T_XTYPE_Vect <"vrmpyh", 0b000, 0b010, 0>;
|
||||||
|
def M2_vrmac_s0: T_XTYPE_Vect_acc <"vrmpyh", 0b000, 0b010, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Template Class -- Vector Multipy with accumulation.
|
// Template Class -- Vector Multipy with accumulation.
|
||||||
@ -2850,6 +2908,58 @@ class T_M2_vmpy_acc_sat < string opc, bits<3> MajOp, bits<3> MinOp,
|
|||||||
let Inst{12-8} = Rtt;
|
let Inst{12-8} = Rtt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class T_M2_vmpy_acc < string opc, bits<3> MajOp, bits<3> MinOp,
|
||||||
|
bit hasShift, bit isRnd >
|
||||||
|
: MInst <(outs DoubleRegs:$Rxx),
|
||||||
|
(ins DoubleRegs:$dst2, DoubleRegs:$Rss, DoubleRegs:$Rtt),
|
||||||
|
"$Rxx += "#opc#"($Rss, $Rtt)"#!if(hasShift,":<<1","")
|
||||||
|
#!if(isRnd,":rnd",""),
|
||||||
|
[], "$dst2 = $Rxx",M_tc_3x_SLOT23 > {
|
||||||
|
bits<5> Rxx;
|
||||||
|
bits<5> Rss;
|
||||||
|
bits<5> Rtt;
|
||||||
|
|
||||||
|
let IClass = 0b1110;
|
||||||
|
|
||||||
|
let Inst{27-24} = 0b1010;
|
||||||
|
let Inst{23-21} = MajOp;
|
||||||
|
let Inst{7-5} = MinOp;
|
||||||
|
let Inst{4-0} = Rxx;
|
||||||
|
let Inst{20-16} = Rss;
|
||||||
|
let Inst{12-8} = Rtt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vector multiply word by signed half with accumulation
|
||||||
|
// Rxx+=vmpyw[eo]h(Rss,Rtt)[:<<1][:rnd]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_mmacls_s1: T_M2_vmpy_acc_sat <"vmpyweh", 0b100, 0b101, 1, 0>;
|
||||||
|
def M2_mmacls_s0: T_M2_vmpy_acc_sat <"vmpyweh", 0b000, 0b101, 0, 0>;
|
||||||
|
def M2_mmacls_rs1: T_M2_vmpy_acc_sat <"vmpyweh", 0b101, 0b101, 1, 1>;
|
||||||
|
def M2_mmacls_rs0: T_M2_vmpy_acc_sat <"vmpyweh", 0b001, 0b101, 0, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_mmachs_s1: T_M2_vmpy_acc_sat <"vmpywoh", 0b100, 0b111, 1, 0>;
|
||||||
|
def M2_mmachs_s0: T_M2_vmpy_acc_sat <"vmpywoh", 0b000, 0b111, 0, 0>;
|
||||||
|
def M2_mmachs_rs1: T_M2_vmpy_acc_sat <"vmpywoh", 0b101, 0b111, 1, 1>;
|
||||||
|
def M2_mmachs_rs0: T_M2_vmpy_acc_sat <"vmpywoh", 0b001, 0b111, 0, 1>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vector multiply even halfwords with accumulation
|
||||||
|
// Rxx+=vmpyeh(Rss,Rtt)[:<<1][:sat]
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vmac2es: T_M2_vmpy_acc <"vmpyeh", 0b001, 0b010, 0, 0>;
|
||||||
|
def M2_vmac2es_s1: T_M2_vmpy_acc_sat <"vmpyeh", 0b100, 0b110, 1, 0>;
|
||||||
|
def M2_vmac2es_s0: T_M2_vmpy_acc_sat <"vmpyeh", 0b000, 0b110, 0, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vector dual multiply with accumulation
|
||||||
|
// Rxx+=vdmpy(Rss,Rtt)[:sat]
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vdmacs_s1: T_M2_vmpy_acc_sat <"vdmpy", 0b100, 0b100, 1, 0>;
|
||||||
|
def M2_vdmacs_s0: T_M2_vmpy_acc_sat <"vdmpy", 0b000, 0b100, 0, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
// Vector complex multiply real or imaginary with accumulation
|
// Vector complex multiply real or imaginary with accumulation
|
||||||
// Rxx+=vcmpy[ir](Rss,Rtt):sat
|
// Rxx+=vcmpy[ir](Rss,Rtt):sat
|
||||||
let isCodeGenOnly = 0 in {
|
let isCodeGenOnly = 0 in {
|
||||||
@ -3027,6 +3137,21 @@ def M2_cnacsc_s0 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b010, 0b111, 1, 0, 1>;
|
|||||||
def M2_cmacsc_s1 : T_XTYPE_mpy64_acc < "cmpy", "+", 0b110, 0b110, 1, 1, 1>;
|
def M2_cmacsc_s1 : T_XTYPE_mpy64_acc < "cmpy", "+", 0b110, 0b110, 1, 1, 1>;
|
||||||
def M2_cnacsc_s1 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b110, 0b111, 1, 1, 1>;
|
def M2_cnacsc_s1 : T_XTYPE_mpy64_acc < "cmpy", "-", 0b110, 0b111, 1, 1, 1>;
|
||||||
}
|
}
|
||||||
|
// Vector multiply halfwords
|
||||||
|
// Rdd=vmpyh(Rs,Rt)[:<<]:sat
|
||||||
|
//let Defs = [USR_OVF] in {
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vmpy2s_s1 : T_XTYPE_mpy64 < "vmpyh", 0b100, 0b101, 1, 1, 0>;
|
||||||
|
def M2_vmpy2s_s0 : T_XTYPE_mpy64 < "vmpyh", 0b000, 0b101, 1, 0, 0>;
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
|
||||||
|
// Rxx+=vmpyh(Rs,Rt)[:<<1][:sat]
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vmac2 : T_XTYPE_mpy64_acc < "vmpyh", "+", 0b001, 0b001, 0, 0, 0>;
|
||||||
|
def M2_vmac2s_s1 : T_XTYPE_mpy64_acc < "vmpyh", "+", 0b100, 0b101, 1, 1, 0>;
|
||||||
|
def M2_vmac2s_s0 : T_XTYPE_mpy64_acc < "vmpyh", "+", 0b000, 0b101, 1, 0, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
def: Pat<(i64 (mul (i64 (anyext (i32 IntRegs:$src1))),
|
def: Pat<(i64 (mul (i64 (anyext (i32 IntRegs:$src1))),
|
||||||
(i64 (anyext (i32 IntRegs:$src2))))),
|
(i64 (anyext (i32 IntRegs:$src2))))),
|
||||||
|
@ -2239,28 +2239,49 @@ def : Pat <(add (mul (i32 IntRegs:$src2), (i32 IntRegs:$src3)),
|
|||||||
|
|
||||||
// Vector reduce multiply word by signed half (32x16)
|
// Vector reduce multiply word by signed half (32x16)
|
||||||
//Rdd=vrmpyweh(Rss,Rtt)[:<<1]
|
//Rdd=vrmpyweh(Rss,Rtt)[:<<1]
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M4_vrmpyeh_s0 : T_M2_vmpy<"vrmpyweh", 0b010, 0b100, 0, 0, 0>;
|
||||||
|
def M4_vrmpyeh_s1 : T_M2_vmpy<"vrmpyweh", 0b110, 0b100, 1, 0, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
|
//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
|
||||||
// Rxx+=vrmpyweh(Rss,Rtt)[:<<1]
|
let isCodeGenOnly = 0 in {
|
||||||
// Rxx+=vrmpywoh(Rss,Rtt)[:<<1]
|
def M4_vrmpyoh_s0 : T_M2_vmpy<"vrmpywoh", 0b001, 0b010, 0, 0, 0>;
|
||||||
|
def M4_vrmpyoh_s1 : T_M2_vmpy<"vrmpywoh", 0b101, 0b010, 1, 0, 0>;
|
||||||
|
}
|
||||||
|
//Rdd+=vrmpyweh(Rss,Rtt)[:<<1]
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M4_vrmpyeh_acc_s0: T_M2_vmpy_acc<"vrmpyweh", 0b001, 0b110, 0, 0>;
|
||||||
|
def M4_vrmpyeh_acc_s1: T_M2_vmpy_acc<"vrmpyweh", 0b101, 0b110, 1, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
// Multiply and use upper result
|
//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
|
||||||
// Rd=mpy(Rs,Rt.H):<<1:sat
|
let isCodeGenOnly = 0 in {
|
||||||
// Rd=mpy(Rs,Rt.L):<<1:sat
|
def M4_vrmpyoh_acc_s0: T_M2_vmpy_acc<"vrmpywoh", 0b011, 0b110, 0, 0>;
|
||||||
// Rd=mpy(Rs,Rt):<<1
|
def M4_vrmpyoh_acc_s1: T_M2_vmpy_acc<"vrmpywoh", 0b111, 0b110, 1, 0>;
|
||||||
// Rd=mpy(Rs,Rt):<<1:sat
|
}
|
||||||
// Rd=mpysu(Rs,Rt)
|
|
||||||
// Rx+=mpy(Rs,Rt):<<1:sat
|
|
||||||
// Rx-=mpy(Rs,Rt):<<1:sat
|
|
||||||
|
|
||||||
// Vector multiply bytes
|
// Vector multiply halfwords, signed by unsigned
|
||||||
// Rdd=vmpybsu(Rs,Rt)
|
// Rdd=vmpyhsu(Rs,Rt)[:<<]:sat
|
||||||
// Rdd=vmpybu(Rs,Rt)
|
let isCodeGenOnly = 0 in {
|
||||||
// Rxx+=vmpybsu(Rs,Rt)
|
def M2_vmpy2su_s0 : T_XTYPE_mpy64 < "vmpyhsu", 0b000, 0b111, 1, 0, 0>;
|
||||||
// Rxx+=vmpybu(Rs,Rt)
|
def M2_vmpy2su_s1 : T_XTYPE_mpy64 < "vmpyhsu", 0b100, 0b111, 1, 1, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rxx+=vmpyhsu(Rs,Rt)[:<<1]:sat
|
||||||
|
let isCodeGenOnly = 0 in {
|
||||||
|
def M2_vmac2su_s0 : T_XTYPE_mpy64_acc < "vmpyhsu", "+", 0b011, 0b101, 1, 0, 0>;
|
||||||
|
def M2_vmac2su_s1 : T_XTYPE_mpy64_acc < "vmpyhsu", "+", 0b111, 0b101, 1, 1, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
// Vector polynomial multiply halfwords
|
// Vector polynomial multiply halfwords
|
||||||
// Rdd=vpmpyh(Rs,Rt)
|
// Rdd=vpmpyh(Rs,Rt)
|
||||||
|
let isCodeGenOnly = 0 in
|
||||||
|
def M4_vpmpyh : T_XTYPE_mpy64 < "vpmpyh", 0b110, 0b111, 0, 0, 0>;
|
||||||
|
|
||||||
// Rxx^=vpmpyh(Rs,Rt)
|
// Rxx^=vpmpyh(Rs,Rt)
|
||||||
|
let isCodeGenOnly = 0 in
|
||||||
|
def M4_vpmpyh_acc : T_XTYPE_mpy64_acc < "vpmpyh", "^", 0b101, 0b111, 0, 0, 0>;
|
||||||
|
|
||||||
// Polynomial multiply words
|
// Polynomial multiply words
|
||||||
// Rdd=pmpyw(Rs,Rt)
|
// Rdd=pmpyw(Rs,Rt)
|
||||||
|
@ -15,9 +15,29 @@
|
|||||||
// XTYPE/MPY
|
// XTYPE/MPY
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
//Rdd[+]=vrmpybsu(Rss,Rtt)
|
||||||
|
let Predicates = [HasV5T], isCodeGenOnly = 0 in {
|
||||||
|
def M5_vrmpybsu: T_XTYPE_Vect<"vrmpybsu", 0b110, 0b001, 0>;
|
||||||
|
def M5_vrmacbsu: T_XTYPE_Vect_acc<"vrmpybsu", 0b110, 0b001, 0>;
|
||||||
|
|
||||||
|
//Rdd[+]=vrmpybu(Rss,Rtt)
|
||||||
|
def M5_vrmpybuu: T_XTYPE_Vect<"vrmpybu", 0b100, 0b001, 0>;
|
||||||
|
def M5_vrmacbuu: T_XTYPE_Vect_acc<"vrmpybu", 0b100, 0b001, 0>;
|
||||||
|
|
||||||
|
def M5_vdmpybsu: T_M2_vmpy<"vdmpybsu", 0b101, 0b001, 0, 0, 1>;
|
||||||
|
def M5_vdmacbsu: T_M2_vmpy_acc_sat <"vdmpybsu", 0b001, 0b001, 0, 0>;
|
||||||
|
}
|
||||||
|
|
||||||
// Vector multiply bytes
|
// Vector multiply bytes
|
||||||
// Rdd=vmpyb[s]u(Rs,Rt)
|
// Rdd=vmpyb[s]u(Rs,Rt)
|
||||||
let Predicates = [HasV5T], isCodeGenOnly = 0 in {
|
let Predicates = [HasV5T], isCodeGenOnly = 0 in {
|
||||||
|
def M5_vmpybsu: T_XTYPE_mpy64 <"vmpybsu", 0b010, 0b001, 0, 0, 0>;
|
||||||
|
def M5_vmpybuu: T_XTYPE_mpy64 <"vmpybu", 0b100, 0b001, 0, 0, 0>;
|
||||||
|
|
||||||
|
// Rxx+=vmpyb[s]u(Rs,Rt)
|
||||||
|
def M5_vmacbsu: T_XTYPE_mpy64_acc <"vmpybsu", "+", 0b110, 0b001, 0, 0, 0>;
|
||||||
|
def M5_vmacbuu: T_XTYPE_mpy64_acc <"vmpybu", "+", 0b100, 0b001, 0, 0, 0>;
|
||||||
|
|
||||||
// Rd=vaddhub(Rss,Rtt):sat
|
// Rd=vaddhub(Rss,Rtt):sat
|
||||||
let hasNewValue = 1, opNewValue = 0 in
|
let hasNewValue = 1, opNewValue = 0 in
|
||||||
def A5_vaddhubs: T_S3op_1 <"vaddhub", IntRegs, 0b01, 0b001, 0, 1>;
|
def A5_vaddhubs: T_S3op_1 <"vaddhub", IntRegs, 0b01, 0b001, 0, 1>;
|
||||||
@ -765,6 +785,28 @@ def S5_asrhub_rnd_sat_goodsyntax
|
|||||||
: SInst <(outs IntRegs:$Rd), (ins DoubleRegs:$Rss, u4Imm:$u4),
|
: SInst <(outs IntRegs:$Rd), (ins DoubleRegs:$Rss, u4Imm:$u4),
|
||||||
"$Rd = vasrhub($Rss, #$u4):rnd:sat">, Requires<[HasV5T]>;
|
"$Rd = vasrhub($Rss, #$u4):rnd:sat">, Requires<[HasV5T]>;
|
||||||
|
|
||||||
|
// Floating point reciprocal square root approximation
|
||||||
|
let Uses = [USR], isPredicateLate = 1, isFP = 1,
|
||||||
|
hasSideEffects = 0, hasNewValue = 1, opNewValue = 0,
|
||||||
|
validSubTargets = HasV5SubT, isCodeGenOnly = 0 in
|
||||||
|
def F2_sfinvsqrta: SInst <
|
||||||
|
(outs IntRegs:$Rd, PredRegs:$Pe),
|
||||||
|
(ins IntRegs:$Rs),
|
||||||
|
"$Rd, $Pe = sfinvsqrta($Rs)" > ,
|
||||||
|
Requires<[HasV5T]> {
|
||||||
|
bits<5> Rd;
|
||||||
|
bits<2> Pe;
|
||||||
|
bits<5> Rs;
|
||||||
|
|
||||||
|
let IClass = 0b1000;
|
||||||
|
|
||||||
|
let Inst{27-21} = 0b1011111;
|
||||||
|
let Inst{20-16} = Rs;
|
||||||
|
let Inst{7} = 0b0;
|
||||||
|
let Inst{6-5} = Pe;
|
||||||
|
let Inst{4-0} = Rd;
|
||||||
|
}
|
||||||
|
|
||||||
// Complex multiply 32x16
|
// Complex multiply 32x16
|
||||||
let Defs = [USR_OVF], Itinerary = S_3op_tc_3x_SLOT23, isCodeGenOnly = 0 in {
|
let Defs = [USR_OVF], Itinerary = S_3op_tc_3x_SLOT23, isCodeGenOnly = 0 in {
|
||||||
def M4_cmpyi_whc : T_S3op_8<"cmpyiwh", 0b101, 1, 1, 1, 1>;
|
def M4_cmpyi_whc : T_S3op_8<"cmpyiwh", 0b101, 1, 1, 1, 1>;
|
||||||
|
@ -1,11 +1,17 @@
|
|||||||
# RUN: llvm-mc --triple hexagon -disassemble < %s | FileCheck %s
|
# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s
|
||||||
|
# Hexagon Programmer's Reference Manual 11.10.4 XTYPE/FP
|
||||||
|
|
||||||
|
# Floating point addition
|
||||||
0x11 0xdf 0x15 0xeb
|
0x11 0xdf 0x15 0xeb
|
||||||
# CHECK: r17 = sfadd(r21, r31)
|
# CHECK: r17 = sfadd(r21, r31)
|
||||||
|
|
||||||
|
# Classify floating-point value
|
||||||
0x03 0xd5 0xf1 0x85
|
0x03 0xd5 0xf1 0x85
|
||||||
# CHECK: p3 = sfclass(r17, #21)
|
# CHECK: p3 = sfclass(r17, #21)
|
||||||
0xb3 0xc2 0x90 0xdc
|
0xb3 0xc2 0x90 0xdc
|
||||||
# CHECK: p3 = dfclass(r17:16, #21)
|
# CHECK: p3 = dfclass(r17:16, #21)
|
||||||
|
|
||||||
|
# Compare floating-point value
|
||||||
0x03 0xd5 0xf1 0xc7
|
0x03 0xd5 0xf1 0xc7
|
||||||
# CHECK: p3 = sfcmp.ge(r17, r21)
|
# CHECK: p3 = sfcmp.ge(r17, r21)
|
||||||
0x23 0xd5 0xf1 0xc7
|
0x23 0xd5 0xf1 0xc7
|
||||||
@ -22,10 +28,14 @@
|
|||||||
# CHECK: p3 = dfcmp.ge(r17:16, r21:20)
|
# CHECK: p3 = dfcmp.ge(r17:16, r21:20)
|
||||||
0x63 0xd4 0xf0 0xd2
|
0x63 0xd4 0xf0 0xd2
|
||||||
# CHECK: p3 = dfcmp.uo(r17:16, r21:20)
|
# CHECK: p3 = dfcmp.uo(r17:16, r21:20)
|
||||||
|
|
||||||
|
# Convert floating-point value to other format
|
||||||
0x10 0xc0 0x95 0x84
|
0x10 0xc0 0x95 0x84
|
||||||
# CHECK: r17:16 = convert_sf2df(r21)
|
# CHECK: r17:16 = convert_sf2df(r21)
|
||||||
0x31 0xc0 0x14 0x88
|
0x31 0xc0 0x14 0x88
|
||||||
# CHECK: r17 = convert_df2sf(r21:20)
|
# CHECK: r17 = convert_df2sf(r21:20)
|
||||||
|
|
||||||
|
# Convert integer to floating-point value
|
||||||
0x50 0xc0 0xf4 0x80
|
0x50 0xc0 0xf4 0x80
|
||||||
# CHECK: r17:16 = convert_ud2df(r21:20)
|
# CHECK: r17:16 = convert_ud2df(r21:20)
|
||||||
0x70 0xc0 0xf4 0x80
|
0x70 0xc0 0xf4 0x80
|
||||||
@ -42,6 +52,8 @@
|
|||||||
# CHECK: r17 = convert_uw2sf(r21)
|
# CHECK: r17 = convert_uw2sf(r21)
|
||||||
0x11 0xc0 0x55 0x8b
|
0x11 0xc0 0x55 0x8b
|
||||||
# CHECK: r17 = convert_w2sf(r21)
|
# CHECK: r17 = convert_w2sf(r21)
|
||||||
|
|
||||||
|
# Convert floating-point value to integer
|
||||||
0x10 0xc0 0xf4 0x80
|
0x10 0xc0 0xf4 0x80
|
||||||
# CHECK: r17:16 = convert_df2d(r21:20)
|
# CHECK: r17:16 = convert_df2d(r21:20)
|
||||||
0x30 0xc0 0xf4 0x80
|
0x30 0xc0 0xf4 0x80
|
||||||
@ -74,22 +86,36 @@
|
|||||||
# CHECK: r17 = convert_sf2w(r21)
|
# CHECK: r17 = convert_sf2w(r21)
|
||||||
0x31 0xc0 0x95 0x8b
|
0x31 0xc0 0x95 0x8b
|
||||||
# CHECK: r17 = convert_sf2w(r21):chop
|
# CHECK: r17 = convert_sf2w(r21):chop
|
||||||
|
|
||||||
|
# Floating point extreme value assistance
|
||||||
0x11 0xc0 0xb5 0x8b
|
0x11 0xc0 0xb5 0x8b
|
||||||
# CHECK: r17 = sffixupr(r21)
|
# CHECK: r17 = sffixupr(r21)
|
||||||
0x11 0xdf 0xd5 0xeb
|
0x11 0xdf 0xd5 0xeb
|
||||||
# CHECK: r17 = sffixupn(r21, r31)
|
# CHECK: r17 = sffixupn(r21, r31)
|
||||||
0x31 0xdf 0xd5 0xeb
|
0x31 0xdf 0xd5 0xeb
|
||||||
# CHECK: r17 = sffixupd(r21, r31)
|
# CHECK: r17 = sffixupd(r21, r31)
|
||||||
|
|
||||||
|
# Floating point fused multiply-add
|
||||||
0x91 0xdf 0x15 0xef
|
0x91 0xdf 0x15 0xef
|
||||||
# CHECK: r17 += sfmpy(r21, r31)
|
# CHECK: r17 += sfmpy(r21, r31)
|
||||||
0xb1 0xdf 0x15 0xef
|
0xb1 0xdf 0x15 0xef
|
||||||
# CHECK: r17 -= sfmpy(r21, r31)
|
# CHECK: r17 -= sfmpy(r21, r31)
|
||||||
|
|
||||||
|
# Floating point fused multiply-add with scaling
|
||||||
0xf1 0xdf 0x75 0xef
|
0xf1 0xdf 0x75 0xef
|
||||||
# CHECK: r17 += sfmpy(r21, r31, p3):scale
|
# CHECK: r17 += sfmpy(r21, r31, p3):scale
|
||||||
|
|
||||||
|
# Floating point reciprocal square root approximation
|
||||||
|
0x71 0xc0 0xf5 0x8b
|
||||||
|
# CHECK: r17, p3 = sfinvsqrta(r21)
|
||||||
|
|
||||||
|
# Floating point fused multiply-add for library routines
|
||||||
0xd1 0xdf 0x15 0xef
|
0xd1 0xdf 0x15 0xef
|
||||||
# CHECK: r17 += sfmpy(r21, r31):lib
|
# CHECK: r17 += sfmpy(r21, r31):lib
|
||||||
0xf1 0xdf 0x15 0xef
|
0xf1 0xdf 0x15 0xef
|
||||||
# CHECK: r17 -= sfmpy(r21, r31):lib
|
# CHECK: r17 -= sfmpy(r21, r31):lib
|
||||||
|
|
||||||
|
# Create floating-point constant
|
||||||
0xb1 0xc2 0x00 0xd6
|
0xb1 0xc2 0x00 0xd6
|
||||||
# CHECK: r17 = sfmake(#21):pos
|
# CHECK: r17 = sfmake(#21):pos
|
||||||
0xb1 0xc2 0x40 0xd6
|
0xb1 0xc2 0x40 0xd6
|
||||||
@ -98,13 +124,23 @@
|
|||||||
# CHECK: r17:16 = dfmake(#21):pos
|
# CHECK: r17:16 = dfmake(#21):pos
|
||||||
0xb0 0xc2 0x40 0xd9
|
0xb0 0xc2 0x40 0xd9
|
||||||
# CHECK: r17:16 = dfmake(#21):neg
|
# CHECK: r17:16 = dfmake(#21):neg
|
||||||
|
|
||||||
|
# Floating point maximum
|
||||||
0x11 0xdf 0x95 0xeb
|
0x11 0xdf 0x95 0xeb
|
||||||
# CHECK: r17 = sfmax(r21, r31)
|
# CHECK: r17 = sfmax(r21, r31)
|
||||||
|
|
||||||
|
# Floating point minimum
|
||||||
0x31 0xdf 0x95 0xeb
|
0x31 0xdf 0x95 0xeb
|
||||||
# CHECK: r17 = sfmin(r21, r31)
|
# CHECK: r17 = sfmin(r21, r31)
|
||||||
|
|
||||||
|
# Floating point multiply
|
||||||
0x11 0xdf 0x55 0xeb
|
0x11 0xdf 0x55 0xeb
|
||||||
# CHECK: r17 = sfmpy(r21, r31)
|
# CHECK: r17 = sfmpy(r21, r31)
|
||||||
|
|
||||||
|
# Floating point reciprocal approximation
|
||||||
0xf1 0xdf 0xf5 0xeb
|
0xf1 0xdf 0xf5 0xeb
|
||||||
# CHECK: r17, p3 = sfrecipa(r21, r31)
|
# CHECK: r17, p3 = sfrecipa(r21, r31)
|
||||||
|
|
||||||
|
# Floating point subtraction
|
||||||
0x31 0xdf 0x15 0xeb
|
0x31 0xdf 0x15 0xeb
|
||||||
# CHECK: r17 = sfsub(r21, r31)
|
# CHECK: r17 = sfsub(r21, r31)
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
# RUN: llvm-mc --triple hexagon -disassemble < %s | FileCheck %s
|
# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s
|
||||||
|
# Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY
|
||||||
|
|
||||||
|
# Multiply and use lower result
|
||||||
0xb1 0xdf 0x35 0xd7
|
0xb1 0xdf 0x35 0xd7
|
||||||
# CHECK: r17 = add(#21, mpyi(r21, r31))
|
# CHECK: r17 = add(#21, mpyi(r21, r31))
|
||||||
0xbf 0xd1 0x35 0xd8
|
0xbf 0xd1 0x35 0xd8
|
||||||
@ -22,6 +24,44 @@
|
|||||||
# CHECK: r17 = mpyi(r21, r31)
|
# CHECK: r17 = mpyi(r21, r31)
|
||||||
0x11 0xdf 0x15 0xef
|
0x11 0xdf 0x15 0xef
|
||||||
# CHECK: r17 += mpyi(r21, r31)
|
# CHECK: r17 += mpyi(r21, r31)
|
||||||
|
|
||||||
|
# Vector multiply word by signed half (32x16)
|
||||||
|
0xb0 0xde 0x14 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweh(r21:20, r31:30):sat
|
||||||
|
0xb0 0xde 0x94 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweh(r21:20, r31:30):<<1:sat
|
||||||
|
0xf0 0xde 0x14 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywoh(r21:20, r31:30):sat
|
||||||
|
0xf0 0xde 0x94 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywoh(r21:20, r31:30):<<1:sat
|
||||||
|
0xb0 0xde 0x34 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweh(r21:20, r31:30):rnd:sat
|
||||||
|
0xb0 0xde 0xb4 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweh(r21:20, r31:30):<<1:rnd:sat
|
||||||
|
0xf0 0xde 0x34 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywoh(r21:20, r31:30):rnd:sat
|
||||||
|
0xf0 0xde 0xb4 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywoh(r21:20, r31:30):<<1:rnd:sat
|
||||||
|
|
||||||
|
# Vector multiply word by unsigned half (32x16)
|
||||||
|
0xb0 0xde 0x54 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweuh(r21:20, r31:30):sat
|
||||||
|
0xb0 0xde 0xd4 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweuh(r21:20, r31:30):<<1:sat
|
||||||
|
0xf0 0xde 0x54 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywouh(r21:20, r31:30):sat
|
||||||
|
0xf0 0xde 0xd4 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywouh(r21:20, r31:30):<<1:sat
|
||||||
|
0xb0 0xde 0x74 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweuh(r21:20, r31:30):rnd:sat
|
||||||
|
0xb0 0xde 0xf4 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyweuh(r21:20, r31:30):<<1:rnd:sat
|
||||||
|
0xf0 0xde 0x74 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywouh(r21:20, r31:30):rnd:sat
|
||||||
|
0xf0 0xde 0xf4 0xe8
|
||||||
|
# CHECK: r17:16 = vmpywouh(r21:20, r31:30):<<1:rnd:sat
|
||||||
|
|
||||||
|
# Multiply signed halfwords
|
||||||
0x10 0xdf 0x95 0xe4
|
0x10 0xdf 0x95 0xe4
|
||||||
# CHECK: r17:16 = mpy(r21.l, r31.l):<<1
|
# CHECK: r17:16 = mpy(r21.l, r31.l):<<1
|
||||||
0x30 0xdf 0x95 0xe4
|
0x30 0xdf 0x95 0xe4
|
||||||
@ -118,6 +158,8 @@
|
|||||||
# CHECK: r17 -= mpy(r21.h, r31.l):<<1:sat
|
# CHECK: r17 -= mpy(r21.h, r31.l):<<1:sat
|
||||||
0xf1 0xdf 0xb5 0xee
|
0xf1 0xdf 0xb5 0xee
|
||||||
# CHECK: r17 -= mpy(r21.h, r31.h):<<1:sat
|
# CHECK: r17 -= mpy(r21.h, r31.h):<<1:sat
|
||||||
|
|
||||||
|
# Multiply unsigned halfwords
|
||||||
0x10 0xdf 0xd5 0xe4
|
0x10 0xdf 0xd5 0xe4
|
||||||
# CHECK: r17:16 = mpyu(r21.l, r31.l):<<1
|
# CHECK: r17:16 = mpyu(r21.l, r31.l):<<1
|
||||||
0x30 0xdf 0xd5 0xe4
|
0x30 0xdf 0xd5 0xe4
|
||||||
@ -166,10 +208,32 @@
|
|||||||
# CHECK: r17 -= mpyu(r21.h, r31.l):<<1
|
# CHECK: r17 -= mpyu(r21.h, r31.l):<<1
|
||||||
0x71 0xdf 0xf5 0xee
|
0x71 0xdf 0xf5 0xee
|
||||||
# CHECK: r17 -= mpyu(r21.h, r31.h):<<1
|
# CHECK: r17 -= mpyu(r21.h, r31.h):<<1
|
||||||
|
|
||||||
|
# Polynomial multiply words
|
||||||
0xf0 0xdf 0x55 0xe5
|
0xf0 0xdf 0x55 0xe5
|
||||||
# CHECK: r17:16 = pmpyw(r21, r31)
|
# CHECK: r17:16 = pmpyw(r21, r31)
|
||||||
0xf0 0xdf 0x35 0xe7
|
0xf0 0xdf 0x35 0xe7
|
||||||
# CHECK: r17:16 ^= pmpyw(r21, r31)
|
# CHECK: r17:16 ^= pmpyw(r21, r31)
|
||||||
|
|
||||||
|
# Vector reduce multiply word by signed half (32x16)
|
||||||
|
0x50 0xde 0x34 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpywoh(r21:20, r31:30)
|
||||||
|
0x50 0xde 0xb4 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpywoh(r21:20, r31:30):<<1
|
||||||
|
0x90 0xde 0x54 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpyweh(r21:20, r31:30)
|
||||||
|
0x90 0xde 0xd4 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpyweh(r21:20, r31:30):<<1
|
||||||
|
0xd0 0xde 0x74 0xea
|
||||||
|
# CHECK: r17:16 += vrmpywoh(r21:20, r31:30)
|
||||||
|
0xd0 0xde 0xf4 0xea
|
||||||
|
# CHECK: r17:16 += vrmpywoh(r21:20, r31:30):<<1
|
||||||
|
0xd0 0xde 0x34 0xea
|
||||||
|
# CHECK: r17:16 += vrmpyweh(r21:20, r31:30)
|
||||||
|
0xd0 0xde 0xb4 0xea
|
||||||
|
# CHECK: r17:16 += vrmpyweh(r21:20, r31:30):<<1
|
||||||
|
|
||||||
|
# Multiply and use upper result
|
||||||
0x31 0xdf 0x15 0xed
|
0x31 0xdf 0x15 0xed
|
||||||
# CHECK: r17 = mpy(r21, r31)
|
# CHECK: r17 = mpy(r21, r31)
|
||||||
0x31 0xdf 0x35 0xed
|
0x31 0xdf 0x35 0xed
|
||||||
@ -194,6 +258,8 @@
|
|||||||
# CHECK: r17 += mpy(r21, r31):<<1:sat
|
# CHECK: r17 += mpy(r21, r31):<<1:sat
|
||||||
0x31 0xdf 0x75 0xef
|
0x31 0xdf 0x75 0xef
|
||||||
# CHECK: r17 -= mpy(r21, r31):<<1:sat
|
# CHECK: r17 -= mpy(r21, r31):<<1:sat
|
||||||
|
|
||||||
|
# Multiply and use full result
|
||||||
0x10 0xdf 0x15 0xe5
|
0x10 0xdf 0x15 0xe5
|
||||||
# CHECK: r17:16 = mpy(r21, r31)
|
# CHECK: r17:16 = mpy(r21, r31)
|
||||||
0x10 0xdf 0x55 0xe5
|
0x10 0xdf 0x55 0xe5
|
||||||
@ -206,3 +272,97 @@
|
|||||||
# CHECK: r17:16 += mpyu(r21, r31)
|
# CHECK: r17:16 += mpyu(r21, r31)
|
||||||
0x10 0xdf 0x75 0xe7
|
0x10 0xdf 0x75 0xe7
|
||||||
# CHECK: r17:16 -= mpyu(r21, r31)
|
# CHECK: r17:16 -= mpyu(r21, r31)
|
||||||
|
|
||||||
|
# Vector dual multiply
|
||||||
|
0x90 0xde 0x14 0xe8
|
||||||
|
# CHECK: r17:16 = vdmpy(r21:20, r31:30):sat
|
||||||
|
0x90 0xde 0x94 0xe8
|
||||||
|
# CHECK: r17:16 = vdmpy(r21:20, r31:30):<<1:sat
|
||||||
|
0x90 0xde 0x14 0xea
|
||||||
|
# CHECK: r17:16 += vdmpy(r21:20, r31:30):sat
|
||||||
|
0x90 0xde 0x94 0xea
|
||||||
|
# CHECK: r17:16 += vdmpy(r21:20, r31:30):<<1:sat
|
||||||
|
|
||||||
|
# Vector dual multiply with round and pack
|
||||||
|
0x11 0xde 0x14 0xe9
|
||||||
|
# CHECK: r17 = vdmpy(r21:20, r31:30):rnd:sat
|
||||||
|
0x11 0xde 0x94 0xe9
|
||||||
|
# CHECK: r17 = vdmpy(r21:20, r31:30):<<1:rnd:sat
|
||||||
|
|
||||||
|
# Vector reduce multiply bytes
|
||||||
|
0x30 0xde 0x94 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpybu(r21:20, r31:30)
|
||||||
|
0x30 0xde 0xd4 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpybsu(r21:20, r31:30)
|
||||||
|
0x30 0xde 0x94 0xea
|
||||||
|
# CHECK: r17:16 += vrmpybu(r21:20, r31:30)
|
||||||
|
0x30 0xde 0xd4 0xea
|
||||||
|
# CHECK: r17:16 += vrmpybsu(r21:20, r31:30)
|
||||||
|
|
||||||
|
# Vector dual multiply signed by unsigned bytes
|
||||||
|
0x30 0xde 0xb4 0xe8
|
||||||
|
# CHECK: r17:16 = vdmpybsu(r21:20, r31:30):sat
|
||||||
|
0x30 0xde 0x34 0xea
|
||||||
|
# CHECK: r17:16 += vdmpybsu(r21:20, r31:30):sat
|
||||||
|
|
||||||
|
# Vector multiply even haldwords
|
||||||
|
0xd0 0xde 0x14 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyeh(r21:20, r31:30):sat
|
||||||
|
0xd0 0xde 0x94 0xe8
|
||||||
|
# CHECK: r17:16 = vmpyeh(r21:20, r31:30):<<1:sat
|
||||||
|
0x50 0xde 0x34 0xea
|
||||||
|
# CHECK: r17:16 += vmpyeh(r21:20, r31:30)
|
||||||
|
0xd0 0xde 0x14 0xea
|
||||||
|
# CHECK: r17:16 += vmpyeh(r21:20, r31:30):sat
|
||||||
|
0xd0 0xde 0x94 0xea
|
||||||
|
# CHECK: r17:16 += vmpyeh(r21:20, r31:30):<<1:sat
|
||||||
|
|
||||||
|
# Vector multiply halfwords
|
||||||
|
0xb0 0xdf 0x15 0xe5
|
||||||
|
# CHECK: r17:16 = vmpyh(r21, r31):sat
|
||||||
|
0xb0 0xdf 0x95 0xe5
|
||||||
|
# CHECK: r17:16 = vmpyh(r21, r31):<<1:sat
|
||||||
|
0x30 0xdf 0x35 0xe7
|
||||||
|
# CHECK: r17:16 += vmpyh(r21, r31)
|
||||||
|
0xb0 0xdf 0x15 0xe7
|
||||||
|
# CHECK: r17:16 += vmpyh(r21, r31):sat
|
||||||
|
0xb0 0xdf 0x95 0xe7
|
||||||
|
# CHECK: r17:16 += vmpyh(r21, r31):<<1:sat
|
||||||
|
|
||||||
|
# Vector multiply halfwords with round and pack
|
||||||
|
0xf1 0xdf 0x35 0xed
|
||||||
|
# CHECK: r17 = vmpyh(r21, r31):rnd:sat
|
||||||
|
0xf1 0xdf 0xb5 0xed
|
||||||
|
# CHECK: r17 = vmpyh(r21, r31):<<1:rnd:sat
|
||||||
|
|
||||||
|
# Vector multiply halfwords signed by unsigned
|
||||||
|
0xf0 0xdf 0x15 0xe5
|
||||||
|
# CHECK: r17:16 = vmpyhsu(r21, r31):sat
|
||||||
|
0xf0 0xdf 0x95 0xe5
|
||||||
|
# CHECK: r17:16 = vmpyhsu(r21, r31):<<1:sat
|
||||||
|
0xb0 0xdf 0x75 0xe7
|
||||||
|
# CHECK: r17:16 += vmpyhsu(r21, r31):sat
|
||||||
|
0xb0 0xdf 0xf5 0xe7
|
||||||
|
# CHECK: r17:16 += vmpyhsu(r21, r31):<<1:sat
|
||||||
|
|
||||||
|
# Vector reduce multiply halfwords
|
||||||
|
0x50 0xde 0x14 0xe8
|
||||||
|
# CHECK: r17:16 = vrmpyh(r21:20, r31:30)
|
||||||
|
0x50 0xde 0x14 0xea
|
||||||
|
# CHECK: r17:16 += vrmpyh(r21:20, r31:30)
|
||||||
|
|
||||||
|
# Vector multiply bytes
|
||||||
|
0x30 0xdf 0x55 0xe5
|
||||||
|
# CHECK: r17:16 = vmpybsu(r21, r31)
|
||||||
|
0x30 0xdf 0x95 0xe5
|
||||||
|
# CHECK: r17:16 = vmpybu(r21, r31)
|
||||||
|
0x30 0xdf 0x95 0xe7
|
||||||
|
# CHECK: r17:16 += vmpybu(r21, r31)
|
||||||
|
0x30 0xdf 0xd5 0xe7
|
||||||
|
# CHECK: r17:16 += vmpybsu(r21, r31)
|
||||||
|
|
||||||
|
# Vector polynomial multiply halfwords
|
||||||
|
0xf0 0xdf 0xd5 0xe5
|
||||||
|
# CHECK: r17:16 = vpmpyh(r21, r31)
|
||||||
|
0xf0 0xdf 0xb5 0xe7
|
||||||
|
# CHECK: r17:16 ^= vpmpyh(r21, r31)
|
||||||
|
Loading…
Reference in New Issue
Block a user