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

📄 vax.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 4 页
字号:
    return \"addl2 %1,%0\";  if (GET_CODE (operands[2]) == CONST_INT      && INTVAL (operands[2]) < 32767      && INTVAL (operands[2]) > -32768      && GET_CODE (operands[1]) == REG      && push_operand (operands[0], SImode))    return \"pushab %c2(%1)\";  if (GET_CODE (operands[2]) == CONST_INT      && (unsigned) (- INTVAL (operands[2])) < 64)    return \"subl3 $%n2,%1,%0\";  if (GET_CODE (operands[2]) == CONST_INT      && (unsigned) INTVAL (operands[2]) >= 64      && GET_CODE (operands[1]) == REG      && ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768)	  || REGNO (operands[1]) > 11))    return \"movab %c2(%1),%0\";  /* Add this if using gcc on a VAX 3xxx:  if (REG_P (operands[1]) && REG_P (operands[2]))    return \"movab (%1)[%2],%0\";  */  return \"addl3 %1,%2,%0\";}")(define_insn "addhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "=g")	(plus:HI (match_operand:HI 1 "general_operand" "g")		 (match_operand:HI 2 "general_operand" "g")))]  ""  "*{  if (rtx_equal_p (operands[0], operands[1]))    {      if (operands[2] == const1_rtx)	return \"incw %0\";      if (operands[2] == constm1_rtx)	return \"decw %0\";      if (GET_CODE (operands[2]) == CONST_INT	  && (unsigned) (- INTVAL (operands[2])) < 64)	return \"subw2 $%n2,%0\";      return \"addw2 %2,%0\";    }  if (rtx_equal_p (operands[0], operands[2]))    return \"addw2 %1,%0\";  if (GET_CODE (operands[2]) == CONST_INT      && (unsigned) (- INTVAL (operands[2])) < 64)    return \"subw3 $%n2,%1,%0\";  return \"addw3 %1,%2,%0\";}")(define_insn "addqi3"  [(set (match_operand:QI 0 "nonimmediate_operand" "=g")	(plus:QI (match_operand:QI 1 "general_operand" "g")		 (match_operand:QI 2 "general_operand" "g")))]  ""  "*{  if (rtx_equal_p (operands[0], operands[1]))    {      if (operands[2] == const1_rtx)	return \"incb %0\";      if (operands[2] == constm1_rtx)	return \"decb %0\";      if (GET_CODE (operands[2]) == CONST_INT	  && (unsigned) (- INTVAL (operands[2])) < 64)	return \"subb2 $%n2,%0\";      return \"addb2 %2,%0\";    }  if (rtx_equal_p (operands[0], operands[2]))    return \"addb2 %1,%0\";  if (GET_CODE (operands[2]) == CONST_INT      && (unsigned) (- INTVAL (operands[2])) < 64)    return \"subb3 $%n2,%1,%0\";  return \"addb3 %1,%2,%0\";}");; The add-with-carry (adwc) instruction only accepts two operands.(define_insn "adddi3"  [(set (match_operand:DI 0 "nonimmediate_operand" "=ro>,ro>")	(plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")		 (match_operand:DI 2 "general_operand" "Fro,F")))]  ""  "*{  rtx low[3];  const char *pattern;  int carry = 1;  split_quadword_operands (operands, low, 3);  /* Add low parts.  */  if (rtx_equal_p (operands[0], operands[1]))    {      if (low[2] == const0_rtx)	/* Should examine operand, punt if not POST_INC.  */	pattern = \"tstl %0\", carry = 0;      else if (low[2] == const1_rtx)        pattern = \"incl %0\";      else        pattern = \"addl2 %2,%0\";    }  else    {      if (low[2] == const0_rtx)	pattern = \"movl %1,%0\", carry = 0;      else	pattern = \"addl3 %2,%1,%0\";    }  if (pattern)    output_asm_insn (pattern, low);  if (!carry)    /* If CARRY is 0, we don't have any carry value to worry about.  */    return get_insn_template (CODE_FOR_addsi3, insn);  /* %0 = C + %1 + %2 */  if (!rtx_equal_p (operands[0], operands[1]))    output_asm_insn ((operands[1] == const0_rtx		      ? \"clrl %0\"		      : \"movl %1,%0\"), operands);  return \"adwc %2,%0\";}");;- All kinds of subtract instructions.(define_insn "subdf3"  [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g")	(minus:DF (match_operand:DF 1 "general_operand" "0,gF")		  (match_operand:DF 2 "general_operand" "gF,gF")))]  ""  "@   sub%#2 %2,%0   sub%#3 %2,%1,%0")(define_insn "subsf3"  [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g")	(minus:SF (match_operand:SF 1 "general_operand" "0,gF")		  (match_operand:SF 2 "general_operand" "gF,gF")))]  ""  "@   subf2 %2,%0   subf3 %2,%1,%0")(define_insn "subsi3"  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")	(minus:SI (match_operand:SI 1 "general_operand" "0,g")		  (match_operand:SI 2 "general_operand" "g,g")))]  ""  "@   subl2 %2,%0   subl3 %2,%1,%0")(define_insn "subhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")	(minus:HI (match_operand:HI 1 "general_operand" "0,g")		  (match_operand:HI 2 "general_operand" "g,g")))]  ""  "@   subw2 %2,%0   subw3 %2,%1,%0")(define_insn "subqi3"  [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")	(minus:QI (match_operand:QI 1 "general_operand" "0,g")		  (match_operand:QI 2 "general_operand" "g,g")))]  ""  "@   subb2 %2,%0   subb3 %2,%1,%0");; The subtract-with-carry (sbwc) instruction only takes two operands.(define_insn "subdi3"  [(set (match_operand:DI 0 "nonimmediate_operand" "=or>,or>")	(minus:DI (match_operand:DI 1 "general_operand" "0,or>")		  (match_operand:DI 2 "general_operand" "For,F")))]  ""  "*{  rtx low[3];  const char *pattern;  int carry = 1;  split_quadword_operands (operands, low, 3);  /* Subtract low parts.  */  if (rtx_equal_p (operands[0], operands[1]))    {      if (low[2] == const0_rtx)	pattern = 0, carry = 0;      else if (low[2] == constm1_rtx)	pattern = \"decl %0\";      else	pattern = \"subl2 %2,%0\";    }  else    {      if (low[2] == constm1_rtx)	pattern = \"decl %0\";      else if (low[2] == const0_rtx)	pattern = get_insn_template (CODE_FOR_movsi, insn), carry = 0;      else	pattern = \"subl3 %2,%1,%0\";    }  if (pattern)    output_asm_insn (pattern, low);  if (carry)    {      if (!rtx_equal_p (operands[0], operands[1]))	return \"movl %1,%0\;sbwc %2,%0\";      return \"sbwc %2,%0\";      /* %0 = %2 - %1 - C */    }  return get_insn_template (CODE_FOR_subsi3, insn);}");;- Multiply instructions.(define_insn "muldf3"  [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g,g")	(mult:DF (match_operand:DF 1 "general_operand" "0,gF,gF")		 (match_operand:DF 2 "general_operand" "gF,0,gF")))]  ""  "@   mul%#2 %2,%0   mul%#2 %1,%0   mul%#3 %1,%2,%0")(define_insn "mulsf3"  [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g,g")	(mult:SF (match_operand:SF 1 "general_operand" "0,gF,gF")		 (match_operand:SF 2 "general_operand" "gF,0,gF")))]  ""  "@   mulf2 %2,%0   mulf2 %1,%0   mulf3 %1,%2,%0")(define_insn "mulsi3"  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g,g")	(mult:SI (match_operand:SI 1 "general_operand" "0,g,g")		 (match_operand:SI 2 "general_operand" "g,0,g")))]  ""  "@   mull2 %2,%0   mull2 %1,%0   mull3 %1,%2,%0")(define_insn "mulhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g,")	(mult:HI (match_operand:HI 1 "general_operand" "0,g,g")		 (match_operand:HI 2 "general_operand" "g,0,g")))]  ""  "@   mulw2 %2,%0   mulw2 %1,%0   mulw3 %1,%2,%0")(define_insn "mulqi3"  [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g,g")	(mult:QI (match_operand:QI 1 "general_operand" "0,g,g")		 (match_operand:QI 2 "general_operand" "g,0,g")))]  ""  "@   mulb2 %2,%0   mulb2 %1,%0   mulb3 %1,%2,%0")(define_insn "mulsidi3"  [(set (match_operand:DI 0 "nonimmediate_operand" "=g")	(mult:DI (sign_extend:DI		  (match_operand:SI 1 "nonimmediate_operand" "g"))		 (sign_extend:DI		  (match_operand:SI 2 "nonimmediate_operand" "g"))))]  ""  "emul %1,%2,$0,%0")(define_insn ""  [(set (match_operand:DI 0 "nonimmediate_operand" "=g")	(plus:DI	 (mult:DI (sign_extend:DI		   (match_operand:SI 1 "nonimmediate_operand" "g"))		  (sign_extend:DI		   (match_operand:SI 2 "nonimmediate_operand" "g")))	 (sign_extend:DI (match_operand:SI 3 "nonimmediate_operand" "g"))))]  ""  "emul %1,%2,%3,%0");; 'F' constraint means type CONST_DOUBLE(define_insn ""  [(set (match_operand:DI 0 "nonimmediate_operand" "=g")	(plus:DI	 (mult:DI (sign_extend:DI		   (match_operand:SI 1 "nonimmediate_operand" "g"))		  (sign_extend:DI		   (match_operand:SI 2 "nonimmediate_operand" "g")))	 (match_operand:DI 3 "immediate_operand" "F")))]  "GET_CODE (operands[3]) == CONST_DOUBLE     && CONST_DOUBLE_HIGH (operands[3]) == (CONST_DOUBLE_LOW (operands[3]) >> 31)"  "*{  if (CONST_DOUBLE_HIGH (operands[3]))    operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[3]));  return \"emul %1,%2,%3,%0\";}");;- Divide instructions.(define_insn "divdf3"  [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g")	(div:DF (match_operand:DF 1 "general_operand" "0,gF")		(match_operand:DF 2 "general_operand" "gF,gF")))]  ""  "@   div%#2 %2,%0   div%#3 %2,%1,%0")(define_insn "divsf3"  [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g")	(div:SF (match_operand:SF 1 "general_operand" "0,gF")		(match_operand:SF 2 "general_operand" "gF,gF")))]  ""  "@   divf2 %2,%0   divf3 %2,%1,%0")(define_insn "divsi3"  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")	(div:SI (match_operand:SI 1 "general_operand" "0,g")		(match_operand:SI 2 "general_operand" "g,g")))]  ""  "@   divl2 %2,%0   divl3 %2,%1,%0")(define_insn "divhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")	(div:HI (match_operand:HI 1 "general_operand" "0,g")		(match_operand:HI 2 "general_operand" "g,g")))]  ""  "@   divw2 %2,%0   divw3 %2,%1,%0")(define_insn "divqi3"  [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")	(div:QI (match_operand:QI 1 "general_operand" "0,g")		(match_operand:QI 2 "general_operand" "g,g")))]  ""  "@   divb2 %2,%0   divb3 %2,%1,%0");This is left out because it is very slow;;we are better off programming around the "lack" of this insn.;(define_insn "divmoddisi4";  [(set (match_operand:SI 0 "general_operand" "=g");	(div:SI (match_operand:DI 1 "general_operand" "g");		(match_operand:SI 2 "general_operand" "g")));   (set (match_operand:SI 3 "general_operand" "=g");	(mod:SI (match_operand:DI 1 "general_operand" "g");		(match_operand:SI 2 "general_operand" "g")))];  "";  "ediv %2,%1,%0,%3");; Bit-and on the VAX is done with a clear-bits insn.(define_expand "andsi3"  [(set (match_operand:SI 0 "nonimmediate_operand" "")	(and:SI (not:SI (match_operand:SI 1 "general_operand" ""))		(match_operand:SI 2 "general_operand" "")))]  ""  "{  rtx op1 = operands[1];  /* If there is a constant argument, complement that one.  */  if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT)    {      operands[1] = operands[2];      operands[2] = op1;      op1 = operands[1];    }  if (GET_CODE (op1) == CONST_INT)    operands[1] = GEN_INT (~INTVAL (op1));  else    operands[1] = expand_unop (SImode, one_cmpl_optab, op1, 0, 1);}")(define_expand "andhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "")	(and:HI (not:HI (match_operand:HI 1 "general_operand" ""))		(match_operand:HI 2 "general_operand" "")))]  ""  "{  rtx op1 = operands[1];  if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT)    {      operands[1] = operands[2];      operands[2] = op1;      op1 = operands[1];    }  if (GET_CODE (op1) == CONST_INT)    operands[1] = GEN_INT (~INTVAL (op1));  else    operands[1] = expand_unop (HImode, one_cmpl_optab, op1, 0, 1);}")(define_expand "andqi3"  [(set (match_operand:QI 0 "nonimmediate_operand" "")	(and:QI (not:QI (match_operand:QI 1 "general_operand" ""))		(match_operand:QI 2 "general_operand" "")))]  ""  "{  rtx op1 = operands[1];  if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT)    {     operands[1] = operands[2];     operands[2] = op1;     op1 = operands[1];   }  if (GET_CODE (op1) == CONST_INT)    operands[1] = GEN_INT (~INTVAL (op1));  else    operands[1] = expand_unop (QImode, one_cmpl_optab, op1, 0, 1);}")(define_insn ""  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")	(and:SI (not:SI (match_operand:SI 1 "general_operand" "g,g"))		(match_operand:SI 2 "general_operand" "0,g")))]  ""  "@   bicl2 %1,%0   bicl3 %1,%2,%0")(define_insn ""  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")	(and:HI (not:HI (match_operand:HI 1 "general_operand" "g,g"))		(match_operand:HI 2 "general_operand" "0,g")))]  ""  "@   bicw2 %1,%0   bicw3 %1,%2,%0")(define_insn ""  [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")	(and:QI (not:QI (match_operand:QI 1 "general_operand" "g,g"))		(match_operand:QI 2 "general_operand" "0,g")))]  ""  "@   bicb2 %1,%0   bicb3 %1,%2,%0");; The following used to be needed because constant propagation can;; create them starting from the bic insn patterns above.  This is no;; longer a problem.  However, having these patterns allows optimization;; opportunities in combine.c.(define_insn ""  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")	(and:SI (match_operand:SI 1 "general_operand" "0,g")		(match_operand:SI 2 "const_int_operand" "n,n")))]  ""  "@   bicl2 %N2,%0   bicl3 %N2,%1,%0")(define_insn ""  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")	(and:HI (match_operand:HI 1 "general_operand" "0,g")		(match_operand:HI 2 "const_int_operand" "n,n")))]  ""  "@   bicw2 %H2,%0   bicw3 %H2,%1,%0")(define_insn ""  [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")	(and:QI (match_operand:QI 1 "general_operand" "0,g")		(match_operand:QI 2 "const_int_operand" "n,n")))]  ""  "@   bicb2 %B2,%0   bicb3 %B2,%1,%0");;- Bit set instructions.(define_insn "iorsi3"  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g,g")	(ior:SI (match_operand:SI 1 "general_operand" "0,g,g")		(match_operand:SI 2 "general_operand" "g,0,g")))]  ""  "@   bisl2 %2,%0   bisl2 %1,%0   bisl3 %2,%1,%0")(define_insn "iorhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g,g")	(ior:HI (match_operand:HI 1 "general_operand" "0,g,g")		(match_operand:HI 2 "general_operand" "g,0,g")))]  ""  "@   bisw2 %2,%0   bisw2 %1,%0   bisw3 %2,%1,%0")(define_insn "iorqi3"  [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g,g")	(ior:QI (match_operand:QI 1 "general_operand" "0,g,g")		(match_operand:QI 2 "general_operand" "g,0,g")))]  ""  "@   bisb2 %2,%0   bisb2 %1,%0   bisb3 %2,%1,%0");;- xor instructions.(define_insn "xorsi3"  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g,g")	(xor:SI (match_operand:SI 1 "general_operand" "0,g,g")		(match_operand:SI 2 "general_operand" "g,0,g")))]  ""  "@   xorl2 %2,%0   xorl2 %1,%0   xorl3 %2,%1,%0")(define_insn "xorhi3"  [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g,g")	(xor:HI (match_operand:HI 1 "general_operand" "0,g,g")		(match_operand:HI 2 "general_operand" "g,0,g")))]  ""  "@   xorw2 %2,%0   xorw2 %1,%0

⌨️ 快捷键说明

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