is equivalent to ((typeof(c))p)->x... where x... is a chain of component references offsetting p by c. */ DEFTREECODE (MEM_REF, "mem_ref", tcc_reference, 2) /* OpenACC and OpenMP. As it is exposed in TREE_RANGE_CHECK invocations, do not change the ordering of these codes. */ /* OpenACC - #pragma acc parallel [clause1 ... clauseN] Operand 0: OMP_BODY: Code to be executed in parallel. Operand 1: OMP_CLAUSES: List of clauses. */ DEFTREECODE (OACC_PARALLEL, "oacc_parallel", tcc_statement, 2) /* OpenACC - #pragma acc kernels [clause1 ... clauseN] Operand 0: OMP_BODY: Sequence of kernels. Operand 1: OMP_CLAUSES: List of clauses. */ DEFTREECODE (OACC_KERNELS, "oacc_kernels", tcc_statement, 2) /* OpenACC - #pragma acc serial [clause1 ... clauseN] Operand 0: OMP_BODY: Code to be executed sequentially. Operand 1: OMP_CLAUSES: List of clauses. */ DEFTREECODE (OACC_SERIAL, "oacc_serial", tcc_statement, 2) /* OpenACC - #pragma acc data [clause1 ... clauseN] Operand 0: OACC_DATA_BODY: Data construct body. Operand 1: OACC_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OACC_DATA, "oacc_data", tcc_statement, 2) /* OpenACC - #pragma acc host_data [clause1 ... clauseN] Operand 0: OACC_HOST_DATA_BODY: Host_data construct body. Operand 1: OACC_HOST_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OACC_HOST_DATA, "oacc_host_data", tcc_statement, 2) /* OpenMP - #pragma omp parallel [clause1 ... clauseN] Operand 0: OMP_PARALLEL_BODY: Code to be executed by all threads. Operand 1: OMP_PARALLEL_CLAUSES: List of clauses. */ DEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 2) /* OpenMP - #pragma omp task [clause1 ... clauseN] Operand 0: OMP_TASK_BODY: Code to be executed by all threads. Operand 1: OMP_TASK_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TASK, "omp_task", tcc_statement, 2) /* OpenMP - #pragma omp for [clause1 ... clauseN] A single OMP_FOR node represents an entire nest of collapsed loops; as noted below, some of its arguments are vectors of length equal to the collapse depth, and the corresponding elements holding data specific to a particular loop in the nest. These vectors are numbered from the outside in so that the outermost loop is element 0. These constructs have seven operands: Operand 0: OMP_FOR_BODY contains the loop body. Operand 1: OMP_FOR_CLAUSES is the list of clauses associated with the directive. Operand 2: OMP_FOR_INIT is a vector containing iteration variable initializations of the form VAR = N1. Operand 3: OMP_FOR_COND is vector containing loop conditional expressions of the form VAR {<,>,<=,>=,!=} N2. Operand 4: OMP_FOR_INCR is a vector containing loop index increment expressions of the form VAR {+=,-=} INCR. Operand 5: OMP_FOR_PRE_BODY contains side effect code from operands OMP_FOR_INIT, OMP_FOR_COND and OMP_FOR_INCR. These side effects are part of the OMP_FOR block but must be evaluated before the start of loop body. OMP_FOR_PRE_BODY specifically includes DECL_EXPRs for iteration variables that are declared in the nested for loops. Note this field is not a vector; it may be null, but otherwise is usually a statement list collecting the side effect code from all the collapsed loops. Operand 6: OMP_FOR_ORIG_DECLS holds VAR_DECLS for the original user-specified iterator variables in the source code. In some cases, like C++ class iterators or range for with decomposition, the for loop is rewritten by the front end to use a temporary iteration variable. The purpose of this field is to make the original variables available to the gimplifier so it can adjust their data-sharing attributes and diagnose errors. OMP_FOR_ORIG_DECLS is a vector field, with each element holding a list of VAR_DECLS for the corresponding collapse level. The loop index variable VAR must be an integer variable, which is implicitly private to each thread. For rectangular loops, the bounds N1 and N2 and the increment expression INCR are required to be loop-invariant integer expressions that are evaluated without any synchronization. The evaluation order, frequency of evaluation and side effects are otherwise unspecified by the standard. For non-rectangular loops, in which the bounds of an inner loop depend on the index of an outer loop, the bit OMP_FOR_NON_RECTANGULAR must be set. In this case N1 and N2 are not ordinary expressions, but instead a TREE_VEC with three elements: the DECL for the outer loop variable, a multiplication factor, and an offset. */ DEFTREECODE (OMP_FOR, "omp_for", tcc_statement, 7) /* OpenMP - #pragma omp simd [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OMP_SIMD, "omp_simd", tcc_statement, 7) /* OpenMP - #pragma omp distribute [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OMP_DISTRIBUTE, "omp_distribute", tcc_statement, 7) /* OpenMP - #pragma omp taskloop [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OMP_TASKLOOP, "omp_taskloop", tcc_statement, 7) /* OpenMP - #pragma omp loop [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OMP_LOOP, "omp_loop", tcc_statement, 7) /* OpenMP - #pragma acc loop [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OACC_LOOP, "oacc_loop", tcc_statement, 7) /* OpenMP - #pragma omp teams [clause1 ... clauseN] Operand 0: OMP_TEAMS_BODY: Teams body. Operand 1: OMP_TEAMS_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TEAMS, "omp_teams", tcc_statement, 2) /* OpenMP - #pragma omp target data [clause1 ... clauseN] Operand 0: OMP_TARGET_DATA_BODY: Target data construct body. Operand 1: OMP_TARGET_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TARGET_DATA, "omp_target_data", tcc_statement, 2) /* OpenMP - #pragma omp target [clause1 ... clauseN] Operand 0: OMP_TARGET_BODY: Target construct body. Operand 1: OMP_TARGET_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TARGET, "omp_target", tcc_statement, 2) /* OpenMP - #pragma omp sections [clause1 ... clauseN] Operand 0: OMP_SECTIONS_BODY: Sections body. Operand 1: OMP_SECTIONS_CLAUSES: List of clauses. */ DEFTREECODE (OMP_SECTIONS, "omp_sections", tcc_statement, 2) /* OpenMP - #pragma omp ordered Operand 0: OMP_ORDERED_BODY: Master section body. Operand 1: OMP_ORDERED_CLAUSES: List of clauses. */ DEFTREECODE (OMP_ORDERED, "omp_ordered", tcc_statement, 2) /* OpenMP - #pragma omp critical [name] Operand 0: OMP_CRITICAL_BODY: Critical section body. Operand 1: OMP_CRITICAL_CLAUSES: List of clauses. Operand 2: OMP_CRITICAL_NAME: Identifier for critical section. */ DEFTREECODE (OMP_CRITICAL, "omp_critical", tcc_statement, 3) /* OpenMP - #pragma omp single Operand 0: OMP_SINGLE_BODY: Single section body. Operand 1: OMP_SINGLE_CLAUSES: List of clauses. */ DEFTREECODE (OMP_SINGLE, "omp_single", tcc_statement, 2) /* OpenMP - #pragma omp scope Operand 0: OMP_SCOPE_BODY: Masked section body. Operand 1: OMP_SCOPE_CLAUSES: List of clauses. */ DEFTREECODE (OMP_SCOPE, "omp_scope", tcc_statement, 2) /* OpenMP - #pragma omp taskgroup Operand 0: OMP_TASKGROUP_BODY: Taskgroup body. Operand 1: OMP_SINGLE_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TASKGROUP, "omp_taskgroup", tcc_statement, 2) /* OpenMP - #pragma omp masked Operand 0: OMP_MASKED_BODY: Masked section body. Operand 1: OMP_MASKED_CLAUSES: List of clauses. */ DEFTREECODE (OMP_MASKED, "omp_masked", tcc_statement, 2) /* OpenMP - #pragma omp scan Operand 0: OMP_SCAN_BODY: Scan body. Operand 1: OMP_SCAN_CLAUSES: List of clauses. */ DEFTREECODE (OMP_SCAN, "omp_scan", tcc_statement, 2) /* OpenMP - #pragma omp section Operand 0: OMP_SECTION_BODY: Section body. */ DEFTREECODE (OMP_SECTION, "omp_section", tcc_statement, 1) /* OpenMP - #pragma omp master Operand 0: OMP_MASTER_BODY: Master section body. */ DEFTREECODE (OMP_MASTER, "omp_master", tcc_statement, 1) /* OpenACC - #pragma acc cache (variable1 ... variableN) Operand 0: OACC_CACHE_CLAUSES: List of variables (transformed into OMP_CLAUSE__CACHE_ clauses). */ DEFTREECODE (OACC_CACHE, "oacc_cache", tcc_statement, 1) /* OpenACC - #pragma acc declare [clause1 ... clauseN] Operand 0: OACC_DECLARE_CLAUSES: List of clauses. */ DEFTREECODE (OACC_DECLARE, "oacc_declare", tcc_statement, 1) /* OpenACC - #pragma acc enter data [clause1 ... clauseN] Operand 0: OACC_ENTER_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OACC_ENTER_DATA, "oacc_enter_data", tcc_statement, 1) /* OpenACC - #pragma acc exit data [clause1 ... clauseN] Operand 0: OACC_EXIT_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OACC_EXIT_DATA, "oacc_exit_data", tcc_statement, 1) /* OpenACC - #pragma acc update [clause1 ... clauseN] Operand 0: OACC_UPDATE_CLAUSES: List of clauses. */ DEFTREECODE (OACC_UPDATE, "oacc_update", tcc_statement, 1) /* OpenMP - #pragma omp target update [clause1 ... clauseN] Operand 0: OMP_TARGET_UPDATE_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TARGET_UPDATE, "omp_target_update", tcc_statement, 1) /* OpenMP - #pragma omp target enter data [clause1 ... clauseN] Operand 0: OMP_TARGET_ENTER_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TARGET_ENTER_DATA, "omp_target_enter_data", tcc_statement, 1) /* OpenMP - #pragma omp target exit data [clause1 ... clauseN] Operand 0: OMP_TARGET_EXIT_DATA_CLAUSES: List of clauses. */ DEFTREECODE (OMP_TARGET_EXIT_DATA, "omp_target_exit_data", tcc_statement, 1) /* OMP_ATOMIC through OMP_ATOMIC_CAPTURE_NEW must be consecutive, or OMP_ATOMIC_SEQ_CST needs adjusting. */ /* OpenMP - #pragma omp atomic Operand 0: The address at which the atomic operation is to be performed. This address should be stabilized with save_expr. Operand 1: The expression to evaluate. When the old value of the object at the address is used in the expression, it should appear as if build_fold_indirect_ref of the address. */ DEFTREECODE (OMP_ATOMIC, "omp_atomic", tcc_statement, 2) /* OpenMP - #pragma omp atomic read Operand 0: The address at which the atomic operation is to be performed. This address should be stabilized with save_expr. */ DEFTREECODE (OMP_ATOMIC_READ, "omp_atomic_read", tcc_statement, 1) /* OpenMP - #pragma omp atomic capture Operand 0: The address at which the atomic operation is to be performed. This address should be stabilized with save_expr. Operand 1: The expression to evaluate. When the old value of the object at the address is used in the expression, it should appear as if build_fold_indirect_ref of the address. OMP_ATOMIC_CAPTURE_OLD returns the old memory content, OMP_ATOMIC_CAPTURE_NEW the new value. */ DEFTREECODE (OMP_ATOMIC_CAPTURE_OLD, "omp_atomic_capture_old", tcc_statement, 2) DEFTREECODE (OMP_ATOMIC_CAPTURE_NEW, "omp_atomic_capture_new", tcc_statement, 2) /* OpenMP clauses. */ DEFTREECODE (OMP_CLAUSE, "omp_clause", tcc_exceptional, 0) /* TRANSACTION_EXPR tree code. Operand 0: BODY: contains body of the transaction. */ DEFTREECODE (TRANSACTION_EXPR, "transaction_expr", tcc_expression, 1) /* Widening dot-product. The first two arguments are of type t1. The third argument and the result are of type t2, such that t2 is at least twice the size of t1. DOT_PROD_EXPR(arg1,arg2,arg3) is equivalent to: tmp = WIDEN_MULT_EXPR(arg1, arg2); arg3 = PLUS_EXPR (tmp, arg3); or: tmp = WIDEN_MULT_EXPR(arg1, arg2); arg3 = WIDEN_SUM_EXPR (tmp, arg3); */ DEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3) /* Widening summation. The first argument is of type t1. The second argument is of type t2, such that t2 is at least twice the size of t1. The type of the entire expression is also t2. WIDEN_SUM_EXPR is equivalent to first widening (promoting) the first argument from type t1 to type t2, and then summing it with the second argument. */ DEFTREECODE (WIDEN_SUM_EXPR, "widen_sum_expr", tcc_binary, 2) /* Widening sad (sum of absolute differences). The first two arguments are of type t1 which should be a vector of integers. The third argument and the result are of type t2, such that the size of the elements of t2 is at least twice the size of the elements of t1. Like DOT_PROD_EXPR, SAD_EXPR (arg1,arg2,arg3) is equivalent to: tmp = IFN_VEC_WIDEN_MINUS_EXPR (arg1, arg2) tmp2 = ABS_EXPR (tmp) arg3 = PLUS_EXPR (tmp2, arg3) or: tmp = IFN_VEC_WIDEN_MINUS_EXPR (arg1, arg2) tmp2 = ABS_EXPR (tmp) arg3 = WIDEN_SUM_EXPR (tmp2, arg3) */ DEFTREECODE (SAD_EXPR, "sad_expr", tcc_expression, 3) /* Widening multiplication. The two arguments are of type t1 and t2, both integral types that have the same precision, but possibly different signedness. The result is of integral type t3, such that t3 is at least twice the size of t1/t2. WIDEN_MULT_EXPR is equivalent to first widening (promoting) the arguments from type t1 to type t3, and from t2 to type t3 and then multiplying them. */ DEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2) /* Widening multiply-accumulate. The first two arguments are of type t1. The third argument and the result are of type t2, such as t2 is at least twice the size of t1. t1 and t2 must be integral or fixed-point types. The expression is equivalent to a WIDEN_MULT_EXPR operation of the first two operands followed by an add or subtract of the third operand. */ DEFTREECODE (WIDEN_MULT_PLUS_EXPR, "widen_mult_plus_expr", tcc_expression, 3) /* This is like the above, except in the final expression the multiply result is subtracted from t3. */ DEFTREECODE (WIDEN_MULT_MINUS_EXPR, "widen_mult_minus_expr", tcc_expression, 3) /* Widening shift left. The first operand is of type t1. The second operand is the number of bits to shift by; it need not be the same type as the first operand and result. Note that the result is undefined if the second operand is larger than or equal to the first operand's type size. The type of the entire expression is t2, such that t2 is at least twice the size of t1. WIDEN_LSHIFT_EXPR is equivalent to first widening (promoting) the first argument from type t1 to type t2, and then shifting it by the second argument. */ DEFTREECODE (WIDEN_LSHIFT_EXPR, "widen_lshift_expr", tcc_binary, 2) /* Widening vector multiplication. The two operands are vectors with N elements of size S. Multiplying the elements of the two vectors will result in N products of size 2*S. VEC_WIDEN_MULT_HI_EXPR computes the N/2 high products. VEC_WIDEN_MULT_LO_EXPR computes the N/2 low products. */ DEFTREECODE (VEC_WIDEN_MULT_HI_EXPR, "widen_mult_hi_expr", tcc_binary, 2) DEFTREECODE (VEC_WIDEN_MULT_LO_EXPR, "widen_mult_lo_expr", tcc_binary, 2) /* Similarly, but return the even or odd N/2 products. */ DEFTREECODE (VEC_WIDEN_MULT_EVEN_EXPR, "widen_mult_even_expr", tcc_binary, 2) DEFTREECODE (VEC_WIDEN_MULT_ODD_EXPR, "widen_mult_odd_expr", tcc_binary, 2) /* Unpack (extract and promote/widen) the high/low elements of the input vector into the output vector. The input vector has twice as many elements as the output vector, that are half the size of the elements of the output vector. This is used to support type promotion. */ DEFTREECODE (VEC_UNPACK_HI_EXPR, "vec_unpack_hi_expr", tcc_unary, 1) DEFTREECODE (VEC_UNPACK_LO_EXPR, "vec_unpack_lo_expr", tcc_unary, 1) /* Unpack (extract) the high/low elements of the input vector, convert fixed point values to floating point and widen elements into the output vector. The input vector has twice as many elements as the output vector, that are half the size of the elements of the output vector. */ DEFTREECODE (VEC_UNPACK_FLOAT_HI_EXPR, "vec_unpack_float_hi_expr", tcc_unary, 1) DEFTREECODE (VEC_UNPACK_FLOAT_LO_EXPR, "vec_unpack_float_lo_expr", tcc_unary, 1) /* Unpack (extract) the high/low elements of the input vector, convert floating point values to integer and widen elements into the output vector. The input vector has twice as many elements as the output vector, that are half the size of the elements of the output vector. */ DEFTREECODE (VEC_UNPACK_FIX_TRUNC_HI_EXPR, "vec_unpack_fix_trunc_hi_expr", tcc_unary, 1) DEFTREECODE (VEC_UNPACK_FIX_TRUNC_LO_EXPR, "vec_unpack_fix_trunc_lo_expr", tcc_unary, 1) /* Pack (demote/narrow and merge) the elements of the two input vectors into the output vector using truncation/saturation. The elements of the input vectors are twice the size of the elements of the output vector. This is used to support type demotion. */ DEFTREECODE (VEC_PACK_TRUNC_EXPR, "vec_pack_trunc_expr", tcc_binary, 2) DEFTREECODE (VEC_PACK_SAT_EXPR, "vec_pack_sat_expr", tcc_binary, 2) /* Convert floating point values of the two input vectors to integer and pack (narrow and merge) the elements into the output vector. The elements of the input vector are twice the size of the elements of the output vector. */ DEFTREECODE (VEC_PACK_FIX_TRUNC_EXPR, "vec_pack_fix_trunc_expr", tcc_binary, 2) /* Convert fixed point values of the two input vectors to floating point and pack (narrow and merge) the elements into the output vector. The elements of the input vector are twice the size of the elements of the output vector. */ DEFTREECODE (VEC_PACK_FLOAT_EXPR, "vec_pack_float_expr", tcc_binary, 2) /* Widening vector shift left in bits. Operand 0 is a vector to be shifted with N elements of size S. Operand 1 is an integer shift amount in bits. The result of the operation is N elements of size 2*S. VEC_WIDEN_LSHIFT_HI_EXPR computes the N/2 high results. VEC_WIDEN_LSHIFT_LO_EXPR computes the N/2 low results. */ DEFTREECODE (VEC_WIDEN_LSHIFT_HI_EXPR, "widen_lshift_hi_expr", tcc_binary, 2) DEFTREECODE (VEC_WIDEN_LSHIFT_LO_EXPR, "widen_lshift_lo_expr", tcc_binary, 2) /* PREDICT_EXPR. Specify hint for branch prediction. The PREDICT_EXPR_PREDICTOR specify predictor and PREDICT_EXPR_OUTCOME the outcome (0 for not taken and 1 for taken). Once the profile is guessed all conditional branches leading to execution paths executing the PREDICT_EXPR will get predicted by the specified predictor. */ DEFTREECODE (PREDICT_EXPR, "predict_expr", tcc_expression, 1) /* OPTIMIZATION_NODE. Node to store the optimization options. */ DEFTREECODE (OPTIMIZATION_NODE, "optimization_node", tcc_exceptional, 0) /* TARGET_OPTION_NODE. Node to store the target specific options. */ DEFTREECODE (TARGET_OPTION_NODE, "target_option_node", tcc_exceptional, 0) /* ANNOTATE_EXPR. Operand 0 is the expression to be annotated. Operand 1 is the annotation kind. Operand 2 is additional data. */ DEFTREECODE (ANNOTATE_EXPR, "annotate_expr", tcc_expression, 3) /* Local variables: mode:c End: */