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

📄 vax.md

📁 gcc编译工具没有什么特别
💻 MD
📖 第 1 页 / 共 4 页
字号:
   addf2 %1,%0   addf3 %1,%2,%0")/* The space-time-opcode tradeoffs for addition vary by model of VAX.   On a VAX 3 "movab (r1)[r2],r3" is faster than "addl3 r1,r2,r3",   but it not faster on other models.   "movab #(r1),r2" is usually shorter than "addl3 #,r1,r2", and is   faster on a VAX 3, but some VAXes (e.g. VAX 9000) will stall if   a register is used in an address too soon after it is set.   Compromise by using movab only when it is shorter than the add   or the base register in the address is one of sp, ap, and fp,   which are not modified very often.  */(define_insn "addsi3"  [(set (match_operand:SI 0 "general_operand" "=g")	(plus:SI (match_operand:SI 1 "general_operand" "g")		 (match_operand:SI 2 "general_operand" "g")))]  ""  "*{  if (rtx_equal_p (operands[0], operands[1]))    {      if (operands[2] == const1_rtx)	return \"incl %0\";      if (operands[2] == constm1_rtx)	return \"decl %0\";      if (GET_CODE (operands[2]) == CONST_INT	  && (unsigned) (- INTVAL (operands[2])) < 64)	return \"subl2 $%n2,%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\";      return \"addl2 %2,%0\";    }  if (rtx_equal_p (operands[0], operands[2]))    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 "general_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 "general_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 "general_operand" "=ro>,ro>")	(plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")		 (match_operand:DI 2 "general_operand" "Fro,F")))]  ""  "*{  rtx low[3];  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 OUT_FCN (CODE_FOR_addsi3) (operands, 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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_operand" "=or>,or>")	(minus:DI (match_operand:DI 1 "general_operand" "0,or>")		  (match_operand:DI 2 "general_operand" "For,F")))]  ""  "*{  rtx low[3];  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 = OUT_FCN (CODE_FOR_movsi) (low, 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 OUT_FCN (CODE_FOR_subsi3) (operands, insn);}");;- Multiply instructions.(define_insn "muldf3"  [(set (match_operand:DF 0 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_operand" "=g")	(and:SI (not:SI (match_operand:SI 1 "general_operand" "g"))		(match_operand:SI 2 "general_operand" "g")))]  ""  "{  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 "general_operand" "=g")	(and:HI (not:HI (match_operand:HI 1 "general_operand" "g"))		(match_operand:HI 2 "general_operand" "g")))]  ""  "{  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 (65535 & ~INTVAL (op1));  else    operands[1] = expand_unop (HImode, one_cmpl_optab, op1, 0, 1);}")(define_expand "andqi3"  [(set (match_operand:QI 0 "general_operand" "=g")	(and:QI (not:QI (match_operand:QI 1 "general_operand" "g"))		(match_operand:QI 2 "general_operand" "g")))]  ""  "{  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 (255 & ~INTVAL (op1));  else    operands[1] = expand_unop (QImode, one_cmpl_optab, op1, 0, 1);}")(define_insn ""  [(set (match_operand:SI 0 "general_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 "general_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 "general_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 "general_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 "general_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 "general_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 "general_operand" "=g,g,g")

⌨️ 快捷键说明

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