[Mesa-dev] [PATCH 14/23] i965/disasm: Properly decode negate source modifiers on Broadwell.

Kristian Høgsberg hoegsberg at gmail.com
Mon Jun 30 10:39:57 PDT 2014


On Sat, Jun 28, 2014 at 09:33:53PM -0700, Kenneth Graunke wrote:
> This is a port of Abdiel's 6f9f916b9b042a294813ab0542390846a38739da
> to brw_disasm.c.

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_disasm.c | 53 +++++++++++++++++++++++++++++++---
>  1 file changed, 49 insertions(+), 4 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c
> index 99c9bd0..de438cd 100644
> --- a/src/mesa/drivers/dri/i965/brw_disasm.c
> +++ b/src/mesa/drivers/dri/i965/brw_disasm.c
> @@ -125,6 +125,15 @@ has_uip(struct brw_context *brw, enum opcode opcode)
>            opcode == BRW_OPCODE_HALT;
>  }
>  
> +static bool
> +is_logic_instruction(unsigned opcode)
> +{
> +   return opcode == BRW_OPCODE_AND ||
> +          opcode == BRW_OPCODE_NOT ||
> +          opcode == BRW_OPCODE_OR ||
> +          opcode == BRW_OPCODE_XOR;
> +}
> +
>  const char *const conditional_modifier[16] = {
>     [BRW_CONDITIONAL_NONE] = "",
>     [BRW_CONDITIONAL_Z]    = ".e",
> @@ -148,6 +157,8 @@ static const char *const _abs[2] = {
>     [1] = "(abs)",
>  };
>  
> +static const char *const m_bitnot[2] = { "", "~" };
> +
>  static const char *const vert_stride[16] = {
>     [0] = "0",
>     [1] = "1",
> @@ -745,13 +756,21 @@ src_align1_region(FILE *file,
>  }
>  
>  static int
> -src_da1(FILE *file, unsigned type, unsigned _reg_file,
> +src_da1(FILE *file,
> +        const struct brw_context *brw,
> +        unsigned opcode,
> +        unsigned type, unsigned _reg_file,
>          unsigned _vert_stride, unsigned _width, unsigned _horiz_stride,
>          unsigned reg_num, unsigned sub_reg_num, unsigned __abs,
>          unsigned _negate)
>  {
>     int err = 0;
> -   err |= control(file, "negate", m_negate, _negate, NULL);
> +
> +   if (brw->gen >= 8 && is_logic_instruction(opcode))
> +      err |= control(file, "bitnot", m_bitnot, _negate, NULL);
> +   else
> +      err |= control(file, "negate", m_negate, _negate, NULL);
> +
>     err |= control(file, "abs", _abs, __abs, NULL);
>  
>     err |= reg(file, _reg_file, reg_num);
> @@ -766,6 +785,8 @@ src_da1(FILE *file, unsigned type, unsigned _reg_file,
>  
>  static int
>  src_ia1(FILE *file,
> +        const struct brw_context *brw,
> +        unsigned opcode,
>          unsigned type,
>          unsigned _reg_file,
>          int _addr_imm,
> @@ -776,7 +797,12 @@ src_ia1(FILE *file,
>          unsigned _horiz_stride, unsigned _width, unsigned _vert_stride)
>  {
>     int err = 0;
> -   err |= control(file, "negate", m_negate, _negate, NULL);
> +
> +   if (brw->gen >= 8 && is_logic_instruction(opcode))
> +      err |= control(file, "bitnot", m_bitnot, _negate, NULL);
> +   else
> +      err |= control(file, "negate", m_negate, _negate, NULL);
> +
>     err |= control(file, "abs", _abs, __abs, NULL);
>  
>     string(file, "g[a0");
> @@ -792,6 +818,8 @@ src_ia1(FILE *file,
>  
>  static int
>  src_da16(FILE *file,
> +         const struct brw_context *brw,
> +         unsigned opcode,
>           unsigned _reg_type,
>           unsigned _reg_file,
>           unsigned _vert_stride,
> @@ -802,7 +830,12 @@ src_da16(FILE *file,
>           unsigned swz_x, unsigned swz_y, unsigned swz_z, unsigned swz_w)
>  {
>     int err = 0;
> -   err |= control(file, "negate", m_negate, _negate, NULL);
> +
> +   if (brw->gen >= 8 && is_logic_instruction(opcode))
> +      err |= control(file, "bitnot", m_bitnot, _negate, NULL);
> +   else
> +      err |= control(file, "negate", m_negate, _negate, NULL);
> +
>     err |= control(file, "abs", _abs, __abs, NULL);
>  
>     err |= reg(file, _reg_file, _reg_nr);
> @@ -1023,6 +1056,8 @@ src0(FILE *file, struct brw_context *brw, brw_inst *inst)
>     } else if (brw_inst_access_mode(brw, inst) == BRW_ALIGN_1) {
>        if (brw_inst_src0_address_mode(brw, inst) == BRW_ADDRESS_DIRECT) {
>           return src_da1(file,
> +                        brw,
> +                        brw_inst_opcode(brw, inst),
>                          brw_inst_src0_reg_type(brw, inst),
>                          brw_inst_src0_reg_file(brw, inst),
>                          brw_inst_src0_vstride(brw, inst),
> @@ -1034,6 +1069,8 @@ src0(FILE *file, struct brw_context *brw, brw_inst *inst)
>                          brw_inst_src0_negate(brw, inst));
>        } else {
>           return src_ia1(file,
> +                        brw,
> +                        brw_inst_opcode(brw, inst),
>                          brw_inst_src0_reg_type(brw, inst),
>                          brw_inst_src0_reg_file(brw, inst),
>                          brw_inst_src0_ia1_addr_imm(brw, inst),
> @@ -1048,6 +1085,8 @@ src0(FILE *file, struct brw_context *brw, brw_inst *inst)
>     } else {
>        if (brw_inst_src0_address_mode(brw, inst) == BRW_ADDRESS_DIRECT) {
>           return src_da16(file,
> +                         brw,
> +                         brw_inst_opcode(brw, inst),
>                           brw_inst_src0_reg_type(brw, inst),
>                           brw_inst_src0_reg_file(brw, inst),
>                           brw_inst_src0_vstride(brw, inst),
> @@ -1074,6 +1113,8 @@ src1(FILE *file, struct brw_context *brw, brw_inst *inst)
>     } else if (brw_inst_access_mode(brw, inst) == BRW_ALIGN_1) {
>        if (brw_inst_src1_address_mode(brw, inst) == BRW_ADDRESS_DIRECT) {
>           return src_da1(file,
> +                        brw,
> +                        brw_inst_opcode(brw, inst),
>                          brw_inst_src1_reg_type(brw, inst),
>                          brw_inst_src1_reg_file(brw, inst),
>                          brw_inst_src1_vstride(brw, inst),
> @@ -1085,6 +1126,8 @@ src1(FILE *file, struct brw_context *brw, brw_inst *inst)
>                          brw_inst_src1_negate(brw, inst));
>        } else {
>           return src_ia1(file,
> +                        brw,
> +                        brw_inst_opcode(brw, inst),
>                          brw_inst_src1_reg_type(brw, inst),
>                          brw_inst_src1_reg_file(brw, inst),
>                          brw_inst_src1_ia1_addr_imm(brw, inst),
> @@ -1099,6 +1142,8 @@ src1(FILE *file, struct brw_context *brw, brw_inst *inst)
>     } else {
>        if (brw_inst_src1_address_mode(brw, inst) == BRW_ADDRESS_DIRECT) {
>           return src_da16(file,
> +                         brw,
> +                         brw_inst_opcode(brw, inst),
>                           brw_inst_src1_reg_type(brw, inst),
>                           brw_inst_src1_reg_file(brw, inst),
>                           brw_inst_src1_vstride(brw, inst),
> -- 
> 2.0.0
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list