[Mesa-dev] [PATCH 3/6] Replace bit-shifts and cycles with helpers from tgsi_exec.h
Constantine Charlamov
Hi-Angel at yandex.ru
Sun Feb 26 20:31:46 UTC 2017
From: Hi-Angel <Hi-Angel at yandex.ru>
Changes turned out to be bigger than I expected, so I skipped over every
place where I was in doubts. Still, it looks better.
Signed-off-by: Constantine Charlamov <Hi-Angel at yandex.ru>
---
src/gallium/drivers/r600/r600_shader.c | 246 +++++++++------------------------
1 file changed, 65 insertions(+), 181 deletions(-)
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 8562678d0c..905214f69b 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -30,6 +30,7 @@
#include "pipe/p_shader_tokens.h"
#include "tgsi/tgsi_info.h"
+#include "tgsi/tgsi_exec.h"
#include "tgsi/tgsi_parse.h"
#include "tgsi/tgsi_scan.h"
#include "tgsi/tgsi_dump.h"
@@ -378,14 +379,14 @@ static int do_lds_fetch_values(struct r600_shader_ctx *ctx, unsigned temp_reg,
static int tgsi_last_instruction(unsigned writemask)
{
- int i, lasti = 0;
+ int i, last_ch = 0;
- for (i = 0; i < 4; i++) {
+ TGSI_FOR_EACH_CHANNEL (i) {
if (writemask & (1 << i)) {
- lasti = i;
+ last_ch = i;
}
}
- return lasti;
+ return last_ch;
}
static int tgsi_is_supported(struct r600_shader_ctx *ctx)
@@ -2693,8 +2694,7 @@ static int r600_store_tcs_output(struct r600_shader_ctx *ctx)
/* LDS write */
lasti = tgsi_last_instruction(write_mask);
for (chan_index = 1; chan_index <= lasti; chan_index++) {
-
- if (!(write_mask & (1 << chan_index)))
+ if(!TGSI_IS_DST0_CHANNEL_ENABLED(inst, chan_index))
continue;
r = single_alu_op2(ctx, ALU_OP2_ADD_INT,
temp_reg, chan_index,
@@ -2704,10 +2704,7 @@ static int r600_store_tcs_output(struct r600_shader_ctx *ctx)
return r;
}
- for (chan_index = 0; chan_index <= lasti; chan_index++) {
- if (!(write_mask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
if ((chan_index == 0 && ((write_mask & 3) == 3)) ||
(chan_index == 2 && ((write_mask & 0xc) == 0xc))) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
@@ -3747,7 +3744,7 @@ static int tgsi_op2_64_params(struct r600_shader_ctx *ctx, bool singledest, bool
struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
unsigned write_mask = inst->Dst[0].Register.WriteMask;
struct r600_bytecode_alu alu;
- int chan_index, j, r, lasti = tgsi_last_instruction(write_mask);
+ int chan_index, j, r, lasti;
int use_tmp = 0;
if (singledest) {
@@ -3770,11 +3767,7 @@ static int tgsi_op2_64_params(struct r600_shader_ctx *ctx, bool singledest, bool
}
lasti = tgsi_last_instruction(write_mask);
- for (chan_index = 0; chan_index <= lasti; chan_index++) {
-
- if (!(write_mask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
if (singledest) {
@@ -3823,10 +3816,7 @@ static int tgsi_op2_64_params(struct r600_shader_ctx *ctx, bool singledest, bool
write_mask = inst->Dst[0].Register.WriteMask;
/* move result from temp to dst */
- for (chan_index = 0; chan_index <= lasti; chan_index++) {
- if (!(write_mask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
tgsi_dst(ctx, &inst->Dst[0], chan_index, &alu.dst);
@@ -3912,10 +3902,7 @@ static int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
ctx->info.properties[TGSI_PROPERTY_MUL_ZERO_WINS])
op = ALU_OP2_MUL;
- for (chan_index = 0; chan_index <= lasti; chan_index++) {
- if (!(write_mask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
if (use_tmp) {
alu.dst.sel = ctx->temp_reg;
@@ -3943,10 +3930,7 @@ static int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
if (use_tmp) {
/* move result from temp to dst */
- for (chan_index = 0; chan_index <= lasti; chan_index++) {
- if (!(write_mask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
tgsi_dst(ctx, &inst->Dst[0], chan_index, &alu.dst);
@@ -3984,10 +3968,7 @@ static int tgsi_ineg(struct r600_shader_ctx *ctx)
int chan_index, r;
int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
-
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ctx->inst_info->op;
@@ -4015,10 +3996,7 @@ static int tgsi_dneg(struct r600_shader_ctx *ctx)
int chan_index, r;
int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
-
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
@@ -4248,9 +4226,7 @@ static int cayman_emit_double_instr(struct r600_shader_ctx *ctx)
if (r)
return r;
- for (chan_index = 0 ; chan_index <= lasti; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
alu.src[0].sel = t1;
@@ -4304,11 +4280,8 @@ static int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
int t1 = ctx->temp_reg;
- for (k = 0; k <= lasti; k++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
- continue;
-
- for (chan_index = 0 ; chan_index < 4; chan_index++) {
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, k) {
+ TGSI_FOR_EACH_CHANNEL(chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ctx->inst_info->op;
for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
@@ -4325,9 +4298,7 @@ static int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
}
}
- for (chan_index = 0 ; chan_index <= lasti; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
alu.src[0].sel = t1;
@@ -4360,7 +4331,7 @@ static int cayman_mul_double_instr(struct r600_shader_ctx *ctx)
k = inst->Dst[0].Register.WriteMask == TGSI_WRITEMASK_XY ? 0 : 1;
- for (chan_index = 0; chan_index < 4; chan_index++) {
+ TGSI_FOR_EACH_CHANNEL (chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ctx->inst_info->op;
for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
@@ -4376,9 +4347,7 @@ static int cayman_mul_double_instr(struct r600_shader_ctx *ctx)
return r;
}
- for (chan_index = 0; chan_index <= lasti; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
alu.src[0].sel = t1;
@@ -4584,10 +4553,7 @@ static int tgsi_trig(struct r600_shader_ctx *ctx)
return r;
/* replicate result */
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
@@ -5940,10 +5906,7 @@ static int tgsi_f2i(struct r600_shader_ctx *ctx)
unsigned write_mask = inst->Dst[0].Register.WriteMask;
int last_inst = tgsi_last_instruction(write_mask);
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_TRUNC;
@@ -5959,10 +5922,7 @@ static int tgsi_f2i(struct r600_shader_ctx *ctx)
return r;
}
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ctx->inst_info->op;
@@ -5990,10 +5950,7 @@ static int tgsi_iabs(struct r600_shader_ctx *ctx)
int last_inst = tgsi_last_instruction(write_mask);
/* tmp = -src */
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_SUB_INT;
@@ -6012,10 +5969,7 @@ static int tgsi_iabs(struct r600_shader_ctx *ctx)
}
/* dst = (src >= 0 ? src : tmp) */
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_CNDGE_INT;
alu.is_op3 = 1;
@@ -6046,10 +6000,7 @@ static int tgsi_issg(struct r600_shader_ctx *ctx)
int last_inst = tgsi_last_instruction(write_mask);
/* tmp = (src >= 0 ? src : -1) */
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_CNDGE_INT;
alu.is_op3 = 1;
@@ -6070,10 +6021,7 @@ static int tgsi_issg(struct r600_shader_ctx *ctx)
}
/* dst = (tmp > 0 ? 1 : tmp) */
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_CNDGT_INT;
alu.is_op3 = 1;
@@ -6163,10 +6111,7 @@ static int tgsi_bfi(struct r600_shader_ctx *ctx)
t1 = ctx->temp_reg;
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
/* create mask tmp */
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_BFM_INT;
@@ -6185,10 +6130,7 @@ static int tgsi_bfi(struct r600_shader_ctx *ctx)
t2 = r600_get_temp(ctx);
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
/* shift insert left */
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_LSHL_INT;
@@ -6205,10 +6147,7 @@ static int tgsi_bfi(struct r600_shader_ctx *ctx)
return r;
}
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
/* actual bitfield insert */
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_BFI_INT;
@@ -6247,10 +6186,7 @@ static int tgsi_msb(struct r600_shader_ctx *ctx)
t1 = ctx->temp_reg;
/* bit position is indexed from lsb by TGSI, and from msb by the hardware */
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
/* t1 = FFBH_INT / FFBH_UINT */
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ctx->inst_info->op;
@@ -6268,10 +6204,7 @@ static int tgsi_msb(struct r600_shader_ctx *ctx)
t2 = r600_get_temp(ctx);
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
/* t2 = 31 - t1 */
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_SUB_INT;
@@ -6290,10 +6223,7 @@ static int tgsi_msb(struct r600_shader_ctx *ctx)
return r;
}
- for (chan_index = 0; chan_index < 4; chan_index++) {
- if (!(write_mask & (1<<chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
/* result = t1 >= 0 ? t2 : t1 */
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_CNDGE_INT;
@@ -6463,10 +6393,7 @@ static int tgsi_interp_egcm(struct r600_shader_ctx *ctx)
// INTERP can't swizzle dst
lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
- for (i = 0; i <= lasti; i++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, i) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
alu.src[0].sel = tmp;
@@ -6559,10 +6486,7 @@ static int tgsi_op3(struct r600_shader_ctx *ctx)
if (ctx->src[j].abs)
temp_regs[j] = r600_get_temp(ctx);
}
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = op;
for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
@@ -6667,7 +6591,7 @@ static int do_vtx_fetch_inst(struct r600_shader_ctx *ctx, boolean src_requires_l
src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
if (src_requires_loading) {
- for (chan_index = 0; chan_index < 4; chan_index++) {
+ TGSI_FOR_EACH_CHANNEL (chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP1_MOV;
r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
@@ -6702,11 +6626,8 @@ static int do_vtx_fetch_inst(struct r600_shader_ctx *ctx, boolean src_requires_l
if (ctx->bc->chip_class >= EVERGREEN)
return 0;
- for (chan_index = 0; chan_index < 4; chan_index++) {
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_AND_INT;
@@ -7674,10 +7595,7 @@ static int tgsi_lrp(struct r600_shader_ctx *ctx)
/* optimize if it's just an equal balance */
if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_ADD;
r600_bytecode_src(&alu.src[0], &ctx->src[1], chan_index);
@@ -7696,10 +7614,7 @@ static int tgsi_lrp(struct r600_shader_ctx *ctx)
}
/* 1 - src0 */
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_ADD;
alu.src[0].sel = V_SQ_ALU_SRC_1;
@@ -7718,10 +7633,7 @@ static int tgsi_lrp(struct r600_shader_ctx *ctx)
}
/* (1 - src0) * src2 */
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP2_MUL;
alu.src[0].sel = ctx->temp_reg;
@@ -7748,10 +7660,7 @@ static int tgsi_lrp(struct r600_shader_ctx *ctx)
else
temp_regs[1] = 0;
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_MULADD;
alu.is_op3 = 1;
@@ -7799,10 +7708,7 @@ static int tgsi_cmp(struct r600_shader_ctx *ctx)
temp_regs[j] = r600_get_temp(ctx);
}
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = op;
r = tgsi_make_src_for_op3(ctx, temp_regs[0], chan_index, &alu.src[0], &ctx->src[0]);
@@ -7834,10 +7740,7 @@ static int tgsi_ucmp(struct r600_shader_ctx *ctx)
int chan_index, r;
int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_CNDE_INT;
r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
@@ -8343,9 +8246,7 @@ static int tgsi_eg_arl(struct r600_shader_ctx *ctx)
return -1;
}
- for (chan_index = 0; chan_index <= lasti; ++chan_index) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
alu.last = chan_index == lasti;
alu.dst.sel = reg;
@@ -8376,14 +8277,12 @@ static int tgsi_r600_arl(struct r600_shader_ctx *ctx)
alu.op = ALU_OP1_FLOOR;
alu.dst.sel = ctx->bc->ar_reg;
alu.dst.write = 1;
- for (chan_index = 0; chan_index <= lasti; ++chan_index) {
- if (inst->Dst[0].Register.WriteMask & (1 << chan_index)) {
- alu.dst.chan = chan_index;
- r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
- alu.last = chan_index == lasti;
- if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
- return r;
- }
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
+ alu.dst.chan = chan_index;
+ r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
+ alu.last = chan_index == lasti;
+ if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
+ return r;
}
memset(&alu, 0, sizeof(alu));
@@ -8407,13 +8306,11 @@ static int tgsi_r600_arl(struct r600_shader_ctx *ctx)
alu.dst.write = 1;
/* FLT_TO_INT is trans-only on r600/r700 */
alu.last = TRUE;
- for (chan_index = 0; chan_index <= lasti; ++chan_index) {
- if (inst->Dst[0].Register.WriteMask & (1 << chan_index)) {
- alu.dst.chan = chan_index;
- r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
- if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
- return r;
- }
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
+ alu.dst.chan = chan_index;
+ r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
+ if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
+ return r;
}
break;
case TGSI_OPCODE_UARL:
@@ -8421,14 +8318,12 @@ static int tgsi_r600_arl(struct r600_shader_ctx *ctx)
alu.op = ALU_OP1_MOV;
alu.dst.sel = ctx->bc->ar_reg;
alu.dst.write = 1;
- for (chan_index = 0; chan_index <= lasti; ++chan_index) {
- if (inst->Dst[0].Register.WriteMask & (1 << chan_index)) {
- alu.dst.chan = chan_index;
- r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
- alu.last = chan_index == lasti;
- if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
- return r;
- }
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
+ alu.dst.chan = chan_index;
+ r600_bytecode_src(&alu.src[0], &ctx->src[0], chan_index);
+ alu.last = chan_index == lasti;
+ if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
+ return r;
}
break;
default:
@@ -8903,10 +8798,7 @@ static int tgsi_umad(struct r600_shader_ctx *ctx)
int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
/* src0 * src1 */
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
if (ctx->bc->chip_class == CAYMAN) {
for (j = 0 ; j < 4; j++) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
@@ -8944,10 +8836,7 @@ static int tgsi_umad(struct r600_shader_ctx *ctx)
}
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
tgsi_dst(ctx, &inst->Dst[0], chan_index, &alu.dst);
@@ -8992,10 +8881,7 @@ static int tgsi_pk2h(struct r600_shader_ctx *ctx)
return r;
/* dst.x = temp.y * 0x10000 + temp.x */
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
-
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
alu.op = ALU_OP3_MULADD_UINT24;
alu.is_op3 = 1;
@@ -9049,9 +8935,7 @@ static int tgsi_up2h(struct r600_shader_ctx *ctx)
return r;
/* dst.wz = dst.xy = f16_to_f32(temp.xy) */
- for (chan_index = 0; chan_index < lasti + 1; chan_index++) {
- if (!(inst->Dst[0].Register.WriteMask & (1 << chan_index)))
- continue;
+ TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
memset(&alu, 0, sizeof(struct r600_bytecode_alu));
tgsi_dst(ctx, &inst->Dst[0], chan_index, &alu.dst);
alu.op = ALU_OP1_FLT16_TO_FLT32;
--
2.11.1
More information about the mesa-dev
mailing list