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

📄 vax.md

📁 早期freebsd实现
💻 MD
📖 第 1 页 / 共 4 页
字号:
;;- All kinds of add instructions.(define_insn "adddf3"  [(set (match_operand:DF 0 "general_operand" "=g,g,g")	(plus:DF (match_operand:DF 1 "general_operand" "0,gF,gF")		 (match_operand:DF 2 "general_operand" "gF,0,gF")))]  ""  "@   add%#2 %2,%0   add%#2 %1,%0   add%#3 %1,%2,%0")(define_insn "addsf3"  [(set (match_operand:SF 0 "general_operand" "=g,g,g")	(plus:SF (match_operand:SF 1 "general_operand" "0,gF,gF")		 (match_operand:SF 2 "general_operand" "gF,0,gF")))]  ""  "@   addf2 %2,%0   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_rtx (CONST_INT, VOIDmode, 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_rtx (CONST_INT, VOIDmode, ~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_rtx (CONST_INT, VOIDmode, 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_rtx (CONST_INT, VOIDmode, 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")

⌨️ 快捷键说明

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