⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d30v.md

📁 gcc-you can use this code to learn something about gcc, and inquire further into linux,
💻 MD
📖 第 1 页 / 共 5 页
字号:
;; Mitsubishi D30V Machine description template;; Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.;; Contributed by Cygnus Solutions.;;;; This file is part of GNU CC.;;;; GNU CC is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation; either version 2, or (at your option);; any later version.;;;; GNU CC is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.;;;; You should have received a copy of the GNU General Public License;; along with GNU CC; see the file COPYING.  If not, write to;; the Free Software Foundation, 59 Temple Place - Suite 330,;; Boston, MA 02111-1307, USA.;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.;; ::::::::::::::::::::;; ::;; :: Constraints;; ::;; ::::::::::::::::::::;; Standard Constraints;;;; `m' A memory operand is allowed, with any kind of address that the;;     machine supports in general.;;;; `o' A memory operand is allowed, but only if the address is;;     "offsettable".  This means that adding a small integer (actually, the;;     width in bytes of the operand, as determined by its machine mode) may be;;     added to the address and the result is also a valid memory address.;;;; `V' A memory operand that is not offsettable.  In other words,;;     anything that would fit the `m' constraint but not the `o' constraint.;;;; `<' A memory operand with autodecrement addressing (either;;     predecrement or postdecrement) is allowed.;;;; `>' A memory operand with autoincrement addressing (either;;     preincrement or postincrement) is allowed.;;;; `r' A register operand is allowed provided that it is in a general;;     register.;;;; `d', `a', `f', ...;;     Other letters can be defined in machine-dependent fashion to stand for;;     particular classes of registers.  `d', `a' and `f' are defined on the;;     68000/68020 to stand for data, address and floating point registers.;;;; `i' An immediate integer operand (one with constant value) is allowed.;;     This includes symbolic constants whose values will be known only at;;     assembly time.;;;; `n' An immediate integer operand with a known numeric value is allowed.;;     Many systems cannot support assembly-time constants for operands less;;     than a word wide.  Constraints for these operands should use `n' rather;;     than `i'.;;;; 'I' First machine-dependent integer constant.;; 'J' Second machine-dependent integer constant.;; 'K' Third machine-dependent integer constant.;; 'L' Fourth machine-dependent integer constant.;; 'M' Fifth machine-dependent integer constant.;; 'N' Sixth machine-dependent integer constant.;; 'O' Seventh machine-dependent integer constant.;; 'P' Eighth machine-dependent integer constant.;;;;     Other letters in the range `I' through `P' may be defined in a;;     machine-dependent fashion to permit immediate integer operands with;;     explicit integer values in specified ranges.  For example, on the 68000,;;     `I' is defined to stand for the range of values 1 to 8.  This is the;;     range permitted as a shift count in the shift instructions.;;;; `E' An immediate floating operand (expression code `const_double') is;;     allowed, but only if the target floating point format is the same as;;     that of the host machine (on which the compiler is running).;;;; `F' An immediate floating operand (expression code `const_double') is;;     allowed.;;;; 'G' First machine-dependent const_double.;; 'H' Second machine-dependent const_double.;;;; `s' An immediate integer operand whose value is not an explicit;;     integer is allowed.;;;;     This might appear strange; if an insn allows a constant operand with a;;     value not known at compile time, it certainly must allow any known;;     value.  So why use `s' instead of `i'?  Sometimes it allows better code;;     to be generated.;;;;     For example, on the 68000 in a fullword instruction it is possible to;;     use an immediate operand; but if the immediate value is between -128 and;;     127, better code results from loading the value into a register and;;     using the register.  This is because the load into the register can be;;     done with a `moveq' instruction.  We arrange for this to happen by;;     defining the letter `K' to mean "any integer outside the range -128 to;;     127", and then specifying `Ks' in the operand constraints.;;;; `g' Any register, memory or immediate integer operand is allowed,;;     except for registers that are not general registers.;;;; `X' Any operand whatsoever is allowed, even if it does not satisfy;;     `general_operand'.  This is normally used in the constraint of a;;     `match_scratch' when certain alternatives will not actually require a;;     scratch register.;;;; `0' Match operand 0.;; `1' Match operand 1.;; `2' Match operand 2.;; `3' Match operand 3.;; `4' Match operand 4.;; `5' Match operand 5.;; `6' Match operand 6.;; `7' Match operand 7.;; `8' Match operand 8.;; `9' Match operand 9.;;;;     An operand that matches the specified operand number is allowed.  If a;;     digit is used together with letters within the same alternative, the;;     digit should come last.;;;;     This is called a "matching constraint" and what it really means is that;;     the assembler has only a single operand that fills two roles considered;;     separate in the RTL insn.  For example, an add insn has two input;;     operands and one output operand in the RTL, but on most CISC machines an;;     add instruction really has only two operands, one of them an;;     input-output operand:;;;;          addl #35,r12;;;;     Matching constraints are used in these circumstances.  More precisely,;;     the two operands that match must include one input-only operand and one;;     output-only operand.  Moreover, the digit must be a smaller number than;;     the number of the operand that uses it in the constraint.;;;;     For operands to match in a particular case usually means that they are;;     identical-looking RTL expressions.  But in a few special cases specific;;     kinds of dissimilarity are allowed.  For example, `*x' as an input;;     operand will match `*x++' as an output operand.  For proper results in;;     such cases, the output template should always use the output-operand's;;     number when printing the operand.;;;; `p' An operand that is a valid memory address is allowed.  This is for;;     "load address" and "push address" instructions.;;;;     `p' in the constraint must be accompanied by `address_operand' as the;;     predicate in the `match_operand'.  This predicate interprets the mode;;     specified in the `match_operand' as the mode of the memory reference for;;     which the address would be valid.;;;; `Q` First non constant, non register machine-dependent insns;; `R` Second non constant, non register machine-dependent insns;; `S` Third non constant, non register machine-dependent insns;; `T` Fourth non constant, non register machine-dependent insns;; `U` Fifth non constant, non register machine-dependent insns;;;;     Letters in the range `Q' through `U' may be defined in a;;     machine-dependent fashion to stand for arbitrary operand types.  The;;     machine description macro `EXTRA_CONSTRAINT' is passed the operand as;;     its first argument and the constraint letter as its second operand.;;;;     A typical use for this would be to distinguish certain types of memory;;     references that affect other insn operands.;;;;     Do not define these constraint letters to accept register references;;     (`reg'); the reload pass does not expect this and would not handle it;;     properly.;; Multiple Alternative Constraints;; `?' Disparage slightly the alternative that the `?' appears in, as a;;     choice when no alternative applies exactly.  The compiler regards this;;     alternative as one unit more costly for each `?' that appears in it.;;;; `!' Disparage severely the alternative that the `!' appears in.  This;;     alternative can still be used if it fits without reloading, but if;;     reloading is needed, some other alternative will be used.;; Constraint modifiers;; `=' Means that this operand is write-only for this instruction: the;;     previous value is discarded and replaced by output data.;;;; `+' Means that this operand is both read and written by the;;     instruction.;;;;     When the compiler fixes up the operands to satisfy the constraints, it;;     needs to know which operands are inputs to the instruction and which are;;     outputs from it.  `=' identifies an output; `+' identifies an operand;;     that is both input and output; all other operands are assumed to be;;     input only.;;;; `&' Means (in a particular alternative) that this operand is written;;     before the instruction is finished using the input operands.  Therefore,;;     this operand may not lie in a register that is used as an input operand;;     or as part of any memory address.;;;;     `&' applies only to the alternative in which it is written.  In;;     constraints with multiple alternatives, sometimes one alternative;;     requires `&' while others do not.;;;;     `&' does not obviate the need to write `='.;;;; `%' Declares the instruction to be commutative for this operand and the;;     following operand.  This means that the compiler may interchange the two;;     operands if that is the cheapest way to make all operands fit the;;     constraints.  This is often used in patterns for addition instructions;;     that really have only two operands: the result must go in one of the;;     arguments.;;;; `#' Says that all following characters, up to the next comma, are to be;;     ignored as a constraint.  They are significant only for choosing;;     register preferences.;;;; `*' Says that the following character should be ignored when choosing;;     register preferences.  `*' has no effect on the meaning of the;;     constraint as a constraint, and no effect on reloading.;; ::::::::::::::::::::;; ::;; :: D30V register classes;; ::;; ::::::::::::::::::::;; `a'	Accumulator registers (a0, a1);; `b'	Flag registers for speculative execution (f0, f1);; `c'	CR registers;; `d'	GPR registers;; `e'	Even GPR registers;; `f'	Any flag registers (f0, f1, ..., c);; `l'	CR7, the repeat count;; `x'	F0;; `y'	F1;; `z'	Flag registers other than F0 and F1.;; ::::::::::::::::::::;; ::;; :: D30V special constraints;; ::;; ::::::::::::::::::::;; `G'	Const double with 0 in both low & high part.;; `H'	Unused.;; `I'	Signed 6 bit integer constant (>= -32 && <= 31).;; `J'	Unsigned 5 bit integer constant (>= 0 && <= 31).;; `K'	Integer constant with 1 bit set (for bset).;; `L'	Integer constant with 1 bit clear (for bclr).;; `M'	Integer constant 32.;; `N'	Integer constant 1.;; `O'	Integer constant 0.;; `P'	Integer constant >= 32 && <= 63.;; `Q'	Short memory operand (can be done in small insn).;; `R'	Memory operand using a single register for address.;; `S'	Memory operand to constant address.;; `T'	Unused.;; `U'	Unused.;; ::::::::::::::::::::;; ::;; :: Standard operand flags;; ::;; ::::::::::::::::::::;; `='  Output a number unique to each instruction in the compilation.;; `a'  Substitute an operand as if it were a memory reference.;; `c'  Omit the syntax that indicates an immediate operand.;; `l'  Substitute a LABEL_REF into a jump instruction.;; `n'  Like %cDIGIT, except negate the value before printing.;; ::::::::::::::::::::;; ::;; :: D30V print_operand flags;; ::;; ::::::::::::::::::::;; `.'	Print r0;; `f'  Print a SF constant as an int.;; `s'  Subtract 32 and negate.;; `A'  Print accumulator number without an `a' in front of it.;; `B'  Print bit offset for BSET, etc. instructions.;; `E'  Print u if this is zero extend, nothing if this is sign extend.;; `F'  Emit /{f,t,x}{f,t,x} for executing a false condition.;; `L'  Print the lower half of a 64 bit item.;; `M'  Print a memory reference for ld/st instructions.;; `R'  Return appropriate cmp instruction for relational test.;; `S'  Subtract 32.;; `T'  Emit /{f,t,x}{f,t,x} for executing a true condition.;; `U'  Print the upper half of a 64 bit item.;; ::::::::::::::::::::;; ::;; :: Attributes;; ::;; ::::::::::::::::::::;; The `define_attr' expression is used to define each attribute required by;; the target machine.  It looks like:;;;; (define_attr NAME LIST-OF-VALUES DEFAULT);; NAME is a string specifying the name of the attribute being defined.;; LIST-OF-VALUES is either a string that specifies a comma-separated list of;; values that can be assigned to the attribute, or a null string to indicate;; that the attribute takes numeric values.;; DEFAULT is an attribute expression that gives the value of this attribute;; for insns that match patterns whose definition does not include an explicit;; value for this attribute.;; For each defined attribute, a number of definitions are written to the;; `insn-attr.h' file.  For cases where an explicit set of values is specified;; for an attribute, the following are defined:;; * A `#define' is written for the symbol `HAVE_ATTR_NAME'.;;;; * An enumeral class is defined for `attr_NAME' with elements of the;;   form `UPPER-NAME_UPPER-VALUE' where the attribute name and value are first;;   converted to upper case.;;;; * A function `get_attr_NAME' is defined that is passed an insn and;;   returns the attribute value for that insn.;; For example, if the following is present in the `md' file:;;;; (define_attr "type" "branch,fp,load,store,arith" ...);;;; the following lines will be written to the file `insn-attr.h'.;;;; #define HAVE_ATTR_type;; enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD, TYPE_STORE, TYPE_ARITH};;; extern enum attr_type get_attr_type ();;; If the attribute takes numeric values, no `enum' type will be defined and;; the function to obtain the attribute's value will return `int'.;; Note, we lie a little bit here to make it simpler to optimize.  We pretend there;; is a separate long functional unit for long instructions that uses both the IU & MU.(define_attr "type" "iu,mu,br,br2,either,scarry,lcarry,scmp,lcmp,sload,lload,mul,long,multi,unknown"  (const_string "unknown"));; Length in word units(define_attr "length" ""  (cond [(eq_attr "type" "iu,mu,either,scmp,sload,mul,scarry,")		(const_int 4)	 (eq_attr "type" "long,lcmp,lload,lcarry")		(const_int 8)	 (eq_attr "type" "multi,unknown")		(const_int 64)	;; set higher to give a fudge factor	 (eq_attr "type" "br")		(if_then_else (and (ge (minus (pc) (match_dup 0))				       (const_int -1048576))				   (lt (minus (pc) (match_dup 0))				       (const_int 1048575)))		  (const_int 4)		  (const_int 8))	 (eq_attr "type" "br2")		(if_then_else (and (ge (minus (pc) (match_dup 0))				       (const_int -16384))				   (lt (minus (pc) (match_dup 0))				       (const_int 16383)))		  (const_int 4)		  (const_int 8))	]	(const_int 8)))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -