Add Float to UInt unit test

Conversion from floating-point to unsigned integer is not a native
instruction on some CPU architectures, so excercise the case where it
overflows signed int.

Bug: b/31816482
Change-Id: I4ce924bbf4eb4c371e25d800fd4d7794edfa62cb
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39188
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/ReactorUnitTests.cpp b/src/Reactor/ReactorUnitTests.cpp
index 62249a6..b97894b 100644
--- a/src/Reactor/ReactorUnitTests.cpp
+++ b/src/Reactor/ReactorUnitTests.cpp
@@ -808,6 +808,44 @@
 
 }
 
+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)
 {
 	{