8277619: AArch64: Incorrect parameter type in Advanced SIMD Copy assembler functions

Reviewed-by: aph, pli
This commit is contained in:
Fei Gao 2021-12-15 02:26:40 +00:00 committed by Pengfei Li
parent 46f99aca94
commit c442587f1e
7 changed files with 49 additions and 51 deletions

@ -8565,10 +8565,10 @@ instruct popCountI(iRegINoSp dst, iRegIorL2I src, vRegF tmp) %{
"mov $dst, $tmp\t# vector (1D)" %}
ins_encode %{
__ movw($src$$Register, $src$$Register); // ensure top 32 bits 0
__ mov($tmp$$FloatRegister, __ T1D, 0, $src$$Register);
__ mov($tmp$$FloatRegister, __ D, 0, $src$$Register);
__ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
__ mov($dst$$Register, $tmp$$FloatRegister, __ D, 0);
%}
ins_pipe(pipe_class_default);
@ -8590,7 +8590,7 @@ instruct popCountI_mem(iRegINoSp dst, memory4 mem, vRegF tmp) %{
as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp, 4);
__ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
__ mov($dst$$Register, $tmp$$FloatRegister, __ D, 0);
%}
ins_pipe(pipe_class_default);
@ -8608,10 +8608,10 @@ instruct popCountL(iRegINoSp dst, iRegL src, vRegD tmp) %{
"addv $tmp, $tmp\t# vector (8B)\n\t"
"mov $dst, $tmp\t# vector (1D)" %}
ins_encode %{
__ mov($tmp$$FloatRegister, __ T1D, 0, $src$$Register);
__ mov($tmp$$FloatRegister, __ D, 0, $src$$Register);
__ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
__ mov($dst$$Register, $tmp$$FloatRegister, __ D, 0);
%}
ins_pipe(pipe_class_default);
@ -8633,7 +8633,7 @@ instruct popCountL_mem(iRegINoSp dst, memory8 mem, vRegD tmp) %{
as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp, 8);
__ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
__ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
__ mov($dst$$Register, $tmp$$FloatRegister, __ D, 0);
%}
ins_pipe(pipe_class_default);

