📄 rtl.def
字号:
/* A scratch register. This represents a register used only within a single insn. It will be turned into a REG during register allocation or reload unless the constraint indicates that the register won't be needed, in which case it can remain a SCRATCH. This code is marked as having one operand so it can be turned into a REG. */DEF_RTL_EXPR(SCRATCH, "scratch", "0", 'o')/* One word of a multi-word value. The first operand is the complete value; the second says which word. The WORDS_BIG_ENDIAN flag controls whether word number 0 (as numbered in a SUBREG) is the most or least significant word. This is also used to refer to a value in a different machine mode. For example, it can be used to refer to a SImode value as if it were Qimode, or vice versa. Then the word number is always 0. */DEF_RTL_EXPR(SUBREG, "subreg", "ei", 'x')/* This one-argument rtx is used for move instructions that are guaranteed to alter only the low part of a destination. Thus, (SET (SUBREG:HI (REG...)) (MEM:HI ...)) has an unspecified effect on the high part of REG, but (SET (STRICT_LOW_PART (SUBREG:HI (REG...))) (MEM:HI ...)) is guaranteed to alter only the bits of REG that are in HImode. The actual instruction used is probably the same in both cases, but the register constraints may be tighter when STRICT_LOW_PART is in use. */DEF_RTL_EXPR(STRICT_LOW_PART, "strict_low_part", "e", 'x')/* A memory location; operand is the address. Can be nested inside a VOLATILE. */DEF_RTL_EXPR(MEM, "mem", "e", 'o')/* Reference to an assembler label in the code for this function. The operand is a CODE_LABEL found in the insn chain. The unprinted fields 1 and 2 are used in flow.c for the LABEL_NEXTREF and CONTAINING_INSN. */DEF_RTL_EXPR(LABEL_REF, "label_ref", "u00", 'o')/* Reference to a named label: the string that is the first operand, with `_' added implicitly in front. Exception: if the first character explicitly given is `*', to give it to the assembler, remove the `*' and do not add `_'. */DEF_RTL_EXPR(SYMBOL_REF, "symbol_ref", "s", 'o')/* The condition code register is represented, in our imagination, as a register holding a value that can be compared to zero. In fact, the machine has already compared them and recorded the results; but instructions that look at the condition code pretend to be looking at the entire value and comparing it. */DEF_RTL_EXPR(CC0, "cc0", "", 'o')/* ===================================================================== A QUEUED expression really points to a member of the queue of instructions to be output later for postincrement/postdecrement. QUEUED expressions never become part of instructions. When a QUEUED expression would be put into an instruction, instead either the incremented variable or a copy of its previous value is used. Operands are: 0. the variable to be incremented (a REG rtx). 1. the incrementing instruction, or 0 if it hasn't been output yet. 2. A REG rtx for a copy of the old value of the variable, or 0 if none yet. 3. the body to use for the incrementing instruction 4. the next QUEUED expression in the queue. ====================================================================== */DEF_RTL_EXPR(QUEUED, "queued", "eeeee", 'x')/* ---------------------------------------------------------------------- Expressions for operators in an rtl pattern ---------------------------------------------------------------------- *//* if_then_else. This is used in representing ordinary conditional jump instructions. Operand: 0: condition 1: then expr 2: else expr */DEF_RTL_EXPR(IF_THEN_ELSE, "if_then_else", "eee", '3')/* General conditional. The first operand is a vector composed of pairs of expressions. The first element of each pair is evaluated, in turn. The value of the conditional is the second expression of the first pair whose first expression evaluates non-zero. If none of the expressions is true, the second operand will be used as the value of the conditional. This should be replaced with use of IF_THEN_ELSE. */DEF_RTL_EXPR(COND, "cond", "Ee", 'x')/* Comparison, produces a condition code result. */DEF_RTL_EXPR(COMPARE, "compare", "ee", '2')/* plus */DEF_RTL_EXPR(PLUS, "plus", "ee", 'c')/* Operand 0 minus operand 1. */DEF_RTL_EXPR(MINUS, "minus", "ee", '2')/* Minus operand 0. */DEF_RTL_EXPR(NEG, "neg", "e", '1')DEF_RTL_EXPR(MULT, "mult", "ee", 'c')/* Operand 0 divided by operand 1. */DEF_RTL_EXPR(DIV, "div", "ee", '2')/* Remainder of operand 0 divided by operand 1. */DEF_RTL_EXPR(MOD, "mod", "ee", '2')/* Unsigned divide and remainder. */DEF_RTL_EXPR(UDIV, "udiv", "ee", '2')DEF_RTL_EXPR(UMOD, "umod", "ee", '2')/* Bitwise operations. */DEF_RTL_EXPR(AND, "and", "ee", 'c')DEF_RTL_EXPR(IOR, "ior", "ee", 'c')DEF_RTL_EXPR(XOR, "xor", "ee", 'c')DEF_RTL_EXPR(NOT, "not", "e", '1')/* Operand: 0: value to be shifted. 1: number of bits. ASHIFT and LSHIFT are distinguished because on some machines these allow a negative operand and shift right in that case. */DEF_RTL_EXPR(LSHIFT, "lshift", "ee", '2')DEF_RTL_EXPR(ASHIFT, "ashift", "ee", '2')DEF_RTL_EXPR(ROTATE, "rotate", "ee", '2')/* Right shift operations, for machines where these are not the same as left shifting with a negative argument. */DEF_RTL_EXPR(ASHIFTRT, "ashiftrt", "ee", '2')DEF_RTL_EXPR(LSHIFTRT, "lshiftrt", "ee", '2')DEF_RTL_EXPR(ROTATERT, "rotatert", "ee", '2')/* Minimum and maximum values of two operands. We need both signed and unsigned forms. (We cannot use MIN for SMIN because it conflicts with a macro of the same name.) */DEF_RTL_EXPR(SMIN, "smin", "ee", 'c')DEF_RTL_EXPR(SMAX, "smax", "ee", 'c')DEF_RTL_EXPR(UMIN, "umin", "ee", 'c')DEF_RTL_EXPR(UMAX, "umax", "ee", 'c')/* These unary operations are used to represent incrementation and decrementation as they occur in memory addresses. The amount of increment or decrement are not represented because they can be understood from the machine-mode of the containing MEM. These operations exist in only two cases: 1. pushes onto the stack. 2. created automatically by the life_analysis pass in flow.c. */DEF_RTL_EXPR(PRE_DEC, "pre_dec", "e", 'x')DEF_RTL_EXPR(PRE_INC, "pre_inc", "e", 'x')DEF_RTL_EXPR(POST_DEC, "post_dec", "e", 'x')DEF_RTL_EXPR(POST_INC, "post_inc", "e", 'x')/* Comparison operations. The ordered comparisons exist in two flavors, signed and unsigned. */DEF_RTL_EXPR(NE, "ne", "ee", '<')DEF_RTL_EXPR(EQ, "eq", "ee", '<')DEF_RTL_EXPR(GE, "ge", "ee", '<')DEF_RTL_EXPR(GT, "gt", "ee", '<')DEF_RTL_EXPR(LE, "le", "ee", '<')DEF_RTL_EXPR(LT, "lt", "ee", '<')DEF_RTL_EXPR(GEU, "geu", "ee", '<')DEF_RTL_EXPR(GTU, "gtu", "ee", '<')DEF_RTL_EXPR(LEU, "leu", "ee", '<')DEF_RTL_EXPR(LTU, "ltu", "ee", '<')/* Represents the result of sign-extending the sole operand. The machine modes of the operand and of the SIGN_EXTEND expression determine how much sign-extension is going on. */DEF_RTL_EXPR(SIGN_EXTEND, "sign_extend", "e", '1')/* Similar for zero-extension (such as unsigned short to int). */DEF_RTL_EXPR(ZERO_EXTEND, "zero_extend", "e", '1')/* Similar but here the operand has a wider mode. */DEF_RTL_EXPR(TRUNCATE, "truncate", "e", '1')/* Similar for extending floating-point values (such as SFmode to DFmode). */DEF_RTL_EXPR(FLOAT_EXTEND, "float_extend", "e", '1')DEF_RTL_EXPR(FLOAT_TRUNCATE, "float_truncate", "e", '1')/* Conversion of fixed point operand to floating point value. */DEF_RTL_EXPR(FLOAT, "float", "e", '1')/* With fixed-point machine mode: Conversion of floating point operand to fixed point value. Value is defined only when the operand's value is an integer. With floating-point machine mode (and operand with same mode): Operand is rounded toward zero to produce an integer value represented in floating point. */DEF_RTL_EXPR(FIX, "fix", "e", '1')/* Conversion of unsigned fixed point operand to floating point value. */DEF_RTL_EXPR(UNSIGNED_FLOAT, "unsigned_float", "e", '1')/* With fixed-point machine mode: Conversion of floating point operand to *unsigned* fixed point value. Value is defined only when the operand's value is an integer. */DEF_RTL_EXPR(UNSIGNED_FIX, "unsigned_fix", "e", '1')/* Absolute value */DEF_RTL_EXPR(ABS, "abs", "e", '1')/* Square root */DEF_RTL_EXPR(SQRT, "sqrt", "e", '1')/* Find first bit that is set. Value is 1 + number of trailing zeros in the arg., or 0 if arg is 0. */DEF_RTL_EXPR(FFS, "ffs", "e", '1')/* Reference to a signed bit-field of specified size and position. Operand 0 is the memory unit (usually SImode or QImode) which contains the field's first bit. Operand 1 is the width, in bits. Operand 2 is the number of bits in the memory unit before the first bit of this field. If BITS_BIG_ENDIAN is defined, the first bit is the msb and operand 2 counts from the msb of the memory unit. Otherwise, the first bit is the lsb and operand 2 counts from the lsb of the memory unit. */DEF_RTL_EXPR(SIGN_EXTRACT, "sign_extract", "eee", 'b')/* Similar for unsigned bit-field. */DEF_RTL_EXPR(ZERO_EXTRACT, "zero_extract", "eee", 'b')/* For RISC machines. These save memory when splitting insns. *//* HIGH are the high-order bits of a constant expression. */DEF_RTL_EXPR(HIGH, "high", "e", 'o')/* LO_SUM is the sum of a register and the low-order bits of a constant expression. */DEF_RTL_EXPR(LO_SUM, "lo_sum", "ee", 'o')/*Local variables:mode:cversion-control: tEnd:*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -