ir3: Fix cat5 parsing with a1.x src present
Such instructions were failing to be parsed: sam.s2en.uniform.base1 (f32)(xyz)r1.w, r0.z, r1.y, a1.x saml.s2en.uniform.base1 (f32)(xyzw)r13.x, r0.w, r13.w, r11.w, a1.x isam.v.s2en.uniform.base0 (u32)(xyzw)r1.y, r0.x+3, r2.y Also fix fixup_cat5_s2en which incorrectly rotated instruction sources. Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31952>
This commit is contained in:
committed by
Marge Bot
parent
cfbe30745a
commit
fd5c94b8c7
@@ -205,16 +205,19 @@ static void fixup_cat5_s2en(void)
|
||||
* is first, rather than last. So we have to detect this case and
|
||||
* fix things up.
|
||||
*/
|
||||
struct ir3_register *s2en_src = instr->srcs[instr->srcs_count - 1];
|
||||
|
||||
uint32_t s2en_off = instr->srcs_count - 1;
|
||||
if (instr->flags & IR3_INSTR_A1EN)
|
||||
s2en_off = instr->srcs_count - 2;
|
||||
|
||||
struct ir3_register *s2en_src = instr->srcs[s2en_off];
|
||||
|
||||
if (instr->flags & IR3_INSTR_B)
|
||||
assert(!(s2en_src->flags & IR3_REG_HALF));
|
||||
else
|
||||
assert(s2en_src->flags & IR3_REG_HALF);
|
||||
|
||||
for (int i = 0; i < instr->srcs_count - 1; i++) {
|
||||
instr->srcs[i+1] = instr->srcs[i];
|
||||
}
|
||||
memmove(instr->srcs + 1, instr->srcs, s2en_off * sizeof(instr->srcs[0]));
|
||||
instr->srcs[0] = s2en_src;
|
||||
}
|
||||
|
||||
@@ -731,7 +734,7 @@ static void print_token(FILE *file, int type, YYSTYPE value)
|
||||
%type <num> integer offset uoffset
|
||||
%type <num> flut_immed
|
||||
%type <flt> float
|
||||
%type <reg> src dst const cat0_src1 cat0_src2
|
||||
%type <reg> dst const src_gpr src_a0 src_a1 src_p0 cat0_src1 cat0_src2
|
||||
%type <tok> cat1_opc
|
||||
%type <tok> cat2_opc_1src cat2_opc_2src_cnd cat2_opc_2src
|
||||
%type <tok> cat3_opc
|
||||
@@ -1148,9 +1151,9 @@ cat5_flags:
|
||||
cat5_samp: T_SAMP { instr->cat5.samp = $1; }
|
||||
cat5_tex: T_TEX { instr->cat5.tex = $1; }
|
||||
cat5_type: '(' type ')' { instr->cat5.type = $2; }
|
||||
cat5_a1: src_reg { instr->flags |= IR3_INSTR_A1EN; }
|
||||
cat5_a1: src_a1 { instr->flags |= IR3_INSTR_A1EN; }
|
||||
|
||||
cat5_samp_tex: src_reg
|
||||
cat5_samp_tex: src_gpr
|
||||
| cat5_samp ',' cat5_tex
|
||||
| cat5_samp
|
||||
| cat5_tex
|
||||
@@ -1158,15 +1161,16 @@ cat5_samp_tex: src_reg
|
||||
cat5_samp_tex_all: cat5_samp_tex
|
||||
| cat5_samp ',' cat5_a1
|
||||
| cat5_tex ',' cat5_a1
|
||||
| src_gpr ',' cat5_a1
|
||||
|
||||
cat5_instr: cat5_opc_dsxypp cat5_flags dst_reg ',' src_reg
|
||||
| cat5_opc cat5_flags cat5_type dst_reg ',' src_reg ',' src_reg ',' cat5_samp_tex_all
|
||||
| cat5_opc cat5_flags cat5_type dst_reg ',' src_reg ',' cat5_samp_tex_all
|
||||
cat5_instr: cat5_opc_dsxypp cat5_flags dst_reg ',' src_gpr
|
||||
| cat5_opc cat5_flags cat5_type dst_reg ',' src_gpr ',' src_gpr ',' cat5_samp_tex_all
|
||||
| cat5_opc cat5_flags cat5_type dst_reg ',' src_gpr ',' cat5_samp_tex_all
|
||||
| cat5_opc cat5_flags cat5_type dst_reg ',' cat5_samp_tex
|
||||
| cat5_opc cat5_flags cat5_type dst_reg
|
||||
| cat5_opc_isam cat5_flags cat5_type dst_reg ',' src_reg ',' src_reg ',' cat5_samp_tex_all
|
||||
| cat5_opc_isam cat5_flags cat5_type dst_reg ',' src_reg ',' cat5_samp_tex_all
|
||||
| cat5_opc_isam '.' 'v' cat5_flags cat5_type dst_reg ',' src_reg src_uoffset ',' cat5_samp_tex_all { instr->flags |= IR3_INSTR_V; }
|
||||
| cat5_opc_isam cat5_flags cat5_type dst_reg ',' src_gpr ',' src_gpr ',' cat5_samp_tex_all
|
||||
| cat5_opc_isam cat5_flags cat5_type dst_reg ',' src_gpr ',' cat5_samp_tex_all
|
||||
| cat5_opc_isam '.' 'v' cat5_flags cat5_type dst_reg ',' src_gpr src_uoffset ',' cat5_samp_tex_all { instr->flags |= IR3_INSTR_V; }
|
||||
| T_OP_TCINV { new_instr(OPC_TCINV); }
|
||||
|
||||
cat6_typed: '.' T_UNTYPED { instr->cat6.typed = 0; }
|
||||
@@ -1489,10 +1493,15 @@ meta_print: meta_print_start meta_print_regs {
|
||||
}
|
||||
}
|
||||
|
||||
src: T_REGISTER { $$ = new_src($1, 0); }
|
||||
| T_A0 { $$ = new_src((61 << 3), IR3_REG_HALF); }
|
||||
| T_A1 { $$ = new_src((61 << 3) + 1, IR3_REG_HALF); }
|
||||
| T_P0 { $$ = new_src((62 << 3) + $1, IR3_REG_PREDICATE); }
|
||||
src_gpr: T_REGISTER { $$ = new_src($1, 0); }
|
||||
src_a0: T_A0 { $$ = new_src((61 << 3), IR3_REG_HALF); }
|
||||
src_a1: T_A1 { $$ = new_src((61 << 3) + 1, IR3_REG_HALF); }
|
||||
src_p0: T_P0 { $$ = new_src((62 << 3) + $1, IR3_REG_PREDICATE); }
|
||||
|
||||
src: src_gpr
|
||||
| src_a0
|
||||
| src_a1
|
||||
| src_p0
|
||||
|
||||
dst: T_REGISTER { $$ = new_dst($1, 0); }
|
||||
| T_A0 { $$ = new_dst((61 << 3), IR3_REG_HALF); }
|
||||
|
||||
@@ -165,6 +165,8 @@ static const struct test {
|
||||
INSTR_6XX(a048d107_cc080a07, "isaml.base3 (s32)(x)r1.w, r0.w, r1.y, s#0, t#6"),
|
||||
INSTR_6XX(a048d107_e0080a07, "isaml.base3 (s32)(x)r1.w, r0.w, r1.y, s#0, a1.x"),
|
||||
INSTR_6XX(a1481606_e4803035, "saml.base0 (f32)(yz)r1.z, r6.z, r6.x, s#36, a1.x"),
|
||||
INSTR_6XX(a0c89707_20a00005, "sam.s2en.uniform.base1 (f32)(xyz)r1.w, r0.z, r1.y, a1.x"),
|
||||
INSTR_6XX(a1489f34_25e06e07, "saml.s2en.uniform.base1 (f32)(xyzw)r13.x, r0.w, r13.w, r11.w, a1.x"),
|
||||
|
||||
INSTR_7XX(a0081f02_e2040001, "isam.base0 (f32)(xyzw)r0.z, r0.x, t#16, a1.x"),
|
||||
INSTR_7XX(a0081f02_e2000001, "isam.base0.1d (f32)(xyzw)r0.z, r0.x, t#16, a1.x"),
|
||||
@@ -173,6 +175,7 @@ static const struct test {
|
||||
INSTR_7XX(a00c3101_c2040001, "isam.v.base0 (u32)(x)r0.y, r0.x, s#0, t#1"),
|
||||
INSTR_7XX(a00c3101_c2000001, "isam.v.base0.1d (u32)(x)r0.y, r0.x, s#0, t#1"),
|
||||
INSTR_7XX(a02c3f06_c2041003, "isam.v.base0 (u32)(xyzw)r1.z, r0.y+8, s#0, t#1"),
|
||||
INSTR_7XX(a02c3f05_a1240601, "isam.v.s2en.uniform.base0 (u32)(xyzw)r1.y, r0.x+3, r2.y"),
|
||||
|
||||
/* dEQP-VK.subgroups.arithmetic.compute.subgroupadd_float */
|
||||
INSTR_6XX(a7c03102_00100003, "brcst.active.w8 (u32)(x)r0.z, r0.y"), /* brcst.active.w8 (u32)(xOOO)r0.z, r0.y */
|
||||
|
||||
Reference in New Issue
Block a user