On Oct 13, 2005, at 7:41 PM, Evan Cheng wrote:
Hi,
Here is a bits of code from bzip2:
#define mswap(zz1, zz2) { int zztmp = zz1; zz1 = zz2; zz2 =
zztmp; }
void foo(int unLo, int unHi, int ltLo, int *ptr, char *block, int med,
int d, int n) {
while (1) {
if (unLo > unHi) break;
n = ((int)block[ptr[unLo]+d]) - med;
if (n == 0) {
mswap(ptr[unLo], ptr[ltLo]);
ltLo++; unLo++; continue;
};
if (n > 0) break;
unLo++;
}
}
PowerPC describes the pattern were we don't need the result of n after a
compare as:
(define_insn ""
[(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
(compare:CC (minus:P (match_operand:P 1 "gpc_reg_operand" "r,r")
(match_operand:P 2 "gpc_reg_operand"
"r,r"))
(const_int 0)))
(clobber (match_scratch:P 3 "=r,r"))]
"TARGET_POWERPC"
"@
subf. %3,%2,%1
#"
[(set_attr "type" "fast_compare")
(set_attr "length" "4,8")])
So something like (not tested):
(define_insn ""
[(set (reg FLAGS_REG)
(compare (minus:P (match_operand:SI 1 "nonimmediate_operand"
"0,0")
(match_operand:SI 2 "general_operand"
"ri,rm"))
(const_int 0)))
(clobber (match_scratch:SI 1 "=r"))]
"ix86_match_ccmode (insn, CCGOCmode)
&& ix86_binary_operator_ok (MINUS, SImode, operands)"
"sub{l}\t{%2, %0|%0, %2}"
[(set_attr "type" "alu")
(set_attr "mode" "SI")])
Maybe adding a pattern like that, will work?
You most likely would like to "steal" other patterns like that from the
rs6000
backend.
Thanks,
Andrew Pinski