SetpXXPush
This commit is contained in:
parent
9030c87386
commit
2785a94fea
|
@ -778,6 +778,102 @@ void SpirvShaderTranslator::ProcessVectorAluInstruction(
|
||||||
sources[1]);
|
sources[1]);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case AluVectorOpcode::kSetpEqPush: {
|
||||||
|
auto c0 = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[0],
|
||||||
|
vec4_float_zero_);
|
||||||
|
auto c1 = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[1],
|
||||||
|
vec4_float_zero_);
|
||||||
|
auto c_and =
|
||||||
|
b.createBinOp(spv::Op::OpLogicalAnd, vec4_bool_type_, c0, c1);
|
||||||
|
auto c_and_x = b.createCompositeExtract(c_and, bool_type_, 0);
|
||||||
|
auto c_and_w = b.createCompositeExtract(c_and, bool_type_, 3);
|
||||||
|
|
||||||
|
// p0
|
||||||
|
b.createStore(c_and_w, p0_);
|
||||||
|
|
||||||
|
// dest
|
||||||
|
auto s0_x = b.createCompositeExtract(sources[0], float_type_, 0);
|
||||||
|
s0_x = b.createBinOp(spv::Op::OpFAdd, float_type_, s0_x,
|
||||||
|
b.makeFloatConstant(1.f));
|
||||||
|
auto s0 = b.smearScalar(spv::Decoration::DecorationInvariant, s0_x,
|
||||||
|
vec4_float_type_);
|
||||||
|
|
||||||
|
dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c_and_x,
|
||||||
|
vec4_float_zero_, s0);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case AluVectorOpcode::kSetpGePush: {
|
||||||
|
auto c0 = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[0],
|
||||||
|
vec4_float_zero_);
|
||||||
|
auto c1 = b.createBinOp(spv::Op::OpFOrdGreaterThanEqual, vec4_bool_type_,
|
||||||
|
sources[1], vec4_float_zero_);
|
||||||
|
auto c_and =
|
||||||
|
b.createBinOp(spv::Op::OpLogicalAnd, vec4_bool_type_, c0, c1);
|
||||||
|
auto c_and_x = b.createCompositeExtract(c_and, bool_type_, 0);
|
||||||
|
auto c_and_w = b.createCompositeExtract(c_and, bool_type_, 3);
|
||||||
|
|
||||||
|
// p0
|
||||||
|
b.createStore(c_and_w, p0_);
|
||||||
|
|
||||||
|
// dest
|
||||||
|
auto s0_x = b.createCompositeExtract(sources[0], float_type_, 0);
|
||||||
|
s0_x = b.createBinOp(spv::Op::OpFAdd, float_type_, s0_x,
|
||||||
|
b.makeFloatConstant(1.f));
|
||||||
|
auto s0 = b.smearScalar(spv::Decoration::DecorationInvariant, s0_x,
|
||||||
|
vec4_float_type_);
|
||||||
|
|
||||||
|
dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c_and_x,
|
||||||
|
vec4_float_zero_, s0);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case AluVectorOpcode::kSetpGtPush: {
|
||||||
|
auto c0 = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[0],
|
||||||
|
vec4_float_zero_);
|
||||||
|
auto c1 = b.createBinOp(spv::Op::OpFOrdGreaterThan, vec4_bool_type_,
|
||||||
|
sources[1], vec4_float_zero_);
|
||||||
|
auto c_and =
|
||||||
|
b.createBinOp(spv::Op::OpLogicalAnd, vec4_bool_type_, c0, c1);
|
||||||
|
auto c_and_x = b.createCompositeExtract(c_and, bool_type_, 0);
|
||||||
|
auto c_and_w = b.createCompositeExtract(c_and, bool_type_, 3);
|
||||||
|
|
||||||
|
// p0
|
||||||
|
b.createStore(c_and_w, p0_);
|
||||||
|
|
||||||
|
// dest
|
||||||
|
auto s0_x = b.createCompositeExtract(sources[0], float_type_, 0);
|
||||||
|
s0_x = b.createBinOp(spv::Op::OpFAdd, float_type_, s0_x,
|
||||||
|
b.makeFloatConstant(1.f));
|
||||||
|
auto s0 = b.smearScalar(spv::Decoration::DecorationInvariant, s0_x,
|
||||||
|
vec4_float_type_);
|
||||||
|
|
||||||
|
dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c_and_x,
|
||||||
|
vec4_float_zero_, s0);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case AluVectorOpcode::kSetpNePush: {
|
||||||
|
auto c0 = b.createBinOp(spv::Op::OpFOrdNotEqual, vec4_bool_type_,
|
||||||
|
sources[0], vec4_float_zero_);
|
||||||
|
auto c1 = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[1],
|
||||||
|
vec4_float_zero_);
|
||||||
|
auto c_and =
|
||||||
|
b.createBinOp(spv::Op::OpLogicalAnd, vec4_bool_type_, c0, c1);
|
||||||
|
auto c_and_x = b.createCompositeExtract(c_and, bool_type_, 0);
|
||||||
|
auto c_and_w = b.createCompositeExtract(c_and, bool_type_, 3);
|
||||||
|
|
||||||
|
// p0
|
||||||
|
b.createStore(c_and_w, p0_);
|
||||||
|
|
||||||
|
// dest
|
||||||
|
auto s0_x = b.createCompositeExtract(sources[0], float_type_, 0);
|
||||||
|
s0_x = b.createBinOp(spv::Op::OpFAdd, float_type_, s0_x,
|
||||||
|
b.makeFloatConstant(1.f));
|
||||||
|
auto s0 = b.smearScalar(spv::Decoration::DecorationInvariant, s0_x,
|
||||||
|
vec4_float_type_);
|
||||||
|
|
||||||
|
dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c_and_x,
|
||||||
|
vec4_float_zero_, s0);
|
||||||
|
} break;
|
||||||
|
|
||||||
case AluVectorOpcode::kSeq: {
|
case AluVectorOpcode::kSeq: {
|
||||||
// foreach(el) src0 == src1 ? 1.0 : 0.0
|
// foreach(el) src0 == src1 ? 1.0 : 0.0
|
||||||
auto c = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[0],
|
auto c = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[0],
|
||||||
|
|
Loading…
Reference in New Issue