📄 vax.md
字号:
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 + -