mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 18:00:13 +01:00
intel/compiler: Add an lsc_op_num_data_values() helper
There are a number of places that need to know how many operands an LSC atomic takes (0 for inc/dec, 1 for most things, 2 for cmpxchg). We can add a helper for that and eliminate some code (with more to come). Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Rohan Garg <rohan.garg@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20604>
This commit is contained in:
parent
90a2137cd5
commit
284f0c9a57
2 changed files with 25 additions and 45 deletions
|
|
@ -1240,6 +1240,27 @@ lsc_opcode_is_atomic(enum lsc_opcode opcode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
lsc_op_num_data_values(unsigned _op)
|
||||||
|
{
|
||||||
|
enum lsc_opcode op = (enum lsc_opcode) _op;
|
||||||
|
|
||||||
|
switch (op) {
|
||||||
|
case LSC_OP_ATOMIC_CMPXCHG:
|
||||||
|
case LSC_OP_ATOMIC_FCMPXCHG:
|
||||||
|
return 2;
|
||||||
|
case LSC_OP_ATOMIC_INC:
|
||||||
|
case LSC_OP_ATOMIC_DEC:
|
||||||
|
case LSC_OP_LOAD:
|
||||||
|
case LSC_OP_LOAD_CMASK:
|
||||||
|
case LSC_OP_FENCE:
|
||||||
|
/* XXX: actually check docs */
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned
|
static inline unsigned
|
||||||
lsc_op_to_legacy_atomic(unsigned _op)
|
lsc_op_to_legacy_atomic(unsigned _op)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -781,34 +781,11 @@ fs_inst::components_read(unsigned i) const
|
||||||
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_LOGICAL:
|
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_LOGICAL:
|
||||||
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_INT16_LOGICAL:
|
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_INT16_LOGICAL:
|
||||||
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_INT64_LOGICAL:
|
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_INT64_LOGICAL:
|
||||||
assert(src[2].file == IMM);
|
|
||||||
if (i == 1) {
|
|
||||||
/* Data source */
|
|
||||||
const unsigned op = src[2].ud;
|
|
||||||
switch (op) {
|
|
||||||
case LSC_OP_ATOMIC_INC:
|
|
||||||
case LSC_OP_ATOMIC_DEC:
|
|
||||||
return 0;
|
|
||||||
case LSC_OP_ATOMIC_CMPXCHG:
|
|
||||||
return 2;
|
|
||||||
default:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT16_LOGICAL:
|
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT16_LOGICAL:
|
||||||
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT32_LOGICAL:
|
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT32_LOGICAL:
|
||||||
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT64_LOGICAL:
|
case SHADER_OPCODE_A64_UNTYPED_ATOMIC_FLOAT64_LOGICAL:
|
||||||
assert(src[2].file == IMM);
|
assert(src[2].file == IMM);
|
||||||
if (i == 1) {
|
return i == 1 ? lsc_op_num_data_values(src[2].ud) : 1;
|
||||||
/* Data source */
|
|
||||||
const unsigned op = src[2].ud;
|
|
||||||
return op == LSC_OP_ATOMIC_FCMPXCHG ? 2 : 1;
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL:
|
case SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL:
|
||||||
case SHADER_OPCODE_DWORD_SCATTERED_READ_LOGICAL:
|
case SHADER_OPCODE_DWORD_SCATTERED_READ_LOGICAL:
|
||||||
|
|
@ -830,6 +807,7 @@ fs_inst::components_read(unsigned i) const
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
|
case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
|
||||||
|
case SHADER_OPCODE_UNTYPED_ATOMIC_FLOAT_LOGICAL:
|
||||||
case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL: {
|
case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL: {
|
||||||
assert(src[SURFACE_LOGICAL_SRC_IMM_DIMS].file == IMM &&
|
assert(src[SURFACE_LOGICAL_SRC_IMM_DIMS].file == IMM &&
|
||||||
src[SURFACE_LOGICAL_SRC_IMM_ARG].file == IMM);
|
src[SURFACE_LOGICAL_SRC_IMM_ARG].file == IMM);
|
||||||
|
|
@ -838,31 +816,12 @@ fs_inst::components_read(unsigned i) const
|
||||||
if (i == SURFACE_LOGICAL_SRC_ADDRESS)
|
if (i == SURFACE_LOGICAL_SRC_ADDRESS)
|
||||||
return src[SURFACE_LOGICAL_SRC_IMM_DIMS].ud;
|
return src[SURFACE_LOGICAL_SRC_IMM_DIMS].ud;
|
||||||
/* Surface operation source. */
|
/* Surface operation source. */
|
||||||
else if (i == SURFACE_LOGICAL_SRC_DATA && op == LSC_OP_ATOMIC_CMPXCHG)
|
else if (i == SURFACE_LOGICAL_SRC_DATA)
|
||||||
return 2;
|
return lsc_op_num_data_values(op);
|
||||||
else if (i == SURFACE_LOGICAL_SRC_DATA &&
|
|
||||||
(op == LSC_OP_ATOMIC_INC || op == LSC_OP_ATOMIC_DEC))
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||||
return (i == 0 ? 2 : 1);
|
return (i == 0 ? 2 : 1);
|
||||||
|
|
||||||
case SHADER_OPCODE_UNTYPED_ATOMIC_FLOAT_LOGICAL: {
|
|
||||||
assert(src[SURFACE_LOGICAL_SRC_IMM_DIMS].file == IMM &&
|
|
||||||
src[SURFACE_LOGICAL_SRC_IMM_ARG].file == IMM);
|
|
||||||
const unsigned op = src[SURFACE_LOGICAL_SRC_IMM_ARG].ud;
|
|
||||||
/* Surface coordinates. */
|
|
||||||
if (i == SURFACE_LOGICAL_SRC_ADDRESS)
|
|
||||||
return src[SURFACE_LOGICAL_SRC_IMM_DIMS].ud;
|
|
||||||
/* Surface operation source. */
|
|
||||||
else if (i == SURFACE_LOGICAL_SRC_DATA && op == LSC_OP_ATOMIC_FCMPXCHG)
|
|
||||||
return 2;
|
|
||||||
else
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SHADER_OPCODE_URB_WRITE_LOGICAL:
|
case SHADER_OPCODE_URB_WRITE_LOGICAL:
|
||||||
if (i == URB_LOGICAL_SRC_DATA)
|
if (i == URB_LOGICAL_SRC_DATA)
|
||||||
return mlen - 1 -
|
return mlen - 1 -
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue