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 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 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 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 clauses. */ +DEFTREECODE (OMP_CLAUSE, "omp_clause", tcc_exceptional, 0) + +/* 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 first element in the vector has the result. + Operand 1 is a vector. */ +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 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_plus_expr", tcc_expression, 3) + +/* 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) + +/* Whole vector left/right shift in bits. + Operand 0 is a vector to be shifted. + Operand 1 is an integer shift amount in bits. */ +DEFTREECODE (VEC_LSHIFT_EXPR, "vec_lshift_expr", tcc_binary, 2) +DEFTREECODE (VEC_RSHIFT_EXPR, "vec_rshift_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) + +/* 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) + +/* Extract even/odd fields from vectors. */ +DEFTREECODE (VEC_EXTRACT_EVEN_EXPR, "vec_extracteven_expr", tcc_binary, 2) +DEFTREECODE (VEC_EXTRACT_ODD_EXPR, "vec_extractodd_expr", tcc_binary, 2) + +/* Merge input vectors interleaving their fields. */ +DEFTREECODE (VEC_INTERLEAVE_HIGH_EXPR, "vec_interleavehigh_expr", tcc_binary, 2) +DEFTREECODE (VEC_INTERLEAVE_LOW_EXPR, "vec_interleavelow_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) /* Local variables: