//===- HexagonIntrinsicsV4.td - V4 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 V4 Architecture Extensions // Application-Level Specification // 80-V9418-12 Rev. A // June 15, 2010 // Vector reduce multiply word by signed half (32x16) //Rdd=vrmpyweh(Rss,Rtt)[:<<1] def : T_PP_pat ; def : T_PP_pat ; //Rdd=vrmpywoh(Rss,Rtt)[:<<1] def : T_PP_pat ; def : T_PP_pat ; //Rdd+=vrmpyweh(Rss,Rtt)[:<<1] def : T_PPP_pat ; def : T_PPP_pat ; //Rdd=vrmpywoh(Rss,Rtt)[:<<1] def : T_PPP_pat ; def : T_PPP_pat ; // Vector multiply halfwords, signed by unsigned // Rdd=vmpyhsu(Rs,Rt)[:<<1]:sat def : T_RR_pat ; def : T_RR_pat ; // Rxx+=vmpyhsu(Rs,Rt)[:<<1]:sat def : T_PRR_pat ; def : T_PRR_pat ; // Vector polynomial multiply halfwords // Rdd=vpmpyh(Rs,Rt) def : T_RR_pat ; // Rxx[^]=vpmpyh(Rs,Rt) def : T_PRR_pat ; // Polynomial multiply words // Rdd=pmpyw(Rs,Rt) def : T_RR_pat ; // Rxx^=pmpyw(Rs,Rt) def : T_PRR_pat ; //Rxx^=asr(Rss,Rt) def : T_PPR_pat ; //Rxx^=asl(Rss,Rt) def : T_PPR_pat ; //Rxx^=lsr(Rss,Rt) def : T_PPR_pat ; //Rxx^=lsl(Rss,Rt) def : T_PPR_pat ; // Multiply and use upper result def : MType_R32_pat ; def : MType_R32_pat ; def : MType_R32_pat ; def : MType_R32_pat ; def : MType_R32_pat ; // Vector reduce add unsigned halfwords def : Pat <(int_hexagon_M2_vraddh DoubleRegs:$src1, DoubleRegs:$src2), (M2_vraddh DoubleRegs:$src1, DoubleRegs:$src2)>; def : T_P_pat ; def: T_P_pat ; def: T_P_pat ; def: T_RR_pat; def: T_RR_pat; def: T_RI_pat; class vcmpImm_pat : Pat <(IntID (i64 DoubleRegs:$src1), immPred:$src2), (MI (i64 DoubleRegs:$src1), immPred:$src2)>; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : vcmpImm_pat ; def : T_PP_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_RI_pat; def : T_RI_pat; def : T_RI_pat; def : T_RI_pat; def : T_RI_pat; def : T_RI_pat; def : T_RP_pat ; def : T_PR_pat; def : Pat <(int_hexagon_M4_mpyrr_addr IntRegs:$src1, IntRegs:$src2, IntRegs:$src3), (M4_mpyrr_addr IntRegs:$src1, IntRegs:$src2, IntRegs:$src3)>; def : T_IRR_pat ; def : T_IRI_pat ; def : T_RIR_pat ; def : T_RRI_pat ; // Multiply 32x32 and use upper result def : T_RRR_pat ; def : T_RRR_pat ; // Complex multiply 32x16 def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_PR_pat ; def : T_PP_pat; def : T_PP_pat; // Complex add/sub halfwords/words def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; def : T_PP_pat ; // Extract bitfield def : T_PP_pat ; def : T_RP_pat ; def : T_PII_pat ; def : T_RII_pat ; // Vector conditional negate // Rdd=vcnegh(Rss,Rt) def : T_PR_pat ; // Shift an immediate left by register amount def : T_IR_pat; // Vector reduce maximum halfwords def : T_PPR_pat ; def : T_PPR_pat ; // Vector reduce maximum words def : T_PPR_pat ; def : T_PPR_pat ; // Vector reduce minimum halfwords def : T_PPR_pat ; def : T_PPR_pat ; // Vector reduce minimum words def : T_PPR_pat ; def : T_PPR_pat ; // Rotate and reduce bytes def : Pat <(int_hexagon_S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2, u2ImmPred:$src3), (S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2, u2ImmPred:$src3)>; // Rotate and reduce bytes with accumulation // Rxx+=vrcrotate(Rss,Rt,#u2) def : Pat <(int_hexagon_S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, u2ImmPred:$src4), (S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, u2ImmPred:$src4)>; // Vector conditional negate def : T_PPR_pat; // Logical xor with xor accumulation def : T_PPP_pat; // ALU64 - Vector min/max byte def : T_PP_pat ; def : T_PP_pat ; // Shift and add/sub/and/or def : T_IRI_pat ; def : T_IRI_pat ; def : T_IRI_pat ; def : T_IRI_pat ; def : T_IRI_pat ; def : T_IRI_pat ; def : T_IRI_pat ; def : T_IRI_pat ; // Split bitfield def : T_RI_pat ; def : T_RR_pat ; def: T_RR_pat; def: T_RI_pat; def: T_RR_pat; def: T_RI_pat; def: T_PI_pat; def: T_P_pat ; /******************************************************************** * ALU32/ALU * *********************************************************************/ // ALU32 / ALU / Logical Operations. def: T_RR_pat; def: T_RR_pat; /******************************************************************** * ALU32/PERM * *********************************************************************/ // Combine Words Into Doublewords. def: T_RI_pat; def: T_IR_pat; /******************************************************************** * ALU32/PRED * *********************************************************************/ // Compare def : T_RI_pat; def : T_RI_pat; def : T_RI_pat; def: T_RR_pat; def: T_RR_pat; def: T_RI_pat; def: T_RI_pat; /******************************************************************** * CR * *********************************************************************/ // CR / Logical Operations On Predicates. class qi_CRInst_qiqiqi_pat : Pat<(i32 (IntID IntRegs:$Rs, IntRegs:$Rt, IntRegs:$Ru)), (i32 (C2_tfrpr (Inst (C2_tfrrp IntRegs:$Rs), (C2_tfrrp IntRegs:$Rt), (C2_tfrrp IntRegs:$Ru))))>; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; def: qi_CRInst_qiqiqi_pat; /******************************************************************** * XTYPE/ALU * *********************************************************************/ // Add And Accumulate. def : T_RRI_pat ; def : T_RIR_pat ; // XTYPE / ALU / Logical-logical Words. 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_RRI_pat ; def : T_RRI_pat ; def : T_RRI_pat ; // Modulo wrap. def : T_RR_pat ; // Arithmetic/Convergent round // Rd=[cround|round](Rs,Rt)[:sat] // Rd=[cround|round](Rs,#u5)[:sat] def : T_RI_pat ; def : T_RR_pat ; def : T_RI_pat ; def : T_RR_pat ; def : T_RI_pat ; def : T_RR_pat ; def : T_P_pat ;