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