This is the mail archive of the
mailing list for the GCC project.
Re: [patch] Implement builtin folding for SPARC
- From: Eric Botcazou <ebotcazou at libertysurf dot fr>
- To: James A. Morrison <ja2morri at csclub dot uwaterloo dot ca>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sun, 8 May 2005 20:34:43 +0200
- Subject: Re: [patch] Implement builtin folding for SPARC
- References: <firstname.lastname@example.org>
[Sorry for the delay]
> This patch implements builtin folding for some SPARC VIS builtins that
> seem to have no dependencies on the status register. I didn't implement
> fmul8sux16, fmul8ulx16, fmuld8sux16, or fmuld8ulx16 as the definitions for
> those builtins may not be correct.
Could you elaborate on the second sentence?
> Bootstrapped and regtested on sparc-linux, ok for mainline?
This looks good, except the types of the variables used to manipulate the
constant values. I think you should use HOST_WIDE_INT throughout the code
because TREE_INT_CST_LOW is a HOST_WIDE_INT. As far I can see, the other
port that folds its builtins (Alpha) always uses HOST_WIDE_INT.
While the above change might be superfluous in most cases, there is a real
+ if (TREE_CODE (arg0) == VECTOR_CST
+ && TREE_CODE (arg1) == VECTOR_CST
+ && TREE_CODE (arg2) == INTEGER_CST)
+ long long accum = TREE_INT_CST_LOW (arg2);
+ tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
+ tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
+ accum |= ((long long)TREE_INT_CST_HIGH (arg2)) << 32;
+ for (; elts0 && elts1;
+ elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
+ int low0 = TREE_INT_CST_LOW (TREE_VALUE (elts0));
+ int low1 = TREE_INT_CST_LOW (TREE_VALUE (elts1));
+ accum += abs (low0 - low1);
+ return build_int_cst_wide (rtype, accum & 0xffffffff,
+ (accum >> 32) && 0xffffffff);
because you're not guaranteed to have 'long long' available.