📄 vax.md
字号:
if (operands[2] == const1_rtx) return \"incw %0\"; if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == -1) 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 (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == -1) 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\";}");;- All kinds of subtract instructions.(define_insn "subdf3" [(set (match_operand:DF 0 "general_operand" "=g") (minus:DF (match_operand:DF 1 "general_operand" "gF") (match_operand:DF 2 "general_operand" "gF")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"sub%#2 %2,%0\"; return \"sub%#3 %2,%1,%0\";}")(define_insn "subsf3" [(set (match_operand:SF 0 "general_operand" "=g") (minus:SF (match_operand:SF 1 "general_operand" "gF") (match_operand:SF 2 "general_operand" "gF")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"subf2 %2,%0\"; return \"subf3 %2,%1,%0\";}")(define_insn "subsi3" [(set (match_operand:SI 0 "general_operand" "=g") (minus: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 \"decl %0\"; return \"subl2 %2,%0\"; } return \"subl3 %2,%1,%0\";}")(define_insn "subhi3" [(set (match_operand:HI 0 "general_operand" "=g") (minus: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 \"decw %0\"; return \"subw2 %2,%0\"; } return \"subw3 %2,%1,%0\";}")(define_insn "subqi3" [(set (match_operand:QI 0 "general_operand" "=g") (minus: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 \"decb %0\"; return \"subb2 %2,%0\"; } return \"subb3 %2,%1,%0\";}");;- Multiply instructions.(define_insn "muldf3" [(set (match_operand:DF 0 "general_operand" "=g") (mult:DF (match_operand:DF 1 "general_operand" "gF") (match_operand:DF 2 "general_operand" "gF")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"mul%#2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"mul%#2 %1,%0\"; return \"mul%#3 %1,%2,%0\";}")(define_insn "mulsf3" [(set (match_operand:SF 0 "general_operand" "=g") (mult:SF (match_operand:SF 1 "general_operand" "gF") (match_operand:SF 2 "general_operand" "gF")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"mulf2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"mulf2 %1,%0\"; return \"mulf3 %1,%2,%0\";}")(define_insn "mulsi3" [(set (match_operand:SI 0 "general_operand" "=g") (mult:SI (match_operand:SI 1 "general_operand" "g") (match_operand:SI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"mull2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"mull2 %1,%0\"; return \"mull3 %1,%2,%0\";}")(define_insn "mulhi3" [(set (match_operand:HI 0 "general_operand" "=g") (mult:HI (match_operand:HI 1 "general_operand" "g") (match_operand:HI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"mulw2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"mulw2 %1,%0\"; return \"mulw3 %1,%2,%0\";}")(define_insn "mulqi3" [(set (match_operand:QI 0 "general_operand" "=g") (mult:QI (match_operand:QI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"mulb2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"mulb2 %1,%0\"; return \"mulb3 %1,%2,%0\";}");;- Divide instructions.(define_insn "divdf3" [(set (match_operand:DF 0 "general_operand" "=g") (div:DF (match_operand:DF 1 "general_operand" "gF") (match_operand:DF 2 "general_operand" "gF")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"div%#2 %2,%0\"; return \"div%#3 %2,%1,%0\";}")(define_insn "divsf3" [(set (match_operand:SF 0 "general_operand" "=g") (div:SF (match_operand:SF 1 "general_operand" "gF") (match_operand:SF 2 "general_operand" "gF")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"divf2 %2,%0\"; return \"divf3 %2,%1,%0\";}")(define_insn "divsi3" [(set (match_operand:SI 0 "general_operand" "=g") (div:SI (match_operand:SI 1 "general_operand" "g") (match_operand:SI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"divl2 %2,%0\"; return \"divl3 %2,%1,%0\";}")(define_insn "divhi3" [(set (match_operand:HI 0 "general_operand" "=g") (div:HI (match_operand:HI 1 "general_operand" "g") (match_operand:HI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"divw2 %2,%0\"; return \"divw3 %2,%1,%0\";}")(define_insn "divqi3" [(set (match_operand:QI 0 "general_operand" "=g") (div:QI (match_operand:QI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"divb2 %2,%0\"; return \"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 (match_operand:SI 1 "general_operand" "g") (not:SI (match_operand:SI 2 "general_operand" "g"))))] "" "{ extern rtx expand_unop (); if (GET_CODE (operands[2]) == CONST_INT) operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2])); else operands[2] = expand_unop (SImode, one_cmpl_optab, operands[2], 0, 1);}")(define_expand "andhi3" [(set (match_operand:HI 0 "general_operand" "=g") (and:HI (match_operand:HI 1 "general_operand" "g") (not:HI (match_operand:HI 2 "general_operand" "g"))))] "" "{ extern rtx expand_unop (); rtx op = operands[2]; if (GET_CODE (op) == CONST_INT) operands[2] = gen_rtx (CONST_INT, VOIDmode, ((1 << 16) - 1) & ~INTVAL (op)); else operands[2] = expand_unop (HImode, one_cmpl_optab, op, 0, 1);}")(define_expand "andqi3" [(set (match_operand:QI 0 "general_operand" "=g") (and:QI (match_operand:QI 1 "general_operand" "g") (not:QI (match_operand:QI 2 "general_operand" "g"))))] "" "{ extern rtx expand_unop (); rtx op = operands[2]; if (GET_CODE (op) == CONST_INT) operands[2] = gen_rtx (CONST_INT, VOIDmode, ((1 << 8) - 1) & ~INTVAL (op)); else operands[2] = expand_unop (QImode, one_cmpl_optab, op, 0, 1);}")(define_insn "andcbsi3" [(set (match_operand:SI 0 "general_operand" "=g") (and:SI (match_operand:SI 1 "general_operand" "g") (not:SI (match_operand:SI 2 "general_operand" "g"))))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"bicl2 %2,%0\"; return \"bicl3 %2,%1,%0\";}")(define_insn "andcbhi3" [(set (match_operand:HI 0 "general_operand" "=g") (and:HI (match_operand:HI 1 "general_operand" "g") (not:HI (match_operand:HI 2 "general_operand" "g"))))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"bicw2 %2,%0\"; return \"bicw3 %2,%1,%0\";}")(define_insn "andcbqi3" [(set (match_operand:QI 0 "general_operand" "=g") (and:QI (match_operand:QI 1 "general_operand" "g") (not:QI (match_operand:QI 2 "general_operand" "g"))))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"bicb2 %2,%0\"; return \"bicb3 %2,%1,%0\";}");; The following are needed because constant propagation can;; create them starting from the bic insn patterns above.(define_insn "" [(set (match_operand:SI 0 "general_operand" "=g") (and:SI (match_operand:SI 1 "general_operand" "g") (match_operand:SI 2 "general_operand" "g")))] "GET_CODE (operands[2]) == CONST_INT" "*{ operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2])); if (rtx_equal_p (operands[1], operands[0])) return \"bicl2 %2,%0\"; return \"bicl3 %2,%1,%0\";}")(define_insn "" [(set (match_operand:HI 0 "general_operand" "=g") (and:HI (match_operand:HI 1 "general_operand" "g") (match_operand:HI 2 "general_operand" "g")))] "GET_CODE (operands[2]) == CONST_INT" "*{ operands[2] = gen_rtx (CONST_INT, VOIDmode, 0xffff & ~INTVAL (operands[2])); if (rtx_equal_p (operands[1], operands[0])) return \"bicw2 %2,%0\"; return \"bicw3 %2,%1,%0\";}")(define_insn "" [(set (match_operand:QI 0 "general_operand" "=g") (and:QI (match_operand:QI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "GET_CODE (operands[2]) == CONST_INT" "*{ operands[2] = gen_rtx (CONST_INT, VOIDmode, 0xff & ~INTVAL (operands[2])); if (rtx_equal_p (operands[1], operands[0])) return \"bicb2 %2,%0\"; return \"bicb3 %2,%1,%0\";}");;- Bit set instructions.(define_insn "iorsi3" [(set (match_operand:SI 0 "general_operand" "=g") (ior:SI (match_operand:SI 1 "general_operand" "g") (match_operand:SI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"bisl2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"bisl2 %1,%0\"; return \"bisl3 %2,%1,%0\";}")(define_insn "iorhi3" [(set (match_operand:HI 0 "general_operand" "=g") (ior:HI (match_operand:HI 1 "general_operand" "g") (match_operand:HI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"bisw2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"bisw2 %1,%0\"; return \"bisw3 %2,%1,%0\";}")(define_insn "iorqi3" [(set (match_operand:QI 0 "general_operand" "=g") (ior:QI (match_operand:QI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"bisb2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"bisb2 %1,%0\"; return \"bisb3 %2,%1,%0\";}");;- xor instructions.(define_insn "xorsi3" [(set (match_operand:SI 0 "general_operand" "=g") (xor:SI (match_operand:SI 1 "general_operand" "g") (match_operand:SI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"xorl2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"xorl2 %1,%0\"; return \"xorl3 %2,%1,%0\";}")(define_insn "xorhi3" [(set (match_operand:HI 0 "general_operand" "=g") (xor:HI (match_operand:HI 1 "general_operand" "g") (match_operand:HI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"xorw2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"xorw2 %1,%0\"; return \"xorw3 %2,%1,%0\";}")(define_insn "xorqi3" [(set (match_operand:QI 0 "general_operand" "=g") (xor:QI (match_operand:QI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "" "*{ if (rtx_equal_p (operands[0], operands[1])) return \"xorb2 %2,%0\"; if (rtx_equal_p (operands[0], operands[2])) return \"xorb2 %1,%0\"; return \"xorb3 %2,%1,%0\";}")(define_insn "negdf2" [(set (match_operand:DF 0 "general_operand" "=g") (neg:DF (match_operand:DF 1 "general_operand" "gF")))] "" "mneg%# %1,%0")(define_insn "negsf2" [(set (match_operand:SF 0 "general_operand" "=g") (neg:SF (match_operand:SF 1 "general_operand" "gF")))] "" "mnegf %1,%0")(define_insn "negsi2" [(set (match_operand:SI 0 "general_operand" "=g") (neg:SI (match_operand:SI 1 "general_operand" "g")))] "" "mnegl %1,%0")(define_insn "neghi2" [(set (match_operand:HI 0 "general_operand" "=g") (neg:HI (match_operand:HI 1 "general_operand" "g")))] "" "mnegw %1,%0")(define_insn "negqi2" [(set (match_operand:QI 0 "general_operand" "=g") (neg:QI (match_operand:QI 1 "general_operand" "g")))] "" "mnegb %1,%0")(define_insn "one_cmplsi2" [(set (match_operand:SI 0 "general_operand" "=g") (not:SI (match_operand:SI 1 "general_operand" "g")))] "" "mcoml %1,%0")(define_insn "one_cmplhi2" [(set (match_operand:HI 0 "general_operand" "=g") (not:HI (match_operand:HI 1 "general_operand" "g")))] "" "mcomw %1,%0")(define_insn "one_cmplqi2" [(set (match_operand:QI 0 "general_operand" "=g") (not:QI (match_operand:QI 1 "general_operand" "g")))] "" "mcomb %1,%0");; Arithmetic right shift on the vax works by negating the shift count.(define_expand "ashrsi3" [(set (match_operand:SI 0 "general_operand" "=g") (ashift:SI (match_operand:SI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "" "{ operands[2] = negate_rtx (QImode, operands[2]);}")(define_insn "ashlsi3" [(set (match_operand:SI 0 "general_operand" "=g") (ashift:SI (match_operand:SI 1 "general_operand" "g") (match_operand:QI 2 "general_operand" "g")))] "" "*{ if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -