// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "SpirvShader.hpp"

#include <spirv/unified1/spirv.hpp>

namespace sw {

// Template function to perform a binary group operation.
// |TYPE| should be the type of the binary operation (as a SIMD::<ScalarType>).
// |I| should be a type suitable to initialize the identity value.
// |APPLY| should be a callable object that takes two RValue<TYPE> parameters
// and returns a new RValue<TYPE> corresponding to the operation's result.
template<typename TYPE, typename I, typename APPLY>
static RValue<TYPE> BinaryOperation(
    spv::GroupOperation operation,
    RValue<SIMD::UInt> value,
    RValue<SIMD::UInt> mask,
    const I identityValue,
    APPLY &&apply)
{
	auto identity = TYPE(identityValue);
	SIMD::UInt v_uint = (value & mask) | (As<SIMD::UInt>(identity) & ~mask);
	TYPE v = As<TYPE>(v_uint);

	switch(operation)
	{
	case spv::GroupOperationReduce:
		{
			// NOTE: floating-point add and multiply are not really commutative so
			//       ensure that all values in the final lanes are identical
			TYPE v2 = apply(v.xxzz, v.yyww);  // [xy]   [xy]   [zw]   [zw]
			return apply(v2.xxxx, v2.zzzz);   // [xyzw] [xyzw] [xyzw] [xyzw]
		}
		break;
	case spv::GroupOperationInclusiveScan:
		{
			TYPE v2 = apply(v, Shuffle(v, identity, 0x4012) /* [id, v.y, v.z, v.w] */);   // [x] [xy] [yz]  [zw]
			return apply(v2, Shuffle(v2, identity, 0x4401) /* [id,  id, v2.x, v2.y] */);  // [x] [xy] [xyz] [xyzw]
		}
		break;
	case spv::GroupOperationExclusiveScan:
		{
			TYPE v2 = apply(v, Shuffle(v, identity, 0x4012) /* [id, v.y, v.z, v.w] */);      // [x] [xy] [yz]  [zw]
			TYPE v3 = apply(v2, Shuffle(v2, identity, 0x4401) /* [id,  id, v2.x, v2.y] */);  // [x] [xy] [xyz] [xyzw]
			return Shuffle(v3, identity, 0x4012 /* [id, v3.x, v3.y, v3.z] */);               // [i] [x]  [xy]  [xyz]
		}
		break;
	default:
		UNSUPPORTED("Group operation: %d", operation);
		return identity;
	}
}

SpirvShader::EmitResult SpirvShader::EmitState::EmitGroupNonUniform(InsnIterator insn)
{
	ASSERT(SIMD::Width == 4);  // EmitGroupNonUniform makes many assumptions that the SIMD vector width is 4

	auto &type = shader.getType(Type::ID(insn.word(1)));
	Object::ID resultId = insn.word(2);
	auto scope = spv::Scope(shader.GetConstScalarInt(insn.word(3)));
	ASSERT_MSG(scope == spv::ScopeSubgroup, "Scope for Non Uniform Group Operations must be Subgroup for Vulkan 1.1");

	auto &dst = createIntermediate(resultId, type.componentCount);

	switch(insn.opcode())
	{
	case spv::OpGroupNonUniformElect:
		{
			// Result is true only in the active invocation with the lowest id
			// in the group, otherwise result is false.
			SIMD::Int active = activeLaneMask();  // Considers helper invocations active. See b/151137030
			// TODO: Would be nice if we could write this as:
			//   elect = active & ~(active.Oxyz | active.OOxy | active.OOOx)
			auto v0111 = SIMD::Int(0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
			auto elect = active & ~(v0111 & (active.xxyz | active.xxxy | active.xxxx));
			dst.move(0, elect);
		}
		break;

	case spv::OpGroupNonUniformAll:
		{
			Operand predicate(shader, *this, insn.word(4));
			dst.move(0, AndAll(predicate.UInt(0) | ~As<SIMD::UInt>(activeLaneMask())));  // Considers helper invocations active. See b/151137030
		}
		break;

	case spv::OpGroupNonUniformAny:
		{
			Operand predicate(shader, *this, insn.word(4));
			dst.move(0, OrAll(predicate.UInt(0) & As<SIMD::UInt>(activeLaneMask())));  // Considers helper invocations active. See b/151137030
		}
		break;

	case spv::OpGroupNonUniformAllEqual:
		{
			Operand value(shader, *this, insn.word(4));
			auto res = SIMD::UInt(0xffffffff);
			SIMD::UInt active = As<SIMD::UInt>(activeLaneMask());  // Considers helper invocations active. See b/151137030
			SIMD::UInt inactive = ~active;
			for(auto i = 0u; i < type.componentCount; i++)
			{
				SIMD::UInt v = value.UInt(i) & active;
				SIMD::UInt filled = v;
				for(int j = 0; j < SIMD::Width - 1; j++)
				{
					filled |= filled.yzwx & inactive;  // Populate inactive 'holes' with a live value
				}
				res &= AndAll(CmpEQ(filled.xyzw, filled.yzwx));
			}
			dst.move(0, res);
		}
		break;

	case spv::OpGroupNonUniformBroadcast:
		{
			auto valueId = Object::ID(insn.word(4));
			auto idId = Object::ID(insn.word(5));
			Operand value(shader, *this, valueId);

			// Decide between the fast path for constants and the slow path for
			// intermediates.
			if(shader.getObject(idId).kind == SpirvShader::Object::Kind::Constant)
			{
				auto id = SIMD::Int(shader.GetConstScalarInt(insn.word(5)));
				auto mask = CmpEQ(id, SIMD::Int(0, 1, 2, 3));
				for(auto i = 0u; i < type.componentCount; i++)
				{
					dst.move(i, OrAll(value.Int(i) & mask));
				}
			}
			else
			{
				Operand id(shader, *this, idId);

				SIMD::UInt active = As<SIMD::UInt>(activeLaneMask());  // Considers helper invocations active. See b/151137030
				SIMD::UInt inactive = ~active;
				SIMD::UInt filled = id.UInt(0) & active;

				for(int j = 0; j < SIMD::Width - 1; j++)
				{
					filled |= filled.yzwx & inactive;  // Populate inactive 'holes' with a live value
				}

				auto mask = CmpEQ(filled, SIMD::UInt(0, 1, 2, 3));

				for(uint32_t i = 0u; i < type.componentCount; i++)
				{
					dst.move(i, OrAll(value.UInt(i) & mask));
				}
			}
		}
		break;

	case spv::OpGroupNonUniformBroadcastFirst:
		{
			auto valueId = Object::ID(insn.word(4));
			Operand value(shader, *this, valueId);
			// Result is true only in the active invocation with the lowest id
			// in the group, otherwise result is false.
			SIMD::Int active = activeLaneMask();  // Considers helper invocations active. See b/151137030
			// TODO: Would be nice if we could write this as:
			//   elect = active & ~(active.Oxyz | active.OOxy | active.OOOx)
			auto v0111 = SIMD::Int(0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
			auto elect = active & ~(v0111 & (active.xxyz | active.xxxy | active.xxxx));
			for(auto i = 0u; i < type.componentCount; i++)
			{
				dst.move(i, OrAll(value.Int(i) & elect));
			}
		}
		break;

	case spv::OpGroupNonUniformQuadBroadcast:
		{
			auto valueId = Object::ID(insn.word(4));
			Operand value(shader, *this, valueId);

			ASSERT(shader.getType(shader.getObject(insn.word(5))).componentCount == 1);
			auto indexId = Object::ID(insn.word(5));
			SIMD::Int index = Operand(shader, *this, indexId).Int(0);

			SIMD::Int active = activeLaneMask();
			// Populate all lanes in index with the same value. Index is required to be
			// uniform per the SPIR-V spec, so all active lanes should be identical.
			index = OrAll(active & index);
			SIMD::Int mask = CmpEQ(index, SIMD::Int(0, 1, 2, 3));

			for(auto i = 0u; i < type.componentCount; i++)
			{
				dst.move(i, OrAll(value.Int(i) & mask));
			}
		}
		break;

	case spv::OpGroupNonUniformQuadSwap:
		{
			auto valueId = Object::ID(insn.word(4));
			// SPIR-V spec: Drection must be a scalar of integer type and come from a constant instruction
			int direction = shader.GetConstScalarInt(insn.word(5));

			Operand value(shader, *this, valueId);
			for(auto i = 0u; i < type.componentCount; i++)
			{
				SIMD::Int v = value.Int(i);
				switch(direction)
				{
				case 0:  // Horizontal
					dst.move(i, v.yxwz);
					break;
				case 1:  // Vertical
					dst.move(i, v.zwxy);
					break;
				case 2:  // Diagonal
					dst.move(i, v.wzyx);
					break;
				default:
					// The SPIR-V spec doesn't define what happens in this case,
					// so the result in undefined.
					UNSUPPORTED("SPIR-V does not define a OpGroupNonUniformQuadSwap result for a direction of %d", direction);
					break;
				}
			}
		}
		break;

	case spv::OpGroupNonUniformBallot:
		{
			ASSERT(type.componentCount == 4);
			Operand predicate(shader, *this, insn.word(4));
			dst.move(0, SIMD::Int(SignMask(activeLaneMask() & predicate.Int(0))));  // Considers helper invocations active. See b/151137030
			dst.move(1, SIMD::Int(0));
			dst.move(2, SIMD::Int(0));
			dst.move(3, SIMD::Int(0));
		}
		break;

	case spv::OpGroupNonUniformInverseBallot:
		{
			auto valueId = Object::ID(insn.word(4));
			ASSERT(type.componentCount == 1);
			ASSERT(shader.getObjectType(valueId).componentCount == 4);
			Operand value(shader, *this, valueId);
			auto bit = (value.Int(0) >> SIMD::Int(0, 1, 2, 3)) & SIMD::Int(1);
			dst.move(0, -bit);
		}
		break;

	case spv::OpGroupNonUniformBallotBitExtract:
		{
			auto valueId = Object::ID(insn.word(4));
			auto indexId = Object::ID(insn.word(5));
			ASSERT(type.componentCount == 1);
			ASSERT(shader.getObjectType(valueId).componentCount == 4);
			ASSERT(shader.getObjectType(indexId).componentCount == 1);
			Operand value(shader, *this, valueId);
			Operand index(shader, *this, indexId);
			auto vecIdx = index.Int(0) / SIMD::Int(32);
			auto bitIdx = index.Int(0) & SIMD::Int(31);
			auto bits = (value.Int(0) & CmpEQ(vecIdx, SIMD::Int(0))) |
			            (value.Int(1) & CmpEQ(vecIdx, SIMD::Int(1))) |
			            (value.Int(2) & CmpEQ(vecIdx, SIMD::Int(2))) |
			            (value.Int(3) & CmpEQ(vecIdx, SIMD::Int(3)));
			dst.move(0, -((bits >> bitIdx) & SIMD::Int(1)));
		}
		break;

	case spv::OpGroupNonUniformBallotBitCount:
		{
			auto operation = spv::GroupOperation(insn.word(4));
			auto valueId = Object::ID(insn.word(5));
			ASSERT(type.componentCount == 1);
			ASSERT(shader.getObjectType(valueId).componentCount == 4);
			Operand value(shader, *this, valueId);
			switch(operation)
			{
			case spv::GroupOperationReduce:
				dst.move(0, CountBits(value.UInt(0) & SIMD::UInt(15)));
				break;
			case spv::GroupOperationInclusiveScan:
				dst.move(0, CountBits(value.UInt(0) & SIMD::UInt(1, 3, 7, 15)));
				break;
			case spv::GroupOperationExclusiveScan:
				dst.move(0, CountBits(value.UInt(0) & SIMD::UInt(0, 1, 3, 7)));
				break;
			default:
				UNSUPPORTED("GroupOperation %d", int(operation));
			}
		}
		break;

	case spv::OpGroupNonUniformBallotFindLSB:
		{
			auto valueId = Object::ID(insn.word(4));
			ASSERT(type.componentCount == 1);
			ASSERT(shader.getObjectType(valueId).componentCount == 4);
			Operand value(shader, *this, valueId);
			dst.move(0, Cttz(value.UInt(0) & SIMD::UInt(15), true));
		}
		break;

	case spv::OpGroupNonUniformBallotFindMSB:
		{
			auto valueId = Object::ID(insn.word(4));
			ASSERT(type.componentCount == 1);
			ASSERT(shader.getObjectType(valueId).componentCount == 4);
			Operand value(shader, *this, valueId);
			dst.move(0, SIMD::UInt(31) - Ctlz(value.UInt(0) & SIMD::UInt(15), false));
		}
		break;

	case spv::OpGroupNonUniformShuffle:
		{
			Operand value(shader, *this, insn.word(4));
			Operand id(shader, *this, insn.word(5));
			auto x = CmpEQ(SIMD::Int(0), id.Int(0));
			auto y = CmpEQ(SIMD::Int(1), id.Int(0));
			auto z = CmpEQ(SIMD::Int(2), id.Int(0));
			auto w = CmpEQ(SIMD::Int(3), id.Int(0));
			for(auto i = 0u; i < type.componentCount; i++)
			{
				SIMD::Int v = value.Int(i);
				dst.move(i, (x & v.xxxx) | (y & v.yyyy) | (z & v.zzzz) | (w & v.wwww));
			}
		}
		break;

	case spv::OpGroupNonUniformShuffleXor:
		{
			Operand value(shader, *this, insn.word(4));
			Operand mask(shader, *this, insn.word(5));
			auto x = CmpEQ(SIMD::Int(0), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
			auto y = CmpEQ(SIMD::Int(1), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
			auto z = CmpEQ(SIMD::Int(2), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
			auto w = CmpEQ(SIMD::Int(3), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
			for(auto i = 0u; i < type.componentCount; i++)
			{
				SIMD::Int v = value.Int(i);
				dst.move(i, (x & v.xxxx) | (y & v.yyyy) | (z & v.zzzz) | (w & v.wwww));
			}
		}
		break;

	case spv::OpGroupNonUniformShuffleUp:
		{
			Operand value(shader, *this, insn.word(4));
			Operand delta(shader, *this, insn.word(5));
			auto d0 = CmpEQ(SIMD::Int(0), delta.Int(0));
			auto d1 = CmpEQ(SIMD::Int(1), delta.Int(0));
			auto d2 = CmpEQ(SIMD::Int(2), delta.Int(0));
			auto d3 = CmpEQ(SIMD::Int(3), delta.Int(0));
			for(auto i = 0u; i < type.componentCount; i++)
			{
				SIMD::Int v = value.Int(i);
				dst.move(i, (d0 & v.xyzw) | (d1 & v.xxyz) | (d2 & v.xxxy) | (d3 & v.xxxx));
			}
		}
		break;

	case spv::OpGroupNonUniformShuffleDown:
		{
			Operand value(shader, *this, insn.word(4));
			Operand delta(shader, *this, insn.word(5));
			auto d0 = CmpEQ(SIMD::Int(0), delta.Int(0));
			auto d1 = CmpEQ(SIMD::Int(1), delta.Int(0));
			auto d2 = CmpEQ(SIMD::Int(2), delta.Int(0));
			auto d3 = CmpEQ(SIMD::Int(3), delta.Int(0));
			for(auto i = 0u; i < type.componentCount; i++)
			{
				SIMD::Int v = value.Int(i);
				dst.move(i, (d0 & v.xyzw) | (d1 & v.yzww) | (d2 & v.zwww) | (d3 & v.wwww));
			}
		}
		break;

	// The remaining instructions are GroupNonUniformArithmetic operations
	default:
		auto &type = shader.getType(SpirvShader::Type::ID(insn.word(1)));
		auto operation = static_cast<spv::GroupOperation>(insn.word(4));
		SpirvShader::Operand value(shader, *this, insn.word(5));
		auto mask = As<SIMD::UInt>(activeLaneMask());  // Considers helper invocations active. See b/151137030

		for(uint32_t i = 0; i < type.componentCount; i++)
		{
			switch(insn.opcode())
			{
			case spv::OpGroupNonUniformIAdd:
				dst.move(i, BinaryOperation<SIMD::Int>(
				                operation, value.UInt(i), mask, 0,
				                [](auto a, auto b) { return a + b; }));
				break;
			case spv::OpGroupNonUniformFAdd:
				dst.move(i, BinaryOperation<SIMD::Float>(
				                operation, value.UInt(i), mask, 0.0f,
				                [](auto a, auto b) { return a + b; }));
				break;

			case spv::OpGroupNonUniformIMul:
				dst.move(i, BinaryOperation<SIMD::Int>(
				                operation, value.UInt(i), mask, 1,
				                [](auto a, auto b) { return a * b; }));
				break;

			case spv::OpGroupNonUniformFMul:
				dst.move(i, BinaryOperation<SIMD::Float>(
				                operation, value.UInt(i), mask, 1.0f,
				                [](auto a, auto b) { return a * b; }));
				break;

			case spv::OpGroupNonUniformBitwiseAnd:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, ~0u,
				                [](auto a, auto b) { return a & b; }));
				break;

			case spv::OpGroupNonUniformBitwiseOr:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, 0,
				                [](auto a, auto b) { return a | b; }));
				break;

			case spv::OpGroupNonUniformBitwiseXor:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, 0,
				                [](auto a, auto b) { return a ^ b; }));
				break;

			case spv::OpGroupNonUniformSMin:
				dst.move(i, BinaryOperation<SIMD::Int>(
				                operation, value.UInt(i), mask, INT32_MAX,
				                [](auto a, auto b) { return Min(a, b); }));
				break;

			case spv::OpGroupNonUniformUMin:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, ~0u,
				                [](auto a, auto b) { return Min(a, b); }));
				break;

			case spv::OpGroupNonUniformFMin:
				dst.move(i, BinaryOperation<SIMD::Float>(
				                operation, value.UInt(i), mask, SIMD::Float::infinity(),
				                [](auto a, auto b) { return NMin(a, b); }));
				break;

			case spv::OpGroupNonUniformSMax:
				dst.move(i, BinaryOperation<SIMD::Int>(
				                operation, value.UInt(i), mask, INT32_MIN,
				                [](auto a, auto b) { return Max(a, b); }));
				break;

			case spv::OpGroupNonUniformUMax:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, 0,
				                [](auto a, auto b) { return Max(a, b); }));
				break;

