//===-- HexagonIntrinsics.td - Instruction intrinsics ------*- tablegen -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // This is populated based on the following specs: // Hexagon V2 Architecture // Application-Level Specification // 80-V9418-8 Rev. B // March 4, 2008 //===----------------------------------------------------------------------===// class T_I_pat : Pat <(IntID imm:$Is), (MI imm:$Is)>; class T_R_pat : Pat <(IntID I32:$Rs), (MI I32:$Rs)>; class T_P_pat : Pat <(IntID I64:$Rs), (MI I64:$Rs)>; class T_II_pat : Pat<(IntID Imm1:$Is, Imm2:$It), (MI Imm1:$Is, Imm2:$It)>; class T_RI_pat > : Pat<(IntID I32:$Rs, ImmPred:$It), (MI I32:$Rs, ImmPred:$It)>; class T_IR_pat > : Pat<(IntID ImmPred:$Is, I32:$Rt), (MI ImmPred:$Is, I32:$Rt)>; class T_PI_pat : Pat<(IntID I64:$Rs, imm:$It), (MI I64:$Rs, imm:$It)>; class T_RP_pat : Pat<(IntID I32:$Rs, I64:$Rt), (MI I32:$Rs, I64:$Rt)>; class T_RR_pat : Pat <(IntID I32:$Rs, I32:$Rt), (MI I32:$Rs, I32:$Rt)>; class T_PP_pat : Pat <(IntID I64:$Rs, I64:$Rt), (MI I64:$Rs, I64:$Rt)>; class T_QQ_pat : Pat <(IntID I32:$Rs, I32:$Rt), (MI (C2_tfrrp I32:$Rs), (C2_tfrrp I32:$Rt))>; class T_QII_pat : Pat <(IntID I32:$Rp, Imm1:$Is, Imm2:$It), (MI (C2_tfrrp I32:$Rp), Imm1:$Is, Imm2:$It)>; class T_QRR_pat : Pat <(IntID I32:$Rp, I32:$Rs, I32:$Rt), (MI (C2_tfrrp I32:$Rp), I32:$Rs, I32:$Rt)>; class T_QRI_pat : Pat <(IntID I32:$Rp, I32:$Rs, ImmPred:$Is), (MI (C2_tfrrp I32:$Rp), I32:$Rs, ImmPred:$Is)>; class T_QIR_pat : Pat <(IntID I32:$Rp, ImmPred:$Is, I32:$Rs), (MI (C2_tfrrp I32:$Rp), ImmPred:$Is, I32:$Rs)>; class T_QPP_pat : Pat <(IntID I32:$Rp, I64:$Rs, I64:$Rt), (MI (C2_tfrrp I32:$Rp), I64:$Rs, I64:$Rt)>; class T_RRI_pat : Pat <(IntID I32:$Rs, I32:$Rt, imm:$Iu), (MI I32:$Rs, I32:$Rt, imm:$Iu)>; class T_RII_pat : Pat <(IntID I32:$Rs, imm:$It, imm:$Iu), (MI I32:$Rs, imm:$It, imm:$Iu)>; class T_IRI_pat : Pat <(IntID imm:$It, I32:$Rs, imm:$Iu), (MI imm:$It, I32:$Rs, imm:$Iu)>; class T_IRR_pat : Pat <(IntID imm:$Is, I32:$Rs, I32:$Rt), (MI imm:$Is, I32:$Rs, I32:$Rt)>; class T_RIR_pat : Pat <(IntID I32:$Rs, imm:$Is, I32:$Rt), (MI I32:$Rs, imm:$Is, I32:$Rt)>; class T_RRR_pat : Pat <(IntID I32:$Rs, I32:$Rt, I32:$Ru), (MI I32:$Rs, I32:$Rt, I32:$Ru)>; class T_PPI_pat : Pat <(IntID I64:$Rs, I64:$Rt, imm:$Iu), (MI I64:$Rs, I64:$Rt, imm:$Iu)>; class T_PII_pat : Pat <(IntID I64:$Rs, imm:$It, imm:$Iu), (MI I64:$Rs, imm:$It, imm:$Iu)>; class T_PPP_pat : Pat <(IntID I64:$Rs, I64:$Rt, I64:$Ru), (MI I64:$Rs, I64:$Rt, I64:$Ru)>; class T_PPR_pat : Pat <(IntID I64:$Rs, I64:$Rt, I32:$Ru), (MI I64:$Rs, I64:$Rt, I32:$Ru)>; class T_PRR_pat : Pat <(IntID I64:$Rs, I32:$Rt, I32:$Ru), (MI I64:$Rs, I32:$Rt, I32:$Ru)>; class T_PPQ_pat : Pat <(IntID I64:$Rs, I64:$Rt, I32:$Rp), (MI I64:$Rs, I64:$Rt, (C2_tfrrp I32:$Rp))>; class T_PR_pat : Pat <(IntID I64:$Rs, I32:$Rt), (MI I64:$Rs, I32:$Rt)>; class T_D_pat : Pat<(IntID (F64:$Rs)), (MI (F64:$Rs))>; class T_DI_pat > : Pat<(IntID F64:$Rs, ImmPred:$It), (MI F64:$Rs, ImmPred:$It)>; class T_F_pat : Pat<(IntID F32:$Rs), (MI F32:$Rs)>; class T_FI_pat > : Pat<(IntID F32:$Rs, ImmPred:$It), (MI F32:$Rs, ImmPred:$It)>; class T_FF_pat : Pat<(IntID F32:$Rs, F32:$Rt), (MI F32:$Rs, F32:$Rt)>; class T_DD_pat : Pat<(IntID F64:$Rs, F64:$Rt), (MI F64:$Rs, F64:$Rt)>; class T_FFF_pat : Pat<(IntID F32:$Rs, F32:$Rt, F32:$Ru), (MI F32:$Rs, F32:$Rt, F32:$Ru)>; class T_FFFQ_pat : Pat <(IntID F32:$Rs, F32:$Rt, F32:$Ru, I32:$Rp), (MI F32:$Rs, F32:$Rt, F32:$Ru, (C2_tfrrp I32:$Rp))>; class T_Q_RI_pat > : Pat<(IntID I32:$Rs, ImmPred:$It), (C2_tfrpr (MI I32:$Rs, ImmPred:$It))>; class T_Q_RR_pat : Pat <(IntID I32:$Rs, I32:$Rt), (C2_tfrpr (MI I32:$Rs, I32:$Rt))>; class T_Q_RP_pat : Pat <(IntID I32:$Rs, I64:$Rt), (C2_tfrpr (MI I32:$Rs, I64:$Rt))>; class T_Q_PR_pat : Pat <(IntID I64:$Rs, I32:$Rt), (C2_tfrpr (MI I64:$Rs, I32:$Rt))>; class T_Q_PI_pat : Pat<(IntID I64:$Rs, imm:$It), (C2_tfrpr (MI I64:$Rs, imm:$It))>; class T_Q_PP_pat : Pat <(IntID I64:$Rs, I64:$Rt), (C2_tfrpr (MI I64:$Rs, I64:$Rt))>; class T_Q_Q_pat : Pat <(IntID I32:$Rp), (C2_tfrpr (MI (C2_tfrrp I32:$Rp)))>; class T_Q_QQ_pat : Pat <(IntID I32:$Rp, I32:$Rq), (C2_tfrpr (MI (C2_tfrrp I32:$Rp), (C2_tfrrp I32:$Rq)))>; class T_Q_FF_pat : Pat<(IntID F32:$Rs, F32:$Rt), (C2_tfrpr (MI F32:$Rs, F32:$Rt))>; class T_Q_DD_pat : Pat<(IntID F64:$Rs, F64:$Rt), (C2_tfrpr (MI F64:$Rs, F64:$Rt))>; class T_Q_FI_pat : Pat<(IntID F32:$Rs, imm:$It), (C2_tfrpr (MI F32:$Rs, imm:$It))>; class T_Q_DI_pat : Pat<(IntID F64:$Rs, imm:$It), (C2_tfrpr (MI F64:$Rs, imm:$It))>; class T_Q_QQQ_pat : Pat <(IntID I32:$Rp, I32:$Rq, I32:$Rs), (C2_tfrpr (MI (C2_tfrrp I32:$Rp), (C2_tfrrp I32:$Rq), (C2_tfrrp I32:$Rs)))>; //===----------------------------------------------------------------------===// // MPYS / Multipy signed/unsigned halfwords //Rd=mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:rnd][:sat] //===----------------------------------------------------------------------===// def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; //===----------------------------------------------------------------------===// // MPYS / Multipy signed/unsigned halfwords and add/subtract the // result from the accumulator. //Rx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat] //===----------------------------------------------------------------------===// def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; //===----------------------------------------------------------------------===// // Multiply signed/unsigned halfwords with and without saturation and rounding // into a 64-bits destination register. //===----------------------------------------------------------------------===// def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; //===----------------------------------------------------------------------===// // MPYS / Multipy signed/unsigned halfwords and add/subtract the // result from the 64-bit destination register. //Rxx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat] //===----------------------------------------------------------------------===// def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; // Vector complex multiply imaginary: Rdd=vcmpyi(Rss,Rtt)[:<<1]:sat def : T_PP_pat ; def : T_PP_pat ; // Vector complex multiply real: Rdd=vcmpyr(Rss,Rtt)[:<<1]:sat def : T_PP_pat ; def : T_PP_pat ; // Vector dual multiply: Rdd=vdmpy(Rss,Rtt)[:<<1]:sat def : T_PP_pat ; def : T_PP_pat ; // Vector multiply even halfwords: Rdd=vmpyeh(Rss,Rtt)[:<<1]:sat def : T_PP_pat ; def : T_PP_pat ; //Rdd=vmpywoh(Rss,Rtt)[:<<1][:rnd]:sat def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; //Rdd=vmpyweh(Rss,Rtt)[:<<1][:rnd]:sat def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; //Rdd=vmpywouh(Rss,Rtt)[:<<1][:rnd]:sat def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; //Rdd=vmpyweuh(Rss,Rtt)[:<<1][:rnd]:sat def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // Vector reduce add unsigned bytes: Rdd32[+]=vrmpybu(Rss32,Rtt32) def : T_PP_pat ; def : T_PPP_pat ; // Vector sum of absolute differences unsigned bytes: Rdd=vrsadub(Rss,Rtt) def : T_PP_pat ; def : T_PPP_pat ; // Vector absolute difference: Rdd=vabsdiffh(Rtt,Rss) def : T_PP_pat ; // Vector absolute difference words: Rdd=vabsdiffw(Rtt,Rss) def : T_PP_pat ; // Vector reduce complex multiply real or imaginary: // Rdd[+]=vrcmpy[ir](Rss,Rtt[*]) def : T_PP_pat ; def : T_PP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; // Vector reduce halfwords // Rdd[+]=vrmpyh(Rss,Rtt) def : T_PP_pat ; def : T_PPP_pat ; //===----------------------------------------------------------------------===// // Vector Multipy with accumulation //===----------------------------------------------------------------------===// // Vector multiply word by signed half with accumulation // Rxx+=vmpyw[eo]h(Rss,Rtt)[:<<1][:rnd]:sat def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; // Vector multiply word by unsigned half with accumulation // Rxx+=vmpyw[eo]uh(Rss,Rtt)[:<<1][:rnd]:sat def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; // Vector multiply even halfwords with accumulation // Rxx+=vmpyeh(Rss,Rtt)[:<<1][:sat] def : T_PPP_pat ; def : T_PPP_pat ; def : T_PPP_pat ; // Vector dual multiply with accumulation // Rxx+=vdmpy(Rss,Rtt)[:sat] def : T_PPP_pat ; def : T_PPP_pat ; // Vector complex multiply real or imaginary with accumulation // Rxx+=vcmpy[ir](Rss,Rtt):sat def : T_PPP_pat ; def : T_PPP_pat ; //===----------------------------------------------------------------------===// // Add/Subtract halfword // Rd=add(Rt.L,Rs.[HL])[:sat] // Rd=sub(Rt.L,Rs.[HL])[:sat] // Rd=add(Rt.[LH],Rs.[HL])[:sat][:<16] // Rd=sub(Rt.[LH],Rs.[HL])[:sat][:<16] //===----------------------------------------------------------------------===// //Rd=add(Rt.L,Rs.[LH]) def : T_RR_pat ; def : T_RR_pat ; //Rd=add(Rt.L,Rs.[LH]):sat def : T_RR_pat ; def : T_RR_pat ; //Rd=sub(Rt.L,Rs.[LH]) def : T_RR_pat ; def : T_RR_pat ; //Rd=sub(Rt.L,Rs.[LH]):sat def : T_RR_pat ; def : T_RR_pat ; //Rd=add(Rt.[LH],Rs.[LH]):<<16 def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; //Rd=sub(Rt.[LH],Rs.[LH]):<<16 def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; //Rd=add(Rt.[LH],Rs.[LH]):sat:<<16 def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; //Rd=sub(Rt.[LH],Rs.[LH]):sat:<<16 def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; // ALU64 / ALU / min max def : T_RR_pat; def : T_RR_pat; def : T_RR_pat; def : T_RR_pat; // Shift and accumulate def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_PPI_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; def : T_PPR_pat ; //******************************************************************* // ALU32/ALU //******************************************************************* def : T_RR_pat; def : T_RI_pat; def : T_RR_pat; def : T_IR_pat; def : T_RR_pat; def : T_RI_pat; def : T_RR_pat; def : T_RI_pat; def : T_RR_pat; def : T_RR_pat; // Assembler mapped from Rd32=not(Rs32) to Rd32=sub(#-1,Rs32) def : Pat <(int_hexagon_A2_not I32:$Rs), (A2_subri -1, I32:$Rs)>; // Assembler mapped from Rd32=neg(Rs32) to Rd32=sub(#0,Rs32) def : Pat <(int_hexagon_A2_neg I32:$Rs), (A2_subri 0, I32:$Rs)>; // Transfer immediate def : Pat <(int_hexagon_A2_tfril I32:$Rs, u16_0ImmPred:$Is), (A2_tfril I32:$Rs, u16_0ImmPred:$Is)>; def : Pat <(int_hexagon_A2_tfrih I32:$Rs, u16_0ImmPred:$Is), (A2_tfrih I32:$Rs, u16_0ImmPred:$Is)>; // Transfer Register/immediate. def : T_R_pat ; def : T_I_pat ; def ImmExt64: SDNodeXFormgetSExtValue(); return CurDAG->getTargetConstant(V, SDLoc(N), MVT::i64); }]>; // A2_tfrpi has an operand of type i64. This is necessary, since it is // generated from "(set I64:$Rd, imm)". That pattern would not appear // in the DAG, if the immediate was not a 64-bit value. // The builtin for A2_tfrpi, on the other hand, takes a 32-bit value, // which makes it impossible to simply replace it with the instruction. // To connect the builtin with the instruction, the builtin's operand // needs to be extended to the right type. def : Pat<(int_hexagon_A2_tfrpi imm:$Is), (A2_tfrpi (ImmExt64 $Is))>; // Assembler mapped from Rdd32=Rss32 to Rdd32=combine(Rss.H32,Rss.L32) def : Pat<(int_hexagon_A2_tfrp I64:$src), (A2_combinew (HiReg I64:$src), (LoReg I64:$src))>; //******************************************************************* // ALU32/PERM //******************************************************************* // Combine def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_II_pat; // Mux def : T_QRR_pat; def : T_QRI_pat; def : T_QIR_pat; def : T_QII_pat; // Shift halfword def : T_R_pat; def : T_R_pat; def : T_R_pat; // Sign/zero extend def : T_R_pat; def : T_R_pat; def : T_R_pat; def : T_R_pat; //******************************************************************* // ALU32/PRED //******************************************************************* // Compare def : T_Q_RR_pat; def : T_Q_RR_pat; def : T_Q_RR_pat; def : T_Q_RI_pat; def : T_Q_RI_pat; def : T_Q_RI_pat; def : Pat <(int_hexagon_C2_cmpgei I32:$src1, s32_0ImmPred:$src2), (C2_tfrpr (C2_cmpgti I32:$src1, (SDEC1 s32_0ImmPred:$src2)))>; def : Pat <(int_hexagon_C2_cmpgeui I32:$src1, u32_0ImmPred:$src2), (C2_tfrpr (C2_cmpgtui I32:$src1, (UDEC1 u32_0ImmPred:$src2)))>; def : Pat <(int_hexagon_C2_cmpgeui I32:$src, 0), (C2_tfrpr (C2_cmpeq I32:$src, I32:$src))>; def : Pat <(int_hexagon_C2_cmplt I32:$src1, I32:$src2), (C2_tfrpr (C2_cmpgt I32:$src2, I32:$src1))>; def : Pat <(int_hexagon_C2_cmpltu I32:$src1, I32:$src2), (C2_tfrpr (C2_cmpgtu I32:$src2, I32:$src1))>; //******************************************************************* // ALU32/VH //******************************************************************* // Vector add, subtract, average halfwords def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; //******************************************************************* // ALU64/ALU //******************************************************************* def: T_RR_pat; def: T_RR_pat; def: T_PP_pat; def: T_PP_pat; def: T_PP_pat; def: T_PP_pat; def: T_PP_pat; def: T_Q_PP_pat; def: T_Q_PP_pat; def: T_Q_PP_pat; def: T_PP_pat; def: T_RR_pat; //******************************************************************* // ALU64/VB //******************************************************************* // ALU64 - Vector add def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // ALU64 - Vector average def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // ALU64 - Vector negative average def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // ALU64 - Vector max def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // ALU64 - Vector min def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // ALU64 - Vector sub def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // ALU64 - Vector compare bytes def : T_Q_PP_pat ; def : T_Q_PP_pat ; def : T_Q_PP_pat ; // ALU64 - Vector compare halfwords def : T_Q_PP_pat ; def : T_Q_PP_pat ; def : T_Q_PP_pat ; // ALU64 - Vector compare words def : T_Q_PP_pat ; def : T_Q_PP_pat ; def : T_Q_PP_pat ; // ALU64 / VB / Vector mux. def : T_QPP_pat ; // MPY - Multiply and use full result // Rdd = mpy[u](Rs, Rt) def : T_RR_pat ; def : T_RR_pat ; // Complex multiply real or imaginary def : T_RR_pat ; def : T_RR_pat ; // Complex multiply def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; // Vector multiply halfwords // Rdd=vmpyh(Rs,Rt)[:<<1]:sat def : T_RR_pat ; def : T_RR_pat ; // Rxx[+-]= mpy[u](Rs,Rt) def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; // Rxx[-+]=cmpy(Rs,Rt)[:<<1]:sat def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; // Rxx[-+]=cmpy(Rs,Rt*)[:<<1]:sat def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; // Rxx+=cmpy[ir](Rs,Rt) def : T_PRR_pat ; def : T_PRR_pat ; // Rxx+=vmpyh(Rs,Rt)[:<<1][:sat] def : T_PRR_pat ; def : T_PRR_pat ; def : T_PRR_pat ; //******************************************************************* // CR //******************************************************************* def: T_Q_Q_pat; def: T_Q_Q_pat; def: T_Q_Q_pat; def: T_Q_Q_pat; def: T_Q_QQ_pat; def: T_Q_QQ_pat; def: T_Q_QQ_pat; def: T_Q_QQ_pat; def: T_Q_QQ_pat; // Multiply 32x32 and use lower result def : T_RRI_pat ; def : T_RRI_pat ; def : T_RRR_pat ; // Subtract and accumulate def : T_RRR_pat ; // Add and accumulate def : T_RRR_pat ; def : T_RRR_pat ; def : T_RRI_pat ; def : T_RRI_pat ; // XOR and XOR with destination def : T_RRR_pat ; // Vector dual multiply with round and pack def : T_PP_pat ; def : T_PP_pat ; // Vector multiply halfwords with round and pack def : T_RR_pat ; def : T_RR_pat ; // Multiply and use lower result def : T_RR_pat ; def : T_RI_pat ; // Assembler mapped from Rd32=mpyui(Rs32,Rt32) to Rd32=mpyi(Rs32,Rt32) def : T_RR_pat ; // Multiply and use upper result def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; // Complex multiply with round and pack // Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; //******************************************************************* // STYPE/ALU //******************************************************************* def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; //******************************************************************* // STYPE/BIT //******************************************************************* // Count leading/trailing def: T_R_pat; def: T_P_pat; def: T_R_pat; def: T_P_pat; def: T_R_pat; def: T_P_pat; def: T_R_pat; def: T_R_pat; def: T_R_pat; // Compare bit mask def: T_RR_pat; def: T_RI_pat; def: T_RR_pat; // Vector shuffle def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // Vector truncate def : T_PP_pat ; def : T_PP_pat ; // Linear feedback-shift Iteration. def : T_PP_pat ; // Vector align // Need custom lowering def : T_PPQ_pat ; def : T_PPI_pat ; // Vector splice def : T_PPQ_pat ; def : T_PPI_pat ; // Shift by immediate and add def : T_RRI_pat; // Extract bitfield def : T_PII_pat; def : T_RII_pat; def : T_RP_pat ; def : T_PP_pat ; // Insert bitfield def : Pat <(int_hexagon_S2_insert_rp I32:$src1, I32:$src2, I64:$src3), (S2_insert_rp I32:$src1, I32:$src2, I64:$src3)>; def : Pat<(i64 (int_hexagon_S2_insertp_rp I64:$src1, I64:$src2, I64:$src3)), (i64 (S2_insertp_rp I64:$src1, I64:$src2, I64:$src3))>; def : Pat<(int_hexagon_S2_insert I32:$src1, I32:$src2, u5_0ImmPred:$src3, u5_0ImmPred:$src4), (S2_insert I32:$src1, I32:$src2, u5_0ImmPred:$src3, u5_0ImmPred:$src4)>; def : Pat<(i64 (int_hexagon_S2_insertp I64:$src1, I64:$src2, u6_0ImmPred:$src3, u6_0ImmPred:$src4)), (i64 (S2_insertp I64:$src1, I64:$src2, u6_0ImmPred:$src3, u6_0ImmPred:$src4))>; // Innterleave/deinterleave def : T_P_pat ; def : T_P_pat ; // Set/Clear/Toggle Bit def: T_RI_pat; def: T_RI_pat; def: T_RI_pat; def: T_RR_pat; def: T_RR_pat; def: T_RR_pat; // Test Bit def: T_Q_RI_pat; def: T_Q_RR_pat; //******************************************************************* // STYPE/COMPLEX //******************************************************************* // Vector Complex conjugate def : T_P_pat ; // Vector Complex rotate def : T_PR_pat ; //******************************************************************* // STYPE/PERM //******************************************************************* // Vector saturate without pack def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; //******************************************************************* // STYPE/PRED //******************************************************************* // Predicate transfer def: Pat<(i32 (int_hexagon_C2_tfrpr I32:$Rs)), (i32 (C2_tfrpr (C2_tfrrp I32:$Rs)))>; def: Pat<(i32 (int_hexagon_C2_tfrrp I32:$Rs)), (i32 (C2_tfrpr (C2_tfrrp I32:$Rs)))>; // Mask generate from predicate def: Pat<(i64 (int_hexagon_C2_mask I32:$Rs)), (i64 (C2_mask (C2_tfrrp I32:$Rs)))>; // Viterbi pack even and odd predicate bits def: T_QQ_pat; //******************************************************************* // STYPE/SHIFT //******************************************************************* def : T_PI_pat ; def : T_PI_pat ; def : T_PI_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; // Vector saturate and pack def : T_R_pat ; def : T_R_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_P_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_P_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; def : T_R_pat ; // Vector arithmetic shift right by immediate with truncate and pack. def : T_PI_pat; def : T_RI_pat ; def : T_RI_pat ; def : T_RI_pat ; def : T_RI_pat ; def : T_RI_pat ; // Shift left by immediate with saturation. def : T_RI_pat ; //===----------------------------------------------------------------------===// // Template 'def pat' to map tableidx[bhwd] intrinsics to :raw instructions. //===----------------------------------------------------------------------===// class S2op_tableidx_pat : Pat <(IntID I32:$src1, I32:$src2, u4_0ImmPred:$src3, u5_0ImmPred:$src4), (OutputInst I32:$src1, I32:$src2, u4_0ImmPred:$src3, (XformImm u5_0ImmPred:$src4))>; def SDEC2 : SDNodeXFormgetSExtValue(); return CurDAG->getTargetConstant(V-2, SDLoc(N), MVT::i32); }]>; def SDEC3 : SDNodeXFormgetSExtValue(); return CurDAG->getTargetConstant(V-3, SDLoc(N), MVT::i32); }]>; // Table Index : Extract and insert bits. // Map to the real hardware instructions after subtracting appropriate // values from the 4th input operand. Please note that subtraction is not // needed for int_hexagon_S2_tableidxb_goodsyntax. def : Pat <(int_hexagon_S2_tableidxb_goodsyntax I32:$src1, I32:$src2, u4_0ImmPred:$src3, u5_0ImmPred:$src4), (S2_tableidxb I32:$src1, I32:$src2, u4_0ImmPred:$src3, u5_0ImmPred:$src4)>; def : S2op_tableidx_pat ; def : S2op_tableidx_pat ; def : S2op_tableidx_pat ; //******************************************************************* // STYPE/VH //******************************************************************* // Vector absolute value halfwords with and without saturation // Rdd64=vabsh(Rss64)[:sat] def : T_P_pat ; def : T_P_pat ; // Vector shift halfwords by immediate // Rdd64=[vaslh/vasrh/vlsrh](Rss64,u4) def : T_PI_pat ; def : T_PI_pat ; def : T_PI_pat ; // Vector shift halfwords by register // Rdd64=[vaslw/vasrw/vlslw/vlsrw](Rss64,Rt32) def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; //******************************************************************* // STYPE/VW //******************************************************************* // Vector absolute value words with and without saturation def : T_P_pat ; def : T_P_pat ; // Vector shift words by immediate. // Rdd64=[vasrw/vlsrw|vaslw](Rss64,u5) def : T_PI_pat ; def : T_PI_pat ; def : T_PI_pat ; // Vector shift words by register. // Rdd64=[vasrw/vlsrw|vaslw|vlslw](Rss64,Rt32) def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; // Vector shift words with truncate and pack def : T_PR_pat ; // Load/store locked. def : T_R_pat; def : T_R_pat; def : Pat<(int_hexagon_S2_storew_locked I32:$Rs, I32:$Rt), (C2_tfrpr (S2_storew_locked I32:$Rs, I32:$Rt))>; def : Pat<(int_hexagon_S4_stored_locked I32:$Rs, I64:$Rt), (C2_tfrpr (S4_stored_locked I32:$Rs, I64:$Rt))>; //******************************************************************* // ST //******************************************************************* class T_stb_pat : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru), (MI I32:$Rs, I32:$Ru, Val:$Rt)>; def : T_stb_pat ; def : T_stb_pat ; def : T_stb_pat ; def : T_stb_pat ; def : T_stb_pat ; class T_stc_pat : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru, Imm:$s), (MI I32:$Rs, Imm:$s, I32:$Ru, Val:$Rt)>; def: T_stc_pat; def: T_stc_pat; def: T_stc_pat; def: T_stc_pat; def: T_stc_pat; multiclass MaskedStore { def : Pat<(IntID VecPredRegs:$src1, IntRegs:$src2, VectorRegs:$src3), (MI VecPredRegs:$src1, IntRegs:$src2, #0, VectorRegs:$src3)>, Requires<[UseHVXSgl]>; def : Pat<(!cast(IntID#"_128B") VecPredRegs128B:$src1, IntRegs:$src2, VectorRegs128B:$src3), (!cast(MI#"_128B") VecPredRegs128B:$src1, IntRegs:$src2, #0, VectorRegs128B:$src3)>, Requires<[UseHVXDbl]>; } defm : MaskedStore ; defm : MaskedStore ; defm : MaskedStore ; defm : MaskedStore ; include "HexagonIntrinsicsV3.td" include "HexagonIntrinsicsV4.td" include "HexagonIntrinsicsV5.td" include "HexagonIntrinsicsV60.td"