LoongArch: Fix up [su]dot_prod*
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-arm |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap |
success
|
Build passed
|
Commit Message
On Fri, Feb 14, 2025 at 08:21:39PM +0800, Xi Ruoyao wrote:
> +(define_expand "<su>dot_prod<wvec_half><mode>"
> + [(match_operand:<WVEC_HALF> 0 "register_operand" "=f,f")
> + (match_operand:IVEC 1 "register_operand" " f,f")
> + (match_operand:IVEC 2 "register_operand" " f,f")
> + (match_operand:<WVEC_HALF> 3 "reg_or_0_operand" " 0,YG")
> + (any_extend (const_int 0))]
> + ""
> +{
> + auto [op0, op1, op2, op3] = operands;
GCC is written in C++14 these days and will be for a few years, we've
just switched from C++11 to C++14.
The above construct is C++17, so not appropriate in GCC sources
(at least not conditionalized on C++ version).
Furthermore, if it was added to help formatting, I think it still
didn't help much, the emit_insn (
on one line and argument on another is just ugly. The problem
aren't the not so long operands[0] etc. arguments, but the too long
names of the gen_* functions.
> +
> + if (op3 == CONST0_RTX (<WVEC_HALF>mode))
> + emit_insn (
> + gen_<simd_isa>_<x>vmulwev_<simdfmt_w>_<simdfmt><u> (op0, op1, op2));
> + else
> + emit_insn (
> + gen_<simd_isa>_<x>vmaddwev_<simdfmt_w>_<simdfmt><u> (op0, op3, op1,
> + op2));
> +
> + emit_insn (
> + gen_<simd_isa>_<x>vmaddwod_<simdfmt_w>_<simdfmt><u> (op0, op0, op1, op2));
> + DONE;
> +})
So, I'd suggest following instead.
Tested by building a cross until cc1/cc1plus is built (I don't have binutils
built for the target around).
Ok for trunk?
2025-03-12 Jakub Jelinek <jakub@redhat.com>
PR target/119238
* config/loongarch/simd.md (<su>dot_prod<wvec_half><mode>): Don't use
structured bindings. Instead, use function pointers to improve
formatting.
Jakub
@@ -809,18 +809,21 @@ (define_expand "<su>dot_prod<wvec_half><
(any_extend (const_int 0))]
""
{
- auto [op0, op1, op2, op3] = operands;
-
- if (op3 == CONST0_RTX (<WVEC_HALF>mode))
- emit_insn (
- gen_<simd_isa>_<x>vmulwev_<simdfmt_w>_<simdfmt><u> (op0, op1, op2));
+ rtx (*gen4) (rtx, rtx, rtx, rtx);
+ if (operands[3] == CONST0_RTX (<WVEC_HALF>mode))
+ {
+ rtx (*gen3) (rtx, rtx, rtx)
+ = gen_<simd_isa>_<x>vmulwev_<simdfmt_w>_<simdfmt><u>;
+ emit_insn (gen3 (operands[0], operands[1], operands[2]));
+ }
else
- emit_insn (
- gen_<simd_isa>_<x>vmaddwev_<simdfmt_w>_<simdfmt><u> (op0, op3, op1,
- op2));
+ {
+ gen4 = gen_<simd_isa>_<x>vmaddwev_<simdfmt_w>_<simdfmt><u>;
+ emit_insn (gen4 (operands[0], operands[1], operands[2], operands[3]));
+ }
- emit_insn (
- gen_<simd_isa>_<x>vmaddwod_<simdfmt_w>_<simdfmt><u> (op0, op0, op1, op2));
+ gen4 = gen_<simd_isa>_<x>vmaddwod_<simdfmt_w>_<simdfmt><u>;
+ emit_insn (gen4 (operands[0], operands[1], operands[2], operands[3]));
DONE;
})