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

📄 sparc.md

📁 这是完整的gcc源代码
💻 MD
📖 第 1 页 / 共 5 页
字号:
    output_asm_insn (\"fstoi %1,%%f1\", operands);  else if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))    {      cc_status.flags |= CC_KNOW_HI_G1;      cc_status.mdep = XEXP (operands[1], 0);      output_asm_insn (\"sethi %%hi(%m1),%%g1\;ld [%%g1+%%lo(%m1)],%%f1\;fstoi %%f1,%%f1\", operands);    }  else    output_asm_insn (\"ld %1,%%f1\;fstoi %%f1,%%f1\", operands);  if (GET_CODE (operands[0]) == MEM)    if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))      {	if (! ((cc_prev_status.flags & CC_KNOW_HI_G1)	       && XEXP (operands[0], 0) == cc_prev_status.mdep))	  {	    cc_status.flags |= CC_KNOW_HI_G1;	    cc_status.mdep = XEXP (operands[0], 0);	    output_asm_insn (\"sethi %%hi(%m0),%%g1\", operands);	  }	return \"st %%f1,[%%g1+%%lo(%m0)]\";      }    else      return \"st %%f1,%0\";  else    return \"st %%f1,[%%fp-4]\;ld [%%fp-4],%0\";}")(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "general_operand" "=rm")	(fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]  ""  "*{  cc_status.flags &= ~CC_F0_IS_0;  if (FP_REG_P (operands[1]))    output_asm_insn (\"fdtoi %1,%%f0\", operands);  else    {      rtx xoperands[2];      xoperands[0] = gen_rtx (REG, DFmode, 32);      xoperands[1] = operands[1];      output_asm_insn (output_fp_move_double (xoperands), xoperands);      output_asm_insn (\"fdtoi %%f0,%%f0\", 0);    }  if (GET_CODE (operands[0]) == MEM)    if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))      {	if (! ((cc_prev_status.flags & CC_KNOW_HI_G1)	       && XEXP (operands[0], 0) == cc_prev_status.mdep))	  {	    cc_status.flags |= CC_KNOW_HI_G1;	    cc_status.mdep = XEXP (operands[0], 0);	    output_asm_insn (\"sethi %%hi(%m0),%%g1\", operands);	  }	return \"st %%f0,[%%g1+%%lo(%m0)]\";      }    else      return \"st %%f0,%0\";  else    return \"st %%f0,[%%fp-4]\;ld [%%fp-4],%0\";}");;- arithmetic instructions(define_insn "addsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(plus:SI (match_operand:SI 1 "arith32_operand" "%r")		 (match_operand:SI 2 "arith32_operand" "rn")))]  ""  "*{  if (REG_P (operands[2]))    return \"add %1,%2,%0\";  if (SMALL_INT (operands[2]))    return \"add %1,%2,%0\";  cc_status.flags &= ~CC_KNOW_HI_G1;  return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;add %1,%%g1,%0\";}")(define_insn "subsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(minus:SI (match_operand:SI 1 "register_operand" "r")		  (match_operand:SI 2 "arith32_operand" "rn")))]  ""  "*{  if (REG_P (operands[2]))    return \"sub %1,%2,%0\";  if (SMALL_INT (operands[2]))    return \"sub %1,%2,%0\";  cc_status.flags &= ~CC_KNOW_HI_G1;  return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;sub %1,%%g1,%0\";}")(define_expand "mulsi3"  [(set (match_operand:SI 0 "register_operand" "r")	(mult:SI (match_operand:SI 1 "general_operand" "")		 (match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx src;  if (GET_CODE (operands[1]) == CONST_INT)    if (GET_CODE (operands[2]) == CONST_INT)      {	emit_move_insn (operands[0],			gen_rtx (CONST_INT, VOIDmode,				 INTVAL (operands[1]) * INTVAL (operands[2])));	DONE;      }    else      src = gen_rtx (MULT, SImode,		     copy_to_mode_reg (SImode, operands[2]),		     operands[1]);  else if (GET_CODE (operands[2]) == CONST_INT)    src = gen_rtx (MULT, SImode,		   copy_to_mode_reg (SImode, operands[1]),		   operands[2]);  else src = 0;  if (src)    emit_insn (gen_rtx (SET, VOIDmode, operands[0], src));  else    emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5,	       gen_rtx (SET, VOIDmode, operands[0],			gen_rtx (MULT, SImode, operands[1], operands[2])),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 8)),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 9)),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 12)),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 13)))));  DONE;}")(define_expand "umulsi3"  [(set (match_operand:SI 0 "register_operand" "r")	(umult:SI (match_operand:SI 1 "general_operand" "")		  (match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx src;  if (GET_CODE (operands[1]) == CONST_INT)    if (GET_CODE (operands[2]) == CONST_INT)      {	emit_move_insn (operands[0],			gen_rtx (CONST_INT, VOIDmode,				 (unsigned)INTVAL (operands[1]) * (unsigned)INTVAL (operands[2])));	DONE;      }    else      src = gen_rtx (UMULT, SImode,		     copy_to_mode_reg (SImode, operands[2]),		     operands[1]);  else if (GET_CODE (operands[2]) == CONST_INT)    src = gen_rtx (UMULT, SImode,		   copy_to_mode_reg (SImode, operands[1]),		   operands[2]);  else src = 0;  if (src)    emit_insn (gen_rtx (SET, VOIDmode, operands[0], src));  else    emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5,	       gen_rtx (SET, VOIDmode, operands[0],			gen_rtx (UMULT, SImode, operands[1], operands[2])),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 8)),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 9)),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 12)),	       gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 13)))));  DONE;}")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(mult:SI (match_operand:SI 1 "register_operand" "r")		 (match_operand:SI 2 "immediate_operand" "n")))]  ""  "* return output_mul_by_constant (insn, operands, 0);")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(umult:SI (match_operand:SI 1 "register_operand" "r")		  (match_operand:SI 2 "immediate_operand" "n")))]  ""  "* return output_mul_by_constant (insn, operands, 1);")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(mult:SI (match_operand:SI 1 "general_operand" "%r")		 (match_operand:SI 2 "general_operand" "r")))   (clobber (reg:SI 8))   (clobber (reg:SI 9))   (clobber (reg:SI 12))   (clobber (reg:SI 13))]  ""  "* return output_mul_insn (operands, 0);")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(umult:SI (match_operand:SI 1 "general_operand" "%r")		  (match_operand:SI 2 "general_operand" "r")))   (clobber (reg:SI 8))   (clobber (reg:SI 9))   (clobber (reg:SI 12))   (clobber (reg:SI 13))]  ""  "* return output_mul_insn (operands, 1);");; this pattern is needed because cse may eliminate the multiplication,;; but leave the clobbers behind.(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(match_operand:SI 1 "general_operand" "g"))   (clobber (reg:SI 8))   (clobber (reg:SI 9))   (clobber (reg:SI 12))   (clobber (reg:SI 13))]  ""  "*{  if (GET_CODE (operands[1]) == CONST_INT)    {      if (SMALL_INT (operands[1]))	return \"mov %1,%0\";      return \"sethi %%hi(%1),%0\;or %%lo(%1),%0,%0\";    }  if (GET_CODE (operands[1]) == MEM)    return \"ld %1,%0\";  return \"mov %1,%0\";}");; In case constant factor turns out to be -1.(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(neg:SI (match_operand:SI 1 "general_operand" "rI")))   (clobber (reg:SI 8))   (clobber (reg:SI 9))   (clobber (reg:SI 12))   (clobber (reg:SI 13))]  ""  "sub %%g0,%1,%0");;- and instructions (with compliment also)			   (define_insn "andsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(and:SI (match_operand:SI 1 "arith32_operand" "%r")		(match_operand:SI 2 "arith32_operand" "rn")))]  ""  "*{  if (REG_P (operands[2]) || SMALL_INT (operands[2]))    return \"and %1,%2,%0\";  cc_status.flags &= ~CC_KNOW_HI_G1;  return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;and %1,%%g1,%0\";}")(define_insn "andcbsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(and:SI (match_operand:SI 1 "register_operand" "r")		(not:SI (match_operand:SI 2 "register_operand" "r"))))]  ""  "andn %1,%2,%0")(define_insn "iorsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(ior:SI (match_operand:SI 1 "arith32_operand" "%r")		(match_operand:SI 2 "arith32_operand" "rn")))]  ""  "*{  if (REG_P (operands[2]) || SMALL_INT (operands[2]))    return \"or %1,%2,%0\";  cc_status.flags &= ~CC_KNOW_HI_G1;  return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;or %1,%%g1,%0\";}")(define_insn "iorcbsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(ior:SI (match_operand:SI 1 "register_operand" "r")		(not:SI (match_operand:SI 2 "register_operand" "r"))))]  ""  "orn %1,%2,%0")(define_insn "xorsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(xor:SI (match_operand:SI 1 "arith32_operand" "%r")		(match_operand:SI 2 "arith32_operand" "rn")))]  ""  "*{  if (REG_P (operands[2]) || SMALL_INT (operands[2]))    return \"xor %1,%2,%0\";  cc_status.flags &= ~CC_KNOW_HI_G1;  return \"sethi %%hi(%2),%%g1\;or %%lo(%2),%%g1,%%g1\;xor %1,%%g1,%0\";}")(define_insn "xorcbsi3"  [(set (match_operand:SI 0 "register_operand" "=r")	(xor:SI (match_operand:SI 1 "register_operand" "r")		(not:SI (match_operand:SI 2 "register_operand" "r"))))]  ""  "xnor %1,%2,%0");; We cannot use the "neg" pseudo insn because the Sun assembler;; does not know how to make it work for constants.(define_insn "negsi2"  [(set (match_operand:SI 0 "general_operand" "=r")	(neg:SI (match_operand:SI 1 "arith_operand" "rI")))]  ""  "sub %%g0,%1,%0");; We cannot use the "not" pseudo insn because the Sun assembler;; does not know how to make it work for constants.(define_insn "one_cmplsi2"  [(set (match_operand:SI 0 "general_operand" "=r")	(not:SI (match_operand:SI 1 "arith_operand" "rI")))]  ""  "xnor %%g0,%1,%0");; Floating point arithmetic instructions.(define_insn "adddf3"  [(set (match_operand:DF 0 "register_operand" "=f")	(plus:DF (match_operand:DF 1 "register_operand" "f")		 (match_operand:DF 2 "register_operand" "f")))]  ""  "faddd %1,%2,%0")(define_insn "addsf3"  [(set (match_operand:SF 0 "register_operand" "=f")	(plus:SF (match_operand:SF 1 "register_operand" "f")		 (match_operand:SF 2 "register_operand" "f")))]  ""  "fadds %1,%2,%0")(define_insn "subdf3"  [(set (match_operand:DF 0 "register_operand" "=f")	(minus:DF (match_operand:DF 1 "register_operand" "f")		  (match_operand:DF 2 "register_operand" "f")))]  ""  "fsubd %1,%2,%0")(define_insn "subsf3"  [(set (match_operand:SF 0 "register_operand" "=f")	(minus:SF (match_operand:SF 1 "register_operand" "f")		  (match_operand:SF 2 "register_operand" "f")))]  ""  "fsubs %1,%2,%0")(define_insn "muldf3"  [(set (match_operand:DF 0 "register_operand" "=f")	(mult:DF (match_operand:DF 1 "register_operand" "f")		 (match_operand:DF 2 "register_operand" "f")))]  ""  "fmuld %1,%2,%0")(define_insn "mulsf3"  [(set (match_operand:SF 0 "register_operand" "=f")	(mult:SF (match_operand:SF 1 "register_operand" "f")		 (match_operand:SF 2 "register_operand" "f")))]  ""  "fmuls %1,%2,%0")(define_insn "divdf3"  [(set (match_operand:DF 0 "register_operand" "=f")	(div:DF (match_operand:DF 1 "register_operand" "f")		(match_operand:DF 2 "register_operand" "f")))]  ""  "fdivd %1,%2,%0")(define_insn "divsf3"  [(set (match_operand:SF 0 "register_operand" "=f")	(div:SF (match_operand:SF 1 "register_operand" "f")		(match_operand:SF 2 "register_operand" "f")))]  ""  "fdivs %1,%2,%0")(define_insn "negdf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(neg:DF (match_operand:DF 1 "register_operand" "f")))]  ""  "*{  output_asm_insn (\"fnegs %1,%0\", operands);  if (REGNO (operands[0]) != REGNO (operands[1]))    {      operands[0] = gen_rtx (REG, VOIDmode, REGNO (operands[0]) + 1);      operands[1] = gen_rtx (REG, VOIDmode, REGNO (operands[1]) + 1);      output_asm_insn (\"fmovs %1,%0\", operands);    }  return \"\";}")(define_insn "negsf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(neg:SF (match_operand:SF 1 "register_operand" "f")))]  ""  "fnegs %1,%0")(define_insn "absdf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(abs:DF (match_operand:DF 1 "register_operand" "f")))]  ""  "*{  output_asm_insn (\"fabss %1,%0\", operands);  if (REGNO (operands[0]) != REGNO (operands[1]))    {      operands[0] = gen_rtx (REG, VOIDmode, REGNO (operands[0]) + 1);      operands[1] = gen_rtx (REG, VOIDmode, REGNO (operands[1]) + 1);      output_asm_insn (\"fmovs %1,%0\", operands);    }  return \"\";}")(define_insn "abssf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(abs:SF (match_operand:SF 1 "register_operand" "f")))]  ""  "fabss %1,%0");; Shift instructions;; Optimized special case of shifting.;; Must precede the general case.(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(ashiftrt:SI (match_operand:SI 1 "memory_operand" "m")		     (const_int 24)))]  ""  "*{  if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))    {      cc_status.flags |= CC_KNOW_HI_G1;      cc_status.mdep = XEXP (operands[1], 0);      return \"sethi %%hi(%m1),%%g1\;ldsb [%%g1+%%lo(%m1)],%0\";    }  return \"ldsb %1,%0\";}")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")		     (const_int 24)))]  ""  "*{

⌨️ 快捷键说明

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