			case spv::OpGroupNonUniformFMax:
				dst.move(i, BinaryOperation<SIMD::Float>(
				                operation, value.UInt(i), mask, -SIMD::Float::infinity(),
				                [](auto a, auto b) { return NMax(a, b); }));
				break;

			case spv::OpGroupNonUniformLogicalAnd:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, ~0u,
				                [](auto a, auto b) {
					                SIMD::UInt zero = SIMD::UInt(0);
					                return CmpNEQ(a, zero) & CmpNEQ(b, zero);
				                }));
				break;

			case spv::OpGroupNonUniformLogicalOr:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, 0,
				                [](auto a, auto b) {
					                SIMD::UInt zero = SIMD::UInt(0);
					                return CmpNEQ(a, zero) | CmpNEQ(b, zero);
				                }));
				break;

			case spv::OpGroupNonUniformLogicalXor:
				dst.move(i, BinaryOperation<SIMD::UInt>(
				                operation, value.UInt(i), mask, 0,
				                [](auto a, auto b) {
					                SIMD::UInt zero = SIMD::UInt(0);
					                return CmpNEQ(a, zero) ^ CmpNEQ(b, zero);
				                }));
				break;

			default:
				UNSUPPORTED("EmitGroupNonUniform op: %s", OpcodeName(type.opcode()));
			}
		}
		break;
	}
	return EmitResult::Continue;
}

}  // namespace sw
