Hi All,
I am having trouble distinguishing div vs mod while implementing the
divmodsi4 instruction. The gccint documentation states:
"If an instruction that just produces a quotient or just a remainder
exists and is more efficient than the instruction that produces both,
write the output routine of 'divmodm4' to call find_reg_note and look
for a REG_UNUSED note on the quotient or remainder and generate the
appropriate instruction."
The problem is that both, the quotient and reminder, registers are
getting marked with a REG_UNUSED note:
(insn 12 11 17 (parallel [
(set (reg:SI 1 %r3 [33])
(div:SI (reg:SI 1 %r3 [30])
(reg:SI 5 %iph [orig:31 current ] [31])))
(set (reg:SI 5 %iph [34])
(mod:SI (reg:SI 1 %r3 [30])
(reg:SI 5 %iph [orig:31 current ] [31])))
]) 56 {*divmodsi4} (insn_list:REG_DEP_TRUE 10
(insn_list:REG_DEP_TRUE 11 (nil)))
(expr_list:REG_UNUSED (reg:SI 5 %iph [34])
(expr_list:REG_UNUSED (reg:QI 2 %r2)
(expr_list:REG_UNUSED (reg:QI 1 %r3)
(nil)))))
Any suggestions on how I might be able to work around this?
Thanks!
-Omar
Here is my expander and matching patter:
(define_expand "divmodsi4"
[(parallel [(set (match_operand:SI 0 "register_operand" "")
(div:SI (match_operand:SI 1 "general_operand" "")
(match_operand:SI 2 "general_operand" "")))
(set (match_operand:SI 3 "nonimmediate_operand" "")
(mod:SI (match_dup 1) (match_dup 2)))])]
""
"")
(define_insn "*divmodsi4"
[(set (match_operand:SI 0 "register_operand" "=f")
(div:SI (match_operand:SI 1 "general_operand" "g")
(match_operand:SI 2 "general_operand" "g")))
(set (match_operand:SI 3 "nonimmediate_operand" "=g")
(mod:SI (match_dup 1) (match_dup 2)))]
"!TARGET_SOFTLIB"
"*
return output_divmod (insn, operands, 1);
")