📄 h8300.md
字号:
return \"btst #0,%0l\"; else return \"mov.l %S0,%S0\";}" [(set_attr "type" "arith") (set_attr "length" "4") (set_attr "cc" "set")])(define_insn "cmpqi" [(set (cc0) (compare:QI (match_operand:QI 0 "register_operand" "ra") (match_operand:QI 1 "nonmemory_operand" "rai")))] "" "cmp.b %X1,%X0" [(set_attr "type" "arith") (set_attr "length" "2") (set_attr "cc" "compare")]);; ??? 300h can have an immediate operand here.(define_insn "cmphi" [(set (cc0) (compare:HI (match_operand:HI 0 "register_operand" "ra") (match_operand:HI 1 "register_operand" "ra")))] "" "cmp.w %T1,%T0" [(set_attr "type" "arith") (set_attr "length" "2") (set_attr "cc" "compare")]);; ??? 300h can have an immediate operand here.(define_insn "cmpsi" [(set (cc0) (compare:SI (match_operand:SI 0 "register_operand" "ra") (match_operand:SI 1 "register_operand" "ra")))] "TARGET_H8300H" "cmp.l %S1,%S0" [(set_attr "type" "arith") (set_attr "length" "2") (set_attr "cc" "compare")]);; ----------------------------------------------------------------------;; ADD INSTRUCTIONS;; ----------------------------------------------------------------------(define_insn "addqi3" [(set (match_operand:QI 0 "register_operand" "=r") (plus:QI (match_operand:QI 1 "register_operand" "%0") (match_operand:QI 2 "nonmemory_operand" "ri")))] "" "add.b %X2,%X0" [(set_attr "type" "arith") (set_attr "length" "2") (set_attr "cc" "set")]);; ??? adds operates on the 32bit register. We can use it because we don't;; use the e0-7 registers.;; ??? 4 can be handled in one insn on the 300h.(define_insn "addhi3_internal" [(set (match_operand:HI 0 "register_operand" "=ra,ra,ra,ra,r,ra") (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0") (match_operand:HI 2 "nonmemory_operand" "K,M,L,N,n,ra")))] "" "@ adds %T2,%A0 adds #2,%A0\;adds %C2,%A0 subs %M2,%A0 subs #2,%A0\;subs %M2,%A0 add.b %s2,%s0\;addx %t2,%t0 add.w %T2,%T0" [(set_attr "type" "arith,multi,arith,multi,multi,arith") (set_attr "length" "2,4,2,4,4,2") (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,clobber,set")]);; ??? Why is this here?(define_expand "addhi3" [(set (match_operand:HI 0 "register_operand" "") (plus:HI (match_operand:HI 1 "register_operand" "") (match_operand:HI 2 "nonmemory_operand" "")))] "" "")(define_expand "addsi3" [(set (match_operand:SI 0 "register_operand" "") (plus:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "nonmemory_operand" "")))] "" "")(define_insn "addsi_h8300" [(set (match_operand:SI 0 "register_operand" "=r,r,&r") (plus:SI (match_operand:SI 1 "register_operand" "%0,0,r") (match_operand:SI 2 "nonmemory_operand" "n,r,r")))] "TARGET_H8300" "@ add %w2,%w0\;addx %x2,%x0\;addx %y2,%y0\;addx %z2,%z0 add.w %f2,%f0\;addx %y2,%y0\;addx %z2,%z0 mov %f1,%f0\;mov %e1,%e0\;add.w %f2,%f0\;addx %y2,%y0\;addx %z2,%z0" [(set_attr "type" "arith") (set_attr "length" "8,6,20") (set_attr "cc" "clobber")]);; ??? 4 can be handled in one insn on the 300h.;; ??? Should the 'n' constraint be 'i' here?;; ??? We don't handle (reg + symbol_ref) which the 300h can handle.(define_insn "addsi_h8300h" [(set (match_operand:SI 0 "register_operand" "=ra,ra,ra,ra,r,ra") (plus:SI (match_operand:SI 1 "register_operand" "%0,0,0,0,0,0") (match_operand:SI 2 "nonmemory_operand" "K,M,L,N,n,ra")))] "TARGET_H8300H" "@ adds %S2,%S0 adds #2,%S0\;adds %C2,%S0 subs %M2,%S0 subs #2,%S0\;subs %M2,%S0 add.l %S2,%S0 add.l %S2,%S0" [(set_attr "type" "multi,multi,multi,multi,arith,arith") (set_attr "length" "2,4,2,4,6,2") (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,clobber,clobber")]);; ----------------------------------------------------------------------;; SUBTRACT INSTRUCTIONS;; ----------------------------------------------------------------------(define_insn "subqi3" [(set (match_operand:QI 0 "register_operand" "=r,r") (minus:QI (match_operand:QI 1 "register_operand" "0,0") (match_operand:QI 2 "nonmemory_operand" "r,i")))] "" "@ sub.b %X2,%X0 add.b %G2,%X0" [(set_attr "type" "arith") (set_attr "length" "2") (set_attr "cc" "set")]);; ??? subs operates on the 32bit register. We can use it because we don't;; use the e0-7 registers.;; ??? 4 can be handled in one insn on the 300h.;; ??? The fourth alternative can use sub.w on the 300h.;; ??? Should the 'n' constraint be an 'i' here?(define_insn "subhi3_internal" [(set (match_operand:HI 0 "register_operand" "=ra,ra,ra,r") (minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0") (match_operand:HI 2 "nonmemory_operand" "K,M,ra,n")))] "" "@ subs %T2,%T0 subs #2,%T0\;subs %M2,%T0 sub.w %T2,%T0 add.b %E2,%s0\;addx %F2,%t0 ; -%0" [(set_attr "type" "multi") (set_attr "length" "2,4,2,4") (set_attr "cc" "none_0hit,none_0hit,set,clobber")]);; ??? Why is this here?(define_expand "subhi3" [(set (match_operand:HI 0 "register_operand" "") (minus:HI (match_operand:HI 1 "register_operand" "") (match_operand:HI 2 "nonmemory_operand" "")))] "" "")(define_expand "subsi3" [(set (match_operand:SI 0 "register_operand" "") (minus:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "nonmemory_operand" "")))] "" "")(define_insn "subsi3_h8300" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "register_operand" "r")))] "TARGET_H8300" "sub.w %f2,%f0\;subx %y2,%y0\;subx %z2,%z0" [(set_attr "type" "arith") (set_attr "length" "6") (set_attr "cc" "clobber")]);; ??? 4 can be handled in one insn on the 300h.(define_insn "subsi3_h8300h" [(set (match_operand:SI 0 "register_operand" "=ra,ra,ra,r") (minus:SI (match_operand:SI 1 "general_operand" "0,0,0,0") (match_operand:SI 2 "nonmemory_operand" "K,M,ra,n")))] "TARGET_H8300H" "@ subs %T2,%T0 subs #2,%T0\;subs %E2,%T0 sub.l %S2,%S0 sub.l %S2,%S0" [(set_attr "type" "multi") (set_attr "length" "2,4,2,6") (set_attr "cc" "none_0hit,none_0hit,set,set")]);; ----------------------------------------------------------------------;; MULTIPLY INSTRUCTIONS;; ----------------------------------------------------------------------;; Note that the h8/300 can only handle umulqihi3.(define_insn "mulqihi3" [(set (match_operand:HI 0 "register_operand" "=r") (mult:HI (sign_extend:HI (match_operand:QI 1 "general_operand" "%0")) (sign_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "TARGET_H8300H" "mulxs.b %X2,%T0" [(set_attr "type" "multi") (set_attr "length" "4") (set_attr "cc" "set")])(define_insn "mulhisi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (sign_extend:SI (match_operand:HI 1 "general_operand" "%0")) (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))] "TARGET_H8300H" "mulxs.w %T2,%S0" [(set_attr "type" "multi") (set_attr "length" "4") (set_attr "cc" "set")])(define_insn "umulqihi3" [(set (match_operand:HI 0 "register_operand" "=r") (mult:HI (zero_extend:HI (match_operand:QI 1 "general_operand" "%0")) (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "" "mulxu %X2,%T0" [(set_attr "type" "multi") (set_attr "length" "2") (set_attr "cc" "none_0hit")])(define_insn "umulhisi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (zero_extend:SI (match_operand:HI 1 "general_operand" "%0")) (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))] "TARGET_H8300H" "mulxu.w %T2,%S0" [(set_attr "type" "multi") (set_attr "length" "2") (set_attr "cc" "none_0hit")]);; ----------------------------------------------------------------------;; DIVIDE INSTRUCTIONS;; ----------------------------------------------------------------------(define_insn "udivqi3" [(set (match_operand:QI 0 "register_operand" "=r") (udiv:QI (match_operand:HI 1 "general_operand" "0") (match_operand:QI 2 "register_operand" "r")))] "" "divxu %X2,%T0" [(set_attr "type" "multi") (set_attr "length" "2") (set_attr "cc" "clobber")]);; ??? Will divxu always work here?(define_insn "divqi3" [(set (match_operand:QI 0 "register_operand" "=r") (div:QI (match_operand:HI 1 "general_operand" "0") (match_operand:QI 2 "register_operand" "r")))] "" "divxu %X2,%T0" [(set_attr "type" "multi") (set_attr "length" "2") (set_attr "cc" "clobber")])(define_insn "udivhi3" [(set (match_operand:HI 0 "register_operand" "=r") (udiv:HI (match_operand:SI 1 "general_operand" "0") (match_operand:HI 2 "register_operand" "r")))] "TARGET_H8300H" "divxu.w %T2,%S0" [(set_attr "type" "multi") (set_attr "length" "2") (set_attr "cc" "clobber")])(define_insn "divhi3" [(set (match_operand:HI 0 "register_operand" "=r") (div:HI (match_operand:SI 1 "general_operand" "0") (match_operand:HI 2 "register_operand" "r")))] "TARGET_H8300H" "divxs.w %T2,%S0" [(set_attr "type" "multi") (set_attr "length" "4") (set_attr "cc" "clobber")]);; ----------------------------------------------------------------------;; MOD INSTRUCTIONS;; ----------------------------------------------------------------------(define_insn "umodqi3" [(set (match_operand:QI 0 "register_operand" "=r") (umod:QI (match_operand:HI 1 "general_operand" "0") (match_operand:QI 2 "register_operand" "r")))] "" "divxu %X2,%T0\;mov %t0,%s0" [(set_attr "type" "multi") (set_attr "length" "4") (set_attr "cc" "clobber")])(define_insn "modqi3" [(set (match_operand:QI 0 "register_operand" "=r") (mod:QI (match_operand:HI 1 "general_operand" "0") (match_operand:QI 2 "register_operand" "r")))] "TARGET_H8300H" "divxs.b %X2,%T0\;mov %t0,%s0" [(set_attr "type" "multi") (set_attr "length" "6") (set_attr "cc" "clobber")])(define_insn "umodhi3" [(set (match_operand:HI 0 "register_operand" "=r") (umod:HI (match_operand:SI 1 "general_operand" "0") (match_operand:HI 2 "register_operand" "r")))] "TARGET_H8300H" "divxu.w %T2,%S0\;mov %e0,%f0" [(set_attr "type" "multi") (set_attr "length" "4") (set_attr "cc" "clobber")])(define_insn "modhi3" [(set (match_operand:HI 0 "register_operand" "=r") (mod:HI (match_operand:SI 1 "general_operand" "0") (match_operand:HI 2 "register_operand" "r")))] "TARGET_H8300H" "divxs.w %T2,%S0\;mov %e0,%f0" [(set_attr "type" "multi") (set_attr "length" "6") (set_attr "cc" "clobber")]);; ----------------------------------------------------------------------;; AND INSTRUCTIONS;; ----------------------------------------------------------------------(define_insn "andqi3_internal" [(set (match_operand:QI 0 "bit_operand" "=r,U") (and:QI (match_operand:QI 1 "bit_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "rn,O")))] "register_operand (operands[0], QImode) || o_operand (operands[2], QImode)" "@ and %X2,%X0 bclr %W2,%X0" [(set_attr "type" "arith") (set_attr "length" "2,4") (set_attr "cc" "set,none_0hit")])(define_expand "andqi3" [(set (match_operand:QI 0 "bit_operand" "=r,U") (and:QI (match_operand:QI 1 "bit_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "rn,O")))] "" "{ if (fix_bit_operand (operands, 'O', AND)) DONE;}");; ??? Should have a bclr case here also.(define_insn "andhi3" [(set (match_operand:HI 0 "register_operand" "=r") (and:HI (match_operand:HI 1 "register_operand" "%0") (match_operand:HI 2 "nonmemory_operand" "rn")))] "" "*{ if (GET_CODE (operands[2]) == CONST_INT) { int i = INTVAL (operands[2]); if ((i & 0x00ff) != 0x00ff) output_asm_insn (\"and %s2,%s0\", operands); if ((i & 0xff00) != 0xff00) output_asm_insn (\"and %t2,%t0\", operands); return \"\"; } return \"and %s2,%s0\;and %t2,%t0;\";}" [(set_attr "type" "multi") (set_attr "length" "4") (set_attr "cc" "clobber")]);; ??? There is an iorsi3 for TARGET_H8300. Should we have andsi3?(define_insn "andsi3" [(set (match_operand:SI 0 "register_operand" "=r,r") (and:SI (match_operand:SI 1 "register_operand" "%0,0") (match_operand:SI 2 "nonmemory_operand" "r,i")))] "TARGET_H8300H" "@ and %S2,%S0 and %S2,%S0" [(set_attr "type" "arith") (set_attr "length" "4,6") (set_attr "cc" "clobber")]);; ----------------------------------------------------------------------;; OR INSTRUCTIONS;; ----------------------------------------------------------------------(define_insn "iorqi3_internal" [(set (match_operand:QI 0 "bit_operand" "=U,r") (ior:QI (match_operand:QI 1 "bit_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "P,rn")))] "register_operand (operands[0], QImode) || p_operand (operands[2], QImode)" "@ bset %V2,%X0 or %X2,%X0" [(set_attr "type" "arith") (set_attr "length" "4,2") (set_attr "cc" "none_0hit,set")])(define_expand "iorqi3" [(set (match_operand:QI 0 "bit_operand" "=r,U") (ior:QI (match_operand:QI 1 "bit_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "rn,P")))] "" "{ if (fix_bit_operand (operands, 'P', IOR)) DONE;}");; ??? Should have a bset case here also.(define_insn "iorhi3" [(set (match_operand:HI 0 "general_operand" "=r,r") (ior:HI (match_operand:HI 1 "general_operand" "%0,0") (match_operand:HI 2 "general_operand" "J,rn")))] "" "*{ if (TARGET_H8300) { if (GET_CODE (operands[2]) == CONST_INT) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -