This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Vectorizing abs(char/short/int) on x86.
- From: Uros Bizjak <ubizjak at gmail dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Cong Hou <congh at google dot com>, Richard Biener <rguenther at suse dot de>
- Date: Wed, 23 Oct 2013 09:20:18 +0200
- Subject: Re: [PATCH] Vectorizing abs(char/short/int) on x86.
- Authentication-results: sourceware.org; auth=none
Hello!
> Currently GCC could not vectorize abs() operation for integers on x86
> with only SSE2 support. For int type, the reason is that the expand on
> abs() is not defined for vector type. This patch defines such an
> expand so that abs(int) will be vectorized with only SSE2.
+(define_expand "abs<mode>2"
+ [(set (match_operand:VI124_AVX2_48_AVX512F 0 "register_operand")
+ (abs:VI124_AVX2_48_AVX512F
+ (match_operand:VI124_AVX2_48_AVX512F 1 "register_operand")))]
+ "TARGET_SSE2"
+{
+ if (TARGET_SSE2 && !TARGET_SSSE3)
+ ix86_expand_sse2_absvxsi2 (operands[0], operands[1]);
+ else if (TARGET_SSSE3)
+ emit_insn (gen_rtx_SET (VOIDmode, operands[0],
+ gen_rtx_ABS (<MODE>mode, operands[1])));
+ DONE;
+})
This should be written as:
(define_expand "abs<mode>2"
[(set (match_operand:VI124_AVX2_48_AVX512F 0 "register_operand")
(abs:VI124_AVX2_48_AVX512F
(match_operand:VI124_AVX2_48_AVX512F 1 "nonimmediate_operand")))]
"TARGET_SSE2"
{
if (!TARGET_SSSE3)
{
ix86_expand_sse2_absvxsi2 (operands[0], operands[1]);
DONE;
}
})
Please note that operands[1] can be a memory operand, so your expander
should either handle it (this is preferred) or load the operand to the
register at the beginning of the expansion.
+void
+ix86_expand_sse2_absvxsi2 (rtx op0, rtx op1)
This function name implies SImode operands ... please just name it
ix86_expand_sse2_abs.
Uros.