@ -511,7 +511,7 @@ instruct vcvt2Dto2I(vecD dst, vecX src)
"fcvtzdw rscratch1, $src\n\t"
"fcvtzdw rscratch2, $dst\n\t"
"fmovs $dst, rscratch1\n\t"
"mov $dst, T2S, 1, rscratch2\t#convert 2D to 2I vector"
"mov $dst, S, 1, rscratch2\t#convert 2D to 2I vector"
%}
ins_encode %{
__ ins(as_FloatRegister($dst$$reg), __ D, as_FloatRegister($src$$reg), 0, 1);
@ -520,7 +520,7 @@ instruct vcvt2Dto2I(vecD dst, vecX src)
__ fcvtzdw(rscratch1, as_FloatRegister($src$$reg));
__ fcvtzdw(rscratch2, as_FloatRegister($dst$$reg));
__ fmovs(as_FloatRegister($dst$$reg), rscratch1);
__ mov(as_FloatRegister($dst$$reg), __ T2S, 1, rscratch2);
__ mov(as_FloatRegister($dst$$reg), __ S, 1, rscratch2);
%}
ins_pipe(pipe_slow);
%}
@ -1703,13 +1703,13 @@ instruct insert8B(vecD dst, vecD src, iRegIorL2I val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T8B, $src, $src\n\t"
"mov $dst, T8B, $idx, $val\t# insert into vector(8B)" %}
"mov $dst, B, $idx, $val\t# insert into vector(8B)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T8B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T8B, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ B, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -1720,13 +1720,13 @@ instruct insert16B(vecX dst, vecX src, iRegIorL2I val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T16B, $src, $src\n\t"
"mov $dst, T16B, $idx, $val\t# insert into vector(16B)" %}
"mov $dst, B, $idx, $val\t# insert into vector(16B)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T16B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T16B, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ B, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -1737,13 +1737,13 @@ instruct insert4S(vecD dst, vecD src, iRegIorL2I val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T8B, $src, $src\n\t"
"mov $dst, T4H, $idx, $val\t# insert into vector(4S)" %}
"mov $dst, H, $idx, $val\t# insert into vector(4S)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T8B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T4H, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ H, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -1754,13 +1754,13 @@ instruct insert8S(vecX dst, vecX src, iRegIorL2I val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T16B, $src, $src\n\t"
"mov $dst, T8H, $idx, $val\t# insert into vector(8S)" %}
"mov $dst, H, $idx, $val\t# insert into vector(8S)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T16B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T8H, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ H, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -1771,13 +1771,13 @@ instruct insert2I(vecD dst, vecD src, iRegIorL2I val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T8B, $src, $src\n\t"
"mov $dst, T2S, $idx, $val\t# insert into vector(2I)" %}
"mov $dst, S, $idx, $val\t# insert into vector(2I)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T8B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T2S, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ S, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -1788,13 +1788,13 @@ instruct insert4I(vecX dst, vecX src, iRegIorL2I val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T16B, $src, $src\n\t"
"mov $dst, T4S, $idx, $val\t# insert into vector(4I)" %}
"mov $dst, S, $idx, $val\t# insert into vector(4I)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T16B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T4S, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ S, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -1805,13 +1805,13 @@ instruct insert2L(vecX dst, vecX src, iRegL val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T16B, $src, $src\n\t"
"mov $dst, T2D, $idx, $val\t# insert into vector(2L)" %}
"mov $dst, D, $idx, $val\t# insert into vector(2L)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T16B,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T2D, $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ D, $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}
@ -2044,11 +2044,11 @@ instruct vmul2L(vecX dst, vecX src1, vecX src2, iRegLNoSp tmp1, iRegLNoSp tmp2)
__ umov($tmp1$$Register, as_FloatRegister($src1$$reg), __ D, 0);
__ umov($tmp2$$Register, as_FloatRegister($src2$$reg), __ D, 0);
__ mul(as_Register($tmp2$$reg), as_Register($tmp2$$reg), as_Register($tmp1$$reg));
__ mov(as_FloatRegister($dst$$reg), __ T2D, 0, $tmp2$$Register);
__ mov(as_FloatRegister($dst$$reg), __ D, 0, $tmp2$$Register);
__ umov($tmp1$$Register, as_FloatRegister($src1$$reg), __ D, 1);
__ umov($tmp2$$Register, as_FloatRegister($src2$$reg), __ D, 1);
__ mul(as_Register($tmp2$$reg), as_Register($tmp2$$reg), as_Register($tmp1$$reg));
__ mov(as_FloatRegister($dst$$reg), __ T2D, 1, $tmp2$$Register);
__ mov(as_FloatRegister($dst$$reg), __ D, 1, $tmp2$$Register);
%}
ins_pipe(pipe_slow);
%}

