The TREE_TYPE points to the node for the type pointed to. */
DEFTREECODE (POINTER_TYPE, "pointer_type", tcc_type, 0)
+/* A reference is like a pointer except that it is coerced
+ automatically to the value it points to. Used in C++. */
+DEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
+
+/* The C++ decltype(nullptr) type. */
+DEFTREECODE (NULLPTR_TYPE, "nullptr_type", tcc_type, 0)
+
/* _Fract and _Accum types in Embedded-C. Different fixed-point types
are distinguished by machine mode and by the TYPE_SIZE and the
TYPE_PRECISION. */
DEFTREECODE (FIXED_POINT_TYPE, "fixed_point_type", tcc_type, 0)
-/* A reference is like a pointer except that it is coerced
- automatically to the value it points to. Used in C++. */
-DEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
-
/* The ordering of the following codes is optimized for the checking
macros in tree.h. Changing the order will degrade the speed of the
compiler. COMPLEX_TYPE, VECTOR_TYPE, ARRAY_TYPE. */
of the range is taken from the type of the expression. */
DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", tcc_reference, 4)
-/* The ordering of the following codes is optimized for the checking
- macros in tree.h. Changing the order will degrade the speed of the
- compiler. INDIRECT_REF, ALIGN_INDIRECT_REF, MISALIGNED_INDIRECT_REF. */
-
/* C unary `*' or Pascal `^'. One operand, an expression for a pointer. */
DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
-/* Like above, but aligns the referenced address (i.e, if the address
- in P is not aligned on TYPE_ALIGN boundary, then &(*P) != P). */
-DEFTREECODE (ALIGN_INDIRECT_REF, "align_indirect_ref", tcc_reference, 1)
-
-/* Same as INDIRECT_REF, but also specifies the alignment of the referenced
- address:
- Operand 0 is the referenced address (a pointer);
- Operand 1 is an INTEGER_CST which represents the alignment of the address,
- or 0 if the alignment is unknown. */
-DEFTREECODE (MISALIGNED_INDIRECT_REF, "misaligned_indirect_ref", tcc_reference, 2)
-
-/* Used to represent lookup of runtime type dependent data. Often this is
- a reference to a vtable, but it needn't be. Operands are:
+/* Used to represent lookup in a virtual method table which is dependent on
+ the runtime type of an object. Operands are:
OBJ_TYPE_REF_EXPR: An expression that evaluates the value to use.
OBJ_TYPE_REF_OBJECT: Is the object on whose behalf the lookup is
being performed. Through this the optimizers may be able to statically
determine the dynamic type of the object.
- OBJ_TYPE_REF_TOKEN: Something front-end specific used to resolve the
- reference to something simpler, usually to the address of a DECL.
- Never touched by the middle-end. Good choices would be either an
- identifier or a vtable index. */
+ OBJ_TYPE_REF_TOKEN: An integer index to the virtual method table. */
DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
/* Constructor: return an aggregate value made from specified components.
generated by the builtin targetm.vectorize.mask_for_load_builtin_decl. */
DEFTREECODE (REALIGN_LOAD_EXPR, "realign_load", tcc_expression, 3)
-/* Low-level memory addressing. Operands are SYMBOL (static or global
- variable), BASE (register), INDEX (register), STEP (integer constant),
- OFFSET (integer constant). Corresponding address is
- SYMBOL + BASE + STEP * INDEX + OFFSET. Only variations and values valid on
- the target are allowed.
+/* Low-level memory addressing. Operands are BASE (address of static or
+ global variable or register), OFFSET (integer constant),
+ INDEX (register), STEP (integer constant), INDEX2 (register),
+ The corresponding address is BASE + STEP * INDEX + INDEX2 + OFFSET.
+ Only variations and values valid on the target are allowed.
- The type of STEP, INDEX and OFFSET is sizetype. The type of BASE is
- sizetype or a pointer type (if SYMBOL is NULL).
+ The type of STEP, INDEX and INDEX2 is sizetype.
- The sixth argument is the reference to the original memory access, which
- is preserved for the purpose of alias analysis. */
+ The type of BASE is a pointer type. If BASE is not an address of
+ a static or global variable INDEX2 will be NULL.
-DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 6)
+ The type of OFFSET is a pointer type and determines TBAA the same as
+ the constant offset operand in MEM_REF. */
+
+DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 5)
+
+/* Memory addressing. Operands are a pointer and a tree constant integer
+ byte offset of the pointer type that when dereferenced yields the
+ type of the base object the pointer points into and which is used for
+ TBAA purposes.
+ The type of the MEM_REF is the type the bytes at the memory location
+ are interpreted as.
+ MEM_REF <p, c> 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. */
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. */