aarch64-simd.md (aarch64_combine<mode>): Directly call aarch64_split_simd_combine.

2017-06-19  Michael Collison  <michael.collison@arm.com>

	* config/aarch64/aarch64-simd.md (aarch64_combine<mode>): Directly
	call aarch64_split_simd_combine.
	* (aarch64_combine_internal<mode>): Delete pattern.
	* config/aarch64/aarch64.c (aarch64_split_simd_combine):
	Allow register and subreg operands.

From-SVN: r249702
This commit is contained in:
Michael Collison 2017-06-27 17:29:06 +00:00 committed by Michael Collison
parent b2cf76f3a5
commit a977dc0c5e
3 changed files with 41 additions and 61 deletions

View File

@ -1,3 +1,11 @@
2017-06-27 Michael Collison <michael.collison@arm.com>
* config/aarch64/aarch64-simd.md (aarch64_combine<mode>): Directly
call aarch64_split_simd_combine.
* (aarch64_combine_internal<mode>): Delete pattern.
* config/aarch64/aarch64.c (aarch64_split_simd_combine):
Allow register and subreg operands.
2017-06-27 Jerome Lambourg <lambourg@adacore.com> 2017-06-27 Jerome Lambourg <lambourg@adacore.com>
* config/i386/vxworks.h (ASM_SPEC): Remove definition. No target * config/i386/vxworks.h (ASM_SPEC): Remove definition. No target

View File

@ -2809,38 +2809,10 @@
(match_operand:VDC 2 "register_operand")] (match_operand:VDC 2 "register_operand")]
"TARGET_SIMD" "TARGET_SIMD"
{ {
rtx op1, op2; aarch64_split_simd_combine (operands[0], operands[1], operands[2]);
if (BYTES_BIG_ENDIAN)
{
op1 = operands[2];
op2 = operands[1];
}
else
{
op1 = operands[1];
op2 = operands[2];
}
emit_insn (gen_aarch64_combine_internal<mode> (operands[0], op1, op2));
DONE;
}
)
(define_insn_and_split "aarch64_combine_internal<mode>"
[(set (match_operand:<VDBL> 0 "register_operand" "=&w")
(vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w")
(match_operand:VDC 2 "register_operand" "w")))]
"TARGET_SIMD"
"#"
"&& reload_completed"
[(const_int 0)]
{
if (BYTES_BIG_ENDIAN)
aarch64_split_simd_combine (operands[0], operands[2], operands[1]);
else
aarch64_split_simd_combine (operands[0], operands[1], operands[2]);
DONE; DONE;
} }
[(set_attr "type" "multiple")]
) )
(define_expand "aarch64_simd_combine<mode>" (define_expand "aarch64_simd_combine<mode>"

View File

@ -1732,41 +1732,41 @@ aarch64_split_simd_combine (rtx dst, rtx src1, rtx src2)
machine_mode dst_mode = GET_MODE (dst); machine_mode dst_mode = GET_MODE (dst);
gcc_assert (VECTOR_MODE_P (dst_mode)); gcc_assert (VECTOR_MODE_P (dst_mode));
gcc_assert (register_operand (dst, dst_mode)
&& register_operand (src1, src_mode)
&& register_operand (src2, src_mode));
if (REG_P (dst) && REG_P (src1) && REG_P (src2)) rtx (*gen) (rtx, rtx, rtx);
switch (src_mode)
{ {
rtx (*gen) (rtx, rtx, rtx); case V8QImode:
gen = gen_aarch64_simd_combinev8qi;
switch (src_mode) break;
{ case V4HImode:
case V8QImode: gen = gen_aarch64_simd_combinev4hi;
gen = gen_aarch64_simd_combinev8qi; break;
break; case V2SImode:
case V4HImode: gen = gen_aarch64_simd_combinev2si;
gen = gen_aarch64_simd_combinev4hi; break;
break; case V4HFmode:
case V2SImode: gen = gen_aarch64_simd_combinev4hf;
gen = gen_aarch64_simd_combinev2si; break;
break; case V2SFmode:
case V4HFmode: gen = gen_aarch64_simd_combinev2sf;
gen = gen_aarch64_simd_combinev4hf; break;
break; case DImode:
case V2SFmode: gen = gen_aarch64_simd_combinedi;
gen = gen_aarch64_simd_combinev2sf; break;
break; case DFmode:
case DImode: gen = gen_aarch64_simd_combinedf;
gen = gen_aarch64_simd_combinedi; break;
break; default:
case DFmode: gcc_unreachable ();
gen = gen_aarch64_simd_combinedf;
break;
default:
gcc_unreachable ();
}
emit_insn (gen (dst, src1, src2));
return;
} }
emit_insn (gen (dst, src1, src2));
return;
} }
/* Split a complex SIMD move. */ /* Split a complex SIMD move. */