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 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] Operand 0: OMP_FOR_BODY: Loop body. Operand 1: OMP_FOR_CLAUSES: List of clauses. Operand 2: OMP_FOR_INIT: Initialization code of the form VAR = N1. Operand 3: OMP_FOR_COND: Loop conditional expression of the form VAR { <, >, <=, >= } N2. Operand 4: OMP_FOR_INCR: Loop index increment of the form VAR { +=, -= } INCR. Operand 5: OMP_FOR_PRE_BODY: Filled by the gimplifier with things from INIT, COND, and INCR that are technically part of the OMP_FOR structured block, but are evaluated before the loop body begins. Operand 6: OMP_FOR_ORIG_DECLS: If non-NULL, list of DECLs initialized in OMP_FOR_INIT. In some cases, like C++ iterators, the original DECL init has been lost in gimplification and now contains a temporary (D.nnnn). This list contains the original DECLs in the source. VAR must be an integer or pointer variable, which is implicitly thread private. N1, N2 and 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 unspecified by the standards. */ 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 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 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 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 integer. The third argument and the result are of type t2, such that t2 is at least twice the size of t1. Like DOT_PROD_EXPR, SAD_EXPR (arg1,arg2,arg3) is equivalent to (note we don't have WIDEN_MINUS_EXPR now, but we assume its behavior is similar to WIDEN_SUM_EXPR): tmp = WIDEN_MINUS_EXPR (arg1, arg2) tmp2 = ABS_EXPR (tmp) arg3 = PLUS_EXPR (tmp2, arg3) or: tmp = 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. The result is of type t2, such that t2 is at least twice the size of t1. WIDEN_MULT_EXPR is equivalent to first widening (promoting) the arguments from type t1 to type t2, 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: */