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
SemaHexagon(Sema & S)22*0fca6ea1SDimitry Andric SemaHexagon::SemaHexagon(Sema &S) : SemaBase(S) {}
23*0fca6ea1SDimitry Andric
CheckHexagonBuiltinArgument(unsigned BuiltinID,CallExpr * TheCall)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
CheckHexagonBuiltinFunctionCall(unsigned BuiltinID,CallExpr * TheCall)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