//===- 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 : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_RR_pat ; def : T_PP_pat ; def : T_PP_pat ; // Vector reduce add unsigned halfwords def : T_PP_pat ; def: T_P_pat; def: T_P_pat; def: T_P_pat; def: T_Q_RR_pat; def: T_Q_RR_pat; def: T_Q_RI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PI_pat; def : T_Q_PP_pat; def : T_Q_RR_pat; def : T_Q_RR_pat; def : T_Q_RR_pat; 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 : T_Q_RI_pat; def : T_Q_RI_pat; def : T_Q_RI_pat; def : T_Q_RP_pat; def : T_Q_PR_pat; def : T_RRR_pat ; def : T_IRR_pat ; def : T_IRI_pat ; def : T_RIR_pat ; def : T_RRI_pat ; 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, u2_0ImmPred:$src3), (S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2, u2_0ImmPred:$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, u2_0ImmPred:$src4), (S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2, IntRegs:$src3, u2_0ImmPred:$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_Q_RI_pat; def: T_Q_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_Q_RI_pat; def : T_Q_RI_pat; def : T_Q_RI_pat; // Compare To General Register. def: T_Q_RR_pat; def: T_Q_RR_pat; def: T_Q_RR_pat; def: T_RR_pat; def: T_RR_pat; def: T_RI_pat; def: T_RI_pat; //******************************************************************* // CR //******************************************************************* // CR / Logical Operations On Predicates. def: T_Q_QQQ_pat; def: T_Q_QQQ_pat; def: T_Q_QQQ_pat; def: T_Q_QQQ_pat; def: T_Q_QQQ_pat; def: T_Q_QQQ_pat; def: T_Q_QQQ_pat; def: T_Q_QQQ_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 ;