Implement square root and reciprocal.

Bug swiftshader:15

Change-Id: If9336a87f90269a295fcd3b3bff2fd6899c773e4
Reviewed-on: https://swiftshader-review.googlesource.com/7910
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8154
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index b637cd9..d2833c9 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -5759,17 +5759,24 @@
 
 	RValue<Float> Rcp_pp(RValue<Float> x, bool exactAtPow2)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
+		return 1.0f / x;
 	}
 
 	RValue<Float> RcpSqrt_pp(RValue<Float> x)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
+		return Rcp_pp(Sqrt(x));
 	}
 
 	RValue<Float> Sqrt(RValue<Float> x)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
+		Ice::Variable *result = ::function->makeVariable(Ice::IceType_f32);
+		const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
+		auto target = ::context->getConstantUndef(Ice::IceType_i32);
+		auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
+		sqrt->addArg(x.value);
+		::basicBlock->appendInst(sqrt);
+
+		return RValue<Float>(V(result));
 	}
 
 	RValue<Float> Round(RValue<Float> x)
@@ -6073,17 +6080,24 @@
 
 	RValue<Float4> Rcp_pp(RValue<Float4> x, bool exactAtPow2)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
+		return Float4(1.0f) / x;
 	}
 
 	RValue<Float4> RcpSqrt_pp(RValue<Float4> x)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
+		return Rcp_pp(Sqrt(x));
 	}
 
 	RValue<Float4> Sqrt(RValue<Float4> x)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
+		Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
+		const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
+		auto target = ::context->getConstantUndef(Ice::IceType_i32);
+		auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
+		sqrt->addArg(x.value);
+		::basicBlock->appendInst(sqrt);
+
+		return RValue<Float4>(V(result));
 	}
 
 	RValue<Float4> Insert(const Float4 &val, RValue<Float> element, int i)
diff --git a/third_party/pnacl-subzero b/third_party/pnacl-subzero
index a3688ea..956cfd6 160000
--- a/third_party/pnacl-subzero
+++ b/third_party/pnacl-subzero
@@ -1 +1 @@
-Subproject commit a3688eaffa0b11e21b7dc48bbba514fc3f999198
+Subproject commit 956cfd60e8ee9efcc374cd19513bbf35a20e52ee