i965: Add a bit of validation for some ISA restrictions in the docs.
This commit is contained in:
parent
e432fe09dd
commit
5c77792859
|
@ -103,12 +103,80 @@ static void brw_set_dest( struct brw_instruction *insn,
|
|||
guess_execution_size(insn, dest);
|
||||
}
|
||||
|
||||
static void
|
||||
validate_reg(struct brw_instruction *insn, struct brw_reg reg)
|
||||
{
|
||||
int hstride_for_reg[] = {0, 1, 2, 4};
|
||||
int vstride_for_reg[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256};
|
||||
int width_for_reg[] = {1, 2, 4, 8, 16};
|
||||
int execsize_for_reg[] = {1, 2, 4, 8, 16};
|
||||
int width, hstride, vstride, execsize;
|
||||
|
||||
if (reg.file == BRW_IMMEDIATE_VALUE)
|
||||
return;
|
||||
|
||||
if (reg.file == BRW_ARCHITECTURE_REGISTER_FILE &&
|
||||
reg.file == BRW_ARF_NULL)
|
||||
return;
|
||||
|
||||
assert(reg.hstride >= 0 && reg.hstride < Elements(hstride_for_reg));
|
||||
hstride = hstride_for_reg[reg.hstride];
|
||||
|
||||
if (reg.vstride == 0xf) {
|
||||
vstride = -1;
|
||||
} else {
|
||||
assert(reg.vstride >= 0 && reg.vstride < Elements(vstride_for_reg));
|
||||
vstride = vstride_for_reg[reg.vstride];
|
||||
}
|
||||
|
||||
assert(reg.width >= 0 && reg.width < Elements(width_for_reg));
|
||||
width = width_for_reg[reg.width];
|
||||
|
||||
assert(insn->header.execution_size >= 0 &&
|
||||
insn->header.execution_size < Elements(execsize_for_reg));
|
||||
execsize = execsize_for_reg[insn->header.execution_size];
|
||||
|
||||
/* Restrictions from 3.3.10: Register Region Restrictions. */
|
||||
/* 3. */
|
||||
assert(execsize >= width);
|
||||
|
||||
/* 4. */
|
||||
if (execsize == width && hstride != 0) {
|
||||
assert(vstride == -1 || vstride == width * hstride);
|
||||
}
|
||||
|
||||
/* 5. */
|
||||
if (execsize == width && hstride == 0) {
|
||||
/* no restriction on vstride. */
|
||||
}
|
||||
|
||||
/* 6. */
|
||||
if (width == 1) {
|
||||
assert(hstride == 0);
|
||||
}
|
||||
|
||||
/* 7. */
|
||||
if (execsize == 1 && width == 1) {
|
||||
assert(hstride == 0);
|
||||
assert(vstride == 0);
|
||||
}
|
||||
|
||||
/* 8. */
|
||||
if (vstride == 0 && hstride == 0) {
|
||||
assert(width == 1);
|
||||
}
|
||||
|
||||
/* 10. Check destination issues. */
|
||||
}
|
||||
|
||||
static void brw_set_src0( struct brw_instruction *insn,
|
||||
struct brw_reg reg )
|
||||
{
|
||||
if (reg.type != BRW_ARCHITECTURE_REGISTER_FILE)
|
||||
assert(reg.nr < 128);
|
||||
|
||||
validate_reg(insn, reg);
|
||||
|
||||
insn->bits1.da1.src0_reg_file = reg.file;
|
||||
insn->bits1.da1.src0_reg_type = reg.type;
|
||||
insn->bits2.da1.src0_abs = reg.abs;
|
||||
|
@ -184,6 +252,8 @@ void brw_set_src1( struct brw_instruction *insn,
|
|||
|
||||
assert(reg.nr < 128);
|
||||
|
||||
validate_reg(insn, reg);
|
||||
|
||||
insn->bits1.da1.src1_reg_file = reg.file;
|
||||
insn->bits1.da1.src1_reg_type = reg.type;
|
||||
insn->bits3.da1.src1_abs = reg.abs;
|
||||
|
|
Loading…
Reference in New Issue