|
|
|
@ -293,52 +293,52 @@ u32 ShaderIR::DecodeArithmeticInteger(NodeBlock& bb, u32 pc) {
|
|
|
|
|
|
|
|
|
|
void ShaderIR::WriteLop3Instruction(NodeBlock& bb, Register dest, Node op_a, Node op_b, Node op_c,
|
|
|
|
|
Node imm_lut, bool sets_cc) {
|
|
|
|
|
const Node lop3_fast = [&](Node na, Node nb, Node nc, Node ttbl) {
|
|
|
|
|
const Node lop3_fast = [&](const Node na, const Node nb, const Node nc, const Node ttbl) {
|
|
|
|
|
Node value = Immediate(0);
|
|
|
|
|
ImmediateNode imm = std::get<ImmediateNode>(*ttbl);
|
|
|
|
|
const ImmediateNode imm = std::get<ImmediateNode>(*ttbl);
|
|
|
|
|
if (imm.GetValue() & 0x01) {
|
|
|
|
|
Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
const Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
const Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
const Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, a, b);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, c);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|
}
|
|
|
|
|
if (imm.GetValue() & 0x02) {
|
|
|
|
|
Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
const Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
const Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, a, b);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, nc);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|
}
|
|
|
|
|
if (imm.GetValue() & 0x04) {
|
|
|
|
|
Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
const Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
const Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, a, nb);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, c);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|
}
|
|
|
|
|
if (imm.GetValue() & 0x08) {
|
|
|
|
|
Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
const Node a = Operation(OperationCode::IBitwiseNot, na);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, a, nb);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, nc);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|
}
|
|
|
|
|
if (imm.GetValue() & 0x10) {
|
|
|
|
|
Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
const Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
const Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, na, b);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, c);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|
}
|
|
|
|
|
if (imm.GetValue() & 0x20) {
|
|
|
|
|
Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
const Node b = Operation(OperationCode::IBitwiseNot, nb);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, na, b);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, nc);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|
}
|
|
|
|
|
if (imm.GetValue() & 0x40) {
|
|
|
|
|
Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
const Node c = Operation(OperationCode::IBitwiseNot, nc);
|
|
|
|
|
Node r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, na, nb);
|
|
|
|
|
r = Operation(OperationCode::IBitwiseAnd, NO_PRECISE, r, c);
|
|
|
|
|
value = Operation(OperationCode::IBitwiseOr, value, r);
|
|
|
|
|