@ -296,7 +296,7 @@ instruct vcvt2Dto2I(vecD dst, vecX src)
"fcvtzdw rscratch1, $src\n\t"
"fcvtzdw rscratch2, $dst\n\t"
"fmovs $dst, rscratch1\n\t"
"mov $dst, T2S, 1, rscratch2\t#convert 2D to 2I vector"
"mov $dst, S, 1, rscratch2\t#convert 2D to 2I vector"
%}
ins_encode %{
__ ins(as_FloatRegister($dst$$reg), __ D, as_FloatRegister($src$$reg), 0, 1);
@ -305,7 +305,7 @@ instruct vcvt2Dto2I(vecD dst, vecX src)
__ fcvtzdw(rscratch1, as_FloatRegister($src$$reg));
__ fcvtzdw(rscratch2, as_FloatRegister($dst$$reg));
__ fmovs(as_FloatRegister($dst$$reg), rscratch1);
__ mov(as_FloatRegister($dst$$reg), __ T2S, 1, rscratch2);
__ mov(as_FloatRegister($dst$$reg), __ S, 1, rscratch2);
%}
ins_pipe(pipe_slow);
%}
@ -868,13 +868,13 @@ instruct insert$1$2`'(vec$3 dst, vec$3 src, iReg$4`'ORL2I($4) val, immI idx)
match(Set dst (VectorInsert (Binary src val) idx));
ins_cost(INSN_COST);
format %{ "orr $dst, T$5, $src, $src\n\t"
"mov $dst, T$1`'iTYPE2SIMD($2), $idx, $val\t# insert into vector($1$2)" %}
"mov $dst, iTYPE2SIMD($2), $idx, $val\t# insert into vector($1$2)" %}
ins_encode %{
if (as_FloatRegister($dst$$reg) != as_FloatRegister($src$$reg)) {
__ orr(as_FloatRegister($dst$$reg), __ T$5,
as_FloatRegister($src$$reg), as_FloatRegister($src$$reg));
}
__ mov(as_FloatRegister($dst$$reg), __ T$1`'iTYPE2SIMD($2), $idx$$constant, $val$$Register);
__ mov(as_FloatRegister($dst$$reg), __ iTYPE2SIMD($2), $idx$$constant, $val$$Register);
%}
ins_pipe(pipe_slow);
%}')dnl
@ -1003,11 +1003,11 @@ instruct vmul2L(vecX dst, vecX src1, vecX src2, iRegLNoSp tmp1, iRegLNoSp tmp2)
__ umov($tmp1$$Register, as_FloatRegister($src1$$reg), __ D, 0);
__ umov($tmp2$$Register, as_FloatRegister($src2$$reg), __ D, 0);
__ mul(as_Register($tmp2$$reg), as_Register($tmp2$$reg), as_Register($tmp1$$reg));
__ mov(as_FloatRegister($dst$$reg), __ T2D, 0, $tmp2$$Register);
__ mov(as_FloatRegister($dst$$reg), __ D, 0, $tmp2$$Register);
__ umov($tmp1$$Register, as_FloatRegister($src1$$reg), __ D, 1);
__ umov($tmp2$$Register, as_FloatRegister($src2$$reg), __ D, 1);
__ mul(as_Register($tmp2$$reg), as_Register($tmp2$$reg), as_Register($tmp1$$reg));
__ mov(as_FloatRegister($dst$$reg), __ T2D, 1, $tmp2$$Register);
__ mov(as_FloatRegister($dst$$reg), __ D, 1, $tmp2$$Register);
%}
ins_pipe(pipe_slow);
%}

@ -2756,20 +2756,18 @@ public:
// Move from general purpose register
// mov Vd.T[index], Rn
void mov(FloatRegister Vd, SIMD_Arrangement T, int index, Register Xn) {
void mov(FloatRegister Vd, SIMD_RegVariant T, int index, Register Xn) {
guarantee(T != Q, "invalid register variant");
starti;
f(0b01001110000, 31, 21), f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
f(0b01001110000, 31, 21), f(((1 << T) | (index << (T + 1))), 20, 16);
f(0b000111, 15, 10), zrf(Xn, 5), rf(Vd, 0);
}
// Move to general purpose register
// mov Rd, Vn.T[index]
void mov(Register Xd, FloatRegister Vn, SIMD_Arrangement T, int index) {
guarantee(T >= T2S && T < T1Q, "only D and S arrangements are supported");
starti;
f(0, 31), f((T >= T1D) ? 1:0, 30), f(0b001110000, 29, 21);
f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
f(0b001111, 15, 10), rf(Vn, 5), rf(Xd, 0);
void mov(Register Xd, FloatRegister Vn, SIMD_RegVariant T, int index) {
guarantee(T == S || T == D, "invalid register variant");
umov(Xd, Vn, T, index);
}
private:

@ -3367,7 +3367,7 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
ld1r(v5, T2D, post(tmp, 8));
ld1r(v6, T2D, post(tmp, 8));
ld1r(v7, T2D, post(tmp, 8));
mov(v16, T4S, 0, crc);
mov(v16, S, 0, crc);
eor(v0, T16B, v0, v16);
sub(len, len, 64);
@ -3471,16 +3471,16 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
br(Assembler::GE, L_fold);
mov(crc, 0);
mov(tmp, v0, T1D, 0);
mov(tmp, v0, D, 0);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, false);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, true);
mov(tmp, v0, T1D, 1);
mov(tmp, v0, D, 1);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, false);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, true);
mov(tmp, v1, T1D, 0);
mov(tmp, v1, D, 0);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, false);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, true);
mov(tmp, v1, T1D, 1);
mov(tmp, v1, D, 1);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, false);
update_word_crc32(crc, tmp, tmp2, table0, table1, table2, table3, true);

@ -1571,10 +1571,10 @@ generate(SpecialCases, [["ccmn", "__ ccmn(zr, zr, 3u, Assembler::LE);",
["stxpw", "__ stxpw(r6, zr, zr, sp);", "stxp\tw6, wzr, wzr, [sp]"],
["dup", "__ dup(v0, __ T16B, zr);", "dup\tv0.16b, wzr"],
["dup", "__ dup(v0, __ S, v1);", "dup\ts0, v1.s[0]"],
["mov", "__ mov(v1, __ T1D, 0, zr);", "mov\tv1.d[0], xzr"],
["mov", "__ mov(v1, __ T2S, 1, zr);", "mov\tv1.s[1], wzr"],
["mov", "__ mov(v1, __ T4H, 2, zr);", "mov\tv1.h[2], wzr"],
["mov", "__ mov(v1, __ T8B, 3, zr);", "mov\tv1.b[3], wzr"],
["mov", "__ mov(v1, __ D, 0, zr);", "mov\tv1.d[0], xzr"],
["mov", "__ mov(v1, __ S, 1, zr);", "mov\tv1.s[1], wzr"],
["mov", "__ mov(v1, __ H, 2, zr);", "mov\tv1.h[2], wzr"],
["mov", "__ mov(v1, __ B, 3, zr);", "mov\tv1.b[3], wzr"],
["smov", "__ smov(r0, v1, __ S, 0);", "smov\tx0, v1.s[0]"],
["smov", "__ smov(r0, v1, __ H, 1);", "smov\tx0, v1.h[1]"],
["smov", "__ smov(r0, v1, __ B, 2);", "smov\tx0, v1.b[2]"],

@ -713,10 +713,10 @@
__ stxpw(r6, zr, zr, sp); // stxp w6, wzr, wzr, [sp]
__ dup(v0, __ T16B, zr); // dup v0.16b, wzr
__ dup(v0, __ S, v1); // dup s0, v1.s[0]
__ mov(v1, __ T1D, 0, zr); // mov v1.d[0], xzr
__ mov(v1, __ T2S, 1, zr); // mov v1.s[1], wzr
__ mov(v1, __ T4H, 2, zr); // mov v1.h[2], wzr
__ mov(v1, __ T8B, 3, zr); // mov v1.b[3], wzr
__ mov(v1, __ D, 0, zr); // mov v1.d[0], xzr
__ mov(v1, __ S, 1, zr); // mov v1.s[1], wzr
__ mov(v1, __ H, 2, zr); // mov v1.h[2], wzr
__ mov(v1, __ B, 3, zr); // mov v1.b[3], wzr
__ smov(r0, v1, __ S, 0); // smov x0, v1.s[0]
__ smov(r0, v1, __ H, 1); // smov x0, v1.h[1]
__ smov(r0, v1, __ B, 2); // smov x0, v1.b[2]