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. - Operand 2: OMP_PARALLEL_FN: FUNCTION_DECL used when outlining the - body of the parallel region. Only valid after - pass_lower_omp. - Operand 3: OMP_PARALLEL_DATA_ARG: Local variable in the parent - function containing data to be shared with the child - function. */ + Operand 1: OMP_PARALLEL_CLAUSES: List of clauses. */ + +DEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 2) -DEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 4) +/* 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. @@ -977,7 +998,7 @@ DEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 4) OMP_FOR structured block, but are evaluated before the loop body begins. - VAR must be a signed integer variable, which is implicitly thread + 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 @@ -986,11 +1007,8 @@ 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. - Operand 2: OMP_SECTIONS_SECTIONS: Vector of the different sections - in the body. Only valid after lowering and destroyed - after the CFG has been built. */ -DEFTREECODE (OMP_SECTIONS, "omp_sections", tcc_statement, 3) + 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. @@ -1025,31 +1043,28 @@ DEFTREECODE (OMP_ATOMIC, "omp_atomic", tcc_statement, 2) /* OpenMP clauses. */ DEFTREECODE (OMP_CLAUSE, "omp_clause", tcc_exceptional, 0) -/* Return from an OpenMP directive. */ -DEFTREECODE (OMP_RETURN_EXPR, "omp_return", tcc_statement, 0) - -/* Reduction operations. +/* 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. */ + 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) -/* Widenning dot-product. +/* 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: + or: tmp = WIDEN_MULT_EXPR(arg1, arg2); arg3 = WIDEN_SUM_EXPR (tmp, arg3); */ DEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3) -/* Widenning summation. +/* 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. @@ -1057,19 +1072,93 @@ DEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3) 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) - -/* Widenning multiplication. + +/* 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: