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

📄 crx.md

📁 linux下编程用 编译软件
💻 MD
📖 第 1 页 / 共 2 页
字号:
;; GCC machine description for CRX.;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000,;; 2001, 2002, 2003, 2004;; Free Software Foundation, Inc.;;;; This file is part of GCC.;;;; GCC 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.;;;; GCC 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 GCC; see the file COPYING.  If not, write to;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,;; Boston, MA 02110-1301, USA.  */;;  Register numbers(define_constants  [(SP_REGNUM 15)	; Stack pointer   (RA_REGNUM 14)	; Return address   (LO_REGNUM 16)	; LO register   (HI_REGNUM 17)	; HI register   (CC_REGNUM 18)	; Condition code register  ])(define_attr "length" "" ( const_int 6 ))(define_asm_attributes  [(set_attr "length" "6")]);;  Predicates(define_predicate "u4bits_operand"  (match_code "const_int,const_double")  {    if (GET_CODE (op) == CONST_DOUBLE)      return crx_const_double_ok (op);    return (UNSIGNED_INT_FITS_N_BITS(INTVAL(op), 4)) ? 1 : 0;  })(define_predicate "cst4_operand"  (and (match_code "const_int")       (match_test "INT_CST4(INTVAL(op))")))(define_predicate "reg_or_u4bits_operand"  (ior (match_operand 0 "u4bits_operand")       (match_operand 0 "register_operand")))(define_predicate "reg_or_cst4_operand"  (ior (match_operand 0 "cst4_operand")       (match_operand 0 "register_operand")))(define_predicate "reg_or_sym_operand"  (ior (match_code "symbol_ref")       (match_operand 0 "register_operand")))(define_predicate "nosp_reg_operand"  (and (match_operand 0 "register_operand")       (match_test "REGNO (op) != SP_REGNUM")))(define_predicate "store_operand"  (and (match_operand 0 "memory_operand")       (not (match_operand 0 "push_operand"))));;  Mode Macro Definitions(define_mode_macro ALLMT [QI HI SI SF DI DF])(define_mode_macro CRXMM [QI HI SI SF])(define_mode_macro CRXIM [QI HI SI])(define_mode_macro DIDFM [DI DF])(define_mode_macro SISFM [SI SF])(define_mode_macro SHORT [QI HI])(define_mode_attr tIsa [(QI "b") (HI "w") (SI "d") (SF "d")])(define_mode_attr lImmArith [(QI "4") (HI "4") (SI "6")])(define_mode_attr lImmRotl [(QI "2") (HI "2") (SI "4")])(define_mode_attr IJK [(QI "I") (HI "J") (SI "K")])(define_mode_attr iF [(QI "i") (HI "i") (SI "i") (DI "i") (SF "F") (DF "F")])(define_mode_attr JG [(QI "J") (HI "J") (SI "J") (DI "J") (SF "G") (DF "G")]);   In HI or QI mode we push 4 bytes.(define_mode_attr pushCnstr [(QI "X") (HI "X") (SI "<") (SF "<") (DI "<") (DF "<")])(define_mode_attr tpush [(QI "") (HI "") (SI "") (SF "") (DI "sp, ") (DF "sp, ")])(define_mode_attr lpush [(QI "2") (HI "2") (SI "2") (SF "2") (DI "4") (DF "4")]);;  Code Macro Definitions(define_code_macro sz_xtnd [sign_extend zero_extend])(define_code_attr sIsa [(sign_extend "") (zero_extend "u")])(define_code_attr sPat [(sign_extend "s") (zero_extend "u")])(define_code_attr szPat [(sign_extend "") (zero_extend "zero_")])(define_code_attr szIsa [(sign_extend "s") (zero_extend "z")])(define_code_macro sh_oprnd [ashift ashiftrt lshiftrt])(define_code_attr shIsa [(ashift "ll") (ashiftrt "ra") (lshiftrt "rl")])(define_code_attr shPat [(ashift "ashl") (ashiftrt "ashr") (lshiftrt "lshr")])(define_code_macro mima_oprnd [smax umax smin umin])(define_code_attr mimaIsa [(smax "maxs") (umax "maxu") (smin "mins") (umin "minu")])(define_code_macro any_cond [eq ne gt gtu lt ltu ge geu le leu]);;  Addition Instructions(define_insn "adddi3"  [(set (match_operand:DI 0 "register_operand" "=r,r")	(plus:DI (match_operand:DI 1 "register_operand" "%0,0")		 (match_operand:DI 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "addd\t%L2, %L1\;addcd\t%H2, %H1"  [(set_attr "length" "4,12")])(define_insn "add<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(plus:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")		    (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "add<tIsa>\t%2, %0"  [(set_attr "length" "2,<lImmArith>")]);;  Subtract Instructions(define_insn "subdi3"  [(set (match_operand:DI 0 "register_operand" "=r,r")	(minus:DI (match_operand:DI 1 "register_operand" "0,0")		  (match_operand:DI 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "subd\t%L2, %L1\;subcd\t%H2, %H1"  [(set_attr "length" "4,12")])(define_insn "sub<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(minus:CRXIM (match_operand:CRXIM 1 "register_operand" "0,0")		     (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "sub<tIsa>\t%2, %0"  [(set_attr "length" "2,<lImmArith>")]);;  Multiply Instructions(define_insn "mul<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(mult:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")		    (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "mul<tIsa>\t%2, %0"  [(set_attr "length" "2,<lImmArith>")]);;  Widening-multiplication Instructions(define_insn "<sIsa>mulsidi3"  [(set (match_operand:DI 0 "register_operand" "=k")	(mult:DI (sz_xtnd:DI (match_operand:SI 1 "register_operand" "%r"))		 (sz_xtnd:DI (match_operand:SI 2 "register_operand" "r"))))   (clobber (reg:CC CC_REGNUM))]  ""  "mull<sPat>d\t%2, %1"  [(set_attr "length" "4")])(define_insn "<sIsa>mulhisi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(mult:SI (sz_xtnd:SI (match_operand:HI 1 "register_operand" "%0"))		 (sz_xtnd:SI (match_operand:HI 2 "register_operand" "r"))))   (clobber (reg:CC CC_REGNUM))]  ""  "mul<sPat>wd\t%2, %0"  [(set_attr "length" "4")])(define_insn "<sIsa>mulqihi3"  [(set (match_operand:HI 0 "register_operand" "=r")	(mult:HI (sz_xtnd:HI (match_operand:QI 1 "register_operand" "%0"))		 (sz_xtnd:HI (match_operand:QI 2 "register_operand" "r"))))   (clobber (reg:CC CC_REGNUM))]  ""  "mul<sPat>bw\t%2, %0"  [(set_attr "length" "4")]);;  Logical Instructions - and(define_insn "and<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(and:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")		   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "and<tIsa>\t%2, %0"  [(set_attr "length" "2,<lImmArith>")]);;  Logical Instructions - or(define_insn "ior<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(ior:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")		   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "or<tIsa>\t%2, %0"  [(set_attr "length" "2,<lImmArith>")]);;  Logical Instructions - xor(define_insn "xor<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(xor:CRXIM (match_operand:CRXIM 1 "register_operand" "%0,0")		   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))   (clobber (reg:CC CC_REGNUM))]  ""  "xor<tIsa>\t%2, %0"  [(set_attr "length" "2,<lImmArith>")]);;  Sign and Zero Extend Instructions(define_insn "<szPat>extendhisi2"  [(set (match_operand:SI 0 "register_operand" "=r")	(sz_xtnd:SI (match_operand:HI 1 "register_operand" "r")))   (clobber (reg:CC CC_REGNUM))]  ""  "<szIsa>extwd\t%1, %0"  [(set_attr "length" "4")])(define_insn "<szPat>extendqisi2"  [(set (match_operand:SI 0 "register_operand" "=r")	(sz_xtnd:SI (match_operand:QI 1 "register_operand" "r")))   (clobber (reg:CC CC_REGNUM))]  ""  "<szIsa>extbd\t%1, %0"  [(set_attr "length" "4")])(define_insn "<szPat>extendqihi2"  [(set (match_operand:HI 0 "register_operand" "=r")	(sz_xtnd:HI (match_operand:QI 1 "register_operand" "r")))   (clobber (reg:CC CC_REGNUM))]  ""  "<szIsa>extbw\t%1, %0"  [(set_attr "length" "4")]);;  Negation Instructions(define_insn "neg<mode>2"  [(set (match_operand:CRXIM 0 "register_operand" "=r")	(neg:CRXIM (match_operand:CRXIM 1 "register_operand" "r")))   (clobber (reg:CC CC_REGNUM))]  ""  "neg<tIsa>\t%1, %0"  [(set_attr "length" "4")]);;  Absolute Instructions(define_insn "abs<mode>2"  [(set (match_operand:CRXIM 0 "register_operand" "=r")	(abs:CRXIM (match_operand:CRXIM 1 "register_operand" "r")))   (clobber (reg:CC CC_REGNUM))]  ""  "abs<tIsa>\t%1, %0"  [(set_attr "length" "4")]);;  Max and Min Instructions(define_insn "<code><mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r")	(mima_oprnd:CRXIM (match_operand:CRXIM 1 "register_operand"  "%0")			  (match_operand:CRXIM 2 "register_operand"  "r")))]  ""  "<mimaIsa><tIsa>\t%2, %0"  [(set_attr "length" "4")]);;  One's Complement(define_insn "one_cmpl<mode>2"  [(set (match_operand:CRXIM 0 "register_operand" "=r")	(not:CRXIM (match_operand:CRXIM 1 "register_operand" "0")))   (clobber (reg:CC CC_REGNUM))]  ""  "xor<tIsa>\t$-1, %0"  [(set_attr "length" "2")]);;  Rotate Instructions(define_insn "rotl<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(rotate:CRXIM (match_operand:CRXIM 1 "register_operand" "0,0")		      (match_operand:CRXIM 2 "nonmemory_operand" "r,<IJK>")))   (clobber (reg:CC CC_REGNUM))]  ""  "@  rotl<tIsa>\t%2, %0  rot<tIsa>\t%2, %0"  [(set_attr "length" "4,<lImmRotl>")])(define_insn "rotr<mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r")	(rotatert:CRXIM (match_operand:CRXIM 1 "register_operand" "0")			(match_operand:CRXIM 2 "register_operand" "r")))   (clobber (reg:CC CC_REGNUM))]  ""  "rotr<tIsa>\t%2, %0"  [(set_attr "length" "4")]);;  Arithmetic Left and Right Shift Instructions(define_insn "<shPat><mode>3"  [(set (match_operand:CRXIM 0 "register_operand" "=r,r")	(sh_oprnd:CRXIM (match_operand:CRXIM 1 "register_operand" "0,0")			(match_operand:QI 2 "nonmemory_operand" "r,<IJK>")))   (clobber (reg:CC CC_REGNUM))]  ""  "s<shIsa><tIsa>\t%2, %0"  [(set_attr "length" "2,2")]);;  Bit Set Instructions(define_insn "extv"  [(set (match_operand:SI 0 "register_operand" "=r")	(sign_extract:SI (match_operand:SI 1 "register_operand" "r")			 (match_operand:SI 2 "const_int_operand" "n")			 (match_operand:SI 3 "const_int_operand" "n")))]  ""  {    static char buf[100];    int strpntr;    int size = INTVAL (operands[2]);    int pos = INTVAL (operands[3]);    strpntr = sprintf (buf, "ram\t$%d, $31, $%d, %%1, %%0\;",	      BITS_PER_WORD - (size + pos), BITS_PER_WORD - size);    sprintf (buf + strpntr, "srad\t$%d, %%0", BITS_PER_WORD - size);    return buf;  }  [(set_attr "length" "6")])(define_insn "extzv"  [(set (match_operand:SI 0 "register_operand" "=r")	(zero_extract:SI (match_operand:SI 1 "register_operand" "r")			 (match_operand:SI 2 "const_int_operand" "n")			 (match_operand:SI 3 "const_int_operand" "n")))]  ""  {    static char buf[40];    int size = INTVAL (operands[2]);    int pos = INTVAL (operands[3]);    sprintf (buf, "ram\t$%d, $%d, $0, %%1, %%0",	   (BITS_PER_WORD - pos) % BITS_PER_WORD, size - 1);    return buf;  }  [(set_attr "length" "4")])(define_insn "insv"  [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")			 (match_operand:SI 1 "const_int_operand" "n")			 (match_operand:SI 2 "const_int_operand" "n"))	(match_operand:SI 3 "register_operand" "r"))]  ""  {    static char buf[40];    int size = INTVAL (operands[1]);    int pos = INTVAL (operands[2]);    sprintf (buf, "rim\t$%d, $%d, $%d, %%3, %%0",	    pos, size + pos - 1, pos);    return buf;  }  [(set_attr "length" "4")]);;  Move Instructions(define_expand "mov<mode>"  [(set (match_operand:ALLMT 0 "nonimmediate_operand" "")	(match_operand:ALLMT 1 "general_operand" ""))]  ""  {    if (!(reload_in_progress || reload_completed))      {	if (!register_operand (operands[0], <MODE>mode))	  {	    if (push_operand (operands[0], <MODE>mode) ?		!nosp_reg_operand (operands[1], <MODE>mode) :		!reg_or_u4bits_operand (operands[1], <MODE>mode))	      {		operands[1] = copy_to_mode_reg (<MODE>mode, operands[1]);	      }	  }      }  })(define_insn "push<mode>_internal"  [(set (match_operand:ALLMT 0 "push_operand" "=<pushCnstr>")	(match_operand:ALLMT 1 "nosp_reg_operand" "b"))]  ""  "push\t<tpush>%p1"  [(set_attr "length" "<lpush>")])(define_insn "mov<mode>_regs"  [(set (match_operand:SISFM 0 "register_operand" "=r, r, r, k")	(match_operand:SISFM 1 "nonmemory_operand" "r, <iF>, k, r"))]  ""  "@  movd\t%1, %0  movd\t%1, %0  mfpr\t%1, %0  mtpr\t%1, %0"  [(set_attr "length" "2,6,4,4")])(define_insn "mov<mode>_regs"  [(set (match_operand:DIDFM 0 "register_operand" "=r, r, r, k")	(match_operand:DIDFM 1 "nonmemory_operand" "r, <iF>, k, r"))]  ""  {    switch (which_alternative)      {      case 0: if (REGNO (operands[0]) > REGNO (operands[1]))	        return "movd\t%H1, %H0\;movd\t%L1, %L0";	      else	        return "movd\t%L1, %L0\;movd\t%H1, %H0";      case 1: return "movd\t%H1, %H0\;movd\t%L1, %L0";      case 2: return "mfpr\t%H1, %H0\;mfpr\t%L1, %L0";      case 3: return "mtpr\t%H1, %H0\;mtpr\t%L1, %L0";      default: gcc_unreachable ();      }  }  [(set_attr "length" "4,12,8,8")])(define_insn "mov<mode>_regs" ; no HI/QI mode in HILO regs

⌨️ 快捷键说明

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