1 ;; ----------------------------------------------------------------------
2 ;; DIVIDE/MOD INSTRUCTIONS
3 ;; ----------------------------------------------------------------------
5 (define_insn_and_split "udiv<mode>3"
6 [(set (match_operand:HSI 0 "register_operand" "=r")
7 (udiv:HSI (match_operand:HSI 1 "register_operand" "0")
8 (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))]
12 [(parallel [(set (match_dup 0) (udiv:HSI (match_dup 1) (match_dup 2)))
13 (clobber (reg:CC CC_REG))])])
15 (define_insn "udiv<mode>3_clobber_flags"
16 [(set (match_operand:HSI 0 "register_operand" "=r")
17 (udiv:HSI (match_operand:HSI 1 "register_operand" "0")
18 (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))
19 (clobber (reg:CC CC_REG))]
21 { return <MODE>mode == HImode ? "divu.w\\t%T2,%T0" : "divu.l\\t%S2,%S0"; }
22 [(set_attr "length" "4")])
24 (define_insn_and_split "div<mode>3"
25 [(set (match_operand:HSI 0 "register_operand" "=r")
26 (div:HSI (match_operand:HSI 1 "register_operand" "0")
27 (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))]
31 [(parallel [(set (match_dup 0) (div:HSI (match_dup 1) (match_dup 2)))
32 (clobber (reg:CC CC_REG))])])
34 (define_insn "div<mode>3_clobber_flags"
35 [(set (match_operand:HSI 0 "register_operand" "=r")
36 (div:HSI (match_operand:HSI 1 "register_operand" "0")
37 (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))
38 (clobber (reg:CC CC_REG))]
40 { return <MODE>mode == HImode ? "divs.w\\t%T2,%T0" : "divs.l\\t%S2,%S0"; }
41 [(set_attr "length" "4")])
43 (define_insn_and_split "udivmodqi4"
44 [(set (match_operand:QI 0 "register_operand" "=r")
47 (match_operand:HI 1 "register_operand" "0")
48 (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))))
49 (set (match_operand:QI 3 "register_operand" "=r")
53 (zero_extend:HI (match_dup 2)))))]
57 [(parallel [(set (match_dup 0) (truncate:QI
58 (udiv:HI (match_dup 1)
59 (zero_extend:HI (match_dup 2)))))
60 (set (match_dup 3) (truncate:QI
61 (umod:HI (match_dup 1)
62 (zero_extend:HI (match_dup 2)))))
63 (clobber (reg:CC CC_REG))])])
66 (define_insn "udivmodqi4_clobber_flags"
67 [(set (match_operand:QI 0 "register_operand" "=r")
70 (match_operand:HI 1 "register_operand" "0")
71 (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))))
72 (set (match_operand:QI 3 "register_operand" "=r")
76 (zero_extend:HI (match_dup 2)))))
77 (clobber (reg:CC CC_REG))]
80 if (find_reg_note (insn, REG_UNUSED, operands[3]))
81 return "divxu.b\\t%X2,%T0";
83 return "divxu.b\\t%X2,%T0\;mov.b\\t%t0,%s3";
85 [(set_attr "length" "4")])
87 (define_insn_and_split "divmodqi4"
88 [(set (match_operand:QI 0 "register_operand" "=r")
91 (match_operand:HI 1 "register_operand" "0")
92 (sign_extend:HI (match_operand:QI 2 "register_operand" "r")))))
93 (set (match_operand:QI 3 "register_operand" "=r")
97 (sign_extend:HI (match_dup 2)))))]
100 "&& reload_completed"
101 [(parallel [(set (match_dup 0) (truncate:QI
102 (div:HI (match_dup 1)
103 (sign_extend:HI (match_dup 2)))))
104 (set (match_dup 3) (truncate:QI
105 (mod:HI (match_dup 1)
106 (sign_extend:HI (match_dup 2)))))
107 (clobber (reg:CC CC_REG))])])
109 (define_insn "divmodqi4_clobber_flags"
110 [(set (match_operand:QI 0 "register_operand" "=r")
113 (match_operand:HI 1 "register_operand" "0")
114 (sign_extend:HI (match_operand:QI 2 "register_operand" "r")))))
115 (set (match_operand:QI 3 "register_operand" "=r")
119 (sign_extend:HI (match_dup 2)))))
120 (clobber (reg:CC CC_REG))]
123 if (find_reg_note (insn, REG_UNUSED, operands[3]))
124 return "divxs.b\\t%X2,%T0";
126 return "divxs.b\\t%X2,%T0\;mov.b\\t%t0,%s3";
128 [(set_attr "length" "6")])
130 (define_insn_and_split "udivmodhi4"
131 [(set (match_operand:HI 0 "register_operand" "=r")
134 (match_operand:SI 1 "register_operand" "0")
135 (zero_extend:SI (match_operand:HI 2 "register_operand" "r")))))
136 (set (match_operand:HI 3 "register_operand" "=r")
140 (zero_extend:SI (match_dup 2)))))]
143 "&& reload_completed"
144 [(parallel [(set (match_dup 0) (truncate:HI
145 (udiv:SI (match_dup 1)
146 (zero_extend:SI (match_dup 2)))))
147 (set (match_dup 3) (truncate:HI
148 (umod:SI (match_dup 1)
149 (zero_extend:SI (match_dup 2)))))
150 (clobber (reg:CC CC_REG))])])
152 (define_insn "udivmodhi4_clobber_flags"
153 [(set (match_operand:HI 0 "register_operand" "=r")
156 (match_operand:SI 1 "register_operand" "0")
157 (zero_extend:SI (match_operand:HI 2 "register_operand" "r")))))
158 (set (match_operand:HI 3 "register_operand" "=r")
162 (zero_extend:SI (match_dup 2)))))
163 (clobber (reg:CC CC_REG))]
166 if (find_reg_note (insn, REG_UNUSED, operands[3]))
167 return "divxu.w\\t%T2,%S0";
169 return "divxu.w\\t%T2,%S0\;mov.w\\t%e0,%f3";
171 [(set_attr "length" "4")])
173 (define_insn_and_split "divmodhi4"
174 [(set (match_operand:HI 0 "register_operand" "=r")
177 (match_operand:SI 1 "register_operand" "0")
178 (sign_extend:SI (match_operand:HI 2 "register_operand" "r")))))
179 (set (match_operand:HI 3 "register_operand" "=r")
183 (sign_extend:SI (match_dup 2)))))]
186 "&& reload_completed"
187 [(parallel [(set (match_dup 0) (truncate:HI
188 (div:SI (match_dup 1)
189 (sign_extend:SI (match_dup 2)))))
190 (set (match_dup 3) (truncate:HI
191 (mod:SI (match_dup 1)
192 (sign_extend:SI (match_dup 2)))))
193 (clobber (reg:CC CC_REG))])])
195 (define_insn "divmodhi4_clobber_flags"
196 [(set (match_operand:HI 0 "register_operand" "=r")
199 (match_operand:SI 1 "register_operand" "0")
200 (sign_extend:SI (match_operand:HI 2 "register_operand" "r")))))
201 (set (match_operand:HI 3 "register_operand" "=r")
205 (sign_extend:SI (match_dup 2)))))
206 (clobber (reg:CC CC_REG))]
209 if (find_reg_note (insn, REG_UNUSED, operands[3]))
210 return "divxs.w\\t%T2,%S0";
212 return "divxs.w\\t%T2,%S0\;mov.w\\t%e0,%f3";
214 [(set_attr "length" "6")])