📄 i860.md
字号:
[(set (match_operand:SI 0 "register_operand" "=r,r,*f") (minus:SI (match_operand:SI 1 "register_operand" "r,I,*f") (match_operand:SI 2 "nonmemory_operand" "rn,r,*f")))] "" "*{ if (which_alternative == 2) return \"fisub.ss %1,%2,%0\"; if (REG_P (operands[2])) return \"subu %1,%2,%0\"; if (SMALL_INT (operands[2]) && INTVAL (operands[2]) != -0x10000) { operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2])); return \"addu %2,%1,%0\"; } cc_status.flags &= ~CC_KNOW_HI_R31; return \"orh h%%%2,r0,r31\;or l%%%2,r31,r31\;sub %1,r31,%0\";}")(define_insn "subdi3" [(set (match_operand:DI 0 "register_operand" "=f") (minus:DI (match_operand:DI 1 "register_operand" "%f") (match_operand:DI 2 "register_operand" "f")))] "" "fisub.dd %1,%2,%0")(define_expand "mulsi3" [(set (subreg:SI (match_dup 4) 0) (match_operand:SI 1 "general_operand" "")) (set (subreg:SI (match_dup 5) 0) (match_operand:SI 2 "general_operand" "")) (clobber (match_dup 3)) (set (subreg:SI (match_dup 3) 0) (mult:SI (subreg:SI (match_dup 4) 0) (subreg:SI (match_dup 5) 0))) (set (match_operand:SI 0 "register_operand" "") (subreg:SI (match_dup 3) 0))] "" "{ operands[3] = gen_reg_rtx (DImode); operands[4] = gen_reg_rtx (DImode); operands[5] = gen_reg_rtx (DImode);}")(define_insn "" [(set (subreg:SI (match_operand:DI 0 "register_operand" "=f") 0) (mult:SI (subreg:SI (match_operand:DI 1 "register_operand" "f") 0) (subreg:SI (match_operand:DI 2 "register_operand" "f") 0)))] "" "fmlow.dd %2,%1,%0");;- and instructions (with complement also) (define_insn "andsi3" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "nonmemory_operand" "%r") (match_operand:SI 2 "nonmemory_operand" "rn")))] "" "*{ rtx xop[3]; if (REG_P (operands[2]) || LOGIC_INT (operands[2])) return \"and %2,%1,%0\"; if ((INTVAL (operands[2]) & 0xffff) == 0) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"andh %2,%1,%0\"; } xop[0] = operands[0]; xop[1] = operands[1]; xop[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]) & 0xffff); output_asm_insn (\"andnot %2,%1,%0\", xop); operands[2] = gen_rtx (CONST_INT, VOIDmode, ~(unsigned) INTVAL (operands[2]) >> 16); return \"andnoth %2,%0,%0\";}")(define_insn "andcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "register_operand" "r") (not:SI (match_operand:SI 2 "register_operand" "rn"))))] "" "*{ rtx xop[3]; if (REG_P (operands[2]) || LOGIC_INT (operands[2])) return \"andnot %2,%1,%0\"; if ((INTVAL (operands[2]) & 0xffff) == 0) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"andnoth %2,%1,%0\"; } xop[0] = operands[0]; xop[1] = operands[1]; xop[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0xffff)); output_asm_insn (\"andnot %2,%1,%0\", xop); operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"andnoth %2,%0,%0\";}")(define_insn "iorsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (match_operand:SI 1 "nonmemory_operand" "%r") (match_operand:SI 2 "nonmemory_operand" "rn")))] "" "*{ rtx xop[3]; if (REG_P (operands[2]) || LOGIC_INT (operands[2])) return \"or %2,%1,%0\"; if ((INTVAL (operands[2]) & 0xffff) == 0) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"orh %2,%1,%0\"; } xop[0] = operands[0]; xop[1] = operands[1]; xop[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0xffff)); output_asm_insn (\"or %2,%1,%0\", xop); operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"orh %2,%0,%0\";}")(define_insn "xorsi3" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (match_operand:SI 1 "nonmemory_operand" "%r") (match_operand:SI 2 "nonmemory_operand" "rn")))] "" "*{ rtx xop[3]; if (REG_P (operands[2]) || LOGIC_INT (operands[2])) return \"xor %2,%1,%0\"; if ((INTVAL (operands[2]) & 0xffff) == 0) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"xorh %2,%1,%0\"; } xop[0] = operands[0]; xop[1] = operands[1]; xop[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0xffff)); output_asm_insn (\"xor %2,%1,%0\", xop); operands[2] = gen_rtx (CONST_INT, VOIDmode, (unsigned) INTVAL (operands[2]) >> 16); return \"xorh %2,%0,%0\";}")(define_insn "negsi2" [(set (match_operand:SI 0 "general_operand" "=r") (neg:SI (match_operand:SI 1 "arith_operand" "rI")))] "" "subu r0,%1,%0")(define_insn "one_cmplsi2" [(set (match_operand:SI 0 "general_operand" "=r") (not:SI (match_operand:SI 1 "arith_operand" "r")))] "" "subu -1,%1,%0");; Floating point arithmetic instructions.(define_insn "adddf3" [(set (match_operand:DF 0 "register_operand" "=f") (plus:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "fadd.dd %1,%2,%0")(define_insn "addsf3" [(set (match_operand:SF 0 "register_operand" "=f") (plus:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fadd.ss %1,%2,%0")(define_insn "subdf3" [(set (match_operand:DF 0 "register_operand" "=f") (minus:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "fsub.dd %1,%2,%0")(define_insn "subsf3" [(set (match_operand:SF 0 "register_operand" "=f") (minus:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fsub.ss %1,%2,%0")(define_insn "muldf3" [(set (match_operand:DF 0 "register_operand" "=f") (mult:DF (match_operand:DF 1 "register_operand" "f") (match_operand:DF 2 "register_operand" "f")))] "" "fmul.dd %1,%2,%0")(define_insn "mulsf3" [(set (match_operand:SF 0 "register_operand" "=f") (mult:SF (match_operand:SF 1 "register_operand" "f") (match_operand:SF 2 "register_operand" "f")))] "" "fmul.ss %1,%2,%0")(define_insn "negdf2" [(set (match_operand:DF 0 "register_operand" "=f") (neg:DF (match_operand:DF 1 "register_operand" "f")))] "" "fsub.dd f0,%1,%0")(define_insn "negsf2" [(set (match_operand:SF 0 "register_operand" "=f") (neg:SF (match_operand:SF 1 "register_operand" "f")))] "" "fsub.ss f0,%1,%0");; Shift instructions;; Optimized special case of shifting.;; Must precede the general case.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m") (const_int 24)))] "" "*{ if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0))) { cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ; cc_status.mdep = XEXP (operands[1], 0); return \"orh ha%%%m1,r0,r31\;ld.b l%%%m1(r31),%0\"; } return \"ld.b %1,%0\";}");;- arithmetic shift instructions(define_insn "ashlsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ashift:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "nonmemory_operand" "rn")))] "" "*{ if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32) return \"mov r0,%0\"; return \"shl %2,%1,%0\";}")(define_insn "ashlhi3" [(set (match_operand:HI 0 "register_operand" "=r") (ashift:HI (match_operand:HI 1 "register_operand" "r") (match_operand:HI 2 "nonmemory_operand" "rn")))] "" "*{ if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 16) return \"mov r0,%0\"; return \"shl %2,%1,%0\";}")(define_insn "ashlqi3" [(set (match_operand:QI 0 "register_operand" "=r") (ashift:QI (match_operand:QI 1 "register_operand" "r") (match_operand:QI 2 "nonmemory_operand" "rn")))] "" "*{ if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 8) return \"mov r0,%0\"; return \"shl %2,%1,%0\";}")(define_insn "ashrsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "nonmemory_operand" "rn")))] "" "*{ if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32) return \"shra 31,%1,%0\"; return \"shra %2,%1,%0\";}")(define_insn "lshrsi3" [(set (match_operand:SI 0 "register_operand" "=r") (lshiftrt:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "nonmemory_operand" "rn")))] "" "*{ if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32) return \"mov r0,%0\"; return \"shr %2,%1,%0\";}");; Unconditional and other jump instructions(define_insn "jump" [(set (pc) (label_ref (match_operand 0 "" "")))] "" "*{ return \"br %l0\;nop\";}");; Here are two simple peepholes which fill the delay slot of;; an unconditional branch.(define_peephole [(set (match_operand:SI 0 "register_operand" "=rf") (match_operand:SI 1 "single_insn_src_p" "p")) (set (pc) (label_ref (match_operand 2 "" "")))] "" "* return output_delayed_branch (\"br %l2\", operands, insn);")(define_peephole [(set (match_operand:SI 0 "memory_operand" "=m") (match_operand:SI 1 "reg_or_0_operand" "rfJ")) (set (pc) (label_ref (match_operand 2 "" "")))] "" "* return output_delayed_branch (\"br %l2\", operands, insn);")(define_insn "tablejump" [(set (pc) (match_operand:SI 0 "register_operand" "r")) (use (label_ref (match_operand 1 "" "")))] "" "bri %0\;nop")(define_peephole [(set (match_operand:SI 0 "memory_operand" "=m") (match_operand:SI 1 "reg_or_0_operand" "rfJ")) (set (pc) (match_operand:SI 2 "register_operand" "r")) (use (label_ref (match_operand 3 "" "")))] "" "* return output_delayed_branch (\"bri %2\", operands, insn);");;- jump to subroutine(define_expand "call" [(call (match_operand:SI 0 "memory_operand" "m") (match_operand 1 "" "i"))] ;; operand[2] is next_arg_register "" "{ if (INTVAL (operands[1]) > 0) { emit_move_insn (arg_pointer_rtx, stack_pointer_rtx); emit_insn (gen_rtx (USE, VOIDmode, arg_pointer_rtx)); }}");;- jump to subroutine(define_insn "" [(call (match_operand:SI 0 "memory_operand" "m") (match_operand 1 "" "i"))] ;; operand[2] is next_arg_register "" "*{ /* strip the MEM. */ operands[0] = XEXP (operands[0], 0); CC_STATUS_INIT; if (GET_CODE (operands[0]) == REG) return \"calli %0\;nop\"; return \"call %0\;nop\";}")(define_peephole [(set (match_operand:SI 0 "register_operand" "=rf") (match_operand:SI 1 "single_insn_src_p" "p")) (call (match_operand:SI 2 "memory_operand" "m") (match_operand 3 "" "i"))] ;;- Don't use operand 1 for most machines. "! reg_mentioned_p (operands[0], operands[2])" "*{ /* strip the MEM. */ operands[2] = XEXP (operands[2], 0); if (GET_CODE (operands[2]) == REG) return output_delayed_branch (\"calli %2\", operands, insn); return output_delayed_branch (\"call %2\", operands, insn);}")(define_peephole [(set (match_operand:SI 0 "memory_operand" "=m") (match_operand:SI 1 "reg_or_0_operand" "rfJ")) (call (match_operand:SI 2 "memory_operand" "m") (match_operand 3 "" "i"))] ;;- Don't use operand 1 for most machines. "" "*{ /* strip the MEM. */ operands[2] = XEXP (operands[2], 0); if (GET_CODE (operands[2]) == REG) return output_delayed_branch (\"calli %2\", operands, insn); return output_delayed_branch (\"call %2\", operands, insn);}")(define_expand "call_value" [(set (match_operand 0 "register_operand" "=rf") (call (match_operand:SI 1 "memory_operand" "m") (match_operand 2 "" "i")))] ;; operand 3 is next_arg_register "" "{ if (INTVAL (operands[2]) > 0) { emit_move_insn (arg_pointer_rtx, stack_pointer_rtx); emit_insn (gen_rtx (USE, VOIDmode, arg_pointer_rtx)); }}")(define_insn "" [(set (match_operand 0 "register_operand" "=rf") (call (match_operand:SI 1 "memory_operand" "m") (match_operand 2 "" "i")))] ;; operand 3 is next_arg_register "" "*{ /* strip the MEM. */ operands[1] = XEXP (operands[1], 0); CC_STATUS_INIT; if (GET_CODE (operands[1]) == REG) return \"calli %1\;nop\"; return \"call %1\;nop\";}")(define_peephole [(set (match_operand:SI 0 "register_operand" "=rf") (match_operand:SI 1 "single_insn_src_p" "p")) (set (match_operand 2 "" "=rf") (call (match_operand:SI 3 "memory_operand" "m") (match_operand 4 "" "i")))] ;;- Don't use operand 4 for most machines. "! reg_mentioned_p (operands[0], operands[3])" "*{ /* strip the MEM. */ operands[3] = XEXP (operands[3], 0); if (GET_CODE (operands[3]) == REG) return output_delayed_branch (\"calli %3\", operands, insn); return output_delayed_branch (\"call %3\", operands, insn);}")(define_peephole [(set (match_operand:SI 0 "memory_operand" "=m") (match_operand:SI 1 "reg_or_0_operand" "rJf")) (set (match_operand 2 "" "=rf") (call (match_operand:SI 3 "memory_operand" "m") (match_operand 4 "" "i")))] ;;- Don't use operand 4 for most machines. "" "*{ /* strip the MEM. */ operands[3] = XEXP (operands[3], 0); if (GET_CODE (operands[3]) == REG) return output_delayed_branch (\"calli %3\", operands, insn); return output_delayed_branch (\"call %3\", operands, insn);}")(define_insn "nop" [(const_int 0)] "" "nop")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (label_ref (match_operand 2 "" "")))))] "" "*{ cc_status.flags = 0; return \"mov %l2,r31\;ld.l r31(%1),%0\";}") (define_peephole [(set (match_operand:SI 0 "register_operand" "=rf") (match_operand:SI 1 "single_insn_src_p" "p")) (set (pc) (match_operand:SI 2 "register_operand" "r")) (use (label_ref (match_operand 3 "" "")))] "REGNO (operands[0]) != REGNO (operands[2])" "* return output_delayed_branch (\"bri %2\", operands, insn);");;- Local variables:;;- mode:emacs-lisp;;- comment-start: ";;- ";;- eval: (set-syntax-table (copy-sequence (syntax-table)));;- eval: (modify-syntax-entry ?[ "(]");;- eval: (modify-syntax-entry ?] ")[");;- eval: (modify-syntax-entry ?{ "(}");;- eval: (modify-syntax-entry ?} "){");;- End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -