// Copyright 2016 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 "Coroutine.hpp"
#include "Reactor.hpp"

#include "gtest/gtest.h"

#include <cmath>
#include <tuple>

using namespace rr;

constexpr float PI = 3.141592653589793f;

using float4 = float[4];

// Value type wrapper around a float4
struct float4_value
{
	float4_value() = default;
	explicit float4_value(float rep)
	    : v{ rep, rep, rep, rep }
	{}
	float4_value(float x, float y, float z, float w)
	    : v{ x, y, z, w }
	{}

	bool operator==(const float4_value &rhs) const
	{
		return std::equal(std::begin(v), std::end(v), rhs.v);
	}

	// For gtest printing
	friend std::ostream &operator<<(std::ostream &os, const float4_value &value)
	{
		return os << "[" << value.v[0] << ", " << value.v[1] << ", " << value.v[2] << ", " << value.v[3] << "]";
	}

	float4 v;
};

// For gtest printing of pairs
namespace std {
template<typename T, typename U>
std::ostream &operator<<(std::ostream &os, const std::pair<T, U> &value)
{
	return os << "{ " << value.first << ", " << value.second << " }";
}
}  // namespace std

// Invoke a void(float4*) routine on &v.v, returning wrapped result in v
template<typename RoutineType>
float4_value invokeRoutine(RoutineType &routine, float4_value v)
{
	routine(&v.v);
	return v;
}

// Invoke a void(float4*, float4*) routine on &v1.v, &v2.v returning wrapped result in v1
template<typename RoutineType>
float4_value invokeRoutine(RoutineType &routine, float4_value v1, float4_value v2)
{
	routine(&v1.v, &v2.v);
	return v1;
}

int reference(int *p, int y)
{
	int x = p[-1];
	int z = 4;

	for(int i = 0; i < 10; i++)
	{
		z += (2 << i) - (i / 3);
	}

	int sum = x + y + z;

	return sum;
}

TEST(ReactorUnitTests, Sample)
{
	FunctionT<int(int *, int)> function;
	{
		Pointer<Int> p = function.Arg<0>();
		Int x = p[-1];
		Int y = function.Arg<1>();
		Int z = 4;

		For(Int i = 0, i < 10, i++)
		{
			z += (2 << i) - (i / 3);
		}

		Float4 v;
		v.z = As<Float>(z);
		z = As<Int>(Float(Float4(v.xzxx).y));

		Int sum = x + y + z;

		Return(sum);
	}

	auto routine = function("one");

	if(routine)
	{
		int one[2] = { 1, 0 };
		int result = routine(&one[1], 2);
		EXPECT_EQ(result, reference(&one[1], 2));
	}
}

TEST(ReactorUnitTests, Uninitialized)
{
	FunctionT<int()> function;
	{
		Int a;
		Int z = 4;
		Int q;
		Int c;
		Int p;
		Bool b;

		q += q;

		If(b)
		{
			c = p;
		}

		Return(a + z + q + c);
	}

	auto routine = function("one");

	if(routine)
	{
		int result = routine();
		EXPECT_EQ(result, result);  // Anything is fine, just don't crash
	}
}

TEST(ReactorUnitTests, Unreachable)
{
	FunctionT<int(int)> function;
	{
		Int a = function.Arg<0>();
		Int z = 4;

		Return(a + z);

		// Code beyond this point is unreachable but should not cause any
		// compilation issues.

		z += a;
	}

	auto routine = function("one");

	if(routine)
	{
		int result = routine(16);
		EXPECT_EQ(result, 20);
	}
}

TEST(ReactorUnitTests, VariableAddress)
{
	FunctionT<int(int)> function;
	{
		Int a = function.Arg<0>();
		Int z = 0;
		Pointer<Int> p = &z;
		*p = 4;

		Return(a + z);
	}

	auto routine = function("one");

	if(routine)
	{
		int result = routine(16);
		EXPECT_EQ(result, 20);
	}
}

TEST(ReactorUnitTests, SubVectorLoadStore)
{
	FunctionT<int(void *, void *)> function;
	{
		Pointer<Byte> in = function.Arg<0>();
		Pointer<Byte> out = function.Arg<1>();

		*Pointer<Int4>(out + 16 * 0) = *Pointer<Int4>(in + 16 * 0);
		*Pointer<Short4>(out + 16 * 1) = *Pointer<Short4>(in + 16 * 1);
		*Pointer<Byte8>(out + 16 * 2) = *Pointer<Byte8>(in + 16 * 2);
		*Pointer<Byte4>(out + 16 * 3) = *Pointer<Byte4>(in + 16 * 3);
		*Pointer<Short2>(out + 16 * 4) = *Pointer<Short2>(in + 16 * 4);

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		int8_t in[16 * 5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
			                  17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0,
			                  25, 26, 27, 28, 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0,
			                  33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
			                  37, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

		int8_t out[16 * 5] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };

		routine(in, out);

		for(int row = 0; row < 5; row++)
		{
			for(int col = 0; col < 16; col++)
			{
				int i = row * 16 + col;

				if(in[i] == 0)
				{
					EXPECT_EQ(out[i], -1) << "Row " << row << " column " << col << " not left untouched.";
				}
				else
				{
					EXPECT_EQ(out[i], in[i]) << "Row " << row << " column " << col << " not equal to input.";
				}
			}
		}
	}
}

TEST(ReactorUnitTests, VectorConstant)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Int4>(out + 16 * 0) = Int4(0x04030201, 0x08070605, 0x0C0B0A09, 0x100F0E0D);
		*Pointer<Short4>(out + 16 * 1) = Short4(0x1211, 0x1413, 0x1615, 0x1817);
		*Pointer<Byte8>(out + 16 * 2) = Byte8(0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20);
		*Pointer<Int2>(out + 16 * 3) = Int2(0x24232221, 0x28272625);

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		int8_t out[16 * 4] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };

		int8_t exp[16 * 4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
			                   17, 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, -1,
			                   25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1,
			                   33, 34, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, -1, -1, -1 };

		routine(out);

		for(int row = 0; row < 4; row++)
		{
			for(int col = 0; col < 16; col++)
			{
				int i = row * 16 + col;

				EXPECT_EQ(out[i], exp[i]);
			}
		}
	}
}

TEST(ReactorUnitTests, Concatenate)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Int4>(out + 16 * 0) = Int4(Int2(0x04030201, 0x08070605), Int2(0x0C0B0A09, 0x100F0E0D));
		*Pointer<Short8>(out + 16 * 1) = Short8(Short4(0x0201, 0x0403, 0x0605, 0x0807), Short4(0x0A09, 0x0C0B, 0x0E0D, 0x100F));

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		int8_t ref[16 * 5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
			                   1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

		int8_t out[16 * 5] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
			                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };

		routine(out);

		for(int row = 0; row < 2; row++)
		{
			for(int col = 0; col < 16; col++)
			{
				int i = row * 16 + col;

				EXPECT_EQ(out[i], ref[i]) << "Row " << row << " column " << col << " not equal to reference.";
			}
		}
	}
}

TEST(ReactorUnitTests, Swizzle)
{
	auto swizzleCode = [](int i) -> uint16_t {
		auto x = (i >> 0) & 0x03;
		auto y = (i >> 2) & 0x03;
		auto z = (i >> 4) & 0x03;
		auto w = (i >> 6) & 0x03;
		return (x << 12) | (y << 8) | (z << 4) | (w << 0);
	};

	{
		FunctionT<int(void *)> function;
		{
			Pointer<Byte> out = function.Arg<0>();

			for(int i = 0; i < 256; i++)
			{
				*Pointer<Float4>(out + 16 * i) = Swizzle(Float4(1.0f, 2.0f, 3.0f, 4.0f), swizzleCode(i));
			}

			for(int i = 0; i < 256; i++)
			{
				*Pointer<Float4>(out + 16 * (256 + i)) = ShuffleLowHigh(Float4(1.0f, 2.0f, 3.0f, 4.0f), Float4(5.0f, 6.0f, 7.0f, 8.0f), swizzleCode(i));
			}

			*Pointer<Float4>(out + 16 * (512 + 0)) = UnpackLow(Float4(1.0f, 2.0f, 3.0f, 4.0f), Float4(5.0f, 6.0f, 7.0f, 8.0f));
			*Pointer<Float4>(out + 16 * (512 + 1)) = UnpackHigh(Float4(1.0f, 2.0f, 3.0f, 4.0f), Float4(5.0f, 6.0f, 7.0f, 8.0f));
			*Pointer<Int2>(out + 16 * (512 + 2)) = UnpackLow(Short4(1, 2, 3, 4), Short4(5, 6, 7, 8));
			*Pointer<Int2>(out + 16 * (512 + 3)) = UnpackHigh(Short4(1, 2, 3, 4), Short4(5, 6, 7, 8));
			*Pointer<Short4>(out + 16 * (512 + 4)) = UnpackLow(Byte8(1, 2, 3, 4, 5, 6, 7, 8), Byte8(9, 10, 11, 12, 13, 14, 15, 16));
			*Pointer<Short4>(out + 16 * (512 + 5)) = UnpackHigh(Byte8(1, 2, 3, 4, 5, 6, 7, 8), Byte8(9, 10, 11, 12, 13, 14, 15, 16));

			for(int i = 0; i < 256; i++)
			{
				*Pointer<Short4>(out + 16 * (512 + 6) + (8 * i)) =
				    Swizzle(Short4(1, 2, 3, 4), swizzleCode(i));
			}

			for(int i = 0; i < 256; i++)
			{
				*Pointer<Int4>(out + 16 * (512 + 6 + i) + (8 * 256)) =
				    Swizzle(Int4(1, 2, 3, 4), swizzleCode(i));
			}

			Return(0);
		}

		auto routine = function("one");

		if(routine)
		{
			struct
			{
				float f[256 + 256 + 2][4];
				int i[388][4];
			} out;

			memset(&out, 0, sizeof(out));

			routine(&out);

			for(int i = 0; i < 256; i++)
			{
				EXPECT_EQ(out.f[i][0], float((i >> 0) & 0x03) + 1.0f);
				EXPECT_EQ(out.f[i][1], float((i >> 2) & 0x03) + 1.0f);
				EXPECT_EQ(out.f[i][2], float((i >> 4) & 0x03) + 1.0f);
				EXPECT_EQ(out.f[i][3], float((i >> 6) & 0x03) + 1.0f);
			}

			for(int i = 0; i < 256; i++)
			{
				EXPECT_EQ(out.f[256 + i][0], float((i >> 0) & 0x03) + 1.0f);
				EXPECT_EQ(out.f[256 + i][1], float((i >> 2) & 0x03) + 1.0f);
				EXPECT_EQ(out.f[256 + i][2], float((i >> 4) & 0x03) + 5.0f);
				EXPECT_EQ(out.f[256 + i][3], float((i >> 6) & 0x03) + 5.0f);
			}

			EXPECT_EQ(out.f[512 + 0][0], 1.0f);
			EXPECT_EQ(out.f[512 + 0][1], 5.0f);
			EXPECT_EQ(out.f[512 + 0][2], 2.0f);
			EXPECT_EQ(out.f[512 + 0][3], 6.0f);

			EXPECT_EQ(out.f[512 + 1][0], 3.0f);
			EXPECT_EQ(out.f[512 + 1][1], 7.0f);
			EXPECT_EQ(out.f[512 + 1][2], 4.0f);
			EXPECT_EQ(out.f[512 + 1][3], 8.0f);

			EXPECT_EQ(out.i[0][0], 0x00050001);
			EXPECT_EQ(out.i[0][1], 0x00060002);
			EXPECT_EQ(out.i[0][2], 0x00000000);
			EXPECT_EQ(out.i[0][3], 0x00000000);

			EXPECT_EQ(out.i[1][0], 0x00070003);
			EXPECT_EQ(out.i[1][1], 0x00080004);
			EXPECT_EQ(out.i[1][2], 0x00000000);
			EXPECT_EQ(out.i[1][3], 0x00000000);

			EXPECT_EQ(out.i[2][0], 0x0A020901);
			EXPECT_EQ(out.i[2][1], 0x0C040B03);
			EXPECT_EQ(out.i[2][2], 0x00000000);
			EXPECT_EQ(out.i[2][3], 0x00000000);

			EXPECT_EQ(out.i[3][0], 0x0E060D05);
			EXPECT_EQ(out.i[3][1], 0x10080F07);
			EXPECT_EQ(out.i[3][2], 0x00000000);
			EXPECT_EQ(out.i[3][3], 0x00000000);

			for(int i = 0; i < 256; i++)
			{
				EXPECT_EQ(out.i[4 + i / 2][0 + (i % 2) * 2] & 0xFFFF,
				          ((i >> 0) & 0x03) + 1);
				EXPECT_EQ(out.i[4 + i / 2][0 + (i % 2) * 2] >> 16,
				          ((i >> 2) & 0x03) + 1);
				EXPECT_EQ(out.i[4 + i / 2][1 + (i % 2) * 2] & 0xFFFF,
				          ((i >> 4) & 0x03) + 1);
				EXPECT_EQ(out.i[4 + i / 2][1 + (i % 2) * 2] >> 16,
				          ((i >> 6) & 0x03) + 1);
			}

			for(int i = 0; i < 256; i++)
			{
				EXPECT_EQ(out.i[132 + i][0], ((i >> 0) & 0x03) + 1);
				EXPECT_EQ(out.i[132 + i][1], ((i >> 2) & 0x03) + 1);
				EXPECT_EQ(out.i[132 + i][2], ((i >> 4) & 0x03) + 1);
				EXPECT_EQ(out.i[132 + i][3], ((i >> 6) & 0x03) + 1);
			}
		}
	}
}

TEST(ReactorUnitTests, Shuffle)
{
	{
		// |select| is [0aaa:0bbb:0ccc:0ddd] where |aaa|, |bbb|, |ccc|
		// and |ddd| are 7-bit selection indices. For a total (1 << 12)
		// possibilities.
		const int kSelectRange = 1 << 12;

		// Unfortunately, testing the whole kSelectRange results in a test
		// that is far too slow to run, because LLVM spends exponentially more
		// time optimizing the function below as the number of test cases
		// increases.
		//
		// To work-around the problem, only test a subset of the range by
		// skipping every kRangeIncrement value.
		//
		// Set this value to 1 if you want to test the whole implementation,
		// which will take a little less than 2 minutes on a fast workstation.
		//
		// The default value here takes about 1390ms, which is a little more than
		// what the Swizzle test takes (993 ms) on my machine. A non-power-of-2
		// value ensures a better spread over possible values.
		const int kRangeIncrement = 11;

		auto rangeIndexToSelect = [](int i) {
			return static_cast<unsigned short>(
			    (((i >> 9) & 7) << 0) |
			    (((i >> 6) & 7) << 4) |
			    (((i >> 3) & 7) << 8) |
			    (((i >> 0) & 7) << 12));
		};

		FunctionT<int(void *)> function;
		{
			Pointer<Byte> out = function.Arg<0>();

			for(int i = 0; i < kSelectRange; i += kRangeIncrement)
			{
				unsigned short select = rangeIndexToSelect(i);

				*Pointer<Float4>(out + 16 * i) = Shuffle(Float4(1.0f, 2.0f, 3.0f, 4.0f),
				                                         Float4(5.0f, 6.0f, 7.0f, 8.0f),
				                                         select);

				*Pointer<Int4>(out + (kSelectRange + i) * 16) = Shuffle(Int4(10, 11, 12, 13),
				                                                        Int4(14, 15, 16, 17),
				                                                        select);

				*Pointer<UInt4>(out + (2 * kSelectRange + i) * 16) = Shuffle(UInt4(100, 101, 102, 103),
				                                                             UInt4(104, 105, 106, 107),
				                                                             select);
			}

			Return(0);
		}

		auto routine = function("one");

		if(routine)
		{
			struct
			{
				float f[kSelectRange][4];
				int i[kSelectRange][4];
				unsigned u[kSelectRange][4];
			} out;

			memset(&out, 0, sizeof(out));

			routine(&out);

			for(int i = 0; i < kSelectRange; i += kRangeIncrement)
			{
				EXPECT_EQ(out.f[i][0], float(1.0f + (i & 7)));
				EXPECT_EQ(out.f[i][1], float(1.0f + ((i >> 3) & 7)));
				EXPECT_EQ(out.f[i][2], float(1.0f + ((i >> 6) & 7)));
				EXPECT_EQ(out.f[i][3], float(1.0f + ((i >> 9) & 7)));
			}

			for(int i = 0; i < kSelectRange; i += kRangeIncrement)
			{
				EXPECT_EQ(out.i[i][0], int(10 + (i & 7)));
				EXPECT_EQ(out.i[i][1], int(10 + ((i >> 3) & 7)));
				EXPECT_EQ(out.i[i][2], int(10 + ((i >> 6) & 7)));
				EXPECT_EQ(out.i[i][3], int(10 + ((i >> 9) & 7)));
			}

			for(int i = 0; i < kSelectRange; i += kRangeIncrement)
			{
				EXPECT_EQ(out.u[i][0], unsigned(100 + (i & 7)));
				EXPECT_EQ(out.u[i][1], unsigned(100 + ((i >> 3) & 7)));
				EXPECT_EQ(out.u[i][2], unsigned(100 + ((i >> 6) & 7)));
				EXPECT_EQ(out.u[i][3], unsigned(100 + ((i >> 9) & 7)));
			}
		}
	}
}

TEST(ReactorUnitTests, Branching)
{
	FunctionT<int()> function;
	{
		Int x = 0;

		For(Int i = 0, i < 8, i++)
		{
			If(i < 2)
			{
				x += 1;
			}
			Else If(i < 4)
			{
				x += 10;
			}
			Else If(i < 6)
			{
				x += 100;
			}
			Else
			{
				x += 1000;
			}

			For(Int i = 0, i < 5, i++)
			    x += 10000;
		}

		For(Int i = 0, i < 10, i++) for(int i = 0; i < 10; i++)
		    For(Int i = 0, i < 10, i++)
		{
			x += 1000000;
		}

		For(Int i = 0, i < 2, i++)
		    If(x == 1000402222)
		{
			If(x != 1000402222)
			    x += 1000000000;
		}
		Else
		    x = -5;

		Return(x);
	}

	auto routine = function("one");

	if(routine)
	{
		int result = routine();

		EXPECT_EQ(result, 1000402222);
	}
}

TEST(ReactorUnitTests, MinMax)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Float4>(out + 16 * 0) = Min(Float4(1.0f, 0.0f, -0.0f, +0.0f), Float4(0.0f, 1.0f, +0.0f, -0.0f));
		*Pointer<Float4>(out + 16 * 1) = Max(Float4(1.0f, 0.0f, -0.0f, +0.0f), Float4(0.0f, 1.0f, +0.0f, -0.0f));

		*Pointer<Int4>(out + 16 * 2) = Min(Int4(1, 0, -1, -0), Int4(0, 1, 0, +0));
		*Pointer<Int4>(out + 16 * 3) = Max(Int4(1, 0, -1, -0), Int4(0, 1, 0, +0));
		*Pointer<UInt4>(out + 16 * 4) = Min(UInt4(1, 0, -1, -0), UInt4(0, 1, 0, +0));
		*Pointer<UInt4>(out + 16 * 5) = Max(UInt4(1, 0, -1, -0), UInt4(0, 1, 0, +0));

		*Pointer<Short4>(out + 16 * 6) = Min(Short4(1, 0, -1, -0), Short4(0, 1, 0, +0));
		*Pointer<Short4>(out + 16 * 7) = Max(Short4(1, 0, -1, -0), Short4(0, 1, 0, +0));
		*Pointer<UShort4>(out + 16 * 8) = Min(UShort4(1, 0, -1, -0), UShort4(0, 1, 0, +0));
		*Pointer<UShort4>(out + 16 * 9) = Max(UShort4(1, 0, -1, -0), UShort4(0, 1, 0, +0));

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[10][4];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0x00000000u);
		EXPECT_EQ(out[0][1], 0x00000000u);
		EXPECT_EQ(out[0][2], 0x00000000u);
		EXPECT_EQ(out[0][3], 0x80000000u);

		EXPECT_EQ(out[1][0], 0x3F800000u);
		EXPECT_EQ(out[1][1], 0x3F800000u);
		EXPECT_EQ(out[1][2], 0x00000000u);
		EXPECT_EQ(out[1][3], 0x80000000u);

		EXPECT_EQ(out[2][0], 0x00000000u);
		EXPECT_EQ(out[2][1], 0x00000000u);
		EXPECT_EQ(out[2][2], 0xFFFFFFFFu);
		EXPECT_EQ(out[2][3], 0x00000000u);

		EXPECT_EQ(out[3][0], 0x00000001u);
		EXPECT_EQ(out[3][1], 0x00000001u);
		EXPECT_EQ(out[3][2], 0x00000000u);
		EXPECT_EQ(out[3][3], 0x00000000u);

		EXPECT_EQ(out[4][0], 0x00000000u);
		EXPECT_EQ(out[4][1], 0x00000000u);
		EXPECT_EQ(out[4][2], 0x00000000u);
		EXPECT_EQ(out[4][3], 0x00000000u);

		EXPECT_EQ(out[5][0], 0x00000001u);
		EXPECT_EQ(out[5][1], 0x00000001u);
		EXPECT_EQ(out[5][2], 0xFFFFFFFFu);
		EXPECT_EQ(out[5][3], 0x00000000u);

		EXPECT_EQ(out[6][0], 0x00000000u);
		EXPECT_EQ(out[6][1], 0x0000FFFFu);
		EXPECT_EQ(out[6][2], 0x00000000u);
		EXPECT_EQ(out[6][3], 0x00000000u);

		EXPECT_EQ(out[7][0], 0x00010001u);
		EXPECT_EQ(out[7][1], 0x00000000u);
		EXPECT_EQ(out[7][2], 0x00000000u);
		EXPECT_EQ(out[7][3], 0x00000000u);

		EXPECT_EQ(out[8][0], 0x00000000u);
		EXPECT_EQ(out[8][1], 0x00000000u);
		EXPECT_EQ(out[8][2], 0x00000000u);
		EXPECT_EQ(out[8][3], 0x00000000u);

		EXPECT_EQ(out[9][0], 0x00010001u);
		EXPECT_EQ(out[9][1], 0x0000FFFFu);
		EXPECT_EQ(out[9][2], 0x00000000u);
		EXPECT_EQ(out[9][3], 0x00000000u);
	}
}

TEST(ReactorUnitTests, NotNeg)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Int>(out + 16 * 0) = ~Int(0x55555555);
		*Pointer<Short>(out + 16 * 1) = ~Short(0x5555);
		*Pointer<Int4>(out + 16 * 2) = ~Int4(0x55555555, 0xAAAAAAAA, 0x00000000, 0xFFFFFFFF);
		*Pointer<Short4>(out + 16 * 3) = ~Short4(0x5555, 0xAAAA, 0x0000, 0xFFFF);

		*Pointer<Int>(out + 16 * 4) = -Int(0x55555555);
		*Pointer<Short>(out + 16 * 5) = -Short(0x5555);
		*Pointer<Int4>(out + 16 * 6) = -Int4(0x55555555, 0xAAAAAAAA, 0x00000000, 0xFFFFFFFF);
		*Pointer<Short4>(out + 16 * 7) = -Short4(0x5555, 0xAAAA, 0x0000, 0xFFFF);

		*Pointer<Float4>(out + 16 * 8) = -Float4(1.0f, -1.0f, 0.0f, -0.0f);

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[10][4];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0xAAAAAAAAu);
		EXPECT_EQ(out[0][1], 0x00000000u);
		EXPECT_EQ(out[0][2], 0x00000000u);
		EXPECT_EQ(out[0][3], 0x00000000u);

		EXPECT_EQ(out[1][0], 0x0000AAAAu);
		EXPECT_EQ(out[1][1], 0x00000000u);
		EXPECT_EQ(out[1][2], 0x00000000u);
		EXPECT_EQ(out[1][3], 0x00000000u);

		EXPECT_EQ(out[2][0], 0xAAAAAAAAu);
		EXPECT_EQ(out[2][1], 0x55555555u);
		EXPECT_EQ(out[2][2], 0xFFFFFFFFu);
		EXPECT_EQ(out[2][3], 0x00000000u);

		EXPECT_EQ(out[3][0], 0x5555AAAAu);
		EXPECT_EQ(out[3][1], 0x0000FFFFu);
		EXPECT_EQ(out[3][2], 0x00000000u);
		EXPECT_EQ(out[3][3], 0x00000000u);

		EXPECT_EQ(out[4][0], 0xAAAAAAABu);
		EXPECT_EQ(out[4][1], 0x00000000u);
		EXPECT_EQ(out[4][2], 0x00000000u);
		EXPECT_EQ(out[4][3], 0x00000000u);

		EXPECT_EQ(out[5][0], 0x0000AAABu);
		EXPECT_EQ(out[5][1], 0x00000000u);
		EXPECT_EQ(out[5][2], 0x00000000u);
		EXPECT_EQ(out[5][3], 0x00000000u);

		EXPECT_EQ(out[6][0], 0xAAAAAAABu);
		EXPECT_EQ(out[6][1], 0x55555556u);
		EXPECT_EQ(out[6][2], 0x00000000u);
		EXPECT_EQ(out[6][3], 0x00000001u);

		EXPECT_EQ(out[7][0], 0x5556AAABu);
		EXPECT_EQ(out[7][1], 0x00010000u);
		EXPECT_EQ(out[7][2], 0x00000000u);
		EXPECT_EQ(out[7][3], 0x00000000u);

		EXPECT_EQ(out[8][0], 0xBF800000u);
		EXPECT_EQ(out[8][1], 0x3F800000u);
		EXPECT_EQ(out[8][2], 0x80000000u);
		EXPECT_EQ(out[8][3], 0x00000000u);
	}
}

TEST(ReactorUnitTests, FPtoUI)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<UInt>(out + 0) = UInt(Float(0xF0000000u));
		*Pointer<UInt>(out + 4) = UInt(Float(0xC0000000u));
		*Pointer<UInt>(out + 8) = UInt(Float(0x00000001u));
		*Pointer<UInt>(out + 12) = UInt(Float(0xF000F000u));

		*Pointer<UInt4>(out + 16) = UInt4(Float4(0xF0000000u, 0x80000000u, 0x00000000u, 0xCCCC0000u));

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[2][4];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0xF0000000u);
		EXPECT_EQ(out[0][1], 0xC0000000u);
		EXPECT_EQ(out[0][2], 0x00000001u);
		EXPECT_EQ(out[0][3], 0xF000F000u);

		EXPECT_EQ(out[1][0], 0xF0000000u);
		EXPECT_EQ(out[1][1], 0x80000000u);
		EXPECT_EQ(out[1][2], 0x00000000u);
		EXPECT_EQ(out[1][3], 0xCCCC0000u);
	}
}

TEST(ReactorUnitTests, VectorCompare)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Int4>(out + 16 * 0) = CmpEQ(Float4(1.0f, 1.0f, -0.0f, +0.0f), Float4(0.0f, 1.0f, +0.0f, -0.0f));
		*Pointer<Int4>(out + 16 * 1) = CmpEQ(Int4(1, 0, -1, -0), Int4(0, 1, 0, +0));
		*Pointer<Byte8>(out + 16 * 2) = CmpEQ(SByte8(1, 2, 3, 4, 5, 6, 7, 8), SByte8(7, 6, 5, 4, 3, 2, 1, 0));

		*Pointer<Int4>(out + 16 * 3) = CmpNLT(Float4(1.0f, 1.0f, -0.0f, +0.0f), Float4(0.0f, 1.0f, +0.0f, -0.0f));
		*Pointer<Int4>(out + 16 * 4) = CmpNLT(Int4(1, 0, -1, -0), Int4(0, 1, 0, +0));
		*Pointer<Byte8>(out + 16 * 5) = CmpGT(SByte8(1, 2, 3, 4, 5, 6, 7, 8), SByte8(7, 6, 5, 4, 3, 2, 1, 0));

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[6][4];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0x00000000u);
		EXPECT_EQ(out[0][1], 0xFFFFFFFFu);
		EXPECT_EQ(out[0][2], 0xFFFFFFFFu);
		EXPECT_EQ(out[0][3], 0xFFFFFFFFu);

		EXPECT_EQ(out[1][0], 0x00000000u);
		EXPECT_EQ(out[1][1], 0x00000000u);
		EXPECT_EQ(out[1][2], 0x00000000u);
		EXPECT_EQ(out[1][3], 0xFFFFFFFFu);

		EXPECT_EQ(out[2][0], 0xFF000000u);
		EXPECT_EQ(out[2][1], 0x00000000u);

		EXPECT_EQ(out[3][0], 0xFFFFFFFFu);
		EXPECT_EQ(out[3][1], 0xFFFFFFFFu);
		EXPECT_EQ(out[3][2], 0xFFFFFFFFu);
		EXPECT_EQ(out[3][3], 0xFFFFFFFFu);

		EXPECT_EQ(out[4][0], 0xFFFFFFFFu);
		EXPECT_EQ(out[4][1], 0x00000000u);
		EXPECT_EQ(out[4][2], 0x00000000u);
		EXPECT_EQ(out[4][3], 0xFFFFFFFFu);

		EXPECT_EQ(out[5][0], 0x00000000u);
		EXPECT_EQ(out[5][1], 0xFFFFFFFFu);
	}
}

TEST(ReactorUnitTests, SaturatedAddAndSubtract)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Byte8>(out + 8 * 0) =
		    AddSat(Byte8(1, 2, 3, 4, 5, 6, 7, 8),
		           Byte8(7, 6, 5, 4, 3, 2, 1, 0));
		*Pointer<Byte8>(out + 8 * 1) =
		    AddSat(Byte8(0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE),
		           Byte8(7, 6, 5, 4, 3, 2, 1, 0));
		*Pointer<Byte8>(out + 8 * 2) =
		    SubSat(Byte8(1, 2, 3, 4, 5, 6, 7, 8),
		           Byte8(7, 6, 5, 4, 3, 2, 1, 0));

		*Pointer<SByte8>(out + 8 * 3) =
		    AddSat(SByte8(1, 2, 3, 4, 5, 6, 7, 8),
		           SByte8(7, 6, 5, 4, 3, 2, 1, 0));
		*Pointer<SByte8>(out + 8 * 4) =
		    AddSat(SByte8(0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E),
		           SByte8(7, 6, 5, 4, 3, 2, 1, 0));
		*Pointer<SByte8>(out + 8 * 5) =
		    AddSat(SByte8(0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88),
		           SByte8(-7, -6, -5, -4, -3, -2, -1, -0));
		*Pointer<SByte8>(out + 8 * 6) =
		    SubSat(SByte8(0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88),
		           SByte8(7, 6, 5, 4, 3, 2, 1, 0));

		*Pointer<Short4>(out + 8 * 7) =
		    AddSat(Short4(1, 2, 3, 4), Short4(3, 2, 1, 0));
		*Pointer<Short4>(out + 8 * 8) =
		    AddSat(Short4(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFE),
		           Short4(3, 2, 1, 0));
		*Pointer<Short4>(out + 8 * 9) =
		    AddSat(Short4(0x8001, 0x8002, 0x8003, 0x8004),
		           Short4(-3, -2, -1, -0));
		*Pointer<Short4>(out + 8 * 10) =
		    SubSat(Short4(0x8001, 0x8002, 0x8003, 0x8004),
		           Short4(3, 2, 1, 0));

		*Pointer<UShort4>(out + 8 * 11) =
		    AddSat(UShort4(1, 2, 3, 4), UShort4(3, 2, 1, 0));
		*Pointer<UShort4>(out + 8 * 12) =
		    AddSat(UShort4(0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE),
		           UShort4(3, 2, 1, 0));
		*Pointer<UShort4>(out + 8 * 13) =
		    SubSat(UShort4(1, 2, 3, 4), UShort4(3, 2, 1, 0));

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[14][2];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0x08080808u);
		EXPECT_EQ(out[0][1], 0x08080808u);

		EXPECT_EQ(out[1][0], 0xFFFFFFFFu);
		EXPECT_EQ(out[1][1], 0xFEFFFFFFu);

		EXPECT_EQ(out[2][0], 0x00000000u);
		EXPECT_EQ(out[2][1], 0x08060402u);

		EXPECT_EQ(out[3][0], 0x08080808u);
		EXPECT_EQ(out[3][1], 0x08080808u);

		EXPECT_EQ(out[4][0], 0x7F7F7F7Fu);
		EXPECT_EQ(out[4][1], 0x7E7F7F7Fu);

		EXPECT_EQ(out[5][0], 0x80808080u);
		EXPECT_EQ(out[5][1], 0x88868482u);

		EXPECT_EQ(out[6][0], 0x80808080u);
		EXPECT_EQ(out[6][1], 0x88868482u);

		EXPECT_EQ(out[7][0], 0x00040004u);
		EXPECT_EQ(out[7][1], 0x00040004u);

		EXPECT_EQ(out[8][0], 0x7FFF7FFFu);
		EXPECT_EQ(out[8][1], 0x7FFE7FFFu);

		EXPECT_EQ(out[9][0], 0x80008000u);
		EXPECT_EQ(out[9][1], 0x80048002u);

		EXPECT_EQ(out[10][0], 0x80008000u);
		EXPECT_EQ(out[10][1], 0x80048002u);

		EXPECT_EQ(out[11][0], 0x00040004u);
		EXPECT_EQ(out[11][1], 0x00040004u);

		EXPECT_EQ(out[12][0], 0xFFFFFFFFu);
		EXPECT_EQ(out[12][1], 0xFFFEFFFFu);

		EXPECT_EQ(out[13][0], 0x00000000u);
		EXPECT_EQ(out[13][1], 0x00040002u);
	}
}

TEST(ReactorUnitTests, Unpack)
{
	FunctionT<int(void *, void *)> function;
	{
		Pointer<Byte> in = function.Arg<0>();
		Pointer<Byte> out = function.Arg<1>();

		Byte4 test_byte_a = *Pointer<Byte4>(in + 4 * 0);
		Byte4 test_byte_b = *Pointer<Byte4>(in + 4 * 1);

		*Pointer<Short4>(out + 8 * 0) =
		    Unpack(test_byte_a, test_byte_b);

		*Pointer<Short4>(out + 8 * 1) = Unpack(test_byte_a);

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int in[1][2];
		unsigned int out[2][2];

		memset(&out, 0, sizeof(out));

		in[0][0] = 0xABCDEF12u;
		in[0][1] = 0x34567890u;

		routine(&in, &out);

		EXPECT_EQ(out[0][0], 0x78EF9012u);
		EXPECT_EQ(out[0][1], 0x34AB56CDu);

		EXPECT_EQ(out[1][0], 0xEFEF1212u);
		EXPECT_EQ(out[1][1], 0xABABCDCDu);
	}
}

TEST(ReactorUnitTests, Pack)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<SByte8>(out + 8 * 0) =
		    PackSigned(Short4(-1, -2, 1, 2),
		               Short4(3, 4, -3, -4));

		*Pointer<Byte8>(out + 8 * 1) =
		    PackUnsigned(Short4(-1, -2, 1, 2),
		                 Short4(3, 4, -3, -4));

		*Pointer<Short8>(out + 8 * 2) =
		    PackSigned(Int4(-1, -2, 1, 2),
		               Int4(3, 4, -3, -4));

		*Pointer<UShort8>(out + 8 * 4) =
		    PackUnsigned(Int4(-1, -2, 1, 2),
		                 Int4(3, 4, -3, -4));

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[6][2];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0x0201FEFFu);
		EXPECT_EQ(out[0][1], 0xFCFD0403u);

		EXPECT_EQ(out[1][0], 0x02010000u);
		EXPECT_EQ(out[1][1], 0x00000403u);

		EXPECT_EQ(out[2][0], 0xFFFEFFFFu);
		EXPECT_EQ(out[2][1], 0x00020001u);

		EXPECT_EQ(out[3][0], 0x00040003u);
		EXPECT_EQ(out[3][1], 0xFFFCFFFDu);

		EXPECT_EQ(out[4][0], 0x00000000u);
		EXPECT_EQ(out[4][1], 0x00020001u);

		EXPECT_EQ(out[5][0], 0x00040003u);
		EXPECT_EQ(out[5][1], 0x00000000u);
	}
}

TEST(ReactorUnitTests, MulHigh)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Short4>(out + 16 * 0) =
		    MulHigh(Short4(0x01AA, 0x02DD, 0x03EE, 0xF422),
		            Short4(0x01BB, 0x02CC, 0x03FF, 0xF411));
		*Pointer<UShort4>(out + 16 * 1) =
		    MulHigh(UShort4(0x01AA, 0x02DD, 0x03EE, 0xF422),
		            UShort4(0x01BB, 0x02CC, 0x03FF, 0xF411));

		*Pointer<Int4>(out + 16 * 2) =
		    MulHigh(Int4(0x000001AA, 0x000002DD, 0xC8000000, 0xF8000000),
		            Int4(0x000001BB, 0x84000000, 0x000003EE, 0xD7000000));
		*Pointer<UInt4>(out + 16 * 3) =
		    MulHigh(UInt4(0x000001AAu, 0x000002DDu, 0xC8000000u, 0xD8000000u),
		            UInt4(0x000001BBu, 0x84000000u, 0x000003EEu, 0xD7000000u));

		*Pointer<Int4>(out + 16 * 4) =
		    MulHigh(Int4(0x7FFFFFFF, 0x7FFFFFFF, 0x80008000, 0xFFFFFFFF),
		            Int4(0x7FFFFFFF, 0x80000000, 0x80008000, 0xFFFFFFFF));
		*Pointer<UInt4>(out + 16 * 5) =
		    MulHigh(UInt4(0x7FFFFFFFu, 0x7FFFFFFFu, 0x80008000u, 0xFFFFFFFFu),
		            UInt4(0x7FFFFFFFu, 0x80000000u, 0x80008000u, 0xFFFFFFFFu));

		// (U)Short8 variants currently unimplemented.

		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[6][4];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0x00080002u);
		EXPECT_EQ(out[0][1], 0x008D000Fu);

		EXPECT_EQ(out[1][0], 0x00080002u);
		EXPECT_EQ(out[1][1], 0xE8C0000Fu);

		EXPECT_EQ(out[2][0], 0x00000000u);
		EXPECT_EQ(out[2][1], 0xFFFFFE9Cu);
		EXPECT_EQ(out[2][2], 0xFFFFFF23u);
		EXPECT_EQ(out[2][3], 0x01480000u);

		EXPECT_EQ(out[3][0], 0x00000000u);
		EXPECT_EQ(out[3][1], 0x00000179u);
		EXPECT_EQ(out[3][2], 0x00000311u);
		EXPECT_EQ(out[3][3], 0xB5680000u);

		EXPECT_EQ(out[4][0], 0x3FFFFFFFu);
		EXPECT_EQ(out[4][1], 0xC0000000u);
		EXPECT_EQ(out[4][2], 0x3FFF8000u);
		EXPECT_EQ(out[4][3], 0x00000000u);

		EXPECT_EQ(out[5][0], 0x3FFFFFFFu);
		EXPECT_EQ(out[5][1], 0x3FFFFFFFu);
		EXPECT_EQ(out[5][2], 0x40008000u);
		EXPECT_EQ(out[5][3], 0xFFFFFFFEu);
	}
}

TEST(ReactorUnitTests, MulAdd)
{
	FunctionT<int(void *)> function;
	{
		Pointer<Byte> out = function.Arg<0>();

		*Pointer<Int2>(out + 8 * 0) =
		    MulAdd(Short4(0x1aa, 0x2dd, 0x3ee, 0xF422),
		           Short4(0x1bb, 0x2cc, 0x3ff, 0xF411));

		// (U)Short8 variant is mentioned but unimplemented
		Return(0);
	}

	auto routine = function("one");

	if(routine)
	{
		unsigned int out[1][2];

		memset(&out, 0, sizeof(out));

		routine(&out);

		EXPECT_EQ(out[0][0], 0x000AE34Au);
		EXPECT_EQ(out[0][1], 0x009D5254u);
	}
}

TEST(ReactorUnitTests, PointersEqual)
{
	FunctionT<int(void *, void *)> function;
	{
		Pointer<Byte> ptrA = function.Arg<0>();
		Pointer<Byte> ptrB = function.Arg<1>();
		If(ptrA == ptrB)
		{
			Return(1);
		}
		Else
		{
			Return(0);
		}
	}

	auto routine = function("one");
	int *a = reinterpret_cast<int *>(uintptr_t(0x0000000000000000));
	int *b = reinterpret_cast<int *>(uintptr_t(0x00000000F0000000));
	int *c = reinterpret_cast<int *>(uintptr_t(0xF000000000000000));
	EXPECT_EQ(routine(&a, &a), 1);
	EXPECT_EQ(routine(&b, &b), 1);
	EXPECT_EQ(routine(&c, &c), 1);

	EXPECT_EQ(routine(&a, &b), 0);
	EXPECT_EQ(routine(&b, &a), 0);
	EXPECT_EQ(routine(&b, &c), 0);
	EXPECT_EQ(routine(&c, &b), 0);
	EXPECT_EQ(routine(&c, &a), 0);
	EXPECT_EQ(routine(&a, &c), 0);
}

TEST(ReactorUnitTests, Args_2Mixed)
{
	// 2 mixed type args
	FunctionT<float(int, float)> function;
	{
		Int a = function.Arg<0>();
		Float b = function.Arg<1>();
		Return(Float(a) + b);
	}

	if(auto routine = function("one"))
	{
		float result = routine(1, 2.f);
		EXPECT_EQ(result, 3.f);
	}
}

TEST(ReactorUnitTests, Args_4Mixed)
{
	// 4 mixed type args (max register allocation on Windows)
	FunctionT<float(int, float, int, float)> function;
	{
		Int a = function.Arg<0>();
		Float b = function.Arg<1>();
		Int c = function.Arg<2>();
		Float d = function.Arg<3>();
		Return(Float(a) + b + Float(c) + d);
	}

	if(auto routine = function("one"))
	{
		float result = routine(1, 2.f, 3, 4.f);
		EXPECT_EQ(result, 10.f);
	}
}

TEST(ReactorUnitTests, Args_5Mixed)
{
	// 5 mixed type args (5th spills over to stack on Windows)
	FunctionT<float(int, float, int, float, int)> function;
	{
		Int a = function.Arg<0>();
		Float b = function.Arg<1>();
		Int c = function.Arg<2>();
		Float d = function.Arg<3>();
		Int e = function.Arg<4>();
		Return(Float(a) + b + Float(c) + d + Float(e));
	}

	if(auto routine = function("one"))
	{
		float result = routine(1, 2.f, 3, 4.f, 5);
		EXPECT_EQ(result, 15.f);
	}
}

TEST(ReactorUnitTests, Args_GreaterThan5Mixed)
{
	// >5 mixed type args
	FunctionT<float(int, float, int, float, int, float, int, float, int, float)> function;
	{
		Int a = function.Arg<0>();
		Float b = function.Arg<1>();
		Int c = function.Arg<2>();
		Float d = function.Arg<3>();
		Int e = function.Arg<4>();
		Float f = function.Arg<5>();
		Int g = function.Arg<6>();
		Float h = function.Arg<7>();
		Int i = function.Arg<8>();
		Float j = function.Arg<9>();
		Return(Float(a) + b + Float(c) + d + Float(e) + f + Float(g) + h + Float(i) + j);
	}

	if(auto routine = function("one"))
	{
		float result = routine(1, 2.f, 3, 4.f, 5, 6.f, 7, 8.f, 9, 10.f);
		EXPECT_EQ(result, 55.f);
	}
}

TEST(ReactorUnitTests, Call)
{
	struct Class
	{
		static int Callback(Class *p, int i, float f)
		{
			p->i = i;
			p->f = f;
			return i + int(f);
		}

		int i = 0;
		float f = 0.0f;
	};

	FunctionT<int(void *)> function;
	{
		Pointer<Byte> c = function.Arg<0>();
		auto res = Call(Class::Callback, c, 10, 20.0f);
		Return(res);
	}

	auto routine = function("one");

	Class c;
	int res = routine(&c);
	EXPECT_EQ(res, 30);
	EXPECT_EQ(c.i, 10);
	EXPECT_EQ(c.f, 20.0f);
}

TEST(ReactorUnitTests, CallMemberFunction)
{
	struct Class
	{
		int Callback(int argI, float argF)
		{
			i = argI;
			f = argF;
			return i + int(f);
		}

		int i = 0;
		float f = 0.0f;
	};

	Class c;

	FunctionT<int()> function;
	{
		auto res = Call(&Class::Callback, &c, 10, 20.0f);
		Return(res);
	}

	auto routine = function("one");

	int res = routine();
	EXPECT_EQ(res, 30);
	EXPECT_EQ(c.i, 10);
	EXPECT_EQ(c.f, 20.0f);
}

TEST(ReactorUnitTests, CallMemberFunctionIndirect)
{
	struct Class
	{
		int Callback(int argI, float argF)
		{
			i = argI;
			f = argF;
			return i + int(f);
		}

		int i = 0;
		float f = 0.0f;
	};

	FunctionT<int(void *)> function;
	{
		Pointer<Byte> c = function.Arg<0>();
		auto res = Call(&Class::Callback, c, 10, 20.0f);
		Return(res);
	}

	auto routine = function("one");

	Class c;
	int res = routine(&c);
	EXPECT_EQ(res, 30);
	EXPECT_EQ(c.i, 10);
	EXPECT_EQ(c.f, 20.0f);
}

TEST(ReactorUnitTests, CallImplicitCast)
{
	struct Class
	{
		static void Callback(Class *c, const char *s)
		{
			c->str = s;
		}
		std::string str;
	};

	FunctionT<void(Class * c, const char *s)> function;
	{
		Pointer<Byte> c = function.Arg<0>();
		Pointer<Byte> s = function.Arg<1>();
		Call(Class::Callback, c, s);
	}

	auto routine = function("one");

	Class c;
	routine(&c, "hello world");
	EXPECT_EQ(c.str, "hello world");
}

TEST(ReactorUnitTests, Call_Args4)
{
	struct Class
	{
		static int Func(int a, int b, int c, int d)
		{
			return a + b + c + d;
		}
	};

	{
		FunctionT<int()> function;
		{
			auto res = Call(Class::Func, 1, 2, 3, 4);
			Return(res);
		}

		auto routine = function("one");

		if(routine)
		{
			int res = routine();
			EXPECT_EQ(res, 1 + 2 + 3 + 4);
		}
	}
}

TEST(ReactorUnitTests, Call_Args5)
{
	struct Class
	{
		static int Func(int a, int b, int c, int d, int e)
		{
			return a + b + c + d + e;
		}
	};

	{
		FunctionT<int()> function;
		{
			auto res = Call(Class::Func, 1, 2, 3, 4, 5);
			Return(res);
		}

		auto routine = function("one");

		if(routine)
		{
			int res = routine();
			EXPECT_EQ(res, 1 + 2 + 3 + 4 + 5);
		}
	}
}

TEST(ReactorUnitTests, Call_ArgsMany)
{
	struct Class
	{
		static int Func(int a, int b, int c, int d, int e, int f, int g, int h)
		{
			return a + b + c + d + e + f + g + h;
		}
	};

	{
		FunctionT<int()> function;
		{
			auto res = Call(Class::Func, 1, 2, 3, 4, 5, 6, 7, 8);
			Return(res);
		}

		auto routine = function("one");

		if(routine)
		{
			int res = routine();
			EXPECT_EQ(res, 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8);
		}
	}
}

TEST(ReactorUnitTests, Call_ArgsMixed)
{
	struct Class
	{
		static int Func(int a, float b, int *c, float *d, int e, float f, int *g, float *h)
		{
			return a + b + *c + *d + e + f + *g + *h;
		}
	};

	{
		FunctionT<int()> function;
		{
			Int c(3);
			Float d(4);
			Int g(7);
			Float h(8);
			auto res = Call(Class::Func, 1, 2.f, &c, &d, 5, 6.f, &g, &h);
			Return(res);
		}

		auto routine = function("one");

		if(routine)
		{
			int res = routine();
			EXPECT_EQ(res, 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8);
		}
	}
}

TEST(ReactorUnitTests, Call_ArgsPointer)
{
	struct Class
	{
		static int Func(int *a)
		{
			return *a;
		}
	};

	{
		FunctionT<int()> function;
		{
			Int a(12345);
			auto res = Call(Class::Func, &a);
			Return(res);
		}

		auto routine = function("one");

		if(routine)
		{
			int res = routine();
			EXPECT_EQ(res, 12345);
		}
	}
}

TEST(ReactorUnitTests, CallExternalCallRoutine)
{
	// routine1 calls Class::Func, passing it a pointer to routine2, and Class::Func calls routine2

	auto routine2 = [] {
		FunctionT<float(float, int)> function;
		{
			Float a = function.Arg<0>();
			Int b = function.Arg<1>();
			Return(a + Float(b));
		}
		return function("two");
	}();

	struct Class
	{
		static float Func(void *p, float a, int b)
		{
			auto funcToCall = reinterpret_cast<float (*)(float, int)>(p);
			return funcToCall(a, b);
		}
	};

	auto routine1 = [] {
		FunctionT<float(void *, float, int)> function;
		{
			Pointer<Byte> funcToCall = function.Arg<0>();
			Float a = function.Arg<1>();
			Int b = function.Arg<2>();
			Float result = Call(Class::Func, funcToCall, a, b);
			Return(result);
		}
		return function("one");
	}();

	float result = routine1((void *)routine2.getEntry(), 12.f, 13);
	EXPECT_EQ(result, 25.f);
}

// Check that a complex generated function which utilizes all 8 or 16 XMM
// registers computes the correct result.
// (Note that due to MSC's lack of support for inline assembly in x64,
// this test does not actually check that the register contents are
// preserved, just that the generated function computes the correct value.
// It's necessary to inspect the registers in a debugger to actually verify.)
TEST(ReactorUnitTests, PreserveXMMRegisters)
{
	FunctionT<void(void *, void *)> function;
	{
		Pointer<Byte> in = function.Arg<0>();
		Pointer<Byte> out = function.Arg<1>();

		Float4 a = *Pointer<Float4>(in + 16 * 0);
		Float4 b = *Pointer<Float4>(in + 16 * 1);
		Float4 c = *Pointer<Float4>(in + 16 * 2);
		Float4 d = *Pointer<Float4>(in + 16 * 3);
		Float4 e = *Pointer<Float4>(in + 16 * 4);
		Float4 f = *Pointer<Float4>(in + 16 * 5);
		Float4 g = *Pointer<Float4>(in + 16 * 6);
		Float4 h = *Pointer<Float4>(in + 16 * 7);
		Float4 i = *Pointer<Float4>(in + 16 * 8);
		Float4 j = *Pointer<Float4>(in + 16 * 9);
		Float4 k = *Pointer<Float4>(in + 16 * 10);
		Float4 l = *Pointer<Float4>(in + 16 * 11);
		Float4 m = *Pointer<Float4>(in + 16 * 12);
		Float4 n = *Pointer<Float4>(in + 16 * 13);
		Float4 o = *Pointer<Float4>(in + 16 * 14);
		Float4 p = *Pointer<Float4>(in + 16 * 15);

		Float4 ab = a + b;
		Float4 cd = c + d;
		Float4 ef = e + f;
		Float4 gh = g + h;
		Float4 ij = i + j;
		Float4 kl = k + l;
		Float4 mn = m + n;
		Float4 op = o + p;

		Float4 abcd = ab + cd;
		Float4 efgh = ef + gh;
		Float4 ijkl = ij + kl;
		Float4 mnop = mn + op;

		Float4 abcdefgh = abcd + efgh;
		Float4 ijklmnop = ijkl + mnop;
		Float4 sum = abcdefgh + ijklmnop;
		*Pointer<Float4>(out) = sum;
		Return();
	}

	auto routine = function("one");
	assert(routine);

	float input[64] = { 1.0f, 0.0f, 0.0f, 0.0f,
		                -1.0f, 1.0f, -1.0f, 0.0f,
		                1.0f, 2.0f, -2.0f, 0.0f,
		                -1.0f, 3.0f, -3.0f, 0.0f,
		                1.0f, 4.0f, -4.0f, 0.0f,
		                -1.0f, 5.0f, -5.0f, 0.0f,
		                1.0f, 6.0f, -6.0f, 0.0f,
		                -1.0f, 7.0f, -7.0f, 0.0f,
		                1.0f, 8.0f, -8.0f, 0.0f,
		                -1.0f, 9.0f, -9.0f, 0.0f,
		                1.0f, 10.0f, -10.0f, 0.0f,
		                -1.0f, 11.0f, -11.0f, 0.0f,
		                1.0f, 12.0f, -12.0f, 0.0f,
		                -1.0f, 13.0f, -13.0f, 0.0f,
		                1.0f, 14.0f, -14.0f, 0.0f,
		                -1.0f, 15.0f, -15.0f, 0.0f };

	float result[4];

	routine(input, result);

	EXPECT_EQ(result[0], 0.0f);
	EXPECT_EQ(result[1], 120.0f);
	EXPECT_EQ(result[2], -120.0f);
	EXPECT_EQ(result[3], 0.0f);
}

template<typename T>
class CToReactorTCastTest : public ::testing::Test
{
public:
	using CType = typename std::tuple_element<0, T>::type;
	using ReactorType = typename std::tuple_element<1, T>::type;
};

using CToReactorTCastTestTypes = ::testing::Types<  // Subset of types that can be used as arguments.
                                                    //	std::pair<bool,         Bool>,    FIXME(capn): Not supported as argument type by Subzero.
                                                    //	std::pair<uint8_t,      Byte>,    FIXME(capn): Not supported as argument type by Subzero.
                                                    //	std::pair<int8_t,       SByte>,   FIXME(capn): Not supported as argument type by Subzero.
                                                    //	std::pair<int16_t,      Short>,   FIXME(capn): Not supported as argument type by Subzero.
                                                    //	std::pair<uint16_t,     UShort>,  FIXME(capn): Not supported as argument type by Subzero.
    std::pair<int, Int>,
    std::pair<unsigned int, UInt>,
    std::pair<float, Float>>;

TYPED_TEST_SUITE(CToReactorTCastTest, CToReactorTCastTestTypes);

TYPED_TEST(CToReactorTCastTest, Casts)
{
	using CType = typename TestFixture::CType;
	using ReactorType = typename TestFixture::ReactorType;

	std::shared_ptr<Routine> routine;

	{
		Function<Int(ReactorType)> function;
		{
			ReactorType a = function.template Arg<0>();
			ReactorType b = CType{};
			RValue<ReactorType> c = RValue<ReactorType>(CType{});
			Bool same = (a == b) && (a == c);
			Return(IfThenElse(same, Int(1), Int(0)));  // TODO: Ability to use Bools as return values.
		}

		routine = function("one");

		if(routine)
		{
			auto callable = (int (*)(CType))routine->getEntry();
			CType in = {};
			EXPECT_EQ(callable(in), 1);
		}
	}
}

template<typename T>
class GEPTest : public ::testing::Test
{
public:
	using CType = typename std::tuple_element<0, T>::type;
	using ReactorType = typename std::tuple_element<1, T>::type;
};

using GEPTestTypes = ::testing::Types<
    std::pair<bool, Bool>,
    std::pair<int8_t, Byte>,
    std::pair<int8_t, SByte>,
    std::pair<int8_t[4], Byte4>,
    std::pair<int8_t[4], SByte4>,
    std::pair<int8_t[8], Byte8>,
    std::pair<int8_t[8], SByte8>,
    std::pair<int8_t[16], Byte16>,
    std::pair<int8_t[16], SByte16>,
    std::pair<int16_t, Short>,
    std::pair<int16_t, UShort>,
    std::pair<int16_t[2], Short2>,
    std::pair<int16_t[2], UShort2>,
    std::pair<int16_t[4], Short4>,
    std::pair<int16_t[4], UShort4>,
    std::pair<int16_t[8], Short8>,
    std::pair<int16_t[8], UShort8>,
    std::pair<int, Int>,
    std::pair<int, UInt>,
    std::pair<int[2], Int2>,
    std::pair<int[2], UInt2>,
    std::pair<int[4], Int4>,
    std::pair<int[4], UInt4>,
    std::pair<int64_t, Long>,
    std::pair<int16_t, Half>,
    std::pair<float, Float>,
    std::pair<float[2], Float2>,
    std::pair<float[4], Float4>>;

TYPED_TEST_SUITE(GEPTest, GEPTestTypes);

TYPED_TEST(GEPTest, PtrOffsets)
{
	using CType = typename TestFixture::CType;
	using ReactorType = typename TestFixture::ReactorType;

	std::shared_ptr<Routine> routine;

	{
		Function<Pointer<ReactorType>(Pointer<ReactorType>, Int)> function;
		{
			Pointer<ReactorType> pointer = function.template Arg<0>();
			Int index = function.template Arg<1>();
			Return(&pointer[index]);
		}

		routine = function("one");

		if(routine)
		{
			auto callable = (CType * (*)(CType *, unsigned int)) routine->getEntry();

			union PtrInt
			{
				CType *p;
				size_t i;
			};

			PtrInt base;
			base.i = 0x10000;

			for(int i = 0; i < 5; i++)
			{
				PtrInt reference;
				reference.p = &base.p[i];

				PtrInt result;
				result.p = callable(base.p, i);

				auto expect = reference.i - base.i;
				auto got = result.i - base.i;

				EXPECT_EQ(got, expect) << "i:" << i;
			}
		}
	}
}

TEST(ReactorUnitTests, Coroutines_Fibonacci)
{
	if(!rr::Caps.CoroutinesSupported)
	{
		SUCCEED() << "Coroutines not supported";
		return;
	}

	Coroutine<int()> function;
	{
		Yield(Int(0));
		Yield(Int(1));
		Int current = 1;
		Int next = 1;
		While(true)
		{
			Yield(next);
			auto tmp = current + next;
			current = next;
			next = tmp;
		}
	}

	auto coroutine = function();

	int32_t expected[] = {
		0,
		1,
		1,
		2,
		3,
		5,
		8,
		13,
		21,
		34,
		55,
		89,
		144,
		233,
		377,
		610,
		987,
		1597,
		2584,
		4181,
		6765,
		10946,
		17711,
		28657,
		46368,
		75025,
		121393,
		196418,
		317811,
	};

	auto count = sizeof(expected) / sizeof(expected[0]);

	for(size_t i = 0; i < count; i++)
	{
		int out = 0;
		EXPECT_EQ(coroutine->await(out), true);
		EXPECT_EQ(out, expected[i]);
	}
}

TEST(ReactorUnitTests, Coroutines_Parameters)
{
	if(!rr::Caps.CoroutinesSupported)
	{
		SUCCEED() << "Coroutines not supported";
		return;
	}

	Coroutine<uint8_t(uint8_t * data, int count)> function;
	{
		Pointer<Byte> data = function.Arg<0>();
		Int count = function.Arg<1>();

		For(Int i = 0, i < count, i++)
		{
			Yield(data[i]);
		}
	}

	uint8_t data[] = { 10, 20, 30 };
	auto coroutine = function(&data[0], 3);

	uint8_t out = 0;
	EXPECT_EQ(coroutine->await(out), true);
	EXPECT_EQ(out, 10);
	out = 0;
	EXPECT_EQ(coroutine->await(out), true);
	EXPECT_EQ(out, 20);
	out = 0;
	EXPECT_EQ(coroutine->await(out), true);
	EXPECT_EQ(out, 30);
	out = 99;
	EXPECT_EQ(coroutine->await(out), false);
	EXPECT_EQ(out, 99);
	EXPECT_EQ(coroutine->await(out), false);
	EXPECT_EQ(out, 99);
}

template<typename TestFuncType, typename RefFuncType, typename TestValueType>
struct IntrinsicTestParams
{
	std::function<TestFuncType> testFunc;   // Function we're testing (Reactor)
	std::function<RefFuncType> refFunc;     // Reference function to test against (C)
	std::vector<TestValueType> testValues;  // Values to input to functions
};

using IntrinsicTestParams_Float = IntrinsicTestParams<RValue<Float>(RValue<Float>), float(float), float>;
using IntrinsicTestParams_Float4 = IntrinsicTestParams<RValue<Float4>(RValue<Float4>), float(float), float>;
using IntrinsicTestParams_Float4_Float4 = IntrinsicTestParams<RValue<Float4>(RValue<Float4>, RValue<Float4>), float(float, float), std::pair<float, float>>;

struct IntrinsicTest_Float : public testing::TestWithParam<IntrinsicTestParams_Float>
{
	void test()
	{
		FunctionT<float(float)> function;
		{
			Return(GetParam().testFunc((Float(function.Arg<0>()))));
		}

		auto routine = function("one");

		for(auto &&v : GetParam().testValues)
		{
			SCOPED_TRACE(v);
			EXPECT_FLOAT_EQ(routine(v), GetParam().refFunc(v));
		}
	}
};

struct IntrinsicTest_Float4 : public testing::TestWithParam<IntrinsicTestParams_Float4>
{
	void test()
	{
		FunctionT<void(float4 *)> function;
		{
			Pointer<Float4> a = function.Arg<0>();
			*a = GetParam().testFunc(*a);
			Return();
		}

		auto routine = function("one");

		for(auto &&v : GetParam().testValues)
		{
			SCOPED_TRACE(v);
			float4_value result = invokeRoutine(routine, float4_value{ v });
			float4_value expected = float4_value{ GetParam().refFunc(v) };
			EXPECT_FLOAT_EQ(result.v[0], expected.v[0]);
			EXPECT_FLOAT_EQ(result.v[1], expected.v[1]);
			EXPECT_FLOAT_EQ(result.v[2], expected.v[2]);
			EXPECT_FLOAT_EQ(result.v[3], expected.v[3]);
		}
	}
};

struct IntrinsicTest_Float4_Float4 : public testing::TestWithParam<IntrinsicTestParams_Float4_Float4>
{
	void test()
	{
		FunctionT<void(float4 *, float4 *)> function;
		{
			Pointer<Float4> a = function.Arg<0>();
			Pointer<Float4> b = function.Arg<1>();
			*a = GetParam().testFunc(*a, *b);
			Return();
		}

		auto routine = function("one");

		for(auto &&v : GetParam().testValues)
		{
			SCOPED_TRACE(v);
			float4_value result = invokeRoutine(routine, float4_value{ v.first }, float4_value{ v.second });
			float4_value expected = float4_value{ GetParam().refFunc(v.first, v.second) };
			EXPECT_FLOAT_EQ(result.v[0], expected.v[0]);
			EXPECT_FLOAT_EQ(result.v[1], expected.v[1]);
			EXPECT_FLOAT_EQ(result.v[2], expected.v[2]);
			EXPECT_FLOAT_EQ(result.v[3], expected.v[3]);
		}
	}
};

INSTANTIATE_TEST_SUITE_P(IntrinsicTestParams_Float, IntrinsicTest_Float, testing::Values(IntrinsicTestParams_Float{ [](Float v) { return rr::Exp2(v); }, exp2f, { 0.f, 1.f, 12345.f } }, IntrinsicTestParams_Float{ [](Float v) { return rr::Log2(v); }, log2f, { 0.f, 1.f, 12345.f } }, IntrinsicTestParams_Float{ [](Float v) { return rr::Sqrt(v); }, sqrtf, { 0.f, 1.f, 12345.f } }));

INSTANTIATE_TEST_SUITE_P(IntrinsicTestParams_Float4, IntrinsicTest_Float4, testing::Values(IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Sin(v); }, sinf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Cos(v); }, cosf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Tan(v); }, tanf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Asin(v); }, asinf, { 0.f, 1.f, -1.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Acos(v); }, acosf, { 0.f, 1.f, -1.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Atan(v); }, atanf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Sinh(v); }, sinhf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Cosh(v); }, coshf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Tanh(v); }, tanhf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Asinh(v); }, asinhf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Acosh(v); }, acoshf, { 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Atanh(v); }, atanhf, { 0.f, 1.f, -1.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Exp(v); }, expf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Log(v); }, logf, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Exp2(v); }, exp2f, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Log2(v); }, log2f, { 0.f, 1.f, PI, 12345.f } }, IntrinsicTestParams_Float4{ [](RValue<Float4> v) { return rr::Sqrt(v); }, sqrtf, { 0.f, 1.f, PI, 12345.f } }));

INSTANTIATE_TEST_SUITE_P(IntrinsicTestParams_Float4_Float4, IntrinsicTest_Float4_Float4, testing::Values(IntrinsicTestParams_Float4_Float4{ [](RValue<Float4> v1, RValue<Float4> v2) { return Atan2(v1, v2); }, atan2f, { { 0.f, 0.f }, { 0.f, -1.f }, { -1.f, 0.f }, { 12345.f, 12345.f } } }, IntrinsicTestParams_Float4_Float4{ [](RValue<Float4> v1, RValue<Float4> v2) { return Pow(v1, v2); }, powf, { { 0.f, 0.f }, { 0.f, -1.f }, { -1.f, 0.f }, { 12345.f, 12345.f } } }));

TEST_P(IntrinsicTest_Float, Test)
{
	test();
}
TEST_P(IntrinsicTest_Float4, Test)
{
	test();
}
TEST_P(IntrinsicTest_Float4_Float4, Test)
{
	test();
}

TEST(ReactorUnitTests, Intrinsics_Ctlz)
{
	// ctlz: counts number of leading zeros

	{
		Function<UInt(UInt x)> function;
		{
			UInt x = function.Arg<0>();
			Return(rr::Ctlz(x, false));
		}
		auto routine = function("one");
		auto callable = (uint32_t(*)(uint32_t))routine->getEntry();

		for(uint32_t i = 0; i < 31; ++i)
		{
			uint32_t result = callable(1 << i);
			EXPECT_EQ(result, 31 - i);
		}

		// Input 0 should return 32 for isZeroUndef == false
		{
			uint32_t result = callable(0);
			EXPECT_EQ(result, 32u);
		}
	}

	{
		Function<Void(Pointer<UInt4>, UInt x)> function;
		{
			Pointer<UInt4> out = function.Arg<0>();
			UInt x = function.Arg<1>();
			*out = rr::Ctlz(UInt4(x), false);
		}
		auto routine = function("one");
		auto callable = (void (*)(uint32_t *, uint32_t))routine->getEntry();

		uint32_t x[4];

		for(uint32_t i = 0; i < 31; ++i)
		{
			callable(x, 1 << i);
			EXPECT_EQ(x[0], 31 - i);
			EXPECT_EQ(x[1], 31 - i);
			EXPECT_EQ(x[2], 31 - i);
			EXPECT_EQ(x[3], 31 - i);
		}

		// Input 0 should return 32 for isZeroUndef == false
		{
			callable(x, 0);
			EXPECT_EQ(x[0], 32u);
			EXPECT_EQ(x[1], 32u);
			EXPECT_EQ(x[2], 32u);
			EXPECT_EQ(x[3], 32u);
		}
	}
}

TEST(ReactorUnitTests, Intrinsics_Cttz)
{
	// cttz: counts number of trailing zeros

	{
		Function<UInt(UInt x)> function;
		{
			UInt x = function.Arg<0>();
			Return(rr::Cttz(x, false));
		}
		auto routine = function("one");
		auto callable = (uint32_t(*)(uint32_t))routine->getEntry();

		for(uint32_t i = 0; i < 31; ++i)
		{
			uint32_t result = callable(1 << i);
			EXPECT_EQ(result, i);
		}

		// Input 0 should return 32 for isZeroUndef == false
		{
			uint32_t result = callable(0);
			EXPECT_EQ(result, 32u);
		}
	}

	{
		Function<Void(Pointer<UInt4>, UInt x)> function;
		{
			Pointer<UInt4> out = function.Arg<0>();
			UInt x = function.Arg<1>();
			*out = rr::Cttz(UInt4(x), false);
		}
		auto routine = function("one");
		auto callable = (void (*)(uint32_t *, uint32_t))routine->getEntry();

		uint32_t x[4];

		for(uint32_t i = 0; i < 31; ++i)
		{
			callable(x, 1 << i);
			EXPECT_EQ(x[0], i);
			EXPECT_EQ(x[1], i);
			EXPECT_EQ(x[2], i);
			EXPECT_EQ(x[3], i);
		}

		// Input 0 should return 32 for isZeroUndef == false
		{
			callable(x, 0);
			EXPECT_EQ(x[0], 32u);
			EXPECT_EQ(x[1], 32u);
			EXPECT_EQ(x[2], 32u);
			EXPECT_EQ(x[3], 32u);
		}
	}
}

TEST(ReactorUnitTests, Intrinsics_Scatter)
{
	Function<Void(Pointer<Float> base, Pointer<Float4> val, Pointer<Int4> offsets)> function;
	{
		Pointer<Float> base = function.Arg<0>();
		Pointer<Float4> val = function.Arg<1>();
		Pointer<Int4> offsets = function.Arg<2>();

		auto mask = Int4(~0, ~0, ~0, ~0);
		unsigned int alignment = 1;
		Scatter(base, *val, *offsets, mask, alignment);
	}

	float buffer[16] = { 0 };

	constexpr auto elemSize = sizeof(buffer[0]);

	int offsets[] = {
		1 * elemSize,
		6 * elemSize,
		11 * elemSize,
		13 * elemSize
	};

	float val[4] = { 10, 60, 110, 130 };

	auto routine = function("one");
	auto entry = (void (*)(float *, float *, int *))routine->getEntry();

	entry(buffer, val, offsets);

	EXPECT_EQ(buffer[offsets[0] / sizeof(buffer[0])], 10);
	EXPECT_EQ(buffer[offsets[1] / sizeof(buffer[0])], 60);
	EXPECT_EQ(buffer[offsets[2] / sizeof(buffer[0])], 110);
	EXPECT_EQ(buffer[offsets[3] / sizeof(buffer[0])], 130);
}

TEST(ReactorUnitTests, Intrinsics_Gather)
{
	Function<Void(Pointer<Float> base, Pointer<Int4> offsets, Pointer<Float4> result)> function;
	{
		Pointer<Float> base = function.Arg<0>();
		Pointer<Int4> offsets = function.Arg<1>();
		Pointer<Float4> result = function.Arg<2>();

		auto mask = Int4(~0, ~0, ~0, ~0);
		unsigned int alignment = 1;
		bool zeroMaskedLanes = true;
		*result = Gather(base, *offsets, mask, alignment, zeroMaskedLanes);
	}

	float buffer[] = {
		0, 10, 20, 30,
		40, 50, 60, 70,
		80, 90, 100, 110,
		120, 130, 140, 150
	};

	constexpr auto elemSize = sizeof(buffer[0]);

	int offsets[] = {
		1 * elemSize,
		6 * elemSize,
		11 * elemSize,
		13 * elemSize
	};

	auto routine = function("one");
	auto entry = (void (*)(float *, int *, float *))routine->getEntry();

	float result[4] = {};
	entry(buffer, offsets, result);

	EXPECT_EQ(result[0], 10);
	EXPECT_EQ(result[1], 60);
	EXPECT_EQ(result[2], 110);
	EXPECT_EQ(result[3], 130);
}

TEST(ReactorUnitTests, ExtractFromRValue)
{
	Function<Void(Pointer<Int4> values, Pointer<Int4> result)> function;
	{
		Pointer<Int4> vIn = function.Arg<0>();
		Pointer<Int4> resultIn = function.Arg<1>();

		RValue<Int4> v = *vIn;

		Int4 result(678);

		If(Extract(v, 0) == 42)
		{
			result = Insert(result, 1, 0);
		}

		If(Extract(v, 1) == 42)
		{
			result = Insert(result, 1, 1);
		}

		*resultIn = result;

		Return();
	}

	auto routine = function("one");
	auto entry = (void (*)(int *, int *))routine->getEntry();

	int v[4] = { 42, 42, 42, 42 };
	int result[4] = { 99, 99, 99, 99 };
	entry(v, result);
	EXPECT_EQ(result[0], 1);
	EXPECT_EQ(result[1], 1);
	EXPECT_EQ(result[2], 678);
	EXPECT_EQ(result[3], 678);
}

int main(int argc, char **argv)
{
	::testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();
}

////////////////////////////////
// Trait compile time checks. //
////////////////////////////////

// Assert CToReactorT resolves to expected types.
static_assert(std::is_same<CToReactorT<void>, Void>::value, "");
static_assert(std::is_same<CToReactorT<bool>, Bool>::value, "");
static_assert(std::is_same<CToReactorT<uint8_t>, Byte>::value, "");
static_assert(std::is_same<CToReactorT<int8_t>, SByte>::value, "");
static_assert(std::is_same<CToReactorT<int16_t>, Short>::value, "");
static_assert(std::is_same<CToReactorT<uint16_t>, UShort>::value, "");
static_assert(std::is_same<CToReactorT<int32_t>, Int>::value, "");
static_assert(std::is_same<CToReactorT<uint64_t>, Long>::value, "");
static_assert(std::is_same<CToReactorT<uint32_t>, UInt>::value, "");
static_assert(std::is_same<CToReactorT<float>, Float>::value, "");

// Assert CToReactorT for known pointer types resolves to expected types.
static_assert(std::is_same<CToReactorT<void *>, Pointer<Byte>>::value, "");
static_assert(std::is_same<CToReactorT<bool *>, Pointer<Bool>>::value, "");
static_assert(std::is_same<CToReactorT<uint8_t *>, Pointer<Byte>>::value, "");
static_assert(std::is_same<CToReactorT<int8_t *>, Pointer<SByte>>::value, "");
static_assert(std::is_same<CToReactorT<int16_t *>, Pointer<Short>>::value, "");
static_assert(std::is_same<CToReactorT<uint16_t *>, Pointer<UShort>>::value, "");
static_assert(std::is_same<CToReactorT<int32_t *>, Pointer<Int>>::value, "");
static_assert(std::is_same<CToReactorT<uint64_t *>, Pointer<Long>>::value, "");
static_assert(std::is_same<CToReactorT<uint32_t *>, Pointer<UInt>>::value, "");
static_assert(std::is_same<CToReactorT<float *>, Pointer<Float>>::value, "");
static_assert(std::is_same<CToReactorT<uint16_t **>, Pointer<Pointer<UShort>>>::value, "");
static_assert(std::is_same<CToReactorT<uint16_t ***>, Pointer<Pointer<Pointer<UShort>>>>::value, "");

// Assert CToReactorT for unknown pointer types resolves to Pointer<Byte>.
struct S
{};
static_assert(std::is_same<CToReactorT<S *>, Pointer<Byte>>::value, "");
static_assert(std::is_same<CToReactorT<S **>, Pointer<Pointer<Byte>>>::value, "");
static_assert(std::is_same<CToReactorT<S ***>, Pointer<Pointer<Pointer<Byte>>>>::value, "");

// Assert IsRValue<> resolves true for RValue<> types.
static_assert(IsRValue<RValue<Void>>::value, "");
static_assert(IsRValue<RValue<Bool>>::value, "");
static_assert(IsRValue<RValue<Byte>>::value, "");
static_assert(IsRValue<RValue<SByte>>::value, "");
static_assert(IsRValue<RValue<Short>>::value, "");
static_assert(IsRValue<RValue<UShort>>::value, "");
static_assert(IsRValue<RValue<Int>>::value, "");
static_assert(IsRValue<RValue<Long>>::value, "");
static_assert(IsRValue<RValue<UInt>>::value, "");
static_assert(IsRValue<RValue<Float>>::value, "");

// Assert IsLValue<> resolves true for LValue types.
static_assert(IsLValue<Bool>::value, "");
static_assert(IsLValue<Byte>::value, "");
static_assert(IsLValue<SByte>::value, "");
static_assert(IsLValue<Short>::value, "");
static_assert(IsLValue<UShort>::value, "");
static_assert(IsLValue<Int>::value, "");
static_assert(IsLValue<Long>::value, "");
static_assert(IsLValue<UInt>::value, "");
static_assert(IsLValue<Float>::value, "");

// Assert IsReference<> resolves true for Reference types.
static_assert(IsReference<Reference<Bool>>::value, "");
static_assert(IsReference<Reference<Byte>>::value, "");
static_assert(IsReference<Reference<SByte>>::value, "");
static_assert(IsReference<Reference<Short>>::value, "");
static_assert(IsReference<Reference<UShort>>::value, "");
static_assert(IsReference<Reference<Int>>::value, "");
static_assert(IsReference<Reference<Long>>::value, "");
static_assert(IsReference<Reference<UInt>>::value, "");
static_assert(IsReference<Reference<Float>>::value, "");

// Assert IsRValue<> resolves false for LValue types.
static_assert(!IsRValue<Void>::value, "");
static_assert(!IsRValue<Bool>::value, "");
static_assert(!IsRValue<Byte>::value, "");
static_assert(!IsRValue<SByte>::value, "");
static_assert(!IsRValue<Short>::value, "");
static_assert(!IsRValue<UShort>::value, "");
static_assert(!IsRValue<Int>::value, "");
static_assert(!IsRValue<Long>::value, "");
static_assert(!IsRValue<UInt>::value, "");
static_assert(!IsRValue<Float>::value, "");

// Assert IsRValue<> resolves false for Reference types.
static_assert(!IsRValue<Reference<Void>>::value, "");
static_assert(!IsRValue<Reference<Bool>>::value, "");
static_assert(!IsRValue<Reference<Byte>>::value, "");
static_assert(!IsRValue<Reference<SByte>>::value, "");
static_assert(!IsRValue<Reference<Short>>::value, "");
static_assert(!IsRValue<Reference<UShort>>::value, "");
static_assert(!IsRValue<Reference<Int>>::value, "");
static_assert(!IsRValue<Reference<Long>>::value, "");
static_assert(!IsRValue<Reference<UInt>>::value, "");
static_assert(!IsRValue<Reference<Float>>::value, "");

// Assert IsRValue<> resolves false for C types.
static_assert(!IsRValue<void>::value, "");
static_assert(!IsRValue<bool>::value, "");
static_assert(!IsRValue<uint8_t>::value, "");
static_assert(!IsRValue<int8_t>::value, "");
static_assert(!IsRValue<int16_t>::value, "");
static_assert(!IsRValue<uint16_t>::value, "");
static_assert(!IsRValue<int32_t>::value, "");
static_assert(!IsRValue<uint64_t>::value, "");
static_assert(!IsRValue<uint32_t>::value, "");
static_assert(!IsRValue<float>::value, "");

// Assert IsLValue<> resolves false for RValue<> types.
static_assert(!IsLValue<RValue<Void>>::value, "");
static_assert(!IsLValue<RValue<Bool>>::value, "");
static_assert(!IsLValue<RValue<Byte>>::value, "");
static_assert(!IsLValue<RValue<SByte>>::value, "");
static_assert(!IsLValue<RValue<Short>>::value, "");
static_assert(!IsLValue<RValue<UShort>>::value, "");
static_assert(!IsLValue<RValue<Int>>::value, "");
static_assert(!IsLValue<RValue<Long>>::value, "");
static_assert(!IsLValue<RValue<UInt>>::value, "");
static_assert(!IsLValue<RValue<Float>>::value, "");

// Assert IsLValue<> resolves false for Void type.
static_assert(!IsLValue<Void>::value, "");

// Assert IsLValue<> resolves false for Reference<> types.
static_assert(!IsLValue<Reference<Void>>::value, "");
static_assert(!IsLValue<Reference<Bool>>::value, "");
static_assert(!IsLValue<Reference<Byte>>::value, "");
static_assert(!IsLValue<Reference<SByte>>::value, "");
static_assert(!IsLValue<Reference<Short>>::value, "");
static_assert(!IsLValue<Reference<UShort>>::value, "");
static_assert(!IsLValue<Reference<Int>>::value, "");
static_assert(!IsLValue<Reference<Long>>::value, "");
static_assert(!IsLValue<Reference<UInt>>::value, "");
static_assert(!IsLValue<Reference<Float>>::value, "");

// Assert IsLValue<> resolves false for C types.
static_assert(!IsLValue<void>::value, "");
static_assert(!IsLValue<bool>::value, "");
static_assert(!IsLValue<uint8_t>::value, "");
static_assert(!IsLValue<int8_t>::value, "");
static_assert(!IsLValue<int16_t>::value, "");
static_assert(!IsLValue<uint16_t>::value, "");
static_assert(!IsLValue<int32_t>::value, "");
static_assert(!IsLValue<uint64_t>::value, "");
static_assert(!IsLValue<uint32_t>::value, "");
static_assert(!IsLValue<float>::value, "");

// Assert IsDefined<> resolves true for RValue<> types.
static_assert(IsDefined<RValue<Void>>::value, "");
static_assert(IsDefined<RValue<Bool>>::value, "");
static_assert(IsDefined<RValue<Byte>>::value, "");
static_assert(IsDefined<RValue<SByte>>::value, "");
static_assert(IsDefined<RValue<Short>>::value, "");
static_assert(IsDefined<RValue<UShort>>::value, "");
static_assert(IsDefined<RValue<Int>>::value, "");
static_assert(IsDefined<RValue<Long>>::value, "");
static_assert(IsDefined<RValue<UInt>>::value, "");
static_assert(IsDefined<RValue<Float>>::value, "");

// Assert IsDefined<> resolves true for LValue types.
static_assert(IsDefined<Void>::value, "");
static_assert(IsDefined<Bool>::value, "");
static_assert(IsDefined<Byte>::value, "");
static_assert(IsDefined<SByte>::value, "");
static_assert(IsDefined<Short>::value, "");
static_assert(IsDefined<UShort>::value, "");
static_assert(IsDefined<Int>::value, "");
static_assert(IsDefined<Long>::value, "");
static_assert(IsDefined<UInt>::value, "");
static_assert(IsDefined<Float>::value, "");

// Assert IsDefined<> resolves true for Reference<> types.
static_assert(IsDefined<Reference<Bool>>::value, "");
static_assert(IsDefined<Reference<Byte>>::value, "");
static_assert(IsDefined<Reference<SByte>>::value, "");
static_assert(IsDefined<Reference<Short>>::value, "");
static_assert(IsDefined<Reference<UShort>>::value, "");
static_assert(IsDefined<Reference<Int>>::value, "");
static_assert(IsDefined<Reference<Long>>::value, "");
static_assert(IsDefined<Reference<UInt>>::value, "");
static_assert(IsDefined<Reference<Float>>::value, "");

// Assert IsDefined<> resolves true for C types.
static_assert(IsDefined<void>::value, "");
static_assert(IsDefined<bool>::value, "");
static_assert(IsDefined<uint8_t>::value, "");
static_assert(IsDefined<int8_t>::value, "");
static_assert(IsDefined<int16_t>::value, "");
static_assert(IsDefined<uint16_t>::value, "");
static_assert(IsDefined<int32_t>::value, "");
static_assert(IsDefined<uint64_t>::value, "");
static_assert(IsDefined<uint32_t>::value, "");
static_assert(IsDefined<float>::value, "");
