return swizzle_smear(reg, RC_SWIZZLE_W);
}
-static int is_dst_safe_to_reuse(struct rc_instruction *inst)
-{
- const struct rc_opcode_info *info = rc_get_opcode_info(inst->U.I.Opcode);
- unsigned i;
-
- assert(info->HasDstReg);
-
- if (inst->U.I.DstReg.File != RC_FILE_TEMPORARY)
- return 0;
-
- for (i = 0; i < info->NumSrcRegs; i++) {
- if (inst->U.I.SrcReg[i].File == RC_FILE_TEMPORARY &&
- inst->U.I.SrcReg[i].Index == inst->U.I.DstReg.Index)
- return 0;
- }
-
- return 1;
-}
-
-static struct rc_dst_register try_to_reuse_dst(struct radeon_compiler *c,
+static struct rc_dst_register new_dst_reg(struct radeon_compiler *c,
struct rc_instruction *inst)
{
- unsigned tmp;
-
- if (is_dst_safe_to_reuse(inst))
- tmp = inst->U.I.DstReg.Index;
- else
- tmp = rc_find_free_temporary(c);
-
+ unsigned tmp = rc_find_free_temporary(c);
return dstregtmpmask(tmp, inst->U.I.DstReg.WriteMask);
}
* ceil(x) = x+frac(-x)
*/
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit1(c, inst->Prev, RC_OPCODE_FRC, NULL, dst, negate(inst->U.I.SrcReg[0]));
emit2(c, inst->Prev, RC_OPCODE_ADD, &inst->U.I, inst->U.I.DstReg,
inst->U.I.SrcReg[0], srcreg(RC_FILE_TEMPORARY, dst.Index));
static void transform_FLR(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit1(c, inst->Prev, RC_OPCODE_FRC, NULL, dst, inst->U.I.SrcReg[0]);
emit2(c, inst->Prev, RC_OPCODE_ADD, &inst->U.I, inst->U.I.DstReg,
inst->U.I.SrcReg[0], negate(srcreg(RC_FILE_TEMPORARY, dst.Index)));
abs = srcregswz(RC_FILE_TEMPORARY, tmp, inst->U.I.SrcReg[0].Swizzle);
}
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit1(c, inst->Prev, RC_OPCODE_FRC, NULL, dst, abs);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, abs,
negate(srcreg(RC_FILE_TEMPORARY, dst.Index)));
static void transform_LRP(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit3(c, inst->Prev, RC_OPCODE_MAD, NULL,
dst,
static void transform_POW(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register tempdst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register tempdst = new_dst_reg(c, inst);
struct rc_src_register tempsrc = srcreg(RC_FILE_TEMPORARY, tempdst.Index);
tempdst.WriteMask = RC_MASK_W;
tempsrc.Swizzle = RC_SWIZZLE_WWWW;
static void transform_SEQ(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, inst->U.I.SrcReg[0], negate(inst->U.I.SrcReg[1]));
emit3(c, inst->Prev, RC_OPCODE_CMP, &inst->U.I, inst->U.I.DstReg,
static void transform_SGE(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, inst->U.I.SrcReg[0], negate(inst->U.I.SrcReg[1]));
emit3(c, inst->Prev, RC_OPCODE_CMP, &inst->U.I, inst->U.I.DstReg,
static void transform_SGT(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, negate(inst->U.I.SrcReg[0]), inst->U.I.SrcReg[1]);
emit3(c, inst->Prev, RC_OPCODE_CMP, &inst->U.I, inst->U.I.DstReg,
static void transform_SLE(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, negate(inst->U.I.SrcReg[0]), inst->U.I.SrcReg[1]);
emit3(c, inst->Prev, RC_OPCODE_CMP, &inst->U.I, inst->U.I.DstReg,
static void transform_SLT(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, inst->U.I.SrcReg[0], negate(inst->U.I.SrcReg[1]));
emit3(c, inst->Prev, RC_OPCODE_CMP, &inst->U.I, inst->U.I.DstReg,
static void transform_SNE(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_ADD, NULL, dst, inst->U.I.SrcReg[0], negate(inst->U.I.SrcReg[1]));
emit3(c, inst->Prev, RC_OPCODE_CMP, &inst->U.I, inst->U.I.DstReg,
unsigned tmp1;
/* 0 < x */
- dst0 = try_to_reuse_dst(c, inst);
+ dst0 = new_dst_reg(c, inst);
emit3(c, inst->Prev, RC_OPCODE_CMP, NULL,
dst0,
negate(inst->U.I.SrcReg[0]),
* LRP dst, tmp0, src1, src2
*
* Yes, I know, I'm a mad scientist. ~ C. & M. */
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
/* SLT tmp0, src0, 0.0 */
emit2(c, inst->Prev, RC_OPCODE_SLT, NULL,
static void transform_r300_vertex_fix_LIT(struct radeon_compiler* c,
struct rc_instruction* inst)
{
- struct rc_dst_register dst = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst = new_dst_reg(c, inst);
unsigned constant_swizzle;
int constant = rc_constants_add_immediate_scalar(&c->Program.Constants,
0.0000000000000000001,
{
/* x = y <==> x >= y && y >= x */
/* x <= y */
- struct rc_dst_register dst0 = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst0 = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_SGE, NULL,
dst0,
inst->U.I.SrcReg[0],
{
/* x != y <==> x < y || y < x */
/* x < y */
- struct rc_dst_register dst0 = try_to_reuse_dst(c, inst);
+ struct rc_dst_register dst0 = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_SLT, NULL,
dst0,
inst->U.I.SrcReg[0],
unsigned tmp1;
/* 0 < x */
- dst0 = try_to_reuse_dst(c, inst);
+ dst0 = new_dst_reg(c, inst);
emit2(c, inst->Prev, RC_OPCODE_SLT, NULL,
dst0,
builtin_zero,