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) /* The ordering of the codes between OMP_PARALLEL and OMP_CRITICAL is exposed to TREE_RANGE_CHECK. */ /* 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. 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 standard. */ DEFTREECODE (OMP_FOR, "omp_for", tcc_statement, 6) /* OpenMP - #pragma omp simd [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OMP_SIMD, "omp_simd", tcc_statement, 6) /* Cilk Plus - #pragma simd [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (CILK_SIMD, "cilk_simd", tcc_statement, 6) /* Cilk Plus - _Cilk_for (..) Operands like for OMP_FOR. */ DEFTREECODE (CILK_FOR, "cilk_for", tcc_statement, 6) /* OpenMP - #pragma omp distribute [clause1 ... clauseN] Operands like for OMP_FOR. */ DEFTREECODE (OMP_DISTRIBUTE, "omp_distribute", tcc_statement, 6) /* 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 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 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) /* OpenMP - #pragma omp taskgroup Operand 0: OMP_TASKGROUP_BODY: Taskgroup body. */ DEFTREECODE (OMP_TASKGROUP, "omp_taskgroup", tcc_statement, 1) /* OpenMP - #pragma omp ordered Operand 0: OMP_ORDERED_BODY: Master section body. */ DEFTREECODE (OMP_ORDERED, "omp_ordered", tcc_statement, 1) /* OpenMP - #pragma omp critical [name] Operand 0: OMP_CRITICAL_BODY: Critical section body. Operand 1: OMP_CRITICAL_NAME: Identifier for critical section. */ DEFTREECODE (OMP_CRITICAL, "omp_critical", tcc_statement, 2) /* 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) /* 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) /* Reduction operations. Operations that take a vector of elements and "reduce" it to a scalar result (e.g. summing the elements of the vector, finding the minimum over the vector elements, etc). Operand 0 is a vector. The expression returns a scalar, with type the same as the elements of the vector, holding the result of the reduction of all elements of the operand. */ DEFTREECODE (REDUC_MAX_EXPR, "reduc_max_expr", tcc_unary, 1) DEFTREECODE (REDUC_MIN_EXPR, "reduc_min_expr", tcc_unary, 1) DEFTREECODE (REDUC_PLUS_EXPR, "reduc_plus_expr", tcc_unary, 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) /* Fused multiply-add. All operands and the result are of the same type. No intermediate rounding is performed after multiplying operand one with operand two before adding operand three. */ DEFTREECODE (FMA_EXPR, "fma_expr", tcc_expression, 3) /* 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) /* 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) /* 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. */ DEFTREECODE (ANNOTATE_EXPR, "annotate_expr", tcc_expression, 2) /* Cilk spawn statement Operand 0 is the CALL_EXPR. */ DEFTREECODE (CILK_SPAWN_STMT, "cilk_spawn_stmt", tcc_statement, 1) /* Cilk Sync statement: Does not have any operands. */ DEFTREECODE (CILK_SYNC_STMT, "cilk_sync_stmt", tcc_statement, 0) /* Local variables: mode:c End: */