value_factory.src64(alu.src[0], i, swz[0]),
{alu_write});
group->add_instruction(ir);
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
ir = new AluInstr(opcode,
value_factory.dest(alu.dest, 2 * i + 1, pin_chan),
{alu_write});
shader.emit_instruction(ir);
}
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
}
if (ir)
ir->set_alu_flag(alu_last_instr);
value_factory.src64(alu.src[order[0]], k, 1),
value_factory.src64(alu.src[order[1]], k, 1),
i < 2 ? AluInstr::write : AluInstr::empty);
-
- if (alu.src[0].abs)
- ir->set_alu_flag(switch_src ? alu_src1_abs : alu_src0_abs);
- if (alu.src[1].abs)
- ir->set_alu_flag(switch_src ? alu_src0_abs : alu_src1_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(switch_src ? alu_src1_neg : alu_src0_neg);
- if (alu.src[1].negate)
- ir->set_alu_flag(switch_src ? alu_src0_neg : alu_src1_neg);
- if (alu.dest.saturate && i == 0) {
- ir->set_alu_flag(alu_dst_clamp);
- }
-
group->add_instruction(ir);
}
src[3] = value_factory.src64(alu.src[order[1]], k, 0);
ir = new AluInstr(opcode, dest, src, AluInstr::write, 2);
-
- if (alu.src[0].abs)
- ir->set_alu_flag(switch_order ? alu_src1_abs : alu_src0_abs);
- if (alu.src[1].abs)
- ir->set_alu_flag(switch_order ? alu_src0_abs : alu_src1_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(switch_order ? alu_src1_neg : alu_src0_neg);
- if (alu.src[1].negate)
- ir->set_alu_flag(switch_order ? alu_src0_neg : alu_src1_neg);
ir->set_alu_flag(alu_64bit_op);
shader.emit_instruction(ir);
value_factory.src64(alu.src[0], 0, 0),
i < 2 ? AluInstr::write : AluInstr::empty);
- if (alu.src[0].abs || opcode == op1_sqrt_64)
- ir->set_alu_flag(alu_src1_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src1_neg);
-
group->add_instruction(ir);
}
if (ir)
value_factory.src64(alu.src[1], 0, chan),
value_factory.src64(alu.src[2], 0, chan),
i < 2 ? AluInstr::write : AluInstr::empty);
-
- if (i < 3) {
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
- if (alu.src[1].negate)
- ir->set_alu_flag(alu_src1_neg);
- if (alu.src[2].negate)
- ir->set_alu_flag(alu_src2_neg);
- }
-
group->add_instruction(ir);
}
if (ir)
src,
value_factory.inline_const(mask, 0),
{alu_write});
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
shader.emit_instruction(ir);
}
}
value_factory.dest(alu.dest, i, pin),
value_factory.src(alu.src[0], i),
{alu_write});
-
- if (flags.test(alu_src0_abs) || alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
-
- if (alu.src[0].negate ^ flags.test(alu_src0_neg))
- ir->set_alu_flag(alu_src0_neg);
-
if (flags.test(alu_dst_clamp) || alu.dest.saturate)
ir->set_alu_flag(alu_dst_clamp);
std::swap(idx0, idx1);
}
- bool src1_negate = (opts & AluInstr::op2_opt_neg_src1) ^ src1->negate;
+ bool src1_negate = (opts & AluInstr::op2_opt_neg_src1);
auto pin = pin_for_components(alu);
AluInstr *ir = nullptr;
value_factory.src(*src0, i),
value_factory.src(*src1, i),
{alu_write});
-
- if (src0->negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0->abs)
- ir->set_alu_flag(alu_src0_abs);
if (src1_negate)
ir->set_alu_flag(alu_src1_neg);
- if (src1->abs)
- ir->set_alu_flag(alu_src1_abs);
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
shader.emit_instruction(ir);
}
}
Shader& shader,
AluInstr::Op2Options opts)
{
- assert(!alu.src[0].abs);
- assert(!alu.src[0].negate);
- assert(!alu.src[1].abs);
- assert(!alu.src[1].negate);
-
return emit_alu_op2(alu, opcode, shader, opts);
}
value_factory.src(*src[1], i),
value_factory.src(*src[2], i),
{alu_write});
-
- if (src[0]->negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src[1]->negate)
- ir->set_alu_flag(alu_src1_neg);
- if (src[2]->negate)
- ir->set_alu_flag(alu_src2_neg);
-
- assert(!src[0]->abs);
- assert(!src[1]->abs);
- assert(!src[2]->abs);
-
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
ir->set_alu_flag(alu_write);
shader.emit_instruction(ir);
}
value_factory.src(alu.src[0], i),
value_factory.src(alu.src[1], i),
{alu_write});
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
-
- if (alu.src[1].abs)
- ir->set_alu_flag(alu_src1_abs);
- if (alu.src[1].negate)
- ir->set_alu_flag(alu_src1_neg);
-
shader.emit_instruction(ir);
}
ir->set_alu_flag(alu_last_instr);
value_factory.src(alu.src[0], i),
value_factory.src(alu.src[1], i),
{alu_write});
-
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
-
- if (alu.src[1].abs)
- ir->set_alu_flag(alu_src1_abs);
- if (alu.src[1].negate)
- ir->set_alu_flag(alu_src1_neg);
-
shader.emit_instruction(ir);
}
if (ir)
AluInstr *ir = new AluInstr(op2_dot_ieee, dest, srcs, AluInstr::last_write, n);
- if (src0.negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0.abs)
- ir->set_alu_flag(alu_src0_abs);
- if (src1.negate)
- ir->set_alu_flag(alu_src1_neg);
- if (src1.abs)
- ir->set_alu_flag(alu_src1_abs);
-
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
-
shader.emit_instruction(ir);
shader.set_flag(Shader::sh_disble_sb);
AluInstr *ir = new AluInstr(op2_dot4_ieee, dest, srcs, AluInstr::last_write, 4);
- if (src0.negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0.abs)
- ir->set_alu_flag(alu_src0_abs);
- if (src1.negate)
- ir->set_alu_flag(alu_src1_neg);
- if (src1.abs)
- ir->set_alu_flag(alu_src1_abs);
-
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
-
shader.emit_instruction(ir);
return true;
}
srcs[7] = value_factory.src(src1, 3);
AluInstr *ir = new AluInstr(op2_dot4_ieee, dest, srcs, AluInstr::last_write, 4);
-
- if (src0.negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0.abs)
- ir->set_alu_flag(alu_src0_abs);
- if (src1.negate)
- ir->set_alu_flag(alu_src1_neg);
- if (src1.abs)
- ir->set_alu_flag(alu_src1_abs);
-
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
-
shader.emit_instruction(ir);
return true;
}
if (instr.dest.write_mask & (1 << i)) {
auto src = value_factory.src(instr.src[i].src, instr.src[i].swizzle[0]);
auto dst = value_factory.dest(instr.dest.dest, i, pin_none);
- ir = new AluInstr(op1_mov, dst, src, {alu_write});
-
- if (instr.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
- if (instr.src[i].negate)
- ir->set_alu_flag(alu_src0_neg);
- if (instr.src[i].abs)
- ir->set_alu_flag(alu_src0_abs);
-
- shader.emit_instruction(ir);
+ shader.emit_instruction(new AluInstr(op1_mov, dst, src, {alu_write}));
}
}
value_factory.dest(alu.dest.dest, i, pin),
value_factory.src(src0, i),
AluInstr::last_write);
- if (src0.negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0.abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
ir->set_alu_flag(alu_is_trans);
shader.emit_instruction(ir);
}
reg[i],
value_factory.src(alu.src[0], i),
AluInstr::last_write);
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
shader.emit_instruction(ir);
}
srcs[i] = value_factory.src(src0, j);
auto ir = new AluInstr(opcode, dest, srcs, flags, ncomp);
-
- if (alu.src[0].abs)
- ir->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- ir->set_alu_flag(alu_src0_neg);
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
-
shader.emit_instruction(ir);
}
}
value_factory.src(src0, i),
value_factory.src(src1, i),
AluInstr::last_write);
- if (src0.negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0.abs)
- ir->set_alu_flag(alu_src0_abs);
- if (src1.negate)
- ir->set_alu_flag(alu_src1_neg);
- if (src1.abs)
- ir->set_alu_flag(alu_src1_abs);
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
ir->set_alu_flag(alu_is_trans);
shader.emit_instruction(ir);
}
}
auto ir = new AluInstr(opcode, dest, srcs, flags, last_slot);
-
- if (src0.negate)
- ir->set_alu_flag(alu_src0_neg);
- if (src0.abs)
- ir->set_alu_flag(alu_src0_abs);
- if (src1.negate)
- ir->set_alu_flag(alu_src1_neg);
- if (src1.abs)
- ir->set_alu_flag(alu_src1_abs);
- if (alu.dest.saturate)
- ir->set_alu_flag(alu_dst_clamp);
ir->set_alu_flag(alu_is_cayman_trans);
shader.emit_instruction(ir);
}
AluInstr *mv = nullptr;
for (int i = 0; i < ncomp; ++i) {
mv = new AluInstr(op1_mov, tmp[i], src[i], AluInstr::write);
- if (alu.src[0].abs)
- mv->set_alu_flag(alu_src0_abs);
- if (alu.src[0].negate)
- mv->set_alu_flag(alu_src0_neg);
shader.emit_instruction(mv);
}
if (mv)