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

📄 frv.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 5 页
字号:
  ""  "sethi #gprelhi(%1), %0"  [(set_attr "type" "sethi")   (set_attr "length" "4")])(define_insn "movsi_lo_sum_pic"  [(set (match_operand:SI 0 "integer_register_operand" "+d")	(lo_sum:SI (match_dup 0)		   (match_operand:SI 1 "pic_symbolic_operand" "")))]  ""  "setlo #gprello(%1), %0"  [(set_attr "type" "setlo")   (set_attr "length" "4")])(define_expand "movdi"  [(set (match_operand:DI 0 "nonimmediate_operand" "")	(match_operand:DI 1 "general_operand" ""))]  ""  "{  if (!reload_in_progress      && !reload_completed      && !register_operand (operands[0], DImode)      && !reg_or_0_operand (operands[1], DImode))    operands[1] = copy_to_mode_reg (DImode, operands[1]);}")(define_insn "*movdi_double"  [(set (match_operand:DI 0 "move_destination_operand" "=e,?h,??d,??f,R,?R,??m,??m,e,?h,??d,??f,?e,??d,?h,??f,R,m,e,??d,e,??d,?h,??f")	(match_operand:DI 1 "move_source_operand"      " e,h,d,f,e,h,d,f,R,R,m,m,h,f,e,d,GO,GO,GO,GO,nF,nF,GO,GO"))]  "TARGET_DOUBLE   && (register_operand (operands[0], DImode)       || reg_or_0_operand (operands[1], DImode))"  "* return output_move_double (operands, insn);"  [(set_attr "length" "8,4,8,8,4,4,8,8,4,4,8,8,4,8,4,8,4,8,8,8,16,16,8,8")   (set_attr "type" "multi,fdconv,multi,multi,gstore,fstore,gstore,fstore,gload,fload,gload,fload,movfg,movfg,movgf,movgf,gstore,gstore,multi,multi,multi,multi,movgf,movgf")])(define_insn "*movdi_nodouble"  [(set (match_operand:DI 0 "move_destination_operand" "=e,?h,??d,??f,R,?R,??m,??m,e,?h,??d,??f,?e,??d,?h,??f,R,m,e,??d,e,??d,?h,??f")	(match_operand:DI 1 "move_source_operand"      " e,h,d,f,e,h,d,f,R,R,m,m,h,f,e,d,GO,GO,GO,GO,nF,nF,GO,GO"))]  "!TARGET_DOUBLE   && (register_operand (operands[0], DImode)       || reg_or_0_operand (operands[1], DImode))"  "* return output_move_double (operands, insn);"  [(set_attr "length" "8,8,8,8,4,4,8,8,4,4,8,8,8,8,8,8,4,8,8,8,16,16,8,8")   (set_attr "type" "multi,multi,multi,multi,gstore,fstore,gstore,fstore,gload,fload,gload,fload,movfg,movfg,movgf,movgf,gstore,gstore,multi,multi,multi,multi,movgf,movgf")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(match_operand:DI 1 "dbl_memory_two_insn_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_load (operands[0], operands[1]);")(define_split  [(set (match_operand:DI 0 "odd_reg_operand" "")	(match_operand:DI 1 "memory_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_load (operands[0], operands[1]);")(define_split  [(set (match_operand:DI 0 "dbl_memory_two_insn_operand" "")	(match_operand:DI 1 "reg_or_0_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_store (operands[0], operands[1]);")(define_split  [(set (match_operand:DI 0 "memory_operand" "")	(match_operand:DI 1 "odd_reg_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_store (operands[0], operands[1]);")(define_split  [(set (match_operand:DI 0 "register_operand" "")	(match_operand:DI 1 "register_operand" ""))]  "reload_completed   && (odd_reg_operand (operands[0], DImode)       || odd_reg_operand (operands[1], DImode)       || (integer_register_operand (operands[0], DImode)	   && integer_register_operand (operands[1], DImode))       || (!TARGET_DOUBLE	   && fpr_operand (operands[0], DImode)	   && fpr_operand (operands[1], DImode)))"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 5))]  "{  rtx op0      = operands[0];  rtx op0_low  = gen_lowpart (SImode, op0);  rtx op0_high = gen_highpart (SImode, op0);  rtx op1      = operands[1];  rtx op1_low  = gen_lowpart (SImode, op1);  rtx op1_high = gen_highpart (SImode, op1);  /* We normally copy the low-numbered register first.  However, if the first     register operand 0 is the same as the second register of operand 1, we     must copy in the opposite order.  */  if (REGNO (op0_high) == REGNO (op1_low))    {      operands[2] = op0_low;      operands[3] = op0_high;      operands[4] = op1_low;      operands[5] = op1_high;    }  else    {      operands[2] = op0_high;      operands[3] = op0_low;      operands[4] = op1_high;      operands[5] = op1_low;    }}")(define_split  [(set (match_operand:DI 0 "register_operand" "")	(match_operand:DI 1 "const_int_operand" ""))]  "reload_completed"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 1))]  "{  rtx op0 = operands[0];  rtx op1 = operands[1];  operands[2] = gen_highpart (SImode, op0);  operands[3] = gen_lowpart (SImode, op0);  operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0);}")(define_split  [(set (match_operand:DI 0 "register_operand" "")	(match_operand:DI 1 "const_double_operand" ""))]  "reload_completed"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 5))]  "{  rtx op0 = operands[0];  rtx op1 = operands[1];  operands[2] = gen_highpart (SImode, op0);  operands[3] = gen_lowpart (SImode, op0);  operands[4] = GEN_INT (CONST_DOUBLE_HIGH (op1));  operands[5] = GEN_INT (CONST_DOUBLE_LOW (op1));}");; Floating Point Moves;;;; Note - Patterns for SF mode moves are compulsory, but;; patterns for DF are optional, as GCC can synthesize them.(define_expand "movsf"  [(set (match_operand:SF 0 "general_operand" "")	(match_operand:SF 1 "general_operand" ""))]  ""  "{  if (!reload_in_progress      && !reload_completed      && !register_operand (operands[0], SFmode)      && !reg_or_0_operand (operands[1], SFmode))    operands[1] = copy_to_mode_reg (SFmode, operands[1]);}")(define_split  [(set (match_operand:SF 0 "integer_register_operand" "")	(match_operand:SF 1 "int_2word_operand" ""))]  "reload_completed"  [(set (match_dup 0)	(high:SF (match_dup 1)))   (set (match_dup 0)	(lo_sum:SF (match_dup 0)		(match_dup 1)))]  "")(define_insn "*movsf_load_has_fprs"  [(set (match_operand:SF 0 "register_operand" "=f,d")	(match_operand:SF 1 "frv_load_operand" "m,m"))]  "TARGET_HAS_FPRS"  "* return output_move_single (operands, insn);"  [(set_attr "length" "4")   (set_attr "type" "fload,gload")])(define_insn "*movsf_internal_has_fprs"  [(set (match_operand:SF 0 "move_destination_operand" "=f,f,m,m,?f,?d,?d,m,?d")	(match_operand:SF 1 "move_source_operand" "f,OG,f,OG,d,f,d,d,F"))]  "TARGET_HAS_FPRS   && (register_operand (operands[0], SFmode) || reg_or_0_operand (operands[1], SFmode))"  "* return output_move_single (operands, insn);"  [(set_attr "length" "4,4,4,4,4,4,4,4,8")   (set_attr "type" "fsconv,movgf,fstore,gstore,movgf,movfg,int,gstore,multi")]);; If we don't support the double instructions, prefer gprs over fprs, since it;; will all be emulated(define_insn "*movsf_internal_no_fprs"  [(set (match_operand:SF 0 "move_destination_operand" "=d,d,m,d,d")	(match_operand:SF 1 "move_source_operand"      " d,OG,dOG,m,F"))]  "!TARGET_HAS_FPRS   && (register_operand (operands[0], SFmode) || reg_or_0_operand (operands[1], SFmode))"  "* return output_move_single (operands, insn);"  [(set_attr "length" "4,4,4,4,8")   (set_attr "type" "int,int,gstore,gload,multi")])(define_insn "movsf_high"  [(set (match_operand:SF 0 "integer_register_operand" "=d")	(high:SF (match_operand:SF 1 "int_2word_operand" "i")))]  ""  "sethi #hi(%1), %0"  [(set_attr "type" "sethi")   (set_attr "length" "4")])(define_insn "movsf_lo_sum"  [(set (match_operand:SF 0 "integer_register_operand" "+d")	(lo_sum:SF (match_dup 0)		   (match_operand:SF 1 "int_2word_operand" "i")))]  ""  "setlo #lo(%1), %0"  [(set_attr "type" "setlo")   (set_attr "length" "4")])(define_expand "movdf"  [(set (match_operand:DF 0 "nonimmediate_operand" "")	(match_operand:DF 1 "general_operand" ""))]  ""  "{  if (!reload_in_progress      && !reload_completed      && !register_operand (operands[0], DFmode)      && !reg_or_0_operand (operands[1], DFmode))    operands[1] = copy_to_mode_reg (DFmode, operands[1]);}")(define_insn "*movdf_double"  [(set (match_operand:DF 0 "move_destination_operand" "=h,?e,??f,??d,R,?R,??m,??m,h,?e,??f,??d,?h,??f,?e,??d,R,m,h,??f,e,??d")	(match_operand:DF 1 "move_source_operand"      " h,e,f,d,h,e,f,d,R,R,m,m,e,d,h,f,GO,GO,GO,GO,GO,GO"))]  "TARGET_DOUBLE   && (register_operand (operands[0], DFmode)       || reg_or_0_operand (operands[1], DFmode))"  "* return output_move_double (operands, insn);"  [(set_attr "length" "4,8,8,8,4,4,8,8,4,4,8,8,4,8,4,8,4,8,8,8,8,8")   (set_attr "type" "fdconv,multi,multi,multi,fstore,gstore,fstore,gstore,fload,gload,fload,gload,movgf,movgf,movfg,movfg,gstore,gstore,movgf,movgf,multi,multi")]);; If we don't support the double instructions, prefer gprs over fprs, since it;; will all be emulated(define_insn "*movdf_nodouble"  [(set (match_operand:DF 0 "move_destination_operand" "=e,?h,??d,??f,R,?R,??m,??m,e,?h,??d,??f,?e,??d,?h,??f,R,m,e,??d,e,??d,?h,??f")	(match_operand:DF 1 "move_source_operand"      " e,h,d,f,e,h,d,f,R,R,m,m,h,f,e,d,GO,GO,GO,GO,nF,nF,GO,GO"))]  "!TARGET_DOUBLE   && (register_operand (operands[0], DFmode)       || reg_or_0_operand (operands[1], DFmode))"  "* return output_move_double (operands, insn);"  [(set_attr "length" "8,8,8,8,4,4,8,8,4,4,8,8,8,8,8,8,4,8,8,8,16,16,8,8")   (set_attr "type" "multi,multi,multi,multi,gstore,fstore,gstore,fstore,gload,fload,gload,fload,movfg,movfg,movgf,movgf,gstore,gstore,multi,multi,multi,multi,movgf,movgf")])(define_split  [(set (match_operand:DF 0 "register_operand" "")	(match_operand:DF 1 "dbl_memory_two_insn_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_load (operands[0], operands[1]);")(define_split  [(set (match_operand:DF 0 "odd_reg_operand" "")	(match_operand:DF 1 "memory_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_load (operands[0], operands[1]);")(define_split  [(set (match_operand:DF 0 "dbl_memory_two_insn_operand" "")	(match_operand:DF 1 "reg_or_0_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_store (operands[0], operands[1]);")(define_split  [(set (match_operand:DF 0 "memory_operand" "")	(match_operand:DF 1 "odd_reg_operand" ""))]  "reload_completed"  [(const_int 0)]  "frv_split_double_store (operands[0], operands[1]);")(define_split  [(set (match_operand:DF 0 "register_operand" "")	(match_operand:DF 1 "register_operand" ""))]  "reload_completed   && (odd_reg_operand (operands[0], DFmode)       || odd_reg_operand (operands[1], DFmode)       || (integer_register_operand (operands[0], DFmode)	   && integer_register_operand (operands[1], DFmode))       || (!TARGET_DOUBLE	   && fpr_operand (operands[0], DFmode)	   && fpr_operand (operands[1], DFmode)))"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 5))]  "{  rtx op0      = operands[0];  rtx op0_low  = gen_lowpart (SImode, op0);  rtx op0_high = gen_highpart (SImode, op0);  rtx op1      = operands[1];  rtx op1_low  = gen_lowpart (SImode, op1);  rtx op1_high = gen_highpart (SImode, op1);  /* We normally copy the low-numbered register first.  However, if the first     register operand 0 is the same as the second register of operand 1, we     must copy in the opposite order.  */  if (REGNO (op0_high) == REGNO (op1_low))    {      operands[2] = op0_low;      operands[3] = op0_high;      operands[4] = op1_low;      operands[5] = op1_high;    }  else    {      operands[2] = op0_high;      operands[3] = op0_low;      operands[4] = op1_high;      operands[5] = op1_low;    }}")(define_split  [(set (match_operand:DF 0 "register_operand" "")	(match_operand:DF 1 "const_int_operand" ""))]  "reload_completed"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 1))]  "{  rtx op0 = operands[0];  rtx op1 = operands[1];  operands[2] = gen_highpart (SImode, op0);  operands[3] = gen_lowpart (SImode, op0);  operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0);}")(define_split  [(set (match_operand:DF 0 "register_operand" "")	(match_operand:DF 1 "const_double_operand" ""))]  "reload_completed"  [(set (match_dup 2) (match_dup 4))   (set (match_dup 3) (match_dup 5))]  "{  rtx op0 = operands[0];  rtx op1 = operands[1];  REAL_VALUE_TYPE rv;  long l[2];  REAL_VALUE_FROM_CONST_DOUBLE (rv, op1);  REAL_VALUE_TO_TARGET_DOUBLE (rv, l);  operands[2] = ge

⌨️ 快捷键说明

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