1*0fca6ea1SDimitry Andric //===------ SemaHexagon.cpp ------ Hexagon target-specific routines -------===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric // 9*0fca6ea1SDimitry Andric // This file implements semantic analysis functions specific to Hexagon. 10*0fca6ea1SDimitry Andric // 11*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 12*0fca6ea1SDimitry Andric 13*0fca6ea1SDimitry Andric #include "clang/Sema/SemaHexagon.h" 14*0fca6ea1SDimitry Andric #include "clang/Basic/TargetBuiltins.h" 15*0fca6ea1SDimitry Andric #include "clang/Sema/Sema.h" 16*0fca6ea1SDimitry Andric #include "llvm/ADT/STLExtras.h" 17*0fca6ea1SDimitry Andric #include <cstdint> 18*0fca6ea1SDimitry Andric #include <iterator> 19*0fca6ea1SDimitry Andric 20*0fca6ea1SDimitry Andric namespace clang { 21*0fca6ea1SDimitry Andric 22*0fca6ea1SDimitry Andric SemaHexagon::SemaHexagon(Sema &S) : SemaBase(S) {} 23*0fca6ea1SDimitry Andric 24*0fca6ea1SDimitry Andric bool SemaHexagon::CheckHexagonBuiltinArgument(unsigned BuiltinID, 25*0fca6ea1SDimitry Andric CallExpr *TheCall) { 26*0fca6ea1SDimitry Andric struct ArgInfo { 27*0fca6ea1SDimitry Andric uint8_t OpNum; 28*0fca6ea1SDimitry Andric bool IsSigned; 29*0fca6ea1SDimitry Andric uint8_t BitWidth; 30*0fca6ea1SDimitry Andric uint8_t Align; 31*0fca6ea1SDimitry Andric }; 32*0fca6ea1SDimitry Andric struct BuiltinInfo { 33*0fca6ea1SDimitry Andric unsigned BuiltinID; 34*0fca6ea1SDimitry Andric ArgInfo Infos[2]; 35*0fca6ea1SDimitry Andric }; 36*0fca6ea1SDimitry Andric 37*0fca6ea1SDimitry Andric static BuiltinInfo Infos[] = { 38*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_ldd, {{ 3, true, 4, 3 }} }, 39*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_ldw, {{ 3, true, 4, 2 }} }, 40*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_ldh, {{ 3, true, 4, 1 }} }, 41*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_lduh, {{ 3, true, 4, 1 }} }, 42*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_ldb, {{ 3, true, 4, 0 }} }, 43*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_ldub, {{ 3, true, 4, 0 }} }, 44*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_std, {{ 3, true, 4, 3 }} }, 45*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_stw, {{ 3, true, 4, 2 }} }, 46*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_sth, {{ 3, true, 4, 1 }} }, 47*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_sthhi, {{ 3, true, 4, 1 }} }, 48*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_circ_stb, {{ 3, true, 4, 0 }} }, 49*0fca6ea1SDimitry Andric 50*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_L2_loadrub_pci, {{ 1, true, 4, 0 }} }, 51*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_L2_loadrb_pci, {{ 1, true, 4, 0 }} }, 52*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_L2_loadruh_pci, {{ 1, true, 4, 1 }} }, 53*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_L2_loadrh_pci, {{ 1, true, 4, 1 }} }, 54*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_L2_loadri_pci, {{ 1, true, 4, 2 }} }, 55*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_L2_loadrd_pci, {{ 1, true, 4, 3 }} }, 56*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_storerb_pci, {{ 1, true, 4, 0 }} }, 57*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_storerh_pci, {{ 1, true, 4, 1 }} }, 58*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_storerf_pci, {{ 1, true, 4, 1 }} }, 59*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_storeri_pci, {{ 1, true, 4, 2 }} }, 60*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_storerd_pci, {{ 1, true, 4, 3 }} }, 61*0fca6ea1SDimitry Andric 62*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A2_combineii, {{ 1, true, 8, 0 }} }, 63*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A2_tfrih, {{ 1, false, 16, 0 }} }, 64*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A2_tfril, {{ 1, false, 16, 0 }} }, 65*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A2_tfrpi, {{ 0, true, 8, 0 }} }, 66*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_bitspliti, {{ 1, false, 5, 0 }} }, 67*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_cmpbeqi, {{ 1, false, 8, 0 }} }, 68*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_cmpbgti, {{ 1, true, 8, 0 }} }, 69*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_cround_ri, {{ 1, false, 5, 0 }} }, 70*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_round_ri, {{ 1, false, 5, 0 }} }, 71*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_round_ri_sat, {{ 1, false, 5, 0 }} }, 72*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpbeqi, {{ 1, false, 8, 0 }} }, 73*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpbgti, {{ 1, true, 8, 0 }} }, 74*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpbgtui, {{ 1, false, 7, 0 }} }, 75*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpheqi, {{ 1, true, 8, 0 }} }, 76*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmphgti, {{ 1, true, 8, 0 }} }, 77*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmphgtui, {{ 1, false, 7, 0 }} }, 78*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpweqi, {{ 1, true, 8, 0 }} }, 79*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpwgti, {{ 1, true, 8, 0 }} }, 80*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_A4_vcmpwgtui, {{ 1, false, 7, 0 }} }, 81*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_C2_bitsclri, {{ 1, false, 6, 0 }} }, 82*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_C2_muxii, {{ 2, true, 8, 0 }} }, 83*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_C4_nbitsclri, {{ 1, false, 6, 0 }} }, 84*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_F2_dfclass, {{ 1, false, 5, 0 }} }, 85*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_F2_dfimm_n, {{ 0, false, 10, 0 }} }, 86*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_F2_dfimm_p, {{ 0, false, 10, 0 }} }, 87*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_F2_sfclass, {{ 1, false, 5, 0 }} }, 88*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_F2_sfimm_n, {{ 0, false, 10, 0 }} }, 89*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_F2_sfimm_p, {{ 0, false, 10, 0 }} }, 90*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_M4_mpyri_addi, {{ 2, false, 6, 0 }} }, 91*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_M4_mpyri_addr_u2, {{ 1, false, 6, 2 }} }, 92*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_addasl_rrri, {{ 2, false, 3, 0 }} }, 93*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_acc, {{ 2, false, 6, 0 }} }, 94*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_and, {{ 2, false, 6, 0 }} }, 95*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p, {{ 1, false, 6, 0 }} }, 96*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_nac, {{ 2, false, 6, 0 }} }, 97*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_or, {{ 2, false, 6, 0 }} }, 98*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_xacc, {{ 2, false, 6, 0 }} }, 99*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_acc, {{ 2, false, 5, 0 }} }, 100*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_and, {{ 2, false, 5, 0 }} }, 101*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r, {{ 1, false, 5, 0 }} }, 102*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_nac, {{ 2, false, 5, 0 }} }, 103*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_or, {{ 2, false, 5, 0 }} }, 104*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_sat, {{ 1, false, 5, 0 }} }, 105*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_xacc, {{ 2, false, 5, 0 }} }, 106*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_vh, {{ 1, false, 4, 0 }} }, 107*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asl_i_vw, {{ 1, false, 5, 0 }} }, 108*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_acc, {{ 2, false, 6, 0 }} }, 109*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_and, {{ 2, false, 6, 0 }} }, 110*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p, {{ 1, false, 6, 0 }} }, 111*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_nac, {{ 2, false, 6, 0 }} }, 112*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_or, {{ 2, false, 6, 0 }} }, 113*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_rnd_goodsyntax, 114*0fca6ea1SDimitry Andric {{ 1, false, 6, 0 }} }, 115*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_rnd, {{ 1, false, 6, 0 }} }, 116*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_acc, {{ 2, false, 5, 0 }} }, 117*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_and, {{ 2, false, 5, 0 }} }, 118*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r, {{ 1, false, 5, 0 }} }, 119*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_nac, {{ 2, false, 5, 0 }} }, 120*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_or, {{ 2, false, 5, 0 }} }, 121*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd_goodsyntax, 122*0fca6ea1SDimitry Andric {{ 1, false, 5, 0 }} }, 123*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd, {{ 1, false, 5, 0 }} }, 124*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_svw_trun, {{ 1, false, 5, 0 }} }, 125*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_vh, {{ 1, false, 4, 0 }} }, 126*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_asr_i_vw, {{ 1, false, 5, 0 }} }, 127*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_clrbit_i, {{ 1, false, 5, 0 }} }, 128*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_extractu, {{ 1, false, 5, 0 }, 129*0fca6ea1SDimitry Andric { 2, false, 5, 0 }} }, 130*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_extractup, {{ 1, false, 6, 0 }, 131*0fca6ea1SDimitry Andric { 2, false, 6, 0 }} }, 132*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_insert, {{ 2, false, 5, 0 }, 133*0fca6ea1SDimitry Andric { 3, false, 5, 0 }} }, 134*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_insertp, {{ 2, false, 6, 0 }, 135*0fca6ea1SDimitry Andric { 3, false, 6, 0 }} }, 136*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_acc, {{ 2, false, 6, 0 }} }, 137*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_and, {{ 2, false, 6, 0 }} }, 138*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p, {{ 1, false, 6, 0 }} }, 139*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_nac, {{ 2, false, 6, 0 }} }, 140*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_or, {{ 2, false, 6, 0 }} }, 141*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_xacc, {{ 2, false, 6, 0 }} }, 142*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_acc, {{ 2, false, 5, 0 }} }, 143*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_and, {{ 2, false, 5, 0 }} }, 144*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r, {{ 1, false, 5, 0 }} }, 145*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_nac, {{ 2, false, 5, 0 }} }, 146*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_or, {{ 2, false, 5, 0 }} }, 147*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_xacc, {{ 2, false, 5, 0 }} }, 148*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vh, {{ 1, false, 4, 0 }} }, 149*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vw, {{ 1, false, 5, 0 }} }, 150*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_setbit_i, {{ 1, false, 5, 0 }} }, 151*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_tableidxb_goodsyntax, 152*0fca6ea1SDimitry Andric {{ 2, false, 4, 0 }, 153*0fca6ea1SDimitry Andric { 3, false, 5, 0 }} }, 154*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_tableidxd_goodsyntax, 155*0fca6ea1SDimitry Andric {{ 2, false, 4, 0 }, 156*0fca6ea1SDimitry Andric { 3, false, 5, 0 }} }, 157*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_tableidxh_goodsyntax, 158*0fca6ea1SDimitry Andric {{ 2, false, 4, 0 }, 159*0fca6ea1SDimitry Andric { 3, false, 5, 0 }} }, 160*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_tableidxw_goodsyntax, 161*0fca6ea1SDimitry Andric {{ 2, false, 4, 0 }, 162*0fca6ea1SDimitry Andric { 3, false, 5, 0 }} }, 163*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_togglebit_i, {{ 1, false, 5, 0 }} }, 164*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_tstbit_i, {{ 1, false, 5, 0 }} }, 165*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_valignib, {{ 2, false, 3, 0 }} }, 166*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S2_vspliceib, {{ 2, false, 3, 0 }} }, 167*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_addi_asl_ri, {{ 2, false, 5, 0 }} }, 168*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_addi_lsr_ri, {{ 2, false, 5, 0 }} }, 169*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_andi_asl_ri, {{ 2, false, 5, 0 }} }, 170*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_andi_lsr_ri, {{ 2, false, 5, 0 }} }, 171*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_clbaddi, {{ 1, true , 6, 0 }} }, 172*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_clbpaddi, {{ 1, true, 6, 0 }} }, 173*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_extract, {{ 1, false, 5, 0 }, 174*0fca6ea1SDimitry Andric { 2, false, 5, 0 }} }, 175*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_extractp, {{ 1, false, 6, 0 }, 176*0fca6ea1SDimitry Andric { 2, false, 6, 0 }} }, 177*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_lsli, {{ 0, true, 6, 0 }} }, 178*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_ntstbit_i, {{ 1, false, 5, 0 }} }, 179*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_ori_asl_ri, {{ 2, false, 5, 0 }} }, 180*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_ori_lsr_ri, {{ 2, false, 5, 0 }} }, 181*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_subi_asl_ri, {{ 2, false, 5, 0 }} }, 182*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_subi_lsr_ri, {{ 2, false, 5, 0 }} }, 183*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_vrcrotate_acc, {{ 3, false, 2, 0 }} }, 184*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S4_vrcrotate, {{ 2, false, 2, 0 }} }, 185*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S5_asrhub_rnd_sat_goodsyntax, 186*0fca6ea1SDimitry Andric {{ 1, false, 4, 0 }} }, 187*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S5_asrhub_sat, {{ 1, false, 4, 0 }} }, 188*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S5_vasrhrnd_goodsyntax, 189*0fca6ea1SDimitry Andric {{ 1, false, 4, 0 }} }, 190*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p, {{ 1, false, 6, 0 }} }, 191*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_acc, {{ 2, false, 6, 0 }} }, 192*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_and, {{ 2, false, 6, 0 }} }, 193*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_nac, {{ 2, false, 6, 0 }} }, 194*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_or, {{ 2, false, 6, 0 }} }, 195*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_xacc, {{ 2, false, 6, 0 }} }, 196*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r, {{ 1, false, 5, 0 }} }, 197*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_acc, {{ 2, false, 5, 0 }} }, 198*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_and, {{ 2, false, 5, 0 }} }, 199*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_nac, {{ 2, false, 5, 0 }} }, 200*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_or, {{ 2, false, 5, 0 }} }, 201*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_xacc, {{ 2, false, 5, 0 }} }, 202*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_valignbi, {{ 2, false, 3, 0 }} }, 203*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_valignbi_128B, {{ 2, false, 3, 0 }} }, 204*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlalignbi, {{ 2, false, 3, 0 }} }, 205*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlalignbi_128B, {{ 2, false, 3, 0 }} }, 206*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi, {{ 2, false, 1, 0 }} }, 207*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi_128B, {{ 2, false, 1, 0 }} }, 208*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi_acc, {{ 3, false, 1, 0 }} }, 209*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi_acc_128B, 210*0fca6ea1SDimitry Andric {{ 3, false, 1, 0 }} }, 211*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi, {{ 2, false, 1, 0 }} }, 212*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi_128B, {{ 2, false, 1, 0 }} }, 213*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi_acc, {{ 3, false, 1, 0 }} }, 214*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi_acc_128B, 215*0fca6ea1SDimitry Andric {{ 3, false, 1, 0 }} }, 216*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi, {{ 2, false, 1, 0 }} }, 217*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi_128B, {{ 2, false, 1, 0 }} }, 218*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi_acc, {{ 3, false, 1, 0 }} }, 219*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi_acc_128B, 220*0fca6ea1SDimitry Andric {{ 3, false, 1, 0 }} }, 221*0fca6ea1SDimitry Andric 222*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10, {{ 2, false, 2, 0 }} }, 223*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10_128B, 224*0fca6ea1SDimitry Andric {{ 2, false, 2, 0 }} }, 225*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10_vxx, 226*0fca6ea1SDimitry Andric {{ 3, false, 2, 0 }} }, 227*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10_vxx_128B, 228*0fca6ea1SDimitry Andric {{ 3, false, 2, 0 }} }, 229*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10, {{ 2, false, 2, 0 }} }, 230*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10_128B, 231*0fca6ea1SDimitry Andric {{ 2, false, 2, 0 }} }, 232*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10_vxx, 233*0fca6ea1SDimitry Andric {{ 3, false, 2, 0 }} }, 234*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10_vxx_128B, 235*0fca6ea1SDimitry Andric {{ 3, false, 2, 0 }} }, 236*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvvbi, {{ 2, false, 3, 0 }} }, 237*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvvbi_128B, {{ 2, false, 3, 0 }} }, 238*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvvb_oracci, {{ 3, false, 3, 0 }} }, 239*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvvb_oracci_128B, 240*0fca6ea1SDimitry Andric {{ 3, false, 3, 0 }} }, 241*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvwhi, {{ 2, false, 3, 0 }} }, 242*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvwhi_128B, {{ 2, false, 3, 0 }} }, 243*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvwh_oracci, {{ 3, false, 3, 0 }} }, 244*0fca6ea1SDimitry Andric { Hexagon::BI__builtin_HEXAGON_V6_vlutvwh_oracci_128B, 245*0fca6ea1SDimitry Andric {{ 3, false, 3, 0 }} }, 246*0fca6ea1SDimitry Andric }; 247*0fca6ea1SDimitry Andric 248*0fca6ea1SDimitry Andric // Use a dynamically initialized static to sort the table exactly once on 249*0fca6ea1SDimitry Andric // first run. 250*0fca6ea1SDimitry Andric static const bool SortOnce = 251*0fca6ea1SDimitry Andric (llvm::sort(Infos, 252*0fca6ea1SDimitry Andric [](const BuiltinInfo &LHS, const BuiltinInfo &RHS) { 253*0fca6ea1SDimitry Andric return LHS.BuiltinID < RHS.BuiltinID; 254*0fca6ea1SDimitry Andric }), 255*0fca6ea1SDimitry Andric true); 256*0fca6ea1SDimitry Andric (void)SortOnce; 257*0fca6ea1SDimitry Andric 258*0fca6ea1SDimitry Andric const BuiltinInfo *F = llvm::partition_point( 259*0fca6ea1SDimitry Andric Infos, [=](const BuiltinInfo &BI) { return BI.BuiltinID < BuiltinID; }); 260*0fca6ea1SDimitry Andric if (F == std::end(Infos) || F->BuiltinID != BuiltinID) 261*0fca6ea1SDimitry Andric return false; 262*0fca6ea1SDimitry Andric 263*0fca6ea1SDimitry Andric bool Error = false; 264*0fca6ea1SDimitry Andric 265*0fca6ea1SDimitry Andric for (const ArgInfo &A : F->Infos) { 266*0fca6ea1SDimitry Andric // Ignore empty ArgInfo elements. 267*0fca6ea1SDimitry Andric if (A.BitWidth == 0) 268*0fca6ea1SDimitry Andric continue; 269*0fca6ea1SDimitry Andric 270*0fca6ea1SDimitry Andric int32_t Min = A.IsSigned ? -(1 << (A.BitWidth - 1)) : 0; 271*0fca6ea1SDimitry Andric int32_t Max = (1 << (A.IsSigned ? A.BitWidth - 1 : A.BitWidth)) - 1; 272*0fca6ea1SDimitry Andric if (!A.Align) { 273*0fca6ea1SDimitry Andric Error |= SemaRef.BuiltinConstantArgRange(TheCall, A.OpNum, Min, Max); 274*0fca6ea1SDimitry Andric } else { 275*0fca6ea1SDimitry Andric unsigned M = 1 << A.Align; 276*0fca6ea1SDimitry Andric Min *= M; 277*0fca6ea1SDimitry Andric Max *= M; 278*0fca6ea1SDimitry Andric Error |= SemaRef.BuiltinConstantArgRange(TheCall, A.OpNum, Min, Max); 279*0fca6ea1SDimitry Andric Error |= SemaRef.BuiltinConstantArgMultiple(TheCall, A.OpNum, M); 280*0fca6ea1SDimitry Andric } 281*0fca6ea1SDimitry Andric } 282*0fca6ea1SDimitry Andric return Error; 283*0fca6ea1SDimitry Andric } 284*0fca6ea1SDimitry Andric 285*0fca6ea1SDimitry Andric bool SemaHexagon::CheckHexagonBuiltinFunctionCall(unsigned BuiltinID, 286*0fca6ea1SDimitry Andric CallExpr *TheCall) { 287*0fca6ea1SDimitry Andric return CheckHexagonBuiltinArgument(BuiltinID, TheCall); 288*0fca6ea1SDimitry Andric } 289*0fca6ea1SDimitry Andric 290*0fca6ea1SDimitry Andric } // namespace clang 291