;; ---------------------------------------------------------------------- ;; DIVIDE/MOD INSTRUCTIONS ;; ---------------------------------------------------------------------- (define_insn_and_split "udiv3" [(set (match_operand:HSI 0 "register_operand" "=r") (udiv:HSI (match_operand:HSI 1 "register_operand" "0") (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))] "TARGET_H8300SX" "#" "&& reload_completed" [(parallel [(set (match_dup 0) (udiv:HSI (match_dup 1) (match_dup 2))) (clobber (reg:CC CC_REG))])]) (define_insn "udiv3_clobber_flags" [(set (match_operand:HSI 0 "register_operand" "=r") (udiv:HSI (match_operand:HSI 1 "register_operand" "0") (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X"))) (clobber (reg:CC CC_REG))] "TARGET_H8300SX" { return mode == HImode ? "divu.w\\t%T2,%T0" : "divu.l\\t%S2,%S0"; } [(set_attr "length" "4")]) (define_insn_and_split "div3" [(set (match_operand:HSI 0 "register_operand" "=r") (div:HSI (match_operand:HSI 1 "register_operand" "0") (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))] "TARGET_H8300SX" "#" "&& reload_completed" [(parallel [(set (match_dup 0) (div:HSI (match_dup 1) (match_dup 2))) (clobber (reg:CC CC_REG))])]) (define_insn "div3_clobber_flags" [(set (match_operand:HSI 0 "register_operand" "=r") (div:HSI (match_operand:HSI 1 "register_operand" "0") (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X"))) (clobber (reg:CC CC_REG))] "TARGET_H8300SX" { return mode == HImode ? "divs.w\\t%T2,%T0" : "divs.l\\t%S2,%S0"; } [(set_attr "length" "4")]) (define_insn_and_split "udivmodqi4" [(set (match_operand:QI 0 "register_operand" "=r") (truncate:QI (udiv:HI (match_operand:HI 1 "register_operand" "0") (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))) (set (match_operand:QI 3 "register_operand" "=r") (truncate:QI (umod:HI (match_dup 1) (zero_extend:HI (match_dup 2)))))] "" "#" "&& reload_completed" [(parallel [(set (match_dup 0) (truncate:QI (udiv:HI (match_dup 1) (zero_extend:HI (match_dup 2))))) (set (match_dup 3) (truncate:QI (umod:HI (match_dup 1) (zero_extend:HI (match_dup 2))))) (clobber (reg:CC CC_REG))])]) (define_insn "udivmodqi4_clobber_flags" [(set (match_operand:QI 0 "register_operand" "=r") (truncate:QI (udiv:HI (match_operand:HI 1 "register_operand" "0") (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))) (set (match_operand:QI 3 "register_operand" "=r") (truncate:QI (umod:HI (match_dup 1) (zero_extend:HI (match_dup 2))))) (clobber (reg:CC CC_REG))] "" { if (find_reg_note (insn, REG_UNUSED, operands[3])) return "divxu.b\\t%X2,%T0"; else return "divxu.b\\t%X2,%T0\;mov.b\\t%t0,%s3"; } [(set_attr "length" "4")]) (define_insn_and_split "divmodqi4" [(set (match_operand:QI 0 "register_operand" "=r") (truncate:QI (div:HI (match_operand:HI 1 "register_operand" "0") (sign_extend:HI (match_operand:QI 2 "register_operand" "r"))))) (set (match_operand:QI 3 "register_operand" "=r") (truncate:QI (mod:HI (match_dup 1) (sign_extend:HI (match_dup 2)))))] "" "#" "&& reload_completed" [(parallel [(set (match_dup 0) (truncate:QI (div:HI (match_dup 1) (sign_extend:HI (match_dup 2))))) (set (match_dup 3) (truncate:QI (mod:HI (match_dup 1) (sign_extend:HI (match_dup 2))))) (clobber (reg:CC CC_REG))])]) (define_insn "divmodqi4_clobber_flags" [(set (match_operand:QI 0 "register_operand" "=r") (truncate:QI (div:HI (match_operand:HI 1 "register_operand" "0") (sign_extend:HI (match_operand:QI 2 "register_operand" "r"))))) (set (match_operand:QI 3 "register_operand" "=r") (truncate:QI (mod:HI (match_dup 1) (sign_extend:HI (match_dup 2))))) (clobber (reg:CC CC_REG))] "" { if (find_reg_note (insn, REG_UNUSED, operands[3])) return "divxs.b\\t%X2,%T0"; else return "divxs.b\\t%X2,%T0\;mov.b\\t%t0,%s3"; } [(set_attr "length" "6")]) (define_insn_and_split "udivmodhi4" [(set (match_operand:HI 0 "register_operand" "=r") (truncate:HI (udiv:SI (match_operand:SI 1 "register_operand" "0") (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))) (set (match_operand:HI 3 "register_operand" "=r") (truncate:HI (umod:SI (match_dup 1) (zero_extend:SI (match_dup 2)))))] "" "#" "&& reload_completed" [(parallel [(set (match_dup 0) (truncate:HI (udiv:SI (match_dup 1) (zero_extend:SI (match_dup 2))))) (set (match_dup 3) (truncate:HI (umod:SI (match_dup 1) (zero_extend:SI (match_dup 2))))) (clobber (reg:CC CC_REG))])]) (define_insn "udivmodhi4_clobber_flags" [(set (match_operand:HI 0 "register_operand" "=r") (truncate:HI (udiv:SI (match_operand:SI 1 "register_operand" "0") (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))) (set (match_operand:HI 3 "register_operand" "=r") (truncate:HI (umod:SI (match_dup 1) (zero_extend:SI (match_dup 2))))) (clobber (reg:CC CC_REG))] "" { if (find_reg_note (insn, REG_UNUSED, operands[3])) return "divxu.w\\t%T2,%S0"; else return "divxu.w\\t%T2,%S0\;mov.w\\t%e0,%f3"; } [(set_attr "length" "4")]) (define_insn_and_split "divmodhi4" [(set (match_operand:HI 0 "register_operand" "=r") (truncate:HI (div:SI (match_operand:SI 1 "register_operand" "0") (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))) (set (match_operand:HI 3 "register_operand" "=r") (truncate:HI (mod:SI (match_dup 1) (sign_extend:SI (match_dup 2)))))] "" "#" "&& reload_completed" [(parallel [(set (match_dup 0) (truncate:HI (div:SI (match_dup 1) (sign_extend:SI (match_dup 2))))) (set (match_dup 3) (truncate:HI (mod:SI (match_dup 1) (sign_extend:SI (match_dup 2))))) (clobber (reg:CC CC_REG))])]) (define_insn "divmodhi4_clobber_flags" [(set (match_operand:HI 0 "register_operand" "=r") (truncate:HI (div:SI (match_operand:SI 1 "register_operand" "0") (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))) (set (match_operand:HI 3 "register_operand" "=r") (truncate:HI (mod:SI (match_dup 1) (sign_extend:SI (match_dup 2))))) (clobber (reg:CC CC_REG))] "" { if (find_reg_note (insn, REG_UNUSED, operands[3])) return "divxs.w\\t%T2,%S0"; else return "divxs.w\\t%T2,%S0\;mov.w\\t%e0,%f3"; } [(set_attr "length" "6")])