/*-------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2015 Google Inc.
 * Copyright (c) 2016 The Khronos Group Inc.
 *
 * 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.
 *
 *//*!
 * \file
 * \brief SPIR-V Assembly Tests for Instructions (special opcode/operand)
 *//*--------------------------------------------------------------------*/

#include "vktSpvAsmInstructionTests.hpp"
#include "vktAmberTestCase.hpp"

#include "tcuCommandLine.hpp"
#include "tcuFormatUtil.hpp"
#include "tcuFloat.hpp"
#include "tcuFloatFormat.hpp"
#include "tcuRGBA.hpp"
#include "tcuStringTemplate.hpp"
#include "tcuTestLog.hpp"
#include "tcuVectorUtil.hpp"
#include "tcuInterval.hpp"

#include "vkDefs.hpp"
#include "vkDeviceUtil.hpp"
#include "vkMemUtil.hpp"
#include "vkPlatform.hpp"
#include "vkPrograms.hpp"
#include "vkQueryUtil.hpp"
#include "vkRef.hpp"
#include "vkRefUtil.hpp"
#include "vkStrUtil.hpp"
#include "vkTypeUtil.hpp"

#include "deStringUtil.hpp"
#include "deUniquePtr.hpp"
#include "deMath.h"
#include "deRandom.hpp"
#include "tcuStringTemplate.hpp"

#include "vktSpvAsmCrossStageInterfaceTests.hpp"
#include "vktSpvAsm8bitStorageTests.hpp"
#include "vktSpvAsm16bitStorageTests.hpp"
#include "vktSpvAsmUboMatrixPaddingTests.hpp"
#include "vktSpvAsmConditionalBranchTests.hpp"
#include "vktSpvAsmIndexingTests.hpp"
#include "vktSpvAsmImageSamplerTests.hpp"
#include "vktSpvAsmComputeShaderCase.hpp"
#include "vktSpvAsmComputeShaderTestUtil.hpp"
#include "vktSpvAsmFloatControlsTests.hpp"
#include "vktSpvAsmFromHlslTests.hpp"
#include "vktSpvAsmGraphicsShaderTestUtil.hpp"
#include "vktSpvAsmVariablePointersTests.hpp"
#include "vktSpvAsmVariableInitTests.hpp"
#include "vktSpvAsmPointerParameterTests.hpp"
#include "vktSpvAsmSpirvVersion1p4Tests.hpp"
#include "vktSpvAsmSpirvVersionTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSpvAsmLoopDepLenTests.hpp"
#include "vktSpvAsmLoopDepInfTests.hpp"
#include "vktSpvAsmCompositeInsertTests.hpp"
#include "vktSpvAsmVaryingNameTests.hpp"
#include "vktSpvAsmWorkgroupMemoryTests.hpp"
#include "vktSpvAsmSignedIntCompareTests.hpp"
#include "vktSpvAsmPtrAccessChainTests.hpp"
#include "vktSpvAsmFloatControlsExtensionlessTests.hpp"
#include "vktSpvAsmNonSemanticInfoTests.hpp"
#include "vktSpvAsm64bitCompareTests.hpp"

#include <cmath>
#include <limits>
#include <map>
#include <string>
#include <sstream>
#include <utility>
#include <stack>

namespace vkt
{
namespace SpirVAssembly
{

namespace
{

using namespace vk;
using std::map;
using std::string;
using std::vector;
using tcu::IVec3;
using tcu::IVec4;
using tcu::RGBA;
using tcu::TestLog;
using tcu::TestStatus;
using tcu::Vec4;
using de::UniquePtr;
using tcu::StringTemplate;
using tcu::Vec4;

const bool TEST_WITH_NAN	= true;
const bool TEST_WITHOUT_NAN	= false;

const string loadScalarF16FromUint =
	"%ld_arg_${var} = OpFunction %f16 None %f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_conv = OpBitcast %u32 %ld_arg_${var}_param\n"
	"%ld_arg_${var}_div = OpUDiv %u32 %ld_arg_${var}_conv %c_u32_2\n"
	"%ld_arg_${var}_and_low = OpBitwiseAnd %u32 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_div\n"
	"%ld_arg_${var}_ld = OpLoad %u32 %ld_arg_${var}_gep\n"
	"%ld_arg_${var}_unpack = OpBitcast %v2f16 %ld_arg_${var}_ld\n"
	"%ld_arg_${var}_ex = OpVectorExtractDynamic %f16 %ld_arg_${var}_unpack %ld_arg_${var}_and_low\n"
	"OpReturnValue %ld_arg_${var}_ex\n"
	"OpFunctionEnd\n";

const string loadV2F16FromUint =
	"%ld_arg_${var} = OpFunction %v2f16 None %v2f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param\n"
	"%ld_arg_${var}_ld = OpLoad %u32 %ld_arg_${var}_gep\n"
	"%ld_arg_${var}_cast = OpBitcast %v2f16 %ld_arg_${var}_ld\n"
	"OpReturnValue %ld_arg_${var}_cast\n"
	"OpFunctionEnd\n";

const string loadV3F16FromUints =
	// Since we allocate a vec4 worth of values, this case is almost the
	// same as that case.
	"%ld_arg_${var} = OpFunction %v3f16 None %v3f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_ld0 = OpLoad %u32 %ld_arg_${var}_gep0\n"
	"%ld_arg_${var}_bc0 = OpBitcast %v2f16 %ld_arg_${var}_ld0\n"
	"%ld_arg_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_ld1 = OpLoad %u32 %ld_arg_${var}_gep1\n"
	"%ld_arg_${var}_bc1 = OpBitcast %v2f16 %ld_arg_${var}_ld1\n"
	"%ld_arg_${var}_shuffle = OpVectorShuffle %v3f16 %ld_arg_${var}_bc0 %ld_arg_${var}_bc1 0 1 2\n"
	"OpReturnValue %ld_arg_${var}_shuffle\n"
	"OpFunctionEnd\n";

const string loadV4F16FromUints =
	"%ld_arg_${var} = OpFunction %v4f16 None %v4f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_ld0 = OpLoad %u32 %ld_arg_${var}_gep0\n"
	"%ld_arg_${var}_bc0 = OpBitcast %v2f16 %ld_arg_${var}_ld0\n"
	"%ld_arg_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_ld1 = OpLoad %u32 %ld_arg_${var}_gep1\n"
	"%ld_arg_${var}_bc1 = OpBitcast %v2f16 %ld_arg_${var}_ld1\n"
	"%ld_arg_${var}_shuffle = OpVectorShuffle %v4f16 %ld_arg_${var}_bc0 %ld_arg_${var}_bc1 0 1 2 3\n"
	"OpReturnValue %ld_arg_${var}_shuffle\n"
	"OpFunctionEnd\n";

const string loadM2x2F16FromUints =
	"%ld_arg_${var} = OpFunction %m2x2f16 None %m2x2f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_ld0 = OpLoad %u32 %ld_arg_${var}_gep0\n"
	"%ld_arg_${var}_bc0 = OpBitcast %v2f16 %ld_arg_${var}_ld0\n"
	"%ld_arg_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_ld1 = OpLoad %u32 %ld_arg_${var}_gep1\n"
	"%ld_arg_${var}_bc1 = OpBitcast %v2f16 %ld_arg_${var}_ld1\n"
	"%ld_arg_${var}_cons = OpCompositeConstruct %m2x2f16 %ld_arg_${var}_bc0 %ld_arg_${var}_bc1\n"
	"OpReturnValue %ld_arg_${var}_cons\n"
	"OpFunctionEnd\n";

const string loadM2x3F16FromUints =
	"%ld_arg_${var} = OpFunction %m2x3f16 None %m2x3f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_ld00 = OpLoad %u32 %ld_arg_${var}_gep00\n"
	"%ld_arg_${var}_ld01 = OpLoad %u32 %ld_arg_${var}_gep01\n"
	"%ld_arg_${var}_ld10 = OpLoad %u32 %ld_arg_${var}_gep10\n"
	"%ld_arg_${var}_ld11 = OpLoad %u32 %ld_arg_${var}_gep11\n"
	"%ld_arg_${var}_bc00 = OpBitcast %v2f16 %ld_arg_${var}_ld00\n"
	"%ld_arg_${var}_bc01 = OpBitcast %v2f16 %ld_arg_${var}_ld01\n"
	"%ld_arg_${var}_bc10 = OpBitcast %v2f16 %ld_arg_${var}_ld10\n"
	"%ld_arg_${var}_bc11 = OpBitcast %v2f16 %ld_arg_${var}_ld11\n"
	"%ld_arg_${var}_vec0 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc00 %ld_arg_${var}_bc01 0 1 2\n"
	"%ld_arg_${var}_vec1 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc10 %ld_arg_${var}_bc11 0 1 2\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m2x3f16 %ld_arg_${var}_vec0 %ld_arg_${var}_vec1\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM2x4F16FromUints =
	"%ld_arg_${var} = OpFunction %m2x4f16 None %m2x4f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_ld00 = OpLoad %u32 %ld_arg_${var}_gep00\n"
	"%ld_arg_${var}_ld01 = OpLoad %u32 %ld_arg_${var}_gep01\n"
	"%ld_arg_${var}_ld10 = OpLoad %u32 %ld_arg_${var}_gep10\n"
	"%ld_arg_${var}_ld11 = OpLoad %u32 %ld_arg_${var}_gep11\n"
	"%ld_arg_${var}_bc00 = OpBitcast %v2f16 %ld_arg_${var}_ld00\n"
	"%ld_arg_${var}_bc01 = OpBitcast %v2f16 %ld_arg_${var}_ld01\n"
	"%ld_arg_${var}_bc10 = OpBitcast %v2f16 %ld_arg_${var}_ld10\n"
	"%ld_arg_${var}_bc11 = OpBitcast %v2f16 %ld_arg_${var}_ld11\n"
	"%ld_arg_${var}_vec0 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc00 %ld_arg_${var}_bc01 0 1 2 3\n"
	"%ld_arg_${var}_vec1 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc10 %ld_arg_${var}_bc11 0 1 2 3\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m2x4f16 %ld_arg_${var}_vec0 %ld_arg_${var}_vec1\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM3x2F16FromUints =
	"%ld_arg_${var} = OpFunction %m3x2f16 None %m3x2f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep2 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_ld0 = OpLoad %u32 %ld_arg_${var}_gep0\n"
	"%ld_arg_${var}_ld1 = OpLoad %u32 %ld_arg_${var}_gep1\n"
	"%ld_arg_${var}_ld2 = OpLoad %u32 %ld_arg_${var}_gep2\n"
	"%ld_arg_${var}_bc0 = OpBitcast %v2f16 %ld_arg_${var}_ld0\n"
	"%ld_arg_${var}_bc1 = OpBitcast %v2f16 %ld_arg_${var}_ld1\n"
	"%ld_arg_${var}_bc2 = OpBitcast %v2f16 %ld_arg_${var}_ld2\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m3x2f16 %ld_arg_${var}_bc0 %ld_arg_${var}_bc1 %ld_arg_${var}_bc2\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM3x3F16FromUints =
	"%ld_arg_${var} = OpFunction %m3x3f16 None %m3x3f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_4\n"
	"%ld_arg_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_5\n"
	"%ld_arg_${var}_ld00 = OpLoad %u32 %ld_arg_${var}_gep00\n"
	"%ld_arg_${var}_ld01 = OpLoad %u32 %ld_arg_${var}_gep01\n"
	"%ld_arg_${var}_ld10 = OpLoad %u32 %ld_arg_${var}_gep10\n"
	"%ld_arg_${var}_ld11 = OpLoad %u32 %ld_arg_${var}_gep11\n"
	"%ld_arg_${var}_ld20 = OpLoad %u32 %ld_arg_${var}_gep20\n"
	"%ld_arg_${var}_ld21 = OpLoad %u32 %ld_arg_${var}_gep21\n"
	"%ld_arg_${var}_bc00 = OpBitcast %v2f16 %ld_arg_${var}_ld00\n"
	"%ld_arg_${var}_bc01 = OpBitcast %v2f16 %ld_arg_${var}_ld01\n"
	"%ld_arg_${var}_bc10 = OpBitcast %v2f16 %ld_arg_${var}_ld10\n"
	"%ld_arg_${var}_bc11 = OpBitcast %v2f16 %ld_arg_${var}_ld11\n"
	"%ld_arg_${var}_bc20 = OpBitcast %v2f16 %ld_arg_${var}_ld20\n"
	"%ld_arg_${var}_bc21 = OpBitcast %v2f16 %ld_arg_${var}_ld21\n"
	"%ld_arg_${var}_vec0 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc00 %ld_arg_${var}_bc01 0 1 2\n"
	"%ld_arg_${var}_vec1 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc10 %ld_arg_${var}_bc11 0 1 2\n"
	"%ld_arg_${var}_vec2 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc20 %ld_arg_${var}_bc21 0 1 2\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m3x3f16 %ld_arg_${var}_vec0 %ld_arg_${var}_vec1 %ld_arg_${var}_vec2\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM3x4F16FromUints =
	"%ld_arg_${var} = OpFunction %m3x4f16 None %m3x4f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_4\n"
	"%ld_arg_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_5\n"
	"%ld_arg_${var}_ld00 = OpLoad %u32 %ld_arg_${var}_gep00\n"
	"%ld_arg_${var}_ld01 = OpLoad %u32 %ld_arg_${var}_gep01\n"
	"%ld_arg_${var}_ld10 = OpLoad %u32 %ld_arg_${var}_gep10\n"
	"%ld_arg_${var}_ld11 = OpLoad %u32 %ld_arg_${var}_gep11\n"
	"%ld_arg_${var}_ld20 = OpLoad %u32 %ld_arg_${var}_gep20\n"
	"%ld_arg_${var}_ld21 = OpLoad %u32 %ld_arg_${var}_gep21\n"
	"%ld_arg_${var}_bc00 = OpBitcast %v2f16 %ld_arg_${var}_ld00\n"
	"%ld_arg_${var}_bc01 = OpBitcast %v2f16 %ld_arg_${var}_ld01\n"
	"%ld_arg_${var}_bc10 = OpBitcast %v2f16 %ld_arg_${var}_ld10\n"
	"%ld_arg_${var}_bc11 = OpBitcast %v2f16 %ld_arg_${var}_ld11\n"
	"%ld_arg_${var}_bc20 = OpBitcast %v2f16 %ld_arg_${var}_ld20\n"
	"%ld_arg_${var}_bc21 = OpBitcast %v2f16 %ld_arg_${var}_ld21\n"
	"%ld_arg_${var}_vec0 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc00 %ld_arg_${var}_bc01 0 1 2 3\n"
	"%ld_arg_${var}_vec1 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc10 %ld_arg_${var}_bc11 0 1 2 3\n"
	"%ld_arg_${var}_vec2 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc20 %ld_arg_${var}_bc21 0 1 2 3\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m3x4f16 %ld_arg_${var}_vec0 %ld_arg_${var}_vec1 %ld_arg_${var}_vec2\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM4x2F16FromUints =
	"%ld_arg_${var} = OpFunction %m4x2f16 None %m4x2f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep2 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep3 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_ld0 = OpLoad %u32 %ld_arg_${var}_gep0\n"
	"%ld_arg_${var}_ld1 = OpLoad %u32 %ld_arg_${var}_gep1\n"
	"%ld_arg_${var}_ld2 = OpLoad %u32 %ld_arg_${var}_gep2\n"
	"%ld_arg_${var}_ld3 = OpLoad %u32 %ld_arg_${var}_gep3\n"
	"%ld_arg_${var}_bc0 = OpBitcast %v2f16 %ld_arg_${var}_ld0\n"
	"%ld_arg_${var}_bc1 = OpBitcast %v2f16 %ld_arg_${var}_ld1\n"
	"%ld_arg_${var}_bc2 = OpBitcast %v2f16 %ld_arg_${var}_ld2\n"
	"%ld_arg_${var}_bc3 = OpBitcast %v2f16 %ld_arg_${var}_ld3\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m4x2f16 %ld_arg_${var}_bc0 %ld_arg_${var}_bc1 %ld_arg_${var}_bc2 %ld_arg_${var}_bc3\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM4x3F16FromUints =
	"%ld_arg_${var} = OpFunction %m4x3f16 None %m4x3f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_4\n"
	"%ld_arg_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_5\n"
	"%ld_arg_${var}_gep30 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_6\n"
	"%ld_arg_${var}_gep31 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_7\n"
	"%ld_arg_${var}_ld00 = OpLoad %u32 %ld_arg_${var}_gep00\n"
	"%ld_arg_${var}_ld01 = OpLoad %u32 %ld_arg_${var}_gep01\n"
	"%ld_arg_${var}_ld10 = OpLoad %u32 %ld_arg_${var}_gep10\n"
	"%ld_arg_${var}_ld11 = OpLoad %u32 %ld_arg_${var}_gep11\n"
	"%ld_arg_${var}_ld20 = OpLoad %u32 %ld_arg_${var}_gep20\n"
	"%ld_arg_${var}_ld21 = OpLoad %u32 %ld_arg_${var}_gep21\n"
	"%ld_arg_${var}_ld30 = OpLoad %u32 %ld_arg_${var}_gep30\n"
	"%ld_arg_${var}_ld31 = OpLoad %u32 %ld_arg_${var}_gep31\n"
	"%ld_arg_${var}_bc00 = OpBitcast %v2f16 %ld_arg_${var}_ld00\n"
	"%ld_arg_${var}_bc01 = OpBitcast %v2f16 %ld_arg_${var}_ld01\n"
	"%ld_arg_${var}_bc10 = OpBitcast %v2f16 %ld_arg_${var}_ld10\n"
	"%ld_arg_${var}_bc11 = OpBitcast %v2f16 %ld_arg_${var}_ld11\n"
	"%ld_arg_${var}_bc20 = OpBitcast %v2f16 %ld_arg_${var}_ld20\n"
	"%ld_arg_${var}_bc21 = OpBitcast %v2f16 %ld_arg_${var}_ld21\n"
	"%ld_arg_${var}_bc30 = OpBitcast %v2f16 %ld_arg_${var}_ld30\n"
	"%ld_arg_${var}_bc31 = OpBitcast %v2f16 %ld_arg_${var}_ld31\n"
	"%ld_arg_${var}_vec0 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc00 %ld_arg_${var}_bc01 0 1 2\n"
	"%ld_arg_${var}_vec1 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc10 %ld_arg_${var}_bc11 0 1 2\n"
	"%ld_arg_${var}_vec2 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc20 %ld_arg_${var}_bc21 0 1 2\n"
	"%ld_arg_${var}_vec3 = OpVectorShuffle %v3f16 %ld_arg_${var}_bc30 %ld_arg_${var}_bc31 0 1 2\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m4x3f16 %ld_arg_${var}_vec0 %ld_arg_${var}_vec1 %ld_arg_${var}_vec2 %ld_arg_${var}_vec3\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string loadM4x4F16FromUints =
	"%ld_arg_${var} = OpFunction %m4x4f16 None %m4x4f16_i32_fn\n"
	"%ld_arg_${var}_param = OpFunctionParameter %i32\n"
	"%ld_arg_${var}_entry = OpLabel\n"
	"%ld_arg_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_0\n"
	"%ld_arg_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_1\n"
	"%ld_arg_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_2\n"
	"%ld_arg_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_3\n"
	"%ld_arg_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_4\n"
	"%ld_arg_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_5\n"
	"%ld_arg_${var}_gep30 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_6\n"
	"%ld_arg_${var}_gep31 = OpAccessChain %up_u32 %${var} %c_u32_0 %ld_arg_${var}_param %c_u32_7\n"
	"%ld_arg_${var}_ld00 = OpLoad %u32 %ld_arg_${var}_gep00\n"
	"%ld_arg_${var}_ld01 = OpLoad %u32 %ld_arg_${var}_gep01\n"
	"%ld_arg_${var}_ld10 = OpLoad %u32 %ld_arg_${var}_gep10\n"
	"%ld_arg_${var}_ld11 = OpLoad %u32 %ld_arg_${var}_gep11\n"
	"%ld_arg_${var}_ld20 = OpLoad %u32 %ld_arg_${var}_gep20\n"
	"%ld_arg_${var}_ld21 = OpLoad %u32 %ld_arg_${var}_gep21\n"
	"%ld_arg_${var}_ld30 = OpLoad %u32 %ld_arg_${var}_gep30\n"
	"%ld_arg_${var}_ld31 = OpLoad %u32 %ld_arg_${var}_gep31\n"
	"%ld_arg_${var}_bc00 = OpBitcast %v2f16 %ld_arg_${var}_ld00\n"
	"%ld_arg_${var}_bc01 = OpBitcast %v2f16 %ld_arg_${var}_ld01\n"
	"%ld_arg_${var}_bc10 = OpBitcast %v2f16 %ld_arg_${var}_ld10\n"
	"%ld_arg_${var}_bc11 = OpBitcast %v2f16 %ld_arg_${var}_ld11\n"
	"%ld_arg_${var}_bc20 = OpBitcast %v2f16 %ld_arg_${var}_ld20\n"
	"%ld_arg_${var}_bc21 = OpBitcast %v2f16 %ld_arg_${var}_ld21\n"
	"%ld_arg_${var}_bc30 = OpBitcast %v2f16 %ld_arg_${var}_ld30\n"
	"%ld_arg_${var}_bc31 = OpBitcast %v2f16 %ld_arg_${var}_ld31\n"
	"%ld_arg_${var}_vec0 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc00 %ld_arg_${var}_bc01 0 1 2 3\n"
	"%ld_arg_${var}_vec1 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc10 %ld_arg_${var}_bc11 0 1 2 3\n"
	"%ld_arg_${var}_vec2 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc20 %ld_arg_${var}_bc21 0 1 2 3\n"
	"%ld_arg_${var}_vec3 = OpVectorShuffle %v4f16 %ld_arg_${var}_bc30 %ld_arg_${var}_bc31 0 1 2 3\n"
	"%ld_arg_${var}_mat = OpCompositeConstruct %m4x4f16 %ld_arg_${var}_vec0 %ld_arg_${var}_vec1 %ld_arg_${var}_vec2 %ld_arg_${var}_vec3\n"
	"OpReturnValue %ld_arg_${var}_mat\n"
	"OpFunctionEnd\n";

const string storeScalarF16AsUint =
	// This version is sensitive to the initial value in the output buffer.
	// The infrastructure sets all output buffer bits to one before invoking
	// the shader so this version uses an atomic and to generate the correct
	// zeroes.
	"%st_fn_${var} = OpFunction %void None %void_f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_and_low = OpBitwiseAnd %u32 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_zero_vec = OpBitcast %v2f16 %c_u32_0\n"
	"%st_fn_${var}_insert = OpVectorInsertDynamic %v2f16 %st_fn_${var}_zero_vec %st_fn_${var}_param1 %st_fn_${var}_and_low\n"
	"%st_fn_${var}_odd = OpIEqual %bool %st_fn_${var}_and_low %c_u32_1\n"
	// Or 16 bits of ones into the half that was not populated with the result.
	"%st_fn_${var}_sel = OpSelect %u32 %st_fn_${var}_odd %c_u32_low_ones %c_u32_high_ones\n"
	"%st_fn_${var}_cast = OpBitcast %u32 %st_fn_${var}_insert\n"
	"%st_fn_${var}_or = OpBitwiseOr %u32 %st_fn_${var}_cast %st_fn_${var}_sel\n"
	"%st_fn_${var}_conv = OpBitcast %u32 %st_fn_${var}_param2\n"
	"%st_fn_${var}_div = OpUDiv %u32 %st_fn_${var}_conv %c_u32_2\n"
	"%st_fn_${var}_gep = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_div\n"
	"%st_fn_${var}_and = OpAtomicAnd %u32 %st_fn_${var}_gep %c_u32_1 %c_u32_0 %st_fn_${var}_or\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeV2F16AsUint =
	"%st_fn_${var} = OpFunction %void None %void_v2f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %v2f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_cast = OpBitcast %u32 %st_fn_${var}_param1\n"
	"%st_fn_${var}_gep = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2\n"
	"OpStore %st_fn_${var}_gep %st_fn_${var}_cast\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeV3F16AsUints =
	// Since we allocate a vec4 worth of values, this case can be treated
	// almost the same as a vec4 case. We will store some extra data that
	// should not be compared.
	"%st_fn_${var} = OpFunction %void None %void_v3f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %v3f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_shuffle0 = OpVectorShuffle %v2f16 %st_fn_${var}_param1 %st_fn_${var}_param1 0 1\n"
	"%st_fn_${var}_shuffle1 = OpVectorShuffle %v2f16 %st_fn_${var}_param1 %st_fn_${var}_param1 2 3\n"
	"%st_fn_${var}_bc0 = OpBitcast %u32 %st_fn_${var}_shuffle0\n"
	"%st_fn_${var}_bc1 = OpBitcast %u32 %st_fn_${var}_shuffle1\n"
	"%st_fn_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"OpStore %st_fn_${var}_gep0 %st_fn_${var}_bc0\n"
	"OpStore %st_fn_${var}_gep1 %st_fn_${var}_bc1\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeV4F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_v4f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %v4f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_shuffle0 = OpVectorShuffle %v2f16 %st_fn_${var}_param1 %st_fn_${var}_param1 0 1\n"
	"%st_fn_${var}_shuffle1 = OpVectorShuffle %v2f16 %st_fn_${var}_param1 %st_fn_${var}_param1 2 3\n"
	"%st_fn_${var}_bc0 = OpBitcast %u32 %st_fn_${var}_shuffle0\n"
	"%st_fn_${var}_bc1 = OpBitcast %u32 %st_fn_${var}_shuffle1\n"
	"%st_fn_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"OpStore %st_fn_${var}_gep0 %st_fn_${var}_bc0\n"
	"OpStore %st_fn_${var}_gep1 %st_fn_${var}_bc1\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM2x2F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_m2x2f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m2x2f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_bc0 = OpBitcast %u32 %st_fn_${var}_ex0\n"
	"%st_fn_${var}_bc1 = OpBitcast %u32 %st_fn_${var}_ex1\n"
	"%st_fn_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"OpStore %st_fn_${var}_gep0 %st_fn_${var}_bc0\n"
	"OpStore %st_fn_${var}_gep1 %st_fn_${var}_bc1\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM2x3F16AsUints =
	// In the extracted elements for 01 and 11 the second element doesn't
	// matter.
	"%st_fn_${var} = OpFunction %void None %void_m2x3f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m2x3f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ele00 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 0 1\n"
	"%st_fn_${var}_ele01 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 2 3\n"
	"%st_fn_${var}_ele10 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 0 1\n"
	"%st_fn_${var}_ele11 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 2 3\n"
	"%st_fn_${var}_bc00 = OpBitcast %u32 %st_fn_${var}_ele00\n"
	"%st_fn_${var}_bc01 = OpBitcast %u32 %st_fn_${var}_ele01\n"
	"%st_fn_${var}_bc10 = OpBitcast %u32 %st_fn_${var}_ele10\n"
	"%st_fn_${var}_bc11 = OpBitcast %u32 %st_fn_${var}_ele11\n"
	"%st_fn_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"OpStore %st_fn_${var}_gep00 %st_fn_${var}_bc00\n"
	"OpStore %st_fn_${var}_gep01 %st_fn_${var}_bc01\n"
	"OpStore %st_fn_${var}_gep10 %st_fn_${var}_bc10\n"
	"OpStore %st_fn_${var}_gep11 %st_fn_${var}_bc11\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM2x4F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_m2x4f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m2x4f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ele00 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 0 1\n"
	"%st_fn_${var}_ele01 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 2 3\n"
	"%st_fn_${var}_ele10 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 0 1\n"
	"%st_fn_${var}_ele11 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 2 3\n"
	"%st_fn_${var}_bc00 = OpBitcast %u32 %st_fn_${var}_ele00\n"
	"%st_fn_${var}_bc01 = OpBitcast %u32 %st_fn_${var}_ele01\n"
	"%st_fn_${var}_bc10 = OpBitcast %u32 %st_fn_${var}_ele10\n"
	"%st_fn_${var}_bc11 = OpBitcast %u32 %st_fn_${var}_ele11\n"
	"%st_fn_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"OpStore %st_fn_${var}_gep00 %st_fn_${var}_bc00\n"
	"OpStore %st_fn_${var}_gep01 %st_fn_${var}_bc01\n"
	"OpStore %st_fn_${var}_gep10 %st_fn_${var}_bc10\n"
	"OpStore %st_fn_${var}_gep11 %st_fn_${var}_bc11\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM3x2F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_m3x2f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m3x2f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ex2 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 2\n"
	"%st_fn_${var}_bc0 = OpBitcast %u32 %st_fn_${var}_ex0\n"
	"%st_fn_${var}_bc1 = OpBitcast %u32 %st_fn_${var}_ex1\n"
	"%st_fn_${var}_bc2 = OpBitcast %u32 %st_fn_${var}_ex2\n"
	"%st_fn_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep2 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"OpStore %st_fn_${var}_gep0 %st_fn_${var}_bc0\n"
	"OpStore %st_fn_${var}_gep1 %st_fn_${var}_bc1\n"
	"OpStore %st_fn_${var}_gep2 %st_fn_${var}_bc2\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM3x3F16AsUints =
	// The second element of the each broken down vec3 doesn't matter.
	"%st_fn_${var} = OpFunction %void None %void_m3x3f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m3x3f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ex2 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 2\n"
	"%st_fn_${var}_ele00 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 0 1\n"
	"%st_fn_${var}_ele01 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 2 3\n"
	"%st_fn_${var}_ele10 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 0 1\n"
	"%st_fn_${var}_ele11 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 2 3\n"
	"%st_fn_${var}_ele20 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 0 1\n"
	"%st_fn_${var}_ele21 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 2 3\n"
	"%st_fn_${var}_bc00 = OpBitcast %u32 %st_fn_${var}_ele00\n"
	"%st_fn_${var}_bc01 = OpBitcast %u32 %st_fn_${var}_ele01\n"
	"%st_fn_${var}_bc10 = OpBitcast %u32 %st_fn_${var}_ele10\n"
	"%st_fn_${var}_bc11 = OpBitcast %u32 %st_fn_${var}_ele11\n"
	"%st_fn_${var}_bc20 = OpBitcast %u32 %st_fn_${var}_ele20\n"
	"%st_fn_${var}_bc21 = OpBitcast %u32 %st_fn_${var}_ele21\n"
	"%st_fn_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"%st_fn_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_4\n"
	"%st_fn_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_5\n"
	"OpStore %st_fn_${var}_gep00 %st_fn_${var}_bc00\n"
	"OpStore %st_fn_${var}_gep01 %st_fn_${var}_bc01\n"
	"OpStore %st_fn_${var}_gep10 %st_fn_${var}_bc10\n"
	"OpStore %st_fn_${var}_gep11 %st_fn_${var}_bc11\n"
	"OpStore %st_fn_${var}_gep20 %st_fn_${var}_bc20\n"
	"OpStore %st_fn_${var}_gep21 %st_fn_${var}_bc21\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM3x4F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_m3x4f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m3x4f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ex2 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 2\n"
	"%st_fn_${var}_ele00 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 0 1\n"
	"%st_fn_${var}_ele01 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 2 3\n"
	"%st_fn_${var}_ele10 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 0 1\n"
	"%st_fn_${var}_ele11 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 2 3\n"
	"%st_fn_${var}_ele20 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 0 1\n"
	"%st_fn_${var}_ele21 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 2 3\n"
	"%st_fn_${var}_bc00 = OpBitcast %u32 %st_fn_${var}_ele00\n"
	"%st_fn_${var}_bc01 = OpBitcast %u32 %st_fn_${var}_ele01\n"
	"%st_fn_${var}_bc10 = OpBitcast %u32 %st_fn_${var}_ele10\n"
	"%st_fn_${var}_bc11 = OpBitcast %u32 %st_fn_${var}_ele11\n"
	"%st_fn_${var}_bc20 = OpBitcast %u32 %st_fn_${var}_ele20\n"
	"%st_fn_${var}_bc21 = OpBitcast %u32 %st_fn_${var}_ele21\n"
	"%st_fn_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"%st_fn_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_4\n"
	"%st_fn_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_5\n"
	"OpStore %st_fn_${var}_gep00 %st_fn_${var}_bc00\n"
	"OpStore %st_fn_${var}_gep01 %st_fn_${var}_bc01\n"
	"OpStore %st_fn_${var}_gep10 %st_fn_${var}_bc10\n"
	"OpStore %st_fn_${var}_gep11 %st_fn_${var}_bc11\n"
	"OpStore %st_fn_${var}_gep20 %st_fn_${var}_bc20\n"
	"OpStore %st_fn_${var}_gep21 %st_fn_${var}_bc21\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM4x2F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_m4x2f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m4x2f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ex2 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 2\n"
	"%st_fn_${var}_ex3 = OpCompositeExtract %v2f16 %st_fn_${var}_param1 3\n"
	"%st_fn_${var}_bc0 = OpBitcast %u32 %st_fn_${var}_ex0\n"
	"%st_fn_${var}_bc1 = OpBitcast %u32 %st_fn_${var}_ex1\n"
	"%st_fn_${var}_bc2 = OpBitcast %u32 %st_fn_${var}_ex2\n"
	"%st_fn_${var}_bc3 = OpBitcast %u32 %st_fn_${var}_ex3\n"
	"%st_fn_${var}_gep0 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep1 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep2 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep3 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"OpStore %st_fn_${var}_gep0 %st_fn_${var}_bc0\n"
	"OpStore %st_fn_${var}_gep1 %st_fn_${var}_bc1\n"
	"OpStore %st_fn_${var}_gep2 %st_fn_${var}_bc2\n"
	"OpStore %st_fn_${var}_gep3 %st_fn_${var}_bc3\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM4x3F16AsUints =
	// The last element of each decomposed vec3 doesn't matter.
	"%st_fn_${var} = OpFunction %void None %void_m4x3f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m4x3f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ex2 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 2\n"
	"%st_fn_${var}_ex3 = OpCompositeExtract %v3f16 %st_fn_${var}_param1 3\n"
	"%st_fn_${var}_ele00 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 0 1\n"
	"%st_fn_${var}_ele01 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 2 3\n"
	"%st_fn_${var}_ele10 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 0 1\n"
	"%st_fn_${var}_ele11 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 2 3\n"
	"%st_fn_${var}_ele20 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 0 1\n"
	"%st_fn_${var}_ele21 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 2 3\n"
	"%st_fn_${var}_ele30 = OpVectorShuffle %v2f16 %st_fn_${var}_ex3 %st_fn_${var}_ex3 0 1\n"
	"%st_fn_${var}_ele31 = OpVectorShuffle %v2f16 %st_fn_${var}_ex3 %st_fn_${var}_ex3 2 3\n"
	"%st_fn_${var}_bc00 = OpBitcast %u32 %st_fn_${var}_ele00\n"
	"%st_fn_${var}_bc01 = OpBitcast %u32 %st_fn_${var}_ele01\n"
	"%st_fn_${var}_bc10 = OpBitcast %u32 %st_fn_${var}_ele10\n"
	"%st_fn_${var}_bc11 = OpBitcast %u32 %st_fn_${var}_ele11\n"
	"%st_fn_${var}_bc20 = OpBitcast %u32 %st_fn_${var}_ele20\n"
	"%st_fn_${var}_bc21 = OpBitcast %u32 %st_fn_${var}_ele21\n"
	"%st_fn_${var}_bc30 = OpBitcast %u32 %st_fn_${var}_ele30\n"
	"%st_fn_${var}_bc31 = OpBitcast %u32 %st_fn_${var}_ele31\n"
	"%st_fn_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"%st_fn_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_4\n"
	"%st_fn_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_5\n"
	"%st_fn_${var}_gep30 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_6\n"
	"%st_fn_${var}_gep31 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_7\n"
	"OpStore %st_fn_${var}_gep00 %st_fn_${var}_bc00\n"
	"OpStore %st_fn_${var}_gep01 %st_fn_${var}_bc01\n"
	"OpStore %st_fn_${var}_gep10 %st_fn_${var}_bc10\n"
	"OpStore %st_fn_${var}_gep11 %st_fn_${var}_bc11\n"
	"OpStore %st_fn_${var}_gep20 %st_fn_${var}_bc20\n"
	"OpStore %st_fn_${var}_gep21 %st_fn_${var}_bc21\n"
	"OpStore %st_fn_${var}_gep30 %st_fn_${var}_bc30\n"
	"OpStore %st_fn_${var}_gep31 %st_fn_${var}_bc31\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

const string storeM4x4F16AsUints =
	"%st_fn_${var} = OpFunction %void None %void_m4x4f16_i32_fn\n"
	"%st_fn_${var}_param1 = OpFunctionParameter %m4x4f16\n"
	"%st_fn_${var}_param2 = OpFunctionParameter %i32\n"
	"%st_fn_${var}_entry = OpLabel\n"
	"%st_fn_${var}_ex0 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 0\n"
	"%st_fn_${var}_ex1 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 1\n"
	"%st_fn_${var}_ex2 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 2\n"
	"%st_fn_${var}_ex3 = OpCompositeExtract %v4f16 %st_fn_${var}_param1 3\n"
	"%st_fn_${var}_ele00 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 0 1\n"
	"%st_fn_${var}_ele01 = OpVectorShuffle %v2f16 %st_fn_${var}_ex0 %st_fn_${var}_ex0 2 3\n"
	"%st_fn_${var}_ele10 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 0 1\n"
	"%st_fn_${var}_ele11 = OpVectorShuffle %v2f16 %st_fn_${var}_ex1 %st_fn_${var}_ex1 2 3\n"
	"%st_fn_${var}_ele20 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 0 1\n"
	"%st_fn_${var}_ele21 = OpVectorShuffle %v2f16 %st_fn_${var}_ex2 %st_fn_${var}_ex2 2 3\n"
	"%st_fn_${var}_ele30 = OpVectorShuffle %v2f16 %st_fn_${var}_ex3 %st_fn_${var}_ex3 0 1\n"
	"%st_fn_${var}_ele31 = OpVectorShuffle %v2f16 %st_fn_${var}_ex3 %st_fn_${var}_ex3 2 3\n"
	"%st_fn_${var}_bc00 = OpBitcast %u32 %st_fn_${var}_ele00\n"
	"%st_fn_${var}_bc01 = OpBitcast %u32 %st_fn_${var}_ele01\n"
	"%st_fn_${var}_bc10 = OpBitcast %u32 %st_fn_${var}_ele10\n"
	"%st_fn_${var}_bc11 = OpBitcast %u32 %st_fn_${var}_ele11\n"
	"%st_fn_${var}_bc20 = OpBitcast %u32 %st_fn_${var}_ele20\n"
	"%st_fn_${var}_bc21 = OpBitcast %u32 %st_fn_${var}_ele21\n"
	"%st_fn_${var}_bc30 = OpBitcast %u32 %st_fn_${var}_ele30\n"
	"%st_fn_${var}_bc31 = OpBitcast %u32 %st_fn_${var}_ele31\n"
	"%st_fn_${var}_gep00 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_0\n"
	"%st_fn_${var}_gep01 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_1\n"
	"%st_fn_${var}_gep10 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_2\n"
	"%st_fn_${var}_gep11 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_3\n"
	"%st_fn_${var}_gep20 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_4\n"
	"%st_fn_${var}_gep21 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_5\n"
	"%st_fn_${var}_gep30 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_6\n"
	"%st_fn_${var}_gep31 = OpAccessChain %up_u32 %${var} %c_u32_0 %st_fn_${var}_param2 %c_u32_7\n"
	"OpStore %st_fn_${var}_gep00 %st_fn_${var}_bc00\n"
	"OpStore %st_fn_${var}_gep01 %st_fn_${var}_bc01\n"
	"OpStore %st_fn_${var}_gep10 %st_fn_${var}_bc10\n"
	"OpStore %st_fn_${var}_gep11 %st_fn_${var}_bc11\n"
	"OpStore %st_fn_${var}_gep20 %st_fn_${var}_bc20\n"
	"OpStore %st_fn_${var}_gep21 %st_fn_${var}_bc21\n"
	"OpStore %st_fn_${var}_gep30 %st_fn_${var}_bc30\n"
	"OpStore %st_fn_${var}_gep31 %st_fn_${var}_bc31\n"
	"OpReturn\n"
	"OpFunctionEnd\n";

template<typename T>
static void fillRandomScalars (de::Random& rnd, T minValue, T maxValue, void* dst, int numValues, int offset = 0)
{
	T* const typedPtr = (T*)dst;
	for (int ndx = 0; ndx < numValues; ndx++)
		typedPtr[offset + ndx] = de::randomScalar<T>(rnd, minValue, maxValue);
}

// Filter is a function that returns true if a value should pass, false otherwise.
template<typename T, typename FilterT>
static void fillRandomScalars (de::Random& rnd, T minValue, T maxValue, void* dst, int numValues, FilterT filter, int offset = 0)
{
	T* const typedPtr = (T*)dst;
	T value;
	for (int ndx = 0; ndx < numValues; ndx++)
	{
		do
			value = de::randomScalar<T>(rnd, minValue, maxValue);
		while (!filter(value));

		typedPtr[offset + ndx] = value;
	}
}

// Gets a 64-bit integer with a more logarithmic distribution
deInt64 randomInt64LogDistributed (de::Random& rnd)
{
	deInt64 val = rnd.getUint64();
	val &= (1ull << rnd.getInt(1, 63)) - 1;
	if (rnd.getBool())
		val = -val;
	return val;
}

static void fillRandomInt64sLogDistributed (de::Random& rnd, vector<deInt64>& dst, int numValues)
{
	for (int ndx = 0; ndx < numValues; ndx++)
		dst[ndx] = randomInt64LogDistributed(rnd);
}

template<typename FilterT>
static void fillRandomInt64sLogDistributed (de::Random& rnd, vector<deInt64>& dst, int numValues, FilterT filter)
{
	for (int ndx = 0; ndx < numValues; ndx++)
	{
		deInt64 value;
		do {
			value = randomInt64LogDistributed(rnd);
		} while (!filter(value));
		dst[ndx] = value;
	}
}

inline bool filterNonNegative (const deInt64 value)
{
	return value >= 0;
}

inline bool filterPositive (const deInt64 value)
{
	return value > 0;
}

inline bool filterNotZero (const deInt64 value)
{
	return value != 0;
}

static void floorAll (vector<float>& values)
{
	for (size_t i = 0; i < values.size(); i++)
		values[i] = deFloatFloor(values[i]);
}

static void floorAll (vector<Vec4>& values)
{
	for (size_t i = 0; i < values.size(); i++)
		values[i] = floor(values[i]);
}

struct CaseParameter
{
	const char*		name;
	string			param;

	CaseParameter	(const char* case_, const string& param_) : name(case_), param(param_) {}
};

// Assembly code used for testing LocalSize, OpNop, OpConstant{Null|Composite}, Op[No]Line, OpSource[Continued], OpSourceExtension, OpUndef is based on GLSL source code:
//
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input {
//   float elements[];
// } input_data;
// layout(std140, set = 0, binding = 1) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   output_data.elements[x] = -input_data.elements[x];
// }

static string getAsmForLocalSizeTest(bool useLiteralLocalSize, bool useSpecConstantWorkgroupSize, IVec3 workGroupSize, deUint32 ndx)
{
	std::ostringstream out;
	out << getComputeAsmShaderPreambleWithoutLocalSize();

	if (useLiteralLocalSize)
	{
		out << "OpExecutionMode %main LocalSize "
			<< workGroupSize.x() << " " << workGroupSize.y() << " " << workGroupSize.z() << "\n";
	}

	out << "OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n";

	if (useSpecConstantWorkgroupSize)
	{
		out << "OpDecorate %spec_0 SpecId 100\n"
			<< "OpDecorate %spec_1 SpecId 101\n"
			<< "OpDecorate %spec_2 SpecId 102\n"
			<< "OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n";
	}

	out << getComputeAsmInputOutputBufferTraits()
		<< getComputeAsmCommonTypes()
		<< getComputeAsmInputOutputBuffer()
		<< "%id        = OpVariable %uvec3ptr Input\n"
		<< "%zero      = OpConstant %i32 0 \n";

	if (useSpecConstantWorkgroupSize)
	{
		out	<< "%spec_0   = OpSpecConstant %u32 "<< workGroupSize.x() << "\n"
			<< "%spec_1   = OpSpecConstant %u32 "<< workGroupSize.y() << "\n"
			<< "%spec_2   = OpSpecConstant %u32 "<< workGroupSize.z() << "\n"
			<< "%gl_WorkGroupSize = OpSpecConstantComposite %uvec3 %spec_0 %spec_1 %spec_2\n";
	}

	out << "%main      = OpFunction %void None %voidf\n"
		<< "%label     = OpLabel\n"
		<< "%idval     = OpLoad %uvec3 %id\n"
		<< "%ndx         = OpCompositeExtract %u32 %idval " << ndx << "\n"

			"%inloc     = OpAccessChain %f32ptr %indata %zero %ndx\n"
			"%inval     = OpLoad %f32 %inloc\n"
			"%neg       = OpFNegate %f32 %inval\n"
			"%outloc    = OpAccessChain %f32ptr %outdata %zero %ndx\n"
			"             OpStore %outloc %neg\n"
			"             OpReturn\n"
			"             OpFunctionEnd\n";
	return out.str();
}

tcu::TestCaseGroup* createLocalSizeGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "localsize", ""));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const deUint32					numElements		= 64u;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));

	spec.numWorkGroups = IVec3(numElements, 1, 1);

	spec.assembly = getAsmForLocalSizeTest(true, false, IVec3(1, 1, 1), 0u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_localsize", "", spec));

	spec.assembly = getAsmForLocalSizeTest(true, true, IVec3(1, 1, 1), 0u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_and_specid_localsize", "", spec));

	spec.assembly = getAsmForLocalSizeTest(false, true, IVec3(1, 1, 1), 0u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "specid_localsize", "", spec));

	spec.numWorkGroups = IVec3(1, 1, 1);

	spec.assembly = getAsmForLocalSizeTest(true, false, IVec3(numElements, 1, 1), 0u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_localsize_x", "", spec));

	spec.assembly = getAsmForLocalSizeTest(true, true, IVec3(numElements, 1, 1), 0u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_and_specid_localsize_x", "", spec));

	spec.assembly = getAsmForLocalSizeTest(false, true, IVec3(numElements, 1, 1), 0u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "specid_localsize_x", "", spec));

	spec.assembly = getAsmForLocalSizeTest(true, false, IVec3(1, numElements, 1), 1u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_localsize_y", "", spec));

	spec.assembly = getAsmForLocalSizeTest(true, true, IVec3(1, numElements, 1), 1u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_and_specid_localsize_y", "", spec));

	spec.assembly = getAsmForLocalSizeTest(false, true, IVec3(1, numElements, 1), 1u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "specid_localsize_y", "", spec));

	spec.assembly = getAsmForLocalSizeTest(true, false, IVec3(1, 1, numElements), 2u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_localsize_z", "", spec));

	spec.assembly = getAsmForLocalSizeTest(true, true, IVec3(1, 1, numElements), 2u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "literal_and_specid_localsize_z", "", spec));

	spec.assembly = getAsmForLocalSizeTest(false, true, IVec3(1, 1, numElements), 2u);
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "specid_localsize_z", "", spec));

	return group.release();
}

tcu::TestCaseGroup* createOpNopGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opnop", "Test the OpNop instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes())

		+ string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"             OpNop\n" // Inside a function body

		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "OpNop appearing at different places", spec));

	return group.release();
}

tcu::TestCaseGroup* createUnusedVariableComputeTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "unused_variables", "Compute shaders with unused variables"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	const VariableLocation			testLocations[] =
	{
		// Set		Binding
		{ 0,		5			},
		{ 5,		5			},
	};

	for (size_t locationNdx = 0; locationNdx < DE_LENGTH_OF_ARRAY(testLocations); ++locationNdx)
	{
		const VariableLocation& location = testLocations[locationNdx];

		// Unused variable.
		{
			ComputeShaderSpec				spec;

			spec.assembly =
				string(getComputeAsmShaderPreamble()) +

				"OpDecorate %id BuiltIn GlobalInvocationId\n"

				+ getUnusedDecorations(location)

				+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes())

				+ getUnusedTypesAndConstants()

				+ string(getComputeAsmInputOutputBuffer())

				+ getUnusedBuffer() +

				"%id        = OpVariable %uvec3ptr Input\n"
				"%zero      = OpConstant %i32 0\n"

				"%main      = OpFunction %void None %voidf\n"
				"%label     = OpLabel\n"
				"%idval     = OpLoad %uvec3 %id\n"
				"%x         = OpCompositeExtract %u32 %idval 0\n"

				"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
				"%inval     = OpLoad %f32 %inloc\n"
				"%neg       = OpFNegate %f32 %inval\n"
				"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
				"             OpStore %outloc %neg\n"
				"             OpReturn\n"
				"             OpFunctionEnd\n";
			spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
			spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
			spec.numWorkGroups = IVec3(numElements, 1, 1);

			std::string testName		= "variable_" + location.toString();
			std::string testDescription	= "Unused variable test with " + location.toDescription();

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testDescription.c_str(), spec));
		}

		// Unused function.
		{
			ComputeShaderSpec				spec;

			spec.assembly =
				string(getComputeAsmShaderPreamble("", "", "", getUnusedEntryPoint())) +

				"OpDecorate %id BuiltIn GlobalInvocationId\n"

				+ getUnusedDecorations(location)

				+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes())

				+ getUnusedTypesAndConstants() +

				"%c_i32_0 = OpConstant %i32 0\n"
				"%c_i32_1 = OpConstant %i32 1\n"

				+ string(getComputeAsmInputOutputBuffer())

				+ getUnusedBuffer() +

				"%id        = OpVariable %uvec3ptr Input\n"
				"%zero      = OpConstant %i32 0\n"

				"%main      = OpFunction %void None %voidf\n"
				"%label     = OpLabel\n"
				"%idval     = OpLoad %uvec3 %id\n"
				"%x         = OpCompositeExtract %u32 %idval 0\n"

				"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
				"%inval     = OpLoad %f32 %inloc\n"
				"%neg       = OpFNegate %f32 %inval\n"
				"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
				"             OpStore %outloc %neg\n"
				"             OpReturn\n"
				"             OpFunctionEnd\n"

				+ getUnusedFunctionBody();

			spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
			spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
			spec.numWorkGroups = IVec3(numElements, 1, 1);

			std::string testName		= "function_" + location.toString();
			std::string testDescription	= "Unused function test with " + location.toDescription();

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testDescription.c_str(), spec));
		}
	}

	return group.release();
}

template<bool nanSupported>
bool compareFUnord (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog& log)
{
	if (outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;
	vector<deUint8>	input2Bytes;
	vector<deUint8>	expectedBytes;

	inputs[0].getBytes(input1Bytes);
	inputs[1].getBytes(input2Bytes);
	expectedOutputs[0].getBytes(expectedBytes);

	const deInt32* const	expectedOutputAsInt		= reinterpret_cast<const deInt32*>(&expectedBytes.front());
	const deInt32* const	outputAsInt				= static_cast<const deInt32*>(outputAllocs[0]->getHostPtr());
	const float* const		input1AsFloat			= reinterpret_cast<const float*>(&input1Bytes.front());
	const float* const		input2AsFloat			= reinterpret_cast<const float*>(&input2Bytes.front());
	bool returnValue								= true;

	for (size_t idx = 0; idx < expectedBytes.size() / sizeof(deInt32); ++idx)
	{
		if (!nanSupported && (tcu::Float32(input1AsFloat[idx]).isNaN() || tcu::Float32(input2AsFloat[idx]).isNaN()))
			continue;

		if (outputAsInt[idx] != expectedOutputAsInt[idx])
		{
			log << TestLog::Message << "ERROR: Sub-case failed. inputs: " << input1AsFloat[idx] << "," << input2AsFloat[idx] << " output: " << outputAsInt[idx]<< " expected output: " << expectedOutputAsInt[idx] << TestLog::EndMessage;
			returnValue = false;
		}
	}
	return returnValue;
}

typedef VkBool32 (*compareFuncType) (float, float);

struct OpFUnordCase
{
	const char*		name;
	const char*		opCode;
	compareFuncType	compareFunc;

					OpFUnordCase			(const char* _name, const char* _opCode, compareFuncType _compareFunc)
						: name				(_name)
						, opCode			(_opCode)
						, compareFunc		(_compareFunc) {}
};

#define ADD_OPFUNORD_CASE(NAME, OPCODE, OPERATOR) \
do { \
	struct compare_##NAME { static VkBool32 compare(float x, float y) { return (x OPERATOR y) ? VK_TRUE : VK_FALSE; } }; \
	cases.push_back(OpFUnordCase(#NAME, OPCODE, compare_##NAME::compare)); \
} while (deGetFalse())

tcu::TestCaseGroup* createOpFUnordGroup (tcu::TestContext& testCtx, const bool testWithNan)
{
	const string					nan				= testWithNan ? "_nan" : "";
	const string					groupName		= "opfunord" + nan;
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, groupName.c_str(), "Test the OpFUnord* opcodes"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<OpFUnordCase>			cases;
	string							extensions		= testWithNan ? "OpExtension \"SPV_KHR_float_controls\"\n" : "";
	string							capabilities	= testWithNan ? "OpCapability SignedZeroInfNanPreserve\n" : "";
	string							exeModes		= testWithNan ? "OpExecutionMode %main SignedZeroInfNanPreserve 32\n" : "";
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble(capabilities, extensions, exeModes)) +
		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %buf2 BufferBlock\n"
		"OpDecorate %indata1 DescriptorSet 0\n"
		"OpDecorate %indata1 Binding 0\n"
		"OpDecorate %indata2 DescriptorSet 0\n"
		"OpDecorate %indata2 Binding 1\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 2\n"
		"OpDecorate %f32arr ArrayStride 4\n"
		"OpDecorate %i32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"
		"OpMemberDecorate %buf2 0 Offset 0\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf        = OpTypeStruct %f32arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata1    = OpVariable %bufptr Uniform\n"
		"%indata2    = OpVariable %bufptr Uniform\n"

		"%buf2       = OpTypeStruct %i32arr\n"
		"%buf2ptr    = OpTypePointer Uniform %buf2\n"
		"%outdata    = OpVariable %buf2ptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"
		"%consti1   = OpConstant %i32 1\n"
		"%constf1   = OpConstant %f32 1.0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"%inloc1    = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inval1    = OpLoad %f32 %inloc1\n"
		"%inloc2    = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inval2    = OpLoad %f32 %inloc2\n"
		"%outloc    = OpAccessChain %i32ptr %outdata %zero %x\n"

		"%result    = ${OPCODE} %bool %inval1 %inval2\n"
		"%int_res   = OpSelect %i32 %result %consti1 %zero\n"
		"             OpStore %outloc %int_res\n"

		"             OpReturn\n"
		"             OpFunctionEnd\n");

	ADD_OPFUNORD_CASE(equal, "OpFUnordEqual", ==);
	ADD_OPFUNORD_CASE(less, "OpFUnordLessThan", <);
	ADD_OPFUNORD_CASE(lessequal, "OpFUnordLessThanEqual", <=);
	ADD_OPFUNORD_CASE(greater, "OpFUnordGreaterThan", >);
	ADD_OPFUNORD_CASE(greaterequal, "OpFUnordGreaterThanEqual", >=);
	ADD_OPFUNORD_CASE(notequal, "OpFUnordNotEqual", !=);

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>			specializations;
		ComputeShaderSpec			spec;
		const float					NaN				= std::numeric_limits<float>::quiet_NaN();
		vector<float>				inputFloats1	(numElements, 0);
		vector<float>				inputFloats2	(numElements, 0);
		vector<deInt32>				expectedInts	(numElements, 0);

		specializations["OPCODE"]	= cases[caseNdx].opCode;
		spec.assembly				= shaderTemplate.specialize(specializations);

		fillRandomScalars(rnd, 1.f, 100.f, &inputFloats1[0], numElements);
		for (size_t ndx = 0; ndx < numElements; ++ndx)
		{
			switch (ndx % 6)
			{
				case 0:		inputFloats2[ndx] = inputFloats1[ndx] + 1.0f; break;
				case 1:		inputFloats2[ndx] = inputFloats1[ndx] - 1.0f; break;
				case 2:		inputFloats2[ndx] = inputFloats1[ndx]; break;
				case 3:		inputFloats2[ndx] = NaN; break;
				case 4:		inputFloats2[ndx] = inputFloats1[ndx];	inputFloats1[ndx] = NaN; break;
				case 5:		inputFloats2[ndx] = NaN;				inputFloats1[ndx] = NaN; break;
			}
			expectedInts[ndx] = tcu::Float32(inputFloats1[ndx]).isNaN() || tcu::Float32(inputFloats2[ndx]).isNaN() || cases[caseNdx].compareFunc(inputFloats1[ndx], inputFloats2[ndx]);
		}

		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
		spec.outputs.push_back(BufferSp(new Int32Buffer(expectedInts)));
		spec.numWorkGroups	= IVec3(numElements, 1, 1);
		spec.verifyIO		= testWithNan ? &compareFUnord<true> : &compareFUnord<false>;

		if (testWithNan)
		{
			spec.extensions.push_back("VK_KHR_shader_float_controls");
			spec.requestedVulkanFeatures.floatControlsProperties.shaderSignedZeroInfNanPreserveFloat32 = DE_TRUE;
		}

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

struct OpAtomicCase
{
	const char*		name;
	const char*		assembly;
	const char*		retValAssembly;
	OpAtomicType	opAtomic;
	deInt32			numOutputElements;

					OpAtomicCase(const char* _name, const char* _assembly, const char* _retValAssembly, OpAtomicType _opAtomic, deInt32 _numOutputElements)
						: name				(_name)
						, assembly			(_assembly)
						, retValAssembly	(_retValAssembly)
						, opAtomic			(_opAtomic)
						, numOutputElements	(_numOutputElements) {}
};

tcu::TestCaseGroup* createOpAtomicGroup (tcu::TestContext& testCtx, bool useStorageBuffer, int numElements = 65535, bool verifyReturnValues = false, bool volatileAtomic = false)
{
	std::string						groupName			("opatomic");
	if (useStorageBuffer)
		groupName += "_storage_buffer";
	if (verifyReturnValues)
		groupName += "_return_values";
	if (volatileAtomic)
		groupName += "_volatile";
	de::MovePtr<tcu::TestCaseGroup>	group				(new tcu::TestCaseGroup(testCtx, groupName.c_str(), "Test the OpAtomic* opcodes"));
	vector<OpAtomicCase>			cases;

	const StringTemplate			shaderTemplate	(

		string("OpCapability Shader\n") +
		(volatileAtomic ? "OpCapability VulkanMemoryModelKHR\n" : "") +
		(useStorageBuffer ? "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n" : "") +
		(volatileAtomic ? "OpExtension \"SPV_KHR_vulkan_memory_model\"\n" : "") +
		(volatileAtomic ? "OpMemoryModel Logical VulkanKHR\n" : "OpMemoryModel Logical GLSL450\n") +
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n" +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf ${BLOCK_DECORATION}\n"
		"OpDecorate %indata DescriptorSet 0\n"
		"OpDecorate %indata Binding 0\n"
		"OpDecorate %i32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		"OpDecorate %sumbuf ${BLOCK_DECORATION}\n"
		"OpDecorate %sum DescriptorSet 0\n"
		"OpDecorate %sum Binding 1\n"
		"OpMemberDecorate %sumbuf 0 Offset 0\n"

		"${RETVAL_BUF_DECORATE}"

		+ getComputeAsmCommonTypes("${BLOCK_POINTER_TYPE}") +

		"%buf       = OpTypeStruct %i32arr\n"
		"%bufptr    = OpTypePointer ${BLOCK_POINTER_TYPE} %buf\n"
		"%indata    = OpVariable %bufptr ${BLOCK_POINTER_TYPE}\n"

		"%sumbuf    = OpTypeStruct %i32arr\n"
		"%sumbufptr = OpTypePointer ${BLOCK_POINTER_TYPE} %sumbuf\n"
		"%sum       = OpVariable %sumbufptr ${BLOCK_POINTER_TYPE}\n"

		"${RETVAL_BUF_DECL}"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%minusone  = OpConstant %i32 -1\n"
		"%zero      = OpConstant %i32 0\n"
		"%one       = OpConstant %u32 1\n"
		"%two       = OpConstant %i32 2\n"
		"%five      = OpConstant %i32 5\n"
		"%volbit    = OpConstant %i32 32768\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"%inloc     = OpAccessChain %i32ptr %indata %zero %x\n"
		"%inval     = OpLoad %i32 %inloc\n"

		"%outloc    = OpAccessChain %i32ptr %sum %zero ${INDEX}\n"
		"${INSTRUCTION}"
		"${RETVAL_ASSEMBLY}"

		"             OpReturn\n"
		"             OpFunctionEnd\n");

	#define ADD_OPATOMIC_CASE(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC, NUM_OUTPUT_ELEMENTS) \
	do { \
		DE_ASSERT((NUM_OUTPUT_ELEMENTS) == 1 || (NUM_OUTPUT_ELEMENTS) == numElements); \
		cases.push_back(OpAtomicCase(#NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC, NUM_OUTPUT_ELEMENTS)); \
	} while (deGetFalse())
	#define ADD_OPATOMIC_CASE_1(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC) ADD_OPATOMIC_CASE(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC, 1)
	#define ADD_OPATOMIC_CASE_N(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC) ADD_OPATOMIC_CASE(NAME, ASSEMBLY, RETVAL_ASSEMBLY, OPATOMIC, numElements)

	ADD_OPATOMIC_CASE_1(iadd,	"%retv      = OpAtomicIAdd %i32 %outloc ${SCOPE} ${SEMANTICS} %inval\n",
								"             OpStore %retloc %retv\n", OPATOMIC_IADD );
	ADD_OPATOMIC_CASE_1(isub,	"%retv      = OpAtomicISub %i32 %outloc ${SCOPE} ${SEMANTICS} %inval\n",
								"             OpStore %retloc %retv\n", OPATOMIC_ISUB );
	ADD_OPATOMIC_CASE_1(iinc,	"%retv      = OpAtomicIIncrement %i32 %outloc ${SCOPE} ${SEMANTICS}\n",
								"             OpStore %retloc %retv\n", OPATOMIC_IINC );
	ADD_OPATOMIC_CASE_1(idec,	"%retv      = OpAtomicIDecrement %i32 %outloc ${SCOPE} ${SEMANTICS}\n",
								"             OpStore %retloc %retv\n", OPATOMIC_IDEC );
	if (!verifyReturnValues)
	{
		ADD_OPATOMIC_CASE_N(load,	"%inval2    = OpAtomicLoad %i32 %inloc ${SCOPE} ${SEMANTICS}\n"
									"             OpStore %outloc %inval2\n", "", OPATOMIC_LOAD );
		ADD_OPATOMIC_CASE_N(store,	"             OpAtomicStore %outloc ${SCOPE} ${SEMANTICS} %inval\n", "", OPATOMIC_STORE );
	}

	ADD_OPATOMIC_CASE_N(compex, "%even      = OpSMod %i32 %inval %two\n"
								"             OpStore %outloc %even\n"
								"%retv      = OpAtomicCompareExchange %i32 %outloc ${SCOPE} ${SEMANTICS} ${SEMANTICS} %minusone %zero\n",
								"			  OpStore %retloc %retv\n", OPATOMIC_COMPEX );


	#undef ADD_OPATOMIC_CASE
	#undef ADD_OPATOMIC_CASE_1
	#undef ADD_OPATOMIC_CASE_N

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>			specializations;
		ComputeShaderSpec			spec;
		vector<deInt32>				inputInts		(numElements, 0);
		vector<deInt32>				expected		(cases[caseNdx].numOutputElements, -1);

		if (volatileAtomic)
		{
			spec.extensions.push_back("VK_KHR_vulkan_memory_model");
			spec.requestedVulkanFeatures.extVulkanMemoryModel = EXTVULKANMEMORYMODELFEATURES_ENABLE;

			// volatile, queuefamily scope
			specializations["SEMANTICS"] = "%volbit";
			specializations["SCOPE"] = "%five";
		}
		else
		{
			// non-volatile, device scope
			specializations["SEMANTICS"] = "%zero";
			specializations["SCOPE"] = "%one";
		}
		specializations["INDEX"]				= (cases[caseNdx].numOutputElements == 1) ? "%zero" : "%x";
		specializations["INSTRUCTION"]			= cases[caseNdx].assembly;
		specializations["BLOCK_DECORATION"]		= useStorageBuffer ? "Block" : "BufferBlock";
		specializations["BLOCK_POINTER_TYPE"]	= useStorageBuffer ? "StorageBuffer" : "Uniform";

		if (verifyReturnValues)
		{
			const StringTemplate blockDecoration	(
				"\n"
				"OpDecorate %retbuf ${BLOCK_DECORATION}\n"
				"OpDecorate %ret DescriptorSet 0\n"
				"OpDecorate %ret Binding 2\n"
				"OpMemberDecorate %retbuf 0 Offset 0\n\n");

			const StringTemplate blockDeclaration	(
				"\n"
				"%retbuf    = OpTypeStruct %i32arr\n"
				"%retbufptr = OpTypePointer ${BLOCK_POINTER_TYPE} %retbuf\n"
				"%ret       = OpVariable %retbufptr ${BLOCK_POINTER_TYPE}\n\n");

			specializations["RETVAL_ASSEMBLY"] =
				"%retloc    = OpAccessChain %i32ptr %ret %zero %x\n"
				+ std::string(cases[caseNdx].retValAssembly);

			specializations["RETVAL_BUF_DECORATE"]	= blockDecoration.specialize(specializations);
			specializations["RETVAL_BUF_DECL"]		= blockDeclaration.specialize(specializations);
		}
		else
		{
			specializations["RETVAL_ASSEMBLY"]		= "";
			specializations["RETVAL_BUF_DECORATE"]	= "";
			specializations["RETVAL_BUF_DECL"]		= "";
		}

		spec.assembly							= shaderTemplate.specialize(specializations);

		// Specialize one more time, to catch things that were in a template parameter
		const StringTemplate					assemblyTemplate(spec.assembly);
		spec.assembly							= assemblyTemplate.specialize(specializations);

		if (useStorageBuffer)
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");

		spec.inputs.push_back(BufferSp(new OpAtomicBuffer(numElements, cases[caseNdx].numOutputElements, cases[caseNdx].opAtomic, BUFFERTYPE_INPUT)));
		spec.outputs.push_back(BufferSp(new OpAtomicBuffer(numElements, cases[caseNdx].numOutputElements, cases[caseNdx].opAtomic, BUFFERTYPE_EXPECTED)));
		if (verifyReturnValues)
			spec.outputs.push_back(BufferSp(new OpAtomicBuffer(numElements, cases[caseNdx].numOutputElements, cases[caseNdx].opAtomic, BUFFERTYPE_ATOMIC_RET)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		if (verifyReturnValues)
		{
			switch (cases[caseNdx].opAtomic)
			{
				case OPATOMIC_IADD:
					spec.verifyIO = OpAtomicBuffer::compareWithRetvals<OPATOMIC_IADD>;
					break;
				case OPATOMIC_ISUB:
					spec.verifyIO = OpAtomicBuffer::compareWithRetvals<OPATOMIC_ISUB>;
					break;
				case OPATOMIC_IINC:
					spec.verifyIO = OpAtomicBuffer::compareWithRetvals<OPATOMIC_IINC>;
					break;
				case OPATOMIC_IDEC:
					spec.verifyIO = OpAtomicBuffer::compareWithRetvals<OPATOMIC_IDEC>;
					break;
				case OPATOMIC_COMPEX:
					spec.verifyIO = OpAtomicBuffer::compareWithRetvals<OPATOMIC_COMPEX>;
					break;
				default:
					DE_FATAL("Unsupported OpAtomic type for return value verification");
			}
		}
		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createOpLineGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opline", "Test the OpLine instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"%fname1 = OpString \"negateInputs.comp\"\n"
		"%fname2 = OpString \"negateInputs\"\n"

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) +

		"OpLine %fname1 0 0\n" // At the earliest possible position

		+ string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"OpLine %fname1 0 1\n" // Multiple OpLines in sequence
		"OpLine %fname2 1 0\n" // Different filenames
		"OpLine %fname1 1000 100000\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"OpLine %fname1 1 1\n" // Before a function

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"

		"OpLine %fname1 1 1\n" // In a function

		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "OpLine appearing at different places", spec));

	return group.release();
}

bool veryfiBinaryShader (const ProgramBinary& binary)
{
	const size_t	paternCount			= 3u;
	bool paternsCheck[paternCount]		=
	{
		false, false, false
	};
	const string patersns[paternCount]	=
	{
		"VULKAN CTS",
		"Negative values",
		"Date: 2017/09/21"
	};
	size_t			paternNdx		= 0u;

	for (size_t ndx = 0u; ndx < binary.getSize(); ++ndx)
	{
		if (false == paternsCheck[paternNdx] &&
			patersns[paternNdx][0] == static_cast<char>(binary.getBinary()[ndx]) &&
			deMemoryEqual((const char*)&binary.getBinary()[ndx], &patersns[paternNdx][0], patersns[paternNdx].length()))
		{
			paternsCheck[paternNdx]= true;
			paternNdx++;
			if (paternNdx == paternCount)
				break;
		}
	}

	for (size_t ndx = 0u; ndx < paternCount; ++ndx)
	{
		if (!paternsCheck[ndx])
			return false;
	}

	return true;
}

tcu::TestCaseGroup* createOpModuleProcessedGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opmoduleprocessed", "Test the OpModuleProcessed instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 10;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +
		"%fname = OpString \"negateInputs.comp\"\n"

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"
		"OpModuleProcessed \"VULKAN CTS\"\n"					//OpModuleProcessed;
		"OpModuleProcessed \"Negative values\"\n"
		"OpModuleProcessed \"Date: 2017/09/21\"\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits())

		+ string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"OpLine %fname 0 1\n"

		"OpLine %fname 1000 1\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"
		"%main      = OpFunction %void None %voidf\n"

		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);
	spec.verifyBinary = veryfiBinaryShader;
	spec.spirvVersion = SPIRV_VERSION_1_3;

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "OpModuleProcessed Tests", spec));

	return group.release();
}

tcu::TestCaseGroup* createOpNoLineGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opnoline", "Test the OpNoLine instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"%fname = OpString \"negateInputs.comp\"\n"

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) +

		"OpNoLine\n" // At the earliest possible position, without preceding OpLine

		+ string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"OpLine %fname 0 1\n"
		"OpNoLine\n" // Immediately following a preceding OpLine

		"OpLine %fname 1000 1\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"OpNoLine\n" // Contents after the previous OpLine

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"OpNoLine\n" // Multiple OpNoLine
		"OpNoLine\n"
		"OpNoLine\n"

		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "OpNoLine appearing at different places", spec));

	return group.release();
}

// Compare instruction for the contraction compute case.
// Returns true if the output is what is expected from the test case.
bool compareNoContractCase(const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	// Only size is needed because we are not comparing the exact values.
	size_t byteSize = expectedOutputs[0].getByteSize();

	const float*	outputAsFloat	= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	for(size_t i = 0; i < byteSize / sizeof(float); ++i) {
		if (outputAsFloat[i] != 0.f &&
			outputAsFloat[i] != -ldexp(1, -24)) {
			return false;
		}
	}

	return true;
}

tcu::TestCaseGroup* createNoContractionGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "nocontraction", "Test the NoContraction decoration"));
	vector<CaseParameter>			cases;
	const int						numElements		= 100;
	vector<float>					inputFloats1	(numElements, 0);
	vector<float>					inputFloats2	(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${DECORATION}\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata1 DescriptorSet 0\n"
		"OpDecorate %indata1 Binding 0\n"
		"OpDecorate %indata2 DescriptorSet 0\n"
		"OpDecorate %indata2 Binding 1\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 2\n"
		"OpDecorate %f32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf        = OpTypeStruct %f32arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata1    = OpVariable %bufptr Uniform\n"
		"%indata2    = OpVariable %bufptr Uniform\n"
		"%outdata    = OpVariable %bufptr Uniform\n"

		"%id         = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%c_f_m1     = OpConstant %f32 -1.\n"

		"%main       = OpFunction %void None %voidf\n"
		"%label      = OpLabel\n"
		"%idval      = OpLoad %uvec3 %id\n"
		"%x          = OpCompositeExtract %u32 %idval 0\n"
		"%inloc1     = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inval1     = OpLoad %f32 %inloc1\n"
		"%inloc2     = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inval2     = OpLoad %f32 %inloc2\n"
		"%mul        = OpFMul %f32 %inval1 %inval2\n"
		"%add        = OpFAdd %f32 %mul %c_f_m1\n"
		"%outloc     = OpAccessChain %f32ptr %outdata %zero %x\n"
		"              OpStore %outloc %add\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n");

	cases.push_back(CaseParameter("multiplication",	"OpDecorate %mul NoContraction"));
	cases.push_back(CaseParameter("addition",		"OpDecorate %add NoContraction"));
	cases.push_back(CaseParameter("both",			"OpDecorate %mul NoContraction\nOpDecorate %add NoContraction"));

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		inputFloats1[ndx]	= 1.f + std::ldexp(1.f, -23); // 1 + 2^-23.
		inputFloats2[ndx]	= 1.f - std::ldexp(1.f, -23); // 1 - 2^-23.
		// Result for (1 + 2^-23) * (1 - 2^-23) - 1. With NoContraction, the multiplication will be
		// conducted separately and the result is rounded to 1, or 0x1.fffffcp-1
		// So the final result will be 0.f or 0x1p-24.
		// If the operation is combined into a precise fused multiply-add, then the result would be
		// 2^-46 (0xa8800000).
		outputFloats[ndx]	= 0.f;
	}

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["DECORATION"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		// Check against the two possible answers based on rounding mode.
		spec.verifyIO = &compareNoContractCase;

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}
	return group.release();
}

bool compareFRem(const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	vector<deUint8>	expectedBytes;
	expectedOutputs[0].getBytes(expectedBytes);

	const float*	expectedOutputAsFloat	= reinterpret_cast<const float*>(&expectedBytes.front());
	const float*	outputAsFloat			= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	for (size_t idx = 0; idx < expectedBytes.size() / sizeof(float); ++idx)
	{
		const float f0 = expectedOutputAsFloat[idx];
		const float f1 = outputAsFloat[idx];
		// \todo relative error needs to be fairly high because FRem may be implemented as
		// (roughly) frac(a/b)*b, so LSB errors can be magnified. But this should be fine for now.
		if (deFloatAbs((f1 - f0) / f0) > 0.02)
			return false;
	}

	return true;
}

tcu::TestCaseGroup* createOpFRemGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opfrem", "Test the OpFRem instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;
	vector<float>					inputFloats1	(numElements, 0);
	vector<float>					inputFloats2	(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats1[0], numElements);
	fillRandomScalars(rnd, -100.f, 100.f, &inputFloats2[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		// Guard against divisors near zero.
		if (std::fabs(inputFloats2[ndx]) < 1e-3)
			inputFloats2[ndx] = 8.f;

		// The return value of std::fmod() has the same sign as its first operand, which is how OpFRem spec'd.
		outputFloats[ndx] = std::fmod(inputFloats1[ndx], inputFloats2[ndx]);
	}

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata1 DescriptorSet 0\n"
		"OpDecorate %indata1 Binding 0\n"
		"OpDecorate %indata2 DescriptorSet 0\n"
		"OpDecorate %indata2 Binding 1\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 2\n"
		"OpDecorate %f32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf        = OpTypeStruct %f32arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata1    = OpVariable %bufptr Uniform\n"
		"%indata2    = OpVariable %bufptr Uniform\n"
		"%outdata    = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc1    = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inval1    = OpLoad %f32 %inloc1\n"
		"%inloc2    = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inval2    = OpLoad %f32 %inloc2\n"
		"%rem       = OpFRem %f32 %inval1 %inval2\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %rem\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";

	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);
	spec.verifyIO = &compareFRem;

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "", spec));

	return group.release();
}

bool compareNMin (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	const BufferSp&			expectedOutput			(expectedOutputs[0].getBuffer());
	std::vector<deUint8>	data;
	expectedOutput->getBytes(data);

	const float* const		expectedOutputAsFloat	= reinterpret_cast<const float*>(&data.front());
	const float* const		outputAsFloat			= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	for (size_t idx = 0; idx < expectedOutput->getByteSize() / sizeof(float); ++idx)
	{
		const float f0 = expectedOutputAsFloat[idx];
		const float f1 = outputAsFloat[idx];

		// For NMin, we accept NaN as output if both inputs were NaN.
		// Otherwise the NaN is the wrong choise, as on architectures that
		// do not handle NaN, those are huge values.
		if (!(tcu::Float32(f1).isNaN() && tcu::Float32(f0).isNaN()) && deFloatAbs(f1 - f0) > 0.00001f)
			return false;
	}

	return true;
}

tcu::TestCaseGroup* createOpNMinGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opnmin", "Test the OpNMin instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;
	vector<float>					inputFloats1	(numElements, 0);
	vector<float>					inputFloats2	(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats1[0], numElements);
	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats2[0], numElements);

	// Make the first case a full-NAN case.
	inputFloats1[0] = TCU_NAN;
	inputFloats2[0] = TCU_NAN;

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		// By default, pick the smallest
		outputFloats[ndx] = std::min(inputFloats1[ndx], inputFloats2[ndx]);

		// Make half of the cases NaN cases
		if ((ndx & 1) == 0)
		{
			// Alternate between the NaN operand
			if ((ndx & 2) == 0)
			{
				outputFloats[ndx] = inputFloats2[ndx];
				inputFloats1[ndx] = TCU_NAN;
			}
			else
			{
				outputFloats[ndx] = inputFloats1[ndx];
				inputFloats2[ndx] = TCU_NAN;
			}
		}
	}

	spec.assembly =
		"OpCapability Shader\n"
		"%std450	= OpExtInstImport \"GLSL.std.450\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata1 DescriptorSet 0\n"
		"OpDecorate %indata1 Binding 0\n"
		"OpDecorate %indata2 DescriptorSet 0\n"
		"OpDecorate %indata2 Binding 1\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 2\n"
		"OpDecorate %f32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf        = OpTypeStruct %f32arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata1    = OpVariable %bufptr Uniform\n"
		"%indata2    = OpVariable %bufptr Uniform\n"
		"%outdata    = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc1    = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inval1    = OpLoad %f32 %inloc1\n"
		"%inloc2    = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inval2    = OpLoad %f32 %inloc2\n"
		"%rem       = OpExtInst %f32 %std450 NMin %inval1 %inval2\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %rem\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";

	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);
	spec.verifyIO = &compareNMin;

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "", spec));

	return group.release();
}

bool compareNMax (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	const BufferSp&			expectedOutput			= expectedOutputs[0].getBuffer();
	std::vector<deUint8>	data;
	expectedOutput->getBytes(data);

	const float* const		expectedOutputAsFloat	= reinterpret_cast<const float*>(&data.front());
	const float* const		outputAsFloat			= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	for (size_t idx = 0; idx < expectedOutput->getByteSize() / sizeof(float); ++idx)
	{
		const float f0 = expectedOutputAsFloat[idx];
		const float f1 = outputAsFloat[idx];

		// For NMax, NaN is considered acceptable result, since in
		// architectures that do not handle NaNs, those are huge values.
		if (!tcu::Float32(f1).isNaN() && deFloatAbs(f1 - f0) > 0.00001f)
			return false;
	}

	return true;
}

tcu::TestCaseGroup* createOpNMaxGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group(new tcu::TestCaseGroup(testCtx, "opnmax", "Test the OpNMax instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;
	vector<float>					inputFloats1	(numElements, 0);
	vector<float>					inputFloats2	(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats1[0], numElements);
	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats2[0], numElements);

	// Make the first case a full-NAN case.
	inputFloats1[0] = TCU_NAN;
	inputFloats2[0] = TCU_NAN;

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		// By default, pick the biggest
		outputFloats[ndx] = std::max(inputFloats1[ndx], inputFloats2[ndx]);

		// Make half of the cases NaN cases
		if ((ndx & 1) == 0)
		{
			// Alternate between the NaN operand
			if ((ndx & 2) == 0)
			{
				outputFloats[ndx] = inputFloats2[ndx];
				inputFloats1[ndx] = TCU_NAN;
			}
			else
			{
				outputFloats[ndx] = inputFloats1[ndx];
				inputFloats2[ndx] = TCU_NAN;
			}
		}
	}

	spec.assembly =
		"OpCapability Shader\n"
		"%std450	= OpExtInstImport \"GLSL.std.450\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata1 DescriptorSet 0\n"
		"OpDecorate %indata1 Binding 0\n"
		"OpDecorate %indata2 DescriptorSet 0\n"
		"OpDecorate %indata2 Binding 1\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 2\n"
		"OpDecorate %f32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf        = OpTypeStruct %f32arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata1    = OpVariable %bufptr Uniform\n"
		"%indata2    = OpVariable %bufptr Uniform\n"
		"%outdata    = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc1    = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inval1    = OpLoad %f32 %inloc1\n"
		"%inloc2    = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inval2    = OpLoad %f32 %inloc2\n"
		"%rem       = OpExtInst %f32 %std450 NMax %inval1 %inval2\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %rem\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";

	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);
	spec.verifyIO = &compareNMax;

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "", spec));

	return group.release();
}

bool compareNClamp (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	const BufferSp&			expectedOutput			= expectedOutputs[0].getBuffer();
	std::vector<deUint8>	data;
	expectedOutput->getBytes(data);

	const float* const		expectedOutputAsFloat	= reinterpret_cast<const float*>(&data.front());
	const float* const		outputAsFloat			= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	for (size_t idx = 0; idx < expectedOutput->getByteSize() / sizeof(float) / 2; ++idx)
	{
		const float e0 = expectedOutputAsFloat[idx * 2];
		const float e1 = expectedOutputAsFloat[idx * 2 + 1];
		const float res = outputAsFloat[idx];

		// For NClamp, we have two possible outcomes based on
		// whether NaNs are handled or not.
		// If either min or max value is NaN, the result is undefined,
		// so this test doesn't stress those. If the clamped value is
		// NaN, and NaNs are handled, the result is min; if NaNs are not
		// handled, they are big values that result in max.
		// If all three parameters are NaN, the result should be NaN.
		if (!((tcu::Float32(e0).isNaN() && tcu::Float32(res).isNaN()) ||
			 (deFloatAbs(e0 - res) < 0.00001f) ||
			 (deFloatAbs(e1 - res) < 0.00001f)))
			return false;
	}

	return true;
}

tcu::TestCaseGroup* createOpNClampGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opnclamp", "Test the OpNClamp instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;
	vector<float>					inputFloats1	(numElements, 0);
	vector<float>					inputFloats2	(numElements, 0);
	vector<float>					inputFloats3	(numElements, 0);
	vector<float>					outputFloats	(numElements * 2, 0);

	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats1[0], numElements);
	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats2[0], numElements);
	fillRandomScalars(rnd, -10000.f, 10000.f, &inputFloats3[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		// Results are only defined if max value is bigger than min value.
		if (inputFloats2[ndx] > inputFloats3[ndx])
		{
			float t = inputFloats2[ndx];
			inputFloats2[ndx] = inputFloats3[ndx];
			inputFloats3[ndx] = t;
		}

		// By default, do the clamp, setting both possible answers
		float defaultRes = std::min(std::max(inputFloats1[ndx], inputFloats2[ndx]), inputFloats3[ndx]);

		float maxResA = std::max(inputFloats1[ndx], inputFloats2[ndx]);
		float maxResB = maxResA;

		// Alternate between the NaN cases
		if (ndx & 1)
		{
			inputFloats1[ndx] = TCU_NAN;
			// If NaN is handled, the result should be same as the clamp minimum.
			// If NaN is not handled, the result should clamp to the clamp maximum.
			maxResA = inputFloats2[ndx];
			maxResB = inputFloats3[ndx];
		}
		else
		{
			// Not a NaN case - only one legal result.
			maxResA = defaultRes;
			maxResB = defaultRes;
		}

		outputFloats[ndx * 2] = maxResA;
		outputFloats[ndx * 2 + 1] = maxResB;
	}

	// Make the first case a full-NAN case.
	inputFloats1[0] = TCU_NAN;
	inputFloats2[0] = TCU_NAN;
	inputFloats3[0] = TCU_NAN;
	outputFloats[0] = TCU_NAN;
	outputFloats[1] = TCU_NAN;

	spec.assembly =
		"OpCapability Shader\n"
		"%std450	= OpExtInstImport \"GLSL.std.450\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata1 DescriptorSet 0\n"
		"OpDecorate %indata1 Binding 0\n"
		"OpDecorate %indata2 DescriptorSet 0\n"
		"OpDecorate %indata2 Binding 1\n"
		"OpDecorate %indata3 DescriptorSet 0\n"
		"OpDecorate %indata3 Binding 2\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 3\n"
		"OpDecorate %f32arr ArrayStride 4\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf        = OpTypeStruct %f32arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata1    = OpVariable %bufptr Uniform\n"
		"%indata2    = OpVariable %bufptr Uniform\n"
		"%indata3    = OpVariable %bufptr Uniform\n"
		"%outdata    = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc1    = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inval1    = OpLoad %f32 %inloc1\n"
		"%inloc2    = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inval2    = OpLoad %f32 %inloc2\n"
		"%inloc3    = OpAccessChain %f32ptr %indata3 %zero %x\n"
		"%inval3    = OpLoad %f32 %inloc3\n"
		"%rem       = OpExtInst %f32 %std450 NClamp %inval1 %inval2 %inval3\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %rem\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";

	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats3)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);
	spec.verifyIO = &compareNClamp;

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "", spec));

	return group.release();
}

tcu::TestCaseGroup* createOpSRemComputeGroup (tcu::TestContext& testCtx, qpTestResult negFailResult)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsrem", "Test the OpSRem instruction"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;

	const struct CaseParams
	{
		const char*		name;
		const char*		failMessage;		// customized status message
		qpTestResult	failResult;			// override status on failure
		int				op1Min, op1Max;		// operand ranges
		int				op2Min, op2Max;
	} cases[] =
	{
		{ "positive",	"Output doesn't match with expected",				QP_TEST_RESULT_FAIL,	0,		65536,	0,		100 },
		{ "all",		"Inconsistent results, but within specification",	negFailResult,			-65536,	65536,	-100,	100 },	// see below
	};
	// If either operand is negative the result is undefined. Some implementations may still return correct values.

	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
	{
		const CaseParams&	params		= cases[caseNdx];
		ComputeShaderSpec	spec;
		vector<deInt32>		inputInts1	(numElements, 0);
		vector<deInt32>		inputInts2	(numElements, 0);
		vector<deInt32>		outputInts	(numElements, 0);

		fillRandomScalars(rnd, params.op1Min, params.op1Max, &inputInts1[0], numElements);
		fillRandomScalars(rnd, params.op2Min, params.op2Max, &inputInts2[0], numElements, filterNotZero);

		for (int ndx = 0; ndx < numElements; ++ndx)
		{
			// The return value of std::fmod() has the same sign as its first operand, which is how OpFRem spec'd.
			outputInts[ndx] = inputInts1[ndx] % inputInts2[ndx];
		}

		spec.assembly =
			string(getComputeAsmShaderPreamble()) +

			"OpName %main           \"main\"\n"
			"OpName %id             \"gl_GlobalInvocationID\"\n"

			"OpDecorate %id BuiltIn GlobalInvocationId\n"

			"OpDecorate %buf BufferBlock\n"
			"OpDecorate %indata1 DescriptorSet 0\n"
			"OpDecorate %indata1 Binding 0\n"
			"OpDecorate %indata2 DescriptorSet 0\n"
			"OpDecorate %indata2 Binding 1\n"
			"OpDecorate %outdata DescriptorSet 0\n"
			"OpDecorate %outdata Binding 2\n"
			"OpDecorate %i32arr ArrayStride 4\n"
			"OpMemberDecorate %buf 0 Offset 0\n"

			+ string(getComputeAsmCommonTypes()) +

			"%buf        = OpTypeStruct %i32arr\n"
			"%bufptr     = OpTypePointer Uniform %buf\n"
			"%indata1    = OpVariable %bufptr Uniform\n"
			"%indata2    = OpVariable %bufptr Uniform\n"
			"%outdata    = OpVariable %bufptr Uniform\n"

			"%id        = OpVariable %uvec3ptr Input\n"
			"%zero      = OpConstant %i32 0\n"

			"%main      = OpFunction %void None %voidf\n"
			"%label     = OpLabel\n"
			"%idval     = OpLoad %uvec3 %id\n"
			"%x         = OpCompositeExtract %u32 %idval 0\n"
			"%inloc1    = OpAccessChain %i32ptr %indata1 %zero %x\n"
			"%inval1    = OpLoad %i32 %inloc1\n"
			"%inloc2    = OpAccessChain %i32ptr %indata2 %zero %x\n"
			"%inval2    = OpLoad %i32 %inloc2\n"
			"%rem       = OpSRem %i32 %inval1 %inval2\n"
			"%outloc    = OpAccessChain %i32ptr %outdata %zero %x\n"
			"             OpStore %outloc %rem\n"
			"             OpReturn\n"
			"             OpFunctionEnd\n";

		spec.inputs.push_back	(BufferSp(new Int32Buffer(inputInts1)));
		spec.inputs.push_back	(BufferSp(new Int32Buffer(inputInts2)));
		spec.outputs.push_back	(BufferSp(new Int32Buffer(outputInts)));
		spec.numWorkGroups		= IVec3(numElements, 1, 1);
		spec.failResult			= params.failResult;
		spec.failMessage		= params.failMessage;

		group->addChild(new SpvAsmComputeShaderCase(testCtx, params.name, "", spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createOpSRemComputeGroup64 (tcu::TestContext& testCtx, qpTestResult negFailResult)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsrem64", "Test the 64-bit OpSRem instruction"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;

	const struct CaseParams
	{
		const char*		name;
		const char*		failMessage;		// customized status message
		qpTestResult	failResult;			// override status on failure
		bool			positive;
	} cases[] =
	{
		{ "positive",	"Output doesn't match with expected",				QP_TEST_RESULT_FAIL,	true },
		{ "all",		"Inconsistent results, but within specification",	negFailResult,			false },	// see below
	};
	// If either operand is negative the result is undefined. Some implementations may still return correct values.

	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
	{
		const CaseParams&	params		= cases[caseNdx];
		ComputeShaderSpec	spec;
		vector<deInt64>		inputInts1	(numElements, 0);
		vector<deInt64>		inputInts2	(numElements, 0);
		vector<deInt64>		outputInts	(numElements, 0);

		if (params.positive)
		{
			fillRandomInt64sLogDistributed(rnd, inputInts1, numElements, filterNonNegative);
			fillRandomInt64sLogDistributed(rnd, inputInts2, numElements, filterPositive);
		}
		else
		{
			fillRandomInt64sLogDistributed(rnd, inputInts1, numElements);
			fillRandomInt64sLogDistributed(rnd, inputInts2, numElements, filterNotZero);
		}

		for (int ndx = 0; ndx < numElements; ++ndx)
		{
			// The return value of std::fmod() has the same sign as its first operand, which is how OpFRem spec'd.
			outputInts[ndx] = inputInts1[ndx] % inputInts2[ndx];
		}

		spec.assembly =
			"OpCapability Int64\n"

			+ string(getComputeAsmShaderPreamble()) +

			"OpName %main           \"main\"\n"
			"OpName %id             \"gl_GlobalInvocationID\"\n"

			"OpDecorate %id BuiltIn GlobalInvocationId\n"

			"OpDecorate %buf BufferBlock\n"
			"OpDecorate %indata1 DescriptorSet 0\n"
			"OpDecorate %indata1 Binding 0\n"
			"OpDecorate %indata2 DescriptorSet 0\n"
			"OpDecorate %indata2 Binding 1\n"
			"OpDecorate %outdata DescriptorSet 0\n"
			"OpDecorate %outdata Binding 2\n"
			"OpDecorate %i64arr ArrayStride 8\n"
			"OpMemberDecorate %buf 0 Offset 0\n"

			+ string(getComputeAsmCommonTypes())
			+ string(getComputeAsmCommonInt64Types()) +

			"%buf        = OpTypeStruct %i64arr\n"
			"%bufptr     = OpTypePointer Uniform %buf\n"
			"%indata1    = OpVariable %bufptr Uniform\n"
			"%indata2    = OpVariable %bufptr Uniform\n"
			"%outdata    = OpVariable %bufptr Uniform\n"

			"%id        = OpVariable %uvec3ptr Input\n"
			"%zero      = OpConstant %i64 0\n"

			"%main      = OpFunction %void None %voidf\n"
			"%label     = OpLabel\n"
			"%idval     = OpLoad %uvec3 %id\n"
			"%x         = OpCompositeExtract %u32 %idval 0\n"
			"%inloc1    = OpAccessChain %i64ptr %indata1 %zero %x\n"
			"%inval1    = OpLoad %i64 %inloc1\n"
			"%inloc2    = OpAccessChain %i64ptr %indata2 %zero %x\n"
			"%inval2    = OpLoad %i64 %inloc2\n"
			"%rem       = OpSRem %i64 %inval1 %inval2\n"
			"%outloc    = OpAccessChain %i64ptr %outdata %zero %x\n"
			"             OpStore %outloc %rem\n"
			"             OpReturn\n"
			"             OpFunctionEnd\n";

		spec.inputs.push_back	(BufferSp(new Int64Buffer(inputInts1)));
		spec.inputs.push_back	(BufferSp(new Int64Buffer(inputInts2)));
		spec.outputs.push_back	(BufferSp(new Int64Buffer(outputInts)));
		spec.numWorkGroups		= IVec3(numElements, 1, 1);
		spec.failResult			= params.failResult;
		spec.failMessage		= params.failMessage;

		spec.requestedVulkanFeatures.coreFeatures.shaderInt64 = VK_TRUE;

		group->addChild(new SpvAsmComputeShaderCase(testCtx, params.name, "", spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createOpSModComputeGroup (tcu::TestContext& testCtx, qpTestResult negFailResult)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsmod", "Test the OpSMod instruction"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;

	const struct CaseParams
	{
		const char*		name;
		const char*		failMessage;		// customized status message
		qpTestResult	failResult;			// override status on failure
		int				op1Min, op1Max;		// operand ranges
		int				op2Min, op2Max;
	} cases[] =
	{
		{ "positive",	"Output doesn't match with expected",				QP_TEST_RESULT_FAIL,	0,		65536,	0,		100 },
		{ "all",		"Inconsistent results, but within specification",	negFailResult,			-65536,	65536,	-100,	100 },	// see below
	};
	// If either operand is negative the result is undefined. Some implementations may still return correct values.

	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
	{
		const CaseParams&	params		= cases[caseNdx];

		ComputeShaderSpec	spec;
		vector<deInt32>		inputInts1	(numElements, 0);
		vector<deInt32>		inputInts2	(numElements, 0);
		vector<deInt32>		outputInts	(numElements, 0);

		fillRandomScalars(rnd, params.op1Min, params.op1Max, &inputInts1[0], numElements);
		fillRandomScalars(rnd, params.op2Min, params.op2Max, &inputInts2[0], numElements, filterNotZero);

		for (int ndx = 0; ndx < numElements; ++ndx)
		{
			deInt32 rem = inputInts1[ndx] % inputInts2[ndx];
			if (rem == 0)
			{
				outputInts[ndx] = 0;
			}
			else if ((inputInts1[ndx] >= 0) == (inputInts2[ndx] >= 0))
			{
				// They have the same sign
				outputInts[ndx] = rem;
			}
			else
			{
				// They have opposite sign.  The remainder operation takes the
				// sign inputInts1[ndx] but OpSMod is supposed to take ths sign
				// of inputInts2[ndx].  Adding inputInts2[ndx] will ensure that
				// the result has the correct sign and that it is still
				// congruent to inputInts1[ndx] modulo inputInts2[ndx]
				//
				// See also http://mathforum.org/library/drmath/view/52343.html
				outputInts[ndx] = rem + inputInts2[ndx];
			}
		}

		spec.assembly =
			string(getComputeAsmShaderPreamble()) +

			"OpName %main           \"main\"\n"
			"OpName %id             \"gl_GlobalInvocationID\"\n"

			"OpDecorate %id BuiltIn GlobalInvocationId\n"

			"OpDecorate %buf BufferBlock\n"
			"OpDecorate %indata1 DescriptorSet 0\n"
			"OpDecorate %indata1 Binding 0\n"
			"OpDecorate %indata2 DescriptorSet 0\n"
			"OpDecorate %indata2 Binding 1\n"
			"OpDecorate %outdata DescriptorSet 0\n"
			"OpDecorate %outdata Binding 2\n"
			"OpDecorate %i32arr ArrayStride 4\n"
			"OpMemberDecorate %buf 0 Offset 0\n"

			+ string(getComputeAsmCommonTypes()) +

			"%buf        = OpTypeStruct %i32arr\n"
			"%bufptr     = OpTypePointer Uniform %buf\n"
			"%indata1    = OpVariable %bufptr Uniform\n"
			"%indata2    = OpVariable %bufptr Uniform\n"
			"%outdata    = OpVariable %bufptr Uniform\n"

			"%id        = OpVariable %uvec3ptr Input\n"
			"%zero      = OpConstant %i32 0\n"

			"%main      = OpFunction %void None %voidf\n"
			"%label     = OpLabel\n"
			"%idval     = OpLoad %uvec3 %id\n"
			"%x         = OpCompositeExtract %u32 %idval 0\n"
			"%inloc1    = OpAccessChain %i32ptr %indata1 %zero %x\n"
			"%inval1    = OpLoad %i32 %inloc1\n"
			"%inloc2    = OpAccessChain %i32ptr %indata2 %zero %x\n"
			"%inval2    = OpLoad %i32 %inloc2\n"
			"%rem       = OpSMod %i32 %inval1 %inval2\n"
			"%outloc    = OpAccessChain %i32ptr %outdata %zero %x\n"
			"             OpStore %outloc %rem\n"
			"             OpReturn\n"
			"             OpFunctionEnd\n";

		spec.inputs.push_back	(BufferSp(new Int32Buffer(inputInts1)));
		spec.inputs.push_back	(BufferSp(new Int32Buffer(inputInts2)));
		spec.outputs.push_back	(BufferSp(new Int32Buffer(outputInts)));
		spec.numWorkGroups		= IVec3(numElements, 1, 1);
		spec.failResult			= params.failResult;
		spec.failMessage		= params.failMessage;

		group->addChild(new SpvAsmComputeShaderCase(testCtx, params.name, "", spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createOpSModComputeGroup64 (tcu::TestContext& testCtx, qpTestResult negFailResult)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsmod64", "Test the OpSMod instruction"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 200;

	const struct CaseParams
	{
		const char*		name;
		const char*		failMessage;		// customized status message
		qpTestResult	failResult;			// override status on failure
		bool			positive;
	} cases[] =
	{
		{ "positive",	"Output doesn't match with expected",				QP_TEST_RESULT_FAIL,	true },
		{ "all",		"Inconsistent results, but within specification",	negFailResult,			false },	// see below
	};
	// If either operand is negative the result is undefined. Some implementations may still return correct values.

	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
	{
		const CaseParams&	params		= cases[caseNdx];

		ComputeShaderSpec	spec;
		vector<deInt64>		inputInts1	(numElements, 0);
		vector<deInt64>		inputInts2	(numElements, 0);
		vector<deInt64>		outputInts	(numElements, 0);


		if (params.positive)
		{
			fillRandomInt64sLogDistributed(rnd, inputInts1, numElements, filterNonNegative);
			fillRandomInt64sLogDistributed(rnd, inputInts2, numElements, filterPositive);
		}
		else
		{
			fillRandomInt64sLogDistributed(rnd, inputInts1, numElements);
			fillRandomInt64sLogDistributed(rnd, inputInts2, numElements, filterNotZero);
		}

		for (int ndx = 0; ndx < numElements; ++ndx)
		{
			deInt64 rem = inputInts1[ndx] % inputInts2[ndx];
			if (rem == 0)
			{
				outputInts[ndx] = 0;
			}
			else if ((inputInts1[ndx] >= 0) == (inputInts2[ndx] >= 0))
			{
				// They have the same sign
				outputInts[ndx] = rem;
			}
			else
			{
				// They have opposite sign.  The remainder operation takes the
				// sign inputInts1[ndx] but OpSMod is supposed to take ths sign
				// of inputInts2[ndx].  Adding inputInts2[ndx] will ensure that
				// the result has the correct sign and that it is still
				// congruent to inputInts1[ndx] modulo inputInts2[ndx]
				//
				// See also http://mathforum.org/library/drmath/view/52343.html
				outputInts[ndx] = rem + inputInts2[ndx];
			}
		}

		spec.assembly =
			"OpCapability Int64\n"

			+ string(getComputeAsmShaderPreamble()) +

			"OpName %main           \"main\"\n"
			"OpName %id             \"gl_GlobalInvocationID\"\n"

			"OpDecorate %id BuiltIn GlobalInvocationId\n"

			"OpDecorate %buf BufferBlock\n"
			"OpDecorate %indata1 DescriptorSet 0\n"
			"OpDecorate %indata1 Binding 0\n"
			"OpDecorate %indata2 DescriptorSet 0\n"
			"OpDecorate %indata2 Binding 1\n"
			"OpDecorate %outdata DescriptorSet 0\n"
			"OpDecorate %outdata Binding 2\n"
			"OpDecorate %i64arr ArrayStride 8\n"
			"OpMemberDecorate %buf 0 Offset 0\n"

			+ string(getComputeAsmCommonTypes())
			+ string(getComputeAsmCommonInt64Types()) +

			"%buf        = OpTypeStruct %i64arr\n"
			"%bufptr     = OpTypePointer Uniform %buf\n"
			"%indata1    = OpVariable %bufptr Uniform\n"
			"%indata2    = OpVariable %bufptr Uniform\n"
			"%outdata    = OpVariable %bufptr Uniform\n"

			"%id        = OpVariable %uvec3ptr Input\n"
			"%zero      = OpConstant %i64 0\n"

			"%main      = OpFunction %void None %voidf\n"
			"%label     = OpLabel\n"
			"%idval     = OpLoad %uvec3 %id\n"
			"%x         = OpCompositeExtract %u32 %idval 0\n"
			"%inloc1    = OpAccessChain %i64ptr %indata1 %zero %x\n"
			"%inval1    = OpLoad %i64 %inloc1\n"
			"%inloc2    = OpAccessChain %i64ptr %indata2 %zero %x\n"
			"%inval2    = OpLoad %i64 %inloc2\n"
			"%rem       = OpSMod %i64 %inval1 %inval2\n"
			"%outloc    = OpAccessChain %i64ptr %outdata %zero %x\n"
			"             OpStore %outloc %rem\n"
			"             OpReturn\n"
			"             OpFunctionEnd\n";

		spec.inputs.push_back	(BufferSp(new Int64Buffer(inputInts1)));
		spec.inputs.push_back	(BufferSp(new Int64Buffer(inputInts2)));
		spec.outputs.push_back	(BufferSp(new Int64Buffer(outputInts)));
		spec.numWorkGroups		= IVec3(numElements, 1, 1);
		spec.failResult			= params.failResult;
		spec.failMessage		= params.failMessage;

		spec.requestedVulkanFeatures.coreFeatures.shaderInt64 = VK_TRUE;

		group->addChild(new SpvAsmComputeShaderCase(testCtx, params.name, "", spec));
	}

	return group.release();
}

// Copy contents in the input buffer to the output buffer.
tcu::TestCaseGroup* createOpCopyMemoryGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opcopymemory", "Test the OpCopyMemory instruction"));
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;

	// The following case adds vec4(0., 0.5, 1.5, 2.5) to each of the elements in the input buffer and writes output to the output buffer.
	ComputeShaderSpec				spec1;
	vector<Vec4>					inputFloats1	(numElements);
	vector<Vec4>					outputFloats1	(numElements);

	fillRandomScalars(rnd, -200.f, 200.f, &inputFloats1[0], numElements * 4);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats1);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats1[ndx] = inputFloats1[ndx] + Vec4(0.f, 0.5f, 1.5f, 2.5f);

	spec1.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %vec4arr ArrayStride 16\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%vec4       = OpTypeVector %f32 4\n"
		"%vec4ptr_u  = OpTypePointer Uniform %vec4\n"
		"%vec4ptr_f  = OpTypePointer Function %vec4\n"
		"%vec4arr    = OpTypeRuntimeArray %vec4\n"
		"%buf        = OpTypeStruct %vec4arr\n"
		"%bufptr     = OpTypePointer Uniform %buf\n"
		"%indata     = OpVariable %bufptr Uniform\n"
		"%outdata    = OpVariable %bufptr Uniform\n"

		"%id         = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%c_f_0      = OpConstant %f32 0.\n"
		"%c_f_0_5    = OpConstant %f32 0.5\n"
		"%c_f_1_5    = OpConstant %f32 1.5\n"
		"%c_f_2_5    = OpConstant %f32 2.5\n"
		"%c_vec4     = OpConstantComposite %vec4 %c_f_0 %c_f_0_5 %c_f_1_5 %c_f_2_5\n"

		"%main       = OpFunction %void None %voidf\n"
		"%label      = OpLabel\n"
		"%v_vec4     = OpVariable %vec4ptr_f Function\n"
		"%idval      = OpLoad %uvec3 %id\n"
		"%x          = OpCompositeExtract %u32 %idval 0\n"
		"%inloc      = OpAccessChain %vec4ptr_u %indata %zero %x\n"
		"%outloc     = OpAccessChain %vec4ptr_u %outdata %zero %x\n"
		"              OpCopyMemory %v_vec4 %inloc\n"
		"%v_vec4_val = OpLoad %vec4 %v_vec4\n"
		"%add        = OpFAdd %vec4 %v_vec4_val %c_vec4\n"
		"              OpStore %outloc %add\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n";

	spec1.inputs.push_back(BufferSp(new Vec4Buffer(inputFloats1)));
	spec1.outputs.push_back(BufferSp(new Vec4Buffer(outputFloats1)));
	spec1.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vector", "OpCopyMemory elements of vector type", spec1));

	// The following case copies a float[100] variable from the input buffer to the output buffer.
	ComputeShaderSpec				spec2;
	vector<float>					inputFloats2	(numElements);
	vector<float>					outputFloats2	(numElements);

	fillRandomScalars(rnd, -200.f, 200.f, &inputFloats2[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats2[ndx] = inputFloats2[ndx];

	spec2.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %f32arr100 ArrayStride 4\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%hundred        = OpConstant %u32 100\n"
		"%f32arr100      = OpTypeArray %f32 %hundred\n"
		"%f32arr100ptr_f = OpTypePointer Function %f32arr100\n"
		"%f32arr100ptr_u = OpTypePointer Uniform %f32arr100\n"
		"%buf            = OpTypeStruct %f32arr100\n"
		"%bufptr         = OpTypePointer Uniform %buf\n"
		"%indata         = OpVariable %bufptr Uniform\n"
		"%outdata        = OpVariable %bufptr Uniform\n"

		"%id             = OpVariable %uvec3ptr Input\n"
		"%zero           = OpConstant %i32 0\n"

		"%main           = OpFunction %void None %voidf\n"
		"%label          = OpLabel\n"
		"%var            = OpVariable %f32arr100ptr_f Function\n"
		"%inarr          = OpAccessChain %f32arr100ptr_u %indata %zero\n"
		"%outarr         = OpAccessChain %f32arr100ptr_u %outdata %zero\n"
		"                  OpCopyMemory %var %inarr\n"
		"                  OpCopyMemory %outarr %var\n"
		"                  OpReturn\n"
		"                  OpFunctionEnd\n";

	spec2.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
	spec2.outputs.push_back(BufferSp(new Float32Buffer(outputFloats2)));
	spec2.numWorkGroups = IVec3(1, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "array", "OpCopyMemory elements of array type", spec2));

	// The following case copies a struct{vec4, vec4, vec4, vec4} variable from the input buffer to the output buffer.
	ComputeShaderSpec				spec3;
	vector<float>					inputFloats3	(16);
	vector<float>					outputFloats3	(16);

	fillRandomScalars(rnd, -200.f, 200.f, &inputFloats3[0], 16);

	for (size_t ndx = 0; ndx < 16; ++ndx)
		outputFloats3[ndx] = inputFloats3[ndx];

	spec3.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		//"OpMemberDecorate %buf 0 Offset 0\n"  - exists in getComputeAsmInputOutputBufferTraits
		"OpMemberDecorate %buf 1 Offset 16\n"
		"OpMemberDecorate %buf 2 Offset 32\n"
		"OpMemberDecorate %buf 3 Offset 48\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%vec4      = OpTypeVector %f32 4\n"
		"%buf       = OpTypeStruct %vec4 %vec4 %vec4 %vec4\n"
		"%bufptr    = OpTypePointer Uniform %buf\n"
		"%indata    = OpVariable %bufptr Uniform\n"
		"%outdata   = OpVariable %bufptr Uniform\n"
		"%vec4stptr = OpTypePointer Function %buf\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%var       = OpVariable %vec4stptr Function\n"
		"             OpCopyMemory %var %indata\n"
		"             OpCopyMemory %outdata %var\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";

	spec3.inputs.push_back(BufferSp(new Float32Buffer(inputFloats3)));
	spec3.outputs.push_back(BufferSp(new Float32Buffer(outputFloats3)));
	spec3.numWorkGroups = IVec3(1, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "struct", "OpCopyMemory elements of struct type", spec3));

	// The following case negates multiple float variables from the input buffer and stores the results to the output buffer.
	ComputeShaderSpec				spec4;
	vector<float>					inputFloats4	(numElements);
	vector<float>					outputFloats4	(numElements);

	fillRandomScalars(rnd, -200.f, 200.f, &inputFloats4[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats4[ndx] = -inputFloats4[ndx];

	spec4.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%f32ptr_f  = OpTypePointer Function %f32\n"
		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%var       = OpVariable %f32ptr_f Function\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpCopyMemory %var %inloc\n"
		"%val       = OpLoad %f32 %var\n"
		"%neg       = OpFNegate %f32 %val\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";

	spec4.inputs.push_back(BufferSp(new Float32Buffer(inputFloats4)));
	spec4.outputs.push_back(BufferSp(new Float32Buffer(outputFloats4)));
	spec4.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "float", "OpCopyMemory elements of float type", spec4));

	return group.release();
}

tcu::TestCaseGroup* createOpCopyObjectGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opcopyobject", "Test the OpCopyObject instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	fillRandomScalars(rnd, -200.f, 200.f, &inputFloats[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = inputFloats[ndx] + 7.5f;

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%fmat     = OpTypeMatrix %fvec3 3\n"
		"%three    = OpConstant %u32 3\n"
		"%farr     = OpTypeArray %f32 %three\n"
		"%fst      = OpTypeStruct %f32 %f32\n"

		+ string(getComputeAsmInputOutputBuffer()) +

		"%id            = OpVariable %uvec3ptr Input\n"
		"%zero          = OpConstant %i32 0\n"
		"%c_f           = OpConstant %f32 1.5\n"
		"%c_fvec3       = OpConstantComposite %fvec3 %c_f %c_f %c_f\n"
		"%c_fmat        = OpConstantComposite %fmat %c_fvec3 %c_fvec3 %c_fvec3\n"
		"%c_farr        = OpConstantComposite %farr %c_f %c_f %c_f\n"
		"%c_fst         = OpConstantComposite %fst %c_f %c_f\n"

		"%main          = OpFunction %void None %voidf\n"
		"%label         = OpLabel\n"
		"%c_f_copy      = OpCopyObject %f32   %c_f\n"
		"%c_fvec3_copy  = OpCopyObject %fvec3 %c_fvec3\n"
		"%c_fmat_copy   = OpCopyObject %fmat  %c_fmat\n"
		"%c_farr_copy   = OpCopyObject %farr  %c_farr\n"
		"%c_fst_copy    = OpCopyObject %fst   %c_fst\n"
		"%fvec3_elem    = OpCompositeExtract %f32 %c_fvec3_copy 0\n"
		"%fmat_elem     = OpCompositeExtract %f32 %c_fmat_copy 1 2\n"
		"%farr_elem     = OpCompositeExtract %f32 %c_farr_copy 2\n"
		"%fst_elem      = OpCompositeExtract %f32 %c_fst_copy 1\n"
		// Add up. 1.5 * 5 = 7.5.
		"%add1          = OpFAdd %f32 %c_f_copy %fvec3_elem\n"
		"%add2          = OpFAdd %f32 %add1     %fmat_elem\n"
		"%add3          = OpFAdd %f32 %add2     %farr_elem\n"
		"%add4          = OpFAdd %f32 %add3     %fst_elem\n"

		"%idval         = OpLoad %uvec3 %id\n"
		"%x             = OpCompositeExtract %u32 %idval 0\n"
		"%inloc         = OpAccessChain %f32ptr %indata %zero %x\n"
		"%outloc        = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%inval         = OpLoad %f32 %inloc\n"
		"%add           = OpFAdd %f32 %add4 %inval\n"
		"                 OpStore %outloc %add\n"
		"                 OpReturn\n"
		"                 OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "spotcheck", "OpCopyObject on different types", spec));

	return group.release();
}
// Assembly code used for testing OpUnreachable is based on GLSL source code:
//
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input {
//   float elements[];
// } input_data;
// layout(std140, set = 0, binding = 1) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// void not_called_func() {
//   // place OpUnreachable here
// }
//
// uint modulo4(uint val) {
//   switch (val % uint(4)) {
//     case 0:  return 3;
//     case 1:  return 2;
//     case 2:  return 1;
//     case 3:  return 0;
//     default: return 100; // place OpUnreachable here
//   }
// }
//
// uint const5() {
//   return 5;
//   // place OpUnreachable here
// }
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   if (const5() > modulo4(1000)) {
//     output_data.elements[x] = -input_data.elements[x];
//   } else {
//     // place OpUnreachable here
//     output_data.elements[x] = input_data.elements[x];
//   }
// }

void addOpUnreachableAmberTests(tcu::TestCaseGroup& group, tcu::TestContext& testCtx)
{
	static const char dataDir[] = "spirv_assembly/instruction/compute/unreachable";

	struct Case
	{
		string	name;
		string	desc;
	};

	static const Case cases[] =
	{
		{ "unreachable-switch-merge-in-loop",	"Test containing an unreachable switch merge block inside an infinite loop"	},
	};

	for (int i = 0; i < DE_LENGTH_OF_ARRAY(cases); ++i)
	{
		const string fileName = cases[i].name + ".amber";
		group.addChild(cts_amber::createAmberTestCase(testCtx, cases[i].name.c_str(), cases[i].desc.c_str(), dataDir, fileName));
	}
}

tcu::TestCaseGroup* createOpUnreachableGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opunreachable", "Test the OpUnreachable instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main            \"main\"\n"
		"OpName %func_not_called_func \"not_called_func(\"\n"
		"OpName %func_modulo4         \"modulo4(u1;\"\n"
		"OpName %func_const5          \"const5(\"\n"
		"OpName %id                   \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%u32ptr    = OpTypePointer Function %u32\n"
		"%uintfuint = OpTypeFunction %u32 %u32ptr\n"
		"%unitf     = OpTypeFunction %u32\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %u32 0\n"
		"%one       = OpConstant %u32 1\n"
		"%two       = OpConstant %u32 2\n"
		"%three     = OpConstant %u32 3\n"
		"%four      = OpConstant %u32 4\n"
		"%five      = OpConstant %u32 5\n"
		"%hundred   = OpConstant %u32 100\n"
		"%thousand  = OpConstant %u32 1000\n"

		+ string(getComputeAsmInputOutputBuffer()) +

		// Main()
		"%main   = OpFunction %void None %voidf\n"
		"%main_entry  = OpLabel\n"
		"%v_thousand  = OpVariable %u32ptr Function %thousand\n"
		"%idval       = OpLoad %uvec3 %id\n"
		"%x           = OpCompositeExtract %u32 %idval 0\n"
		"%inloc       = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval       = OpLoad %f32 %inloc\n"
		"%outloc      = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%ret_const5  = OpFunctionCall %u32 %func_const5\n"
		"%ret_modulo4 = OpFunctionCall %u32 %func_modulo4 %v_thousand\n"
		"%cmp_gt      = OpUGreaterThan %bool %ret_const5 %ret_modulo4\n"
		"               OpSelectionMerge %if_end None\n"
		"               OpBranchConditional %cmp_gt %if_true %if_false\n"
		"%if_true     = OpLabel\n"
		"%negate      = OpFNegate %f32 %inval\n"
		"               OpStore %outloc %negate\n"
		"               OpBranch %if_end\n"
		"%if_false    = OpLabel\n"
		"               OpUnreachable\n" // Unreachable else branch for if statement
		"%if_end      = OpLabel\n"
		"               OpReturn\n"
		"               OpFunctionEnd\n"

		// not_called_function()
		"%func_not_called_func  = OpFunction %void None %voidf\n"
		"%not_called_func_entry = OpLabel\n"
		"                         OpUnreachable\n" // Unreachable entry block in not called static function
		"                         OpFunctionEnd\n"

		// modulo4()
		"%func_modulo4  = OpFunction %u32 None %uintfuint\n"
		"%valptr        = OpFunctionParameter %u32ptr\n"
		"%modulo4_entry = OpLabel\n"
		"%val           = OpLoad %u32 %valptr\n"
		"%modulo        = OpUMod %u32 %val %four\n"
		"                 OpSelectionMerge %switch_merge None\n"
		"                 OpSwitch %modulo %default 0 %case0 1 %case1 2 %case2 3 %case3\n"
		"%case0         = OpLabel\n"
		"                 OpReturnValue %three\n"
		"%case1         = OpLabel\n"
		"                 OpReturnValue %two\n"
		"%case2         = OpLabel\n"
		"                 OpReturnValue %one\n"
		"%case3         = OpLabel\n"
		"                 OpReturnValue %zero\n"
		"%default       = OpLabel\n"
		"                 OpUnreachable\n" // Unreachable default case for switch statement
		"%switch_merge  = OpLabel\n"
		"                 OpUnreachable\n" // Unreachable merge block for switch statement
		"                 OpFunctionEnd\n"

		// const5()
		"%func_const5  = OpFunction %u32 None %unitf\n"
		"%const5_entry = OpLabel\n"
		"                OpReturnValue %five\n"
		"%unreachable  = OpLabel\n"
		"                OpUnreachable\n" // Unreachable block in function
		"                OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "OpUnreachable appearing at different places", spec));

	addOpUnreachableAmberTests(*group, testCtx);

	return group.release();
}

// Assembly code used for testing decoration group is based on GLSL source code:
//
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input0 {
//   float elements[];
// } input_data0;
// layout(std140, set = 0, binding = 1) readonly buffer Input1 {
//   float elements[];
// } input_data1;
// layout(std140, set = 0, binding = 2) readonly buffer Input2 {
//   float elements[];
// } input_data2;
// layout(std140, set = 0, binding = 3) readonly buffer Input3 {
//   float elements[];
// } input_data3;
// layout(std140, set = 0, binding = 4) readonly buffer Input4 {
//   float elements[];
// } input_data4;
// layout(std140, set = 0, binding = 5) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   output_data.elements[x] = input_data0.elements[x] + input_data1.elements[x] + input_data2.elements[x] + input_data3.elements[x] + input_data4.elements[x];
// }
tcu::TestCaseGroup* createDecorationGroupGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "decoration_group", "Test the OpDecorationGroup & OpGroupDecorate instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats0	(numElements, 0);
	vector<float>					inputFloats1	(numElements, 0);
	vector<float>					inputFloats2	(numElements, 0);
	vector<float>					inputFloats3	(numElements, 0);
	vector<float>					inputFloats4	(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats0[0], numElements);
	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats1[0], numElements);
	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats2[0], numElements);
	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats3[0], numElements);
	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats4[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats0);
	floorAll(inputFloats1);
	floorAll(inputFloats2);
	floorAll(inputFloats3);
	floorAll(inputFloats4);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = inputFloats0[ndx] + inputFloats1[ndx] + inputFloats2[ndx] + inputFloats3[ndx] + inputFloats4[ndx];

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		// Not using group decoration on variable.
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		// Not using group decoration on type.
		"OpDecorate %f32arr ArrayStride 4\n"

		"OpDecorate %groups BufferBlock\n"
		"OpDecorate %groupm Offset 0\n"
		"%groups = OpDecorationGroup\n"
		"%groupm = OpDecorationGroup\n"

		// Group decoration on multiple structs.
		"OpGroupDecorate %groups %outbuf %inbuf0 %inbuf1 %inbuf2 %inbuf3 %inbuf4\n"
		// Group decoration on multiple struct members.
		"OpGroupMemberDecorate %groupm %outbuf 0 %inbuf0 0 %inbuf1 0 %inbuf2 0 %inbuf3 0 %inbuf4 0\n"

		"OpDecorate %group1 DescriptorSet 0\n"
		"OpDecorate %group3 DescriptorSet 0\n"
		"OpDecorate %group3 NonWritable\n"
		"OpDecorate %group3 Restrict\n"
		"%group0 = OpDecorationGroup\n"
		"%group1 = OpDecorationGroup\n"
		"%group3 = OpDecorationGroup\n"

		// Applying the same decoration group multiple times.
		"OpGroupDecorate %group1 %outdata\n"
		"OpGroupDecorate %group1 %outdata\n"
		"OpGroupDecorate %group1 %outdata\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 5\n"
		// Applying decoration group containing nothing.
		"OpGroupDecorate %group0 %indata0\n"
		"OpDecorate %indata0 DescriptorSet 0\n"
		"OpDecorate %indata0 Binding 0\n"
		// Applying decoration group containing one decoration.
		"OpGroupDecorate %group1 %indata1\n"
		"OpDecorate %indata1 Binding 1\n"
		// Applying decoration group containing multiple decorations.
		"OpGroupDecorate %group3 %indata2 %indata3\n"
		"OpDecorate %indata2 Binding 2\n"
		"OpDecorate %indata3 Binding 3\n"
		// Applying multiple decoration groups (with overlapping).
		"OpGroupDecorate %group0 %indata4\n"
		"OpGroupDecorate %group1 %indata4\n"
		"OpGroupDecorate %group3 %indata4\n"
		"OpDecorate %indata4 Binding 4\n"

		+ string(getComputeAsmCommonTypes()) +

		"%id   = OpVariable %uvec3ptr Input\n"
		"%zero = OpConstant %i32 0\n"

		"%outbuf    = OpTypeStruct %f32arr\n"
		"%outbufptr = OpTypePointer Uniform %outbuf\n"
		"%outdata   = OpVariable %outbufptr Uniform\n"
		"%inbuf0    = OpTypeStruct %f32arr\n"
		"%inbuf0ptr = OpTypePointer Uniform %inbuf0\n"
		"%indata0   = OpVariable %inbuf0ptr Uniform\n"
		"%inbuf1    = OpTypeStruct %f32arr\n"
		"%inbuf1ptr = OpTypePointer Uniform %inbuf1\n"
		"%indata1   = OpVariable %inbuf1ptr Uniform\n"
		"%inbuf2    = OpTypeStruct %f32arr\n"
		"%inbuf2ptr = OpTypePointer Uniform %inbuf2\n"
		"%indata2   = OpVariable %inbuf2ptr Uniform\n"
		"%inbuf3    = OpTypeStruct %f32arr\n"
		"%inbuf3ptr = OpTypePointer Uniform %inbuf3\n"
		"%indata3   = OpVariable %inbuf3ptr Uniform\n"
		"%inbuf4    = OpTypeStruct %f32arr\n"
		"%inbufptr  = OpTypePointer Uniform %inbuf4\n"
		"%indata4   = OpVariable %inbufptr Uniform\n"

		"%main   = OpFunction %void None %voidf\n"
		"%label  = OpLabel\n"
		"%idval  = OpLoad %uvec3 %id\n"
		"%x      = OpCompositeExtract %u32 %idval 0\n"
		"%inloc0 = OpAccessChain %f32ptr %indata0 %zero %x\n"
		"%inloc1 = OpAccessChain %f32ptr %indata1 %zero %x\n"
		"%inloc2 = OpAccessChain %f32ptr %indata2 %zero %x\n"
		"%inloc3 = OpAccessChain %f32ptr %indata3 %zero %x\n"
		"%inloc4 = OpAccessChain %f32ptr %indata4 %zero %x\n"
		"%outloc = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%inval0 = OpLoad %f32 %inloc0\n"
		"%inval1 = OpLoad %f32 %inloc1\n"
		"%inval2 = OpLoad %f32 %inloc2\n"
		"%inval3 = OpLoad %f32 %inloc3\n"
		"%inval4 = OpLoad %f32 %inloc4\n"
		"%add0   = OpFAdd %f32 %inval0 %inval1\n"
		"%add1   = OpFAdd %f32 %add0 %inval2\n"
		"%add2   = OpFAdd %f32 %add1 %inval3\n"
		"%add    = OpFAdd %f32 %add2 %inval4\n"
		"          OpStore %outloc %add\n"
		"          OpReturn\n"
		"          OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats0)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats1)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats2)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats3)));
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats4)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "decoration group cases", spec));

	return group.release();
}

enum SpecConstantType
{
	SC_INT8,
	SC_UINT8,
	SC_INT16,
	SC_UINT16,
	SC_INT32,
	SC_UINT32,
	SC_INT64,
	SC_UINT64,
	SC_FLOAT16,
	SC_FLOAT32,
	SC_FLOAT64,
};

struct SpecConstantValue
{
	SpecConstantType type;
	union ValueUnion {
		deInt8			i8;
		deUint8			u8;
		deInt16			i16;
		deUint16		u16;
		deInt32			i32;
		deUint32		u32;
		deInt64			i64;
		deUint64		u64;
		tcu::Float16	f16;
		tcu::Float32	f32;
		tcu::Float64	f64;

		ValueUnion (deInt8			v) : i8(v)	{}
		ValueUnion (deUint8			v) : u8(v)	{}
		ValueUnion (deInt16			v) : i16(v)	{}
		ValueUnion (deUint16		v) : u16(v)	{}
		ValueUnion (deInt32			v) : i32(v)	{}
		ValueUnion (deUint32		v) : u32(v)	{}
		ValueUnion (deInt64			v) : i64(v)	{}
		ValueUnion (deUint64		v) : u64(v)	{}
		ValueUnion (tcu::Float16	v) : f16(v)	{}
		ValueUnion (tcu::Float32	v) : f32(v)	{}
		ValueUnion (tcu::Float64	v) : f64(v)	{}
	} value;

	SpecConstantValue (deInt8			v) : type(SC_INT8)		, value(v) {}
	SpecConstantValue (deUint8			v) : type(SC_UINT8)		, value(v) {}
	SpecConstantValue (deInt16			v) : type(SC_INT16)		, value(v) {}
	SpecConstantValue (deUint16			v) : type(SC_UINT16)	, value(v) {}
	SpecConstantValue (deInt32			v) : type(SC_INT32)		, value(v) {}
	SpecConstantValue (deUint32			v) : type(SC_UINT32)	, value(v) {}
	SpecConstantValue (deInt64			v) : type(SC_INT64)		, value(v) {}
	SpecConstantValue (deUint64			v) : type(SC_UINT64)	, value(v) {}
	SpecConstantValue (tcu::Float16		v) : type(SC_FLOAT16)	, value(v) {}
	SpecConstantValue (tcu::Float32		v) : type(SC_FLOAT32)	, value(v) {}
	SpecConstantValue (tcu::Float64		v) : type(SC_FLOAT64)	, value(v) {}

	void appendTo(vkt::SpirVAssembly::SpecConstants& specConstants)
	{
		switch (type)
		{
		case SC_INT8:		specConstants.append(value.i8);		break;
		case SC_UINT8:		specConstants.append(value.u8);		break;
		case SC_INT16:		specConstants.append(value.i16);	break;
		case SC_UINT16:		specConstants.append(value.u16);	break;
		case SC_INT32:		specConstants.append(value.i32);	break;
		case SC_UINT32:		specConstants.append(value.u32);	break;
		case SC_INT64:		specConstants.append(value.i64);	break;
		case SC_UINT64:		specConstants.append(value.u64);	break;
		case SC_FLOAT16:	specConstants.append(value.f16);	break;
		case SC_FLOAT32:	specConstants.append(value.f32);	break;
		case SC_FLOAT64:	specConstants.append(value.f64);	break;
		default:
			DE_ASSERT(false);
		}
	}
};

enum CaseFlagBits
{
	FLAG_NONE		= 0,
	FLAG_CONVERT	= 1,
	FLAG_I8			= (1<<1),
	FLAG_I16		= (1<<2),
	FLAG_I64		= (1<<3),
	FLAG_F16		= (1<<4),
	FLAG_F64		= (1<<5),
};
using CaseFlags = deUint32;

struct SpecConstantTwoValCase
{
	const std::string	caseName;
	const std::string	scDefinition0;
	const std::string	scDefinition1;
	const std::string	scResultType;
	const std::string	scOperation;
	SpecConstantValue	scActualValue0;
	SpecConstantValue	scActualValue1;
	const std::string	resultOperation;
	vector<deInt32>		expectedOutput;
	CaseFlags			caseFlags;

						SpecConstantTwoValCase (const std::string& name,
												const std::string& definition0,
												const std::string& definition1,
												const std::string& resultType,
												const std::string& operation,
												SpecConstantValue value0,
												SpecConstantValue value1,
												const std::string& resultOp,
												const vector<deInt32>& output,
												CaseFlags flags = FLAG_NONE)
							: caseName				(name)
							, scDefinition0			(definition0)
							, scDefinition1			(definition1)
							, scResultType			(resultType)
							, scOperation			(operation)
							, scActualValue0		(value0)
							, scActualValue1		(value1)
							, resultOperation		(resultOp)
							, expectedOutput		(output)
							, caseFlags				(flags)
							{}
};

std::string getSpecConstantOpStructConstantsAndTypes ()
{
	return
		"%zero        = OpConstant %i32 0\n"
		"%one         = OpConstant %i32 1\n"
		"%two         = OpConstant %i32 2\n"
		"%three       = OpConstant %i32 3\n"
		"%iarr3       = OpTypeArray %i32 %three\n"
		"%imat3       = OpTypeArray %iarr3 %three\n"
		"%struct      = OpTypeStruct %imat3\n"
		;
}

std::string getSpecConstantOpStructComposites ()
{
	return
		"%iarr3_0     = OpConstantComposite %iarr3 %zero %zero %zero\n"
		"%imat3_0     = OpConstantComposite %imat3 %iarr3_0 %iarr3_0 %iarr3_0\n"
		"%struct_0    = OpConstantComposite %struct %imat3_0\n"
		;
}

std::string getSpecConstantOpStructConstBlock ()
{
	return
		"%iarr3_a     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_0        %iarr3_0     0\n"                        // Compose (sc_0, sc_1, sc_2)
		"%iarr3_b     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_1        %iarr3_a     1\n"
		"%iarr3_c     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_2        %iarr3_b     2\n"

		"%iarr3_d     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_1        %iarr3_0     0\n"                        // Compose (sc_1, sc_2, sc_0)
		"%iarr3_e     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_2        %iarr3_d     1\n"
		"%iarr3_f     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_0        %iarr3_e     2\n"

		"%iarr3_g     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_2        %iarr3_0     0\n"                        // Compose (sc_2, sc_0, sc_1)
		"%iarr3_h     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_0        %iarr3_g     1\n"
		"%iarr3_i     = OpSpecConstantOp %iarr3  CompositeInsert  %sc_1        %iarr3_h     2\n"

		"%imat3_a     = OpSpecConstantOp %imat3  CompositeInsert  %iarr3_c     %imat3_0     0\n"						// Matrix with the 3 previous arrays.
		"%imat3_b     = OpSpecConstantOp %imat3  CompositeInsert  %iarr3_f     %imat3_a     1\n"
		"%imat3_c     = OpSpecConstantOp %imat3  CompositeInsert  %iarr3_i     %imat3_b     2\n"

		"%struct_a    = OpSpecConstantOp %struct CompositeInsert  %imat3_c     %struct_0    0\n"						// Save it in the struct.

		"%comp_0_0    = OpSpecConstantOp %i32    CompositeExtract %struct_a    0 0 0\n"									// Extract some component pairs to compare them.
		"%comp_1_0    = OpSpecConstantOp %i32    CompositeExtract %struct_a    0 1 0\n"

		"%comp_0_1    = OpSpecConstantOp %i32    CompositeExtract %struct_a    0 0 1\n"
		"%comp_2_2    = OpSpecConstantOp %i32    CompositeExtract %struct_a    0 2 2\n"

		"%comp_2_0    = OpSpecConstantOp %i32    CompositeExtract %struct_a    0 2 0\n"
		"%comp_1_1    = OpSpecConstantOp %i32    CompositeExtract %struct_a    0 1 1\n"

		"%cmpres_0    = OpSpecConstantOp %bool   IEqual %comp_0_0 %comp_1_0\n"											// Must be false.
		"%cmpres_1    = OpSpecConstantOp %bool   IEqual %comp_0_1 %comp_2_2\n"											// Must be true.
		"%cmpres_2    = OpSpecConstantOp %bool   IEqual %comp_2_0 %comp_1_1\n"											// Must be true.

		"%mustbe_0    = OpSpecConstantOp %i32    Select %cmpres_0 %one %zero\n"											// Must select 0
		"%mustbe_1    = OpSpecConstantOp %i32    Select %cmpres_1 %one %zero\n"											// Must select 1
		"%mustbe_2    = OpSpecConstantOp %i32    Select %cmpres_2 %two %one\n"											// Must select 2
		;
}

std::string getSpecConstantOpStructInstructions ()
{
	return
		// Multiply final result with (1-mustbezero)*(mustbeone)*(mustbetwo-1). If everything goes right, the factor should be 1 and
		// the final result should not be altered.
		"%subf_a      = OpISub %i32 %one %mustbe_0\n"
		"%subf_b      = OpIMul %i32 %subf_a %mustbe_1\n"
		"%subf_c      = OpISub %i32 %mustbe_2 %one\n"
		"%factor      = OpIMul %i32 %subf_b %subf_c\n"
		"%sc_final    = OpIMul %i32 %factor %sc_factor\n"
		;
}

tcu::TestCaseGroup* createSpecConstantGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opspecconstantop", "Test the OpSpecConstantOp instruction"));
	vector<SpecConstantTwoValCase>	cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<deInt32>					inputInts		(numElements, 0);
	vector<deInt32>					outputInts1		(numElements, 0);
	vector<deInt32>					outputInts2		(numElements, 0);
	vector<deInt32>					outputInts3		(numElements, 0);
	vector<deInt32>					outputInts4		(numElements, 0);
	vector<deInt32>					outputInts5		(numElements, 0);
	const StringTemplate			shaderTemplate	(
		"${CAPABILITIES:opt}"
		+ string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %sc_0  SpecId 0\n"
		"OpDecorate %sc_1  SpecId 1\n"
		"OpDecorate %i32arr ArrayStride 4\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"${OPTYPE_DEFINITIONS:opt}"
		"%buf     = OpTypeStruct %i32arr\n"
		"%bufptr  = OpTypePointer Uniform %buf\n"
		"%indata    = OpVariable %bufptr Uniform\n"
		"%outdata   = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%sc_0      = OpSpecConstant${SC_DEF0}\n"
		"%sc_1      = OpSpecConstant${SC_DEF1}\n"
		"%sc_final  = OpSpecConstantOp ${SC_RESULT_TYPE} ${SC_OP}\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"${TYPE_CONVERT:opt}"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %i32ptr %indata %zero %x\n"
		"%inval     = OpLoad %i32 %inloc\n"
		"%final     = ${GEN_RESULT}\n"
		"%outloc    = OpAccessChain %i32ptr %outdata %zero %x\n"
		"             OpStore %outloc %final\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	fillRandomScalars(rnd, -65536, 65536, &inputInts[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		outputInts1[ndx] = inputInts[ndx] + 42;
		outputInts2[ndx] = inputInts[ndx];
		outputInts3[ndx] = inputInts[ndx] - 11200;
		outputInts4[ndx] = inputInts[ndx] + 1;
		outputInts5[ndx] = inputInts[ndx] - 42;
	}

	const char addScToInput[]		= "OpIAdd %i32 %inval %sc_final";
	const char addSc32ToInput[]		= "OpIAdd %i32 %inval %sc_final32";
	const char selectTrueUsingSc[]	= "OpSelect %i32 %sc_final %inval %zero";
	const char selectFalseUsingSc[]	= "OpSelect %i32 %sc_final %zero %inval";

	cases.push_back(SpecConstantTwoValCase("iadd",						" %i32 0",		" %i32 0",		"%i32",		"IAdd                 %sc_0 %sc_1",			62,						-20,				addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("isub",						" %i32 0",		" %i32 0",		"%i32",		"ISub                 %sc_0 %sc_1",			100,					58,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("imul",						" %i32 0",		" %i32 0",		"%i32",		"IMul                 %sc_0 %sc_1",			-2,						-21,				addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("sdiv",						" %i32 0",		" %i32 0",		"%i32",		"SDiv                 %sc_0 %sc_1",			-126,					-3,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("udiv",						" %i32 0",		" %i32 0",		"%i32",		"UDiv                 %sc_0 %sc_1",			126,					3,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("srem",						" %i32 0",		" %i32 0",		"%i32",		"SRem                 %sc_0 %sc_1",			7,						3,					addScToInput,		outputInts4));
	cases.push_back(SpecConstantTwoValCase("smod",						" %i32 0",		" %i32 0",		"%i32",		"SMod                 %sc_0 %sc_1",			7,						3,					addScToInput,		outputInts4));
	cases.push_back(SpecConstantTwoValCase("umod",						" %i32 0",		" %i32 0",		"%i32",		"UMod                 %sc_0 %sc_1",			342,					50,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("bitwiseand",				" %i32 0",		" %i32 0",		"%i32",		"BitwiseAnd           %sc_0 %sc_1",			42,						63,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("bitwiseor",					" %i32 0",		" %i32 0",		"%i32",		"BitwiseOr            %sc_0 %sc_1",			34,						8,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("bitwisexor",				" %i32 0",		" %i32 0",		"%i32",		"BitwiseXor           %sc_0 %sc_1",			18,						56,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical",			" %i32 0",		" %i32 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",			168,					2,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic",		" %i32 0",		" %i32 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",			-168,					2,					addScToInput,		outputInts5));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical",			" %i32 0",		" %i32 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",			21,						1,					addScToInput,		outputInts1));

	// Shifts for other integer sizes.
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical_i64",		" %i64 0",		" %i64 0",		"%i64",		"ShiftRightLogical    %sc_0 %sc_1",			deInt64{168},			deInt64{2},			addSc32ToInput,		outputInts1, (FLAG_I64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic_i64",	" %i64 0",		" %i64 0",		"%i64",		"ShiftRightArithmetic %sc_0 %sc_1",			deInt64{-168},			deInt64{2},			addSc32ToInput,		outputInts5, (FLAG_I64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical_i64",		" %i64 0",		" %i64 0",		"%i64",		"ShiftLeftLogical     %sc_0 %sc_1",			deInt64{21},			deInt64{1},			addSc32ToInput,		outputInts1, (FLAG_I64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical_i16",		" %i16 0",		" %i16 0",		"%i16",		"ShiftRightLogical    %sc_0 %sc_1",			deInt16{168},			deInt16{2},			addSc32ToInput,		outputInts1, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic_i16",	" %i16 0",		" %i16 0",		"%i16",		"ShiftRightArithmetic %sc_0 %sc_1",			deInt16{-168},			deInt16{2},			addSc32ToInput,		outputInts5, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical_i16",		" %i16 0",		" %i16 0",		"%i16",		"ShiftLeftLogical     %sc_0 %sc_1",			deInt16{21},			deInt16{1},			addSc32ToInput,		outputInts1, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical_i8",		" %i8 0",		" %i8 0",		"%i8",		"ShiftRightLogical    %sc_0 %sc_1",			deInt8{84},				deInt8{1},			addSc32ToInput,		outputInts1, (FLAG_I8 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic_i8",	" %i8 0",		" %i8 0",		"%i8",		"ShiftRightArithmetic %sc_0 %sc_1",			deInt8{-84},			deInt8{1},			addSc32ToInput,		outputInts5, (FLAG_I8 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical_i8",		" %i8 0",		" %i8 0",		"%i8",		"ShiftLeftLogical     %sc_0 %sc_1",			deInt8{21},				deInt8{1},			addSc32ToInput,		outputInts1, (FLAG_I8 | FLAG_CONVERT)));

	// Shifts for other integer sizes but only in the shift amount.
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical_s_i64",	" %i32 0",		" %i64 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",			168,					deInt64{2},			addScToInput,		outputInts1, (FLAG_I64)));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic_s_i64"," %i32 0",		" %i64 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",			-168,					deInt64{2},			addScToInput,		outputInts5, (FLAG_I64)));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical_s_i64",	" %i32 0",		" %i64 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",			21,						deInt64{1},			addScToInput,		outputInts1, (FLAG_I64)));
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical_s_i16",	" %i32 0",		" %i16 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",			168,					deInt16{2},			addScToInput,		outputInts1, (FLAG_I16)));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic_s_i16"," %i32 0",		" %i16 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",			-168,					deInt16{2},			addScToInput,		outputInts5, (FLAG_I16)));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical_s_i16",	" %i32 0",		" %i16 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",			21,						deInt16{1},			addScToInput,		outputInts1, (FLAG_I16)));
	cases.push_back(SpecConstantTwoValCase("shiftrightlogical_s_i8",	" %i32 0",		" %i8 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",			84,						deInt8{1},			addScToInput,		outputInts1, (FLAG_I8)));
	cases.push_back(SpecConstantTwoValCase("shiftrightarithmetic_s_i8",	" %i32 0",		" %i8 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",			-84,					deInt8{1},			addScToInput,		outputInts5, (FLAG_I8)));
	cases.push_back(SpecConstantTwoValCase("shiftleftlogical_s_i8",		" %i32 0",		" %i8 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",			21,						deInt8{1},			addScToInput,		outputInts1, (FLAG_I8)));

	cases.push_back(SpecConstantTwoValCase("slessthan",					" %i32 0",		" %i32 0",		"%bool",	"SLessThan            %sc_0 %sc_1",			-20,					-10,				selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("ulessthan",					" %i32 0",		" %i32 0",		"%bool",	"ULessThan            %sc_0 %sc_1",			10,						20,					selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("sgreaterthan",				" %i32 0",		" %i32 0",		"%bool",	"SGreaterThan         %sc_0 %sc_1",			-1000,					50,					selectFalseUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("ugreaterthan",				" %i32 0",		" %i32 0",		"%bool",	"UGreaterThan         %sc_0 %sc_1",			10,						5,					selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("slessthanequal",			" %i32 0",		" %i32 0",		"%bool",	"SLessThanEqual       %sc_0 %sc_1",			-10,					-10,				selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("ulessthanequal",			" %i32 0",		" %i32 0",		"%bool",	"ULessThanEqual       %sc_0 %sc_1",			50,						100,				selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("sgreaterthanequal",			" %i32 0",		" %i32 0",		"%bool",	"SGreaterThanEqual    %sc_0 %sc_1",			-1000,					50,					selectFalseUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("ugreaterthanequal",			" %i32 0",		" %i32 0",		"%bool",	"UGreaterThanEqual    %sc_0 %sc_1",			10,						10,					selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("iequal",					" %i32 0",		" %i32 0",		"%bool",	"IEqual               %sc_0 %sc_1",			42,						24,					selectFalseUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("inotequal",					" %i32 0",		" %i32 0",		"%bool",	"INotEqual            %sc_0 %sc_1",			42,						24,					selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("logicaland",				"True %bool",	"True %bool",	"%bool",	"LogicalAnd           %sc_0 %sc_1",			0,						1,					selectFalseUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("logicalor",					"False %bool",	"False %bool",	"%bool",	"LogicalOr            %sc_0 %sc_1",			1,						0,					selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("logicalequal",				"True %bool",	"True %bool",	"%bool",	"LogicalEqual         %sc_0 %sc_1",			0,						1,					selectFalseUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("logicalnotequal",			"False %bool",	"False %bool",	"%bool",	"LogicalNotEqual      %sc_0 %sc_1",			1,						0,					selectTrueUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("snegate",					" %i32 0",		" %i32 0",		"%i32",		"SNegate              %sc_0",				-42,					0,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("not",						" %i32 0",		" %i32 0",		"%i32",		"Not                  %sc_0",				-43,					0,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("logicalnot",				"False %bool",	"False %bool",	"%bool",	"LogicalNot           %sc_0",				1,						0,					selectFalseUsingSc,	outputInts2));
	cases.push_back(SpecConstantTwoValCase("select",					"False %bool",	" %i32 0",		"%i32",		"Select               %sc_0 %sc_1 %zero",	1,						42,					addScToInput,		outputInts1));
	cases.push_back(SpecConstantTwoValCase("sconvert",					" %i32 0",		" %i32 0",		"%i16",		"SConvert             %sc_0",				-11200,					0,					addSc32ToInput,		outputInts3, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("fconvert",					" %f32 0",		" %f32 0",		"%f64",		"FConvert             %sc_0",				tcu::Float32{-11200.0},	tcu::Float32{0.0},	addSc32ToInput,		outputInts3, (FLAG_F64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValCase("fconvert16",				" %f16 0",		" %f16 0",		"%f32",		"FConvert             %sc_0",				tcu::Float16{1.0},		tcu::Float16{0.0},	addSc32ToInput,		outputInts4, (FLAG_F16 | FLAG_CONVERT)));

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["SC_DEF0"]			= cases[caseNdx].scDefinition0;
		specializations["SC_DEF1"]			= cases[caseNdx].scDefinition1;
		specializations["SC_RESULT_TYPE"]	= cases[caseNdx].scResultType;
		specializations["SC_OP"]			= cases[caseNdx].scOperation;
		specializations["GEN_RESULT"]		= cases[caseNdx].resultOperation;

		// Special SPIR-V code when using 16-bit integers.
		if (cases[caseNdx].caseFlags & FLAG_I16)
		{
			spec.requestedVulkanFeatures.coreFeatures.shaderInt16	= VK_TRUE;
			specializations["CAPABILITIES"]							+= "OpCapability Int16\n";							// Adds 16-bit integer capability
			specializations["OPTYPE_DEFINITIONS"]					+= "%i16 = OpTypeInt 16 1\n";						// Adds 16-bit integer type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]						+= "%sc_final32 = OpSConvert %i32 %sc_final\n";		// Converts 16-bit integer to 32-bit integer
		}

		// Special SPIR-V code when using 64-bit integers.
		if (cases[caseNdx].caseFlags & FLAG_I64)
		{
			spec.requestedVulkanFeatures.coreFeatures.shaderInt64	= VK_TRUE;
			specializations["CAPABILITIES"]							+= "OpCapability Int64\n";							// Adds 64-bit integer capability
			specializations["OPTYPE_DEFINITIONS"]					+= "%i64 = OpTypeInt 64 1\n";						// Adds 64-bit integer type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]						+= "%sc_final32 = OpSConvert %i32 %sc_final\n";		// Converts 64-bit integer to 32-bit integer
		}

		// Special SPIR-V code when using 64-bit floats.
		if (cases[caseNdx].caseFlags & FLAG_F64)
		{
			spec.requestedVulkanFeatures.coreFeatures.shaderFloat64	= VK_TRUE;
			specializations["CAPABILITIES"]							+= "OpCapability Float64\n";						// Adds 64-bit float capability
			specializations["OPTYPE_DEFINITIONS"]					+= "%f64 = OpTypeFloat 64\n";						// Adds 64-bit float type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]						+= "%sc_final32 = OpConvertFToS %i32 %sc_final\n";	// Converts 64-bit float to 32-bit integer
		}

		// Extension needed for float16 and int8.
		if (cases[caseNdx].caseFlags & (FLAG_F16 | FLAG_I8))
			spec.extensions.push_back("VK_KHR_shader_float16_int8");

		// Special SPIR-V code when using 16-bit floats.
		if (cases[caseNdx].caseFlags & FLAG_F16)
		{
			spec.requestedVulkanFeatures.extFloat16Int8	|= EXTFLOAT16INT8FEATURES_FLOAT16;
			specializations["CAPABILITIES"]				+= "OpCapability Float16\n";						// Adds 16-bit float capability
			specializations["OPTYPE_DEFINITIONS"]		+= "%f16 = OpTypeFloat 16\n";						// Adds 16-bit float type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]			+= "%sc_final32 = OpConvertFToS %i32 %sc_final\n";	// Converts 16-bit float to 32-bit integer
		}

		// Special SPIR-V code when using 8-bit integers.
		if (cases[caseNdx].caseFlags & FLAG_I8)
		{
			spec.requestedVulkanFeatures.extFloat16Int8	|= EXTFLOAT16INT8FEATURES_INT8;
			specializations["CAPABILITIES"]				+= "OpCapability Int8\n";						// Adds 8-bit integer capability
			specializations["OPTYPE_DEFINITIONS"]		+= "%i8 = OpTypeInt 8 1\n";						// Adds 8-bit integer type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]			+= "%sc_final32 = OpSConvert %i32 %sc_final\n";	// Converts 8-bit integer to 32-bit integer
		}

		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Int32Buffer(inputInts)));
		spec.outputs.push_back(BufferSp(new Int32Buffer(cases[caseNdx].expectedOutput)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		cases[caseNdx].scActualValue0.appendTo(spec.specConstants);
		cases[caseNdx].scActualValue1.appendTo(spec.specConstants);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].caseName.c_str(), cases[caseNdx].caseName.c_str(), spec));
	}

	ComputeShaderSpec				spec;

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %sc_0  SpecId 0\n"
		"OpDecorate %sc_1  SpecId 1\n"
		"OpDecorate %sc_2  SpecId 2\n"
		"OpDecorate %i32arr ArrayStride 4\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%ivec3       = OpTypeVector %i32 3\n"

		+ getSpecConstantOpStructConstantsAndTypes() +

		"%buf         = OpTypeStruct %i32arr\n"
		"%bufptr      = OpTypePointer Uniform %buf\n"
		"%indata      = OpVariable %bufptr Uniform\n"
		"%outdata     = OpVariable %bufptr Uniform\n"

		"%id          = OpVariable %uvec3ptr Input\n"
		"%ivec3_0     = OpConstantComposite %ivec3 %zero %zero %zero\n"
		"%vec3_undef  = OpUndef %ivec3\n"

		+ getSpecConstantOpStructComposites () +

		"%sc_0        = OpSpecConstant %i32 0\n"
		"%sc_1        = OpSpecConstant %i32 0\n"
		"%sc_2        = OpSpecConstant %i32 0\n"

		+ getSpecConstantOpStructConstBlock () +

		"%sc_vec3_0   = OpSpecConstantOp %ivec3 CompositeInsert  %sc_0        %ivec3_0     0\n"							// (sc_0, 0, 0)
		"%sc_vec3_1   = OpSpecConstantOp %ivec3 CompositeInsert  %sc_1        %ivec3_0     1\n"							// (0, sc_1, 0)
		"%sc_vec3_2   = OpSpecConstantOp %ivec3 CompositeInsert  %sc_2        %ivec3_0     2\n"							// (0, 0, sc_2)
		"%sc_vec3_0_s = OpSpecConstantOp %ivec3 VectorShuffle    %sc_vec3_0   %vec3_undef  0          0xFFFFFFFF 2\n"	// (sc_0, ???,  0)
		"%sc_vec3_1_s = OpSpecConstantOp %ivec3 VectorShuffle    %sc_vec3_1   %vec3_undef  0xFFFFFFFF 1          0\n"	// (???,  sc_1, 0)
		"%sc_vec3_2_s = OpSpecConstantOp %ivec3 VectorShuffle    %vec3_undef  %sc_vec3_2   5          0xFFFFFFFF 5\n"	// (sc_2, ???,  sc_2)
		"%sc_vec3_01  = OpSpecConstantOp %ivec3 VectorShuffle    %sc_vec3_0_s %sc_vec3_1_s 1 0 4\n"						// (0,    sc_0, sc_1)
		"%sc_vec3_012 = OpSpecConstantOp %ivec3 VectorShuffle    %sc_vec3_01  %sc_vec3_2_s 5 1 2\n"						// (sc_2, sc_0, sc_1)
		"%sc_ext_0    = OpSpecConstantOp %i32   CompositeExtract %sc_vec3_012              0\n"							// sc_2
		"%sc_ext_1    = OpSpecConstantOp %i32   CompositeExtract %sc_vec3_012              1\n"							// sc_0
		"%sc_ext_2    = OpSpecConstantOp %i32   CompositeExtract %sc_vec3_012              2\n"							// sc_1
		"%sc_sub      = OpSpecConstantOp %i32   ISub             %sc_ext_0    %sc_ext_1\n"								// (sc_2 - sc_0)
		"%sc_factor   = OpSpecConstantOp %i32   IMul             %sc_sub      %sc_ext_2\n"								// (sc_2 - sc_0) * sc_1

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"

		+ getSpecConstantOpStructInstructions() +

		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %i32ptr %indata %zero %x\n"
		"%inval     = OpLoad %i32 %inloc\n"
		"%final     = OpIAdd %i32 %inval %sc_final\n"
		"%outloc    = OpAccessChain %i32ptr %outdata %zero %x\n"
		"             OpStore %outloc %final\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Int32Buffer(inputInts)));
	spec.outputs.push_back(BufferSp(new Int32Buffer(outputInts3)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);
	spec.specConstants.append<deInt32>(123);
	spec.specConstants.append<deInt32>(56);
	spec.specConstants.append<deInt32>(-77);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vector_related", "VectorShuffle, CompositeExtract, & CompositeInsert", spec));

	return group.release();
}

void createOpPhiVartypeTests (de::MovePtr<tcu::TestCaseGroup>& group, tcu::TestContext& testCtx)
{
	ComputeShaderSpec	specInt;
	ComputeShaderSpec	specFloat;
	ComputeShaderSpec	specFloat16;
	ComputeShaderSpec	specVec3;
	ComputeShaderSpec	specMat4;
	ComputeShaderSpec	specArray;
	ComputeShaderSpec	specStruct;
	de::Random			rnd				(deStringHash(group->getName()));
	const int			numElements		= 100;
	vector<float>		inputFloats		(numElements, 0);
	vector<float>		outputFloats	(numElements, 0);
	vector<deFloat16>	inputFloats16	(numElements, 0);
	vector<deFloat16>	outputFloats16	(numElements, 0);

	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		// Just check if the value is positive or not
		outputFloats[ndx] = (inputFloats[ndx] > 0) ? 1.0f : -1.0f;
	}

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		inputFloats16[ndx] = tcu::Float16(inputFloats[ndx]).bits();
		outputFloats16[ndx] = tcu::Float16(outputFloats[ndx]).bits();
	}

	// All of the tests are of the form:
	//
	// testtype r
	//
	// if (inputdata > 0)
	//   r = 1
	// else
	//   r = -1
	//
	// return (float)r

	specFloat.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%float_0    = OpConstant %f32 0.0\n"
		"%float_1    = OpConstant %f32 1.0\n"
		"%float_n1   = OpConstant %f32 -1.0\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%comp     = OpFOrdGreaterThan %bool %inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%res      = OpPhi %f32 %float_1 %tb %float_n1 %fb\n"

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specFloat.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	specFloat.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	specFloat.numWorkGroups = IVec3(numElements, 1, 1);

	specFloat16.assembly =
		"OpCapability Shader\n"
		"OpCapability StorageUniformBufferBlock16\n"
		"OpCapability Float16\n"
		"OpExtension \"SPV_KHR_16bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata DescriptorSet 0\n"
		"OpDecorate %indata Binding 0\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 1\n"
		"OpDecorate %f16arr ArrayStride 2\n"
		"OpMemberDecorate %buf 0 Offset 0\n"

		"%f16      = OpTypeFloat 16\n"
		"%f16ptr   = OpTypePointer Uniform %f16\n"
		"%f16arr   = OpTypeRuntimeArray %f16\n"

		+ string(getComputeAsmCommonTypes()) +

		"%buf      = OpTypeStruct %f16arr\n"
		"%bufptr   = OpTypePointer Uniform %buf\n"
		"%indata   = OpVariable %bufptr Uniform\n"
		"%outdata  = OpVariable %bufptr Uniform\n"

		"%id       = OpVariable %uvec3ptr Input\n"
		"%zero     = OpConstant %i32 0\n"
		"%float_0  = OpConstant %f32 0.0\n"
		"%float_1  = OpConstant %f32 1.0\n"
		"%float_n1 = OpConstant %f32 -1.0\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f16ptr %indata %zero %x\n"
		"%inval    = OpLoad %f16 %inloc\n"
		"%f32_inval = OpFConvert %f32 %inval\n"

		"%comp     = OpFOrdGreaterThan %bool %f32_inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%res      = OpPhi %f32 %float_1 %tb %float_n1 %fb\n"
		"%f16_res  = OpFConvert %f16 %res\n"

		"%outloc   = OpAccessChain %f16ptr %outdata %zero %x\n"
		"            OpStore %outloc %f16_res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specFloat16.inputs.push_back(BufferSp(new Float16Buffer(inputFloats16)));
	specFloat16.outputs.push_back(BufferSp(new Float16Buffer(outputFloats16)));
	specFloat16.numWorkGroups = IVec3(numElements, 1, 1);
	specFloat16.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
	specFloat16.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;

	specMat4.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%v4f32      = OpTypeVector %f32 4\n"
		"%mat4v4f32  = OpTypeMatrix %v4f32 4\n"
		"%zero       = OpConstant %i32 0\n"
		"%float_0    = OpConstant %f32 0.0\n"
		"%float_1    = OpConstant %f32 1.0\n"
		"%float_n1   = OpConstant %f32 -1.0\n"
		"%m11        = OpConstantComposite %v4f32 %float_1 %float_0 %float_0 %float_0\n"
		"%m12        = OpConstantComposite %v4f32 %float_0 %float_1 %float_0 %float_0\n"
		"%m13        = OpConstantComposite %v4f32 %float_0 %float_0 %float_1 %float_0\n"
		"%m14        = OpConstantComposite %v4f32 %float_0 %float_0 %float_0 %float_1\n"
		"%m1         = OpConstantComposite %mat4v4f32 %m11 %m12 %m13 %m14\n"
		"%m21        = OpConstantComposite %v4f32 %float_n1 %float_0 %float_0 %float_0\n"
		"%m22        = OpConstantComposite %v4f32 %float_0 %float_n1 %float_0 %float_0\n"
		"%m23        = OpConstantComposite %v4f32 %float_0 %float_0 %float_n1 %float_0\n"
		"%m24        = OpConstantComposite %v4f32 %float_0 %float_0 %float_0 %float_n1\n"
		"%m2         = OpConstantComposite %mat4v4f32 %m21 %m22 %m23 %m24\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%comp     = OpFOrdGreaterThan %bool %inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%mres     = OpPhi %mat4v4f32 %m1 %tb %m2 %fb\n"
		"%res      = OpCompositeExtract %f32 %mres 2 2\n"

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specMat4.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	specMat4.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	specMat4.numWorkGroups = IVec3(numElements, 1, 1);

	specVec3.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%float_0    = OpConstant %f32 0.0\n"
		"%float_1    = OpConstant %f32 1.0\n"
		"%float_n1   = OpConstant %f32 -1.0\n"
		"%v1         = OpConstantComposite %fvec3 %float_1 %float_1 %float_1\n"
		"%v2         = OpConstantComposite %fvec3 %float_n1 %float_n1 %float_n1\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%comp     = OpFOrdGreaterThan %bool %inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%vres     = OpPhi %fvec3 %v1 %tb %v2 %fb\n"
		"%res      = OpCompositeExtract %f32 %vres 2\n"

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specVec3.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	specVec3.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	specVec3.numWorkGroups = IVec3(numElements, 1, 1);

	specInt.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%float_0    = OpConstant %f32 0.0\n"
		"%i1         = OpConstant %i32 1\n"
		"%i2         = OpConstant %i32 -1\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%comp     = OpFOrdGreaterThan %bool %inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%ires     = OpPhi %i32 %i1 %tb %i2 %fb\n"
		"%res      = OpConvertSToF %f32 %ires\n"

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specInt.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	specInt.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	specInt.numWorkGroups = IVec3(numElements, 1, 1);

	specArray.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%u7         = OpConstant %u32 7\n"
		"%float_0    = OpConstant %f32 0.0\n"
		"%float_1    = OpConstant %f32 1.0\n"
		"%float_n1   = OpConstant %f32 -1.0\n"
		"%f32a7      = OpTypeArray %f32 %u7\n"
		"%a1         = OpConstantComposite %f32a7 %float_1 %float_1 %float_1 %float_1 %float_1 %float_1 %float_1\n"
		"%a2         = OpConstantComposite %f32a7 %float_n1 %float_n1 %float_n1 %float_n1 %float_n1 %float_n1 %float_n1\n"
		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%comp     = OpFOrdGreaterThan %bool %inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%ares     = OpPhi %f32a7 %a1 %tb %a2 %fb\n"
		"%res      = OpCompositeExtract %f32 %ares 5\n"

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specArray.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	specArray.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	specArray.numWorkGroups = IVec3(numElements, 1, 1);

	specStruct.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%float_0    = OpConstant %f32 0.0\n"
		"%float_1    = OpConstant %f32 1.0\n"
		"%float_n1   = OpConstant %f32 -1.0\n"

		"%v2f32      = OpTypeVector %f32 2\n"
		"%Data2      = OpTypeStruct %f32 %v2f32\n"
		"%Data       = OpTypeStruct %Data2 %f32\n"

		"%in1a       = OpConstantComposite %v2f32 %float_1 %float_1\n"
		"%in1b       = OpConstantComposite %Data2 %float_1 %in1a\n"
		"%s1         = OpConstantComposite %Data %in1b %float_1\n"
		"%in2a       = OpConstantComposite %v2f32 %float_n1 %float_n1\n"
		"%in2b       = OpConstantComposite %Data2 %float_n1 %in2a\n"
		"%s2         = OpConstantComposite %Data %in2b %float_n1\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%comp     = OpFOrdGreaterThan %bool %inval %float_0\n"
		"            OpSelectionMerge %cm None\n"
		"            OpBranchConditional %comp %tb %fb\n"
		"%tb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%fb       = OpLabel\n"
		"            OpBranch %cm\n"
		"%cm       = OpLabel\n"
		"%sres     = OpPhi %Data %s1 %tb %s2 %fb\n"
		"%res      = OpCompositeExtract %f32 %sres 0 0\n"

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	specStruct.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	specStruct.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	specStruct.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_int", "OpPhi with int variables", specInt));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_float", "OpPhi with float variables", specFloat));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_float16", "OpPhi with 16bit float variables", specFloat16));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_vec3", "OpPhi with vec3 variables", specVec3));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_mat4", "OpPhi with mat4 variables", specMat4));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_array", "OpPhi with array variables", specArray));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "vartype_struct", "OpPhi with struct variables", specStruct));
}

string generateConstantDefinitions (int count)
{
	std::ostringstream	r;
	for (int i = 0; i < count; i++)
		r << "%cf" << (i * 10 + 5) << " = OpConstant %f32 " <<(i * 10 + 5) << ".0\n";
	r << "\n";
	return r.str();
}

string generateSwitchCases (int count)
{
	std::ostringstream	r;
	for (int i = 0; i < count; i++)
		r << " " << i << " %case" << i;
	r << "\n";
	return r.str();
}

string generateSwitchTargets (int count)
{
	std::ostringstream	r;
	for (int i = 0; i < count; i++)
		r << "%case" << i << " = OpLabel\n            OpBranch %phi\n";
	r << "\n";
	return r.str();
}

string generateOpPhiParams (int count)
{
	std::ostringstream	r;
	for (int i = 0; i < count; i++)
		r << " %cf" << (i * 10 + 5) << " %case" << i;
	r << "\n";
	return r.str();
}

string generateIntWidth (int value)
{
	std::ostringstream	r;
	r << value;
	return r.str();
}

// Expand input string by injecting "ABC" between the input
// string characters. The acc/add/treshold parameters are used
// to skip some of the injections to make the result less
// uniform (and a lot shorter).
string expandOpPhiCase5 (const string& s, int &acc, int add, int treshold)
{
	std::ostringstream	res;
	const char*			p = s.c_str();

	while (*p)
	{
		res << *p;
		acc += add;
		if (acc > treshold)
		{
			acc -= treshold;
			res << "ABC";
		}
		p++;
	}
	return res.str();
}

// Calculate expected result based on the code string
float calcOpPhiCase5 (float val, const string& s)
{
	const char*		p		= s.c_str();
	float			x[8];
	bool			b[8];
	const float		tv[8]	= { 0.5f, 1.5f, 3.5f, 7.5f, 15.5f, 31.5f, 63.5f, 127.5f };
	const float		v		= deFloatAbs(val);
	float			res		= 0;
	int				depth	= -1;
	int				skip	= 0;

	for (int i = 7; i >= 0; --i)
		x[i] = std::fmod((float)v, (float)(2 << i));
	for (int i = 7; i >= 0; --i)
		b[i] = x[i] > tv[i];

	while (*p)
	{
		if (*p == 'A')
		{
			depth++;
			if (skip == 0 && b[depth])
			{
				res++;
			}
			else
				skip++;
		}
		if (*p == 'B')
		{
			if (skip)
				skip--;
			if (b[depth] || skip)
				skip++;
		}
		if (*p == 'C')
		{
			depth--;
			if (skip)
				skip--;
		}
		p++;
	}
	return res;
}

// In the code string, the letters represent the following:
//
// A:
//     if (certain bit is set)
//     {
//       result++;
//
// B:
//     } else {
//
// C:
//     }
//
// examples:
// AABCBC leads to if(){r++;if(){r++;}else{}}else{}
// ABABCC leads to if(){r++;}else{if(){r++;}else{}}
// ABCABC leads to if(){r++;}else{}if(){r++;}else{}
//
// Code generation gets a bit complicated due to the else-branches,
// which do not generate new values. Thus, the generator needs to
// keep track of the previous variable change seen by the else
// branch.
string generateOpPhiCase5 (const string& s)
{
	std::stack<int>				idStack;
	std::stack<std::string>		value;
	std::stack<std::string>		valueLabel;
	std::stack<std::string>		mergeLeft;
	std::stack<std::string>		mergeRight;
	std::ostringstream			res;
	const char*					p			= s.c_str();
	int							depth		= -1;
	int							currId		= 0;
	int							iter		= 0;

	idStack.push(-1);
	value.push("%f32_0");
	valueLabel.push("%f32_0 %entry");

	while (*p)
	{
		if (*p == 'A')
		{
			depth++;
			currId = iter;
			idStack.push(currId);
			res << "\tOpSelectionMerge %m" << currId << " None\n";
			res << "\tOpBranchConditional %b" << depth << " %t" << currId << " %f" << currId << "\n";
			res << "%t" << currId << " = OpLabel\n";
			res << "%rt" << currId << " = OpFAdd %f32 " << value.top() << " %f32_1\n";
			std::ostringstream tag;
			tag << "%rt" << currId;
			value.push(tag.str());
			tag << " %t" << currId;
			valueLabel.push(tag.str());
		}

		if (*p == 'B')
		{
			mergeLeft.push(valueLabel.top());
			value.pop();
			valueLabel.pop();
			res << "\tOpBranch %m" << currId << "\n";
			res << "%f" << currId << " = OpLabel\n";
			std::ostringstream tag;
			tag << value.top() << " %f" << currId;
			valueLabel.pop();
			valueLabel.push(tag.str());
		}

		if (*p == 'C')
		{
			mergeRight.push(valueLabel.top());
			res << "\tOpBranch %m" << currId << "\n";
			res << "%m" << currId << " = OpLabel\n";
			if (*(p + 1) == 0)
				res << "%res"; // last result goes to %res
			else
				res << "%rm" << currId;
			res << " = OpPhi %f32  " << mergeLeft.top() << "  " << mergeRight.top() << "\n";
			std::ostringstream tag;
			tag << "%rm" << currId;
			value.pop();
			value.push(tag.str());
			tag << " %m" << currId;
			valueLabel.pop();
			valueLabel.push(tag.str());
			mergeLeft.pop();
			mergeRight.pop();
			depth--;
			idStack.pop();
			currId = idStack.top();
		}
		p++;
		iter++;
	}
	return res.str();
}

tcu::TestCaseGroup* createOpPhiGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opphi", "Test the OpPhi instruction"));
	ComputeShaderSpec				spec1;
	ComputeShaderSpec				spec2;
	ComputeShaderSpec				spec3;
	ComputeShaderSpec				spec4;
	ComputeShaderSpec				spec5;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats1	(numElements, 0);
	vector<float>					outputFloats2	(numElements, 0);
	vector<float>					outputFloats3	(numElements, 0);
	vector<float>					outputFloats4	(numElements, 0);
	vector<float>					outputFloats5	(numElements, 0);
	std::string						codestring		= "ABC";
	const int						test4Width		= 512;

	// Build case 5 code string. Each iteration makes the hierarchy more complicated.
	// 9 iterations with (7, 24) parameters makes the hierarchy 8 deep with about 1500 lines of
	// shader code.
	for (int i = 0, acc = 0; i < 9; i++)
		codestring = expandOpPhiCase5(codestring, acc, 7, 24);

	fillRandomScalars(rnd, -300.f, 300.f, &inputFloats[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		switch (ndx % 3)
		{
			case 0:		outputFloats1[ndx] = inputFloats[ndx] + 5.5f;	break;
			case 1:		outputFloats1[ndx] = inputFloats[ndx] + 20.5f;	break;
			case 2:		outputFloats1[ndx] = inputFloats[ndx] + 1.75f;	break;
			default:	break;
		}
		outputFloats2[ndx] = inputFloats[ndx] + 6.5f * 3;
		outputFloats3[ndx] = 8.5f - inputFloats[ndx];

		int index4 = (int)deFloor(deAbs((float)ndx * inputFloats[ndx]));
		outputFloats4[ndx] = (float)(index4 % test4Width) * 10.0f + 5.0f;

		outputFloats5[ndx] = calcOpPhiCase5(inputFloats[ndx], codestring);
	}

	spec1.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%three      = OpConstant %u32 3\n"
		"%constf5p5  = OpConstant %f32 5.5\n"
		"%constf20p5 = OpConstant %f32 20.5\n"
		"%constf1p75 = OpConstant %f32 1.75\n"
		"%constf8p5  = OpConstant %f32 8.5\n"
		"%constf6p5  = OpConstant %f32 6.5\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%selector = OpUMod %u32 %x %three\n"
		"            OpSelectionMerge %phi None\n"
		"            OpSwitch %selector %default 0 %case0 1 %case1 2 %case2\n"

		// Case 1 before OpPhi.
		"%case1    = OpLabel\n"
		"            OpBranch %phi\n"

		"%default  = OpLabel\n"
		"            OpUnreachable\n"

		"%phi      = OpLabel\n"
		"%operand  = OpPhi %f32   %constf1p75 %case2   %constf20p5 %case1   %constf5p5 %case0\n" // not in the order of blocks
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"
		"%add      = OpFAdd %f32 %inval %operand\n"
		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %add\n"
		"            OpReturn\n"

		// Case 0 after OpPhi.
		"%case0    = OpLabel\n"
		"            OpBranch %phi\n"


		// Case 2 after OpPhi.
		"%case2    = OpLabel\n"
		"            OpBranch %phi\n"

		"            OpFunctionEnd\n";
	spec1.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec1.outputs.push_back(BufferSp(new Float32Buffer(outputFloats1)));
	spec1.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "block", "out-of-order and unreachable blocks for OpPhi", spec1));

	spec2.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id         = OpVariable %uvec3ptr Input\n"
		"%zero       = OpConstant %i32 0\n"
		"%one        = OpConstant %i32 1\n"
		"%three      = OpConstant %i32 3\n"
		"%constf6p5  = OpConstant %f32 6.5\n"

		"%main       = OpFunction %void None %voidf\n"
		"%entry      = OpLabel\n"
		"%idval      = OpLoad %uvec3 %id\n"
		"%x          = OpCompositeExtract %u32 %idval 0\n"
		"%inloc      = OpAccessChain %f32ptr %indata %zero %x\n"
		"%outloc     = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%inval      = OpLoad %f32 %inloc\n"
		"              OpBranch %phi\n"

		"%phi        = OpLabel\n"
		"%step       = OpPhi %i32 %zero  %entry %step_next  %phi\n"
		"%accum      = OpPhi %f32 %inval %entry %accum_next %phi\n"
		"%step_next  = OpIAdd %i32 %step %one\n"
		"%accum_next = OpFAdd %f32 %accum %constf6p5\n"
		"%still_loop = OpSLessThan %bool %step %three\n"
		"              OpLoopMerge %exit %phi None\n"
		"              OpBranchConditional %still_loop %phi %exit\n"

		"%exit       = OpLabel\n"
		"              OpStore %outloc %accum\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n";
	spec2.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec2.outputs.push_back(BufferSp(new Float32Buffer(outputFloats2)));
	spec2.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "induction", "The usual way induction variables are handled in LLVM IR", spec2));

	spec3.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%f32ptr_f   = OpTypePointer Function %f32\n"
		"%id         = OpVariable %uvec3ptr Input\n"
		"%true       = OpConstantTrue %bool\n"
		"%false      = OpConstantFalse %bool\n"
		"%zero       = OpConstant %i32 0\n"
		"%constf8p5  = OpConstant %f32 8.5\n"

		"%main       = OpFunction %void None %voidf\n"
		"%entry      = OpLabel\n"
		"%b          = OpVariable %f32ptr_f Function %constf8p5\n"
		"%idval      = OpLoad %uvec3 %id\n"
		"%x          = OpCompositeExtract %u32 %idval 0\n"
		"%inloc      = OpAccessChain %f32ptr %indata %zero %x\n"
		"%outloc     = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%a_init     = OpLoad %f32 %inloc\n"
		"%b_init     = OpLoad %f32 %b\n"
		"              OpBranch %phi\n"

		"%phi        = OpLabel\n"
		"%still_loop = OpPhi %bool %true   %entry %false  %phi\n"
		"%a_next     = OpPhi %f32  %a_init %entry %b_next %phi\n"
		"%b_next     = OpPhi %f32  %b_init %entry %a_next %phi\n"
		"              OpLoopMerge %exit %phi None\n"
		"              OpBranchConditional %still_loop %phi %exit\n"

		"%exit       = OpLabel\n"
		"%sub        = OpFSub %f32 %a_next %b_next\n"
		"              OpStore %outloc %sub\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n";
	spec3.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec3.outputs.push_back(BufferSp(new Float32Buffer(outputFloats3)));
	spec3.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "swap", "Swap the values of two variables using OpPhi", spec3));

	spec4.assembly =
		"OpCapability Shader\n"
		"%ext = OpExtInstImport \"GLSL.std.450\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id       = OpVariable %uvec3ptr Input\n"
		"%zero     = OpConstant %i32 0\n"
		"%cimod    = OpConstant %u32 " + generateIntWidth(test4Width) + "\n"

		+ generateConstantDefinitions(test4Width) +

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"
		"%xf       = OpConvertUToF %f32 %x\n"
		"%xm       = OpFMul %f32 %xf %inval\n"
		"%xa       = OpExtInst %f32 %ext FAbs %xm\n"
		"%xi       = OpConvertFToU %u32 %xa\n"
		"%selector = OpUMod %u32 %xi %cimod\n"
		"            OpSelectionMerge %phi None\n"
		"            OpSwitch %selector %default "

		+ generateSwitchCases(test4Width) +

		"%default  = OpLabel\n"
		"            OpUnreachable\n"

		+ generateSwitchTargets(test4Width) +

		"%phi      = OpLabel\n"
		"%result   = OpPhi %f32"

		+ generateOpPhiParams(test4Width) +

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %result\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	spec4.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec4.outputs.push_back(BufferSp(new Float32Buffer(outputFloats4)));
	spec4.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "wide", "OpPhi with a lot of parameters", spec4));

	spec5.assembly =
		"OpCapability Shader\n"
		"%ext      = OpExtInstImport \"GLSL.std.450\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"%code     = OpString \"" + codestring + "\"\n"

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id       = OpVariable %uvec3ptr Input\n"
		"%zero     = OpConstant %i32 0\n"
		"%f32_0    = OpConstant %f32 0.0\n"
		"%f32_0_5  = OpConstant %f32 0.5\n"
		"%f32_1    = OpConstant %f32 1.0\n"
		"%f32_1_5  = OpConstant %f32 1.5\n"
		"%f32_2    = OpConstant %f32 2.0\n"
		"%f32_3_5  = OpConstant %f32 3.5\n"
		"%f32_4    = OpConstant %f32 4.0\n"
		"%f32_7_5  = OpConstant %f32 7.5\n"
		"%f32_8    = OpConstant %f32 8.0\n"
		"%f32_15_5 = OpConstant %f32 15.5\n"
		"%f32_16   = OpConstant %f32 16.0\n"
		"%f32_31_5 = OpConstant %f32 31.5\n"
		"%f32_32   = OpConstant %f32 32.0\n"
		"%f32_63_5 = OpConstant %f32 63.5\n"
		"%f32_64   = OpConstant %f32 64.0\n"
		"%f32_127_5 = OpConstant %f32 127.5\n"
		"%f32_128  = OpConstant %f32 128.0\n"
		"%f32_256  = OpConstant %f32 256.0\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"

		"%xabs     = OpExtInst %f32 %ext FAbs %inval\n"
		"%x8       = OpFMod %f32 %xabs %f32_256\n"
		"%x7       = OpFMod %f32 %xabs %f32_128\n"
		"%x6       = OpFMod %f32 %xabs %f32_64\n"
		"%x5       = OpFMod %f32 %xabs %f32_32\n"
		"%x4       = OpFMod %f32 %xabs %f32_16\n"
		"%x3       = OpFMod %f32 %xabs %f32_8\n"
		"%x2       = OpFMod %f32 %xabs %f32_4\n"
		"%x1       = OpFMod %f32 %xabs %f32_2\n"

		"%b7       = OpFOrdGreaterThanEqual %bool %x8 %f32_127_5\n"
		"%b6       = OpFOrdGreaterThanEqual %bool %x7 %f32_63_5\n"
		"%b5       = OpFOrdGreaterThanEqual %bool %x6 %f32_31_5\n"
		"%b4       = OpFOrdGreaterThanEqual %bool %x5 %f32_15_5\n"
		"%b3       = OpFOrdGreaterThanEqual %bool %x4 %f32_7_5\n"
		"%b2       = OpFOrdGreaterThanEqual %bool %x3 %f32_3_5\n"
		"%b1       = OpFOrdGreaterThanEqual %bool %x2 %f32_1_5\n"
		"%b0       = OpFOrdGreaterThanEqual %bool %x1 %f32_0_5\n"

		+ generateOpPhiCase5(codestring) +

		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"            OpStore %outloc %res\n"
		"            OpReturn\n"

		"            OpFunctionEnd\n";
	spec5.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec5.outputs.push_back(BufferSp(new Float32Buffer(outputFloats5)));
	spec5.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "nested", "Stress OpPhi with a lot of nesting", spec5));

	createOpPhiVartypeTests(group, testCtx);

	return group.release();
}

// Assembly code used for testing block order is based on GLSL source code:
//
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input {
//   float elements[];
// } input_data;
// layout(std140, set = 0, binding = 1) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   output_data.elements[x] = input_data.elements[x];
//   if (x > uint(50)) {
//     switch (x % uint(3)) {
//       case 0: output_data.elements[x] += 1.5f; break;
//       case 1: output_data.elements[x] += 42.f; break;
//       case 2: output_data.elements[x] -= 27.f; break;
//       default: break;
//     }
//   } else {
//     output_data.elements[x] = -input_data.elements[x];
//   }
// }
tcu::TestCaseGroup* createBlockOrderGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "block_order", "Test block orders"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	fillRandomScalars(rnd, -100.f, 100.f, &inputFloats[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats);

	for (size_t ndx = 0; ndx <= 50; ++ndx)
		outputFloats[ndx] = -inputFloats[ndx];

	for (size_t ndx = 51; ndx < numElements; ++ndx)
	{
		switch (ndx % 3)
		{
			case 0:		outputFloats[ndx] = inputFloats[ndx] + 1.5f; break;
			case 1:		outputFloats[ndx] = inputFloats[ndx] + 42.f; break;
			case 2:		outputFloats[ndx] = inputFloats[ndx] - 27.f; break;
			default:	break;
		}
	}

	spec.assembly =
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%u32ptr       = OpTypePointer Function %u32\n"
		"%u32ptr_input = OpTypePointer Input %u32\n"

		+ string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"
		"%const3    = OpConstant %u32 3\n"
		"%const50   = OpConstant %u32 50\n"
		"%constf1p5 = OpConstant %f32 1.5\n"
		"%constf27  = OpConstant %f32 27.0\n"
		"%constf42  = OpConstant %f32 42.0\n"

		"%main = OpFunction %void None %voidf\n"

		// entry block.
		"%entry    = OpLabel\n"

		// Create a temporary variable to hold the value of gl_GlobalInvocationID.x.
		"%xvar     = OpVariable %u32ptr Function\n"
		"%xptr     = OpAccessChain %u32ptr_input %id %zero\n"
		"%x        = OpLoad %u32 %xptr\n"
		"            OpStore %xvar %x\n"

		"%cmp      = OpUGreaterThan %bool %x %const50\n"
		"            OpSelectionMerge %if_merge None\n"
		"            OpBranchConditional %cmp %if_true %if_false\n"

		// False branch for if-statement: placed in the middle of switch cases and before true branch.
		"%if_false = OpLabel\n"
		"%x_f      = OpLoad %u32 %xvar\n"
		"%inloc_f  = OpAccessChain %f32ptr %indata %zero %x_f\n"
		"%inval_f  = OpLoad %f32 %inloc_f\n"
		"%negate   = OpFNegate %f32 %inval_f\n"
		"%outloc_f = OpAccessChain %f32ptr %outdata %zero %x_f\n"
		"            OpStore %outloc_f %negate\n"
		"            OpBranch %if_merge\n"

		// Merge block for if-statement: placed in the middle of true and false branch.
		"%if_merge = OpLabel\n"
		"            OpReturn\n"

		// True branch for if-statement: placed in the middle of swtich cases and after the false branch.
		"%if_true  = OpLabel\n"
		"%xval_t   = OpLoad %u32 %xvar\n"
		"%mod      = OpUMod %u32 %xval_t %const3\n"
		"            OpSelectionMerge %switch_merge None\n"
		"            OpSwitch %mod %default 0 %case0 1 %case1 2 %case2\n"

		// Merge block for switch-statement: placed before the case
		// bodies.  But it must follow OpSwitch which dominates it.
		"%switch_merge = OpLabel\n"
		"                OpBranch %if_merge\n"

		// Case 1 for switch-statement: placed before case 0.
		// It must follow the OpSwitch that dominates it.
		"%case1    = OpLabel\n"
		"%x_1      = OpLoad %u32 %xvar\n"
		"%inloc_1  = OpAccessChain %f32ptr %indata %zero %x_1\n"
		"%inval_1  = OpLoad %f32 %inloc_1\n"
		"%addf42   = OpFAdd %f32 %inval_1 %constf42\n"
		"%outloc_1 = OpAccessChain %f32ptr %outdata %zero %x_1\n"
		"            OpStore %outloc_1 %addf42\n"
		"            OpBranch %switch_merge\n"

		// Case 2 for switch-statement.
		"%case2    = OpLabel\n"
		"%x_2      = OpLoad %u32 %xvar\n"
		"%inloc_2  = OpAccessChain %f32ptr %indata %zero %x_2\n"
		"%inval_2  = OpLoad %f32 %inloc_2\n"
		"%subf27   = OpFSub %f32 %inval_2 %constf27\n"
		"%outloc_2 = OpAccessChain %f32ptr %outdata %zero %x_2\n"
		"            OpStore %outloc_2 %subf27\n"
		"            OpBranch %switch_merge\n"

		// Default case for switch-statement: placed in the middle of normal cases.
		"%default = OpLabel\n"
		"           OpBranch %switch_merge\n"

		// Case 0 for switch-statement: out of order.
		"%case0    = OpLabel\n"
		"%x_0      = OpLoad %u32 %xvar\n"
		"%inloc_0  = OpAccessChain %f32ptr %indata %zero %x_0\n"
		"%inval_0  = OpLoad %f32 %inloc_0\n"
		"%addf1p5  = OpFAdd %f32 %inval_0 %constf1p5\n"
		"%outloc_0 = OpAccessChain %f32ptr %outdata %zero %x_0\n"
		"            OpStore %outloc_0 %addf1p5\n"
		"            OpBranch %switch_merge\n"

		"            OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "all", "various out-of-order blocks", spec));

	return group.release();
}

tcu::TestCaseGroup* createMultipleShaderGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "multiple_shaders", "Test multiple shaders in the same module"));
	ComputeShaderSpec				spec1;
	ComputeShaderSpec				spec2;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats1	(numElements, 0);
	vector<float>					outputFloats2	(numElements, 0);
	fillRandomScalars(rnd, -500.f, 500.f, &inputFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
	{
		outputFloats1[ndx] = inputFloats[ndx] + inputFloats[ndx];
		outputFloats2[ndx] = -inputFloats[ndx];
	}

	const string assembly(
		"OpCapability Shader\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %comp_main1 \"entrypoint1\" %id\n"
		"OpEntryPoint GLCompute %comp_main2 \"entrypoint2\" %id\n"
		// A module cannot have two OpEntryPoint instructions with the same Execution Model and the same Name string.
		"OpEntryPoint Vertex    %vert_main  \"entrypoint2\" %vert_builtins %vertexIndex %instanceIndex\n"
		"OpExecutionMode %comp_main1 LocalSize 1 1 1\n"
		"OpExecutionMode %comp_main2 LocalSize 1 1 1\n"

		"OpName %comp_main1              \"entrypoint1\"\n"
		"OpName %comp_main2              \"entrypoint2\"\n"
		"OpName %vert_main               \"entrypoint2\"\n"
		"OpName %id                      \"gl_GlobalInvocationID\"\n"
		"OpName %vert_builtin_st         \"gl_PerVertex\"\n"
		"OpName %vertexIndex             \"gl_VertexIndex\"\n"
		"OpName %instanceIndex           \"gl_InstanceIndex\"\n"
		"OpMemberName %vert_builtin_st 0 \"gl_Position\"\n"
		"OpMemberName %vert_builtin_st 1 \"gl_PointSize\"\n"
		"OpMemberName %vert_builtin_st 2 \"gl_ClipDistance\"\n"

		"OpDecorate %id                      BuiltIn GlobalInvocationId\n"
		"OpDecorate %vertexIndex             BuiltIn VertexIndex\n"
		"OpDecorate %instanceIndex           BuiltIn InstanceIndex\n"
		"OpDecorate %vert_builtin_st         Block\n"
		"OpMemberDecorate %vert_builtin_st 0 BuiltIn Position\n"
		"OpMemberDecorate %vert_builtin_st 1 BuiltIn PointSize\n"
		"OpMemberDecorate %vert_builtin_st 2 BuiltIn ClipDistance\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%zero       = OpConstant %i32 0\n"
		"%one        = OpConstant %u32 1\n"
		"%c_f32_1    = OpConstant %f32 1\n"

		"%i32inputptr         = OpTypePointer Input %i32\n"
		"%vec4                = OpTypeVector %f32 4\n"
		"%vec4ptr             = OpTypePointer Output %vec4\n"
		"%f32arr1             = OpTypeArray %f32 %one\n"
		"%vert_builtin_st     = OpTypeStruct %vec4 %f32 %f32arr1\n"
		"%vert_builtin_st_ptr = OpTypePointer Output %vert_builtin_st\n"
		"%vert_builtins       = OpVariable %vert_builtin_st_ptr Output\n"

		"%id         = OpVariable %uvec3ptr Input\n"
		"%vertexIndex = OpVariable %i32inputptr Input\n"
		"%instanceIndex = OpVariable %i32inputptr Input\n"
		"%c_vec4_1   = OpConstantComposite %vec4 %c_f32_1 %c_f32_1 %c_f32_1 %c_f32_1\n"

		// gl_Position = vec4(1.);
		"%vert_main  = OpFunction %void None %voidf\n"
		"%vert_entry = OpLabel\n"
		"%position   = OpAccessChain %vec4ptr %vert_builtins %zero\n"
		"              OpStore %position %c_vec4_1\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n"

		// Double inputs.
		"%comp_main1  = OpFunction %void None %voidf\n"
		"%comp1_entry = OpLabel\n"
		"%idval1      = OpLoad %uvec3 %id\n"
		"%x1          = OpCompositeExtract %u32 %idval1 0\n"
		"%inloc1      = OpAccessChain %f32ptr %indata %zero %x1\n"
		"%inval1      = OpLoad %f32 %inloc1\n"
		"%add         = OpFAdd %f32 %inval1 %inval1\n"
		"%outloc1     = OpAccessChain %f32ptr %outdata %zero %x1\n"
		"               OpStore %outloc1 %add\n"
		"               OpReturn\n"
		"               OpFunctionEnd\n"

		// Negate inputs.
		"%comp_main2  = OpFunction %void None %voidf\n"
		"%comp2_entry = OpLabel\n"
		"%idval2      = OpLoad %uvec3 %id\n"
		"%x2          = OpCompositeExtract %u32 %idval2 0\n"
		"%inloc2      = OpAccessChain %f32ptr %indata %zero %x2\n"
		"%inval2      = OpLoad %f32 %inloc2\n"
		"%neg         = OpFNegate %f32 %inval2\n"
		"%outloc2     = OpAccessChain %f32ptr %outdata %zero %x2\n"
		"               OpStore %outloc2 %neg\n"
		"               OpReturn\n"
		"               OpFunctionEnd\n");

	spec1.assembly = assembly;
	spec1.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec1.outputs.push_back(BufferSp(new Float32Buffer(outputFloats1)));
	spec1.numWorkGroups = IVec3(numElements, 1, 1);
	spec1.entryPoint = "entrypoint1";

	spec2.assembly = assembly;
	spec2.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
	spec2.outputs.push_back(BufferSp(new Float32Buffer(outputFloats2)));
	spec2.numWorkGroups = IVec3(numElements, 1, 1);
	spec2.entryPoint = "entrypoint2";

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "shader1", "multiple shaders in the same module", spec1));
	group->addChild(new SpvAsmComputeShaderCase(testCtx, "shader2", "multiple shaders in the same module", spec2));

	return group.release();
}

inline std::string makeLongUTF8String (size_t num4ByteChars)
{
	// An example of a longest valid UTF-8 character.  Be explicit about the
	// character type because Microsoft compilers can otherwise interpret the
	// character string as being over wide (16-bit) characters. Ideally, we
	// would just use a C++11 UTF-8 string literal, but we want to support older
	// Microsoft compilers.
	const std::basic_string<char> earthAfrica("\xF0\x9F\x8C\x8D");
	std::string longString;
	longString.reserve(num4ByteChars * 4);
	for (size_t count = 0; count < num4ByteChars; count++)
	{
		longString += earthAfrica;
	}
	return longString;
}

tcu::TestCaseGroup* createOpSourceGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsource", "Tests the OpSource & OpSourceContinued instruction"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpMemoryModel Logical GLSL450\n"

		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"${SOURCE}\n"

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	cases.push_back(CaseParameter("unknown_source",							"OpSource Unknown 0"));
	cases.push_back(CaseParameter("wrong_source",							"OpSource OpenCL_C 210"));
	cases.push_back(CaseParameter("normal_filename",						"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname"));
	cases.push_back(CaseParameter("empty_filename",							"%fname = OpString \"\"\n"
																			"OpSource GLSL 430 %fname"));
	cases.push_back(CaseParameter("normal_source_code",						"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"#version 430\nvoid main() {}\""));
	cases.push_back(CaseParameter("empty_source_code",						"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"\""));
	cases.push_back(CaseParameter("long_source_code",						"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"" + makeLongUTF8String(65530) + "ccc\"")); // word count: 65535
	cases.push_back(CaseParameter("utf8_source_code",						"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"\xE2\x98\x82\xE2\x98\x85\"")); // umbrella & black star symbol
	cases.push_back(CaseParameter("normal_sourcecontinued",					"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"#version 430\nvo\"\n"
																			"OpSourceContinued \"id main() {}\""));
	cases.push_back(CaseParameter("empty_sourcecontinued",					"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"#version 430\nvoid main() {}\"\n"
																			"OpSourceContinued \"\""));
	cases.push_back(CaseParameter("long_sourcecontinued",					"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"#version 430\nvoid main() {}\"\n"
																			"OpSourceContinued \"" + makeLongUTF8String(65533) + "ccc\"")); // word count: 65535
	cases.push_back(CaseParameter("utf8_sourcecontinued",					"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"#version 430\nvoid main() {}\"\n"
																			"OpSourceContinued \"\xE2\x98\x8E\xE2\x9A\x91\"")); // white telephone & black flag symbol
	cases.push_back(CaseParameter("multi_sourcecontinued",					"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"#version 430\n\"\n"
																			"OpSourceContinued \"void\"\n"
																			"OpSourceContinued \"main()\"\n"
																			"OpSourceContinued \"{}\""));
	cases.push_back(CaseParameter("empty_source_before_sourcecontinued",	"%fname = OpString \"filename\"\n"
																			"OpSource GLSL 430 %fname \"\"\n"
																			"OpSourceContinued \"#version 430\nvoid main() {}\""));

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["SOURCE"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createOpSourceExtensionGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsourceextension", "Tests the OpSource instruction"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSourceExtension \"${EXTENSION}\"\n"

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	cases.push_back(CaseParameter("empty_extension",	""));
	cases.push_back(CaseParameter("real_extension",		"GL_ARB_texture_rectangle"));
	cases.push_back(CaseParameter("fake_extension",		"GL_ARB_im_the_ultimate_extension"));
	cases.push_back(CaseParameter("utf8_extension",		"GL_ARB_\xE2\x98\x82\xE2\x98\x85"));
	cases.push_back(CaseParameter("long_extension",		makeLongUTF8String(65533) + "ccc")); // word count: 65535

	fillRandomScalars(rnd, -200.f, 200.f, &inputFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = -inputFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["EXTENSION"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

// Checks that a compute shader can generate a constant null value of various types, without exercising a computation on it.
tcu::TestCaseGroup* createOpConstantNullGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opconstantnull", "Tests the OpConstantNull instruction"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +
		"%uvec2     = OpTypeVector %u32 2\n"
		"%bvec3     = OpTypeVector %bool 3\n"
		"%fvec4     = OpTypeVector %f32 4\n"
		"%fmat33    = OpTypeMatrix %fvec3 3\n"
		"%const100  = OpConstant %u32 100\n"
		"%uarr100   = OpTypeArray %i32 %const100\n"
		"%struct    = OpTypeStruct %f32 %i32 %u32\n"
		"%pointer   = OpTypePointer Function %i32\n"
		+ string(getComputeAsmInputOutputBuffer()) +

		"%null      = OpConstantNull ${TYPE}\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	cases.push_back(CaseParameter("bool",			"%bool"));
	cases.push_back(CaseParameter("sint32",			"%i32"));
	cases.push_back(CaseParameter("uint32",			"%u32"));
	cases.push_back(CaseParameter("float32",		"%f32"));
	cases.push_back(CaseParameter("vec4float32",	"%fvec4"));
	cases.push_back(CaseParameter("vec3bool",		"%bvec3"));
	cases.push_back(CaseParameter("vec2uint32",		"%uvec2"));
	cases.push_back(CaseParameter("matrix",			"%fmat33"));
	cases.push_back(CaseParameter("array",			"%uarr100"));
	cases.push_back(CaseParameter("struct",			"%struct"));
	cases.push_back(CaseParameter("pointer",		"%pointer"));

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["TYPE"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

// Checks that a compute shader can generate a constant composite value of various types, without exercising a computation on it.
tcu::TestCaseGroup* createOpConstantCompositeGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opconstantcomposite", "Tests the OpConstantComposite instruction"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"${CONSTANT}\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	cases.push_back(CaseParameter("vector",			"%five = OpConstant %u32 5\n"
													"%const = OpConstantComposite %uvec3 %five %zero %five"));
	cases.push_back(CaseParameter("matrix",			"%m3fvec3 = OpTypeMatrix %fvec3 3\n"
													"%ten = OpConstant %f32 10.\n"
													"%fzero = OpConstant %f32 0.\n"
													"%vec = OpConstantComposite %fvec3 %ten %fzero %ten\n"
													"%mat = OpConstantComposite %m3fvec3 %vec %vec %vec"));
	cases.push_back(CaseParameter("struct",			"%m2vec3 = OpTypeMatrix %fvec3 2\n"
													"%struct = OpTypeStruct %i32 %f32 %fvec3 %m2vec3\n"
													"%fzero = OpConstant %f32 0.\n"
													"%one = OpConstant %f32 1.\n"
													"%point5 = OpConstant %f32 0.5\n"
													"%vec = OpConstantComposite %fvec3 %one %one %fzero\n"
													"%mat = OpConstantComposite %m2vec3 %vec %vec\n"
													"%const = OpConstantComposite %struct %zero %point5 %vec %mat"));
	cases.push_back(CaseParameter("nested_struct",	"%st1 = OpTypeStruct %u32 %f32\n"
													"%st2 = OpTypeStruct %i32 %i32\n"
													"%struct = OpTypeStruct %st1 %st2\n"
													"%point5 = OpConstant %f32 0.5\n"
													"%one = OpConstant %u32 1\n"
													"%ten = OpConstant %i32 10\n"
													"%st1val = OpConstantComposite %st1 %one %point5\n"
													"%st2val = OpConstantComposite %st2 %ten %ten\n"
													"%const = OpConstantComposite %struct %st1val %st2val"));

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["CONSTANT"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

// Creates a floating point number with the given exponent, and significand
// bits set. It can only create normalized numbers. Only the least significant
// 24 bits of the significand will be examined. The final bit of the
// significand will also be ignored. This allows alignment to be written
// similarly to C99 hex-floats.
// For example if you wanted to write 0x1.7f34p-12 you would call
// constructNormalizedFloat(-12, 0x7f3400)
float constructNormalizedFloat (deInt32 exponent, deUint32 significand)
{
	float f = 1.0f;

	for (deInt32 idx = 0; idx < 23; ++idx)
	{
		f += ((significand & 0x800000) == 0) ? 0.f : std::ldexp(1.0f, -(idx + 1));
		significand <<= 1;
	}

	return std::ldexp(f, exponent);
}

// Compare instruction for the OpQuantizeF16 compute exact case.
// Returns true if the output is what is expected from the test case.
bool compareOpQuantizeF16ComputeExactCase (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	// Only size is needed because we cannot compare Nans.
	size_t byteSize = expectedOutputs[0].getByteSize();

	const float*	outputAsFloat	= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	if (byteSize != 4*sizeof(float)) {
		return false;
	}

	if (*outputAsFloat != constructNormalizedFloat(8, 0x304000) &&
		*outputAsFloat != constructNormalizedFloat(8, 0x300000)) {
		return false;
	}
	outputAsFloat++;

	if (*outputAsFloat != -constructNormalizedFloat(-7, 0x600000) &&
		*outputAsFloat != -constructNormalizedFloat(-7, 0x604000)) {
		return false;
	}
	outputAsFloat++;

	if (*outputAsFloat != constructNormalizedFloat(2, 0x01C000) &&
		*outputAsFloat != constructNormalizedFloat(2, 0x020000)) {
		return false;
	}
	outputAsFloat++;

	if (*outputAsFloat != constructNormalizedFloat(1, 0xFFC000) &&
		*outputAsFloat != constructNormalizedFloat(2, 0x000000)) {
		return false;
	}

	return true;
}

// Checks that every output from a test-case is a float NaN.
bool compareNan (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	if (outputAllocs.size() != 1)
		return false;

	// Only size is needed because we cannot compare Nans.
	size_t byteSize = expectedOutputs[0].getByteSize();

	const float* const	output_as_float	= static_cast<const float*>(outputAllocs[0]->getHostPtr());

	for (size_t idx = 0; idx < byteSize / sizeof(float); ++idx)
	{
		if (!deFloatIsNaN(output_as_float[idx]))
		{
			return false;
		}
	}

	return true;
}

// Checks that a compute shader can generate a constant composite value of various types, without exercising a computation on it.
tcu::TestCaseGroup* createOpQuantizeToF16Group (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opquantize", "Tests the OpQuantizeToF16 instruction"));

	const std::string shader (
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%quant     = OpQuantizeToF16 %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %quant\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	{
		ComputeShaderSpec	spec;
		const deUint32		numElements		= 100;
		vector<float>		infinities;
		vector<float>		results;

		infinities.reserve(numElements);
		results.reserve(numElements);

		for (size_t idx = 0; idx < numElements; ++idx)
		{
			switch(idx % 4)
			{
				case 0:
					infinities.push_back(std::numeric_limits<float>::infinity());
					results.push_back(std::numeric_limits<float>::infinity());
					break;
				case 1:
					infinities.push_back(-std::numeric_limits<float>::infinity());
					results.push_back(-std::numeric_limits<float>::infinity());
					break;
				case 2:
					infinities.push_back(std::ldexp(1.0f, 16));
					results.push_back(std::numeric_limits<float>::infinity());
					break;
				case 3:
					infinities.push_back(std::ldexp(-1.0f, 32));
					results.push_back(-std::numeric_limits<float>::infinity());
					break;
			}
		}

		spec.assembly = shader;
		spec.inputs.push_back(BufferSp(new Float32Buffer(infinities)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(results)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "infinities", "Check that infinities propagated and created", spec));
	}

	{
		ComputeShaderSpec	spec;
		vector<float>		nans;
		const deUint32		numElements		= 100;

		nans.reserve(numElements);

		for (size_t idx = 0; idx < numElements; ++idx)
		{
			if (idx % 2 == 0)
			{
				nans.push_back(std::numeric_limits<float>::quiet_NaN());
			}
			else
			{
				nans.push_back(-std::numeric_limits<float>::quiet_NaN());
			}
		}

		spec.assembly = shader;
		spec.inputs.push_back(BufferSp(new Float32Buffer(nans)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(nans)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		spec.verifyIO = &compareNan;

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "propagated_nans", "Check that nans are propagated", spec));
	}

	{
		ComputeShaderSpec	spec;
		vector<float>		small;
		vector<float>		zeros;
		const deUint32		numElements		= 100;

		small.reserve(numElements);
		zeros.reserve(numElements);

		for (size_t idx = 0; idx < numElements; ++idx)
		{
			switch(idx % 6)
			{
				case 0:
					small.push_back(0.f);
					zeros.push_back(0.f);
					break;
				case 1:
					small.push_back(-0.f);
					zeros.push_back(-0.f);
					break;
				case 2:
					small.push_back(std::ldexp(1.0f, -16));
					zeros.push_back(0.f);
					break;
				case 3:
					small.push_back(std::ldexp(-1.0f, -32));
					zeros.push_back(-0.f);
					break;
				case 4:
					small.push_back(std::ldexp(1.0f, -127));
					zeros.push_back(0.f);
					break;
				case 5:
					small.push_back(-std::ldexp(1.0f, -128));
					zeros.push_back(-0.f);
					break;
			}
		}

		spec.assembly = shader;
		spec.inputs.push_back(BufferSp(new Float32Buffer(small)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(zeros)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "flush_to_zero", "Check that values are zeroed correctly", spec));
	}

	{
		ComputeShaderSpec	spec;
		vector<float>		exact;
		const deUint32		numElements		= 200;

		exact.reserve(numElements);

		for (size_t idx = 0; idx < numElements; ++idx)
			exact.push_back(static_cast<float>(static_cast<int>(idx) - 100));

		spec.assembly = shader;
		spec.inputs.push_back(BufferSp(new Float32Buffer(exact)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(exact)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "exact", "Check that values exactly preserved where appropriate", spec));
	}

	{
		ComputeShaderSpec	spec;
		vector<float>		inputs;
		const deUint32		numElements		= 4;

		inputs.push_back(constructNormalizedFloat(8,	0x300300));
		inputs.push_back(-constructNormalizedFloat(-7,	0x600800));
		inputs.push_back(constructNormalizedFloat(2,	0x01E000));
		inputs.push_back(constructNormalizedFloat(1,	0xFFE000));

		spec.assembly = shader;
		spec.verifyIO = &compareOpQuantizeF16ComputeExactCase;
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "rounded", "Check that are rounded when needed", spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createSpecConstantOpQuantizeToF16Group (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opspecconstantop_opquantize", "Tests the OpQuantizeToF16 opcode for the OpSpecConstantOp instruction"));

	const std::string shader (
		string(getComputeAsmShaderPreamble()) +

		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"OpDecorate %sc_0  SpecId 0\n"
		"OpDecorate %sc_1  SpecId 1\n"
		"OpDecorate %sc_2  SpecId 2\n"
		"OpDecorate %sc_3  SpecId 3\n"
		"OpDecorate %sc_4  SpecId 4\n"
		"OpDecorate %sc_5  SpecId 5\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"
		"%c_u32_6   = OpConstant %u32 6\n"

		"%sc_0      = OpSpecConstant %f32 0.\n"
		"%sc_1      = OpSpecConstant %f32 0.\n"
		"%sc_2      = OpSpecConstant %f32 0.\n"
		"%sc_3      = OpSpecConstant %f32 0.\n"
		"%sc_4      = OpSpecConstant %f32 0.\n"
		"%sc_5      = OpSpecConstant %f32 0.\n"

		"%sc_0_quant = OpSpecConstantOp %f32 QuantizeToF16 %sc_0\n"
		"%sc_1_quant = OpSpecConstantOp %f32 QuantizeToF16 %sc_1\n"
		"%sc_2_quant = OpSpecConstantOp %f32 QuantizeToF16 %sc_2\n"
		"%sc_3_quant = OpSpecConstantOp %f32 QuantizeToF16 %sc_3\n"
		"%sc_4_quant = OpSpecConstantOp %f32 QuantizeToF16 %sc_4\n"
		"%sc_5_quant = OpSpecConstantOp %f32 QuantizeToF16 %sc_5\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%selector  = OpUMod %u32 %x %c_u32_6\n"
		"            OpSelectionMerge %exit None\n"
		"            OpSwitch %selector %exit 0 %case0 1 %case1 2 %case2 3 %case3 4 %case4 5 %case5\n"

		"%case0     = OpLabel\n"
		"             OpStore %outloc %sc_0_quant\n"
		"             OpBranch %exit\n"

		"%case1     = OpLabel\n"
		"             OpStore %outloc %sc_1_quant\n"
		"             OpBranch %exit\n"

		"%case2     = OpLabel\n"
		"             OpStore %outloc %sc_2_quant\n"
		"             OpBranch %exit\n"

		"%case3     = OpLabel\n"
		"             OpStore %outloc %sc_3_quant\n"
		"             OpBranch %exit\n"

		"%case4     = OpLabel\n"
		"             OpStore %outloc %sc_4_quant\n"
		"             OpBranch %exit\n"

		"%case5     = OpLabel\n"
		"             OpStore %outloc %sc_5_quant\n"
		"             OpBranch %exit\n"

		"%exit      = OpLabel\n"
		"             OpReturn\n"

		"             OpFunctionEnd\n");

	{
		ComputeShaderSpec	spec;
		const deUint8		numCases	= 4;
		vector<float>		inputs		(numCases, 0.f);
		vector<float>		outputs;

		spec.assembly		= shader;
		spec.numWorkGroups	= IVec3(numCases, 1, 1);

		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(std::numeric_limits<float>::infinity()));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(-std::numeric_limits<float>::infinity()));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(std::ldexp(1.0f, 16)));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(std::ldexp(-1.0f, 32)));

		outputs.push_back(std::numeric_limits<float>::infinity());
		outputs.push_back(-std::numeric_limits<float>::infinity());
		outputs.push_back(std::numeric_limits<float>::infinity());
		outputs.push_back(-std::numeric_limits<float>::infinity());

		spec.inputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputs)));

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "infinities", "Check that infinities propagated and created", spec));
	}

	{
		ComputeShaderSpec	spec;
		const deUint8		numCases	= 2;
		vector<float>		inputs		(numCases, 0.f);
		vector<float>		outputs;

		spec.assembly		= shader;
		spec.numWorkGroups	= IVec3(numCases, 1, 1);
		spec.verifyIO		= &compareNan;

		outputs.push_back(std::numeric_limits<float>::quiet_NaN());
		outputs.push_back(-std::numeric_limits<float>::quiet_NaN());

		for (deUint8 idx = 0; idx < numCases; ++idx)
			spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(outputs[idx]));

		spec.inputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputs)));

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "propagated_nans", "Check that nans are propagated", spec));
	}

	{
		ComputeShaderSpec	spec;
		const deUint8		numCases	= 6;
		vector<float>		inputs		(numCases, 0.f);
		vector<float>		outputs;

		spec.assembly		= shader;
		spec.numWorkGroups	= IVec3(numCases, 1, 1);

		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(0.f));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(-0.f));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(std::ldexp(1.0f, -16)));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(std::ldexp(-1.0f, -32)));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(std::ldexp(1.0f, -127)));
		spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(-std::ldexp(1.0f, -128)));

		outputs.push_back(0.f);
		outputs.push_back(-0.f);
		outputs.push_back(0.f);
		outputs.push_back(-0.f);
		outputs.push_back(0.f);
		outputs.push_back(-0.f);

		spec.inputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputs)));

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "flush_to_zero", "Check that values are zeroed correctly", spec));
	}

	{
		ComputeShaderSpec	spec;
		const deUint8		numCases	= 6;
		vector<float>		inputs		(numCases, 0.f);
		vector<float>		outputs;

		spec.assembly		= shader;
		spec.numWorkGroups	= IVec3(numCases, 1, 1);

		for (deUint8 idx = 0; idx < 6; ++idx)
		{
			const float f = static_cast<float>(idx * 10 - 30) / 4.f;
			spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(f));
			outputs.push_back(f);
		}

		spec.inputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputs)));

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "exact", "Check that values exactly preserved where appropriate", spec));
	}

	{
		ComputeShaderSpec	spec;
		const deUint8		numCases	= 4;
		vector<float>		inputs		(numCases, 0.f);
		vector<float>		outputs;

		spec.assembly		= shader;
		spec.numWorkGroups	= IVec3(numCases, 1, 1);
		spec.verifyIO		= &compareOpQuantizeF16ComputeExactCase;

		outputs.push_back(constructNormalizedFloat(8, 0x300300));
		outputs.push_back(-constructNormalizedFloat(-7, 0x600800));
		outputs.push_back(constructNormalizedFloat(2, 0x01E000));
		outputs.push_back(constructNormalizedFloat(1, 0xFFE000));

		for (deUint8 idx = 0; idx < numCases; ++idx)
			spec.specConstants.append<deInt32>(bitwiseCast<deUint32>(outputs[idx]));

		spec.inputs.push_back(BufferSp(new Float32Buffer(inputs)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputs)));

		group->addChild(new SpvAsmComputeShaderCase(
			testCtx, "rounded", "Check that are rounded when needed", spec));
	}

	return group.release();
}

// Checks that constant null/composite values can be used in computation.
tcu::TestCaseGroup* createOpConstantUsageGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opconstantnullcomposite", "Spotcheck the OpConstantNull & OpConstantComposite instruction"));
	ComputeShaderSpec				spec;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	spec.assembly =
		"OpCapability Shader\n"
		"%std450 = OpExtInstImport \"GLSL.std.450\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +

		"%fmat      = OpTypeMatrix %fvec3 3\n"
		"%ten       = OpConstant %u32 10\n"
		"%f32arr10  = OpTypeArray %f32 %ten\n"
		"%fst       = OpTypeStruct %f32 %f32\n"

		+ string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		// Create a bunch of null values
		"%unull     = OpConstantNull %u32\n"
		"%fnull     = OpConstantNull %f32\n"
		"%vnull     = OpConstantNull %fvec3\n"
		"%mnull     = OpConstantNull %fmat\n"
		"%anull     = OpConstantNull %f32arr10\n"
		"%snull     = OpConstantComposite %fst %fnull %fnull\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"

		// Get the abs() of (a certain element of) those null values
		"%unull_cov = OpConvertUToF %f32 %unull\n"
		"%unull_abs = OpExtInst %f32 %std450 FAbs %unull_cov\n"
		"%fnull_abs = OpExtInst %f32 %std450 FAbs %fnull\n"
		"%vnull_0   = OpCompositeExtract %f32 %vnull 0\n"
		"%vnull_abs = OpExtInst %f32 %std450 FAbs %vnull_0\n"
		"%mnull_12  = OpCompositeExtract %f32 %mnull 1 2\n"
		"%mnull_abs = OpExtInst %f32 %std450 FAbs %mnull_12\n"
		"%anull_3   = OpCompositeExtract %f32 %anull 3\n"
		"%anull_abs = OpExtInst %f32 %std450 FAbs %anull_3\n"
		"%snull_1   = OpCompositeExtract %f32 %snull 1\n"
		"%snull_abs = OpExtInst %f32 %std450 FAbs %snull_1\n"

		// Add them all
		"%add1      = OpFAdd %f32 %neg  %unull_abs\n"
		"%add2      = OpFAdd %f32 %add1 %fnull_abs\n"
		"%add3      = OpFAdd %f32 %add2 %vnull_abs\n"
		"%add4      = OpFAdd %f32 %add3 %mnull_abs\n"
		"%add5      = OpFAdd %f32 %add4 %anull_abs\n"
		"%final     = OpFAdd %f32 %add5 %snull_abs\n"

		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %final\n" // write to output
		"             OpReturn\n"
		"             OpFunctionEnd\n";
	spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
	spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
	spec.numWorkGroups = IVec3(numElements, 1, 1);

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "spotcheck", "Check that values constructed via OpConstantNull & OpConstantComposite can be used", spec));

	return group.release();
}

// Assembly code used for testing loop control is based on GLSL source code:
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input {
//   float elements[];
// } input_data;
// layout(std140, set = 0, binding = 1) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   output_data.elements[x] = input_data.elements[x];
//   for (uint i = 0; i < 4; ++i)
//     output_data.elements[x] += 1.f;
// }
tcu::TestCaseGroup* createLoopControlGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "loop_control", "Tests loop control cases"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%u32ptr      = OpTypePointer Function %u32\n"

		"%id          = OpVariable %uvec3ptr Input\n"
		"%zero        = OpConstant %i32 0\n"
		"%uzero       = OpConstant %u32 0\n"
		"%one         = OpConstant %i32 1\n"
		"%constf1     = OpConstant %f32 1.0\n"
		"%four        = OpConstant %u32 4\n"

		"%main        = OpFunction %void None %voidf\n"
		"%entry       = OpLabel\n"
		"%i           = OpVariable %u32ptr Function\n"
		"               OpStore %i %uzero\n"

		"%idval       = OpLoad %uvec3 %id\n"
		"%x           = OpCompositeExtract %u32 %idval 0\n"
		"%inloc       = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval       = OpLoad %f32 %inloc\n"
		"%outloc      = OpAccessChain %f32ptr %outdata %zero %x\n"
		"               OpStore %outloc %inval\n"
		"               OpBranch %loop_entry\n"

		"%loop_entry  = OpLabel\n"
		"%i_val       = OpLoad %u32 %i\n"
		"%cmp_lt      = OpULessThan %bool %i_val %four\n"
		"               OpLoopMerge %loop_merge %loop_body ${CONTROL}\n"
		"               OpBranchConditional %cmp_lt %loop_body %loop_merge\n"
		"%loop_body   = OpLabel\n"
		"%outval      = OpLoad %f32 %outloc\n"
		"%addf1       = OpFAdd %f32 %outval %constf1\n"
		"               OpStore %outloc %addf1\n"
		"%new_i       = OpIAdd %u32 %i_val %one\n"
		"               OpStore %i %new_i\n"
		"               OpBranch %loop_entry\n"
		"%loop_merge  = OpLabel\n"
		"               OpReturn\n"
		"               OpFunctionEnd\n");

	cases.push_back(CaseParameter("none",				"None"));
	cases.push_back(CaseParameter("unroll",				"Unroll"));
	cases.push_back(CaseParameter("dont_unroll",		"DontUnroll"));

	fillRandomScalars(rnd, -100.f, 100.f, &inputFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = inputFloats[ndx] + 4.f;

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["CONTROL"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	group->addChild(new SpvAsmLoopControlDependencyLengthCase(testCtx, "dependency_length", "dependency_length"));
	group->addChild(new SpvAsmLoopControlDependencyInfiniteCase(testCtx, "dependency_infinite", "dependency_infinite"));

	return group.release();
}

// Assembly code used for testing selection control is based on GLSL source code:
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input {
//   float elements[];
// } input_data;
// layout(std140, set = 0, binding = 1) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   float val = input_data.elements[x];
//   if (val > 10.f)
//     output_data.elements[x] = val + 1.f;
//   else
//     output_data.elements[x] = val - 1.f;
// }
tcu::TestCaseGroup* createSelectionControlGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "selection_control", "Tests selection control cases"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id       = OpVariable %uvec3ptr Input\n"
		"%zero     = OpConstant %i32 0\n"
		"%constf1  = OpConstant %f32 1.0\n"
		"%constf10 = OpConstant %f32 10.0\n"

		"%main     = OpFunction %void None %voidf\n"
		"%entry    = OpLabel\n"
		"%idval    = OpLoad %uvec3 %id\n"
		"%x        = OpCompositeExtract %u32 %idval 0\n"
		"%inloc    = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval    = OpLoad %f32 %inloc\n"
		"%outloc   = OpAccessChain %f32ptr %outdata %zero %x\n"
		"%cmp_gt   = OpFOrdGreaterThan %bool %inval %constf10\n"

		"            OpSelectionMerge %if_end ${CONTROL}\n"
		"            OpBranchConditional %cmp_gt %if_true %if_false\n"
		"%if_true  = OpLabel\n"
		"%addf1    = OpFAdd %f32 %inval %constf1\n"
		"            OpStore %outloc %addf1\n"
		"            OpBranch %if_end\n"
		"%if_false = OpLabel\n"
		"%subf1    = OpFSub %f32 %inval %constf1\n"
		"            OpStore %outloc %subf1\n"
		"            OpBranch %if_end\n"
		"%if_end   = OpLabel\n"
		"            OpReturn\n"
		"            OpFunctionEnd\n");

	cases.push_back(CaseParameter("none",					"None"));
	cases.push_back(CaseParameter("flatten",				"Flatten"));
	cases.push_back(CaseParameter("dont_flatten",			"DontFlatten"));
	cases.push_back(CaseParameter("flatten_dont_flatten",	"DontFlatten|Flatten"));

	fillRandomScalars(rnd, -100.f, 100.f, &inputFloats[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = inputFloats[ndx] + (inputFloats[ndx] > 10.f ? 1.f : -1.f);

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["CONTROL"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

void getOpNameAbuseCases (vector<CaseParameter> &abuseCases)
{
	// Generate a long name.
	std::string longname;
	longname.resize(65535, 'k'); // max string literal, spir-v 2.17

	// Some bad names, abusing utf-8 encoding. This may also cause problems
	// with the logs.
	// 1. Various illegal code points in utf-8
	std::string utf8illegal =
		"Illegal bytes in UTF-8: "
		"\xc0 \xc1 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff"
		"illegal surrogates: \xed\xad\xbf \xed\xbe\x80";

	// 2. Zero encoded as overlong, not exactly legal but often supported to differentiate from terminating zero
	std::string utf8nul = "UTF-8 encoded nul \xC0\x80 (should not end name)";

	// 3. Some overlong encodings
	std::string utf8overlong =
		"UTF-8 overlong \xF0\x82\x82\xAC \xfc\x83\xbf\xbf\xbf\xbf \xf8\x87\xbf\xbf\xbf "
		"\xf0\x8f\xbf\xbf";

	// 4. Internet "zalgo" meme "bleeding text"
	std::string utf8zalgo =
		"\x56\xcc\xb5\xcc\x85\xcc\x94\xcc\x88\xcd\x8a\xcc\x91\xcc\x88\xcd\x91\xcc\x83\xcd\x82"
		"\xcc\x83\xcd\x90\xcc\x8a\xcc\x92\xcc\x92\xcd\x8b\xcc\x94\xcd\x9d\xcc\x98\xcc\xab\xcc"
		"\xae\xcc\xa9\xcc\xad\xcc\x97\xcc\xb0\x75\xcc\xb6\xcc\xbe\xcc\x80\xcc\x82\xcc\x84\xcd"
		"\x84\xcc\x90\xcd\x86\xcc\x9a\xcd\x84\xcc\x9b\xcd\x86\xcd\x92\xcc\x9a\xcd\x99\xcd\x99"
		"\xcc\xbb\xcc\x98\xcd\x8e\xcd\x88\xcd\x9a\xcc\xa6\xcc\x9c\xcc\xab\xcc\x99\xcd\x94\xcd"
		"\x99\xcd\x95\xcc\xa5\xcc\xab\xcd\x89\x6c\xcc\xb8\xcc\x8e\xcc\x8b\xcc\x8b\xcc\x9a\xcc"
		"\x8e\xcd\x9d\xcc\x80\xcc\xa1\xcc\xad\xcd\x9c\xcc\xba\xcc\x96\xcc\xb3\xcc\xa2\xcd\x8e"
		"\xcc\xa2\xcd\x96\x6b\xcc\xb8\xcc\x84\xcd\x81\xcc\xbf\xcc\x8d\xcc\x89\xcc\x85\xcc\x92"
		"\xcc\x84\xcc\x90\xcd\x81\xcc\x93\xcd\x90\xcd\x92\xcd\x9d\xcc\x84\xcd\x98\xcd\x9d\xcd"
		"\xa0\xcd\x91\xcc\x94\xcc\xb9\xcd\x93\xcc\xa5\xcd\x87\xcc\xad\xcc\xa7\xcd\x96\xcd\x99"
		"\xcc\x9d\xcc\xbc\xcd\x96\xcd\x93\xcc\x9d\xcc\x99\xcc\xa8\xcc\xb1\xcd\x85\xcc\xba\xcc"
		"\xa7\x61\xcc\xb8\xcc\x8e\xcc\x81\xcd\x90\xcd\x84\xcd\x8c\xcc\x8c\xcc\x85\xcd\x86\xcc"
		"\x84\xcd\x84\xcc\x90\xcc\x84\xcc\x8d\xcd\x99\xcd\x8d\xcc\xb0\xcc\xa3\xcc\xa6\xcd\x89"
		"\xcd\x8d\xcd\x87\xcc\x98\xcd\x8d\xcc\xa4\xcd\x9a\xcd\x8e\xcc\xab\xcc\xb9\xcc\xac\xcc"
		"\xa2\xcd\x87\xcc\xa0\xcc\xb3\xcd\x89\xcc\xb9\xcc\xa7\xcc\xa6\xcd\x89\xcd\x95\x6e\xcc"
		"\xb8\xcd\x8a\xcc\x8a\xcd\x82\xcc\x9b\xcd\x81\xcd\x90\xcc\x85\xcc\x9b\xcd\x80\xcd\x91"
		"\xcd\x9b\xcc\x81\xcd\x81\xcc\x9a\xcc\xb3\xcd\x9c\xcc\x9e\xcc\x9d\xcd\x99\xcc\xa2\xcd"
		"\x93\xcd\x96\xcc\x97\xff";

	// General name abuses
	abuseCases.push_back(CaseParameter("_has_very_long_name", longname));
	abuseCases.push_back(CaseParameter("_utf8_illegal", utf8illegal));
	abuseCases.push_back(CaseParameter("_utf8_nul", utf8nul));
	abuseCases.push_back(CaseParameter("_utf8_overlong", utf8overlong));
	abuseCases.push_back(CaseParameter("_utf8_zalgo", utf8zalgo));

	// GL keywords
	abuseCases.push_back(CaseParameter("_is_gl_Position", "gl_Position"));
	abuseCases.push_back(CaseParameter("_is_gl_InstanceID", "gl_InstanceID"));
	abuseCases.push_back(CaseParameter("_is_gl_PrimitiveID", "gl_PrimitiveID"));
	abuseCases.push_back(CaseParameter("_is_gl_TessCoord", "gl_TessCoord"));
	abuseCases.push_back(CaseParameter("_is_gl_PerVertex", "gl_PerVertex"));
	abuseCases.push_back(CaseParameter("_is_gl_InvocationID", "gl_InvocationID"));
	abuseCases.push_back(CaseParameter("_is_gl_PointSize", "gl_PointSize"));
	abuseCases.push_back(CaseParameter("_is_gl_PointCoord", "gl_PointCoord"));
	abuseCases.push_back(CaseParameter("_is_gl_Layer", "gl_Layer"));
	abuseCases.push_back(CaseParameter("_is_gl_FragDepth", "gl_FragDepth"));
	abuseCases.push_back(CaseParameter("_is_gl_NumWorkGroups", "gl_NumWorkGroups"));
	abuseCases.push_back(CaseParameter("_is_gl_WorkGroupID", "gl_WorkGroupID"));
	abuseCases.push_back(CaseParameter("_is_gl_LocalInvocationID", "gl_LocalInvocationID"));
	abuseCases.push_back(CaseParameter("_is_gl_GlobalInvocationID", "gl_GlobalInvocationID"));
	abuseCases.push_back(CaseParameter("_is_gl_MaxVertexAttribs", "gl_MaxVertexAttribs"));
	abuseCases.push_back(CaseParameter("_is_gl_MaxViewports", "gl_MaxViewports"));
	abuseCases.push_back(CaseParameter("_is_gl_MaxComputeWorkGroupCount", "gl_MaxComputeWorkGroupCount"));
	abuseCases.push_back(CaseParameter("_is_mat3", "mat3"));
	abuseCases.push_back(CaseParameter("_is_volatile", "volatile"));
	abuseCases.push_back(CaseParameter("_is_inout", "inout"));
	abuseCases.push_back(CaseParameter("_is_isampler3d", "isampler3d"));
}

tcu::TestCaseGroup* createOpNameGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opname", "Tests OpName cases"));
	de::MovePtr<tcu::TestCaseGroup>	entryMainGroup	(new tcu::TestCaseGroup(testCtx, "entry_main", "OpName tests with entry main"));
	de::MovePtr<tcu::TestCaseGroup>	entryNotGroup	(new tcu::TestCaseGroup(testCtx, "entry_rdc", "OpName tests with entry rdc"));
	de::MovePtr<tcu::TestCaseGroup>	abuseGroup		(new tcu::TestCaseGroup(testCtx, "abuse", "OpName abuse tests"));
	vector<CaseParameter>			cases;
	vector<CaseParameter>			abuseCases;
	vector<string>					testFunc;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 128;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);

	getOpNameAbuseCases(abuseCases);

	fillRandomScalars(rnd, -100.0f, 100.0f, &inputFloats[0], numElements);

	for(size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = -inputFloats[ndx];

	const string commonShaderHeader =
		"OpCapability Shader\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n";

	const string commonShaderFooter =
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits())
		+ string(getComputeAsmCommonTypes())
		+ string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%func      = OpFunction %void None %voidf\n"
		"%5         = OpLabel\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n"

		"%main      = OpFunction %void None %voidf\n"
		"%entry     = OpLabel\n"
		"%7         = OpFunctionCall %void %func\n"

		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"

		"             OpReturn\n"
		"             OpFunctionEnd\n";

	const StringTemplate shaderTemplate (
		"OpCapability Shader\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"${ENTRY}\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpName %${ID} \"${NAME}\"\n" +
		commonShaderFooter);

	const std::string multipleNames =
		commonShaderHeader +
		"OpName %main \"to_be\"\n"
		"OpName %id   \"or_not\"\n"
		"OpName %main \"to_be\"\n"
		"OpName %main \"makes_no\"\n"
		"OpName %func \"difference\"\n"
		"OpName %5    \"to_me\"\n" +
		commonShaderFooter;

	{
		ComputeShaderSpec	spec;

		spec.assembly		= multipleNames;
		spec.numWorkGroups	= IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "main_has_multiple_names", "multiple_names", spec));
	}

	const std::string everythingNamed =
		commonShaderHeader +
		"OpName %main   \"name1\"\n"
		"OpName %id     \"name2\"\n"
		"OpName %zero   \"name3\"\n"
		"OpName %entry  \"name4\"\n"
		"OpName %func   \"name5\"\n"
		"OpName %5      \"name6\"\n"
		"OpName %7      \"name7\"\n"
		"OpName %idval  \"name8\"\n"
		"OpName %inloc  \"name9\"\n"
		"OpName %inval  \"name10\"\n"
		"OpName %neg    \"name11\"\n"
		"OpName %outloc \"name12\"\n"+
		commonShaderFooter;
	{
		ComputeShaderSpec	spec;

		spec.assembly		= everythingNamed;
		spec.numWorkGroups	= IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "everything_named", "everything_named", spec));
	}

	const std::string everythingNamedTheSame =
		commonShaderHeader +
		"OpName %main   \"the_same\"\n"
		"OpName %id     \"the_same\"\n"
		"OpName %zero   \"the_same\"\n"
		"OpName %entry  \"the_same\"\n"
		"OpName %func   \"the_same\"\n"
		"OpName %5      \"the_same\"\n"
		"OpName %7      \"the_same\"\n"
		"OpName %idval  \"the_same\"\n"
		"OpName %inloc  \"the_same\"\n"
		"OpName %inval  \"the_same\"\n"
		"OpName %neg    \"the_same\"\n"
		"OpName %outloc \"the_same\"\n"+
		commonShaderFooter;
	{
		ComputeShaderSpec	spec;

		spec.assembly		= everythingNamedTheSame;
		spec.numWorkGroups	= IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "everything_named_the_same", "everything_named_the_same", spec));
	}

	// main_is_...
	for (size_t ndx = 0; ndx < abuseCases.size(); ++ndx)
	{
		map<string, string>	specializations;
		ComputeShaderSpec	spec;

		specializations["ENTRY"]	= "main";
		specializations["ID"]		= "main";
		specializations["NAME"]		= abuseCases[ndx].param;
		spec.assembly				= shaderTemplate.specialize(specializations);
		spec.numWorkGroups			= IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, (std::string("main") + abuseCases[ndx].name).c_str(), abuseCases[ndx].name, spec));
	}

	// x_is_....
	for (size_t ndx = 0; ndx < abuseCases.size(); ++ndx)
	{
		map<string, string>	specializations;
		ComputeShaderSpec	spec;

		specializations["ENTRY"]	= "main";
		specializations["ID"]		= "x";
		specializations["NAME"]		= abuseCases[ndx].param;
		spec.assembly				= shaderTemplate.specialize(specializations);
		spec.numWorkGroups			= IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, (std::string("x") + abuseCases[ndx].name).c_str(), abuseCases[ndx].name, spec));
	}

	cases.push_back(CaseParameter("_is_main", "main"));
	cases.push_back(CaseParameter("_is_not_main", "not_main"));
	testFunc.push_back("main");
	testFunc.push_back("func");

	for(size_t fNdx = 0; fNdx < testFunc.size(); ++fNdx)
	{
		for(size_t ndx = 0; ndx < cases.size(); ++ndx)
		{
			map<string, string>	specializations;
			ComputeShaderSpec	spec;

			specializations["ENTRY"]	= "main";
			specializations["ID"]		= testFunc[fNdx];
			specializations["NAME"]		= cases[ndx].param;
			spec.assembly				= shaderTemplate.specialize(specializations);
			spec.numWorkGroups			= IVec3(numElements, 1, 1);
			spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
			spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

			entryMainGroup->addChild(new SpvAsmComputeShaderCase(testCtx, (testFunc[fNdx] + cases[ndx].name).c_str(), cases[ndx].name, spec));
		}
	}

	cases.push_back(CaseParameter("_is_entry", "rdc"));

	for(size_t fNdx = 0; fNdx < testFunc.size(); ++fNdx)
	{
		for(size_t ndx = 0; ndx < cases.size(); ++ndx)
		{
			map<string, string>     specializations;
			ComputeShaderSpec       spec;

			specializations["ENTRY"]	= "rdc";
			specializations["ID"]		= testFunc[fNdx];
			specializations["NAME"]		= cases[ndx].param;
			spec.assembly				= shaderTemplate.specialize(specializations);
			spec.numWorkGroups			= IVec3(numElements, 1, 1);
			spec.entryPoint				= "rdc";
			spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
			spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

			entryNotGroup->addChild(new SpvAsmComputeShaderCase(testCtx, (testFunc[fNdx] + cases[ndx].name).c_str(), cases[ndx].name, spec));
		}
	}

	group->addChild(entryMainGroup.release());
	group->addChild(entryNotGroup.release());
	group->addChild(abuseGroup.release());

	return group.release();
}

tcu::TestCaseGroup* createOpMemberNameGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group(new tcu::TestCaseGroup(testCtx, "opmembername", "Tests OpMemberName cases"));
	de::MovePtr<tcu::TestCaseGroup>	abuseGroup(new tcu::TestCaseGroup(testCtx, "abuse", "OpMemberName abuse tests"));
	vector<CaseParameter>			abuseCases;
	vector<string>					testFunc;
	de::Random						rnd(deStringHash(group->getName()));
	const int						numElements = 128;
	vector<float>					inputFloats(numElements, 0);
	vector<float>					outputFloats(numElements, 0);

	getOpNameAbuseCases(abuseCases);

	fillRandomScalars(rnd, -100.0f, 100.0f, &inputFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = -inputFloats[ndx];

	const string commonShaderHeader =
		"OpCapability Shader\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n";

	const string commonShaderFooter =
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits())
		+ string(getComputeAsmCommonTypes())
		+ string(getComputeAsmInputOutputBuffer()) +

		"%u3str     = OpTypeStruct %u32 %u32 %u32\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%entry     = OpLabel\n"

		"%idval     = OpLoad %uvec3 %id\n"
		"%x0        = OpCompositeExtract %u32 %idval 0\n"

		"%idstr     = OpCompositeConstruct %u3str %x0 %x0 %x0\n"
		"%x         = OpCompositeExtract %u32 %idstr 0\n"

		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"

		"             OpReturn\n"
		"             OpFunctionEnd\n";

	const StringTemplate shaderTemplate(
		commonShaderHeader +
		"OpMemberName %u3str 0 \"${NAME}\"\n" +
		commonShaderFooter);

	const std::string multipleNames =
		commonShaderHeader +
		"OpMemberName %u3str 0 \"to_be\"\n"
		"OpMemberName %u3str 1 \"or_not\"\n"
		"OpMemberName %u3str 0 \"to_be\"\n"
		"OpMemberName %u3str 2 \"makes_no\"\n"
		"OpMemberName %u3str 0 \"difference\"\n"
		"OpMemberName %u3str 0 \"to_me\"\n" +
		commonShaderFooter;
	{
		ComputeShaderSpec	spec;

		spec.assembly = multipleNames;
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "u3str_x_has_multiple_names", "multiple_names", spec));
	}

	const std::string everythingNamedTheSame =
		commonShaderHeader +
		"OpMemberName %u3str 0 \"the_same\"\n"
		"OpMemberName %u3str 1 \"the_same\"\n"
		"OpMemberName %u3str 2 \"the_same\"\n" +
		commonShaderFooter;

	{
		ComputeShaderSpec	spec;

		spec.assembly = everythingNamedTheSame;
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "everything_named_the_same", "everything_named_the_same", spec));
	}

	// u3str_x_is_....
	for (size_t ndx = 0; ndx < abuseCases.size(); ++ndx)
	{
		map<string, string>	specializations;
		ComputeShaderSpec	spec;

		specializations["NAME"] = abuseCases[ndx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));

		abuseGroup->addChild(new SpvAsmComputeShaderCase(testCtx, (std::string("u3str_x") + abuseCases[ndx].name).c_str(), abuseCases[ndx].name, spec));
	}

	group->addChild(abuseGroup.release());

	return group.release();
}

// Assembly code used for testing function control is based on GLSL source code:
//
// #version 430
//
// layout(std140, set = 0, binding = 0) readonly buffer Input {
//   float elements[];
// } input_data;
// layout(std140, set = 0, binding = 1) writeonly buffer Output {
//   float elements[];
// } output_data;
//
// float const10() { return 10.f; }
//
// void main() {
//   uint x = gl_GlobalInvocationID.x;
//   output_data.elements[x] = input_data.elements[x] + const10();
// }
tcu::TestCaseGroup* createFunctionControlGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "function_control", "Tests function control cases"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main \"main\"\n"
		"OpName %func_const10 \"const10(\"\n"
		"OpName %id \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%f32f = OpTypeFunction %f32\n"
		"%id = OpVariable %uvec3ptr Input\n"
		"%zero = OpConstant %i32 0\n"
		"%constf10 = OpConstant %f32 10.0\n"

		"%main         = OpFunction %void None %voidf\n"
		"%entry        = OpLabel\n"
		"%idval        = OpLoad %uvec3 %id\n"
		"%x            = OpCompositeExtract %u32 %idval 0\n"
		"%inloc        = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval        = OpLoad %f32 %inloc\n"
		"%ret_10       = OpFunctionCall %f32 %func_const10\n"
		"%fadd         = OpFAdd %f32 %inval %ret_10\n"
		"%outloc       = OpAccessChain %f32ptr %outdata %zero %x\n"
		"                OpStore %outloc %fadd\n"
		"                OpReturn\n"
		"                OpFunctionEnd\n"

		"%func_const10 = OpFunction %f32 ${CONTROL} %f32f\n"
		"%label        = OpLabel\n"
		"                OpReturnValue %constf10\n"
		"                OpFunctionEnd\n");

	cases.push_back(CaseParameter("none",						"None"));
	cases.push_back(CaseParameter("inline",						"Inline"));
	cases.push_back(CaseParameter("dont_inline",				"DontInline"));
	cases.push_back(CaseParameter("pure",						"Pure"));
	cases.push_back(CaseParameter("const",						"Const"));
	cases.push_back(CaseParameter("inline_pure",				"Inline|Pure"));
	cases.push_back(CaseParameter("const_dont_inline",			"Const|DontInline"));
	cases.push_back(CaseParameter("inline_dont_inline",			"Inline|DontInline"));
	cases.push_back(CaseParameter("pure_inline_dont_inline",	"Pure|Inline|DontInline"));

	fillRandomScalars(rnd, -100.f, 100.f, &inputFloats[0], numElements);

	// CPU might not use the same rounding mode as the GPU. Use whole numbers to avoid rounding differences.
	floorAll(inputFloats);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = inputFloats[ndx] + 10.f;

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["CONTROL"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createMemoryAccessGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "memory_access", "Tests memory access cases"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					inputFloats		(numElements, 0);
	vector<float>					outputFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%f32ptr_f  = OpTypePointer Function %f32\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"
		"%four      = OpConstant %i32 4\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%copy      = OpVariable %f32ptr_f Function\n"
		"%idval     = OpLoad %uvec3 %id ${ACCESS}\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata  %zero %x\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpCopyMemory %copy %inloc ${ACCESS}\n"
		"%val1      = OpLoad %f32 %copy\n"
		"%val2      = OpLoad %f32 %inloc\n"
		"%add       = OpFAdd %f32 %val1 %val2\n"
		"             OpStore %outloc %add ${ACCESS}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	cases.push_back(CaseParameter("null",					""));
	cases.push_back(CaseParameter("none",					"None"));
	cases.push_back(CaseParameter("volatile",				"Volatile"));
	cases.push_back(CaseParameter("aligned",				"Aligned 4"));
	cases.push_back(CaseParameter("nontemporal",			"Nontemporal"));
	cases.push_back(CaseParameter("aligned_nontemporal",	"Aligned|Nontemporal 4"));
	cases.push_back(CaseParameter("aligned_volatile",		"Volatile|Aligned 4"));

	fillRandomScalars(rnd, -100.f, 100.f, &inputFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		outputFloats[ndx] = inputFloats[ndx] + inputFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["ACCESS"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

// Checks that we can get undefined values for various types, without exercising a computation with it.
tcu::TestCaseGroup* createOpUndefGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opundef", "Tests the OpUndef instruction"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		string(getComputeAsmShaderPreamble()) +

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) +
		"%uvec2     = OpTypeVector %u32 2\n"
		"%fvec4     = OpTypeVector %f32 4\n"
		"%fmat33    = OpTypeMatrix %fvec3 3\n"
		"%image     = OpTypeImage %f32 2D 0 0 0 1 Unknown\n"
		"%sampler   = OpTypeSampler\n"
		"%simage    = OpTypeSampledImage %image\n"
		"%const100  = OpConstant %u32 100\n"
		"%uarr100   = OpTypeArray %i32 %const100\n"
		"%struct    = OpTypeStruct %f32 %i32 %u32\n"
		"%pointer   = OpTypePointer Function %i32\n"
		+ string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"

		"%undef     = OpUndef ${TYPE}\n"

		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	cases.push_back(CaseParameter("bool",			"%bool"));
	cases.push_back(CaseParameter("sint32",			"%i32"));
	cases.push_back(CaseParameter("uint32",			"%u32"));
	cases.push_back(CaseParameter("float32",		"%f32"));
	cases.push_back(CaseParameter("vec4float32",	"%fvec4"));
	cases.push_back(CaseParameter("vec2uint32",		"%uvec2"));
	cases.push_back(CaseParameter("matrix",			"%fmat33"));
	cases.push_back(CaseParameter("image",			"%image"));
	cases.push_back(CaseParameter("sampler",		"%sampler"));
	cases.push_back(CaseParameter("sampledimage",	"%simage"));
	cases.push_back(CaseParameter("array",			"%uarr100"));
	cases.push_back(CaseParameter("runtimearray",	"%f32arr"));
	cases.push_back(CaseParameter("struct",			"%struct"));
	cases.push_back(CaseParameter("pointer",		"%pointer"));

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["TYPE"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	// OpUndef with constants.
	{
		static const char data_dir[] = "spirv_assembly/instruction/compute/undef";

		static const struct
		{
			const std::string name;
			const std::string desc;
		} amberCases[] =
		{
			{ "undefined_constant_composite",		"OpUndef value in OpConstantComposite"		},
			{ "undefined_spec_constant_composite",	"OpUndef value in OpSpecConstantComposite"	},
		};

		for (int i = 0; i < DE_LENGTH_OF_ARRAY(amberCases); ++i)
		{
			cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx,
																				amberCases[i].name.c_str(),
																				amberCases[i].desc.c_str(),
																				data_dir,
																				amberCases[i].name + ".amber");
			group->addChild(testCase);
		}
	}

	return group.release();
}

// Checks that a compute shader can generate a constant composite value of various types, without exercising a computation on it.
tcu::TestCaseGroup* createFloat16OpConstantCompositeGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opconstantcomposite", "Tests the OpConstantComposite instruction"));
	vector<CaseParameter>			cases;
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 100;
	vector<float>					positiveFloats	(numElements, 0);
	vector<float>					negativeFloats	(numElements, 0);
	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability Float16\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"
		"%f16       = OpTypeFloat 16\n"
		"%c_f16_0   = OpConstant %f16 0.0\n"
		"%c_f16_0_5 = OpConstant %f16 0.5\n"
		"%c_f16_1   = OpConstant %f16 1.0\n"
		"%v2f16     = OpTypeVector %f16 2\n"
		"%v3f16     = OpTypeVector %f16 3\n"
		"%v4f16     = OpTypeVector %f16 4\n"

		"${CONSTANT}\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %zero %x\n"
		"%inval     = OpLoad %f32 %inloc\n"
		"%neg       = OpFNegate %f32 %inval\n"
		"%outloc    = OpAccessChain %f32ptr %outdata %zero %x\n"
		"             OpStore %outloc %neg\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");


	cases.push_back(CaseParameter("vector",			"%const = OpConstantComposite %v3f16 %c_f16_0 %c_f16_0_5 %c_f16_1\n"));
	cases.push_back(CaseParameter("matrix",			"%m3v3f16 = OpTypeMatrix %v3f16 3\n"
													"%vec = OpConstantComposite %v3f16 %c_f16_0 %c_f16_0_5 %c_f16_1\n"
													"%mat = OpConstantComposite %m3v3f16 %vec %vec %vec"));
	cases.push_back(CaseParameter("struct",			"%m2v3f16 = OpTypeMatrix %v3f16 2\n"
													"%struct = OpTypeStruct %i32 %f16 %v3f16 %m2v3f16\n"
													"%vec = OpConstantComposite %v3f16 %c_f16_0 %c_f16_0_5 %c_f16_1\n"
													"%mat = OpConstantComposite %m2v3f16 %vec %vec\n"
													"%const = OpConstantComposite %struct %zero %c_f16_0_5 %vec %mat\n"));
	cases.push_back(CaseParameter("nested_struct",	"%st1 = OpTypeStruct %i32 %f16\n"
													"%st2 = OpTypeStruct %i32 %i32\n"
													"%struct = OpTypeStruct %st1 %st2\n"
													"%st1val = OpConstantComposite %st1 %zero %c_f16_0_5\n"
													"%st2val = OpConstantComposite %st2 %zero %zero\n"
													"%const = OpConstantComposite %struct %st1val %st2val"));

	fillRandomScalars(rnd, 1.f, 100.f, &positiveFloats[0], numElements);

	for (size_t ndx = 0; ndx < numElements; ++ndx)
		negativeFloats[ndx] = -positiveFloats[ndx];

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>		specializations;
		ComputeShaderSpec		spec;

		specializations["CONSTANT"] = cases[caseNdx].param;
		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(positiveFloats)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(negativeFloats)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);

		spec.extensions.push_back("VK_KHR_shader_float16_int8");

		spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;

		group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
	}

	return group.release();
}

const vector<deFloat16> squarize(const vector<deFloat16>& inData, const deUint32 argNo)
{
	const size_t		inDataLength	= inData.size();
	vector<deFloat16>	result;

	result.reserve(inDataLength * inDataLength);

	if (argNo == 0)
	{
		for (size_t numIdx = 0; numIdx < inDataLength; ++numIdx)
			result.insert(result.end(), inData.begin(), inData.end());
	}

	if (argNo == 1)
	{
		for (size_t numIdx = 0; numIdx < inDataLength; ++numIdx)
		{
			const vector<deFloat16>	tmp(inDataLength, inData[numIdx]);

			result.insert(result.end(), tmp.begin(), tmp.end());
		}
	}

	return result;
}

const vector<deFloat16> squarizeVector(const vector<deFloat16>& inData, const deUint32 argNo)
{
	vector<deFloat16>	vec;
	vector<deFloat16>	result;

	// Create vectors. vec will contain each possible pair from inData
	{
		const size_t	inDataLength	= inData.size();

		DE_ASSERT(inDataLength <= 64);

		vec.reserve(2 * inDataLength * inDataLength);

		for (size_t numIdxX = 0; numIdxX < inDataLength; ++numIdxX)
		for (size_t numIdxY = 0; numIdxY < inDataLength; ++numIdxY)
		{
			vec.push_back(inData[numIdxX]);
			vec.push_back(inData[numIdxY]);
		}
	}

	// Create vector pairs. result will contain each possible pair from vec
	{
		const size_t	coordsPerVector	= 2;
		const size_t	vectorsCount	= vec.size() / coordsPerVector;

		result.reserve(coordsPerVector * vectorsCount * vectorsCount);

		if (argNo == 0)
		{
			for (size_t numIdxX = 0; numIdxX < vectorsCount; ++numIdxX)
			for (size_t numIdxY = 0; numIdxY < vectorsCount; ++numIdxY)
			{
				for (size_t coordNdx = 0; coordNdx < coordsPerVector; ++coordNdx)
					result.push_back(vec[coordsPerVector * numIdxY + coordNdx]);
			}
		}

		if (argNo == 1)
		{
			for (size_t numIdxX = 0; numIdxX < vectorsCount; ++numIdxX)
			for (size_t numIdxY = 0; numIdxY < vectorsCount; ++numIdxY)
			{
				for (size_t coordNdx = 0; coordNdx < coordsPerVector; ++coordNdx)
					result.push_back(vec[coordsPerVector * numIdxX + coordNdx]);
			}
		}
	}

	return result;
}

struct fp16isNan			{ bool operator()(const tcu::Float16 in1, const tcu::Float16)		{ return in1.isNaN(); } };
struct fp16isInf			{ bool operator()(const tcu::Float16 in1, const tcu::Float16)		{ return in1.isInf(); } };
struct fp16isEqual			{ bool operator()(const tcu::Float16 in1, const tcu::Float16 in2)	{ return in1.asFloat() == in2.asFloat(); } };
struct fp16isUnequal		{ bool operator()(const tcu::Float16 in1, const tcu::Float16 in2)	{ return in1.asFloat() != in2.asFloat(); } };
struct fp16isLess			{ bool operator()(const tcu::Float16 in1, const tcu::Float16 in2)	{ return in1.asFloat() <  in2.asFloat(); } };
struct fp16isGreater		{ bool operator()(const tcu::Float16 in1, const tcu::Float16 in2)	{ return in1.asFloat() >  in2.asFloat(); } };
struct fp16isLessOrEqual	{ bool operator()(const tcu::Float16 in1, const tcu::Float16 in2)	{ return in1.asFloat() <= in2.asFloat(); } };
struct fp16isGreaterOrEqual	{ bool operator()(const tcu::Float16 in1, const tcu::Float16 in2)	{ return in1.asFloat() >= in2.asFloat(); } };

template <class TestedLogicalFunction, bool onlyTestFunc, bool unationModeAnd, bool nanSupported>
bool compareFP16Logical (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>&, TestLog& log)
{
	if (inputs.size() != 2 || outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;
	vector<deUint8>	input2Bytes;

	inputs[0].getBytes(input1Bytes);
	inputs[1].getBytes(input2Bytes);

	const deUint32			denormModesCount			= 2;
	const deFloat16			float16one					= tcu::Float16(1.0f).bits();
	const deFloat16			float16zero					= tcu::Float16(0.0f).bits();
	const tcu::Float16		zero						= tcu::Float16::zero(1);
	const deFloat16* const	outputAsFP16				= static_cast<deFloat16*>(outputAllocs[0]->getHostPtr());
	const deFloat16* const	input1AsFP16				= reinterpret_cast<deFloat16* const>(&input1Bytes.front());
	const deFloat16* const	input2AsFP16				= reinterpret_cast<deFloat16* const>(&input2Bytes.front());
	deUint32				successfulRuns				= denormModesCount;
	std::string				results[denormModesCount];
	TestedLogicalFunction	testedLogicalFunction;

	for (deUint32 denormMode = 0; denormMode < denormModesCount; denormMode++)
	{
		const bool flushToZero = (denormMode == 1);

		for (size_t idx = 0; idx < input1Bytes.size() / sizeof(deFloat16); ++idx)
		{
			const tcu::Float16	f1pre			= tcu::Float16(input1AsFP16[idx]);
			const tcu::Float16	f2pre			= tcu::Float16(input2AsFP16[idx]);
			const tcu::Float16	f1				= (flushToZero && f1pre.isDenorm()) ? zero : f1pre;
			const tcu::Float16	f2				= (flushToZero && f2pre.isDenorm()) ? zero : f2pre;
			deFloat16			expectedOutput	= float16zero;

			if (onlyTestFunc)
			{
				if (testedLogicalFunction(f1, f2))
					expectedOutput = float16one;
			}
			else
			{
				const bool	f1nan	= f1.isNaN();
				const bool	f2nan	= f2.isNaN();

				// Skip NaN floats if not supported by implementation
				if (!nanSupported && (f1nan || f2nan))
					continue;

				if (unationModeAnd)
				{
					const bool	ordered		= !f1nan && !f2nan;

					if (ordered && testedLogicalFunction(f1, f2))
						expectedOutput = float16one;
				}
				else
				{
					const bool	unordered	= f1nan || f2nan;

					if (unordered || testedLogicalFunction(f1, f2))
						expectedOutput = float16one;
				}
			}

			if (outputAsFP16[idx] != expectedOutput)
			{
				std::ostringstream str;

				str << "ERROR: Sub-case #" << idx
					<< " flushToZero:" << flushToZero
					<< std::hex
					<< " failed, inputs: 0x" << f1.bits()
					<< ";0x" << f2.bits()
					<< " output: 0x" << outputAsFP16[idx]
					<< " expected output: 0x" << expectedOutput;

				results[denormMode] = str.str();

				successfulRuns--;

				break;
			}
		}
	}

	if (successfulRuns == 0)
		for (deUint32 denormMode = 0; denormMode < denormModesCount; denormMode++)
			log << TestLog::Message << results[denormMode] << TestLog::EndMessage;

	return successfulRuns > 0;
}

} // anonymous

tcu::TestCaseGroup* createOpSourceTests (tcu::TestContext& testCtx)
{
	struct NameCodePair { string name, code; };
	RGBA							defaultColors[4];
	de::MovePtr<tcu::TestCaseGroup> opSourceTests			(new tcu::TestCaseGroup(testCtx, "opsource", "OpSource instruction"));
	const std::string				opsourceGLSLWithFile	= "%opsrcfile = OpString \"foo.vert\"\nOpSource GLSL 450 %opsrcfile ";
	map<string, string>				fragments				= passthruFragments();
	const NameCodePair				tests[]					=
	{
		{"unknown", "OpSource Unknown 321"},
		{"essl", "OpSource ESSL 310"},
		{"glsl", "OpSource GLSL 450"},
		{"opencl_cpp", "OpSource OpenCL_CPP 120"},
		{"opencl_c", "OpSource OpenCL_C 120"},
		{"multiple", "OpSource GLSL 450\nOpSource GLSL 450"},
		{"file", opsourceGLSLWithFile},
		{"source", opsourceGLSLWithFile + "\"void main(){}\""},
		// Longest possible source string: SPIR-V limits instructions to 65535
		// words, of which the first 4 are opsourceGLSLWithFile; the rest will
		// contain 65530 UTF8 characters (one word each) plus one last word
		// containing 3 ASCII characters and \0.
		{"longsource", opsourceGLSLWithFile + '"' + makeLongUTF8String(65530) + "ccc" + '"'}
	};

	getDefaultColors(defaultColors);
	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameCodePair); ++testNdx)
	{
		fragments["debug"] = tests[testNdx].code;
		createTestsForAllStages(tests[testNdx].name, defaultColors, defaultColors, fragments, opSourceTests.get());
	}

	return opSourceTests.release();
}

tcu::TestCaseGroup* createOpSourceContinuedTests (tcu::TestContext& testCtx)
{
	struct NameCodePair { string name, code; };
	RGBA								defaultColors[4];
	de::MovePtr<tcu::TestCaseGroup>		opSourceTests		(new tcu::TestCaseGroup(testCtx, "opsourcecontinued", "OpSourceContinued instruction"));
	map<string, string>					fragments			= passthruFragments();
	const std::string					opsource			= "%opsrcfile = OpString \"foo.vert\"\nOpSource GLSL 450 %opsrcfile \"void main(){}\"\n";
	const NameCodePair					tests[]				=
	{
		{"empty", opsource + "OpSourceContinued \"\""},
		{"short", opsource + "OpSourceContinued \"abcde\""},
		{"multiple", opsource + "OpSourceContinued \"abcde\"\nOpSourceContinued \"fghij\""},
		// Longest possible source string: SPIR-V limits instructions to 65535
		// words, of which the first one is OpSourceContinued/length; the rest
		// will contain 65533 UTF8 characters (one word each) plus one last word
		// containing 3 ASCII characters and \0.
		{"long", opsource + "OpSourceContinued \"" + makeLongUTF8String(65533) + "ccc\""}
	};

	getDefaultColors(defaultColors);
	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameCodePair); ++testNdx)
	{
		fragments["debug"] = tests[testNdx].code;
		createTestsForAllStages(tests[testNdx].name, defaultColors, defaultColors, fragments, opSourceTests.get());
	}

	return opSourceTests.release();
}
tcu::TestCaseGroup* createOpNoLineTests(tcu::TestContext& testCtx)
{
	RGBA								 defaultColors[4];
	de::MovePtr<tcu::TestCaseGroup>		 opLineTests		 (new tcu::TestCaseGroup(testCtx, "opnoline", "OpNoLine instruction"));
	map<string, string>					 fragments;
	getDefaultColors(defaultColors);
	fragments["debug"]			=
		"%name = OpString \"name\"\n";

	fragments["pre_main"]	=
		"OpNoLine\n"
		"OpNoLine\n"
		"OpLine %name 1 1\n"
		"OpNoLine\n"
		"OpLine %name 1 1\n"
		"OpLine %name 1 1\n"
		"%second_function = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"OpNoLine\n"
		"OpLine %name 1 1\n"
		"OpNoLine\n"
		"OpLine %name 1 1\n"
		"OpLine %name 1 1\n"
		"%second_param1 = OpFunctionParameter %v4f32\n"
		"OpNoLine\n"
		"OpNoLine\n"
		"%label_secondfunction = OpLabel\n"
		"OpNoLine\n"
		"OpReturnValue %second_param1\n"
		"OpFunctionEnd\n"
		"OpNoLine\n"
		"OpNoLine\n";

	fragments["testfun"]		=
		// A %test_code function that returns its argument unchanged.
		"OpNoLine\n"
		"OpNoLine\n"
		"OpLine %name 1 1\n"
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"OpNoLine\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"OpNoLine\n"
		"OpNoLine\n"
		"%label_testfun = OpLabel\n"
		"OpNoLine\n"
		"%val1 = OpFunctionCall %v4f32 %second_function %param1\n"
		"OpReturnValue %val1\n"
		"OpFunctionEnd\n"
		"OpLine %name 1 1\n"
		"OpNoLine\n";

	createTestsForAllStages("opnoline", defaultColors, defaultColors, fragments, opLineTests.get());

	return opLineTests.release();
}

tcu::TestCaseGroup* createOpModuleProcessedTests(tcu::TestContext& testCtx)
{
	RGBA								defaultColors[4];
	de::MovePtr<tcu::TestCaseGroup>		opModuleProcessedTests			(new tcu::TestCaseGroup(testCtx, "opmoduleprocessed", "OpModuleProcessed instruction"));
	map<string, string>					fragments;
	std::vector<std::string>			noExtensions;
	GraphicsResources					resources;

	getDefaultColors(defaultColors);
	resources.verifyBinary = veryfiBinaryShader;
	resources.spirvVersion = SPIRV_VERSION_1_3;

	fragments["moduleprocessed"]							=
		"OpModuleProcessed \"VULKAN CTS\"\n"
		"OpModuleProcessed \"Negative values\"\n"
		"OpModuleProcessed \"Date: 2017/09/21\"\n";

	fragments["pre_main"]	=
		"%second_function = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%second_param1 = OpFunctionParameter %v4f32\n"
		"%label_secondfunction = OpLabel\n"
		"OpReturnValue %second_param1\n"
		"OpFunctionEnd\n";

	fragments["testfun"]		=
		// A %test_code function that returns its argument unchanged.
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%val1 = OpFunctionCall %v4f32 %second_function %param1\n"
		"OpReturnValue %val1\n"
		"OpFunctionEnd\n";

	createTestsForAllStages ("opmoduleprocessed", defaultColors, defaultColors, fragments, resources, noExtensions, opModuleProcessedTests.get());

	return opModuleProcessedTests.release();
}


tcu::TestCaseGroup* createOpLineTests(tcu::TestContext& testCtx)
{
	RGBA													defaultColors[4];
	de::MovePtr<tcu::TestCaseGroup>							opLineTests			(new tcu::TestCaseGroup(testCtx, "opline", "OpLine instruction"));
	map<string, string>										fragments;
	std::vector<std::pair<std::string, std::string> >		problemStrings;

	problemStrings.push_back(std::make_pair<std::string, std::string>("empty_name", ""));
	problemStrings.push_back(std::make_pair<std::string, std::string>("short_name", "short_name"));
	problemStrings.push_back(std::make_pair<std::string, std::string>("long_name", makeLongUTF8String(65530) + "ccc"));
	getDefaultColors(defaultColors);

	fragments["debug"]			=
		"%other_name = OpString \"other_name\"\n";

	fragments["pre_main"]	=
		"OpLine %file_name 32 0\n"
		"OpLine %file_name 32 32\n"
		"OpLine %file_name 32 40\n"
		"OpLine %other_name 32 40\n"
		"OpLine %other_name 0 100\n"
		"OpLine %other_name 0 4294967295\n"
		"OpLine %other_name 4294967295 0\n"
		"OpLine %other_name 32 40\n"
		"OpLine %file_name 0 0\n"
		"%second_function = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"OpLine %file_name 1 0\n"
		"%second_param1 = OpFunctionParameter %v4f32\n"
		"OpLine %file_name 1 3\n"
		"OpLine %file_name 1 2\n"
		"%label_secondfunction = OpLabel\n"
		"OpLine %file_name 0 2\n"
		"OpReturnValue %second_param1\n"
		"OpFunctionEnd\n"
		"OpLine %file_name 0 2\n"
		"OpLine %file_name 0 2\n";

	fragments["testfun"]		=
		// A %test_code function that returns its argument unchanged.
		"OpLine %file_name 1 0\n"
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"OpLine %file_name 16 330\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"OpLine %file_name 14 442\n"
		"%label_testfun = OpLabel\n"
		"OpLine %file_name 11 1024\n"
		"%val1 = OpFunctionCall %v4f32 %second_function %param1\n"
		"OpLine %file_name 2 97\n"
		"OpReturnValue %val1\n"
		"OpFunctionEnd\n"
		"OpLine %file_name 5 32\n";

	for (size_t i = 0; i < problemStrings.size(); ++i)
	{
		map<string, string> testFragments = fragments;
		testFragments["debug"] += "%file_name = OpString \"" + problemStrings[i].second + "\"\n";
		createTestsForAllStages(string("opline") + "_" + problemStrings[i].first, defaultColors, defaultColors, testFragments, opLineTests.get());
	}

	return opLineTests.release();
}

tcu::TestCaseGroup* createOpConstantNullTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> opConstantNullTests		(new tcu::TestCaseGroup(testCtx, "opconstantnull", "OpConstantNull instruction"));
	RGBA							colors[4];


	const char						functionStart[] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%lbl    = OpLabel\n";

	const char						functionEnd[]	=
		"OpReturnValue %transformed_param\n"
		"OpFunctionEnd\n";

	struct NameConstantsCode
	{
		string name;
		string constants;
		string code;
	};

	NameConstantsCode tests[] =
	{
		{
			"vec4",
			"%cnull = OpConstantNull %v4f32\n",
			"%transformed_param = OpFAdd %v4f32 %param1 %cnull\n"
		},
		{
			"float",
			"%cnull = OpConstantNull %f32\n",
			"%vp = OpVariable %fp_v4f32 Function\n"
			"%v  = OpLoad %v4f32 %vp\n"
			"%v0 = OpVectorInsertDynamic %v4f32 %v %cnull %c_i32_0\n"
			"%v1 = OpVectorInsertDynamic %v4f32 %v0 %cnull %c_i32_1\n"
			"%v2 = OpVectorInsertDynamic %v4f32 %v1 %cnull %c_i32_2\n"
			"%v3 = OpVectorInsertDynamic %v4f32 %v2 %cnull %c_i32_3\n"
			"%transformed_param = OpFAdd %v4f32 %param1 %v3\n"
		},
		{
			"bool",
			"%cnull             = OpConstantNull %bool\n",
			"%v                 = OpVariable %fp_v4f32 Function\n"
			"                     OpStore %v %param1\n"
			"                     OpSelectionMerge %false_label None\n"
			"                     OpBranchConditional %cnull %true_label %false_label\n"
			"%true_label        = OpLabel\n"
			"                     OpStore %v %c_v4f32_0_5_0_5_0_5_0_5\n"
			"                     OpBranch %false_label\n"
			"%false_label       = OpLabel\n"
			"%transformed_param = OpLoad %v4f32 %v\n"
		},
		{
			"i32",
			"%cnull             = OpConstantNull %i32\n",
			"%v                 = OpVariable %fp_v4f32 Function %c_v4f32_0_5_0_5_0_5_0_5\n"
			"%b                 = OpIEqual %bool %cnull %c_i32_0\n"
			"                     OpSelectionMerge %false_label None\n"
			"                     OpBranchConditional %b %true_label %false_label\n"
			"%true_label        = OpLabel\n"
			"                     OpStore %v %param1\n"
			"                     OpBranch %false_label\n"
			"%false_label       = OpLabel\n"
			"%transformed_param = OpLoad %v4f32 %v\n"
		},
		{
			"struct",
			"%stype             = OpTypeStruct %f32 %v4f32\n"
			"%fp_stype          = OpTypePointer Function %stype\n"
			"%cnull             = OpConstantNull %stype\n",
			"%v                 = OpVariable %fp_stype Function %cnull\n"
			"%f                 = OpAccessChain %fp_v4f32 %v %c_i32_1\n"
			"%f_val             = OpLoad %v4f32 %f\n"
			"%transformed_param = OpFAdd %v4f32 %param1 %f_val\n"
		},
		{
			"array",
			"%a4_v4f32          = OpTypeArray %v4f32 %c_u32_4\n"
			"%fp_a4_v4f32       = OpTypePointer Function %a4_v4f32\n"
			"%cnull             = OpConstantNull %a4_v4f32\n",
			"%v                 = OpVariable %fp_a4_v4f32 Function %cnull\n"
			"%f                 = OpAccessChain %fp_v4f32 %v %c_u32_0\n"
			"%f1                = OpAccessChain %fp_v4f32 %v %c_u32_1\n"
			"%f2                = OpAccessChain %fp_v4f32 %v %c_u32_2\n"
			"%f3                = OpAccessChain %fp_v4f32 %v %c_u32_3\n"
			"%f_val             = OpLoad %v4f32 %f\n"
			"%f1_val            = OpLoad %v4f32 %f1\n"
			"%f2_val            = OpLoad %v4f32 %f2\n"
			"%f3_val            = OpLoad %v4f32 %f3\n"
			"%t0                = OpFAdd %v4f32 %param1 %f_val\n"
			"%t1                = OpFAdd %v4f32 %t0 %f1_val\n"
			"%t2                = OpFAdd %v4f32 %t1 %f2_val\n"
			"%transformed_param = OpFAdd %v4f32 %t2 %f3_val\n"
		},
		{
			"matrix",
			"%mat4x4_f32        = OpTypeMatrix %v4f32 4\n"
			"%cnull             = OpConstantNull %mat4x4_f32\n",
			// Our null matrix * any vector should result in a zero vector.
			"%v                 = OpVectorTimesMatrix %v4f32 %param1 %cnull\n"
			"%transformed_param = OpFAdd %v4f32 %param1 %v\n"
		}
	};

	getHalfColorsFullAlpha(colors);

	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameConstantsCode); ++testNdx)
	{
		map<string, string> fragments;
		fragments["pre_main"] = tests[testNdx].constants;
		fragments["testfun"] = string(functionStart) + tests[testNdx].code + functionEnd;
		createTestsForAllStages(tests[testNdx].name, colors, colors, fragments, opConstantNullTests.get());
	}
	return opConstantNullTests.release();
}
tcu::TestCaseGroup* createOpConstantCompositeTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> opConstantCompositeTests		(new tcu::TestCaseGroup(testCtx, "opconstantcomposite", "OpConstantComposite instruction"));
	RGBA							inputColors[4];
	RGBA							outputColors[4];


	const char						functionStart[]	 =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%lbl    = OpLabel\n";

	const char						functionEnd[]		=
		"OpReturnValue %transformed_param\n"
		"OpFunctionEnd\n";

	struct NameConstantsCode
	{
		string name;
		string constants;
		string code;
	};

	NameConstantsCode tests[] =
	{
		{
			"vec4",

			"%cval              = OpConstantComposite %v4f32 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 %c_f32_0\n",
			"%transformed_param = OpFAdd %v4f32 %param1 %cval\n"
		},
		{
			"struct",

			"%stype             = OpTypeStruct %v4f32 %f32\n"
			"%fp_stype          = OpTypePointer Function %stype\n"
			"%f32_n_1           = OpConstant %f32 -1.0\n"
			"%f32_1_5           = OpConstant %f32 !0x3fc00000\n" // +1.5
			"%cvec              = OpConstantComposite %v4f32 %f32_1_5 %f32_1_5 %f32_1_5 %c_f32_1\n"
			"%cval              = OpConstantComposite %stype %cvec %f32_n_1\n",

			"%v                 = OpVariable %fp_stype Function %cval\n"
			"%vec_ptr           = OpAccessChain %fp_v4f32 %v %c_u32_0\n"
			"%f32_ptr           = OpAccessChain %fp_f32 %v %c_u32_1\n"
			"%vec_val           = OpLoad %v4f32 %vec_ptr\n"
			"%f32_val           = OpLoad %f32 %f32_ptr\n"
			"%tmp1              = OpVectorTimesScalar %v4f32 %c_v4f32_1_1_1_1 %f32_val\n" // vec4(-1)
			"%tmp2              = OpFAdd %v4f32 %tmp1 %param1\n" // param1 + vec4(-1)
			"%transformed_param = OpFAdd %v4f32 %tmp2 %vec_val\n" // param1 + vec4(-1) + vec4(1.5, 1.5, 1.5, 1.0)
		},
		{
			// [1|0|0|0.5] [x] = x + 0.5
			// [0|1|0|0.5] [y] = y + 0.5
			// [0|0|1|0.5] [z] = z + 0.5
			// [0|0|0|1  ] [1] = 1
			"matrix",

			"%mat4x4_f32          = OpTypeMatrix %v4f32 4\n"
			"%v4f32_1_0_0_0       = OpConstantComposite %v4f32 %c_f32_1 %c_f32_0 %c_f32_0 %c_f32_0\n"
			"%v4f32_0_1_0_0       = OpConstantComposite %v4f32 %c_f32_0 %c_f32_1 %c_f32_0 %c_f32_0\n"
			"%v4f32_0_0_1_0       = OpConstantComposite %v4f32 %c_f32_0 %c_f32_0 %c_f32_1 %c_f32_0\n"
			"%v4f32_0_5_0_5_0_5_1 = OpConstantComposite %v4f32 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 %c_f32_1\n"
			"%cval                = OpConstantComposite %mat4x4_f32 %v4f32_1_0_0_0 %v4f32_0_1_0_0 %v4f32_0_0_1_0 %v4f32_0_5_0_5_0_5_1\n",

			"%transformed_param   = OpMatrixTimesVector %v4f32 %cval %param1\n"
		},
		{
			"array",

			"%c_v4f32_1_1_1_0     = OpConstantComposite %v4f32 %c_f32_1 %c_f32_1 %c_f32_1 %c_f32_0\n"
			"%fp_a4f32            = OpTypePointer Function %a4f32\n"
			"%f32_n_1             = OpConstant %f32 -1.0\n"
			"%f32_1_5             = OpConstant %f32 !0x3fc00000\n" // +1.5
			"%carr                = OpConstantComposite %a4f32 %c_f32_0 %f32_n_1 %f32_1_5 %c_f32_0\n",

			"%v                   = OpVariable %fp_a4f32 Function %carr\n"
			"%f                   = OpAccessChain %fp_f32 %v %c_u32_0\n"
			"%f1                  = OpAccessChain %fp_f32 %v %c_u32_1\n"
			"%f2                  = OpAccessChain %fp_f32 %v %c_u32_2\n"
			"%f3                  = OpAccessChain %fp_f32 %v %c_u32_3\n"
			"%f_val               = OpLoad %f32 %f\n"
			"%f1_val              = OpLoad %f32 %f1\n"
			"%f2_val              = OpLoad %f32 %f2\n"
			"%f3_val              = OpLoad %f32 %f3\n"
			"%ftot1               = OpFAdd %f32 %f_val %f1_val\n"
			"%ftot2               = OpFAdd %f32 %ftot1 %f2_val\n"
			"%ftot3               = OpFAdd %f32 %ftot2 %f3_val\n"  // 0 - 1 + 1.5 + 0
			"%add_vec             = OpVectorTimesScalar %v4f32 %c_v4f32_1_1_1_0 %ftot3\n"
			"%transformed_param   = OpFAdd %v4f32 %param1 %add_vec\n"
		},
		{
			//
			// [
			//   {
			//      0.0,
			//      [ 1.0, 1.0, 1.0, 1.0]
			//   },
			//   {
			//      1.0,
			//      [ 0.0, 0.5, 0.0, 0.0]
			//   }, //     ^^^
			//   {
			//      0.0,
			//      [ 1.0, 1.0, 1.0, 1.0]
			//   }
			// ]
			"array_of_struct_of_array",

			"%c_v4f32_1_1_1_0     = OpConstantComposite %v4f32 %c_f32_1 %c_f32_1 %c_f32_1 %c_f32_0\n"
			"%fp_a4f32            = OpTypePointer Function %a4f32\n"
			"%stype               = OpTypeStruct %f32 %a4f32\n"
			"%a3stype             = OpTypeArray %stype %c_u32_3\n"
			"%fp_a3stype          = OpTypePointer Function %a3stype\n"
			"%ca4f32_0            = OpConstantComposite %a4f32 %c_f32_0 %c_f32_0_5 %c_f32_0 %c_f32_0\n"
			"%ca4f32_1            = OpConstantComposite %a4f32 %c_f32_1 %c_f32_1 %c_f32_1 %c_f32_1\n"
			"%cstype1             = OpConstantComposite %stype %c_f32_0 %ca4f32_1\n"
			"%cstype2             = OpConstantComposite %stype %c_f32_1 %ca4f32_0\n"
			"%carr                = OpConstantComposite %a3stype %cstype1 %cstype2 %cstype1",

			"%v                   = OpVariable %fp_a3stype Function %carr\n"
			"%f                   = OpAccessChain %fp_f32 %v %c_u32_1 %c_u32_1 %c_u32_1\n"
			"%f_l                 = OpLoad %f32 %f\n"
			"%add_vec             = OpVectorTimesScalar %v4f32 %c_v4f32_1_1_1_0 %f_l\n"
			"%transformed_param   = OpFAdd %v4f32 %param1 %add_vec\n"
		}
	};

	getHalfColorsFullAlpha(inputColors);
	outputColors[0] = RGBA(255, 255, 255, 255);
	outputColors[1] = RGBA(255, 127, 127, 255);
	outputColors[2] = RGBA(127, 255, 127, 255);
	outputColors[3] = RGBA(127, 127, 255, 255);

	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameConstantsCode); ++testNdx)
	{
		map<string, string> fragments;
		fragments["pre_main"] = tests[testNdx].constants;
		fragments["testfun"] = string(functionStart) + tests[testNdx].code + functionEnd;
		createTestsForAllStages(tests[testNdx].name, inputColors, outputColors, fragments, opConstantCompositeTests.get());
	}
	return opConstantCompositeTests.release();
}

tcu::TestCaseGroup* createSelectionBlockOrderTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group				(new tcu::TestCaseGroup(testCtx, "selection_block_order", "Out-of-order blocks for selection"));
	RGBA							inputColors[4];
	RGBA							outputColors[4];
	map<string, string>				fragments;

	// vec4 test_code(vec4 param) {
	//   vec4 result = param;
	//   for (int i = 0; i < 4; ++i) {
	//     if (i == 0) result[i] = 0.;
	//     else        result[i] = 1. - result[i];
	//   }
	//   return result;
	// }
	const char						function[]			=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1    = OpFunctionParameter %v4f32\n"
		"%lbl       = OpLabel\n"
		"%iptr      = OpVariable %fp_i32 Function\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"             OpStore %iptr %c_i32_0\n"
		"             OpStore %result %param1\n"
		"             OpBranch %loop\n"

		// Loop entry block.
		"%loop      = OpLabel\n"
		"%ival      = OpLoad %i32 %iptr\n"
		"%lt_4      = OpSLessThan %bool %ival %c_i32_4\n"
		"             OpLoopMerge %exit %if_entry None\n"
		"             OpBranchConditional %lt_4 %if_entry %exit\n"

		// Merge block for loop.
		"%exit      = OpLabel\n"
		"%ret       = OpLoad %v4f32 %result\n"
		"             OpReturnValue %ret\n"

		// If-statement entry block.
		"%if_entry  = OpLabel\n"
		"%loc       = OpAccessChain %fp_f32 %result %ival\n"
		"%eq_0      = OpIEqual %bool %ival %c_i32_0\n"
		"             OpSelectionMerge %if_exit None\n"
		"             OpBranchConditional %eq_0 %if_true %if_false\n"

		// False branch for if-statement.
		"%if_false  = OpLabel\n"
		"%val       = OpLoad %f32 %loc\n"
		"%sub       = OpFSub %f32 %c_f32_1 %val\n"
		"             OpStore %loc %sub\n"
		"             OpBranch %if_exit\n"

		// Merge block for if-statement.
		"%if_exit   = OpLabel\n"
		"%ival_next = OpIAdd %i32 %ival %c_i32_1\n"
		"             OpStore %iptr %ival_next\n"
		"             OpBranch %loop\n"

		// True branch for if-statement.
		"%if_true   = OpLabel\n"
		"             OpStore %loc %c_f32_0\n"
		"             OpBranch %if_exit\n"

		"             OpFunctionEnd\n";

	fragments["testfun"]	= function;

	inputColors[0]			= RGBA(127, 127, 127, 0);
	inputColors[1]			= RGBA(127, 0,   0,   0);
	inputColors[2]			= RGBA(0,   127, 0,   0);
	inputColors[3]			= RGBA(0,   0,   127, 0);

	outputColors[0]			= RGBA(0, 128, 128, 255);
	outputColors[1]			= RGBA(0, 255, 255, 255);
	outputColors[2]			= RGBA(0, 128, 255, 255);
	outputColors[3]			= RGBA(0, 255, 128, 255);

	createTestsForAllStages("out_of_order", inputColors, outputColors, fragments, group.get());

	return group.release();
}

tcu::TestCaseGroup* createSwitchBlockOrderTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group				(new tcu::TestCaseGroup(testCtx, "switch_block_order", "Out-of-order blocks for switch"));
	RGBA							inputColors[4];
	RGBA							outputColors[4];
	map<string, string>				fragments;

	const char						typesAndConstants[]	=
		"%c_f32_p2  = OpConstant %f32 0.2\n"
		"%c_f32_p4  = OpConstant %f32 0.4\n"
		"%c_f32_p6  = OpConstant %f32 0.6\n"
		"%c_f32_p8  = OpConstant %f32 0.8\n";

	// vec4 test_code(vec4 param) {
	//   vec4 result = param;
	//   for (int i = 0; i < 4; ++i) {
	//     switch (i) {
	//       case 0: result[i] += .2; break;
	//       case 1: result[i] += .6; break;
	//       case 2: result[i] += .4; break;
	//       case 3: result[i] += .8; break;
	//       default: break; // unreachable
	//     }
	//   }
	//   return result;
	// }
	const char						function[]			=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1    = OpFunctionParameter %v4f32\n"
		"%lbl       = OpLabel\n"
		"%iptr      = OpVariable %fp_i32 Function\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"             OpStore %iptr %c_i32_0\n"
		"             OpStore %result %param1\n"
		"             OpBranch %loop\n"

		// Loop entry block.
		"%loop      = OpLabel\n"
		"%ival      = OpLoad %i32 %iptr\n"
		"%lt_4      = OpSLessThan %bool %ival %c_i32_4\n"
		"             OpLoopMerge %exit %cont None\n"
		"             OpBranchConditional %lt_4 %switch_entry %exit\n"

		// Merge block for loop.
		"%exit      = OpLabel\n"
		"%ret       = OpLoad %v4f32 %result\n"
		"             OpReturnValue %ret\n"

		// Switch-statement entry block.
		"%switch_entry   = OpLabel\n"
		"%loc            = OpAccessChain %fp_f32 %result %ival\n"
		"%val            = OpLoad %f32 %loc\n"
		"                  OpSelectionMerge %switch_exit None\n"
		"                  OpSwitch %ival %switch_default 0 %case0 1 %case1 2 %case2 3 %case3\n"

		"%case2          = OpLabel\n"
		"%addp4          = OpFAdd %f32 %val %c_f32_p4\n"
		"                  OpStore %loc %addp4\n"
		"                  OpBranch %switch_exit\n"

		"%switch_default = OpLabel\n"
		"                  OpUnreachable\n"

		"%case3          = OpLabel\n"
		"%addp8          = OpFAdd %f32 %val %c_f32_p8\n"
		"                  OpStore %loc %addp8\n"
		"                  OpBranch %switch_exit\n"

		"%case0          = OpLabel\n"
		"%addp2          = OpFAdd %f32 %val %c_f32_p2\n"
		"                  OpStore %loc %addp2\n"
		"                  OpBranch %switch_exit\n"

		// Merge block for switch-statement.
		"%switch_exit    = OpLabel\n"
		"%ival_next      = OpIAdd %i32 %ival %c_i32_1\n"
		"                  OpStore %iptr %ival_next\n"
		"                  OpBranch %cont\n"
		"%cont           = OpLabel\n"
		"                  OpBranch %loop\n"

		"%case1          = OpLabel\n"
		"%addp6          = OpFAdd %f32 %val %c_f32_p6\n"
		"                  OpStore %loc %addp6\n"
		"                  OpBranch %switch_exit\n"

		"                  OpFunctionEnd\n";

	fragments["pre_main"]	= typesAndConstants;
	fragments["testfun"]	= function;

	inputColors[0]			= RGBA(127, 27,  127, 51);
	inputColors[1]			= RGBA(127, 0,   0,   51);
	inputColors[2]			= RGBA(0,   27,  0,   51);
	inputColors[3]			= RGBA(0,   0,   127, 51);

	outputColors[0]			= RGBA(178, 180, 229, 255);
	outputColors[1]			= RGBA(178, 153, 102, 255);
	outputColors[2]			= RGBA(51,  180, 102, 255);
	outputColors[3]			= RGBA(51,  153, 229, 255);

	createTestsForAllStages("out_of_order", inputColors, outputColors, fragments, group.get());

	return group.release();
}

tcu::TestCaseGroup* createDecorationGroupTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group				(new tcu::TestCaseGroup(testCtx, "decoration_group", "Decoration group tests"));
	RGBA							inputColors[4];
	RGBA							outputColors[4];
	map<string, string>				fragments;

	const char						decorations[]		=
		"OpDecorate %array_group         ArrayStride 4\n"
		"OpDecorate %struct_member_group Offset 0\n"
		"%array_group         = OpDecorationGroup\n"
		"%struct_member_group = OpDecorationGroup\n"

		"OpDecorate %group1 RelaxedPrecision\n"
		"OpDecorate %group3 RelaxedPrecision\n"
		"OpDecorate %group3 Invariant\n"
		"OpDecorate %group3 Restrict\n"
		"%group0 = OpDecorationGroup\n"
		"%group1 = OpDecorationGroup\n"
		"%group3 = OpDecorationGroup\n";

	const char						typesAndConstants[]	=
		"%a3f32     = OpTypeArray %f32 %c_u32_3\n"
		"%struct1   = OpTypeStruct %a3f32\n"
		"%struct2   = OpTypeStruct %a3f32\n"
		"%fp_struct1 = OpTypePointer Function %struct1\n"
		"%fp_struct2 = OpTypePointer Function %struct2\n"
		"%c_f32_2    = OpConstant %f32 2.\n"
		"%c_f32_n2   = OpConstant %f32 -2.\n"

		"%c_a3f32_1 = OpConstantComposite %a3f32 %c_f32_1 %c_f32_2 %c_f32_1\n"
		"%c_a3f32_2 = OpConstantComposite %a3f32 %c_f32_n1 %c_f32_n2 %c_f32_n1\n"
		"%c_struct1 = OpConstantComposite %struct1 %c_a3f32_1\n"
		"%c_struct2 = OpConstantComposite %struct2 %c_a3f32_2\n";

	const char						function[]			=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%entry     = OpLabel\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"%v_struct1 = OpVariable %fp_struct1 Function\n"
		"%v_struct2 = OpVariable %fp_struct2 Function\n"
		"             OpStore %result %param\n"
		"             OpStore %v_struct1 %c_struct1\n"
		"             OpStore %v_struct2 %c_struct2\n"
		"%ptr1      = OpAccessChain %fp_f32 %v_struct1 %c_i32_0 %c_i32_2\n"
		"%val1      = OpLoad %f32 %ptr1\n"
		"%ptr2      = OpAccessChain %fp_f32 %v_struct2 %c_i32_0 %c_i32_2\n"
		"%val2      = OpLoad %f32 %ptr2\n"
		"%addvalues = OpFAdd %f32 %val1 %val2\n"
		"%ptr       = OpAccessChain %fp_f32 %result %c_i32_1\n"
		"%val       = OpLoad %f32 %ptr\n"
		"%addresult = OpFAdd %f32 %addvalues %val\n"
		"             OpStore %ptr %addresult\n"
		"%ret       = OpLoad %v4f32 %result\n"
		"             OpReturnValue %ret\n"
		"             OpFunctionEnd\n";

	struct CaseNameDecoration
	{
		string name;
		string decoration;
	};

	CaseNameDecoration tests[] =
	{
		{
			"same_decoration_group_on_multiple_types",
			"OpGroupMemberDecorate %struct_member_group %struct1 0 %struct2 0\n"
		},
		{
			"empty_decoration_group",
			"OpGroupDecorate %group0      %a3f32\n"
			"OpGroupDecorate %group0      %result\n"
		},
		{
			"one_element_decoration_group",
			"OpGroupDecorate %array_group %a3f32\n"
		},
		{
			"multiple_elements_decoration_group",
			"OpGroupDecorate %group3      %v_struct1\n"
		},
		{
			"multiple_decoration_groups_on_same_variable",
			"OpGroupDecorate %group0      %v_struct2\n"
			"OpGroupDecorate %group1      %v_struct2\n"
			"OpGroupDecorate %group3      %v_struct2\n"
		},
		{
			"same_decoration_group_multiple_times",
			"OpGroupDecorate %group1      %addvalues\n"
			"OpGroupDecorate %group1      %addvalues\n"
			"OpGroupDecorate %group1      %addvalues\n"
		},

	};

	getHalfColorsFullAlpha(inputColors);
	getHalfColorsFullAlpha(outputColors);

	for (size_t idx = 0; idx < (sizeof(tests) / sizeof(tests[0])); ++idx)
	{
		fragments["decoration"]	= decorations + tests[idx].decoration;
		fragments["pre_main"]	= typesAndConstants;
		fragments["testfun"]	= function;

		createTestsForAllStages(tests[idx].name, inputColors, outputColors, fragments, group.get());
	}

	return group.release();
}

struct SpecConstantTwoValGraphicsCase
{
	const std::string	caseName;
	const std::string	scDefinition0;
	const std::string	scDefinition1;
	const std::string	scResultType;
	const std::string	scOperation;
	SpecConstantValue	scActualValue0;
	SpecConstantValue	scActualValue1;
	const std::string	resultOperation;
	RGBA				expectedColors[4];
	CaseFlags			caseFlags;

						SpecConstantTwoValGraphicsCase (const std::string&			name,
														const std::string&			definition0,
														const std::string&			definition1,
														const std::string&			resultType,
														const std::string&			operation,
														const SpecConstantValue&	value0,
														const SpecConstantValue&	value1,
														const std::string&			resultOp,
														const RGBA					(&output)[4],
														CaseFlags					flags = FLAG_NONE)
							: caseName				(name)
							, scDefinition0			(definition0)
							, scDefinition1			(definition1)
							, scResultType			(resultType)
							, scOperation			(operation)
							, scActualValue0		(value0)
							, scActualValue1		(value1)
							, resultOperation		(resultOp)
							, caseFlags				(flags)
	{
		expectedColors[0] = output[0];
		expectedColors[1] = output[1];
		expectedColors[2] = output[2];
		expectedColors[3] = output[3];
	}
};

tcu::TestCaseGroup* createSpecConstantTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>			group (new tcu::TestCaseGroup(testCtx, "opspecconstantop", "Test the OpSpecConstantOp instruction"));
	vector<SpecConstantTwoValGraphicsCase>	cases;
	RGBA									inputColors[4];
	RGBA									outputColors0[4];
	RGBA									outputColors1[4];
	RGBA									outputColors2[4];

	const char	decorations1[]			=
		"OpDecorate %sc_0  SpecId 0\n"
		"OpDecorate %sc_1  SpecId 1\n";

	const char	typesAndConstants1[]	=
		"${OPTYPE_DEFINITIONS:opt}"
		"%sc_0      = OpSpecConstant${SC_DEF0}\n"
		"%sc_1      = OpSpecConstant${SC_DEF1}\n"
		"%sc_op     = OpSpecConstantOp ${SC_RESULT_TYPE} ${SC_OP}\n";

	const char	function1[]				=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"${TYPE_CONVERT:opt}"
		"             OpStore %result %param\n"
		"%gen       = ${GEN_RESULT}\n"
		"%index     = OpIAdd %i32 %gen %c_i32_1\n"
		"%loc       = OpAccessChain %fp_f32 %result %index\n"
		"%val       = OpLoad %f32 %loc\n"
		"%add       = OpFAdd %f32 %val %c_f32_0_5\n"
		"             OpStore %loc %add\n"
		"%ret       = OpLoad %v4f32 %result\n"
		"             OpReturnValue %ret\n"
		"             OpFunctionEnd\n";

	inputColors[0] = RGBA(127, 127, 127, 255);
	inputColors[1] = RGBA(127, 0,   0,   255);
	inputColors[2] = RGBA(0,   127, 0,   255);
	inputColors[3] = RGBA(0,   0,   127, 255);

	// Derived from inputColors[x] by adding 128 to inputColors[x][0].
	outputColors0[0] = RGBA(255, 127, 127, 255);
	outputColors0[1] = RGBA(255, 0,   0,   255);
	outputColors0[2] = RGBA(128, 127, 0,   255);
	outputColors0[3] = RGBA(128, 0,   127, 255);

	// Derived from inputColors[x] by adding 128 to inputColors[x][1].
	outputColors1[0] = RGBA(127, 255, 127, 255);
	outputColors1[1] = RGBA(127, 128, 0,   255);
	outputColors1[2] = RGBA(0,   255, 0,   255);
	outputColors1[3] = RGBA(0,   128, 127, 255);

	// Derived from inputColors[x] by adding 128 to inputColors[x][2].
	outputColors2[0] = RGBA(127, 127, 255, 255);
	outputColors2[1] = RGBA(127, 0,   128, 255);
	outputColors2[2] = RGBA(0,   127, 128, 255);
	outputColors2[3] = RGBA(0,   0,   255, 255);

	const char addZeroToSc[]		= "OpIAdd %i32 %c_i32_0 %sc_op";
	const char addZeroToSc32[]		= "OpIAdd %i32 %c_i32_0 %sc_op32";
	const char selectTrueUsingSc[]	= "OpSelect %i32 %sc_op %c_i32_1 %c_i32_0";
	const char selectFalseUsingSc[]	= "OpSelect %i32 %sc_op %c_i32_0 %c_i32_1";

	cases.push_back(SpecConstantTwoValGraphicsCase("iadd",							" %i32 0",		" %i32 0",		"%i32",		"IAdd                 %sc_0 %sc_1",				19,					-20,				addZeroToSc,		outputColors0));
	cases.push_back(SpecConstantTwoValGraphicsCase("isub",							" %i32 0",		" %i32 0",		"%i32",		"ISub                 %sc_0 %sc_1",				19,					20,					addZeroToSc,		outputColors0));
	cases.push_back(SpecConstantTwoValGraphicsCase("imul",							" %i32 0",		" %i32 0",		"%i32",		"IMul                 %sc_0 %sc_1",				-1,					-1,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("sdiv",							" %i32 0",		" %i32 0",		"%i32",		"SDiv                 %sc_0 %sc_1",				-126,				126,				addZeroToSc,		outputColors0));
	cases.push_back(SpecConstantTwoValGraphicsCase("udiv",							" %i32 0",		" %i32 0",		"%i32",		"UDiv                 %sc_0 %sc_1",				126,				126,				addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("srem",							" %i32 0",		" %i32 0",		"%i32",		"SRem                 %sc_0 %sc_1",				3,					2,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("smod",							" %i32 0",		" %i32 0",		"%i32",		"SMod                 %sc_0 %sc_1",				3,					2,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("umod",							" %i32 0",		" %i32 0",		"%i32",		"UMod                 %sc_0 %sc_1",				1001,				500,				addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("bitwiseand",					" %i32 0",		" %i32 0",		"%i32",		"BitwiseAnd           %sc_0 %sc_1",				0x33,				0x0d,				addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("bitwiseor",						" %i32 0",		" %i32 0",		"%i32",		"BitwiseOr            %sc_0 %sc_1",				0,					1,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("bitwisexor",					" %i32 0",		" %i32 0",		"%i32",		"BitwiseXor           %sc_0 %sc_1",				0x2e,				0x2f,				addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical",				" %i32 0",		" %i32 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",				2,					1,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic",			" %i32 0",		" %i32 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",				-4,					2,					addZeroToSc,		outputColors0));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical",				" %i32 0",		" %i32 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",				1,					0,					addZeroToSc,		outputColors2));

	// Shifts for other integer sizes.
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical_i64",			" %i64 0",		" %i64 0",		"%i64",		"ShiftRightLogical    %sc_0 %sc_1",				deInt64{2},			deInt64{1},			addZeroToSc32,		outputColors2, (FLAG_I64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic_i64",		" %i64 0",		" %i64 0",		"%i64",		"ShiftRightArithmetic %sc_0 %sc_1",				deInt64{-4},		deInt64{2},			addZeroToSc32,		outputColors0, (FLAG_I64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical_i64",			" %i64 0",		" %i64 0",		"%i64",		"ShiftLeftLogical     %sc_0 %sc_1",				deInt64{1},			deInt64{0},			addZeroToSc32,		outputColors2, (FLAG_I64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical_i16",			" %i16 0",		" %i16 0",		"%i16",		"ShiftRightLogical    %sc_0 %sc_1",				deInt16{2},			deInt16{1},			addZeroToSc32,		outputColors2, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic_i16",		" %i16 0",		" %i16 0",		"%i16",		"ShiftRightArithmetic %sc_0 %sc_1",				deInt16{-4},		deInt16{2},			addZeroToSc32,		outputColors0, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical_i16",			" %i16 0",		" %i16 0",		"%i16",		"ShiftLeftLogical     %sc_0 %sc_1",				deInt16{1},			deInt16{0},			addZeroToSc32,		outputColors2, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical_i8",			" %i8 0",		" %i8 0",		"%i8",		"ShiftRightLogical    %sc_0 %sc_1",				deInt8{2},			deInt8{1},			addZeroToSc32,		outputColors2, (FLAG_I8 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic_i8",		" %i8 0",		" %i8 0",		"%i8",		"ShiftRightArithmetic %sc_0 %sc_1",				deInt8{-4},			deInt8{2},			addZeroToSc32,		outputColors0, (FLAG_I8 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical_i8",			" %i8 0",		" %i8 0",		"%i8",		"ShiftLeftLogical     %sc_0 %sc_1",				deInt8{1},			deInt8{0},			addZeroToSc32,		outputColors2, (FLAG_I8 | FLAG_CONVERT)));

	// Shifts for other integer sizes but only in the shift amount.
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical_s_i64",		" %i32 0",		" %i64 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",				2,					deInt64{1},			addZeroToSc,		outputColors2, (FLAG_I64)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic_s_i64",	" %i32 0",		" %i64 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",				-4,					deInt64{2},			addZeroToSc,		outputColors0, (FLAG_I64)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical_s_i64",		" %i32 0",		" %i64 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",				1,					deInt64{0},			addZeroToSc,		outputColors2, (FLAG_I64)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical_s_i16",		" %i32 0",		" %i16 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",				2,					deInt16{1},			addZeroToSc,		outputColors2, (FLAG_I16)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic_s_i16",	" %i32 0",		" %i16 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",				-4,					deInt16{2},			addZeroToSc,		outputColors0, (FLAG_I16)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical_s_i16",		" %i32 0",		" %i16 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",				1,					deInt16{0},			addZeroToSc,		outputColors2, (FLAG_I16)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightlogical_s_i8",		" %i32 0",		" %i8 0",		"%i32",		"ShiftRightLogical    %sc_0 %sc_1",				2,					deInt8{1},			addZeroToSc,		outputColors2, (FLAG_I8)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftrightarithmetic_s_i8",		" %i32 0",		" %i8 0",		"%i32",		"ShiftRightArithmetic %sc_0 %sc_1",				-4,					deInt8{2},			addZeroToSc,		outputColors0, (FLAG_I8)));
	cases.push_back(SpecConstantTwoValGraphicsCase("shiftleftlogical_s_i8",			" %i32 0",		" %i8 0",		"%i32",		"ShiftLeftLogical     %sc_0 %sc_1",				1,					deInt8{0},			addZeroToSc,		outputColors2, (FLAG_I8)));

	cases.push_back(SpecConstantTwoValGraphicsCase("slessthan",						" %i32 0",		" %i32 0",		"%bool",	"SLessThan            %sc_0 %sc_1",				-20,				-10,				selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("ulessthan",						" %i32 0",		" %i32 0",		"%bool",	"ULessThan            %sc_0 %sc_1",				10,					20,					selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("sgreaterthan",					" %i32 0",		" %i32 0",		"%bool",	"SGreaterThan         %sc_0 %sc_1",				-1000,				50,					selectFalseUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("ugreaterthan",					" %i32 0",		" %i32 0",		"%bool",	"UGreaterThan         %sc_0 %sc_1",				10,					5,					selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("slessthanequal",				" %i32 0",		" %i32 0",		"%bool",	"SLessThanEqual       %sc_0 %sc_1",				-10,				-10,				selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("ulessthanequal",				" %i32 0",		" %i32 0",		"%bool",	"ULessThanEqual       %sc_0 %sc_1",				50,					100,				selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("sgreaterthanequal",				" %i32 0",		" %i32 0",		"%bool",	"SGreaterThanEqual    %sc_0 %sc_1",				-1000,				50,					selectFalseUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("ugreaterthanequal",				" %i32 0",		" %i32 0",		"%bool",	"UGreaterThanEqual    %sc_0 %sc_1",				10,					10,					selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("iequal",						" %i32 0",		" %i32 0",		"%bool",	"IEqual               %sc_0 %sc_1",				42,					24,					selectFalseUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("inotequal",						" %i32 0",		" %i32 0",		"%bool",	"INotEqual            %sc_0 %sc_1",				42,					24,					selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("logicaland",					"True %bool",	"True %bool",	"%bool",	"LogicalAnd           %sc_0 %sc_1",				0,					1,					selectFalseUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("logicalor",						"False %bool",	"False %bool",	"%bool",	"LogicalOr            %sc_0 %sc_1",				1,					0,					selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("logicalequal",					"True %bool",	"True %bool",	"%bool",	"LogicalEqual         %sc_0 %sc_1",				0,					1,					selectFalseUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("logicalnotequal",				"False %bool",	"False %bool",	"%bool",	"LogicalNotEqual      %sc_0 %sc_1",				1,					0,					selectTrueUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("snegate",						" %i32 0",		" %i32 0",		"%i32",		"SNegate              %sc_0",					-1,					0,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("not",							" %i32 0",		" %i32 0",		"%i32",		"Not                  %sc_0",					-2,					0,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("logicalnot",					"False %bool",	"False %bool",	"%bool",	"LogicalNot           %sc_0",					1,					0,					selectFalseUsingSc,	outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("select",						"False %bool",	" %i32 0",		"%i32",		"Select               %sc_0 %sc_1 %c_i32_0",	1,					1,					addZeroToSc,		outputColors2));
	cases.push_back(SpecConstantTwoValGraphicsCase("sconvert",						" %i32 0",		" %i32 0",		"%i16",		"SConvert             %sc_0",					-1,					0,					addZeroToSc32,		outputColors0, (FLAG_I16 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("fconvert",						" %f32 0",		" %f32 0",		"%f64",		"FConvert             %sc_0",					tcu::Float32(-1.0),	tcu::Float32(0.0),	addZeroToSc32,		outputColors0, (FLAG_F64 | FLAG_CONVERT)));
	cases.push_back(SpecConstantTwoValGraphicsCase("fconvert16",					" %f16 0",		" %f16 0",		"%f32",		"FConvert             %sc_0",					tcu::Float16(-1.0),	tcu::Float16(0.0),	addZeroToSc32,		outputColors0, (FLAG_F16 | FLAG_CONVERT)));
	// \todo[2015-12-1 antiagainst] OpQuantizeToF16

	for (size_t caseNdx = 0; caseNdx < cases.size(); ++caseNdx)
	{
		map<string, string>			specializations;
		map<string, string>			fragments;
		SpecConstants				specConstants;
		PushConstants				noPushConstants;
		GraphicsResources			noResources;
		GraphicsInterfaces			noInterfaces;
		vector<string>				extensions;
		VulkanFeatures				requiredFeatures;

		// Special SPIR-V code when using 16-bit integers.
		if (cases[caseNdx].caseFlags & FLAG_I16)
		{
			requiredFeatures.coreFeatures.shaderInt16		= VK_TRUE;
			fragments["capability"]							+= "OpCapability Int16\n";							// Adds 16-bit integer capability
			specializations["OPTYPE_DEFINITIONS"]			+= "%i16 = OpTypeInt 16 1\n";						// Adds 16-bit integer type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]				+= "%sc_op32 = OpSConvert %i32 %sc_op\n";			// Converts 16-bit integer to 32-bit integer
		}

		// Special SPIR-V code when using 64-bit integers.
		if (cases[caseNdx].caseFlags & FLAG_I64)
		{
			requiredFeatures.coreFeatures.shaderInt64		= VK_TRUE;
			fragments["capability"]							+= "OpCapability Int64\n";							// Adds 64-bit integer capability
			specializations["OPTYPE_DEFINITIONS"]			+= "%i64 = OpTypeInt 64 1\n";						// Adds 64-bit integer type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]				+= "%sc_op32 = OpSConvert %i32 %sc_op\n";			// Converts 64-bit integer to 32-bit integer
		}

		// Special SPIR-V code when using 64-bit floats.
		if (cases[caseNdx].caseFlags & FLAG_F64)
		{
			requiredFeatures.coreFeatures.shaderFloat64		= VK_TRUE;
			fragments["capability"]							+= "OpCapability Float64\n";						// Adds 64-bit float capability
			specializations["OPTYPE_DEFINITIONS"]			+= "%f64 = OpTypeFloat 64\n";						// Adds 64-bit float type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]				+= "%sc_op32 = OpConvertFToS %i32 %sc_op\n";		// Converts 64-bit float to 32-bit integer
		}

		// Extension needed for float16 and int8.
		if (cases[caseNdx].caseFlags & (FLAG_F16 | FLAG_I8))
			extensions.push_back("VK_KHR_shader_float16_int8");

		// Special SPIR-V code when using 16-bit floats.
		if (cases[caseNdx].caseFlags & FLAG_F16)
		{
			requiredFeatures.extFloat16Int8				|= EXTFLOAT16INT8FEATURES_FLOAT16;
			fragments["capability"]						+= "OpCapability Float16\n";						// Adds 16-bit float capability
			specializations["OPTYPE_DEFINITIONS"]		+= "%f16 = OpTypeFloat 16\n";						// Adds 16-bit float type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]			+= "%sc_op32 = OpConvertFToS %i32 %sc_op\n";		// Converts 16-bit float to 32-bit integer
		}

		// Special SPIR-V code when using 8-bit integers.
		if (cases[caseNdx].caseFlags & FLAG_I8)
		{
			requiredFeatures.extFloat16Int8				|= EXTFLOAT16INT8FEATURES_INT8;
			fragments["capability"]						+= "OpCapability Int8\n";						// Adds 8-bit integer capability
			specializations["OPTYPE_DEFINITIONS"]		+= "%i8 = OpTypeInt 8 1\n";						// Adds 8-bit integer type
			if (cases[caseNdx].caseFlags & FLAG_CONVERT)
				specializations["TYPE_CONVERT"]			+= "%sc_op32 = OpSConvert %i32 %sc_op\n";		// Converts 8-bit integer to 32-bit integer
		}

		specializations["SC_DEF0"]			= cases[caseNdx].scDefinition0;
		specializations["SC_DEF1"]			= cases[caseNdx].scDefinition1;
		specializations["SC_RESULT_TYPE"]	= cases[caseNdx].scResultType;
		specializations["SC_OP"]			= cases[caseNdx].scOperation;
		specializations["GEN_RESULT"]		= cases[caseNdx].resultOperation;

		fragments["decoration"]				= tcu::StringTemplate(decorations1).specialize(specializations);
		fragments["pre_main"]				= tcu::StringTemplate(typesAndConstants1).specialize(specializations);
		fragments["testfun"]				= tcu::StringTemplate(function1).specialize(specializations);

		cases[caseNdx].scActualValue0.appendTo(specConstants);
		cases[caseNdx].scActualValue1.appendTo(specConstants);

		createTestsForAllStages(
			cases[caseNdx].caseName, inputColors, cases[caseNdx].expectedColors, fragments, specConstants,
			noPushConstants, noResources, noInterfaces, extensions, requiredFeatures, group.get());
	}

	const char			decorations2[]		=
		"OpDecorate %sc_0  SpecId 0\n"
		"OpDecorate %sc_1  SpecId 1\n"
		"OpDecorate %sc_2  SpecId 2\n";

	const std::string	typesAndConstants2	=
		"%vec3_0      = OpConstantComposite %v3i32 %c_i32_0 %c_i32_0 %c_i32_0\n"
		"%vec3_undef  = OpUndef %v3i32\n"

		+ getSpecConstantOpStructConstantsAndTypes() + getSpecConstantOpStructComposites() +

		"%sc_0        = OpSpecConstant %i32 0\n"
		"%sc_1        = OpSpecConstant %i32 0\n"
		"%sc_2        = OpSpecConstant %i32 0\n"

		+ getSpecConstantOpStructConstBlock() +

		"%sc_vec3_0   = OpSpecConstantOp %v3i32 CompositeInsert  %sc_0        %vec3_0      0\n"							// (sc_0, 0,    0)
		"%sc_vec3_1   = OpSpecConstantOp %v3i32 CompositeInsert  %sc_1        %vec3_0      1\n"							// (0,    sc_1, 0)
		"%sc_vec3_2   = OpSpecConstantOp %v3i32 CompositeInsert  %sc_2        %vec3_0      2\n"							// (0,    0,    sc_2)
		"%sc_vec3_0_s = OpSpecConstantOp %v3i32 VectorShuffle    %sc_vec3_0   %vec3_undef  0          0xFFFFFFFF 2\n"	// (sc_0, ???,  0)
		"%sc_vec3_1_s = OpSpecConstantOp %v3i32 VectorShuffle    %sc_vec3_1   %vec3_undef  0xFFFFFFFF 1          0\n"	// (???,  sc_1, 0)
		"%sc_vec3_2_s = OpSpecConstantOp %v3i32 VectorShuffle    %vec3_undef  %sc_vec3_2   5          0xFFFFFFFF 5\n"	// (sc_2, ???,  sc_2)
		"%sc_vec3_01  = OpSpecConstantOp %v3i32 VectorShuffle    %sc_vec3_0_s %sc_vec3_1_s 1 0 4\n"						// (0,    sc_0, sc_1)
		"%sc_vec3_012 = OpSpecConstantOp %v3i32 VectorShuffle    %sc_vec3_01  %sc_vec3_2_s 5 1 2\n"						// (sc_2, sc_0, sc_1)
		"%sc_ext_0    = OpSpecConstantOp %i32   CompositeExtract %sc_vec3_012              0\n"							// sc_2
		"%sc_ext_1    = OpSpecConstantOp %i32   CompositeExtract %sc_vec3_012              1\n"							// sc_0
		"%sc_ext_2    = OpSpecConstantOp %i32   CompositeExtract %sc_vec3_012              2\n"							// sc_1
		"%sc_sub      = OpSpecConstantOp %i32   ISub             %sc_ext_0    %sc_ext_1\n"								// (sc_2 - sc_0)
		"%sc_factor   = OpSpecConstantOp %i32   IMul             %sc_sub      %sc_ext_2\n";								// (sc_2 - sc_0) * sc_1

	const std::string	function2			=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%result    = OpVariable %fp_v4f32 Function\n"

		+ getSpecConstantOpStructInstructions() +

		"             OpStore %result %param\n"
		"%loc       = OpAccessChain %fp_f32 %result %sc_final\n"
		"%val       = OpLoad %f32 %loc\n"
		"%add       = OpFAdd %f32 %val %c_f32_0_5\n"
		"             OpStore %loc %add\n"
		"%ret       = OpLoad %v4f32 %result\n"
		"             OpReturnValue %ret\n"
		"             OpFunctionEnd\n";

	map<string, string>	fragments;
	SpecConstants		specConstants;

	fragments["decoration"]	= decorations2;
	fragments["pre_main"]	= typesAndConstants2;
	fragments["testfun"]	= function2;

	specConstants.append<deInt32>(56789);
	specConstants.append<deInt32>(-2);
	specConstants.append<deInt32>(56788);

	createTestsForAllStages("vector_related", inputColors, outputColors2, fragments, specConstants, group.get());

	return group.release();
}

tcu::TestCaseGroup* createOpPhiTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group				(new tcu::TestCaseGroup(testCtx, "opphi", "Test the OpPhi instruction"));
	RGBA							inputColors[4];
	RGBA							outputColors1[4];
	RGBA							outputColors2[4];
	RGBA							outputColors3[4];
	RGBA							outputColors4[4];
	map<string, string>				fragments1;
	map<string, string>				fragments2;
	map<string, string>				fragments3;
	map<string, string>				fragments4;
	std::vector<std::string>		extensions4;
	GraphicsResources				resources4;
	VulkanFeatures					vulkanFeatures4;

	const char	typesAndConstants1[]	=
		"%c_f32_p2  = OpConstant %f32 0.2\n"
		"%c_f32_p4  = OpConstant %f32 0.4\n"
		"%c_f32_p5  = OpConstant %f32 0.5\n"
		"%c_f32_p8  = OpConstant %f32 0.8\n";

	// vec4 test_code(vec4 param) {
	//   vec4 result = param;
	//   for (int i = 0; i < 4; ++i) {
	//     float operand;
	//     switch (i) {
	//       case 0: operand = .2; break;
	//       case 1: operand = .5; break;
	//       case 2: operand = .4; break;
	//       case 3: operand = .0; break;
	//       default: break; // unreachable
	//     }
	//     result[i] += operand;
	//   }
	//   return result;
	// }
	const char	function1[]				=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1    = OpFunctionParameter %v4f32\n"
		"%lbl       = OpLabel\n"
		"%iptr      = OpVariable %fp_i32 Function\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"             OpStore %iptr %c_i32_0\n"
		"             OpStore %result %param1\n"
		"             OpBranch %loop\n"

		"%loop      = OpLabel\n"
		"%ival      = OpLoad %i32 %iptr\n"
		"%lt_4      = OpSLessThan %bool %ival %c_i32_4\n"
		"             OpLoopMerge %exit %cont None\n"
		"             OpBranchConditional %lt_4 %entry %exit\n"

		"%entry     = OpLabel\n"
		"%loc       = OpAccessChain %fp_f32 %result %ival\n"
		"%val       = OpLoad %f32 %loc\n"
		"             OpSelectionMerge %phi None\n"
		"             OpSwitch %ival %default 0 %case0 1 %case1 2 %case2 3 %case3\n"

		"%case0     = OpLabel\n"
		"             OpBranch %phi\n"
		"%case1     = OpLabel\n"
		"             OpBranch %phi\n"
		"%case2     = OpLabel\n"
		"             OpBranch %phi\n"
		"%case3     = OpLabel\n"
		"             OpBranch %phi\n"

		"%default   = OpLabel\n"
		"             OpUnreachable\n"

		"%phi       = OpLabel\n"
		"%operand   = OpPhi %f32 %c_f32_p4 %case2 %c_f32_p5 %case1 %c_f32_p2 %case0 %c_f32_0 %case3\n" // not in the order of blocks
		"             OpBranch %cont\n"
		"%cont      = OpLabel\n"
		"%add       = OpFAdd %f32 %val %operand\n"
		"             OpStore %loc %add\n"
		"%ival_next = OpIAdd %i32 %ival %c_i32_1\n"
		"             OpStore %iptr %ival_next\n"
		"             OpBranch %loop\n"

		"%exit      = OpLabel\n"
		"%ret       = OpLoad %v4f32 %result\n"
		"             OpReturnValue %ret\n"

		"             OpFunctionEnd\n";

	fragments1["pre_main"]	= typesAndConstants1;
	fragments1["testfun"]	= function1;

	getHalfColorsFullAlpha(inputColors);

	outputColors1[0]		= RGBA(178, 255, 229, 255);
	outputColors1[1]		= RGBA(178, 127, 102, 255);
	outputColors1[2]		= RGBA(51,  255, 102, 255);
	outputColors1[3]		= RGBA(51,  127, 229, 255);

	createTestsForAllStages("out_of_order", inputColors, outputColors1, fragments1, group.get());

	const char	typesAndConstants2[]	=
		"%c_f32_p2  = OpConstant %f32 0.2\n";

	// Add .4 to the second element of the given parameter.
	const char	function2[]				=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%entry     = OpLabel\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"             OpStore %result %param\n"
		"%loc       = OpAccessChain %fp_f32 %result %c_i32_1\n"
		"%val       = OpLoad %f32 %loc\n"
		"             OpBranch %phi\n"

		"%phi        = OpLabel\n"
		"%step       = OpPhi %i32 %c_i32_0  %entry %step_next  %phi\n"
		"%accum      = OpPhi %f32 %val      %entry %accum_next %phi\n"
		"%step_next  = OpIAdd %i32 %step  %c_i32_1\n"
		"%accum_next = OpFAdd %f32 %accum %c_f32_p2\n"
		"%still_loop = OpSLessThan %bool %step %c_i32_2\n"
		"              OpLoopMerge %exit %phi None\n"
		"              OpBranchConditional %still_loop %phi %exit\n"

		"%exit       = OpLabel\n"
		"              OpStore %loc %accum\n"
		"%ret        = OpLoad %v4f32 %result\n"
		"              OpReturnValue %ret\n"

		"              OpFunctionEnd\n";

	fragments2["pre_main"]	= typesAndConstants2;
	fragments2["testfun"]	= function2;

	outputColors2[0]			= RGBA(127, 229, 127, 255);
	outputColors2[1]			= RGBA(127, 102, 0,   255);
	outputColors2[2]			= RGBA(0,   229, 0,   255);
	outputColors2[3]			= RGBA(0,   102, 127, 255);

	createTestsForAllStages("induction", inputColors, outputColors2, fragments2, group.get());

	const char	typesAndConstants3[]	=
		"%true      = OpConstantTrue %bool\n"
		"%false     = OpConstantFalse %bool\n"
		"%c_f32_p2  = OpConstant %f32 0.2\n";

	// Swap the second and the third element of the given parameter.
	const char	function3[]				=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%entry     = OpLabel\n"
		"%result    = OpVariable %fp_v4f32 Function\n"
		"             OpStore %result %param\n"
		"%a_loc     = OpAccessChain %fp_f32 %result %c_i32_1\n"
		"%a_init    = OpLoad %f32 %a_loc\n"
		"%b_loc     = OpAccessChain %fp_f32 %result %c_i32_2\n"
		"%b_init    = OpLoad %f32 %b_loc\n"
		"             OpBranch %phi\n"

		"%phi        = OpLabel\n"
		"%still_loop = OpPhi %bool %true   %entry %false  %phi\n"
		"%a_next     = OpPhi %f32  %a_init %entry %b_next %phi\n"
		"%b_next     = OpPhi %f32  %b_init %entry %a_next %phi\n"
		"              OpLoopMerge %exit %phi None\n"
		"              OpBranchConditional %still_loop %phi %exit\n"

		"%exit       = OpLabel\n"
		"              OpStore %a_loc %a_next\n"
		"              OpStore %b_loc %b_next\n"
		"%ret        = OpLoad %v4f32 %result\n"
		"              OpReturnValue %ret\n"

		"              OpFunctionEnd\n";

	fragments3["pre_main"]	= typesAndConstants3;
	fragments3["testfun"]	= function3;

	outputColors3[0]			= RGBA(127, 127, 127, 255);
	outputColors3[1]			= RGBA(127, 0,   0,   255);
	outputColors3[2]			= RGBA(0,   0,   127, 255);
	outputColors3[3]			= RGBA(0,   127, 0,   255);

	createTestsForAllStages("swap", inputColors, outputColors3, fragments3, group.get());

	const char	typesAndConstants4[]	=
		"%f16        = OpTypeFloat 16\n"
		"%v4f16      = OpTypeVector %f16 4\n"
		"%fp_f16     = OpTypePointer Function %f16\n"
		"%fp_v4f16   = OpTypePointer Function %v4f16\n"
		"%true       = OpConstantTrue %bool\n"
		"%false      = OpConstantFalse %bool\n"
		"%c_f32_p2   = OpConstant %f32 0.2\n";

	// Swap the second and the third element of the given parameter.
	const char	function4[]				=
		"%test_code  = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param      = OpFunctionParameter %v4f32\n"
		"%entry      = OpLabel\n"
		"%result     = OpVariable %fp_v4f16 Function\n"
		"%param16    = OpFConvert %v4f16 %param\n"
		"              OpStore %result %param16\n"
		"%a_loc      = OpAccessChain %fp_f16 %result %c_i32_1\n"
		"%a_init     = OpLoad %f16 %a_loc\n"
		"%b_loc      = OpAccessChain %fp_f16 %result %c_i32_2\n"
		"%b_init     = OpLoad %f16 %b_loc\n"
		"              OpBranch %phi\n"

		"%phi        = OpLabel\n"
		"%still_loop = OpPhi %bool %true   %entry %false  %phi\n"
		"%a_next     = OpPhi %f16  %a_init %entry %b_next %phi\n"
		"%b_next     = OpPhi %f16  %b_init %entry %a_next %phi\n"
		"              OpLoopMerge %exit %phi None\n"
		"              OpBranchConditional %still_loop %phi %exit\n"

		"%exit       = OpLabel\n"
		"              OpStore %a_loc %a_next\n"
		"              OpStore %b_loc %b_next\n"
		"%ret16      = OpLoad %v4f16 %result\n"
		"%ret        = OpFConvert %v4f32 %ret16\n"
		"              OpReturnValue %ret\n"

		"              OpFunctionEnd\n";

	fragments4["pre_main"]		= typesAndConstants4;
	fragments4["testfun"]		= function4;
	fragments4["capability"]	= "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
	fragments4["extension"]		= "OpExtension \"SPV_KHR_16bit_storage\"";

	extensions4.push_back("VK_KHR_16bit_storage");
	extensions4.push_back("VK_KHR_shader_float16_int8");

	vulkanFeatures4.ext16BitStorage	= EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
	vulkanFeatures4.extFloat16Int8	= EXTFLOAT16INT8FEATURES_FLOAT16;

	outputColors4[0]			= RGBA(127, 127, 127, 255);
	outputColors4[1]			= RGBA(127, 0,   0,   255);
	outputColors4[2]			= RGBA(0,   0,   127, 255);
	outputColors4[3]			= RGBA(0,   127, 0,   255);

	createTestsForAllStages("swap16", inputColors, outputColors4, fragments4, resources4, extensions4, group.get(), vulkanFeatures4);

	return group.release();
}

tcu::TestCaseGroup* createNoContractionTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group			(new tcu::TestCaseGroup(testCtx, "nocontraction", "Test the NoContraction decoration"));
	RGBA							inputColors[4];
	RGBA							outputColors[4];

	// With NoContraction, (1 + 2^-23) * (1 - 2^-23) - 1 should be conducted as a multiplication and an addition separately.
	// For the multiplication, the result is 1 - 2^-46, which is out of the precision range for 32-bit float. (32-bit float
	// only have 23-bit fraction.) So it will be rounded to 1. Or 0x1.fffffc. Then the final result is 0 or -0x1p-24.
	// On the contrary, the result will be 2^-46, which is a normalized number perfectly representable as 32-bit float.
	const char						constantsAndTypes[]	 =
		"%c_vec4_0       = OpConstantComposite %v4f32 %c_f32_0 %c_f32_0 %c_f32_0 %c_f32_1\n"
		"%c_vec4_1       = OpConstantComposite %v4f32 %c_f32_1 %c_f32_1 %c_f32_1 %c_f32_1\n"
		"%c_f32_1pl2_23  = OpConstant %f32 0x1.000002p+0\n" // 1 + 2^-23
		"%c_f32_1mi2_23  = OpConstant %f32 0x1.fffffcp-1\n" // 1 - 2^-23
		"%c_f32_n1pn24   = OpConstant %f32 -0x1p-24\n";

	const char						function[]	 =
		"%test_code      = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param          = OpFunctionParameter %v4f32\n"
		"%label          = OpLabel\n"
		"%var1           = OpVariable %fp_f32 Function %c_f32_1pl2_23\n"
		"%var2           = OpVariable %fp_f32 Function\n"
		"%red            = OpCompositeExtract %f32 %param 0\n"
		"%plus_red       = OpFAdd %f32 %c_f32_1mi2_23 %red\n"
		"                  OpStore %var2 %plus_red\n"
		"%val1           = OpLoad %f32 %var1\n"
		"%val2           = OpLoad %f32 %var2\n"
		"%mul            = OpFMul %f32 %val1 %val2\n"
		"%add            = OpFAdd %f32 %mul %c_f32_n1\n"
		"%is0            = OpFOrdEqual %bool %add %c_f32_0\n"
		"%isn1n24         = OpFOrdEqual %bool %add %c_f32_n1pn24\n"
		"%success        = OpLogicalOr %bool %is0 %isn1n24\n"
		"%v4success      = OpCompositeConstruct %v4bool %success %success %success %success\n"
		"%ret            = OpSelect %v4f32 %v4success %c_vec4_0 %c_vec4_1\n"
		"                  OpReturnValue %ret\n"
		"                  OpFunctionEnd\n";

	struct CaseNameDecoration
	{
		string name;
		string decoration;
	};


	CaseNameDecoration tests[] = {
		{"multiplication",	"OpDecorate %mul NoContraction"},
		{"addition",		"OpDecorate %add NoContraction"},
		{"both",			"OpDecorate %mul NoContraction\nOpDecorate %add NoContraction"},
	};

	getHalfColorsFullAlpha(inputColors);

	for (deUint8 idx = 0; idx < 4; ++idx)
	{
		inputColors[idx].setRed(0);
		outputColors[idx] = RGBA(0, 0, 0, 255);
	}

	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(CaseNameDecoration); ++testNdx)
	{
		map<string, string> fragments;

		fragments["decoration"] = tests[testNdx].decoration;
		fragments["pre_main"] = constantsAndTypes;
		fragments["testfun"] = function;

		createTestsForAllStages(tests[testNdx].name, inputColors, outputColors, fragments, group.get());
	}

	return group.release();
}

tcu::TestCaseGroup* createMemoryAccessTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> memoryAccessTests (new tcu::TestCaseGroup(testCtx, "opmemoryaccess", "Memory Semantics"));
	RGBA							colors[4];

	const char						constantsAndTypes[]	 =
		"%c_a2f32_1         = OpConstantComposite %a2f32 %c_f32_1 %c_f32_1\n"
		"%fp_a2f32          = OpTypePointer Function %a2f32\n"
		"%stype             = OpTypeStruct  %v4f32 %a2f32 %f32\n"
		"%fp_stype          = OpTypePointer Function %stype\n";

	const char						function[]	 =
		"%test_code         = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1            = OpFunctionParameter %v4f32\n"
		"%lbl               = OpLabel\n"
		"%v1                = OpVariable %fp_v4f32 Function\n"
		"%v2                = OpVariable %fp_a2f32 Function\n"
		"%v3                = OpVariable %fp_f32 Function\n"
		"%v                 = OpVariable %fp_stype Function\n"
		"%vv                = OpVariable %fp_stype Function\n"
		"%vvv               = OpVariable %fp_f32 Function\n"

		"                     OpStore %v1 %c_v4f32_1_1_1_1\n"
		"                     OpStore %v2 %c_a2f32_1\n"
		"                     OpStore %v3 %c_f32_1\n"

		"%p_v4f32          = OpAccessChain %fp_v4f32 %v %c_u32_0\n"
		"%p_a2f32          = OpAccessChain %fp_a2f32 %v %c_u32_1\n"
		"%p_f32            = OpAccessChain %fp_f32 %v %c_u32_2\n"
		"%v1_v             = OpLoad %v4f32 %v1 ${access_type}\n"
		"%v2_v             = OpLoad %a2f32 %v2 ${access_type}\n"
		"%v3_v             = OpLoad %f32 %v3 ${access_type}\n"

		"                    OpStore %p_v4f32 %v1_v ${access_type}\n"
		"                    OpStore %p_a2f32 %v2_v ${access_type}\n"
		"                    OpStore %p_f32 %v3_v ${access_type}\n"

		"                    OpCopyMemory %vv %v ${access_type}\n"
		"                    OpCopyMemory %vvv %p_f32 ${access_type}\n"

		"%p_f32_2          = OpAccessChain %fp_f32 %vv %c_u32_2\n"
		"%v_f32_2          = OpLoad %f32 %p_f32_2\n"
		"%v_f32_3          = OpLoad %f32 %vvv\n"

		"%ret1             = OpVectorTimesScalar %v4f32 %param1 %v_f32_2\n"
		"%ret2             = OpVectorTimesScalar %v4f32 %ret1 %v_f32_3\n"
		"                    OpReturnValue %ret2\n"
		"                    OpFunctionEnd\n";

	struct NameMemoryAccess
	{
		string name;
		string accessType;
	};


	NameMemoryAccess tests[] =
	{
		{ "none", "" },
		{ "volatile", "Volatile" },
		{ "aligned",  "Aligned 1" },
		{ "volatile_aligned",  "Volatile|Aligned 1" },
		{ "nontemporal_aligned",  "Nontemporal|Aligned 1" },
		{ "volatile_nontemporal",  "Volatile|Nontemporal" },
		{ "volatile_nontermporal_aligned",  "Volatile|Nontemporal|Aligned 1" },
	};

	getHalfColorsFullAlpha(colors);

	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameMemoryAccess); ++testNdx)
	{
		map<string, string> fragments;
		map<string, string> memoryAccess;
		memoryAccess["access_type"] = tests[testNdx].accessType;

		fragments["pre_main"] = constantsAndTypes;
		fragments["testfun"] = tcu::StringTemplate(function).specialize(memoryAccess);
		createTestsForAllStages(tests[testNdx].name, colors, colors, fragments, memoryAccessTests.get());
	}
	return memoryAccessTests.release();
}
tcu::TestCaseGroup* createOpUndefTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		opUndefTests		 (new tcu::TestCaseGroup(testCtx, "opundef", "Test OpUndef"));
	RGBA								defaultColors[4];
	map<string, string>					fragments;
	getDefaultColors(defaultColors);

	// First, simple cases that don't do anything with the OpUndef result.
	struct NameCodePair { string name, decl, type; };
	const NameCodePair tests[] =
	{
		{"bool", "", "%bool"},
		{"vec2uint32", "", "%v2u32"},
		{"image", "%type = OpTypeImage %f32 2D 0 0 0 1 Unknown", "%type"},
		{"sampler", "%type = OpTypeSampler", "%type"},
		{"sampledimage", "%img = OpTypeImage %f32 2D 0 0 0 1 Unknown\n" "%type = OpTypeSampledImage %img", "%type"},
		{"pointer", "", "%fp_i32"},
		{"runtimearray", "%type = OpTypeRuntimeArray %f32", "%type"},
		{"array", "%c_u32_100 = OpConstant %u32 100\n" "%type = OpTypeArray %i32 %c_u32_100", "%type"},
		{"struct", "%type = OpTypeStruct %f32 %i32 %u32", "%type"}};
	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameCodePair); ++testNdx)
	{
		fragments["undef_type"] = tests[testNdx].type;
		fragments["testfun"] = StringTemplate(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"%param1 = OpFunctionParameter %v4f32\n"
			"%label_testfun = OpLabel\n"
			"%undef = OpUndef ${undef_type}\n"
			"OpReturnValue %param1\n"
			"OpFunctionEnd\n").specialize(fragments);
		fragments["pre_main"] = tests[testNdx].decl;
		createTestsForAllStages(tests[testNdx].name, defaultColors, defaultColors, fragments, opUndefTests.get());
	}
	fragments.clear();

	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%undef = OpUndef %f32\n"
		"%zero = OpFMul %f32 %undef %c_f32_0\n"
		"%is_nan = OpIsNan %bool %zero\n" //OpUndef may result in NaN which may turn %zero into Nan.
		"%actually_zero = OpSelect %f32 %is_nan %c_f32_0 %zero\n"
		"%a = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%b = OpFAdd %f32 %a %actually_zero\n"
		"%ret = OpVectorInsertDynamic %v4f32 %param1 %b %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	createTestsForAllStages("float32", defaultColors, defaultColors, fragments, opUndefTests.get());

	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%undef = OpUndef %i32\n"
		"%zero = OpIMul %i32 %undef %c_i32_0\n"
		"%a = OpVectorExtractDynamic %f32 %param1 %zero\n"
		"%ret = OpVectorInsertDynamic %v4f32 %param1 %a %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	createTestsForAllStages("sint32", defaultColors, defaultColors, fragments, opUndefTests.get());

	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%undef = OpUndef %u32\n"
		"%zero = OpIMul %u32 %undef %c_i32_0\n"
		"%a = OpVectorExtractDynamic %f32 %param1 %zero\n"
		"%ret = OpVectorInsertDynamic %v4f32 %param1 %a %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	createTestsForAllStages("uint32", defaultColors, defaultColors, fragments, opUndefTests.get());

	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%undef = OpUndef %v4f32\n"
		"%vzero = OpVectorTimesScalar %v4f32 %undef %c_f32_0\n"
		"%zero_0 = OpVectorExtractDynamic %f32 %vzero %c_i32_0\n"
		"%zero_1 = OpVectorExtractDynamic %f32 %vzero %c_i32_1\n"
		"%zero_2 = OpVectorExtractDynamic %f32 %vzero %c_i32_2\n"
		"%zero_3 = OpVectorExtractDynamic %f32 %vzero %c_i32_3\n"
		"%is_nan_0 = OpIsNan %bool %zero_0\n"
		"%is_nan_1 = OpIsNan %bool %zero_1\n"
		"%is_nan_2 = OpIsNan %bool %zero_2\n"
		"%is_nan_3 = OpIsNan %bool %zero_3\n"
		"%actually_zero_0 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_0\n"
		"%actually_zero_1 = OpSelect %f32 %is_nan_1 %c_f32_0 %zero_1\n"
		"%actually_zero_2 = OpSelect %f32 %is_nan_2 %c_f32_0 %zero_2\n"
		"%actually_zero_3 = OpSelect %f32 %is_nan_3 %c_f32_0 %zero_3\n"
		"%param1_0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%param1_1 = OpVectorExtractDynamic %f32 %param1 %c_i32_1\n"
		"%param1_2 = OpVectorExtractDynamic %f32 %param1 %c_i32_2\n"
		"%param1_3 = OpVectorExtractDynamic %f32 %param1 %c_i32_3\n"
		"%sum_0 = OpFAdd %f32 %param1_0 %actually_zero_0\n"
		"%sum_1 = OpFAdd %f32 %param1_1 %actually_zero_1\n"
		"%sum_2 = OpFAdd %f32 %param1_2 %actually_zero_2\n"
		"%sum_3 = OpFAdd %f32 %param1_3 %actually_zero_3\n"
		"%ret3 = OpVectorInsertDynamic %v4f32 %param1 %sum_3 %c_i32_3\n"
		"%ret2 = OpVectorInsertDynamic %v4f32 %ret3 %sum_2 %c_i32_2\n"
		"%ret1 = OpVectorInsertDynamic %v4f32 %ret2 %sum_1 %c_i32_1\n"
		"%ret = OpVectorInsertDynamic %v4f32 %ret1 %sum_0 %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	createTestsForAllStages("vec4float32", defaultColors, defaultColors, fragments, opUndefTests.get());

	fragments["pre_main"] =
		"%m2x2f32 = OpTypeMatrix %v2f32 2\n";
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%undef = OpUndef %m2x2f32\n"
		"%mzero = OpMatrixTimesScalar %m2x2f32 %undef %c_f32_0\n"
		"%zero_0 = OpCompositeExtract %f32 %mzero 0 0\n"
		"%zero_1 = OpCompositeExtract %f32 %mzero 0 1\n"
		"%zero_2 = OpCompositeExtract %f32 %mzero 1 0\n"
		"%zero_3 = OpCompositeExtract %f32 %mzero 1 1\n"
		"%is_nan_0 = OpIsNan %bool %zero_0\n"
		"%is_nan_1 = OpIsNan %bool %zero_1\n"
		"%is_nan_2 = OpIsNan %bool %zero_2\n"
		"%is_nan_3 = OpIsNan %bool %zero_3\n"
		"%actually_zero_0 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_0\n"
		"%actually_zero_1 = OpSelect %f32 %is_nan_1 %c_f32_0 %zero_1\n"
		"%actually_zero_2 = OpSelect %f32 %is_nan_2 %c_f32_0 %zero_2\n"
		"%actually_zero_3 = OpSelect %f32 %is_nan_3 %c_f32_0 %zero_3\n"
		"%param1_0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%param1_1 = OpVectorExtractDynamic %f32 %param1 %c_i32_1\n"
		"%param1_2 = OpVectorExtractDynamic %f32 %param1 %c_i32_2\n"
		"%param1_3 = OpVectorExtractDynamic %f32 %param1 %c_i32_3\n"
		"%sum_0 = OpFAdd %f32 %param1_0 %actually_zero_0\n"
		"%sum_1 = OpFAdd %f32 %param1_1 %actually_zero_1\n"
		"%sum_2 = OpFAdd %f32 %param1_2 %actually_zero_2\n"
		"%sum_3 = OpFAdd %f32 %param1_3 %actually_zero_3\n"
		"%ret3 = OpVectorInsertDynamic %v4f32 %param1 %sum_3 %c_i32_3\n"
		"%ret2 = OpVectorInsertDynamic %v4f32 %ret3 %sum_2 %c_i32_2\n"
		"%ret1 = OpVectorInsertDynamic %v4f32 %ret2 %sum_1 %c_i32_1\n"
		"%ret = OpVectorInsertDynamic %v4f32 %ret1 %sum_0 %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	createTestsForAllStages("matrix", defaultColors, defaultColors, fragments, opUndefTests.get());

	return opUndefTests.release();
}

void createOpQuantizeSingleOptionTests(tcu::TestCaseGroup* testCtx)
{
	const RGBA		inputColors[4]		=
	{
		RGBA(0,		0,		0,		255),
		RGBA(0,		0,		255,	255),
		RGBA(0,		255,	0,		255),
		RGBA(0,		255,	255,	255)
	};

	const RGBA		expectedColors[4]	=
	{
		RGBA(255,	 0,		 0,		 255),
		RGBA(255,	 0,		 0,		 255),
		RGBA(255,	 0,		 0,		 255),
		RGBA(255,	 0,		 0,		 255)
	};

	const struct SingleFP16Possibility
	{
		const char* name;
		const char* constant;  // Value to assign to %test_constant.
		float		valueAsFloat;
		const char* condition; // Must assign to %cond an expression that evaluates to true after %c = OpQuantizeToF16(%test_constant + 0).
	}				tests[]				=
	{
		{
			"negative",
			"-0x1.3p1\n",
			-constructNormalizedFloat(1, 0x300000),
			"%cond = OpFOrdEqual %bool %c %test_constant\n"
		}, // -19
		{
			"positive",
			"0x1.0p7\n",
			constructNormalizedFloat(7, 0x000000),
			"%cond = OpFOrdEqual %bool %c %test_constant\n"
		},  // +128
		// SPIR-V requires that OpQuantizeToF16 flushes
		// any numbers that would end up denormalized in F16 to zero.
		{
			"denorm",
			"0x0.0006p-126\n",
			std::ldexp(1.5f, -140),
			"%cond = OpFOrdEqual %bool %c %c_f32_0\n"
		},  // denorm
		{
			"negative_denorm",
			"-0x0.0006p-126\n",
			-std::ldexp(1.5f, -140),
			"%cond = OpFOrdEqual %bool %c %c_f32_0\n"
		}, // -denorm
		{
			"too_small",
			"0x1.0p-16\n",
			std::ldexp(1.0f, -16),
			"%cond = OpFOrdEqual %bool %c %c_f32_0\n"
		},     // too small positive
		{
			"negative_too_small",
			"-0x1.0p-32\n",
			-std::ldexp(1.0f, -32),
			"%cond = OpFOrdEqual %bool %c %c_f32_0\n"
		},      // too small negative
		{
			"negative_inf",
			"-0x1.0p128\n",
			-std::ldexp(1.0f, 128),

			"%gz = OpFOrdLessThan %bool %c %c_f32_0\n"
			"%inf = OpIsInf %bool %c\n"
			"%cond = OpLogicalAnd %bool %gz %inf\n"
		},     // -inf to -inf
		{
			"inf",
			"0x1.0p128\n",
			std::ldexp(1.0f, 128),

			"%gz = OpFOrdGreaterThan %bool %c %c_f32_0\n"
			"%inf = OpIsInf %bool %c\n"
			"%cond = OpLogicalAnd %bool %gz %inf\n"
		},     // +inf to +inf
		{
			"round_to_negative_inf",
			"-0x1.0p32\n",
			-std::ldexp(1.0f, 32),

			"%gz = OpFOrdLessThan %bool %c %c_f32_0\n"
			"%inf = OpIsInf %bool %c\n"
			"%cond = OpLogicalAnd %bool %gz %inf\n"
		},     // round to -inf
		{
			"round_to_inf",
			"0x1.0p16\n",
			std::ldexp(1.0f, 16),

			"%gz = OpFOrdGreaterThan %bool %c %c_f32_0\n"
			"%inf = OpIsInf %bool %c\n"
			"%cond = OpLogicalAnd %bool %gz %inf\n"
		},     // round to +inf
		{
			"nan",
			"0x1.1p128\n",
			std::numeric_limits<float>::quiet_NaN(),

			// Test for any NaN value, as NaNs are not preserved
			"%direct_quant = OpQuantizeToF16 %f32 %test_constant\n"
			"%cond = OpIsNan %bool %direct_quant\n"
		}, // nan
		{
			"negative_nan",
			"-0x1.0001p128\n",
			std::numeric_limits<float>::quiet_NaN(),

			// Test for any NaN value, as NaNs are not preserved
			"%direct_quant = OpQuantizeToF16 %f32 %test_constant\n"
			"%cond = OpIsNan %bool %direct_quant\n"
		} // -nan
	};
	const char*		constants			=
		"%test_constant = OpConstant %f32 ";  // The value will be test.constant.

	StringTemplate	function			(
		"%test_code     = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1        = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%a             = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%b             = OpFAdd %f32 %test_constant %a\n"
		"%c             = OpQuantizeToF16 %f32 %b\n"
		"${condition}\n"
		"%v4cond        = OpCompositeConstruct %v4bool %cond %cond %cond %cond\n"
		"%retval        = OpSelect %v4f32 %v4cond %c_v4f32_1_0_0_1 %param1\n"
		"                 OpReturnValue %retval\n"
		"OpFunctionEnd\n"
	);

	const char*		specDecorations		= "OpDecorate %test_constant SpecId 0\n";
	const char*		specConstants		=
			"%test_constant = OpSpecConstant %f32 0.\n"
			"%c             = OpSpecConstantOp %f32 QuantizeToF16 %test_constant\n";

	StringTemplate	specConstantFunction(
		"%test_code     = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1        = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"${condition}\n"
		"%v4cond        = OpCompositeConstruct %v4bool %cond %cond %cond %cond\n"
		"%retval        = OpSelect %v4f32 %v4cond %c_v4f32_1_0_0_1 %param1\n"
		"                 OpReturnValue %retval\n"
		"OpFunctionEnd\n"
	);

	for (size_t idx = 0; idx < (sizeof(tests)/sizeof(tests[0])); ++idx)
	{
		map<string, string>								codeSpecialization;
		map<string, string>								fragments;
		codeSpecialization["condition"]					= tests[idx].condition;
		fragments["testfun"]							= function.specialize(codeSpecialization);
		fragments["pre_main"]							= string(constants) + tests[idx].constant + "\n";
		createTestsForAllStages(tests[idx].name, inputColors, expectedColors, fragments, testCtx);
	}

	for (size_t idx = 0; idx < (sizeof(tests)/sizeof(tests[0])); ++idx)
	{
		map<string, string>								codeSpecialization;
		map<string, string>								fragments;
		SpecConstants									passConstants;

		codeSpecialization["condition"]					= tests[idx].condition;
		fragments["testfun"]							= specConstantFunction.specialize(codeSpecialization);
		fragments["decoration"]							= specDecorations;
		fragments["pre_main"]							= specConstants;

		passConstants.append<float>(tests[idx].valueAsFloat);

		createTestsForAllStages(string("spec_const_") + tests[idx].name, inputColors, expectedColors, fragments, passConstants, testCtx);
	}
}

void createOpQuantizeTwoPossibilityTests(tcu::TestCaseGroup* testCtx)
{
	RGBA inputColors[4] =  {
		RGBA(0,		0,		0,		255),
		RGBA(0,		0,		255,	255),
		RGBA(0,		255,	0,		255),
		RGBA(0,		255,	255,	255)
	};

	RGBA expectedColors[4] =
	{
		RGBA(255,	 0,		 0,		 255),
		RGBA(255,	 0,		 0,		 255),
		RGBA(255,	 0,		 0,		 255),
		RGBA(255,	 0,		 0,		 255)
	};

	struct DualFP16Possibility
	{
		const char* name;
		const char* input;
		float		inputAsFloat;
		const char* possibleOutput1;
		const char* possibleOutput2;
	} tests[] = {
		{
			"positive_round_up_or_round_down",
			"0x1.3003p8",
			constructNormalizedFloat(8, 0x300300),
			"0x1.304p8",
			"0x1.3p8"
		},
		{
			"negative_round_up_or_round_down",
			"-0x1.6008p-7",
			-constructNormalizedFloat(-7, 0x600800),
			"-0x1.6p-7",
			"-0x1.604p-7"
		},
		{
			"carry_bit",
			"0x1.01ep2",
			constructNormalizedFloat(2, 0x01e000),
			"0x1.01cp2",
			"0x1.02p2"
		},
		{
			"carry_to_exponent",
			"0x1.ffep1",
			constructNormalizedFloat(1, 0xffe000),
			"0x1.ffcp1",
			"0x1.0p2"
		},
	};
	StringTemplate constants (
		"%input_const = OpConstant %f32 ${input}\n"
		"%possible_solution1 = OpConstant %f32 ${output1}\n"
		"%possible_solution2 = OpConstant %f32 ${output2}\n"
		);

	StringTemplate specConstants (
		"%input_const = OpSpecConstant %f32 0.\n"
		"%possible_solution1 = OpConstant %f32 ${output1}\n"
		"%possible_solution2 = OpConstant %f32 ${output2}\n"
	);

	const char* specDecorations = "OpDecorate %input_const  SpecId 0\n";

	const char* function  =
		"%test_code     = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1        = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%a             = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		// For the purposes of this test we assume that 0.f will always get
		// faithfully passed through the pipeline stages.
		"%b             = OpFAdd %f32 %input_const %a\n"
		"%c             = OpQuantizeToF16 %f32 %b\n"
		"%eq_1          = OpFOrdEqual %bool %c %possible_solution1\n"
		"%eq_2          = OpFOrdEqual %bool %c %possible_solution2\n"
		"%cond          = OpLogicalOr %bool %eq_1 %eq_2\n"
		"%v4cond        = OpCompositeConstruct %v4bool %cond %cond %cond %cond\n"
		"%retval        = OpSelect %v4f32 %v4cond %c_v4f32_1_0_0_1 %param1"
		"                 OpReturnValue %retval\n"
		"OpFunctionEnd\n";

	for(size_t idx = 0; idx < (sizeof(tests)/sizeof(tests[0])); ++idx) {
		map<string, string>									fragments;
		map<string, string>									constantSpecialization;

		constantSpecialization["input"]						= tests[idx].input;
		constantSpecialization["output1"]					= tests[idx].possibleOutput1;
		constantSpecialization["output2"]					= tests[idx].possibleOutput2;
		fragments["testfun"]								= function;
		fragments["pre_main"]								= constants.specialize(constantSpecialization);
		createTestsForAllStages(tests[idx].name, inputColors, expectedColors, fragments, testCtx);
	}

	for(size_t idx = 0; idx < (sizeof(tests)/sizeof(tests[0])); ++idx) {
		map<string, string>									fragments;
		map<string, string>									constantSpecialization;
		SpecConstants										passConstants;

		constantSpecialization["output1"]					= tests[idx].possibleOutput1;
		constantSpecialization["output2"]					= tests[idx].possibleOutput2;
		fragments["testfun"]								= function;
		fragments["decoration"]								= specDecorations;
		fragments["pre_main"]								= specConstants.specialize(constantSpecialization);

		passConstants.append<float>(tests[idx].inputAsFloat);

		createTestsForAllStages(string("spec_const_") + tests[idx].name, inputColors, expectedColors, fragments, passConstants, testCtx);
	}
}

tcu::TestCaseGroup* createOpQuantizeTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> opQuantizeTests (new tcu::TestCaseGroup(testCtx, "opquantize", "Test OpQuantizeToF16"));
	createOpQuantizeSingleOptionTests(opQuantizeTests.get());
	createOpQuantizeTwoPossibilityTests(opQuantizeTests.get());
	return opQuantizeTests.release();
}

struct ShaderPermutation
{
	deUint8 vertexPermutation;
	deUint8 geometryPermutation;
	deUint8 tesscPermutation;
	deUint8 tessePermutation;
	deUint8 fragmentPermutation;
};

ShaderPermutation getShaderPermutation(deUint8 inputValue)
{
	ShaderPermutation	permutation =
	{
		static_cast<deUint8>(inputValue & 0x10? 1u: 0u),
		static_cast<deUint8>(inputValue & 0x08? 1u: 0u),
		static_cast<deUint8>(inputValue & 0x04? 1u: 0u),
		static_cast<deUint8>(inputValue & 0x02? 1u: 0u),
		static_cast<deUint8>(inputValue & 0x01? 1u: 0u)
	};
	return permutation;
}

tcu::TestCaseGroup* createModuleTests(tcu::TestContext& testCtx)
{
	RGBA								defaultColors[4];
	RGBA								invertedColors[4];
	de::MovePtr<tcu::TestCaseGroup>		moduleTests			(new tcu::TestCaseGroup(testCtx, "module", "Multiple entry points into shaders"));

	getDefaultColors(defaultColors);
	getInvertedDefaultColors(invertedColors);

	// Combined module tests
	{
		// Shader stages: vertex and fragment
		{
			const ShaderElement combinedPipeline[]	=
			{
				ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
			};

			addFunctionCaseWithPrograms<InstanceContext>(
				moduleTests.get(), "same_module", "", createCombinedModule, runAndVerifyDefaultPipeline,
				createInstanceContext(combinedPipeline, map<string, string>()));
		}

		// Shader stages: vertex, geometry and fragment
		{
			const ShaderElement combinedPipeline[]	=
			{
				ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_GEOMETRY_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
			};

			addFunctionCaseWithPrograms<InstanceContext>(
				moduleTests.get(), "same_module_geom", "", createCombinedModule, runAndVerifyDefaultPipeline,
				createInstanceContext(combinedPipeline, map<string, string>()));
		}

		// Shader stages: vertex, tessellation control, tessellation evaluation and fragment
		{
			const ShaderElement combinedPipeline[]	=
			{
				ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
			};

			addFunctionCaseWithPrograms<InstanceContext>(
				moduleTests.get(), "same_module_tessc_tesse", "", createCombinedModule, runAndVerifyDefaultPipeline,
				createInstanceContext(combinedPipeline, map<string, string>()));
		}

		// Shader stages: vertex, tessellation control, tessellation evaluation, geometry and fragment
		{
			const ShaderElement combinedPipeline[]	=
			{
				ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_GEOMETRY_BIT),
				ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
			};

			addFunctionCaseWithPrograms<InstanceContext>(
				moduleTests.get(), "same_module_tessc_tesse_geom", "", createCombinedModule, runAndVerifyDefaultPipeline,
				createInstanceContext(combinedPipeline, map<string, string>()));
		}
	}

	const char* numbers[] =
	{
		"1", "2"
	};

	for (deInt8 idx = 0; idx < 32; ++idx)
	{
		ShaderPermutation			permutation		= getShaderPermutation(idx);
		string						name			= string("vert") + numbers[permutation.vertexPermutation] + "_geom" + numbers[permutation.geometryPermutation] + "_tessc" + numbers[permutation.tesscPermutation] + "_tesse" + numbers[permutation.tessePermutation] + "_frag" + numbers[permutation.fragmentPermutation];
		const ShaderElement			pipeline[]		=
		{
			ShaderElement("vert",	string("vert") +	numbers[permutation.vertexPermutation],		VK_SHADER_STAGE_VERTEX_BIT),
			ShaderElement("geom",	string("geom") +	numbers[permutation.geometryPermutation],	VK_SHADER_STAGE_GEOMETRY_BIT),
			ShaderElement("tessc",	string("tessc") +	numbers[permutation.tesscPermutation],		VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT),
			ShaderElement("tesse",	string("tesse") +	numbers[permutation.tessePermutation],		VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT),
			ShaderElement("frag",	string("frag") +	numbers[permutation.fragmentPermutation],	VK_SHADER_STAGE_FRAGMENT_BIT)
		};

		// If there are an even number of swaps, then it should be no-op.
		// If there are an odd number, the color should be flipped.
		if ((permutation.vertexPermutation + permutation.geometryPermutation + permutation.tesscPermutation + permutation.tessePermutation + permutation.fragmentPermutation) % 2 == 0)
		{
			addFunctionCaseWithPrograms<InstanceContext>(
					moduleTests.get(), name, "", createMultipleEntries, runAndVerifyDefaultPipeline,
					createInstanceContext(pipeline, defaultColors, defaultColors, map<string, string>()));
		}
		else
		{
			addFunctionCaseWithPrograms<InstanceContext>(
					moduleTests.get(), name, "", createMultipleEntries, runAndVerifyDefaultPipeline,
					createInstanceContext(pipeline, defaultColors, invertedColors, map<string, string>()));
		}
	}
	return moduleTests.release();
}

std::string getUnusedVarTestNamePiece(const std::string& prefix, ShaderTask task)
{
	switch (task)
	{
		case SHADER_TASK_NONE:			return "";
		case SHADER_TASK_NORMAL:		return prefix + "_normal";
		case SHADER_TASK_UNUSED_VAR:	return prefix + "_unused_var";
		case SHADER_TASK_UNUSED_FUNC:	return prefix + "_unused_func";
		default:						DE_ASSERT(DE_FALSE);
	}
	// unreachable
	return "";
}

std::string getShaderTaskIndexName(ShaderTaskIndex index)
{
	switch (index)
	{
	case SHADER_TASK_INDEX_VERTEX:			return "vertex";
	case SHADER_TASK_INDEX_GEOMETRY:		return "geom";
	case SHADER_TASK_INDEX_TESS_CONTROL:	return "tessc";
	case SHADER_TASK_INDEX_TESS_EVAL:		return "tesse";
	case SHADER_TASK_INDEX_FRAGMENT:		return "frag";
	default:								DE_ASSERT(DE_FALSE);
	}
	// unreachable
	return "";
}

std::string getUnusedVarTestName(const ShaderTaskArray& shaderTasks, const VariableLocation& location)
{
	std::string testName = location.toString();

	for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(shaderTasks); ++i)
	{
		if (shaderTasks[i] != SHADER_TASK_NONE)
		{
			testName += "_" + getUnusedVarTestNamePiece(getShaderTaskIndexName((ShaderTaskIndex)i), shaderTasks[i]);
		}
	}

	return testName;
}

tcu::TestCaseGroup* createUnusedVariableTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		moduleTests				(new tcu::TestCaseGroup(testCtx, "unused_variables", "Graphics shaders with unused variables"));

	ShaderTaskArray						shaderCombinations[]	=
	{
		// Vertex					Geometry					Tess. Control				Tess. Evaluation			Fragment
		{ SHADER_TASK_UNUSED_VAR,	SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NORMAL	},
		{ SHADER_TASK_UNUSED_FUNC,	SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NORMAL	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_UNUSED_VAR	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_UNUSED_FUNC	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_UNUSED_VAR,		SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NORMAL	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_UNUSED_FUNC,	SHADER_TASK_NONE,			SHADER_TASK_NONE,			SHADER_TASK_NORMAL	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_NONE,			SHADER_TASK_UNUSED_VAR,		SHADER_TASK_NORMAL,			SHADER_TASK_NORMAL	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_NONE,			SHADER_TASK_UNUSED_FUNC,	SHADER_TASK_NORMAL,			SHADER_TASK_NORMAL	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_NONE,			SHADER_TASK_NORMAL,			SHADER_TASK_UNUSED_VAR,		SHADER_TASK_NORMAL	},
		{ SHADER_TASK_NORMAL,		SHADER_TASK_NONE,			SHADER_TASK_NORMAL,			SHADER_TASK_UNUSED_FUNC,	SHADER_TASK_NORMAL	}
	};

	const VariableLocation				testLocations[] =
	{
		// Set		Binding
		{ 0,		5			},
		{ 5,		5			},
	};

	for (size_t combNdx = 0; combNdx < DE_LENGTH_OF_ARRAY(shaderCombinations); ++combNdx)
	{
		for (size_t locationNdx = 0; locationNdx < DE_LENGTH_OF_ARRAY(testLocations); ++locationNdx)
		{
			const ShaderTaskArray&	shaderTasks		= shaderCombinations[combNdx];
			const VariableLocation&	location		= testLocations[locationNdx];
			std::string				testName		= getUnusedVarTestName(shaderTasks, location);

			addFunctionCaseWithPrograms<UnusedVariableContext>(
				moduleTests.get(), testName, "", createUnusedVariableModules, runAndVerifyUnusedVariablePipeline,
				createUnusedVariableContext(shaderTasks, location));
		}
	}

	return moduleTests.release();
}

tcu::TestCaseGroup* createLoopTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "loop", "Looping control flow"));
	RGBA defaultColors[4];
	getDefaultColors(defaultColors);
	map<string, string> fragments;
	fragments["pre_main"] =
		"%c_f32_5 = OpConstant %f32 5.\n";

	// A loop with a single block. The Continue Target is the loop block
	// itself. In SPIR-V terms, the "loop construct" contains no blocks at all
	// -- the "continue construct" forms the entire loop.
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %loop\n"

		";adds and subtracts 1.0 to %val in alternate iterations\n"
		"%loop = OpLabel\n"
		"%count = OpPhi %i32 %c_i32_4 %entry %count__ %loop\n"
		"%delta = OpPhi %f32 %c_f32_1 %entry %minus_delta %loop\n"
		"%val1 = OpPhi %f32 %val0 %entry %val %loop\n"
		"%val = OpFAdd %f32 %val1 %delta\n"
		"%minus_delta = OpFSub %f32 %c_f32_0 %delta\n"
		"%count__ = OpISub %i32 %count %c_i32_1\n"
		"%again = OpSGreaterThan %bool %count__ %c_i32_0\n"
		"OpLoopMerge %exit %loop None\n"
		"OpBranchConditional %again %loop %exit\n"

		"%exit = OpLabel\n"
		"%result = OpVectorInsertDynamic %v4f32 %param1 %val %c_i32_0\n"
		"OpReturnValue %result\n"

		"OpFunctionEnd\n";

	createTestsForAllStages("single_block", defaultColors, defaultColors, fragments, testGroup.get());

	// Body comprised of multiple basic blocks.
	const StringTemplate multiBlock(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %loop\n"

		";adds and subtracts 1.0 to %val in alternate iterations\n"
		"%loop = OpLabel\n"
		"%count = OpPhi %i32 %c_i32_4 %entry %count__ %cont\n"
		"%delta = OpPhi %f32 %c_f32_1 %entry %delta_next %cont\n"
		"%val1 = OpPhi %f32 %val0 %entry %val %cont\n"
		// There are several possibilities for the Continue Target below.  Each
		// will be specialized into a separate test case.
		"OpLoopMerge %exit ${continue_target} None\n"
		"OpBranch %if\n"

		"%if = OpLabel\n"
		";delta_next = (delta > 0) ? -1 : 1;\n"
		"%gt0 = OpFOrdGreaterThan %bool %delta %c_f32_0\n"
		"OpSelectionMerge %gather DontFlatten\n"
		"OpBranchConditional %gt0 %even %odd ;tells us if %count is even or odd\n"

		"%odd = OpLabel\n"
		"OpBranch %gather\n"

		"%even = OpLabel\n"
		"OpBranch %gather\n"

		"%gather = OpLabel\n"
		"%delta_next = OpPhi %f32 %c_f32_n1 %even %c_f32_1 %odd\n"
		"%val = OpFAdd %f32 %val1 %delta\n"
		"%count__ = OpISub %i32 %count %c_i32_1\n"
		"OpBranch %cont\n"

		"%cont = OpLabel\n"
		"%again = OpSGreaterThan %bool %count__ %c_i32_0\n"
		"OpBranchConditional %again %loop %exit\n"

		"%exit = OpLabel\n"
		"%result = OpVectorInsertDynamic %v4f32 %param1 %val %c_i32_0\n"
		"OpReturnValue %result\n"

		"OpFunctionEnd\n");

	map<string, string> continue_target;

	// The Continue Target is the loop block itself.
	continue_target["continue_target"] = "%loop";
	fragments["testfun"] = multiBlock.specialize(continue_target);
	createTestsForAllStages("multi_block_continue_construct", defaultColors, defaultColors, fragments, testGroup.get());

	// The Continue Target is at the end of the loop.
	continue_target["continue_target"] = "%cont";
	fragments["testfun"] = multiBlock.specialize(continue_target);
	createTestsForAllStages("multi_block_loop_construct", defaultColors, defaultColors, fragments, testGroup.get());

	// A loop with continue statement.
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %loop\n"

		";adds 4, 3, and 1 to %val0 (skips 2)\n"
		"%loop = OpLabel\n"
		"%count = OpPhi %i32 %c_i32_4 %entry %count__ %continue\n"
		"%val1 = OpPhi %f32 %val0 %entry %val %continue\n"
		"OpLoopMerge %exit %continue None\n"
		"OpBranch %if\n"

		"%if = OpLabel\n"
		";skip if %count==2\n"
		"%eq2 = OpIEqual %bool %count %c_i32_2\n"
		"OpBranchConditional %eq2 %continue %body\n"

		"%body = OpLabel\n"
		"%fcount = OpConvertSToF %f32 %count\n"
		"%val2 = OpFAdd %f32 %val1 %fcount\n"
		"OpBranch %continue\n"

		"%continue = OpLabel\n"
		"%val = OpPhi %f32 %val2 %body %val1 %if\n"
		"%count__ = OpISub %i32 %count %c_i32_1\n"
		"%again = OpSGreaterThan %bool %count__ %c_i32_0\n"
		"OpBranchConditional %again %loop %exit\n"

		"%exit = OpLabel\n"
		"%same = OpFSub %f32 %val %c_f32_8\n"
		"%result = OpVectorInsertDynamic %v4f32 %param1 %same %c_i32_0\n"
		"OpReturnValue %result\n"
		"OpFunctionEnd\n";
	createTestsForAllStages("continue", defaultColors, defaultColors, fragments, testGroup.get());

	// A loop with break.
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		";param1 components are between 0 and 1, so dot product is 4 or less\n"
		"%dot = OpDot %f32 %param1 %param1\n"
		"%div = OpFDiv %f32 %dot %c_f32_5\n"
		"%zero = OpConvertFToU %u32 %div\n"
		"%two = OpIAdd %i32 %zero %c_i32_2\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %loop\n"

		";adds 4 and 3 to %val0 (exits early)\n"
		"%loop = OpLabel\n"
		"%count = OpPhi %i32 %c_i32_4 %entry %count__ %continue\n"
		"%val1 = OpPhi %f32 %val0 %entry %val2 %continue\n"
		"OpLoopMerge %exit %continue None\n"
		"OpBranch %if\n"

		"%if = OpLabel\n"
		";end loop if %count==%two\n"
		"%above2 = OpSGreaterThan %bool %count %two\n"
		"OpBranchConditional %above2 %body %exit\n"

		"%body = OpLabel\n"
		"%fcount = OpConvertSToF %f32 %count\n"
		"%val2 = OpFAdd %f32 %val1 %fcount\n"
		"OpBranch %continue\n"

		"%continue = OpLabel\n"
		"%count__ = OpISub %i32 %count %c_i32_1\n"
		"%again = OpSGreaterThan %bool %count__ %c_i32_0\n"
		"OpBranchConditional %again %loop %exit\n"

		"%exit = OpLabel\n"
		"%val_post = OpPhi %f32 %val2 %continue %val1 %if\n"
		"%same = OpFSub %f32 %val_post %c_f32_7\n"
		"%result = OpVectorInsertDynamic %v4f32 %param1 %same %c_i32_0\n"
		"OpReturnValue %result\n"
		"OpFunctionEnd\n";
	createTestsForAllStages("break", defaultColors, defaultColors, fragments, testGroup.get());

	// A loop with return.
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		";param1 components are between 0 and 1, so dot product is 4 or less\n"
		"%dot = OpDot %f32 %param1 %param1\n"
		"%div = OpFDiv %f32 %dot %c_f32_5\n"
		"%zero = OpConvertFToU %u32 %div\n"
		"%two = OpIAdd %i32 %zero %c_i32_2\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %loop\n"

		";returns early without modifying %param1\n"
		"%loop = OpLabel\n"
		"%count = OpPhi %i32 %c_i32_4 %entry %count__ %continue\n"
		"%val1 = OpPhi %f32 %val0 %entry %val2 %continue\n"
		"OpLoopMerge %exit %continue None\n"
		"OpBranch %if\n"

		"%if = OpLabel\n"
		";return if %count==%two\n"
		"%above2 = OpSGreaterThan %bool %count %two\n"
		"OpSelectionMerge %body DontFlatten\n"
		"OpBranchConditional %above2 %body %early_exit\n"

		"%early_exit = OpLabel\n"
		"OpReturnValue %param1\n"

		"%body = OpLabel\n"
		"%fcount = OpConvertSToF %f32 %count\n"
		"%val2 = OpFAdd %f32 %val1 %fcount\n"
		"OpBranch %continue\n"

		"%continue = OpLabel\n"
		"%count__ = OpISub %i32 %count %c_i32_1\n"
		"%again = OpSGreaterThan %bool %count__ %c_i32_0\n"
		"OpBranchConditional %again %loop %exit\n"

		"%exit = OpLabel\n"
		";should never get here, so return an incorrect result\n"
		"%result = OpVectorInsertDynamic %v4f32 %param1 %val2 %c_i32_0\n"
		"OpReturnValue %result\n"
		"OpFunctionEnd\n";
	createTestsForAllStages("return", defaultColors, defaultColors, fragments, testGroup.get());

	// Continue inside a switch block to break to enclosing loop's merge block.
	// Matches roughly the following GLSL code:
	// for (; keep_going; keep_going = false)
	// {
	//     switch (int(param1.x))
	//     {
	//         case 0: continue;
	//         case 1: continue;
	//         default: continue;
	//     }
	//     dead code: modify return value to invalid result.
	// }
	fragments["pre_main"] =
		"%fp_bool = OpTypePointer Function %bool\n"
		"%true = OpConstantTrue %bool\n"
		"%false = OpConstantFalse %bool\n";

	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		"%keep_going = OpVariable %fp_bool Function\n"
		"%val_ptr = OpVariable %fp_f32 Function\n"
		"%param1_x = OpCompositeExtract %f32 %param1 0\n"
		"OpStore %keep_going %true\n"
		"OpBranch %forloop_begin\n"

		"%forloop_begin = OpLabel\n"
		"OpLoopMerge %forloop_merge %forloop_continue None\n"
		"OpBranch %forloop\n"

		"%forloop = OpLabel\n"
		"%for_condition = OpLoad %bool %keep_going\n"
		"OpBranchConditional %for_condition %forloop_body %forloop_merge\n"

		"%forloop_body = OpLabel\n"
		"OpStore %val_ptr %param1_x\n"
		"%param1_x_int = OpConvertFToS %i32 %param1_x\n"

		"OpSelectionMerge %switch_merge None\n"
		"OpSwitch %param1_x_int %default 0 %case_0 1 %case_1\n"
		"%case_0 = OpLabel\n"
		"OpBranch %forloop_continue\n"
		"%case_1 = OpLabel\n"
		"OpBranch %forloop_continue\n"
		"%default = OpLabel\n"
		"OpBranch %forloop_continue\n"
		"%switch_merge = OpLabel\n"
		";should never get here, so change the return value to invalid result\n"
		"OpStore %val_ptr %c_f32_1\n"
		"OpBranch %forloop_continue\n"

		"%forloop_continue = OpLabel\n"
		"OpStore %keep_going %false\n"
		"OpBranch %forloop_begin\n"
		"%forloop_merge = OpLabel\n"

		"%val = OpLoad %f32 %val_ptr\n"
		"%result = OpVectorInsertDynamic %v4f32 %param1 %val %c_i32_0\n"
		"OpReturnValue %result\n"
		"OpFunctionEnd\n";
	createTestsForAllStages("switch_continue", defaultColors, defaultColors, fragments, testGroup.get());

	return testGroup.release();
}

// A collection of tests putting OpControlBarrier in places GLSL forbids but SPIR-V allows.
tcu::TestCaseGroup* createBarrierTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "barrier", "OpControlBarrier"));
	map<string, string> fragments;

	// A barrier inside a function body.
	fragments["pre_main"] =
		"%Workgroup = OpConstant %i32 2\n"
		"%WorkgroupAcquireRelease = OpConstant %i32 0x108\n";
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"OpReturnValue %param1\n"
		"OpFunctionEnd\n";
	addTessCtrlTest(testGroup.get(), "in_function", fragments);

	// Common setup code for the following tests.
	fragments["pre_main"] =
		"%Workgroup = OpConstant %i32 2\n"
		"%WorkgroupAcquireRelease = OpConstant %i32 0x108\n"
		"%c_f32_5 = OpConstant %f32 5.\n";
	const string setupPercentZero =	 // Begins %test_code function with code that sets %zero to 0u but cannot be optimized away.
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%entry = OpLabel\n"
		";param1 components are between 0 and 1, so dot product is 4 or less\n"
		"%dot = OpDot %f32 %param1 %param1\n"
		"%div = OpFDiv %f32 %dot %c_f32_5\n"
		"%zero = OpConvertFToU %u32 %div\n";

	// Barriers inside OpSwitch branches.
	fragments["testfun"] =
		setupPercentZero +
		"OpSelectionMerge %switch_exit None\n"
		"OpSwitch %zero %switch_default 0 %case0 1 %case1 ;should always go to %case0\n"

		"%case1 = OpLabel\n"
		";This barrier should never be executed, but its presence makes test failure more likely when there's a bug.\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"%wrong_branch_alert1 = OpVectorInsertDynamic %v4f32 %param1 %c_f32_0_5 %c_i32_0\n"
		"OpBranch %switch_exit\n"

		"%switch_default = OpLabel\n"
		"%wrong_branch_alert2 = OpVectorInsertDynamic %v4f32 %param1 %c_f32_0_5 %c_i32_0\n"
		";This barrier should never be executed, but its presence makes test failure more likely when there's a bug.\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"OpBranch %switch_exit\n"

		"%case0 = OpLabel\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"OpBranch %switch_exit\n"

		"%switch_exit = OpLabel\n"
		"%ret = OpPhi %v4f32 %param1 %case0 %wrong_branch_alert1 %case1 %wrong_branch_alert2 %switch_default\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";
	addTessCtrlTest(testGroup.get(), "in_switch", fragments);

	// Barriers inside if-then-else.
	fragments["testfun"] =
		setupPercentZero +
		"%eq0 = OpIEqual %bool %zero %c_u32_0\n"
		"OpSelectionMerge %exit DontFlatten\n"
		"OpBranchConditional %eq0 %then %else\n"

		"%else = OpLabel\n"
		";This barrier should never be executed, but its presence makes test failure more likely when there's a bug.\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"%wrong_branch_alert = OpVectorInsertDynamic %v4f32 %param1 %c_f32_0_5 %c_i32_0\n"
		"OpBranch %exit\n"

		"%then = OpLabel\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"OpBranch %exit\n"
		"%exit = OpLabel\n"
		"%ret = OpPhi %v4f32 %param1 %then %wrong_branch_alert %else\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";
	addTessCtrlTest(testGroup.get(), "in_if", fragments);

	// A barrier after control-flow reconvergence, tempting the compiler to attempt something like this:
	// http://lists.llvm.org/pipermail/llvm-dev/2009-October/026317.html.
	fragments["testfun"] =
		setupPercentZero +
		"%thread_id = OpLoad %i32 %BP_gl_InvocationID\n"
		"%thread0 = OpIEqual %bool %thread_id %c_i32_0\n"
		"OpSelectionMerge %exit DontFlatten\n"
		"OpBranchConditional %thread0 %then %else\n"

		"%else = OpLabel\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %exit\n"

		"%then = OpLabel\n"
		"%val1 = OpVectorExtractDynamic %f32 %param1 %zero\n"
		"OpBranch %exit\n"

		"%exit = OpLabel\n"
		"%val = OpPhi %f32 %val0 %else %val1 %then\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"%ret = OpVectorInsertDynamic %v4f32 %param1 %val %zero\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";
	addTessCtrlTest(testGroup.get(), "after_divergent_if", fragments);

	// A barrier inside a loop.
	fragments["pre_main"] =
		"%Workgroup = OpConstant %i32 2\n"
		"%WorkgroupAcquireRelease = OpConstant %i32 0x108\n"
		"%c_f32_10 = OpConstant %f32 10.\n";
	fragments["testfun"] =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%entry = OpLabel\n"
		"%val0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"OpBranch %loop\n"

		";adds 4, 3, 2, and 1 to %val0\n"
		"%loop = OpLabel\n"
		"%count = OpPhi %i32 %c_i32_4 %entry %count__ %loop\n"
		"%val1 = OpPhi %f32 %val0 %entry %val %loop\n"
		"OpControlBarrier %Workgroup %Workgroup %WorkgroupAcquireRelease\n"
		"%fcount = OpConvertSToF %f32 %count\n"
		"%val = OpFAdd %f32 %val1 %fcount\n"
		"%count__ = OpISub %i32 %count %c_i32_1\n"
		"%again = OpSGreaterThan %bool %count__ %c_i32_0\n"
		"OpLoopMerge %exit %loop None\n"
		"OpBranchConditional %again %loop %exit\n"

		"%exit = OpLabel\n"
		"%same = OpFSub %f32 %val %c_f32_10\n"
		"%ret = OpVectorInsertDynamic %v4f32 %param1 %same %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";
	addTessCtrlTest(testGroup.get(), "in_loop", fragments);

	return testGroup.release();
}

// Test for the OpFRem instruction.
tcu::TestCaseGroup* createFRemTests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup(new tcu::TestCaseGroup(testCtx, "frem", "OpFRem"));
	map<string, string>					fragments;
	RGBA								inputColors[4];
	RGBA								outputColors[4];

	fragments["pre_main"]				 =
		"%c_f32_3 = OpConstant %f32 3.0\n"
		"%c_f32_n3 = OpConstant %f32 -3.0\n"
		"%c_f32_4 = OpConstant %f32 4.0\n"
		"%c_f32_p75 = OpConstant %f32 0.75\n"
		"%c_v4f32_p75_p75_p75_p75 = OpConstantComposite %v4f32 %c_f32_p75 %c_f32_p75 %c_f32_p75 %c_f32_p75 \n"
		"%c_v4f32_4_4_4_4 = OpConstantComposite %v4f32 %c_f32_4 %c_f32_4 %c_f32_4 %c_f32_4\n"
		"%c_v4f32_3_n3_3_n3 = OpConstantComposite %v4f32 %c_f32_3 %c_f32_n3 %c_f32_3 %c_f32_n3\n";

	// The test does the following.
	// vec4 result = (param1 * 8.0) - 4.0;
	// return (frem(result.x,3) + 0.75, frem(result.y, -3) + 0.75, 0, 1)
	fragments["testfun"]				 =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%v_times_8 = OpVectorTimesScalar %v4f32 %param1 %c_f32_8\n"
		"%minus_4 = OpFSub %v4f32 %v_times_8 %c_v4f32_4_4_4_4\n"
		"%frem = OpFRem %v4f32 %minus_4 %c_v4f32_3_n3_3_n3\n"
		"%added = OpFAdd %v4f32 %frem %c_v4f32_p75_p75_p75_p75\n"
		"%xyz_1 = OpVectorInsertDynamic %v4f32 %added %c_f32_1 %c_i32_3\n"
		"%xy_0_1 = OpVectorInsertDynamic %v4f32 %xyz_1 %c_f32_0 %c_i32_2\n"
		"OpReturnValue %xy_0_1\n"
		"OpFunctionEnd\n";


	inputColors[0]		= RGBA(16,	16,		0, 255);
	inputColors[1]		= RGBA(232, 232,	0, 255);
	inputColors[2]		= RGBA(232, 16,		0, 255);
	inputColors[3]		= RGBA(16,	232,	0, 255);

	outputColors[0]		= RGBA(64,	64,		0, 255);
	outputColors[1]		= RGBA(255, 255,	0, 255);
	outputColors[2]		= RGBA(255, 64,		0, 255);
	outputColors[3]		= RGBA(64,	255,	0, 255);

	createTestsForAllStages("frem", inputColors, outputColors, fragments, testGroup.get());
	return testGroup.release();
}

// Test for the OpSRem instruction.
tcu::TestCaseGroup* createOpSRemGraphicsTests(tcu::TestContext& testCtx, qpTestResult negFailResult)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup(new tcu::TestCaseGroup(testCtx, "srem", "OpSRem"));
	map<string, string>					fragments;

	fragments["pre_main"]				 =
		"%c_f32_255 = OpConstant %f32 255.0\n"
		"%c_i32_128 = OpConstant %i32 128\n"
		"%c_i32_255 = OpConstant %i32 255\n"
		"%c_v4f32_255 = OpConstantComposite %v4f32 %c_f32_255 %c_f32_255 %c_f32_255 %c_f32_255 \n"
		"%c_v4f32_0_5 = OpConstantComposite %v4f32 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 \n"
		"%c_v4i32_128 = OpConstantComposite %v4i32 %c_i32_128 %c_i32_128 %c_i32_128 %c_i32_128 \n";

	// The test does the following.
	// ivec4 ints = int(param1 * 255.0 + 0.5) - 128;
	// ivec4 result = ivec4(srem(ints.x, ints.y), srem(ints.y, ints.z), srem(ints.z, ints.x), 255);
	// return float(result + 128) / 255.0;
	fragments["testfun"]				 =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%div255 = OpFMul %v4f32 %param1 %c_v4f32_255\n"
		"%add0_5 = OpFAdd %v4f32 %div255 %c_v4f32_0_5\n"
		"%uints_in = OpConvertFToS %v4i32 %add0_5\n"
		"%ints_in = OpISub %v4i32 %uints_in %c_v4i32_128\n"
		"%x_in = OpCompositeExtract %i32 %ints_in 0\n"
		"%y_in = OpCompositeExtract %i32 %ints_in 1\n"
		"%z_in = OpCompositeExtract %i32 %ints_in 2\n"
		"%x_out = OpSRem %i32 %x_in %y_in\n"
		"%y_out = OpSRem %i32 %y_in %z_in\n"
		"%z_out = OpSRem %i32 %z_in %x_in\n"
		"%ints_out = OpCompositeConstruct %v4i32 %x_out %y_out %z_out %c_i32_255\n"
		"%ints_offset = OpIAdd %v4i32 %ints_out %c_v4i32_128\n"
		"%f_ints_offset = OpConvertSToF %v4f32 %ints_offset\n"
		"%float_out = OpFDiv %v4f32 %f_ints_offset %c_v4f32_255\n"
		"OpReturnValue %float_out\n"
		"OpFunctionEnd\n";

	const struct CaseParams
	{
		const char*		name;
		const char*		failMessageTemplate;	// customized status message
		qpTestResult	failResult;				// override status on failure
		int				operands[4][3];			// four (x, y, z) vectors of operands
		int				results[4][3];			// four (x, y, z) vectors of results
	} cases[] =
	{
		{
			"positive",
			"${reason}",
			QP_TEST_RESULT_FAIL,
			{ { 5, 12, 17 }, { 5, 5, 7 }, { 75, 8, 81 }, { 25, 60, 100 } },			// operands
			{ { 5, 12,  2 }, { 0, 5, 2 }, {  3, 8,  6 }, { 25, 60,   0 } },			// results
		},
		{
			"all",
			"Inconsistent results, but within specification: ${reason}",
			negFailResult,															// negative operands, not required by the spec
			{ { 5, 12, -17 }, { -5, -5, 7 }, { 75, 8, -81 }, { 25, -60, 100 } },	// operands
			{ { 5, 12,  -2 }, {  0, -5, 2 }, {  3, 8,  -6 }, { 25, -60,   0 } },	// results
		},
	};
	// If either operand is negative the result is undefined. Some implementations may still return correct values.

	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
	{
		const CaseParams&	params			= cases[caseNdx];
		RGBA				inputColors[4];
		RGBA				outputColors[4];

		for (int i = 0; i < 4; ++i)
		{
			inputColors [i] = RGBA(params.operands[i][0] + 128, params.operands[i][1] + 128, params.operands[i][2] + 128, 255);
			outputColors[i] = RGBA(params.results [i][0] + 128, params.results [i][1] + 128, params.results [i][2] + 128, 255);
		}

		createTestsForAllStages(params.name, inputColors, outputColors, fragments, testGroup.get(), params.failResult, params.failMessageTemplate);
	}

	return testGroup.release();
}

// Test for the OpSMod instruction.
tcu::TestCaseGroup* createOpSModGraphicsTests(tcu::TestContext& testCtx, qpTestResult negFailResult)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup(new tcu::TestCaseGroup(testCtx, "smod", "OpSMod"));
	map<string, string>					fragments;

	fragments["pre_main"]				 =
		"%c_f32_255 = OpConstant %f32 255.0\n"
		"%c_i32_128 = OpConstant %i32 128\n"
		"%c_i32_255 = OpConstant %i32 255\n"
		"%c_v4f32_255 = OpConstantComposite %v4f32 %c_f32_255 %c_f32_255 %c_f32_255 %c_f32_255 \n"
		"%c_v4f32_0_5 = OpConstantComposite %v4f32 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 \n"
		"%c_v4i32_128 = OpConstantComposite %v4i32 %c_i32_128 %c_i32_128 %c_i32_128 %c_i32_128 \n";

	// The test does the following.
	// ivec4 ints = int(param1 * 255.0 + 0.5) - 128;
	// ivec4 result = ivec4(smod(ints.x, ints.y), smod(ints.y, ints.z), smod(ints.z, ints.x), 255);
	// return float(result + 128) / 255.0;
	fragments["testfun"]				 =
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"%div255 = OpFMul %v4f32 %param1 %c_v4f32_255\n"
		"%add0_5 = OpFAdd %v4f32 %div255 %c_v4f32_0_5\n"
		"%uints_in = OpConvertFToS %v4i32 %add0_5\n"
		"%ints_in = OpISub %v4i32 %uints_in %c_v4i32_128\n"
		"%x_in = OpCompositeExtract %i32 %ints_in 0\n"
		"%y_in = OpCompositeExtract %i32 %ints_in 1\n"
		"%z_in = OpCompositeExtract %i32 %ints_in 2\n"
		"%x_out = OpSMod %i32 %x_in %y_in\n"
		"%y_out = OpSMod %i32 %y_in %z_in\n"
		"%z_out = OpSMod %i32 %z_in %x_in\n"
		"%ints_out = OpCompositeConstruct %v4i32 %x_out %y_out %z_out %c_i32_255\n"
		"%ints_offset = OpIAdd %v4i32 %ints_out %c_v4i32_128\n"
		"%f_ints_offset = OpConvertSToF %v4f32 %ints_offset\n"
		"%float_out = OpFDiv %v4f32 %f_ints_offset %c_v4f32_255\n"
		"OpReturnValue %float_out\n"
		"OpFunctionEnd\n";

	const struct CaseParams
	{
		const char*		name;
		const char*		failMessageTemplate;	// customized status message
		qpTestResult	failResult;				// override status on failure
		int				operands[4][3];			// four (x, y, z) vectors of operands
		int				results[4][3];			// four (x, y, z) vectors of results
	} cases[] =
	{
		{
			"positive",
			"${reason}",
			QP_TEST_RESULT_FAIL,
			{ { 5, 12, 17 }, { 5, 5, 7 }, { 75, 8, 81 }, { 25, 60, 100 } },				// operands
			{ { 5, 12,  2 }, { 0, 5, 2 }, {  3, 8,  6 }, { 25, 60,   0 } },				// results
		},
		{
			"all",
			"Inconsistent results, but within specification: ${reason}",
			negFailResult,																// negative operands, not required by the spec
			{ { 5, 12, -17 }, { -5, -5,  7 }, { 75,   8, -81 }, {  25, -60, 100 } },	// operands
			{ { 5, -5,   3 }, {  0,  2, -3 }, {  3, -73,  69 }, { -35,  40,   0 } },	// results
		},
	};
	// If either operand is negative the result is undefined. Some implementations may still return correct values.

	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
	{
		const CaseParams&	params			= cases[caseNdx];
		RGBA				inputColors[4];
		RGBA				outputColors[4];

		for (int i = 0; i < 4; ++i)
		{
			inputColors [i] = RGBA(params.operands[i][0] + 128, params.operands[i][1] + 128, params.operands[i][2] + 128, 255);
			outputColors[i] = RGBA(params.results [i][0] + 128, params.results [i][1] + 128, params.results [i][2] + 128, 255);
		}

		createTestsForAllStages(params.name, inputColors, outputColors, fragments, testGroup.get(), params.failResult, params.failMessageTemplate);
	}
	return testGroup.release();
}

enum ConversionDataType
{
	DATA_TYPE_SIGNED_8,
	DATA_TYPE_SIGNED_16,
	DATA_TYPE_SIGNED_32,
	DATA_TYPE_SIGNED_64,
	DATA_TYPE_UNSIGNED_8,
	DATA_TYPE_UNSIGNED_16,
	DATA_TYPE_UNSIGNED_32,
	DATA_TYPE_UNSIGNED_64,
	DATA_TYPE_FLOAT_16,
	DATA_TYPE_FLOAT_32,
	DATA_TYPE_FLOAT_64,
	DATA_TYPE_VEC2_SIGNED_16,
	DATA_TYPE_VEC2_SIGNED_32
};

const string getBitWidthStr (ConversionDataType type)
{
	switch (type)
	{
		case DATA_TYPE_SIGNED_8:
		case DATA_TYPE_UNSIGNED_8:
			return "8";

		case DATA_TYPE_SIGNED_16:
		case DATA_TYPE_UNSIGNED_16:
		case DATA_TYPE_FLOAT_16:
			return "16";

		case DATA_TYPE_SIGNED_32:
		case DATA_TYPE_UNSIGNED_32:
		case DATA_TYPE_FLOAT_32:
		case DATA_TYPE_VEC2_SIGNED_16:
			return "32";

		case DATA_TYPE_SIGNED_64:
		case DATA_TYPE_UNSIGNED_64:
		case DATA_TYPE_FLOAT_64:
		case DATA_TYPE_VEC2_SIGNED_32:
			return "64";

		default:
			DE_ASSERT(false);
	}
	return "";
}

const string getByteWidthStr (ConversionDataType type)
{
	switch (type)
	{
		case DATA_TYPE_SIGNED_8:
		case DATA_TYPE_UNSIGNED_8:
			return "1";

		case DATA_TYPE_SIGNED_16:
		case DATA_TYPE_UNSIGNED_16:
		case DATA_TYPE_FLOAT_16:
			return "2";

		case DATA_TYPE_SIGNED_32:
		case DATA_TYPE_UNSIGNED_32:
		case DATA_TYPE_FLOAT_32:
		case DATA_TYPE_VEC2_SIGNED_16:
			return "4";

		case DATA_TYPE_SIGNED_64:
		case DATA_TYPE_UNSIGNED_64:
		case DATA_TYPE_FLOAT_64:
		case DATA_TYPE_VEC2_SIGNED_32:
			return "8";

		default:
			DE_ASSERT(false);
	}
	return "";
}

bool isSigned (ConversionDataType type)
{
	switch (type)
	{
		case DATA_TYPE_SIGNED_8:
		case DATA_TYPE_SIGNED_16:
		case DATA_TYPE_SIGNED_32:
		case DATA_TYPE_SIGNED_64:
		case DATA_TYPE_FLOAT_16:
		case DATA_TYPE_FLOAT_32:
		case DATA_TYPE_FLOAT_64:
		case DATA_TYPE_VEC2_SIGNED_16:
		case DATA_TYPE_VEC2_SIGNED_32:
			return true;

		case DATA_TYPE_UNSIGNED_8:
		case DATA_TYPE_UNSIGNED_16:
		case DATA_TYPE_UNSIGNED_32:
		case DATA_TYPE_UNSIGNED_64:
			return false;

		default:
			DE_ASSERT(false);
	}
	return false;
}

bool isInt (ConversionDataType type)
{
	switch (type)
	{
		case DATA_TYPE_SIGNED_8:
		case DATA_TYPE_SIGNED_16:
		case DATA_TYPE_SIGNED_32:
		case DATA_TYPE_SIGNED_64:
		case DATA_TYPE_UNSIGNED_8:
		case DATA_TYPE_UNSIGNED_16:
		case DATA_TYPE_UNSIGNED_32:
		case DATA_TYPE_UNSIGNED_64:
			return true;

		case DATA_TYPE_FLOAT_16:
		case DATA_TYPE_FLOAT_32:
		case DATA_TYPE_FLOAT_64:
		case DATA_TYPE_VEC2_SIGNED_16:
		case DATA_TYPE_VEC2_SIGNED_32:
			return false;

		default:
			DE_ASSERT(false);
	}
	return false;
}

bool isFloat (ConversionDataType type)
{
	switch (type)
	{
		case DATA_TYPE_SIGNED_8:
		case DATA_TYPE_SIGNED_16:
		case DATA_TYPE_SIGNED_32:
		case DATA_TYPE_SIGNED_64:
		case DATA_TYPE_UNSIGNED_8:
		case DATA_TYPE_UNSIGNED_16:
		case DATA_TYPE_UNSIGNED_32:
		case DATA_TYPE_UNSIGNED_64:
		case DATA_TYPE_VEC2_SIGNED_16:
		case DATA_TYPE_VEC2_SIGNED_32:
			return false;

		case DATA_TYPE_FLOAT_16:
		case DATA_TYPE_FLOAT_32:
		case DATA_TYPE_FLOAT_64:
			return true;

		default:
			DE_ASSERT(false);
	}
	return false;
}

const string getTypeName (ConversionDataType type)
{
	string prefix = isSigned(type) ? "" : "u";

	if		(isInt(type))						return prefix + "int"	+ getBitWidthStr(type);
	else if (isFloat(type))						return prefix + "float"	+ getBitWidthStr(type);
	else if (type == DATA_TYPE_VEC2_SIGNED_16)	return "i16vec2";
	else if (type == DATA_TYPE_VEC2_SIGNED_32)	return "i32vec2";
	else										DE_ASSERT(false);

	return "";
}

const string getTestName (ConversionDataType from, ConversionDataType to, const char* suffix)
{
	const string fullSuffix(suffix == DE_NULL ? "" : string("_") + string(suffix));

	return getTypeName(from) + "_to_" + getTypeName(to) + fullSuffix;
}

const string getAsmTypeName (ConversionDataType type, deUint32 elements = 1)
{
	string prefix;

	if		(isInt(type))						prefix = isSigned(type) ? "i" : "u";
	else if (isFloat(type))						prefix = "f";
	else if (type == DATA_TYPE_VEC2_SIGNED_16)	return "i16vec2";
	else if (type == DATA_TYPE_VEC2_SIGNED_32)	return "v2i32";
	else										DE_ASSERT(false);
	if ((isInt(type) || isFloat(type)) && elements == 2)
	{
		prefix = "v2" + prefix;
	}

	return prefix + getBitWidthStr(type);
}

template<typename T>
BufferSp getSpecializedBuffer (deInt64 number, deUint32 elements = 1)
{
	return BufferSp(new Buffer<T>(vector<T>(elements, (T)number)));
}

BufferSp getBuffer (ConversionDataType type, deInt64 number, deUint32 elements = 1)
{
	switch (type)
	{
		case DATA_TYPE_SIGNED_8:		return getSpecializedBuffer<deInt8>(number, elements);
		case DATA_TYPE_SIGNED_16:		return getSpecializedBuffer<deInt16>(number, elements);
		case DATA_TYPE_SIGNED_32:		return getSpecializedBuffer<deInt32>(number, elements);
		case DATA_TYPE_SIGNED_64:		return getSpecializedBuffer<deInt64>(number, elements);
		case DATA_TYPE_UNSIGNED_8:		return getSpecializedBuffer<deUint8>(number, elements);
		case DATA_TYPE_UNSIGNED_16:		return getSpecializedBuffer<deUint16>(number, elements);
		case DATA_TYPE_UNSIGNED_32:		return getSpecializedBuffer<deUint32>(number, elements);
		case DATA_TYPE_UNSIGNED_64:		return getSpecializedBuffer<deUint64>(number, elements);
		case DATA_TYPE_FLOAT_16:		return getSpecializedBuffer<deUint16>(number, elements);
		case DATA_TYPE_FLOAT_32:		return getSpecializedBuffer<deUint32>(number, elements);
		case DATA_TYPE_FLOAT_64:		return getSpecializedBuffer<deUint64>(number, elements);
		case DATA_TYPE_VEC2_SIGNED_16:	return getSpecializedBuffer<deUint32>(number, elements);
		case DATA_TYPE_VEC2_SIGNED_32:	return getSpecializedBuffer<deUint64>(number, elements);

		default:						TCU_THROW(InternalError, "Unimplemented type passed");
	}
}

bool usesInt8 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_SIGNED_8 || to == DATA_TYPE_SIGNED_8 ||
			from == DATA_TYPE_UNSIGNED_8 || to == DATA_TYPE_UNSIGNED_8);
}

bool usesInt16 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_SIGNED_16 || to == DATA_TYPE_SIGNED_16 ||
			from == DATA_TYPE_UNSIGNED_16 || to == DATA_TYPE_UNSIGNED_16 ||
			from == DATA_TYPE_VEC2_SIGNED_16 || to == DATA_TYPE_VEC2_SIGNED_16);
}

bool usesInt32 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_SIGNED_32 || to == DATA_TYPE_SIGNED_32 ||
			from == DATA_TYPE_UNSIGNED_32 || to == DATA_TYPE_UNSIGNED_32 ||
			from == DATA_TYPE_VEC2_SIGNED_32|| to == DATA_TYPE_VEC2_SIGNED_32);
}

bool usesInt64 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_SIGNED_64 || to == DATA_TYPE_SIGNED_64 ||
			from == DATA_TYPE_UNSIGNED_64 || to == DATA_TYPE_UNSIGNED_64);
}

bool usesFloat16 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_FLOAT_16 || to == DATA_TYPE_FLOAT_16);
}

bool usesFloat32 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_FLOAT_32 || to == DATA_TYPE_FLOAT_32);
}

bool usesFloat64 (ConversionDataType from, ConversionDataType to)
{
	return (from == DATA_TYPE_FLOAT_64 || to == DATA_TYPE_FLOAT_64);
}

void getVulkanFeaturesAndExtensions (ConversionDataType from, ConversionDataType to, bool useStorageExt, VulkanFeatures& vulkanFeatures, vector<string>& extensions)
{
	if (usesInt16(from, to) && !usesInt32(from, to))
		vulkanFeatures.coreFeatures.shaderInt16 = DE_TRUE;

	if (usesInt64(from, to))
		vulkanFeatures.coreFeatures.shaderInt64 = DE_TRUE;

	if (usesFloat64(from, to))
		vulkanFeatures.coreFeatures.shaderFloat64 = DE_TRUE;

	if ((usesInt16(from, to) || usesFloat16(from, to)) && useStorageExt)
	{
		extensions.push_back("VK_KHR_16bit_storage");
		vulkanFeatures.ext16BitStorage |= EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
	}

	if (usesFloat16(from, to) || usesInt8(from, to))
	{
		extensions.push_back("VK_KHR_shader_float16_int8");

		if (usesFloat16(from, to))
		{
			vulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_FLOAT16;
		}

		if (usesInt8(from, to))
		{
			vulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;

			extensions.push_back("VK_KHR_8bit_storage");
			vulkanFeatures.ext8BitStorage |= EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;
		}
	}
}

struct ConvertCase
{
	ConvertCase (const string& instruction, ConversionDataType from, ConversionDataType to, deInt64 number, bool separateOutput = false, deInt64 outputNumber = 0, const char* suffix = DE_NULL, bool useStorageExt = true)
	: m_fromType		(from)
	, m_toType			(to)
	, m_elements		(1)
	, m_useStorageExt	(useStorageExt)
	, m_name			(getTestName(from, to, suffix))
	{
		string caps;
		string decl;
		string exts;

		m_asmTypes["inStorageType"]	= getAsmTypeName(from);
		m_asmTypes["outStorageType"] = getAsmTypeName(to);
		m_asmTypes["inCast"] = "OpCopyObject";
		m_asmTypes["outCast"] = "OpCopyObject";
		// If the storage extensions are being avoided, tests instead uses
		// vectors so that they are easily convertible to 32-bit integers.
		// |m_elements| indicates the size of the vector. It modifies how many
		// items added to the buffers and converted in the tests.
		//
		// Currently only supports 1 (default) or 2 elements.
		if (!m_useStorageExt)
		{
			bool in_change = false;
			bool out_change = false;
			if (usesFloat16(from, from) || usesInt16(from, from))
			{
				m_asmTypes["inStorageType"] = "u32";
				m_asmTypes["inCast"] = "OpBitcast";
				m_elements = 2;
				in_change = true;
			}
			if (usesFloat16(to, to) || usesInt16(to, to))
			{
				m_asmTypes["outStorageType"] = "u32";
				m_asmTypes["outCast"] = "OpBitcast";
				m_elements = 2;
				out_change = true;
			}
			if (in_change && !out_change)
			{
				m_asmTypes["outStorageType"] = getAsmTypeName(to, m_elements);
			}
			if (!in_change && out_change)
			{
				m_asmTypes["inStorageType"] = getAsmTypeName(from, m_elements);
			}
		}

		// Safety check for implementation.
		if (m_elements < 1 || m_elements > 2)
			TCU_THROW(InternalError, "Unsupported number of elements");

		m_asmTypes["inputType"]		= getAsmTypeName(from, m_elements);
		m_asmTypes["outputType"]	= getAsmTypeName(to, m_elements);

		m_inputBuffer = getBuffer(from, number, m_elements);
		if (separateOutput)
			m_outputBuffer = getBuffer(to, outputNumber, m_elements);
		else
			m_outputBuffer = getBuffer(to, number, m_elements);

		if (usesInt8(from, to))
		{
			bool requiresInt8Capability = true;
			if (instruction == "OpUConvert" || instruction == "OpSConvert")
			{
				// Conversions between 8 and 32 bit are provided by SPV_KHR_8bit_storage. The rest requires explicit Int8
				if (usesInt32(from, to))
					requiresInt8Capability = false;
			}

			caps += "OpCapability StorageBuffer8BitAccess\n";
			if (requiresInt8Capability)
				caps += "OpCapability Int8\n";

			decl += "%i8         = OpTypeInt 8 1\n"
					"%u8         = OpTypeInt 8 0\n";

			if (m_elements == 2)
			{
				decl += "%v2i8       = OpTypeVector %i8 2\n"
						"%v2u8       = OpTypeVector %u8 2\n";
			}
			exts += "OpExtension \"SPV_KHR_8bit_storage\"\n";
		}

		if (usesInt16(from, to))
		{
			bool requiresInt16Capability = true;

			if (instruction == "OpUConvert" || instruction == "OpSConvert" || instruction == "OpFConvert")
			{
				// Width-only conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Int16
				if (usesInt32(from, to) || usesFloat32(from, to))
					requiresInt16Capability = false;
			}

			decl += "%i16        = OpTypeInt 16 1\n"
					"%u16        = OpTypeInt 16 0\n";
			if (m_elements == 2)
			{
				decl += "%v2i16      = OpTypeVector %i16 2\n"
						"%v2u16      = OpTypeVector %u16 2\n";
			}
			else
			{
				decl += "%i16vec2    = OpTypeVector %i16 2\n";
			}

			// Conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Int16
			if (requiresInt16Capability || !m_useStorageExt)
				caps += "OpCapability Int16\n";
		}

		if (usesFloat16(from, to))
		{
			decl += "%f16        = OpTypeFloat 16\n";
			if (m_elements == 2)
			{
				decl += "%v2f16      = OpTypeVector %f16 2\n";
			}

			// Width-only conversions between 16 and 32 bit are provided by SPV_KHR_16bit_storage. The rest requires explicit Float16
			if (!usesFloat32(from, to) || !m_useStorageExt)
				caps += "OpCapability Float16\n";
		}

		if ((usesInt16(from, to) || usesFloat16(from, to)) && m_useStorageExt)
		{
			caps += "OpCapability StorageUniformBufferBlock16\n";
			exts += "OpExtension \"SPV_KHR_16bit_storage\"\n";
		}

		if (usesInt64(from, to))
		{
			caps += "OpCapability Int64\n";
			decl += "%i64        = OpTypeInt 64 1\n"
					"%u64        = OpTypeInt 64 0\n";
			if (m_elements == 2)
			{
				decl += "%v2i64      = OpTypeVector %i64 2\n"
						"%v2u64      = OpTypeVector %u64 2\n";
			}
		}

		if (usesFloat64(from, to))
		{
			caps += "OpCapability Float64\n";
			decl += "%f64        = OpTypeFloat 64\n";
			if (m_elements == 2)
			{
				decl += "%v2f64        = OpTypeVector %f64 2\n";
			}
		}

		m_asmTypes["datatype_capabilities"]		= caps;
		m_asmTypes["datatype_additional_decl"]	= decl;
		m_asmTypes["datatype_extensions"]		= exts;
	}

	ConversionDataType		m_fromType;
	ConversionDataType		m_toType;
	deUint32				m_elements;
	bool					m_useStorageExt;
	string					m_name;
	map<string, string>		m_asmTypes;
	BufferSp				m_inputBuffer;
	BufferSp				m_outputBuffer;
};

const string getConvertCaseShaderStr (const string& instruction, const ConvertCase& convertCase, bool addVectors = false)
{
	map<string, string> params = convertCase.m_asmTypes;

	params["instruction"]	= instruction;
	params["inDecorator"]	= getByteWidthStr(convertCase.m_fromType);
	params["outDecorator"]	= getByteWidthStr(convertCase.m_toType);

	std::string shader (
		"OpCapability Shader\n"
		"${datatype_capabilities}"
		"${datatype_extensions:opt}"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\"\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		// Decorators
		"OpDecorate %indata DescriptorSet 0\n"
		"OpDecorate %indata Binding 0\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 1\n"
		"OpDecorate %in_buf BufferBlock\n"
		"OpDecorate %out_buf BufferBlock\n"
		"OpMemberDecorate %in_buf 0 Offset 0\n"
		"OpMemberDecorate %out_buf 0 Offset 0\n"
		// Base types
		"%void       = OpTypeVoid\n"
		"%voidf      = OpTypeFunction %void\n"
		"%u32        = OpTypeInt 32 0\n"
		"%i32        = OpTypeInt 32 1\n"
		"%f32        = OpTypeFloat 32\n"
		"%v2i32      = OpTypeVector %i32 2\n"
		"${datatype_additional_decl}"
	);
	if (addVectors)
	{
		shader += "%v2u32 = OpTypeVector %u32 2\n"
					"%v2f32 = OpTypeVector %f32 2\n";
	}
	shader +=
		"%uvec3      = OpTypeVector %u32 3\n"
		// Derived types
		"%in_ptr     = OpTypePointer Uniform %${inStorageType}\n"
		"%out_ptr    = OpTypePointer Uniform %${outStorageType}\n"
		"%in_buf     = OpTypeStruct %${inStorageType}\n"
		"%out_buf    = OpTypeStruct %${outStorageType}\n"
		"%in_bufptr  = OpTypePointer Uniform %in_buf\n"
		"%out_bufptr = OpTypePointer Uniform %out_buf\n"
		"%indata     = OpVariable %in_bufptr Uniform\n"
		"%outdata    = OpVariable %out_bufptr Uniform\n"
		// Constants
		"%zero       = OpConstant %i32 0\n"
		// Main function
		"%main       = OpFunction %void None %voidf\n"
		"%label      = OpLabel\n"
		"%inloc      = OpAccessChain %in_ptr %indata %zero\n"
		"%outloc     = OpAccessChain %out_ptr %outdata %zero\n"
		"%inval      = OpLoad %${inStorageType} %inloc\n"
		"%in_cast    = ${inCast} %${inputType} %inval\n"
		"%conv       = ${instruction} %${outputType} %in_cast\n"
		"%out_cast   = ${outCast} %${outStorageType} %conv\n"
		"              OpStore %outloc %out_cast\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n"
	;

	return StringTemplate(shader).specialize(params);
}

void createConvertCases (vector<ConvertCase>& testCases, const string& instruction)
{
	if (instruction == "OpUConvert")
	{
		// Convert unsigned int to unsigned int
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_UNSIGNED_16,		42));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_UNSIGNED_32,		73));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_UNSIGNED_64,		121));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_UNSIGNED_8,		33));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_UNSIGNED_32,		60653));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_UNSIGNED_64,		17991));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_UNSIGNED_64,		904256275));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_UNSIGNED_16,		6275));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_UNSIGNED_8,		17));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_UNSIGNED_32,		701256243));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_UNSIGNED_16,		4741));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_UNSIGNED_8,		65));

		// Zero extension for int->uint
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_UNSIGNED_16,		56));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_UNSIGNED_32,		-47,								true,	209));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_UNSIGNED_64,		-5,									true,	251));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_UNSIGNED_32,		14669));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_UNSIGNED_64,		-3341,								true,	62195));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_UNSIGNED_64,		973610259));

		// Truncate for int->uint
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_UNSIGNED_8,		-25711,								true,	145));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_UNSIGNED_8,		103));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_UNSIGNED_8,		-1067742499291926803ll,				true,	237));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_UNSIGNED_16,		12382));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_UNSIGNED_32,		-972812359,							true,	3322154937u));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_UNSIGNED_16,		-1067742499291926803ll,				true,	61165));
	}
	else if (instruction == "OpSConvert")
	{
		// Sign extension int->int
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_SIGNED_16,		-30));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_SIGNED_32,		55));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_SIGNED_64,		-3));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_SIGNED_32,		14669));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_SIGNED_64,		-3341));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_SIGNED_64,		973610259));

		// Truncate for int->int
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_SIGNED_8,			81));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_SIGNED_8,			-93));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_SIGNED_8,			3182748172687672ll,					true,	56));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_SIGNED_16,		12382));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_SIGNED_32,		-972812359));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_SIGNED_16,		-1067742499291926803ll,				true,	-4371));

		// Sign extension for int->uint
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_UNSIGNED_16,		56));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_UNSIGNED_32,		-47,								true,	4294967249u));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_UNSIGNED_64,		-5,									true,	18446744073709551611ull));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_UNSIGNED_32,		14669));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_UNSIGNED_64,		-3341,								true,	18446744073709548275ull));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_UNSIGNED_64,		973610259));

		// Truncate for int->uint
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_UNSIGNED_8,		-25711,								true,	145));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_UNSIGNED_8,		103));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_UNSIGNED_8,		-1067742499291926803ll,				true,	237));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_UNSIGNED_16,		12382));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_UNSIGNED_32,		-972812359,							true,	3322154937u));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_UNSIGNED_16,		-1067742499291926803ll,				true,	61165));

		// Sign extension for uint->int
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_SIGNED_16,		71));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_SIGNED_32,		201,								true,	-55));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_SIGNED_64,		188,								true,	-68));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_SIGNED_32,		14669));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_SIGNED_64,		62195,								true,	-3341));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_SIGNED_64,		973610259));

		// Truncate for uint->int
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_SIGNED_8,			67));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_SIGNED_8,			133,								true,	-123));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_SIGNED_8,			836927654193256494ull,				true,	46));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_SIGNED_16,		12382));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_SIGNED_32,		18446744072736739257ull,			true,	-972812359));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_SIGNED_16,		17379001574417624813ull,			true,	-4371));

		// Convert i16vec2 to i32vec2 and vice versa
		// Unsigned values are used here to represent negative signed values and to allow defined shifting behaviour.
		// The actual signed value -32123 is used here as uint16 value 33413 and uint32 value 4294935173
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_VEC2_SIGNED_16,	DATA_TYPE_VEC2_SIGNED_32,	(33413u << 16)			| 27593,	true,	(4294935173ull << 32)	| 27593));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_VEC2_SIGNED_32,	DATA_TYPE_VEC2_SIGNED_16,	(4294935173ull << 32)	| 27593,	true,	(33413u << 16)			| 27593));
	}
	else if (instruction == "OpFConvert")
	{
		// All hexadecimal values below represent 1234.0 as 16/32/64-bit IEEE 754 float
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_FLOAT_64,			0x449a4000,							true,	0x4093480000000000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_FLOAT_32,			0x4093480000000000,					true,	0x449a4000));

		// Conversion to/from 32-bit floats are supported by both 16-bit
		// storage and Float16. The tests are duplicated to exercise both
		// cases.
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_FLOAT_16,			0x449a4000,							true,	0x64D2));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_FLOAT_32,			0x64D2,								true,	0x449a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_FLOAT_16,			0x449a4000,							true,	0x64D2,					"no_storage",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_FLOAT_32,			0x64D2,								true,	0x449a4000,				"no_storage",	false));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_FLOAT_64,			0x64D2,								true,	0x4093480000000000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_FLOAT_16,			0x4093480000000000,					true,	0x64D2));
	}
	else if (instruction == "OpConvertFToU")
	{
		// Normal numbers from uint8 range
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_8,		0x5020,								true,	33,									"33",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_8,		0x42280000,							true,	42,									"42"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_8,		0x4067800000000000ull,				true,	188,								"188"));

		// Maximum uint8 value
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_8,		0x5BF8,								true,	255,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_8,		0x437F0000,							true,	255,								"max"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_8,		0x406FE00000000000ull,				true,	255,								"max"));

		// +0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_8,		0x0000,								true,	0,									"p0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_8,		0x00000000,							true,	0,									"p0"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_8,		0x0000000000000000ull,				true,	0,									"p0"));

		// -0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_8,		0x8000,								true,	0,									"m0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_8,		0x80000000,							true,	0,									"m0"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_8,		0x8000000000000000ull,				true,	0,									"m0"));

		// All hexadecimal values below represent 1234.0 as 16/32/64-bit IEEE 754 float
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_16,		0x64D2,								true,	1234,								"1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_32,		0x64D2,								true,	1234,								"1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_64,		0x64D2,								true,	1234,								"1234",	false));

		// 0x7BFF = 0111 1011 1111 1111 = 0 11110 1111111111 = 65504
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_16,		0x7BFF,								true,	65504,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_32,		0x7BFF,								true,	65504,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_64,		0x7BFF,								true,	65504,								"max",	false));

		// +0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_32,		0x0000,								true,	0,									"p0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_16,		0x0000,								true,	0,									"p0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_64,		0x0000,								true,	0,									"p0",	false));

		// -0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_16,		0x8000,								true,	0,									"m0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_32,		0x8000,								true,	0,									"m0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_UNSIGNED_64,		0x8000,								true,	0,									"m0",	false));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_16,		0x449a4000,							true,	1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_32,		0x449a4000,							true,	1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_UNSIGNED_64,		0x449a4000,							true,	1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_16,		0x4093480000000000,					true,	1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_32,		0x4093480000000000,					true,	1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_UNSIGNED_64,		0x4093480000000000,					true,	1234));
	}
	else if (instruction == "OpConvertUToF")
	{
		// Normal numbers from uint8 range
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_FLOAT_16,			116,								true,	0x5740,								"116",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_FLOAT_32,			232,								true,	0x43680000,							"232"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_FLOAT_64,			164,								true,	0x4064800000000000ull,				"164"));

		// Maximum uint8 value
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_FLOAT_16,			255,								true,	0x5BF8,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_FLOAT_32,			255,								true,	0x437F0000,							"max"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_8,		DATA_TYPE_FLOAT_64,			255,								true,	0x406FE00000000000ull,				"max"));

		// All hexadecimal values below represent 1234.0 as 32/64-bit IEEE 754 float
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_FLOAT_16,			1234,								true,	0x64D2,								"1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_FLOAT_16,			1234,								true,	0x64D2,								"1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_FLOAT_16,			1234,								true,	0x64D2,								"1234",	false));

		// 0x7BFF = 0111 1011 1111 1111 = 0 11110 1111111111 = 65504
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_FLOAT_16,			65504,								true,	0x7BFF,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_FLOAT_16,			65504,								true,	0x7BFF,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_FLOAT_16,			65504,								true,	0x7BFF,								"max",	false));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_FLOAT_32,			1234,								true,	0x449a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_16,		DATA_TYPE_FLOAT_64,			1234,								true,	0x4093480000000000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_FLOAT_32,			1234,								true,	0x449a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_32,		DATA_TYPE_FLOAT_64,			1234,								true,	0x4093480000000000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_FLOAT_32,			1234,								true,	0x449a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_UNSIGNED_64,		DATA_TYPE_FLOAT_64,			1234,								true,	0x4093480000000000));
	}
	else if (instruction == "OpConvertFToS")
	{
		// Normal numbers from int8 range
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_8,			0xC980,								true,	-11,								"m11",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_8,			0xC2140000,							true,	-37,								"m37"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_8,			0xC050800000000000ull,				true,	-66,								"m66"));

		// Minimum int8 value
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_8,			0xD800,								true,	-128,								"min",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_8,			0xC3000000,							true,	-128,								"min"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_8,			0xC060000000000000ull,				true,	-128,								"min"));

		// Maximum int8 value
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_8,			0x57F0,								true,	127,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_8,			0x42FE0000,							true,	127,								"max"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_8,			0x405FC00000000000ull,				true,	127,								"max"));

		// +0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_8,			0x0000,								true,	0,									"p0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_8,			0x00000000,							true,	0,									"p0"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_8,			0x0000000000000000ull,				true,	0,									"p0"));

		// -0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_8,			0x8000,								true,	0,									"m0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_8,			0x80000000,							true,	0,									"m0"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_8,			0x8000000000000000ull,				true,	0,									"m0"));

		// All hexadecimal values below represent -1234.0 as 32/64-bit IEEE 754 float
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_16,		0xE4D2,								true,	-1234,								"m1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_32,		0xE4D2,								true,	-1234,								"m1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_64,		0xE4D2,								true,	-1234,								"m1234",	false));

		// 0xF800 = 1111 1000 0000 0000 = 1 11110 0000000000 = -32768
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_16,		0xF800,								true,	-32768,								"min",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_32,		0xF800,								true,	-32768,								"min",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_64,		0xF800,								true,	-32768,								"min",	false));

		// 0x77FF = 0111 0111 1111 1111 = 0 11101 1111111111 = 32752
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_16,		0x77FF,								true,	32752,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_32,		0x77FF,								true,	32752,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_64,		0x77FF,								true,	32752,								"max",	false));

		// +0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_16,		0x0000,								true,	0,									"p0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_32,		0x0000,								true,	0,									"p0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_64,		0x0000,								true,	0,									"p0",	false));

		// -0
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_16,		0x8000,								true,	0,									"m0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_32,		0x8000,								true,	0,									"m0",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_16,			DATA_TYPE_SIGNED_64,		0x8000,								true,	0,									"m0",	false));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_16,		0xc49a4000,							true,	-1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_32,		0xc49a4000,							true,	-1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_64,		0xc49a4000,							true,	-1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_16,		0xc093480000000000,					true,	-1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_32,		0xc093480000000000,					true,	-1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_64,			DATA_TYPE_SIGNED_64,		0xc093480000000000,					true,	-1234));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_16,		0x453b9000,							true,	 3001,								"p3001"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_FLOAT_32,			DATA_TYPE_SIGNED_16,		0xc53b9000,							true,	-3001,								"m3001"));
	}
	else if (instruction == "OpConvertSToF")
	{
		// Normal numbers from int8 range
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_16,			-12,								true,	0xCA00,								"m21",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_32,			-21,								true,	0xC1A80000,							"m21"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_64,			-99,								true,	0xC058C00000000000ull,				"m99"));

		// Minimum int8 value
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_16,			-128,								true,	0xD800,								"min",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_32,			-128,								true,	0xC3000000,							"min"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_64,			-128,								true,	0xC060000000000000ull,				"min"));

		// Maximum int8 value
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_16,			127,								true,	0x57F0,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_32,			127,								true,	0x42FE0000,							"max"));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_8,			DATA_TYPE_FLOAT_64,			127,								true,	0x405FC00000000000ull,				"max"));

		// All hexadecimal values below represent 1234.0 as 32/64-bit IEEE 754 float
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_FLOAT_16,			-1234,								true,	0xE4D2,								"m1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_FLOAT_16,			-1234,								true,	0xE4D2,								"m1234",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_FLOAT_16,			-1234,								true,	0xE4D2,								"m1234",	false));

		// 0xF800 = 1111 1000 0000 0000 = 1 11110 0000000000 = -32768
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_FLOAT_16,			-32768,								true,	0xF800,								"min",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_FLOAT_16,			-32768,								true,	0xF800,								"min",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_FLOAT_16,			-32768,								true,	0xF800,								"min",	false));

		// 0x77FF = 0111 0111 1111 1111 = 0 11101 1111111111 = 32752
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_FLOAT_16,			32752,								true,	0x77FF,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_FLOAT_16,			32752,								true,	0x77FF,								"max",	false));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_FLOAT_16,			32752,								true,	0x77FF,								"max",	false));

		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_FLOAT_32,			-1234,								true,	0xc49a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_16,		DATA_TYPE_FLOAT_64,			-1234,								true,	0xc093480000000000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_FLOAT_32,			-1234,								true,	0xc49a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_32,		DATA_TYPE_FLOAT_64,			-1234,								true,	0xc093480000000000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_FLOAT_32,			-1234,								true,	0xc49a4000));
		testCases.push_back(ConvertCase(instruction,	DATA_TYPE_SIGNED_64,		DATA_TYPE_FLOAT_64,			-1234,								true,	0xc093480000000000));
	}
	else
		DE_FATAL("Unknown instruction");
}

const map<string, string> getConvertCaseFragments (string instruction, const ConvertCase& convertCase)
{
	map<string, string> params = convertCase.m_asmTypes;
	map<string, string> fragments;

	params["instruction"] = instruction;
	params["inDecorator"] = getByteWidthStr(convertCase.m_fromType);

	const StringTemplate decoration (
		"      OpDecorate %SSBOi DescriptorSet 0\n"
		"      OpDecorate %SSBOo DescriptorSet 0\n"
		"      OpDecorate %SSBOi Binding 0\n"
		"      OpDecorate %SSBOo Binding 1\n"
		"      OpDecorate %s_SSBOi Block\n"
		"      OpDecorate %s_SSBOo Block\n"
		"OpMemberDecorate %s_SSBOi 0 Offset 0\n"
		"OpMemberDecorate %s_SSBOo 0 Offset 0\n");

	const StringTemplate pre_main (
		"${datatype_additional_decl:opt}"
		"    %ptr_in = OpTypePointer StorageBuffer %${inputType}\n"
		"   %ptr_out = OpTypePointer StorageBuffer %${outputType}\n"
		"   %s_SSBOi = OpTypeStruct %${inputType}\n"
		"   %s_SSBOo = OpTypeStruct %${outputType}\n"
		" %ptr_SSBOi = OpTypePointer StorageBuffer %s_SSBOi\n"
		" %ptr_SSBOo = OpTypePointer StorageBuffer %s_SSBOo\n"
		"     %SSBOi = OpVariable %ptr_SSBOi StorageBuffer\n"
		"     %SSBOo = OpVariable %ptr_SSBOo StorageBuffer\n");

	const StringTemplate testfun (
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%iLoc      = OpAccessChain %ptr_in %SSBOi %c_u32_0\n"
		"%oLoc      = OpAccessChain %ptr_out %SSBOo %c_u32_0\n"
		"%valIn     = OpLoad %${inputType} %iLoc\n"
		"%valOut    = ${instruction} %${outputType} %valIn\n"
		"             OpStore %oLoc %valOut\n"
		"             OpReturnValue %param\n"
		"             OpFunctionEnd\n");

	params["datatype_extensions"] =
		params["datatype_extensions"] +
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";

	fragments["capability"]	= params["datatype_capabilities"];
	fragments["extension"]	= params["datatype_extensions"];
	fragments["decoration"]	= decoration.specialize(params);
	fragments["pre_main"]	= pre_main.specialize(params);
	fragments["testfun"]	= testfun.specialize(params);

	return fragments;
}

const map<string, string> getConvertCaseFragmentsNoStorage(string instruction, const ConvertCase& convertCase)
{
	map<string, string> params = convertCase.m_asmTypes;
	map<string, string> fragments;

	params["instruction"] = instruction;
	params["inDecorator"] = getByteWidthStr(convertCase.m_fromType);

	const StringTemplate decoration(
		"      OpDecorate %SSBOi DescriptorSet 0\n"
		"      OpDecorate %SSBOo DescriptorSet 0\n"
		"      OpDecorate %SSBOi Binding 0\n"
		"      OpDecorate %SSBOo Binding 1\n"
		"      OpDecorate %s_SSBOi Block\n"
		"      OpDecorate %s_SSBOo Block\n"
		"OpMemberDecorate %s_SSBOi 0 Offset 0\n"
		"OpMemberDecorate %s_SSBOo 0 Offset 0\n");

	const StringTemplate pre_main(
		"${datatype_additional_decl:opt}"
		"    %ptr_in = OpTypePointer StorageBuffer %${inStorageType}\n"
		"   %ptr_out = OpTypePointer StorageBuffer %${outStorageType}\n"
		"   %s_SSBOi = OpTypeStruct %${inStorageType}\n"
		"   %s_SSBOo = OpTypeStruct %${outStorageType}\n"
		" %ptr_SSBOi = OpTypePointer StorageBuffer %s_SSBOi\n"
		" %ptr_SSBOo = OpTypePointer StorageBuffer %s_SSBOo\n"
		"     %SSBOi = OpVariable %ptr_SSBOi StorageBuffer\n"
		"     %SSBOo = OpVariable %ptr_SSBOo StorageBuffer\n");

	const StringTemplate testfun(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%iLoc      = OpAccessChain %ptr_in %SSBOi %c_u32_0\n"
		"%oLoc      = OpAccessChain %ptr_out %SSBOo %c_u32_0\n"
		"%inval      = OpLoad %${inStorageType} %iLoc\n"
		"%in_cast    = ${inCast} %${inputType} %inval\n"
		"%conv       = ${instruction} %${outputType} %in_cast\n"
		"%out_cast   = ${outCast} %${outStorageType} %conv\n"
		"              OpStore %oLoc %out_cast\n"
		"              OpReturnValue %param\n"
		"              OpFunctionEnd\n");

	params["datatype_extensions"] =
		params["datatype_extensions"] +
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";

	fragments["capability"] = params["datatype_capabilities"];
	fragments["extension"] = params["datatype_extensions"];
	fragments["decoration"] = decoration.specialize(params);
	fragments["pre_main"] = pre_main.specialize(params);
	fragments["testfun"] = testfun.specialize(params);
	return fragments;
}

// Test for OpSConvert, OpUConvert, OpFConvert and OpConvert* in compute shaders
tcu::TestCaseGroup* createConvertComputeTests (tcu::TestContext& testCtx, const string& instruction, const string& name)
{
	de::MovePtr<tcu::TestCaseGroup>		group(new tcu::TestCaseGroup(testCtx, name.c_str(), instruction.c_str()));
	vector<ConvertCase>					testCases;
	createConvertCases(testCases, instruction);

	for (vector<ConvertCase>::const_iterator test = testCases.begin(); test != testCases.end(); ++test)
	{
		ComputeShaderSpec spec;
		spec.assembly			= getConvertCaseShaderStr(instruction, *test, true);
		spec.numWorkGroups		= IVec3(1, 1, 1);
		spec.inputs.push_back	(test->m_inputBuffer);
		spec.outputs.push_back	(test->m_outputBuffer);

		getVulkanFeaturesAndExtensions(test->m_fromType, test->m_toType, test->m_useStorageExt, spec.requestedVulkanFeatures, spec.extensions);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, test->m_name.c_str(), "", spec));
	}
	return group.release();
}

// Test for OpSConvert, OpUConvert, OpFConvert and OpConvert* in graphics shaders
tcu::TestCaseGroup* createConvertGraphicsTests (tcu::TestContext& testCtx, const string& instruction, const string& name)
{
	de::MovePtr<tcu::TestCaseGroup>		group(new tcu::TestCaseGroup(testCtx, name.c_str(), instruction.c_str()));
	vector<ConvertCase>					testCases;
	createConvertCases(testCases, instruction);

	for (vector<ConvertCase>::const_iterator test = testCases.begin(); test != testCases.end(); ++test)
	{
		map<string, string>	fragments		= (test->m_useStorageExt) ? getConvertCaseFragments(instruction, *test) : getConvertCaseFragmentsNoStorage(instruction,*test);
		VulkanFeatures		vulkanFeatures;
		GraphicsResources	resources;
		vector<string>		extensions;
		SpecConstants		noSpecConstants;
		PushConstants		noPushConstants;
		GraphicsInterfaces	noInterfaces;
		tcu::RGBA			defaultColors[4];

		getDefaultColors			(defaultColors);
		resources.inputs.push_back	(Resource(test->m_inputBuffer, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		resources.outputs.push_back	(Resource(test->m_outputBuffer, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		extensions.push_back		("VK_KHR_storage_buffer_storage_class");

		getVulkanFeaturesAndExtensions(test->m_fromType, test->m_toType, test->m_useStorageExt, vulkanFeatures, extensions);

		vulkanFeatures.coreFeatures.vertexPipelineStoresAndAtomics	= true;
		vulkanFeatures.coreFeatures.fragmentStoresAndAtomics		= true;

		createTestsForAllStages(
			test->m_name, defaultColors, defaultColors, fragments, noSpecConstants,
			noPushConstants, resources, noInterfaces, extensions, vulkanFeatures, group.get());
	}
	return group.release();
}

// Constant-Creation Instructions: OpConstant, OpConstantComposite
tcu::TestCaseGroup* createOpConstantFloat16Tests(tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> opConstantCompositeTests		(new tcu::TestCaseGroup(testCtx, "opconstant", "OpConstant and OpConstantComposite instruction"));
	RGBA							inputColors[4];
	RGBA							outputColors[4];
	vector<string>					extensions;
	GraphicsResources				resources;
	VulkanFeatures					features;

	const char						functionStart[]	 =
		"%test_code             = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1                = OpFunctionParameter %v4f32\n"
		"%lbl                   = OpLabel\n";

	const char						functionEnd[]		=
		"%transformed_param_32  = OpFConvert %v4f32 %transformed_param\n"
		"                         OpReturnValue %transformed_param_32\n"
		"                         OpFunctionEnd\n";

	struct NameConstantsCode
	{
		string name;
		string constants;
		string code;
	};

#define FLOAT_16_COMMON_TYPES_AND_CONSTS \
			"%f16                  = OpTypeFloat 16\n"                                                 \
			"%c_f16_0              = OpConstant %f16 0.0\n"                                            \
			"%c_f16_0_5            = OpConstant %f16 0.5\n"                                            \
			"%c_f16_1              = OpConstant %f16 1.0\n"                                            \
			"%v4f16                = OpTypeVector %f16 4\n"                                            \
			"%fp_f16               = OpTypePointer Function %f16\n"                                    \
			"%fp_v4f16             = OpTypePointer Function %v4f16\n"                                  \
			"%c_v4f16_1_1_1_1      = OpConstantComposite %v4f16 %c_f16_1 %c_f16_1 %c_f16_1 %c_f16_1\n" \
			"%a4f16                = OpTypeArray %f16 %c_u32_4\n"                                      \

	NameConstantsCode				tests[] =
	{
		{
			"vec4",

			FLOAT_16_COMMON_TYPES_AND_CONSTS
			"%cval                 = OpConstantComposite %v4f16 %c_f16_0_5 %c_f16_0_5 %c_f16_0_5 %c_f16_0\n",
			"%param1_16            = OpFConvert %v4f16 %param1\n"
			"%transformed_param    = OpFAdd %v4f16 %param1_16 %cval\n"
		},
		{
			"struct",

			FLOAT_16_COMMON_TYPES_AND_CONSTS
			"%stype                = OpTypeStruct %v4f16 %f16\n"
			"%fp_stype             = OpTypePointer Function %stype\n"
			"%f16_n_1              = OpConstant %f16 -1.0\n"
			"%f16_1_5              = OpConstant %f16 !0x3e00\n" // +1.5
			"%cvec                 = OpConstantComposite %v4f16 %f16_1_5 %f16_1_5 %f16_1_5 %c_f16_1\n"
			"%cval                 = OpConstantComposite %stype %cvec %f16_n_1\n",

			"%v                    = OpVariable %fp_stype Function %cval\n"
			"%vec_ptr              = OpAccessChain %fp_v4f16 %v %c_u32_0\n"
			"%f16_ptr              = OpAccessChain %fp_f16 %v %c_u32_1\n"
			"%vec_val              = OpLoad %v4f16 %vec_ptr\n"
			"%f16_val              = OpLoad %f16 %f16_ptr\n"
			"%tmp1                 = OpVectorTimesScalar %v4f16 %c_v4f16_1_1_1_1 %f16_val\n" // vec4(-1)
			"%param1_16            = OpFConvert %v4f16 %param1\n"
			"%tmp2                 = OpFAdd %v4f16 %tmp1 %param1_16\n" // param1 + vec4(-1)
			"%transformed_param    = OpFAdd %v4f16 %tmp2 %vec_val\n" // param1 + vec4(-1) + vec4(1.5, 1.5, 1.5, 1.0)
		},
		{
			// [1|0|0|0.5] [x] = x + 0.5
			// [0|1|0|0.5] [y] = y + 0.5
			// [0|0|1|0.5] [z] = z + 0.5
			// [0|0|0|1  ] [1] = 1
			"matrix",

			FLOAT_16_COMMON_TYPES_AND_CONSTS
			"%mat4x4_f16           = OpTypeMatrix %v4f16 4\n"
			"%v4f16_1_0_0_0        = OpConstantComposite %v4f16 %c_f16_1 %c_f16_0 %c_f16_0 %c_f16_0\n"
			"%v4f16_0_1_0_0        = OpConstantComposite %v4f16 %c_f16_0 %c_f16_1 %c_f16_0 %c_f16_0\n"
			"%v4f16_0_0_1_0        = OpConstantComposite %v4f16 %c_f16_0 %c_f16_0 %c_f16_1 %c_f16_0\n"
			"%v4f16_0_5_0_5_0_5_1  = OpConstantComposite %v4f16 %c_f16_0_5 %c_f16_0_5 %c_f16_0_5 %c_f16_1\n"
			"%cval                 = OpConstantComposite %mat4x4_f16 %v4f16_1_0_0_0 %v4f16_0_1_0_0 %v4f16_0_0_1_0 %v4f16_0_5_0_5_0_5_1\n",

			"%param1_16            = OpFConvert %v4f16 %param1\n"
			"%transformed_param    = OpMatrixTimesVector %v4f16 %cval %param1_16\n"
		},
		{
			"array",

			FLOAT_16_COMMON_TYPES_AND_CONSTS
			"%c_v4f16_1_1_1_0      = OpConstantComposite %v4f16 %c_f16_1 %c_f16_1 %c_f16_1 %c_f16_0\n"
			"%fp_a4f16             = OpTypePointer Function %a4f16\n"
			"%f16_n_1              = OpConstant %f16 -1.0\n"
			"%f16_1_5              = OpConstant %f16 !0x3e00\n" // +1.5
			"%carr                 = OpConstantComposite %a4f16 %c_f16_0 %f16_n_1 %f16_1_5 %c_f16_0\n",

			"%v                    = OpVariable %fp_a4f16 Function %carr\n"
			"%f                    = OpAccessChain %fp_f16 %v %c_u32_0\n"
			"%f1                   = OpAccessChain %fp_f16 %v %c_u32_1\n"
			"%f2                   = OpAccessChain %fp_f16 %v %c_u32_2\n"
			"%f3                   = OpAccessChain %fp_f16 %v %c_u32_3\n"
			"%f_val                = OpLoad %f16 %f\n"
			"%f1_val               = OpLoad %f16 %f1\n"
			"%f2_val               = OpLoad %f16 %f2\n"
			"%f3_val               = OpLoad %f16 %f3\n"
			"%ftot1                = OpFAdd %f16 %f_val %f1_val\n"
			"%ftot2                = OpFAdd %f16 %ftot1 %f2_val\n"
			"%ftot3                = OpFAdd %f16 %ftot2 %f3_val\n"  // 0 - 1 + 1.5 + 0
			"%add_vec              = OpVectorTimesScalar %v4f16 %c_v4f16_1_1_1_0 %ftot3\n"
			"%param1_16            = OpFConvert %v4f16 %param1\n"
			"%transformed_param    = OpFAdd %v4f16 %param1_16 %add_vec\n"
		},
		{
			//
			// [
			//   {
			//      0.0,
			//      [ 1.0, 1.0, 1.0, 1.0]
			//   },
			//   {
			//      1.0,
			//      [ 0.0, 0.5, 0.0, 0.0]
			//   }, //     ^^^
			//   {
			//      0.0,
			//      [ 1.0, 1.0, 1.0, 1.0]
			//   }
			// ]
			"array_of_struct_of_array",

			FLOAT_16_COMMON_TYPES_AND_CONSTS
			"%c_v4f16_1_1_1_0      = OpConstantComposite %v4f16 %c_f16_1 %c_f16_1 %c_f16_1 %c_f16_0\n"
			"%fp_a4f16             = OpTypePointer Function %a4f16\n"
			"%stype                = OpTypeStruct %f16 %a4f16\n"
			"%a3stype              = OpTypeArray %stype %c_u32_3\n"
			"%fp_a3stype           = OpTypePointer Function %a3stype\n"
			"%ca4f16_0             = OpConstantComposite %a4f16 %c_f16_0 %c_f16_0_5 %c_f16_0 %c_f16_0\n"
			"%ca4f16_1             = OpConstantComposite %a4f16 %c_f16_1 %c_f16_1 %c_f16_1 %c_f16_1\n"
			"%cstype1              = OpConstantComposite %stype %c_f16_0 %ca4f16_1\n"
			"%cstype2              = OpConstantComposite %stype %c_f16_1 %ca4f16_0\n"
			"%carr                 = OpConstantComposite %a3stype %cstype1 %cstype2 %cstype1",

			"%v                    = OpVariable %fp_a3stype Function %carr\n"
			"%f                    = OpAccessChain %fp_f16 %v %c_u32_1 %c_u32_1 %c_u32_1\n"
			"%f_l                  = OpLoad %f16 %f\n"
			"%add_vec              = OpVectorTimesScalar %v4f16 %c_v4f16_1_1_1_0 %f_l\n"
			"%param1_16            = OpFConvert %v4f16 %param1\n"
			"%transformed_param    = OpFAdd %v4f16 %param1_16 %add_vec\n"
		}
	};

	getHalfColorsFullAlpha(inputColors);
	outputColors[0] = RGBA(255, 255, 255, 255);
	outputColors[1] = RGBA(255, 127, 127, 255);
	outputColors[2] = RGBA(127, 255, 127, 255);
	outputColors[3] = RGBA(127, 127, 255, 255);

	extensions.push_back("VK_KHR_shader_float16_int8");
	features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;

	for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameConstantsCode); ++testNdx)
	{
		map<string, string> fragments;

		fragments["capability"]	= "OpCapability Float16\n";
		fragments["pre_main"]	= tests[testNdx].constants;
		fragments["testfun"]	= string(functionStart) + tests[testNdx].code + functionEnd;

		createTestsForAllStages(tests[testNdx].name, inputColors, outputColors, fragments, resources, extensions, opConstantCompositeTests.get(), features);
	}
	return opConstantCompositeTests.release();
}

template<typename T>
void finalizeTestsCreation (T&							specResource,
							const map<string, string>&	fragments,
							tcu::TestContext&			testCtx,
							tcu::TestCaseGroup&			testGroup,
							const std::string&			testName,
							const VulkanFeatures&		vulkanFeatures,
							const vector<string>&		extensions,
							const IVec3&				numWorkGroups,
							const bool					splitRenderArea = false);

template<>
void finalizeTestsCreation (GraphicsResources&			specResource,
							const map<string, string>&	fragments,
							tcu::TestContext&			,
							tcu::TestCaseGroup&			testGroup,
							const std::string&			testName,
							const VulkanFeatures&		vulkanFeatures,
							const vector<string>&		extensions,
							const IVec3&				,
							const bool					splitRenderArea)
{
	RGBA defaultColors[4];
	getDefaultColors(defaultColors);

	createTestsForAllStages(testName, defaultColors, defaultColors, fragments, specResource, extensions, &testGroup, vulkanFeatures, QP_TEST_RESULT_FAIL, std::string(), splitRenderArea);
}

template<>
void finalizeTestsCreation (ComputeShaderSpec&			specResource,
							const map<string, string>&	fragments,
							tcu::TestContext&			testCtx,
							tcu::TestCaseGroup&			testGroup,
							const std::string&			testName,
							const VulkanFeatures&		vulkanFeatures,
							const vector<string>&		extensions,
							const IVec3&				numWorkGroups,
							bool)
{
	specResource.numWorkGroups = numWorkGroups;
	specResource.requestedVulkanFeatures = vulkanFeatures;
	specResource.extensions = extensions;

	specResource.assembly = makeComputeShaderAssembly(fragments);

	testGroup.addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), "", specResource));
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16LogicalSet (tcu::TestContext& testCtx, const bool nanSupported)
{
	const string						nan					= nanSupported ? "_nan" : "";
	const string						groupName			= "logical" + nan;
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, groupName.c_str(), "Float 16 logical tests"));

	de::Random							rnd					(deStringHash(testGroup->getName()));
	const string						spvCapabilities		= string("OpCapability Float16\n") + (nanSupported ? "OpCapability SignedZeroInfNanPreserve\n" : "");
	const string						spvExtensions		= (nanSupported ? "OpExtension \"SPV_KHR_float_controls\"\n" : "");
	const string						spvExecutionMode	= nanSupported ? "OpExecutionMode %BP_main SignedZeroInfNanPreserve 16\n" : "";
	const deUint32						numDataPointsScalar	= 16;
	const deUint32						numDataPointsVector	= 14;
	const vector<deFloat16>				float16DataScalar	= getFloat16s(rnd, numDataPointsScalar);
	const vector<deFloat16>				float16DataVector	= getFloat16s(rnd, numDataPointsVector);
	const vector<deFloat16>				float16Data1		= squarize(float16DataScalar, 0);			// Total Size: square(sizeof(float16DataScalar))
	const vector<deFloat16>				float16Data2		= squarize(float16DataScalar, 1);
	const vector<deFloat16>				float16DataVec1		= squarizeVector(float16DataVector, 0);		// Total Size: 2 * (square(square(sizeof(float16DataVector))))
	const vector<deFloat16>				float16DataVec2		= squarizeVector(float16DataVector, 1);
	const vector<deFloat16>				float16OutDummy		(float16Data1.size(), 0);
	const vector<deFloat16>				float16OutVecDummy	(float16DataVec1.size(), 0);

	struct TestOp
	{
		const char*		opCode;
		VerifyIOFunc	verifyFuncNan;
		VerifyIOFunc	verifyFuncNonNan;
		const deUint32	argCount;
	};

	const TestOp	testOps[]	=
	{
		{ "OpIsNan"						,	compareFP16Logical<fp16isNan,				true,  false, true>,	compareFP16Logical<fp16isNan,				true,  false, false>,	1	},
		{ "OpIsInf"						,	compareFP16Logical<fp16isInf,				true,  false, true>,	compareFP16Logical<fp16isInf,				true,  false, false>,	1	},
		{ "OpFOrdEqual"					,	compareFP16Logical<fp16isEqual,				false, true,  true>,	compareFP16Logical<fp16isEqual,				false, true,  false>,	2	},
		{ "OpFUnordEqual"				,	compareFP16Logical<fp16isEqual,				false, false, true>,	compareFP16Logical<fp16isEqual,				false, false, false>,	2	},
		{ "OpFOrdNotEqual"				,	compareFP16Logical<fp16isUnequal,			false, true,  true>,	compareFP16Logical<fp16isUnequal,			false, true,  false>,	2	},
		{ "OpFUnordNotEqual"			,	compareFP16Logical<fp16isUnequal,			false, false, true>,	compareFP16Logical<fp16isUnequal,			false, false, false>,	2	},
		{ "OpFOrdLessThan"				,	compareFP16Logical<fp16isLess,				false, true,  true>,	compareFP16Logical<fp16isLess,				false, true,  false>,	2	},
		{ "OpFUnordLessThan"			,	compareFP16Logical<fp16isLess,				false, false, true>,	compareFP16Logical<fp16isLess,				false, false, false>,	2	},
		{ "OpFOrdGreaterThan"			,	compareFP16Logical<fp16isGreater,			false, true,  true>,	compareFP16Logical<fp16isGreater,			false, true,  false>,	2	},
		{ "OpFUnordGreaterThan"			,	compareFP16Logical<fp16isGreater,			false, false, true>,	compareFP16Logical<fp16isGreater,			false, false, false>,	2	},
		{ "OpFOrdLessThanEqual"			,	compareFP16Logical<fp16isLessOrEqual,		false, true,  true>,	compareFP16Logical<fp16isLessOrEqual,		false, true,  false>,	2	},
		{ "OpFUnordLessThanEqual"		,	compareFP16Logical<fp16isLessOrEqual,		false, false, true>,	compareFP16Logical<fp16isLessOrEqual,		false, false, false>,	2	},
		{ "OpFOrdGreaterThanEqual"		,	compareFP16Logical<fp16isGreaterOrEqual,	false, true,  true>,	compareFP16Logical<fp16isGreaterOrEqual,	false, true,  false>,	2	},
		{ "OpFUnordGreaterThanEqual"	,	compareFP16Logical<fp16isGreaterOrEqual,	false, false, true>,	compareFP16Logical<fp16isGreaterOrEqual,	false, false, false>,	2	},
	};

	{ // scalar cases
		const StringTemplate preMain
		(
			"      %c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
			"     %c_i32_hndp = OpSpecConstantOp %i32 SDiv %c_i32_ndp %c_i32_2\n"
			"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
			" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n"
			"            %f16 = OpTypeFloat 16\n"
			"          %v2f16 = OpTypeVector %f16 2\n"
			"        %c_f16_0 = OpConstant %f16 0.0\n"
			"        %c_f16_1 = OpConstant %f16 1.0\n"
			"         %up_u32 = OpTypePointer Uniform %u32\n"
			"         %ra_u32 = OpTypeArray %u32 %c_i32_hndp\n"
			"         %SSBO16 = OpTypeStruct %ra_u32\n"
			"      %up_SSBO16 = OpTypePointer Uniform %SSBO16\n"
			"     %f16_i32_fn = OpTypeFunction %f16 %i32\n"
			"%void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
			"      %ssbo_src0 = OpVariable %up_SSBO16 Uniform\n"
			"      %ssbo_src1 = OpVariable %up_SSBO16 Uniform\n"
			"       %ssbo_dst = OpVariable %up_SSBO16 Uniform\n"
		);

		const StringTemplate decoration
		(
			"OpDecorate %ra_u32 ArrayStride 4\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpDecorate %SSBO16 BufferBlock\n"
			"OpDecorate %ssbo_src0 DescriptorSet 0\n"
			"OpDecorate %ssbo_src0 Binding 0\n"
			"OpDecorate %ssbo_src1 DescriptorSet 0\n"
			"OpDecorate %ssbo_src1 Binding 1\n"
			"OpDecorate %ssbo_dst DescriptorSet 0\n"
			"OpDecorate %ssbo_dst Binding 2\n"
		);

		const StringTemplate testFun
		(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"    %entry = OpLabel\n"
			"        %i = OpVariable %fp_i32 Function\n"
			"             OpStore %i %c_i32_0\n"
			"             OpBranch %loop\n"

			"     %loop = OpLabel\n"
			"    %i_cmp = OpLoad %i32 %i\n"
			"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
			"             OpLoopMerge %merge %next None\n"
			"             OpBranchConditional %lt %write %merge\n"

			"    %write = OpLabel\n"
			"      %ndx = OpLoad %i32 %i\n"

			" %val_src0 = OpFunctionCall %f16 %ld_arg_ssbo_src0 %ndx\n"

			"${op_arg1_calc}"

			" %val_bdst = ${op_code} %bool %val_src0 ${op_arg1}\n"
			"  %val_dst = OpSelect %f16 %val_bdst %c_f16_1 %c_f16_0\n"
			"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n"
			"             OpBranch %next\n"

			"     %next = OpLabel\n"
			"    %i_cur = OpLoad %i32 %i\n"
			"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
			"             OpStore %i %i_new\n"
			"             OpBranch %loop\n"

			"    %merge = OpLabel\n"
			"             OpReturnValue %param\n"

			"             OpFunctionEnd\n"
		);

		const StringTemplate arg1Calc
		(
			" %val_src1 = OpFunctionCall %f16 %ld_arg_ssbo_src1 %ndx\n"
		);

		for (deUint32 testOpsIdx = 0; testOpsIdx < DE_LENGTH_OF_ARRAY(testOps); ++testOpsIdx)
		{
			const size_t		iterations		= float16Data1.size();
			const TestOp&		testOp			= testOps[testOpsIdx];
			const string		testName		= de::toLower(string(testOp.opCode)) + "_scalar";
			SpecResource		specResource;
			map<string, string>	specs;
			VulkanFeatures		features;
			map<string, string>	fragments;
			vector<string>		extensions;

			specs["num_data_points"]	= de::toString(iterations);
			specs["op_code"]			= testOp.opCode;
			specs["op_arg1"]			= (testOp.argCount == 1) ? "" : "%val_src1";
			specs["op_arg1_calc"]		= (testOp.argCount == 1) ? "" : arg1Calc.specialize(specs);

			fragments["extension"]		= spvExtensions;
			fragments["capability"]		= spvCapabilities;
			fragments["execution_mode"]	= spvExecutionMode;
			fragments["decoration"]		= decoration.specialize(specs);
			fragments["pre_main"]		= preMain.specialize(specs);
			fragments["testfun"]		= testFun.specialize(specs);
			fragments["testfun"]		+= StringTemplate(loadScalarF16FromUint).specialize({{"var", "ssbo_src0"}});
			if (testOp.argCount > 1)
			{
				fragments["testfun"]	+= StringTemplate(loadScalarF16FromUint).specialize({{"var", "ssbo_src1"}});
			}
			fragments["testfun"]		+= StringTemplate(storeScalarF16AsUint).specialize({{"var", "ssbo_dst"}});

			specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16Data1)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16Data2)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16OutDummy)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			specResource.verifyIO = nanSupported ? testOp.verifyFuncNan : testOp.verifyFuncNonNan;

			extensions.push_back("VK_KHR_shader_float16_int8");

			if (nanSupported)
			{
				extensions.push_back("VK_KHR_shader_float_controls");

				features.floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 = DE_TRUE;
			}

			features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;

			finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
		}
	}
	{ // vector cases
		const StringTemplate preMain
		(
			"        %c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
			"           %v2bool = OpTypeVector %bool 2\n"
			"              %f16 = OpTypeFloat 16\n"
			"          %c_f16_0 = OpConstant %f16 0.0\n"
			"          %c_f16_1 = OpConstant %f16 1.0\n"
			"            %v2f16 = OpTypeVector %f16 2\n"
			"      %c_v2f16_0_0 = OpConstantComposite %v2f16 %c_f16_0 %c_f16_0\n"
			"      %c_v2f16_1_1 = OpConstantComposite %v2f16 %c_f16_1 %c_f16_1\n"
			"           %up_u32 = OpTypePointer Uniform %u32\n"
			"           %ra_u32 = OpTypeArray %u32 %c_i32_ndp\n"
			"           %SSBO16 = OpTypeStruct %ra_u32\n"
			"        %up_SSBO16 = OpTypePointer Uniform %SSBO16\n"
			"     %v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
			"%void_v2f16_i32_fn = OpTypeFunction %void %v2f16 %i32\n"
			"        %ssbo_src0 = OpVariable %up_SSBO16 Uniform\n"
			"        %ssbo_src1 = OpVariable %up_SSBO16 Uniform\n"
			"         %ssbo_dst = OpVariable %up_SSBO16 Uniform\n"
		);

		const StringTemplate decoration
		(
			"OpDecorate %ra_u32 ArrayStride 4\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpDecorate %SSBO16 BufferBlock\n"
			"OpDecorate %ssbo_src0 DescriptorSet 0\n"
			"OpDecorate %ssbo_src0 Binding 0\n"
			"OpDecorate %ssbo_src1 DescriptorSet 0\n"
			"OpDecorate %ssbo_src1 Binding 1\n"
			"OpDecorate %ssbo_dst DescriptorSet 0\n"
			"OpDecorate %ssbo_dst Binding 2\n"
		);

		const StringTemplate testFun
		(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"    %entry = OpLabel\n"
			"        %i = OpVariable %fp_i32 Function\n"
			"             OpStore %i %c_i32_0\n"
			"             OpBranch %loop\n"

			"     %loop = OpLabel\n"
			"    %i_cmp = OpLoad %i32 %i\n"
			"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
			"             OpLoopMerge %merge %next None\n"
			"             OpBranchConditional %lt %write %merge\n"

			"    %write = OpLabel\n"
			"      %ndx = OpLoad %i32 %i\n"

			" %val_src0 = OpFunctionCall %v2f16 %ld_arg_ssbo_src0 %ndx\n"

			"${op_arg1_calc}"

			" %val_bdst = ${op_code} %v2bool %val_src0 ${op_arg1}\n"
			"  %val_dst = OpSelect %v2f16 %val_bdst %c_v2f16_1_1 %c_v2f16_0_0\n"
			"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n"
			"             OpBranch %next\n"

			"     %next = OpLabel\n"
			"    %i_cur = OpLoad %i32 %i\n"
			"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
			"             OpStore %i %i_new\n"
			"             OpBranch %loop\n"

			"    %merge = OpLabel\n"
			"             OpReturnValue %param\n"

			"             OpFunctionEnd\n"
		);

		const StringTemplate arg1Calc
		(
			" %val_src1 = OpFunctionCall %v2f16 %ld_arg_ssbo_src1 %ndx\n"
		);

		for (deUint32 testOpsIdx = 0; testOpsIdx < DE_LENGTH_OF_ARRAY(testOps); ++testOpsIdx)
		{
			const deUint32		itemsPerVec	= 2;
			const size_t		iterations	= float16DataVec1.size() / itemsPerVec;
			const TestOp&		testOp		= testOps[testOpsIdx];
			const string		testName	= de::toLower(string(testOp.opCode)) + "_vector";
			SpecResource		specResource;
			map<string, string>	specs;
			vector<string>		extensions;
			VulkanFeatures		features;
			map<string, string>	fragments;

			specs["num_data_points"]	= de::toString(iterations);
			specs["op_code"]			= testOp.opCode;
			specs["op_arg1"]			= (testOp.argCount == 1) ? "" : "%val_src1";
			specs["op_arg1_calc"]		= (testOp.argCount == 1) ? "" : arg1Calc.specialize(specs);

			fragments["extension"]		= spvExtensions;
			fragments["capability"]		= spvCapabilities;
			fragments["execution_mode"]	= spvExecutionMode;
			fragments["decoration"]		= decoration.specialize(specs);
			fragments["pre_main"]		= preMain.specialize(specs);
			fragments["testfun"]		= testFun.specialize(specs);
			fragments["testfun"]		+= StringTemplate(loadV2F16FromUint).specialize({{"var", "ssbo_src0"}});
			if (testOp.argCount > 1)
			{
				fragments["testfun"]	+= StringTemplate(loadV2F16FromUint).specialize({{"var", "ssbo_src1"}});
			}
			fragments["testfun"]		+= StringTemplate(storeV2F16AsUint).specialize({{"var", "ssbo_dst"}});

			specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16DataVec1)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16DataVec2)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16OutVecDummy)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			specResource.verifyIO = nanSupported ? testOp.verifyFuncNan : testOp.verifyFuncNonNan;

			extensions.push_back("VK_KHR_shader_float16_int8");

			if (nanSupported)
			{
				extensions.push_back("VK_KHR_shader_float_controls");

				features.floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 = DE_TRUE;
			}

			features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;

			finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1), true);
		}
	}

	return testGroup.release();
}

bool compareFP16FunctionSetFunc (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>&, TestLog& log)
{
	if (inputs.size() != 1 || outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;

	inputs[0].getBytes(input1Bytes);

	const deUint16* const	input1AsFP16	= (const deUint16*)&input1Bytes[0];
	const deUint16* const	outputAsFP16	= (const deUint16*)outputAllocs[0]->getHostPtr();
	std::string				error;

	for (size_t idx = 0; idx < input1Bytes.size() / sizeof(deUint16); ++idx)
	{
		if (!compare16BitFloat(input1AsFP16[idx], outputAsFP16[idx], error))
		{
			log << TestLog::Message << error << TestLog::EndMessage;

			return false;
		}
	}

	return true;
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16FuncSet (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "function", "Float 16 function call related tests"));

	de::Random							rnd					(deStringHash(testGroup->getName()));
	const StringTemplate				capabilities		("OpCapability Float16\n");
	const deUint32						numDataPoints		= 256;
	const vector<deFloat16>				float16InputData	= getFloat16s(rnd, numDataPoints);
	const vector<deFloat16>				float16OutputDummy	(float16InputData.size(), 0);
	map<string, string>					fragments;

	struct TestType
	{
		const deUint32	typeComponents;
		const char*		typeName;
		const char*		typeDecls;
		const char*		typeStorage;
		const string		loadFunc;
		const string		storeFunc;
	};

	const TestType	testTypes[]	=
	{
		{
			1,
			"f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"%f16_i32_fn = OpTypeFunction %f16 %i32\n"
			"%void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
			"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
			" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n",
			"u32_hndp",
			loadScalarF16FromUint,
			storeScalarF16AsUint
		},
		{
			2,
			"v2f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"  %c_v2f16_0 = OpConstantComposite %v2f16 %c_f16_0 %c_f16_0\n"
			"%v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
			"%void_v2f16_i32_fn = OpTypeFunction %void %v2f16 %i32\n",
			"u32_ndp",
			loadV2F16FromUint,
			storeV2F16AsUint
		},
		{
			4,
			"v4f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"      %v4f16 = OpTypeVector %f16 4\n"
			"  %c_v4f16_0 = OpConstantComposite %v4f16 %c_f16_0 %c_f16_0 %c_f16_0 %c_f16_0\n"
			"%v4f16_i32_fn = OpTypeFunction %v4f16 %i32\n"
			"%void_v4f16_i32_fn = OpTypeFunction %void %v4f16 %i32\n",
			"ra_u32_2",
			loadV4F16FromUints,
			storeV4F16AsUints
		},
	};

	const StringTemplate preMain
	(
		"  %c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
		" %c_i32_hndp = OpSpecConstantOp %i32 SDiv %c_i32_ndp %c_i32_2\n"
		"     %v2bool = OpTypeVector %bool 2\n"
		"        %f16 = OpTypeFloat 16\n"
		"    %c_f16_0 = OpConstant %f16 0.0\n"

		"${type_decls}"

		"  %${tt}_fun = OpTypeFunction %${tt} %${tt}\n"
		"   %ra_u32_2 = OpTypeArray %u32 %c_u32_2\n"
		"%ra_u32_hndp = OpTypeArray %u32 %c_i32_hndp\n"
		" %ra_u32_ndp = OpTypeArray %u32 %c_i32_ndp\n"
		"%ra_ra_u32_2 = OpTypeArray %ra_u32_2 %c_i32_ndp\n"
		"	  %up_u32 = OpTypePointer Uniform %u32\n"
		"     %SSBO16 = OpTypeStruct %ra_${ts}\n"
		"  %up_SSBO16 = OpTypePointer Uniform %SSBO16\n"
		"   %ssbo_src = OpVariable %up_SSBO16 Uniform\n"
		"   %ssbo_dst = OpVariable %up_SSBO16 Uniform\n"
	);

	const StringTemplate decoration
	(
		"OpDecorate %ra_u32_2 ArrayStride 4\n"
		"OpDecorate %ra_u32_hndp ArrayStride 4\n"
		"OpDecorate %ra_u32_ndp ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_2 ArrayStride 8\n"
		"OpMemberDecorate %SSBO16 0 Offset 0\n"
		"OpDecorate %SSBO16 BufferBlock\n"
		"OpDecorate %ssbo_src DescriptorSet 0\n"
		"OpDecorate %ssbo_src Binding 0\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 1\n"
	);

	const StringTemplate testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"
		"    %entry = OpLabel\n"

		"        %i = OpVariable %fp_i32 Function\n"
		"             OpStore %i %c_i32_0\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"

		"  %val_src = OpFunctionCall %${tt} %ld_arg_ssbo_src %ndx\n"
		"  %val_dst = OpFunctionCall %${tt} %pass_fun %val_src\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n"
		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpReturnValue %param\n"

		"             OpFunctionEnd\n"

		" %pass_fun = OpFunction %${tt} None %${tt}_fun\n"
		"   %param0 = OpFunctionParameter %${tt}\n"
		" %entry_pf = OpLabel\n"
		"     %res0 = OpFAdd %${tt} %param0 %c_${tt}_0\n"
		"             OpReturnValue %res0\n"
		"             OpFunctionEnd\n"
	);

	for (deUint32 testTypeIdx = 0; testTypeIdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeIdx)
	{
		const TestType&		testType		= testTypes[testTypeIdx];
		const string		testName		= testType.typeName;
		const deUint32		itemsPerType	= testType.typeComponents;
		const size_t		iterations		= float16InputData.size() / itemsPerType;
		const size_t		typeStride		= itemsPerType * sizeof(deFloat16);
		SpecResource		specResource;
		map<string, string>	specs;
		VulkanFeatures		features;
		vector<string>		extensions;

		specs["num_data_points"]	= de::toString(iterations);
		specs["tt"]					= testType.typeName;
		specs["ts"]					= testType.typeStorage;
		specs["tt_stride"]			= de::toString(typeStride);
		specs["type_decls"]			= testType.typeDecls;

		fragments["capability"]		= capabilities.specialize(specs);
		fragments["decoration"]		= decoration.specialize(specs);
		fragments["pre_main"]		= preMain.specialize(specs);
		fragments["testfun"]		= testFun.specialize(specs);
		fragments["testfun"]		+= StringTemplate(testType.loadFunc).specialize({{"var", "ssbo_src"}});
		fragments["testfun"]		+= StringTemplate(testType.storeFunc).specialize({{"var", "ssbo_dst"}});

		specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16InputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16OutputDummy)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.verifyIO = compareFP16FunctionSetFunc;

		extensions.push_back("VK_KHR_shader_float16_int8");

		features.extFloat16Int8	= EXTFLOAT16INT8FEATURES_FLOAT16;

		finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
	}

	return testGroup.release();
}

bool compareFP16VectorExtractFunc (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>&, TestLog& log)
{
	if (inputs.size() != 2 || outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;
	vector<deUint8>	input2Bytes;

	inputs[0].getBytes(input1Bytes);
	inputs[1].getBytes(input2Bytes);

	DE_ASSERT(input1Bytes.size() > 0);
	DE_ASSERT(input2Bytes.size() > 0);
	DE_ASSERT(input2Bytes.size() % sizeof(deUint32) == 0);

	const size_t			iterations		= input2Bytes.size() / sizeof(deUint32);
	const size_t			components		= input1Bytes.size() / (sizeof(deFloat16) * iterations);
	const deFloat16* const	input1AsFP16	= (const deFloat16*)&input1Bytes[0];
	const deUint32* const	inputIndices	= (const deUint32*)&input2Bytes[0];
	const deFloat16* const	outputAsFP16	= (const deFloat16*)outputAllocs[0]->getHostPtr();
	std::string				error;

	DE_ASSERT(components == 2 || components == 4);
	DE_ASSERT(input1Bytes.size() == iterations * components * sizeof(deFloat16));

	for (size_t idx = 0; idx < iterations; ++idx)
	{
		const deUint32	componentNdx	= inputIndices[idx];

		DE_ASSERT(componentNdx < components);

		const deFloat16	expected		= input1AsFP16[components * idx + componentNdx];

		if (!compare16BitFloat(expected, outputAsFP16[idx], error))
		{
			log << TestLog::Message << "At " << idx << error << TestLog::EndMessage;

			return false;
		}
	}

	return true;
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16VectorExtractSet (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "opvectorextractdynamic", "OpVectorExtractDynamic tests"));

	de::Random							rnd					(deStringHash(testGroup->getName()));
	const deUint32						numDataPoints		= 256;
	const vector<deFloat16>				float16InputData	= getFloat16s(rnd, numDataPoints);
	const vector<deFloat16>				float16OutputDummy	(float16InputData.size(), 0);

	struct TestType
	{
		const deUint32	typeComponents;
		const size_t	typeStride;
		const char*		typeName;
		const char*		typeDecls;
		const char*		typeStorage;
		const string		loadFunction;
		const string		storeFunction;
	};

	const TestType	testTypes[]	=
	{
		{
			2,
			2 * sizeof(deFloat16),
			"v2f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"%v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
			"%void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
			"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
			" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n",
			"u32",
			loadV2F16FromUint,
			storeScalarF16AsUint
		},
		{
			3,
			4 * sizeof(deFloat16),
			"v3f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"      %v3f16 = OpTypeVector %f16 3\n"
			"%v3f16_i32_fn = OpTypeFunction %v3f16 %i32\n"
			"%void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
			"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
			" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n",
			"ra_u32_2",
			loadV3F16FromUints,
			storeScalarF16AsUint
		},
		{
			4,
			4 * sizeof(deFloat16),
			"v4f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"      %v4f16 = OpTypeVector %f16 4\n"
			"%v4f16_i32_fn = OpTypeFunction %v4f16 %i32\n"
			"%void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
			"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
			" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n",
			"ra_u32_2",
			loadV4F16FromUints,
			storeScalarF16AsUint
		},
	};

	const StringTemplate preMain
	(
		"  %c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
		" %c_i32_hndp = OpSpecConstantOp %i32 SDiv %c_i32_ndp %c_i32_2\n"
		"        %f16 = OpTypeFloat 16\n"

		"${type_decl}"

		"     %up_u32 = OpTypePointer Uniform %u32\n"
		"     %ra_u32 = OpTypeArray %u32 %c_i32_ndp\n"
		"   %SSBO_IDX = OpTypeStruct %ra_u32\n"
		"%up_SSBO_IDX = OpTypePointer Uniform %SSBO_IDX\n"

		"   %ra_u32_2 = OpTypeArray %u32 %c_u32_2\n"
		" %ra_u32_ndp = OpTypeArray %u32 %c_i32_ndp\n"
		"%ra_ra_u32_2 = OpTypeArray %ra_u32_2 %c_i32_ndp\n"
		"   %SSBO_SRC = OpTypeStruct %ra_${ts}\n"
		"%up_SSBO_SRC = OpTypePointer Uniform %SSBO_SRC\n"

		" %ra_u32_hndp = OpTypeArray %u32 %c_i32_hndp\n"
		"   %SSBO_DST = OpTypeStruct %ra_u32_hndp\n"
		"%up_SSBO_DST = OpTypePointer Uniform %SSBO_DST\n"

		"   %ssbo_src = OpVariable %up_SSBO_SRC Uniform\n"
		"   %ssbo_idx = OpVariable %up_SSBO_IDX Uniform\n"
		"   %ssbo_dst = OpVariable %up_SSBO_DST Uniform\n"
	);

	const StringTemplate decoration
	(
		"OpDecorate %ra_u32_2 ArrayStride 4\n"
		"OpDecorate %ra_u32_hndp ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_2 ArrayStride 8\n"
		"OpMemberDecorate %SSBO_SRC 0 Offset 0\n"
		"OpDecorate %SSBO_SRC BufferBlock\n"
		"OpDecorate %ssbo_src DescriptorSet 0\n"
		"OpDecorate %ssbo_src Binding 0\n"

		"OpDecorate %ra_u32 ArrayStride 4\n"
		"OpMemberDecorate %SSBO_IDX 0 Offset 0\n"
		"OpDecorate %SSBO_IDX BufferBlock\n"
		"OpDecorate %ssbo_idx DescriptorSet 0\n"
		"OpDecorate %ssbo_idx Binding 1\n"

		"OpMemberDecorate %SSBO_DST 0 Offset 0\n"
		"OpDecorate %SSBO_DST BufferBlock\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 2\n"
	);

	const StringTemplate testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"
		"    %entry = OpLabel\n"

		"        %i = OpVariable %fp_i32 Function\n"
		"             OpStore %i %c_i32_0\n"

		" %will_run = OpFunctionCall %bool %isUniqueIdZero\n"
		"             OpSelectionMerge %end_if None\n"
		"             OpBranchConditional %will_run %run_test %end_if\n"

		" %run_test = OpLabel\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"

		"  %val_src = OpFunctionCall %${tt} %ld_arg_ssbo_src %ndx\n"

		"  %src_idx = OpAccessChain %up_u32 %ssbo_idx %c_i32_0 %ndx\n"
		"  %val_idx = OpLoad %u32 %src_idx\n"

		"  %val_dst = OpVectorExtractDynamic %f16 %val_src %val_idx\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n"

		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpBranch %end_if\n"
		"   %end_if = OpLabel\n"
		"             OpReturnValue %param\n"

		"             OpFunctionEnd\n"
	);

	for (deUint32 testTypeIdx = 0; testTypeIdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeIdx)
	{
		const TestType&		testType		= testTypes[testTypeIdx];
		const string		testName		= testType.typeName;
		const size_t		itemsPerType	= testType.typeStride / sizeof(deFloat16);
		const size_t		iterations		= float16InputData.size() / itemsPerType;
		SpecResource		specResource;
		map<string, string>	specs;
		VulkanFeatures		features;
		vector<deUint32>	inputDataNdx;
		map<string, string>	fragments;
		vector<string>		extensions;

		for (deUint32 ndx = 0; ndx < iterations; ++ndx)
			inputDataNdx.push_back(rnd.getUint32() % testType.typeComponents);

		specs["num_data_points"]	= de::toString(iterations);
		specs["tt"]					= testType.typeName;
		specs["ts"]					= testType.typeStorage;
		specs["tt_stride"]			= de::toString(testType.typeStride);
		specs["type_decl"]			= testType.typeDecls;

		fragments["capability"]		= "OpCapability Float16\n";
		fragments["decoration"]		= decoration.specialize(specs);
		fragments["pre_main"]		= preMain.specialize(specs);
		fragments["testfun"]		= testFun.specialize(specs);
		fragments["testfun"]		+= StringTemplate(testType.loadFunction).specialize({{"var", "ssbo_src"}});
		fragments["testfun"]		+= StringTemplate(testType.storeFunction).specialize({{"var", "ssbo_dst"}});

		specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16InputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.inputs.push_back(Resource(BufferSp(new Uint32Buffer(inputDataNdx)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16OutputDummy)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.verifyIO = compareFP16VectorExtractFunc;

		extensions.push_back("VK_KHR_shader_float16_int8");

		features.extFloat16Int8		= EXTFLOAT16INT8FEATURES_FLOAT16;

		finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
	}

	return testGroup.release();
}

template<deUint32 COMPONENTS_COUNT, deUint32 REPLACEMENT>
bool compareFP16VectorInsertFunc (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>&, TestLog& log)
{
	if (inputs.size() != 2 || outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;
	vector<deUint8>	input2Bytes;

	inputs[0].getBytes(input1Bytes);
	inputs[1].getBytes(input2Bytes);

	DE_ASSERT(input1Bytes.size() > 0);
	DE_ASSERT(input2Bytes.size() > 0);
	DE_ASSERT(input2Bytes.size() % sizeof(deUint32) == 0);

	const size_t			iterations			= input2Bytes.size() / sizeof(deUint32);
	const size_t			componentsStride	= input1Bytes.size() / (sizeof(deFloat16) * iterations);
	const deFloat16* const	input1AsFP16		= (const deFloat16*)&input1Bytes[0];
	const deUint32* const	inputIndices		= (const deUint32*)&input2Bytes[0];
	const deFloat16* const	outputAsFP16		= (const deFloat16*)outputAllocs[0]->getHostPtr();
	const deFloat16			magic				= tcu::Float16(float(REPLACEMENT)).bits();
	std::string				error;

	DE_ASSERT(componentsStride == 2 || componentsStride == 4);
	DE_ASSERT(input1Bytes.size() == iterations * componentsStride * sizeof(deFloat16));

	for (size_t idx = 0; idx < iterations; ++idx)
	{
		const deFloat16*	inputVec		= &input1AsFP16[componentsStride * idx];
		const deFloat16*	outputVec		= &outputAsFP16[componentsStride * idx];
		const deUint32		replacedCompNdx	= inputIndices[idx];

		DE_ASSERT(replacedCompNdx < COMPONENTS_COUNT);

		for (size_t compNdx = 0; compNdx < COMPONENTS_COUNT; ++compNdx)
		{
			const deFloat16	expected	= (compNdx == replacedCompNdx) ? magic : inputVec[compNdx];

			if (!compare16BitFloat(expected, outputVec[compNdx], error))
			{
				log << TestLog::Message << "At " << idx << "[" << compNdx << "]: " << error << TestLog::EndMessage;

				return false;
			}
		}
	}

	return true;
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16VectorInsertSet (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "opvectorinsertdynamic", "OpVectorInsertDynamic tests"));

	de::Random							rnd					(deStringHash(testGroup->getName()));
	const deUint32						replacement			= 42;
	const deUint32						numDataPoints		= 256;
	const vector<deFloat16>				float16InputData	= getFloat16s(rnd, numDataPoints);
	const vector<deFloat16>				float16OutputDummy	(float16InputData.size(), 0);

	struct TestType
	{
		const deUint32	typeComponents;
		const size_t	typeStride;
		const char*		typeName;
		const char*		typeDecls;
		VerifyIOFunc	verifyIOFunc;
		const char*		typeStorage;
		const string		loadFunction;
		const string		storeFunction;
	};

	const TestType	testTypes[]	=
	{
		{
			2,
			2 * sizeof(deFloat16),
			"v2f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"%v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
			"%void_v2f16_i32_fn = OpTypeFunction %void %v2f16 %i32\n",
			compareFP16VectorInsertFunc<2, replacement>,
			"u32",
			loadV2F16FromUint,
			storeV2F16AsUint
		},
		{
			3,
			4 * sizeof(deFloat16),
			"v3f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"      %v3f16 = OpTypeVector %f16 3\n"
			"%v3f16_i32_fn = OpTypeFunction %v3f16 %i32\n"
			"%void_v3f16_i32_fn = OpTypeFunction %void %v3f16 %i32\n",
			compareFP16VectorInsertFunc<3, replacement>,
			"ra_u32_2",
			loadV3F16FromUints,
			storeV3F16AsUints
		},
		{
			4,
			4 * sizeof(deFloat16),
			"v4f16",
			"      %v2f16 = OpTypeVector %f16 2\n"
			"      %v4f16 = OpTypeVector %f16 4\n"
			"%v4f16_i32_fn = OpTypeFunction %v4f16 %i32\n"
			"%void_v4f16_i32_fn = OpTypeFunction %void %v4f16 %i32\n",
			compareFP16VectorInsertFunc<4, replacement>,
			"ra_u32_2",
			loadV4F16FromUints,
			storeV4F16AsUints
		},
	};

	const StringTemplate preMain
	(
		"  %c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
		"        %f16 = OpTypeFloat 16\n"
		"  %c_f16_ins = OpConstant %f16 ${replacement}\n"

		"${type_decl}"

		"     %ra_u32 = OpTypeArray %u32 %c_i32_ndp\n"
		"	  %up_u32 = OpTypePointer Uniform %u32\n"
		"   %SSBO_IDX = OpTypeStruct %ra_u32\n"
		"%up_SSBO_IDX = OpTypePointer Uniform %SSBO_IDX\n"

		"   %ra_u32_2 = OpTypeArray %u32 %c_u32_2\n"
		"%ra_ra_u32_2 = OpTypeArray %ra_u32_2 %c_i32_ndp\n"
		"   %SSBO_SRC = OpTypeStruct %ra_${ts}\n"
		"%up_SSBO_SRC = OpTypePointer Uniform %SSBO_SRC\n"

		"   %SSBO_DST = OpTypeStruct %ra_${ts}\n"
		"%up_SSBO_DST = OpTypePointer Uniform %SSBO_DST\n"

		"   %ssbo_src = OpVariable %up_SSBO_SRC Uniform\n"
		"   %ssbo_idx = OpVariable %up_SSBO_IDX Uniform\n"
		"   %ssbo_dst = OpVariable %up_SSBO_DST Uniform\n"
	);

	const StringTemplate decoration
	(
		"OpDecorate %ra_u32_2 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_2 ArrayStride 8\n"
		"OpMemberDecorate %SSBO_SRC 0 Offset 0\n"
		"OpDecorate %SSBO_SRC BufferBlock\n"
		"OpDecorate %ssbo_src DescriptorSet 0\n"
		"OpDecorate %ssbo_src Binding 0\n"

		"OpDecorate %ra_u32 ArrayStride 4\n"
		"OpMemberDecorate %SSBO_IDX 0 Offset 0\n"
		"OpDecorate %SSBO_IDX BufferBlock\n"
		"OpDecorate %ssbo_idx DescriptorSet 0\n"
		"OpDecorate %ssbo_idx Binding 1\n"

		"OpMemberDecorate %SSBO_DST 0 Offset 0\n"
		"OpDecorate %SSBO_DST BufferBlock\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 2\n"
	);

	const StringTemplate testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"
		"    %entry = OpLabel\n"

		"        %i = OpVariable %fp_i32 Function\n"
		"             OpStore %i %c_i32_0\n"

		" %will_run = OpFunctionCall %bool %isUniqueIdZero\n"
		"             OpSelectionMerge %end_if None\n"
		"             OpBranchConditional %will_run %run_test %end_if\n"

		" %run_test = OpLabel\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"

		"  %val_src = OpFunctionCall %${tt} %ld_arg_ssbo_src %ndx\n"

		"  %src_idx = OpAccessChain %up_u32 %ssbo_idx %c_i32_0 %ndx\n"
		"  %val_idx = OpLoad %u32 %src_idx\n"

		"  %val_dst = OpVectorInsertDynamic %${tt} %val_src %c_f16_ins %val_idx\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n"

		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpBranch %end_if\n"
		"   %end_if = OpLabel\n"
		"             OpReturnValue %param\n"

		"             OpFunctionEnd\n"
	);

	for (deUint32 testTypeIdx = 0; testTypeIdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeIdx)
	{
		const TestType&		testType		= testTypes[testTypeIdx];
		const string		testName		= testType.typeName;
		const size_t		itemsPerType	= testType.typeStride / sizeof(deFloat16);
		const size_t		iterations		= float16InputData.size() / itemsPerType;
		SpecResource		specResource;
		map<string, string>	specs;
		VulkanFeatures		features;
		vector<deUint32>	inputDataNdx;
		map<string, string>	fragments;
		vector<string>		extensions;

		for (deUint32 ndx = 0; ndx < iterations; ++ndx)
			inputDataNdx.push_back(rnd.getUint32() % testType.typeComponents);

		specs["num_data_points"]	= de::toString(iterations);
		specs["tt"]					= testType.typeName;
		specs["ts"]					= testType.typeStorage;
		specs["tt_stride"]			= de::toString(testType.typeStride);
		specs["type_decl"]			= testType.typeDecls;
		specs["replacement"]		= de::toString(replacement);

		fragments["capability"]		= "OpCapability Float16\n";
		fragments["decoration"]		= decoration.specialize(specs);
		fragments["pre_main"]		= preMain.specialize(specs);
		fragments["testfun"]		= testFun.specialize(specs);
		fragments["testfun"]		+= StringTemplate(testType.loadFunction).specialize({{"var", "ssbo_src"}});
		fragments["testfun"]		+= StringTemplate(testType.storeFunction).specialize({{"var", "ssbo_dst"}});

		specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16InputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.inputs.push_back(Resource(BufferSp(new Uint32Buffer(inputDataNdx)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16OutputDummy)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.verifyIO = testType.verifyIOFunc;

		extensions.push_back("VK_KHR_shader_float16_int8");

		features.extFloat16Int8		= EXTFLOAT16INT8FEATURES_FLOAT16;

		finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
	}

	return testGroup.release();
}

inline deFloat16 getShuffledComponent (const size_t iteration, const size_t componentNdx, const deFloat16* input1Vec, const deFloat16* input2Vec, size_t vec1Len, size_t vec2Len, bool& validate)
{
	const size_t	compNdxCount	= (vec1Len + vec2Len + 1);
	const size_t	compNdxLimited	= iteration % (compNdxCount * compNdxCount);
	size_t			comp;

	switch (componentNdx)
	{
		case 0: comp = compNdxLimited / compNdxCount; break;
		case 1: comp = compNdxLimited % compNdxCount; break;
		case 2: comp = 0; break;
		case 3: comp = 1; break;
		default: TCU_THROW(InternalError, "Impossible");
	}

	if (comp >= vec1Len + vec2Len)
	{
		validate = false;
		return 0;
	}
	else
	{
		validate = true;
		return (comp < vec1Len) ? input1Vec[comp] : input2Vec[comp - vec1Len];
	}
}

template<deUint32 DST_COMPONENTS_COUNT, deUint32 SRC0_COMPONENTS_COUNT, deUint32 SRC1_COMPONENTS_COUNT>
bool compareFP16VectorShuffleFunc (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>&, TestLog& log)
{
	DE_STATIC_ASSERT(DST_COMPONENTS_COUNT == 2 || DST_COMPONENTS_COUNT == 3 || DST_COMPONENTS_COUNT == 4);
	DE_STATIC_ASSERT(SRC0_COMPONENTS_COUNT == 2 || SRC0_COMPONENTS_COUNT == 3 || SRC0_COMPONENTS_COUNT == 4);
	DE_STATIC_ASSERT(SRC1_COMPONENTS_COUNT == 2 || SRC1_COMPONENTS_COUNT == 3 || SRC1_COMPONENTS_COUNT == 4);

	if (inputs.size() != 2 || outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;
	vector<deUint8>	input2Bytes;

	inputs[0].getBytes(input1Bytes);
	inputs[1].getBytes(input2Bytes);

	DE_ASSERT(input1Bytes.size() > 0);
	DE_ASSERT(input2Bytes.size() > 0);
	DE_ASSERT(input2Bytes.size() % sizeof(deFloat16) == 0);

	const size_t			componentsStrideDst		= (DST_COMPONENTS_COUNT == 3) ? 4 : DST_COMPONENTS_COUNT;
	const size_t			componentsStrideSrc0	= (SRC0_COMPONENTS_COUNT == 3) ? 4 : SRC0_COMPONENTS_COUNT;
	const size_t			componentsStrideSrc1	= (SRC1_COMPONENTS_COUNT == 3) ? 4 : SRC1_COMPONENTS_COUNT;
	const size_t			iterations				= input1Bytes.size() / (componentsStrideSrc0 * sizeof(deFloat16));
	const deFloat16* const	input1AsFP16			= (const deFloat16*)&input1Bytes[0];
	const deFloat16* const	input2AsFP16			= (const deFloat16*)&input2Bytes[0];
	const deFloat16* const	outputAsFP16			= (const deFloat16*)outputAllocs[0]->getHostPtr();
	std::string				error;

	DE_ASSERT(input1Bytes.size() == iterations * componentsStrideSrc0 * sizeof(deFloat16));
	DE_ASSERT(input2Bytes.size() == iterations * componentsStrideSrc1 * sizeof(deFloat16));

	for (size_t idx = 0; idx < iterations; ++idx)
	{
		const deFloat16*	input1Vec	= &input1AsFP16[componentsStrideSrc0 * idx];
		const deFloat16*	input2Vec	= &input2AsFP16[componentsStrideSrc1 * idx];
		const deFloat16*	outputVec	= &outputAsFP16[componentsStrideDst * idx];

		for (size_t compNdx = 0; compNdx < DST_COMPONENTS_COUNT; ++compNdx)
		{
			bool		validate	= true;
			deFloat16	expected	= getShuffledComponent(idx, compNdx, input1Vec, input2Vec, SRC0_COMPONENTS_COUNT, SRC1_COMPONENTS_COUNT, validate);

			if (validate && !compare16BitFloat(expected, outputVec[compNdx], error))
			{
				log << TestLog::Message << "At " << idx << "[" << compNdx << "]: " << error << TestLog::EndMessage;

				return false;
			}
		}
	}

	return true;
}

VerifyIOFunc getFloat16VectorShuffleVerifyIOFunc (deUint32 dstComponentsCount, deUint32 src0ComponentsCount, deUint32 src1ComponentsCount)
{
	DE_ASSERT(dstComponentsCount <= 4);
	DE_ASSERT(src0ComponentsCount <= 4);
	DE_ASSERT(src1ComponentsCount <= 4);
	deUint32 funcCode = 100 * dstComponentsCount + 10 * src0ComponentsCount + src1ComponentsCount;

	switch (funcCode)
	{
		case 222:return compareFP16VectorShuffleFunc<2, 2, 2>;
		case 223:return compareFP16VectorShuffleFunc<2, 2, 3>;
		case 224:return compareFP16VectorShuffleFunc<2, 2, 4>;
		case 232:return compareFP16VectorShuffleFunc<2, 3, 2>;
		case 233:return compareFP16VectorShuffleFunc<2, 3, 3>;
		case 234:return compareFP16VectorShuffleFunc<2, 3, 4>;
		case 242:return compareFP16VectorShuffleFunc<2, 4, 2>;
		case 243:return compareFP16VectorShuffleFunc<2, 4, 3>;
		case 244:return compareFP16VectorShuffleFunc<2, 4, 4>;
		case 322:return compareFP16VectorShuffleFunc<3, 2, 2>;
		case 323:return compareFP16VectorShuffleFunc<3, 2, 3>;
		case 324:return compareFP16VectorShuffleFunc<3, 2, 4>;
		case 332:return compareFP16VectorShuffleFunc<3, 3, 2>;
		case 333:return compareFP16VectorShuffleFunc<3, 3, 3>;
		case 334:return compareFP16VectorShuffleFunc<3, 3, 4>;
		case 342:return compareFP16VectorShuffleFunc<3, 4, 2>;
		case 343:return compareFP16VectorShuffleFunc<3, 4, 3>;
		case 344:return compareFP16VectorShuffleFunc<3, 4, 4>;
		case 422:return compareFP16VectorShuffleFunc<4, 2, 2>;
		case 423:return compareFP16VectorShuffleFunc<4, 2, 3>;
		case 424:return compareFP16VectorShuffleFunc<4, 2, 4>;
		case 432:return compareFP16VectorShuffleFunc<4, 3, 2>;
		case 433:return compareFP16VectorShuffleFunc<4, 3, 3>;
		case 434:return compareFP16VectorShuffleFunc<4, 3, 4>;
		case 442:return compareFP16VectorShuffleFunc<4, 4, 2>;
		case 443:return compareFP16VectorShuffleFunc<4, 4, 3>;
		case 444:return compareFP16VectorShuffleFunc<4, 4, 4>;
		default: TCU_THROW(InternalError, "Invalid number of components specified.");
	}
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16VectorShuffleSet (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "opvectorshuffle", "OpVectorShuffle tests"));
	const int							testSpecificSeed	= deStringHash(testGroup->getName());
	const int							seed				= testCtx.getCommandLine().getBaseSeed() ^ testSpecificSeed;
	de::Random							rnd					(seed);
	const deUint32						numDataPoints		= 128;
	map<string, string>					fragments;

	struct TestType
	{
		const deUint32	typeComponents;
		const char*		typeName;
		const string	loadFunction;
		const string	storeFunction;
	};

	const TestType	testTypes[]	=
	{
		{
			2,
			"v2f16",
			loadV2F16FromUint,
			storeV2F16AsUint
		},
		{
			3,
			"v3f16",
			loadV3F16FromUints,
			storeV3F16AsUints
		},
		{
			4,
			"v4f16",
			loadV4F16FromUints,
			storeV4F16AsUints
		},
	};

	const StringTemplate preMain
	(
		"    %c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
		"     %c_i32_cc = OpConstant %i32 ${case_count}\n"
		"          %f16 = OpTypeFloat 16\n"
		"        %v2f16 = OpTypeVector %f16 2\n"
		"        %v3f16 = OpTypeVector %f16 3\n"
		"        %v4f16 = OpTypeVector %f16 4\n"

		"     %v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
		"     %v3f16_i32_fn = OpTypeFunction %v3f16 %i32\n"
		"     %v4f16_i32_fn = OpTypeFunction %v4f16 %i32\n"
		"%void_v2f16_i32_fn = OpTypeFunction %void %v2f16 %i32\n"
		"%void_v3f16_i32_fn = OpTypeFunction %void %v3f16 %i32\n"
		"%void_v4f16_i32_fn = OpTypeFunction %void %v4f16 %i32\n"

		"     %ra_u32_2 = OpTypeArray %u32 %c_u32_2\n"
		"   %ra_u32_ndp = OpTypeArray %u32 %c_i32_ndp\n"
		"  %ra_ra_u32_2 = OpTypeArray %ra_u32_2 %c_i32_ndp\n"
		"       %up_u32 = OpTypePointer Uniform %u32\n"
		"   %SSBO_v2f16 = OpTypeStruct %ra_u32_ndp\n"
		"   %SSBO_v3f16 = OpTypeStruct %ra_ra_u32_2\n"
		"   %SSBO_v4f16 = OpTypeStruct %ra_ra_u32_2\n"

		"%up_SSBO_v2f16 = OpTypePointer Uniform %SSBO_v2f16\n"
		"%up_SSBO_v3f16 = OpTypePointer Uniform %SSBO_v3f16\n"
		"%up_SSBO_v4f16 = OpTypePointer Uniform %SSBO_v4f16\n"

		"        %fun_t = OpTypeFunction %${tt_dst} %${tt_src0} %${tt_src1} %i32\n"

		"    %ssbo_src0 = OpVariable %up_SSBO_${tt_src0} Uniform\n"
		"    %ssbo_src1 = OpVariable %up_SSBO_${tt_src1} Uniform\n"
		"     %ssbo_dst = OpVariable %up_SSBO_${tt_dst} Uniform\n"
	);

	const StringTemplate decoration
	(
		"OpDecorate %ra_u32_2 ArrayStride 4\n"
		"OpDecorate %ra_u32_ndp ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_2 ArrayStride 8\n"

		"OpMemberDecorate %SSBO_v2f16 0 Offset 0\n"
		"OpDecorate %SSBO_v2f16 BufferBlock\n"

		"OpMemberDecorate %SSBO_v3f16 0 Offset 0\n"
		"OpDecorate %SSBO_v3f16 BufferBlock\n"

		"OpMemberDecorate %SSBO_v4f16 0 Offset 0\n"
		"OpDecorate %SSBO_v4f16 BufferBlock\n"

		"OpDecorate %ssbo_src0 DescriptorSet 0\n"
		"OpDecorate %ssbo_src0 Binding 0\n"
		"OpDecorate %ssbo_src1 DescriptorSet 0\n"
		"OpDecorate %ssbo_src1 Binding 1\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 2\n"
	);

	const StringTemplate testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"
		"    %entry = OpLabel\n"

		"        %i = OpVariable %fp_i32 Function\n"
		"             OpStore %i %c_i32_0\n"

		" %will_run = OpFunctionCall %bool %isUniqueIdZero\n"
		"             OpSelectionMerge %end_if None\n"
		"             OpBranchConditional %will_run %run_test %end_if\n"

		" %run_test = OpLabel\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"
		" %val_src0 = OpFunctionCall %${tt_src0} %ld_arg_ssbo_src0 %ndx\n"
		" %val_src1 = OpFunctionCall %${tt_src1} %ld_arg_ssbo_src1 %ndx\n"
		"  %val_dst = OpFunctionCall %${tt_dst} %sw_fun %val_src0 %val_src1 %ndx\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n"
		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpBranch %end_if\n"
		"   %end_if = OpLabel\n"
		"             OpReturnValue %param\n"
		"             OpFunctionEnd\n"
		"\n"

		"   %sw_fun = OpFunction %${tt_dst} None %fun_t\n"
		"%sw_param0 = OpFunctionParameter %${tt_src0}\n"
		"%sw_param1 = OpFunctionParameter %${tt_src1}\n"
		"%sw_paramn = OpFunctionParameter %i32\n"
		" %sw_entry = OpLabel\n"
		"   %modulo = OpSMod %i32 %sw_paramn %c_i32_cc\n"
		"             OpSelectionMerge %switch_e None\n"
		"             OpSwitch %modulo %default ${case_list}\n"
		"${case_bodies}"
		"%default   = OpLabel\n"
		"             OpUnreachable\n" // Unreachable default case for switch statement
		"%switch_e  = OpLabel\n"
		"             OpUnreachable\n" // Unreachable merge block for switch statement
		"             OpFunctionEnd\n"
	);

	const StringTemplate testCaseBody
	(
		"%case_${case_ndx}    = OpLabel\n"
		"%val_dst_${case_ndx} = OpVectorShuffle %${tt_dst} %sw_param0 %sw_param1 ${shuffle}\n"
		"             OpReturnValue %val_dst_${case_ndx}\n"
	);

	for (deUint32 dstTypeIdx = 0; dstTypeIdx < DE_LENGTH_OF_ARRAY(testTypes); ++dstTypeIdx)
	{
		const TestType&	dstType			= testTypes[dstTypeIdx];

		for (deUint32 comp0Idx = 0; comp0Idx < DE_LENGTH_OF_ARRAY(testTypes); ++comp0Idx)
		{
			const TestType&	src0Type	= testTypes[comp0Idx];

			for (deUint32 comp1Idx = 0; comp1Idx < DE_LENGTH_OF_ARRAY(testTypes); ++comp1Idx)
			{
				const TestType&			src1Type			= testTypes[comp1Idx];
				const deUint32			input0Stride		= (src0Type.typeComponents == 3) ? 4 : src0Type.typeComponents;
				const deUint32			input1Stride		= (src1Type.typeComponents == 3) ? 4 : src1Type.typeComponents;
				const deUint32			outputStride		= (dstType.typeComponents == 3) ? 4 : dstType.typeComponents;
				const vector<deFloat16>	float16Input0Data	= getFloat16s(rnd, input0Stride * numDataPoints);
				const vector<deFloat16>	float16Input1Data	= getFloat16s(rnd, input1Stride * numDataPoints);
				const vector<deFloat16>	float16OutputDummy	(outputStride * numDataPoints, 0);
				const string			testName			= de::toString(dstType.typeComponents) + de::toString(src0Type.typeComponents) + de::toString(src1Type.typeComponents);
				deUint32				caseCount			= 0;
				SpecResource			specResource;
				map<string, string>		specs;
				vector<string>			extensions;
				VulkanFeatures			features;
				string					caseBodies;
				string					caseList;

				// Generate case
				{
					vector<string>	componentList;

					// Generate component possible indices for OpVectorShuffle for components 0 and 1 in output vector
					{
						deUint32		caseNo		= 0;

						for (deUint32 comp0IdxLocal = 0; comp0IdxLocal < src0Type.typeComponents; ++comp0IdxLocal)
							componentList.push_back(de::toString(caseNo++));
						for (deUint32 comp1IdxLocal = 0; comp1IdxLocal < src1Type.typeComponents; ++comp1IdxLocal)
							componentList.push_back(de::toString(caseNo++));
						componentList.push_back("0xFFFFFFFF");
					}

					for (deUint32 comp0IdxLocal = 0; comp0IdxLocal < componentList.size(); ++comp0IdxLocal)
					{
						for (deUint32 comp1IdxLocal = 0; comp1IdxLocal < componentList.size(); ++comp1IdxLocal)
						{
							map<string, string>	specCase;
							string				shuffle		= componentList[comp0IdxLocal] + " " + componentList[comp1IdxLocal];

							for (deUint32 compIdx = 2; compIdx < dstType.typeComponents; ++compIdx)
								shuffle += " " + de::toString(compIdx - 2);

							specCase["case_ndx"]	= de::toString(caseCount);
							specCase["shuffle"]		= shuffle;
							specCase["tt_dst"]		= dstType.typeName;

							caseBodies	+= testCaseBody.specialize(specCase);
							caseList	+= de::toString(caseCount) + " %case_" + de::toString(caseCount) + " ";

							caseCount++;
						}
					}
				}

				specs["num_data_points"]	= de::toString(numDataPoints);
				specs["tt_dst"]				= dstType.typeName;
				specs["tt_src0"]			= src0Type.typeName;
				specs["tt_src1"]			= src1Type.typeName;
				specs["case_bodies"]		= caseBodies;
				specs["case_list"]			= caseList;
				specs["case_count"]			= de::toString(caseCount);

				fragments["capability"]		= "OpCapability Float16\n";
				fragments["decoration"]		= decoration.specialize(specs);
				fragments["pre_main"]		= preMain.specialize(specs);
				fragments["testfun"]		= testFun.specialize(specs);
				fragments["testfun"]		+= StringTemplate(src0Type.loadFunction).specialize({{"var", "ssbo_src0"}});
				fragments["testfun"]		+= StringTemplate(src1Type.loadFunction).specialize({{"var", "ssbo_src1"}});
				fragments["testfun"]		+= StringTemplate(dstType.storeFunction).specialize({{"var", "ssbo_dst"}});

				specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16Input0Data)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
				specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(float16Input1Data)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
				specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16OutputDummy)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
				specResource.verifyIO = getFloat16VectorShuffleVerifyIOFunc(dstType.typeComponents, src0Type.typeComponents, src1Type.typeComponents);

				extensions.push_back("VK_KHR_shader_float16_int8");

				features.extFloat16Int8		= EXTFLOAT16INT8FEATURES_FLOAT16;

				finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
			}
		}
	}

	return testGroup.release();
}

bool compareFP16CompositeFunc (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>&, TestLog& log)
{
	if (inputs.size() != 1 || outputAllocs.size() != 1)
		return false;

	vector<deUint8>	input1Bytes;

	inputs[0].getBytes(input1Bytes);

	DE_ASSERT(input1Bytes.size() > 0);
	DE_ASSERT(input1Bytes.size() % sizeof(deFloat16) == 0);

	const size_t			iterations		= input1Bytes.size() / sizeof(deFloat16);
	const deFloat16* const	input1AsFP16	= (const deFloat16*)&input1Bytes[0];
	const deFloat16* const	outputAsFP16	= (const deFloat16*)outputAllocs[0]->getHostPtr();
	const deFloat16			exceptionValue	= tcu::Float16(-1.0).bits();
	std::string				error;

	for (size_t idx = 0; idx < iterations; ++idx)
	{
		if (input1AsFP16[idx] == exceptionValue)
			continue;

		if (!compare16BitFloat(input1AsFP16[idx], outputAsFP16[idx], error))
		{
			log << TestLog::Message << "At " << idx << ":" << error << TestLog::EndMessage;

			return false;
		}
	}

	return true;
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16CompositeConstructSet (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup				(new tcu::TestCaseGroup(testCtx, "opcompositeconstruct", "OpCompositeConstruct tests"));
	const deUint32						numElements				= 8;
	const string						testName				= "struct";
	const deUint32						structItemsCount		= 88;
	const deUint32						exceptionIndices[]		= { 1, 7, 15, 17, 25, 33, 51, 55, 59, 63, 67, 71, 84, 85, 86, 87 };
	const deFloat16						exceptionValue			= tcu::Float16(-1.0).bits();
	const deUint32						fieldModifier			= 2;
	const deUint32						fieldModifiedMulIndex	= 60;
	const deUint32						fieldModifiedAddIndex	= 66;

	const StringTemplate preMain
	(
		"    %c_i32_ndp = OpConstant %i32 ${num_elements}\n"
		"          %f16 = OpTypeFloat 16\n"
		"        %v2f16 = OpTypeVector %f16 2\n"
		"        %v3f16 = OpTypeVector %f16 3\n"
		"        %v4f16 = OpTypeVector %f16 4\n"
		"    %c_f16_mod = OpConstant %f16 ${field_modifier}\n"

		"${consts}"

		"     %c_f16_n1 = OpConstant %f16 -1.0\n"
		"   %c_v2f16_n1 = OpConstantComposite %v2f16 %c_f16_n1 %c_f16_n1\n"
		"      %c_u32_5 = OpConstant %u32 5\n"
		"      %c_u32_6 = OpConstant %u32 6\n"
		"      %c_u32_7 = OpConstant %u32 7\n"
		"      %c_u32_8 = OpConstant %u32 8\n"
		"      %c_u32_9 = OpConstant %u32 9\n"
		"     %c_u32_10 = OpConstant %u32 10\n"
		"     %c_u32_11 = OpConstant %u32 11\n"
		"     %c_u32_12 = OpConstant %u32 12\n"
		"     %c_u32_13 = OpConstant %u32 13\n"
		"     %c_u32_14 = OpConstant %u32 14\n"
		"     %c_u32_15 = OpConstant %u32 15\n"
		"     %c_u32_16 = OpConstant %u32 16\n"
		"     %c_u32_17 = OpConstant %u32 17\n"
		"     %c_u32_18 = OpConstant %u32 18\n"
		"     %c_u32_19 = OpConstant %u32 19\n"
		"     %c_u32_20 = OpConstant %u32 20\n"
		"     %c_u32_21 = OpConstant %u32 21\n"
		"     %c_u32_22 = OpConstant %u32 22\n"
		"     %c_u32_23 = OpConstant %u32 23\n"
		"     %c_u32_24 = OpConstant %u32 24\n"
		"     %c_u32_25 = OpConstant %u32 25\n"
		"     %c_u32_26 = OpConstant %u32 26\n"
		"     %c_u32_27 = OpConstant %u32 27\n"
		"     %c_u32_28 = OpConstant %u32 28\n"
		"     %c_u32_29 = OpConstant %u32 29\n"
		"     %c_u32_30 = OpConstant %u32 30\n"
		"     %c_u32_31 = OpConstant %u32 31\n"
		"     %c_u32_33 = OpConstant %u32 33\n"
		"     %c_u32_34 = OpConstant %u32 34\n"
		"     %c_u32_35 = OpConstant %u32 35\n"
		"     %c_u32_36 = OpConstant %u32 36\n"
		"     %c_u32_37 = OpConstant %u32 37\n"
		"     %c_u32_38 = OpConstant %u32 38\n"
		"     %c_u32_39 = OpConstant %u32 39\n"
		"     %c_u32_40 = OpConstant %u32 40\n"
		"     %c_u32_41 = OpConstant %u32 41\n"
		"     %c_u32_44 = OpConstant %u32 44\n"

		" %f16arr3      = OpTypeArray %f16 %c_u32_3\n"
		" %v2f16arr3    = OpTypeArray %v2f16 %c_u32_3\n"
		" %v2f16arr5    = OpTypeArray %v2f16 %c_u32_5\n"
		" %v3f16arr5    = OpTypeArray %v3f16 %c_u32_5\n"
		" %v4f16arr3    = OpTypeArray %v4f16 %c_u32_3\n"
		" %struct16     = OpTypeStruct %f16 %v2f16arr3\n"
		" %struct16arr3 = OpTypeArray %struct16 %c_u32_3\n"
		" %st_test      = OpTypeStruct %f16 %v2f16 %v3f16 %v4f16 %f16arr3 %struct16arr3 %v2f16arr5 %f16 %v3f16arr5 %v4f16arr3\n"

		"       %up_u32 = OpTypePointer Uniform %u32\n"
		"    %ra_u32_44 = OpTypeArray %u32 %c_u32_44\n"
		"    %ra_ra_u32 = OpTypeArray %ra_u32_44 %c_i32_ndp\n"
		"      %SSBO_st = OpTypeStruct %ra_ra_u32\n"
		"   %up_SSBO_st = OpTypePointer Uniform %SSBO_st\n"

		"     %ssbo_dst = OpVariable %up_SSBO_st Uniform\n"
	);

	const StringTemplate decoration
	(
		"OpDecorate %SSBO_st BufferBlock\n"
		"OpDecorate %ra_u32_44 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32 ArrayStride ${struct_item_size}\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 1\n"

		"OpMemberDecorate %SSBO_st 0 Offset 0\n"

		"OpDecorate %v2f16arr3 ArrayStride 4\n"
		"OpMemberDecorate %struct16 0 Offset 0\n"
		"OpMemberDecorate %struct16 1 Offset 4\n"
		"OpDecorate %struct16arr3 ArrayStride 16\n"
		"OpDecorate %f16arr3 ArrayStride 2\n"
		"OpDecorate %v2f16arr5 ArrayStride 4\n"
		"OpDecorate %v3f16arr5 ArrayStride 8\n"
		"OpDecorate %v4f16arr3 ArrayStride 8\n"

		"OpMemberDecorate %st_test 0 Offset 0\n"
		"OpMemberDecorate %st_test 1 Offset 4\n"
		"OpMemberDecorate %st_test 2 Offset 8\n"
		"OpMemberDecorate %st_test 3 Offset 16\n"
		"OpMemberDecorate %st_test 4 Offset 24\n"
		"OpMemberDecorate %st_test 5 Offset 32\n"
		"OpMemberDecorate %st_test 6 Offset 80\n"
		"OpMemberDecorate %st_test 7 Offset 100\n"
		"OpMemberDecorate %st_test 8 Offset 104\n"
		"OpMemberDecorate %st_test 9 Offset 144\n"
	);

	const StringTemplate testFun
	(
		" %test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"     %param = OpFunctionParameter %v4f32\n"
		"     %entry = OpLabel\n"

		"         %i = OpVariable %fp_i32 Function\n"
		"              OpStore %i %c_i32_0\n"

		"  %will_run = OpFunctionCall %bool %isUniqueIdZero\n"
		"              OpSelectionMerge %end_if None\n"
		"              OpBranchConditional %will_run %run_test %end_if\n"

		"  %run_test = OpLabel\n"
		"              OpBranch %loop\n"

		"      %loop = OpLabel\n"
		"     %i_cmp = OpLoad %i32 %i\n"
		"        %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"              OpLoopMerge %merge %next None\n"
		"              OpBranchConditional %lt %write %merge\n"

		"     %write = OpLabel\n"
		"       %ndx = OpLoad %i32 %i\n"

		"      %fld1 = OpCompositeConstruct %v2f16 %c_f16_2 %c_f16_3\n"
		"      %fld2 = OpCompositeConstruct %v3f16 %c_f16_4 %c_f16_5 %c_f16_6\n"
		"      %fld3 = OpCompositeConstruct %v4f16 %c_f16_8 %c_f16_9 %c_f16_10 %c_f16_11\n"

		"      %fld4 = OpCompositeConstruct %f16arr3 %c_f16_12 %c_f16_13 %c_f16_14\n"

		"%fld5_0_1_0 = OpCompositeConstruct %v2f16 %c_f16_18 %c_f16_19\n"
		"%fld5_0_1_1 = OpCompositeConstruct %v2f16 %c_f16_20 %c_f16_21\n"
		"%fld5_0_1_2 = OpCompositeConstruct %v2f16 %c_f16_22 %c_f16_23\n"
		"  %fld5_0_1 = OpCompositeConstruct %v2f16arr3 %fld5_0_1_0 %fld5_0_1_1 %fld5_0_1_2\n"
		"    %fld5_0 = OpCompositeConstruct %struct16 %c_f16_16 %fld5_0_1\n"

		"%fld5_1_1_0 = OpCompositeConstruct %v2f16 %c_f16_26 %c_f16_27\n"
		"%fld5_1_1_1 = OpCompositeConstruct %v2f16 %c_f16_28 %c_f16_29\n"
		"%fld5_1_1_2 = OpCompositeConstruct %v2f16 %c_f16_30 %c_f16_31\n"
		"  %fld5_1_1 = OpCompositeConstruct %v2f16arr3 %fld5_1_1_0 %fld5_1_1_1 %fld5_1_1_2\n"
		"    %fld5_1 = OpCompositeConstruct %struct16 %c_f16_24 %fld5_1_1\n"

		"%fld5_2_1_0 = OpCompositeConstruct %v2f16 %c_f16_34 %c_f16_35\n"
		"%fld5_2_1_1 = OpCompositeConstruct %v2f16 %c_f16_36 %c_f16_37\n"
		"%fld5_2_1_2 = OpCompositeConstruct %v2f16 %c_f16_38 %c_f16_39\n"
		"  %fld5_2_1 = OpCompositeConstruct %v2f16arr3 %fld5_2_1_0 %fld5_2_1_1 %fld5_2_1_2\n"
		"    %fld5_2 = OpCompositeConstruct %struct16 %c_f16_32 %fld5_2_1\n"

		"      %fld5 = OpCompositeConstruct %struct16arr3 %fld5_0 %fld5_1 %fld5_2\n"

		"    %fld6_0 = OpCompositeConstruct %v2f16 %c_f16_40 %c_f16_41\n"
		"    %fld6_1 = OpCompositeConstruct %v2f16 %c_f16_42 %c_f16_43\n"
		"    %fld6_2 = OpCompositeConstruct %v2f16 %c_f16_44 %c_f16_45\n"
		"    %fld6_3 = OpCompositeConstruct %v2f16 %c_f16_46 %c_f16_47\n"
		"    %fld6_4 = OpCompositeConstruct %v2f16 %c_f16_48 %c_f16_49\n"
		"      %fld6 = OpCompositeConstruct %v2f16arr5 %fld6_0 %fld6_1 %fld6_2 %fld6_3 %fld6_4\n"

		"      %fndx = OpConvertSToF %f16 %ndx\n"
		"  %fld8_2a0 = OpFMul %f16 %fndx %c_f16_mod\n"
		"  %fld8_3b1 = OpFAdd %f16 %fndx %c_f16_mod\n"

		"   %fld8_2a = OpCompositeConstruct %v2f16 %fld8_2a0 %c_f16_61\n"
		"   %fld8_3b = OpCompositeConstruct %v2f16 %c_f16_65 %fld8_3b1\n"
		"    %fld8_0 = OpCompositeConstruct %v3f16 %c_f16_52 %c_f16_53 %c_f16_54\n"
		"    %fld8_1 = OpCompositeConstruct %v3f16 %c_f16_56 %c_f16_57 %c_f16_58\n"
		"    %fld8_2 = OpCompositeConstruct %v3f16 %fld8_2a %c_f16_62\n"
		"    %fld8_3 = OpCompositeConstruct %v3f16 %c_f16_64 %fld8_3b\n"
		"    %fld8_4 = OpCompositeConstruct %v3f16 %c_f16_68 %c_f16_69 %c_f16_70\n"
		"      %fld8 = OpCompositeConstruct %v3f16arr5 %fld8_0 %fld8_1 %fld8_2 %fld8_3 %fld8_4\n"

		"    %fld9_0 = OpCompositeConstruct %v4f16 %c_f16_72 %c_f16_73 %c_f16_74 %c_f16_75\n"
		"    %fld9_1 = OpCompositeConstruct %v4f16 %c_f16_76 %c_f16_77 %c_f16_78 %c_f16_79\n"
		"    %fld9_2 = OpCompositeConstruct %v4f16 %c_f16_80 %c_f16_81 %c_f16_82 %c_f16_83\n"
		"      %fld9 = OpCompositeConstruct %v4f16arr3 %fld9_0 %fld9_1 %fld9_2\n"

		"    %st_val = OpCompositeConstruct %st_test %c_f16_0 %fld1 %fld2 %fld3 %fld4 %fld5 %fld6 %c_f16_50 %fld8 %fld9\n"

		// Storage section: all elements that are not directly accessed should
		// have the value of -1.0. This means for f16 and v3f16 stores the v2f16
		// is constructed with one element from a constant -1.0.
		// half offset 0
		"      %ex_0 = OpCompositeExtract %f16 %st_val 0\n"
		"     %vec_0 = OpCompositeConstruct %v2f16 %ex_0 %c_f16_n1\n"
		"      %bc_0 = OpBitcast %u32 %vec_0\n"
		"     %gep_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_0\n"
		"              OpStore %gep_0 %bc_0\n"

		// <2 x half> offset 4
		"      %ex_1 = OpCompositeExtract %v2f16 %st_val 1\n"
		"      %bc_1 = OpBitcast %u32 %ex_1\n"
		"     %gep_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_1\n"
		"              OpStore %gep_1 %bc_1\n"

		// <3 x half> offset 8
		"      %ex_2 = OpCompositeExtract %v3f16 %st_val 2\n"
		"    %ex_2_0 = OpVectorShuffle %v2f16 %ex_2 %c_v2f16_n1 0 1\n"
		"    %ex_2_1 = OpVectorShuffle %v2f16 %ex_2 %c_v2f16_n1 2 3\n"
		"    %bc_2_0 = OpBitcast %u32 %ex_2_0\n"
		"    %bc_2_1 = OpBitcast %u32 %ex_2_1\n"
		"   %gep_2_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_2\n"
		"   %gep_2_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_3\n"
		"              OpStore %gep_2_0 %bc_2_0\n"
		"              OpStore %gep_2_1 %bc_2_1\n"

		// <4 x half> offset 16
		"      %ex_3 = OpCompositeExtract %v4f16 %st_val 3\n"
		"    %ex_3_0 = OpVectorShuffle %v2f16 %ex_3 %ex_3 0 1\n"
		"    %ex_3_1 = OpVectorShuffle %v2f16 %ex_3 %ex_3 2 3\n"
		"    %bc_3_0 = OpBitcast %u32 %ex_3_0\n"
		"    %bc_3_1 = OpBitcast %u32 %ex_3_1\n"
		"   %gep_3_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_4\n"
		"   %gep_3_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_5\n"
		"              OpStore %gep_3_0 %bc_3_0\n"
		"              OpStore %gep_3_1 %bc_3_1\n"

		// [3 x half] offset 24
		"    %ex_4_0 = OpCompositeExtract %f16 %st_val 4 0\n"
		"    %ex_4_1 = OpCompositeExtract %f16 %st_val 4 1\n"
		"    %ex_4_2 = OpCompositeExtract %f16 %st_val 4 2\n"
		"   %vec_4_0 = OpCompositeConstruct %v2f16 %ex_4_0 %ex_4_1\n"
		"   %vec_4_1 = OpCompositeConstruct %v2f16 %ex_4_2 %c_f16_n1\n"
		"    %bc_4_0 = OpBitcast %u32 %vec_4_0\n"
		"    %bc_4_1 = OpBitcast %u32 %vec_4_1\n"
		"   %gep_4_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_6\n"
		"   %gep_4_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_7\n"
		"              OpStore %gep_4_0 %bc_4_0\n"
		"              OpStore %gep_4_1 %bc_4_1\n"

		// [3 x {half, [3 x <2 x half>]}] offset 32
		"    %ex_5_0 = OpCompositeExtract %struct16 %st_val 5 0\n"
		"    %ex_5_1 = OpCompositeExtract %struct16 %st_val 5 1\n"
		"    %ex_5_2 = OpCompositeExtract %struct16 %st_val 5 2\n"
		"  %ex_5_0_0 = OpCompositeExtract %f16 %ex_5_0 0\n"
		"  %ex_5_1_0 = OpCompositeExtract %f16 %ex_5_1 0\n"
		"  %ex_5_2_0 = OpCompositeExtract %f16 %ex_5_2 0\n"
		"%ex_5_0_1_0 = OpCompositeExtract %v2f16 %ex_5_0 1 0\n"
		"%ex_5_0_1_1 = OpCompositeExtract %v2f16 %ex_5_0 1 1\n"
		"%ex_5_0_1_2 = OpCompositeExtract %v2f16 %ex_5_0 1 2\n"
		"%ex_5_1_1_0 = OpCompositeExtract %v2f16 %ex_5_1 1 0\n"
		"%ex_5_1_1_1 = OpCompositeExtract %v2f16 %ex_5_1 1 1\n"
		"%ex_5_1_1_2 = OpCompositeExtract %v2f16 %ex_5_1 1 2\n"
		"%ex_5_2_1_0 = OpCompositeExtract %v2f16 %ex_5_2 1 0\n"
		"%ex_5_2_1_1 = OpCompositeExtract %v2f16 %ex_5_2 1 1\n"
		"%ex_5_2_1_2 = OpCompositeExtract %v2f16 %ex_5_2 1 2\n"
		" %vec_5_0_0 = OpCompositeConstruct %v2f16 %ex_5_0_0 %c_f16_n1\n"
		" %vec_5_1_0 = OpCompositeConstruct %v2f16 %ex_5_1_0 %c_f16_n1\n"
		" %vec_5_2_0 = OpCompositeConstruct %v2f16 %ex_5_2_0 %c_f16_n1\n"
		"  %bc_5_0_0 = OpBitcast %u32 %vec_5_0_0\n"
		"  %bc_5_1_0 = OpBitcast %u32 %vec_5_1_0\n"
		"  %bc_5_2_0 = OpBitcast %u32 %vec_5_2_0\n"
		"%bc_5_0_1_0 = OpBitcast %u32 %ex_5_0_1_0\n"
		"%bc_5_0_1_1 = OpBitcast %u32 %ex_5_0_1_1\n"
		"%bc_5_0_1_2 = OpBitcast %u32 %ex_5_0_1_2\n"
		"%bc_5_1_1_0 = OpBitcast %u32 %ex_5_1_1_0\n"
		"%bc_5_1_1_1 = OpBitcast %u32 %ex_5_1_1_1\n"
		"%bc_5_1_1_2 = OpBitcast %u32 %ex_5_1_1_2\n"
		"%bc_5_2_1_0 = OpBitcast %u32 %ex_5_2_1_0\n"
		"%bc_5_2_1_1 = OpBitcast %u32 %ex_5_2_1_1\n"
		"%bc_5_2_1_2 = OpBitcast %u32 %ex_5_2_1_2\n"
		"  %gep_5_0_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_8\n"
		"%gep_5_0_1_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_9\n"
		"%gep_5_0_1_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_10\n"
		"%gep_5_0_1_2 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_11\n"
		"  %gep_5_1_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_12\n"
		"%gep_5_1_1_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_13\n"
		"%gep_5_1_1_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_14\n"
		"%gep_5_1_1_2 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_15\n"
		"  %gep_5_2_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_16\n"
		"%gep_5_2_1_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_17\n"
		"%gep_5_2_1_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_18\n"
		"%gep_5_2_1_2 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_19\n"
		"              OpStore %gep_5_0_0 %bc_5_0_0\n"
		"              OpStore %gep_5_0_1_0 %bc_5_0_1_0\n"
		"              OpStore %gep_5_0_1_1 %bc_5_0_1_1\n"
		"              OpStore %gep_5_0_1_2 %bc_5_0_1_2\n"
		"              OpStore %gep_5_1_0 %bc_5_1_0\n"
		"              OpStore %gep_5_1_1_0 %bc_5_1_1_0\n"
		"              OpStore %gep_5_1_1_1 %bc_5_1_1_1\n"
		"              OpStore %gep_5_1_1_2 %bc_5_1_1_2\n"
		"              OpStore %gep_5_2_0 %bc_5_2_0\n"
		"              OpStore %gep_5_2_1_0 %bc_5_2_1_0\n"
		"              OpStore %gep_5_2_1_1 %bc_5_2_1_1\n"
		"              OpStore %gep_5_2_1_2 %bc_5_2_1_2\n"

		// [5 x <2 x half>] offset 80
		"    %ex_6_0 = OpCompositeExtract %v2f16 %st_val 6 0\n"
		"    %ex_6_1 = OpCompositeExtract %v2f16 %st_val 6 1\n"
		"    %ex_6_2 = OpCompositeExtract %v2f16 %st_val 6 2\n"
		"    %ex_6_3 = OpCompositeExtract %v2f16 %st_val 6 3\n"
		"    %ex_6_4 = OpCompositeExtract %v2f16 %st_val 6 4\n"
		"    %bc_6_0 = OpBitcast %u32 %ex_6_0\n"
		"    %bc_6_1 = OpBitcast %u32 %ex_6_1\n"
		"    %bc_6_2 = OpBitcast %u32 %ex_6_2\n"
		"    %bc_6_3 = OpBitcast %u32 %ex_6_3\n"
		"    %bc_6_4 = OpBitcast %u32 %ex_6_4\n"
		"   %gep_6_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_20\n"
		"   %gep_6_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_21\n"
		"   %gep_6_2 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_22\n"
		"   %gep_6_3 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_23\n"
		"   %gep_6_4 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_24\n"
		"              OpStore %gep_6_0 %bc_6_0\n"
		"              OpStore %gep_6_1 %bc_6_1\n"
		"              OpStore %gep_6_2 %bc_6_2\n"
		"              OpStore %gep_6_3 %bc_6_3\n"
		"              OpStore %gep_6_4 %bc_6_4\n"

		// half offset 100
		"      %ex_7 = OpCompositeExtract %f16 %st_val 7\n"
		"     %vec_7 = OpCompositeConstruct %v2f16 %ex_7 %c_f16_n1\n"
		"      %bc_7 = OpBitcast %u32 %vec_7\n"
		"     %gep_7 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_25\n"
		"              OpStore %gep_7 %bc_7\n"

		// [5 x <3 x half>] offset 104
		"    %ex_8_0 = OpCompositeExtract %v3f16 %st_val 8 0\n"
		"    %ex_8_1 = OpCompositeExtract %v3f16 %st_val 8 1\n"
		"    %ex_8_2 = OpCompositeExtract %v3f16 %st_val 8 2\n"
		"    %ex_8_3 = OpCompositeExtract %v3f16 %st_val 8 3\n"
		"    %ex_8_4 = OpCompositeExtract %v3f16 %st_val 8 4\n"
		" %vec_8_0_0 = OpVectorShuffle %v2f16 %ex_8_0 %c_v2f16_n1 0 1\n"
		" %vec_8_0_1 = OpVectorShuffle %v2f16 %ex_8_0 %c_v2f16_n1 2 3\n"
		" %vec_8_1_0 = OpVectorShuffle %v2f16 %ex_8_1 %c_v2f16_n1 0 1\n"
		" %vec_8_1_1 = OpVectorShuffle %v2f16 %ex_8_1 %c_v2f16_n1 2 3\n"
		" %vec_8_2_0 = OpVectorShuffle %v2f16 %ex_8_2 %c_v2f16_n1 0 1\n"
		" %vec_8_2_1 = OpVectorShuffle %v2f16 %ex_8_2 %c_v2f16_n1 2 3\n"
		" %vec_8_3_0 = OpVectorShuffle %v2f16 %ex_8_3 %c_v2f16_n1 0 1\n"
		" %vec_8_3_1 = OpVectorShuffle %v2f16 %ex_8_3 %c_v2f16_n1 2 3\n"
		" %vec_8_4_0 = OpVectorShuffle %v2f16 %ex_8_4 %c_v2f16_n1 0 1\n"
		" %vec_8_4_1 = OpVectorShuffle %v2f16 %ex_8_4 %c_v2f16_n1 2 3\n"
		"  %bc_8_0_0 = OpBitcast %u32 %vec_8_0_0\n"
		"  %bc_8_0_1 = OpBitcast %u32 %vec_8_0_1\n"
		"  %bc_8_1_0 = OpBitcast %u32 %vec_8_1_0\n"
		"  %bc_8_1_1 = OpBitcast %u32 %vec_8_1_1\n"
		"  %bc_8_2_0 = OpBitcast %u32 %vec_8_2_0\n"
		"  %bc_8_2_1 = OpBitcast %u32 %vec_8_2_1\n"
		"  %bc_8_3_0 = OpBitcast %u32 %vec_8_3_0\n"
		"  %bc_8_3_1 = OpBitcast %u32 %vec_8_3_1\n"
		"  %bc_8_4_0 = OpBitcast %u32 %vec_8_4_0\n"
		"  %bc_8_4_1 = OpBitcast %u32 %vec_8_4_1\n"
		" %gep_8_0_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_26\n"
		" %gep_8_0_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_27\n"
		" %gep_8_1_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_28\n"
		" %gep_8_1_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_29\n"
		" %gep_8_2_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_30\n"
		" %gep_8_2_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_31\n"
		" %gep_8_3_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_32\n"
		" %gep_8_3_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_33\n"
		" %gep_8_4_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_34\n"
		" %gep_8_4_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_35\n"
		"              OpStore %gep_8_0_0 %bc_8_0_0\n"
		"              OpStore %gep_8_0_1 %bc_8_0_1\n"
		"              OpStore %gep_8_1_0 %bc_8_1_0\n"
		"              OpStore %gep_8_1_1 %bc_8_1_1\n"
		"              OpStore %gep_8_2_0 %bc_8_2_0\n"
		"              OpStore %gep_8_2_1 %bc_8_2_1\n"
		"              OpStore %gep_8_3_0 %bc_8_3_0\n"
		"              OpStore %gep_8_3_1 %bc_8_3_1\n"
		"              OpStore %gep_8_4_0 %bc_8_4_0\n"
		"              OpStore %gep_8_4_1 %bc_8_4_1\n"

		// [3 x <4 x half>] offset 144
		"    %ex_9_0 = OpCompositeExtract %v4f16 %st_val 9 0\n"
		"    %ex_9_1 = OpCompositeExtract %v4f16 %st_val 9 1\n"
		"    %ex_9_2 = OpCompositeExtract %v4f16 %st_val 9 2\n"
		" %vec_9_0_0 = OpVectorShuffle %v2f16 %ex_9_0 %ex_9_0 0 1\n"
		" %vec_9_0_1 = OpVectorShuffle %v2f16 %ex_9_0 %ex_9_0 2 3\n"
		" %vec_9_1_0 = OpVectorShuffle %v2f16 %ex_9_1 %ex_9_1 0 1\n"
		" %vec_9_1_1 = OpVectorShuffle %v2f16 %ex_9_1 %ex_9_1 2 3\n"
		" %vec_9_2_0 = OpVectorShuffle %v2f16 %ex_9_2 %ex_9_2 0 1\n"
		" %vec_9_2_1 = OpVectorShuffle %v2f16 %ex_9_2 %ex_9_2 2 3\n"
		"  %bc_9_0_0 = OpBitcast %u32 %vec_9_0_0\n"
		"  %bc_9_0_1 = OpBitcast %u32 %vec_9_0_1\n"
		"  %bc_9_1_0 = OpBitcast %u32 %vec_9_1_0\n"
		"  %bc_9_1_1 = OpBitcast %u32 %vec_9_1_1\n"
		"  %bc_9_2_0 = OpBitcast %u32 %vec_9_2_0\n"
		"  %bc_9_2_1 = OpBitcast %u32 %vec_9_2_1\n"
		" %gep_9_0_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_36\n"
		" %gep_9_0_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_37\n"
		" %gep_9_1_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_38\n"
		" %gep_9_1_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_39\n"
		" %gep_9_2_0 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_40\n"
		" %gep_9_2_1 = OpAccessChain %up_u32 %ssbo_dst %c_u32_0 %ndx %c_u32_41\n"
		"              OpStore %gep_9_0_0 %bc_9_0_0\n"
		"              OpStore %gep_9_0_1 %bc_9_0_1\n"
		"              OpStore %gep_9_1_0 %bc_9_1_0\n"
		"              OpStore %gep_9_1_1 %bc_9_1_1\n"
		"              OpStore %gep_9_2_0 %bc_9_2_0\n"
		"              OpStore %gep_9_2_1 %bc_9_2_1\n"

		"              OpBranch %next\n"

		"      %next = OpLabel\n"
		"     %i_cur = OpLoad %i32 %i\n"
		"     %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"              OpStore %i %i_new\n"
		"              OpBranch %loop\n"

		"     %merge = OpLabel\n"
		"              OpBranch %end_if\n"
		"    %end_if = OpLabel\n"
		"              OpReturnValue %param\n"
		"              OpFunctionEnd\n"
	);

	{
		SpecResource		specResource;
		map<string, string>	specs;
		VulkanFeatures		features;
		map<string, string>	fragments;
		vector<string>		extensions;
		vector<deFloat16>	expectedOutput;
		string				consts;

		for (deUint32 elementNdx = 0; elementNdx < numElements; ++elementNdx)
		{
			vector<deFloat16>	expectedIterationOutput;

			for (deUint32 structItemNdx = 0; structItemNdx < structItemsCount; ++structItemNdx)
				expectedIterationOutput.push_back(tcu::Float16(float(structItemNdx)).bits());

			for (deUint32 structItemNdx = 0; structItemNdx < DE_LENGTH_OF_ARRAY(exceptionIndices); ++structItemNdx)
				expectedIterationOutput[exceptionIndices[structItemNdx]] = exceptionValue;

			expectedIterationOutput[fieldModifiedMulIndex] = tcu::Float16(float(elementNdx * fieldModifier)).bits();
			expectedIterationOutput[fieldModifiedAddIndex] = tcu::Float16(float(elementNdx + fieldModifier)).bits();

			expectedOutput.insert(expectedOutput.end(), expectedIterationOutput.begin(), expectedIterationOutput.end());
		}

		for (deUint32 i = 0; i < structItemsCount; ++i)
			consts += "     %c_f16_" + de::toString(i) + " = OpConstant %f16 "  + de::toString(i) + "\n";

		specs["num_elements"]		= de::toString(numElements);
		specs["struct_item_size"]	= de::toString(structItemsCount * sizeof(deFloat16));
		specs["field_modifier"]		= de::toString(fieldModifier);
		specs["consts"]				= consts;

		fragments["capability"]		= "OpCapability Float16\n";
		fragments["decoration"]		= decoration.specialize(specs);
		fragments["pre_main"]		= preMain.specialize(specs);
		fragments["testfun"]		= testFun.specialize(specs);

		specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(expectedOutput)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(expectedOutput)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.verifyIO = compareFP16CompositeFunc;

		extensions.push_back("VK_KHR_shader_float16_int8");

		features.extFloat16Int8		= EXTFLOAT16INT8FEATURES_FLOAT16;

		finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
	}

	return testGroup.release();
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16CompositeInsertExtractSet (tcu::TestContext& testCtx, const char* op)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup		(new tcu::TestCaseGroup(testCtx, de::toLower(op).c_str(), op));
	const deFloat16						exceptionValue	= tcu::Float16(-1.0).bits();
	const string						opName			(op);
	const deUint32						opIndex			= (opName == "OpCompositeInsert") ? 0
														: (opName == "OpCompositeExtract") ? 1
														: std::numeric_limits<deUint32>::max();

	const StringTemplate preMain
	(
		"   %c_i32_ndp = OpConstant %i32 ${num_elements}\n"
		"  %c_i32_hndp = OpSpecConstantOp %i32 SDiv %c_i32_ndp %c_i32_2\n"
		"  %c_i32_size = OpConstant %i32 ${struct_u32s}\n"
		"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
		" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n"
		"         %f16 = OpTypeFloat 16\n"
		"       %v2f16 = OpTypeVector %f16 2\n"
		"       %v3f16 = OpTypeVector %f16 3\n"
		"       %v4f16 = OpTypeVector %f16 4\n"
		"    %c_f16_na = OpConstant %f16 -1.0\n"
		"  %c_v2f16_n1 = OpConstantComposite %v2f16 %c_f16_na %c_f16_na\n"
		"     %c_u32_5 = OpConstant %u32 5\n"
		"     %c_i32_5 = OpConstant %i32 5\n"
		"     %c_i32_6 = OpConstant %i32 6\n"
		"     %c_i32_7 = OpConstant %i32 7\n"
		"     %c_i32_8 = OpConstant %i32 8\n"
		"     %c_i32_9 = OpConstant %i32 9\n"
		"    %c_i32_10 = OpConstant %i32 10\n"
		"    %c_i32_11 = OpConstant %i32 11\n"

		"%f16arr3      = OpTypeArray %f16 %c_u32_3\n"
		"%v2f16arr3    = OpTypeArray %v2f16 %c_u32_3\n"
		"%v2f16arr5    = OpTypeArray %v2f16 %c_u32_5\n"
		"%v3f16arr5    = OpTypeArray %v3f16 %c_u32_5\n"
		"%v4f16arr3    = OpTypeArray %v4f16 %c_u32_3\n"
		"%struct16     = OpTypeStruct %f16 %v2f16arr3\n"
		"%struct16arr3 = OpTypeArray %struct16 %c_u32_3\n"
		"%st_test      = OpTypeStruct %${field_type}\n"

		"      %ra_f16 = OpTypeArray %u32 %c_i32_hndp\n"
		"       %ra_st = OpTypeArray %u32 %c_i32_size\n"
		"      %up_u32 = OpTypePointer Uniform %u32\n"
		"     %st_test_i32_fn = OpTypeFunction %st_test %i32\n"
		"%void_st_test_i32_fn = OpTypeFunction %void %st_test %i32\n"
		"         %f16_i32_fn = OpTypeFunction %f16 %i32\n"
		"    %void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
		"       %v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
		"  %void_v2f16_i32_fn = OpTypeFunction %void %v2f16 %i32\n"

		"${op_premain_decls}"

		" %up_SSBO_src = OpTypePointer Uniform %SSBO_src\n"
		" %up_SSBO_dst = OpTypePointer Uniform %SSBO_dst\n"

		"    %ssbo_src = OpVariable %up_SSBO_src Uniform\n"
		"    %ssbo_dst = OpVariable %up_SSBO_dst Uniform\n"
	);

	const StringTemplate decoration
	(
		"OpDecorate %SSBO_src BufferBlock\n"
		"OpDecorate %SSBO_dst BufferBlock\n"
		"OpDecorate %ra_f16 ArrayStride 4\n"
		"OpDecorate %ra_st ArrayStride 4\n"
		"OpDecorate %ssbo_src DescriptorSet 0\n"
		"OpDecorate %ssbo_src Binding 0\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 1\n"

		"OpMemberDecorate %SSBO_src 0 Offset 0\n"
		"OpMemberDecorate %SSBO_dst 0 Offset 0\n"

		"OpDecorate %v2f16arr3 ArrayStride 4\n"
		"OpMemberDecorate %struct16 0 Offset 0\n"
		"OpMemberDecorate %struct16 1 Offset 4\n"
		"OpDecorate %struct16arr3 ArrayStride 16\n"
		"OpDecorate %f16arr3 ArrayStride 2\n"
		"OpDecorate %v2f16arr5 ArrayStride 4\n"
		"OpDecorate %v3f16arr5 ArrayStride 8\n"
		"OpDecorate %v4f16arr3 ArrayStride 8\n"

		"OpMemberDecorate %st_test 0 Offset 0\n"
	);

	const StringTemplate testFun
	(
		" %test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"     %param = OpFunctionParameter %v4f32\n"
		"     %entry = OpLabel\n"

		"         %i = OpVariable %fp_i32 Function\n"
		"              OpStore %i %c_i32_0\n"

		"  %will_run = OpFunctionCall %bool %isUniqueIdZero\n"
		"              OpSelectionMerge %end_if None\n"
		"              OpBranchConditional %will_run %run_test %end_if\n"

		"  %run_test = OpLabel\n"
		"              OpBranch %loop\n"

		"      %loop = OpLabel\n"
		"     %i_cmp = OpLoad %i32 %i\n"
		"        %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"              OpLoopMerge %merge %next None\n"
		"              OpBranchConditional %lt %write %merge\n"

		"     %write = OpLabel\n"
		"       %ndx = OpLoad %i32 %i\n"

		"${op_sw_fun_call}"

		"    %dst_st = OpFunctionCall %void %${st_call} %val_dst %${st_ndx}\n"
		"              OpBranch %next\n"

		"      %next = OpLabel\n"
		"     %i_cur = OpLoad %i32 %i\n"
		"     %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"              OpStore %i %i_new\n"
		"              OpBranch %loop\n"

		"     %merge = OpLabel\n"
		"              OpBranch %end_if\n"
		"    %end_if = OpLabel\n"
		"              OpReturnValue %param\n"
		"              OpFunctionEnd\n"

		"${op_sw_fun_header}"
		" %sw_param = OpFunctionParameter %st_test\n"
		"%sw_paramn = OpFunctionParameter %i32\n"
		" %sw_entry = OpLabel\n"
		"             OpSelectionMerge %switch_e None\n"
		"             OpSwitch %sw_paramn %default ${case_list}\n"

		"${case_bodies}"

		"%default   = OpLabel\n"
		"             OpReturnValue ${op_case_default_value}\n"
		"%switch_e  = OpLabel\n"
		"             OpUnreachable\n" // Unreachable merge block for switch statement
		"             OpFunctionEnd\n"
	);

	const StringTemplate testCaseBody
	(
		"%case_${case_ndx}    = OpLabel\n"
		"%val_ret_${case_ndx} = ${op_name} ${op_args_part} ${access_path}\n"
		"             OpReturnValue %val_ret_${case_ndx}\n"
	);

	const string loadF16
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"   %ld_${var}_call = OpFunctionCall %f16 %ld_arg_${var} %ld_${var}_param\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_call\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n" +
		loadScalarF16FromUint
	);

	const string loadV2F16
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"   %ld_${var}_call = OpFunctionCall %v2f16 %ld_arg_${var} %ld_${var}_param\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_call\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n" +
		loadV2F16FromUint
	);

	const string loadV3F16
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"  %ld_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"  %ld_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"   %ld_${var}_ld_0 = OpLoad %u32 %ld_${var}_gep_0\n"
		"   %ld_${var}_ld_1 = OpLoad %u32 %ld_${var}_gep_1\n"
		"   %ld_${var}_bc_0 = OpBitcast %v2f16 %ld_${var}_ld_0\n"
		"   %ld_${var}_bc_1 = OpBitcast %v2f16 %ld_${var}_ld_1\n"
		"    %ld_${var}_vec = OpVectorShuffle %v3f16 %ld_${var}_bc_0 %ld_${var}_bc_1 0 1 2\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_vec\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n"
	);

	const string loadV4F16
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"  %ld_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"  %ld_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"   %ld_${var}_ld_0 = OpLoad %u32 %ld_${var}_gep_0\n"
		"   %ld_${var}_ld_1 = OpLoad %u32 %ld_${var}_gep_1\n"
		"   %ld_${var}_bc_0 = OpBitcast %v2f16 %ld_${var}_ld_0\n"
		"   %ld_${var}_bc_1 = OpBitcast %v2f16 %ld_${var}_ld_1\n"
		"    %ld_${var}_vec = OpVectorShuffle %v4f16 %ld_${var}_bc_0 %ld_${var}_bc_1 0 1 2 3\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_vec\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n"
	);

	const string loadF16Arr3
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"  %ld_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_u32_0 %c_u32_0\n"
		"  %ld_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_u32_0 %c_u32_1\n"
		"   %ld_${var}_ld_0 = OpLoad %u32 %ld_${var}_gep_0\n"
		"   %ld_${var}_ld_1 = OpLoad %u32 %ld_${var}_gep_1\n"
		"   %ld_${var}_bc_0 = OpBitcast %v2f16 %ld_${var}_ld_0\n"
		"   %ld_${var}_bc_1 = OpBitcast %v2f16 %ld_${var}_ld_1\n"
		"   %ld_${var}_ex_0 = OpCompositeExtract %f16 %ld_${var}_bc_0 0\n"
		"   %ld_${var}_ex_1 = OpCompositeExtract %f16 %ld_${var}_bc_0 1\n"
		"   %ld_${var}_ex_2 = OpCompositeExtract %f16 %ld_${var}_bc_1 0\n"
		"   %ld_${var}_cons = OpCompositeConstruct %f16arr3 %ld_${var}_ex_0 %ld_${var}_ex_1 %ld_${var}_ex_2\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_cons\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n"
	);

	const string loadV2F16Arr5
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_label = OpLabel\n"
		"  %ld_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"  %ld_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"  %ld_${var}_gep_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		"  %ld_${var}_gep_3 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		"  %ld_${var}_gep_4 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"   %ld_${var}_ld_0 = OpLoad %u32 %ld_${var}_gep_0\n"
		"   %ld_${var}_ld_1 = OpLoad %u32 %ld_${var}_gep_1\n"
		"   %ld_${var}_ld_2 = OpLoad %u32 %ld_${var}_gep_2\n"
		"   %ld_${var}_ld_3 = OpLoad %u32 %ld_${var}_gep_3\n"
		"   %ld_${var}_ld_4 = OpLoad %u32 %ld_${var}_gep_4\n"
		"   %ld_${var}_bc_0 = OpBitcast %v2f16 %ld_${var}_ld_0\n"
		"   %ld_${var}_bc_1 = OpBitcast %v2f16 %ld_${var}_ld_1\n"
		"   %ld_${var}_bc_2 = OpBitcast %v2f16 %ld_${var}_ld_2\n"
		"   %ld_${var}_bc_3 = OpBitcast %v2f16 %ld_${var}_ld_3\n"
		"   %ld_${var}_bc_4 = OpBitcast %v2f16 %ld_${var}_ld_4\n"
		"   %ld_${var}_cons = OpCompositeConstruct %v2f16arr5 %ld_${var}_bc_0 %ld_${var}_bc_1 %ld_${var}_bc_2 %ld_${var}_bc_3 %ld_${var}_bc_4\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_cons\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n"
	);

	const string loadV3F16Arr5
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"%ld_${var}_gep_0_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"%ld_${var}_gep_0_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"%ld_${var}_gep_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		"%ld_${var}_gep_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		"%ld_${var}_gep_2_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"%ld_${var}_gep_2_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_5\n"
		"%ld_${var}_gep_3_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_6\n"
		"%ld_${var}_gep_3_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_7\n"
		"%ld_${var}_gep_4_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_8\n"
		"%ld_${var}_gep_4_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_9\n"
		" %ld_${var}_ld_0_0 = OpLoad %u32 %ld_${var}_gep_0_0\n"
		" %ld_${var}_ld_0_1 = OpLoad %u32 %ld_${var}_gep_0_1\n"
		" %ld_${var}_ld_1_0 = OpLoad %u32 %ld_${var}_gep_1_0\n"
		" %ld_${var}_ld_1_1 = OpLoad %u32 %ld_${var}_gep_1_1\n"
		" %ld_${var}_ld_2_0 = OpLoad %u32 %ld_${var}_gep_2_0\n"
		" %ld_${var}_ld_2_1 = OpLoad %u32 %ld_${var}_gep_2_1\n"
		" %ld_${var}_ld_3_0 = OpLoad %u32 %ld_${var}_gep_3_0\n"
		" %ld_${var}_ld_3_1 = OpLoad %u32 %ld_${var}_gep_3_1\n"
		" %ld_${var}_ld_4_0 = OpLoad %u32 %ld_${var}_gep_4_0\n"
		" %ld_${var}_ld_4_1 = OpLoad %u32 %ld_${var}_gep_4_1\n"
		" %ld_${var}_bc_0_0 = OpBitcast %v2f16 %ld_${var}_ld_0_0\n"
		" %ld_${var}_bc_0_1 = OpBitcast %v2f16 %ld_${var}_ld_0_1\n"
		" %ld_${var}_bc_1_0 = OpBitcast %v2f16 %ld_${var}_ld_1_0\n"
		" %ld_${var}_bc_1_1 = OpBitcast %v2f16 %ld_${var}_ld_1_1\n"
		" %ld_${var}_bc_2_0 = OpBitcast %v2f16 %ld_${var}_ld_2_0\n"
		" %ld_${var}_bc_2_1 = OpBitcast %v2f16 %ld_${var}_ld_2_1\n"
		" %ld_${var}_bc_3_0 = OpBitcast %v2f16 %ld_${var}_ld_3_0\n"
		" %ld_${var}_bc_3_1 = OpBitcast %v2f16 %ld_${var}_ld_3_1\n"
		" %ld_${var}_bc_4_0 = OpBitcast %v2f16 %ld_${var}_ld_4_0\n"
		" %ld_${var}_bc_4_1 = OpBitcast %v2f16 %ld_${var}_ld_4_1\n"
		"  %ld_${var}_vec_0 = OpVectorShuffle %v3f16 %ld_${var}_bc_0_0 %ld_${var}_bc_0_1 0 1 2\n"
		"  %ld_${var}_vec_1 = OpVectorShuffle %v3f16 %ld_${var}_bc_1_0 %ld_${var}_bc_1_1 0 1 2\n"
		"  %ld_${var}_vec_2 = OpVectorShuffle %v3f16 %ld_${var}_bc_2_0 %ld_${var}_bc_2_1 0 1 2\n"
		"  %ld_${var}_vec_3 = OpVectorShuffle %v3f16 %ld_${var}_bc_3_0 %ld_${var}_bc_3_1 0 1 2\n"
		"  %ld_${var}_vec_4 = OpVectorShuffle %v3f16 %ld_${var}_bc_4_0 %ld_${var}_bc_4_1 0 1 2\n"
		"   %ld_${var}_cons = OpCompositeConstruct %v3f16arr5 %ld_${var}_vec_0 %ld_${var}_vec_1 %ld_${var}_vec_2 %ld_${var}_vec_3 %ld_${var}_vec_4\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_cons\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n"
	);

	const string loadV4F16Arr3
	(
		"        %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"  %ld_${var}_param = OpFunctionParameter %i32\n"
		"  %ld_${var}_entry = OpLabel\n"
		"%ld_${var}_gep_0_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"%ld_${var}_gep_0_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"%ld_${var}_gep_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		"%ld_${var}_gep_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		"%ld_${var}_gep_2_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"%ld_${var}_gep_2_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_5\n"
		" %ld_${var}_ld_0_0 = OpLoad %u32 %ld_${var}_gep_0_0\n"
		" %ld_${var}_ld_0_1 = OpLoad %u32 %ld_${var}_gep_0_1\n"
		" %ld_${var}_ld_1_0 = OpLoad %u32 %ld_${var}_gep_1_0\n"
		" %ld_${var}_ld_1_1 = OpLoad %u32 %ld_${var}_gep_1_1\n"
		" %ld_${var}_ld_2_0 = OpLoad %u32 %ld_${var}_gep_2_0\n"
		" %ld_${var}_ld_2_1 = OpLoad %u32 %ld_${var}_gep_2_1\n"
		" %ld_${var}_bc_0_0 = OpBitcast %v2f16 %ld_${var}_ld_0_0\n"
		" %ld_${var}_bc_0_1 = OpBitcast %v2f16 %ld_${var}_ld_0_1\n"
		" %ld_${var}_bc_1_0 = OpBitcast %v2f16 %ld_${var}_ld_1_0\n"
		" %ld_${var}_bc_1_1 = OpBitcast %v2f16 %ld_${var}_ld_1_1\n"
		" %ld_${var}_bc_2_0 = OpBitcast %v2f16 %ld_${var}_ld_2_0\n"
		" %ld_${var}_bc_2_1 = OpBitcast %v2f16 %ld_${var}_ld_2_1\n"
		"  %ld_${var}_vec_0 = OpVectorShuffle %v4f16 %ld_${var}_bc_0_0 %ld_${var}_bc_0_1 0 1 2 3\n"
		"  %ld_${var}_vec_1 = OpVectorShuffle %v4f16 %ld_${var}_bc_1_0 %ld_${var}_bc_1_1 0 1 2 3\n"
		"  %ld_${var}_vec_2 = OpVectorShuffle %v4f16 %ld_${var}_bc_2_0 %ld_${var}_bc_2_1 0 1 2 3\n"
		"   %ld_${var}_cons = OpCompositeConstruct %v4f16arr3 %ld_${var}_vec_0 %ld_${var}_vec_1 %ld_${var}_vec_2\n"
		"%ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_cons\n"
		"                     OpReturnValue %ld_${var}_st_test\n"
		"                     OpFunctionEnd\n"
	);

	const string loadStruct16Arr3
	(
		"          %ld_${var} = OpFunction %st_test None %st_test_i32_fn\n"
		"    %ld_${var}_param = OpFunctionParameter %i32\n"
		"    %ld_${var}_entry = OpLabel\n"
		"%ld_${var}_gep_0_0   = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"%ld_${var}_gep_0_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"%ld_${var}_gep_0_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		"%ld_${var}_gep_0_1_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		"%ld_${var}_gep_1_0   = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"%ld_${var}_gep_1_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_5\n"
		"%ld_${var}_gep_1_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_6\n"
		"%ld_${var}_gep_1_1_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_7\n"
		"%ld_${var}_gep_2_0   = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_8\n"
		"%ld_${var}_gep_2_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_9\n"
		"%ld_${var}_gep_2_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_10\n"
		"%ld_${var}_gep_2_1_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_11\n"
		" %ld_${var}_ld_0_0   = OpLoad %u32 %ld_${var}_gep_0_0\n"
		" %ld_${var}_ld_0_1_0 = OpLoad %u32 %ld_${var}_gep_0_1_0\n"
		" %ld_${var}_ld_0_1_1 = OpLoad %u32 %ld_${var}_gep_0_1_1\n"
		" %ld_${var}_ld_0_1_2 = OpLoad %u32 %ld_${var}_gep_0_1_2\n"
		" %ld_${var}_ld_1_0   = OpLoad %u32 %ld_${var}_gep_1_0\n"
		" %ld_${var}_ld_1_1_0 = OpLoad %u32 %ld_${var}_gep_1_1_0\n"
		" %ld_${var}_ld_1_1_1 = OpLoad %u32 %ld_${var}_gep_1_1_1\n"
		" %ld_${var}_ld_1_1_2 = OpLoad %u32 %ld_${var}_gep_1_1_2\n"
		" %ld_${var}_ld_2_0   = OpLoad %u32 %ld_${var}_gep_2_0\n"
		" %ld_${var}_ld_2_1_0 = OpLoad %u32 %ld_${var}_gep_2_1_0\n"
		" %ld_${var}_ld_2_1_1 = OpLoad %u32 %ld_${var}_gep_2_1_1\n"
		" %ld_${var}_ld_2_1_2 = OpLoad %u32 %ld_${var}_gep_2_1_2\n"
		" %ld_${var}_bc_0_0   = OpBitcast %v2f16 %ld_${var}_ld_0_0\n"
		" %ld_${var}_bc_0_1_0 = OpBitcast %v2f16 %ld_${var}_ld_0_1_0\n"
		" %ld_${var}_bc_0_1_1 = OpBitcast %v2f16 %ld_${var}_ld_0_1_1\n"
		" %ld_${var}_bc_0_1_2 = OpBitcast %v2f16 %ld_${var}_ld_0_1_2\n"
		" %ld_${var}_bc_1_0   = OpBitcast %v2f16 %ld_${var}_ld_1_0\n"
		" %ld_${var}_bc_1_1_0 = OpBitcast %v2f16 %ld_${var}_ld_1_1_0\n"
		" %ld_${var}_bc_1_1_1 = OpBitcast %v2f16 %ld_${var}_ld_1_1_1\n"
		" %ld_${var}_bc_1_1_2 = OpBitcast %v2f16 %ld_${var}_ld_1_1_2\n"
		" %ld_${var}_bc_2_0   = OpBitcast %v2f16 %ld_${var}_ld_2_0\n"
		" %ld_${var}_bc_2_1_0 = OpBitcast %v2f16 %ld_${var}_ld_2_1_0\n"
		" %ld_${var}_bc_2_1_1 = OpBitcast %v2f16 %ld_${var}_ld_2_1_1\n"
		" %ld_${var}_bc_2_1_2 = OpBitcast %v2f16 %ld_${var}_ld_2_1_2\n"
		"    %ld_${var}_arr_0 = OpCompositeConstruct %v2f16arr3 %ld_${var}_bc_0_1_0 %ld_${var}_bc_0_1_1 %ld_${var}_bc_0_1_2\n"
		"    %ld_${var}_arr_1 = OpCompositeConstruct %v2f16arr3 %ld_${var}_bc_1_1_0 %ld_${var}_bc_1_1_1 %ld_${var}_bc_1_1_2\n"
		"    %ld_${var}_arr_2 = OpCompositeConstruct %v2f16arr3 %ld_${var}_bc_2_1_0 %ld_${var}_bc_2_1_1 %ld_${var}_bc_2_1_2\n"
		"     %ld_${var}_ex_0 = OpCompositeExtract %f16 %ld_${var}_bc_0_0 0\n"
		"     %ld_${var}_ex_1 = OpCompositeExtract %f16 %ld_${var}_bc_1_0 0\n"
		"     %ld_${var}_ex_2 = OpCompositeExtract %f16 %ld_${var}_bc_2_0 0\n"
		"     %ld_${var}_st_0 = OpCompositeConstruct %struct16 %ld_${var}_ex_0 %ld_${var}_arr_0\n"
		"     %ld_${var}_st_1 = OpCompositeConstruct %struct16 %ld_${var}_ex_1 %ld_${var}_arr_1\n"
		"     %ld_${var}_st_2 = OpCompositeConstruct %struct16 %ld_${var}_ex_2 %ld_${var}_arr_2\n"
		"     %ld_${var}_cons = OpCompositeConstruct %struct16arr3 %ld_${var}_st_0 %ld_${var}_st_1 %ld_${var}_st_2\n"
		"  %ld_${var}_st_test = OpCompositeConstruct %st_test %ld_${var}_cons\n"
		"                       OpReturnValue %ld_${var}_st_test\n"
		"                      OpFunctionEnd\n"
	);

	const string storeF16
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"    %st_${var}_ex = OpCompositeExtract %f16 %st_${var}_param1 0\n"
		"  %st_${var}_call = OpFunctionCall %void %st_fn_${var} %st_${var}_ex %st_${var}_param2\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n" +
		storeScalarF16AsUint
	);

	const string storeV2F16
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"    %st_${var}_ex = OpCompositeExtract %v2f16 %st_${var}_param1 0\n"
		"  %st_${var}_call = OpFunctionCall %void %st_fn_${var} %st_${var}_ex %st_${var}_param2\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n" +
		storeV2F16AsUint
	);

	const string storeV3F16
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"    %st_${var}_ex = OpCompositeExtract %v3f16 %st_${var}_param1 0\n"
		" %st_${var}_vec_0 = OpVectorShuffle %v2f16 %st_${var}_ex %c_v2f16_n1 0 1\n"
		" %st_${var}_vec_1 = OpVectorShuffle %v2f16 %st_${var}_ex %c_v2f16_n1 2 3\n"
		"  %st_${var}_bc_0 = OpBitcast %u32 %st_${var}_vec_0\n"
		"  %st_${var}_bc_1 = OpBitcast %u32 %st_${var}_vec_1\n"
		" %st_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		" %st_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"                    OpStore %st_${var}_gep_0 %st_${var}_bc_0\n"
		"                    OpStore %st_${var}_gep_1 %st_${var}_bc_1\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n"
	);

	const string storeV4F16
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"    %st_${var}_ex = OpCompositeExtract %v4f16 %st_${var}_param1 0\n"
		" %st_${var}_vec_0 = OpVectorShuffle %v2f16 %st_${var}_ex %c_v2f16_n1 0 1\n"
		" %st_${var}_vec_1 = OpVectorShuffle %v2f16 %st_${var}_ex %c_v2f16_n1 2 3\n"
		"  %st_${var}_bc_0 = OpBitcast %u32 %st_${var}_vec_0\n"
		"  %st_${var}_bc_1 = OpBitcast %u32 %st_${var}_vec_1\n"
		" %st_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		" %st_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"                    OpStore %st_${var}_gep_0 %st_${var}_bc_0\n"
		"                    OpStore %st_${var}_gep_1 %st_${var}_bc_1\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n"
	);

	const string storeF16Arr3
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"  %st_${var}_ex_0 = OpCompositeExtract %f16 %st_${var}_param1 0 0\n"
		"  %st_${var}_ex_1 = OpCompositeExtract %f16 %st_${var}_param1 0 1\n"
		"  %st_${var}_ex_2 = OpCompositeExtract %f16 %st_${var}_param1 0 2\n"
		" %st_${var}_vec_0 = OpCompositeConstruct %v2f16 %st_${var}_ex_0 %st_${var}_ex_1\n"
		" %st_${var}_vec_1 = OpCompositeConstruct %v2f16 %st_${var}_ex_2 %c_f16_na\n"
		"  %st_${var}_bc_0 = OpBitcast %u32 %st_${var}_vec_0\n"
		"  %st_${var}_bc_1 = OpBitcast %u32 %st_${var}_vec_1\n"
		" %st_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		" %st_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"                    OpStore %st_${var}_gep_0 %st_${var}_bc_0\n"
		"                    OpStore %st_${var}_gep_1 %st_${var}_bc_1\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n"
	);

	const string storeV2F16Arr5
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"  %st_${var}_ex_0 = OpCompositeExtract %v2f16 %st_${var}_param1 0 0\n"
		"  %st_${var}_ex_1 = OpCompositeExtract %v2f16 %st_${var}_param1 0 1\n"
		"  %st_${var}_ex_2 = OpCompositeExtract %v2f16 %st_${var}_param1 0 2\n"
		"  %st_${var}_ex_3 = OpCompositeExtract %v2f16 %st_${var}_param1 0 3\n"
		"  %st_${var}_ex_4 = OpCompositeExtract %v2f16 %st_${var}_param1 0 4\n"
		"  %st_${var}_bc_0 = OpBitcast %u32 %st_${var}_ex_0\n"
		"  %st_${var}_bc_1 = OpBitcast %u32 %st_${var}_ex_1\n"
		"  %st_${var}_bc_2 = OpBitcast %u32 %st_${var}_ex_2\n"
		"  %st_${var}_bc_3 = OpBitcast %u32 %st_${var}_ex_3\n"
		"  %st_${var}_bc_4 = OpBitcast %u32 %st_${var}_ex_4\n"
		" %st_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		" %st_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		" %st_${var}_gep_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		" %st_${var}_gep_3 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		" %st_${var}_gep_4 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"                    OpStore %st_${var}_gep_0 %st_${var}_bc_0\n"
		"                    OpStore %st_${var}_gep_1 %st_${var}_bc_1\n"
		"                    OpStore %st_${var}_gep_2 %st_${var}_bc_2\n"
		"                    OpStore %st_${var}_gep_3 %st_${var}_bc_3\n"
		"                    OpStore %st_${var}_gep_4 %st_${var}_bc_4\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n"
	);

	const string storeV3F16Arr5
	(
		"       %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"%st_${var}_param1 = OpFunctionParameter %st_test\n"
		"%st_${var}_param2 = OpFunctionParameter %i32\n"
		" %st_${var}_entry = OpLabel\n"
		"  %st_${var}_ex_0 = OpCompositeExtract %v3f16 %st_${var}_param1 0 0\n"
		"  %st_${var}_ex_1 = OpCompositeExtract %v3f16 %st_${var}_param1 0 1\n"
		"  %st_${var}_ex_2 = OpCompositeExtract %v3f16 %st_${var}_param1 0 2\n"
		"  %st_${var}_ex_3 = OpCompositeExtract %v3f16 %st_${var}_param1 0 3\n"
		"  %st_${var}_ex_4 = OpCompositeExtract %v3f16 %st_${var}_param1 0 4\n"
		"%st_${var}_v2_0_0 = OpVectorShuffle %v2f16 %st_${var}_ex_0 %c_v2f16_n1 0 1\n"
		"%st_${var}_v2_0_1 = OpVectorShuffle %v2f16 %st_${var}_ex_0 %c_v2f16_n1 2 3\n"
		"%st_${var}_v2_1_0 = OpVectorShuffle %v2f16 %st_${var}_ex_1 %c_v2f16_n1 0 1\n"
		"%st_${var}_v2_1_1 = OpVectorShuffle %v2f16 %st_${var}_ex_1 %c_v2f16_n1 2 3\n"
		"%st_${var}_v2_2_0 = OpVectorShuffle %v2f16 %st_${var}_ex_2 %c_v2f16_n1 0 1\n"
		"%st_${var}_v2_2_1 = OpVectorShuffle %v2f16 %st_${var}_ex_2 %c_v2f16_n1 2 3\n"
		"%st_${var}_v2_3_0 = OpVectorShuffle %v2f16 %st_${var}_ex_3 %c_v2f16_n1 0 1\n"
		"%st_${var}_v2_3_1 = OpVectorShuffle %v2f16 %st_${var}_ex_3 %c_v2f16_n1 2 3\n"
		"%st_${var}_v2_4_0 = OpVectorShuffle %v2f16 %st_${var}_ex_4 %c_v2f16_n1 0 1\n"
		"%st_${var}_v2_4_1 = OpVectorShuffle %v2f16 %st_${var}_ex_4 %c_v2f16_n1 2 3\n"
		"%st_${var}_bc_0_0 = OpBitcast %u32 %st_${var}_v2_0_0\n"
		"%st_${var}_bc_0_1 = OpBitcast %u32 %st_${var}_v2_0_1\n"
		"%st_${var}_bc_1_0 = OpBitcast %u32 %st_${var}_v2_1_0\n"
		"%st_${var}_bc_1_1 = OpBitcast %u32 %st_${var}_v2_1_1\n"
		"%st_${var}_bc_2_0 = OpBitcast %u32 %st_${var}_v2_2_0\n"
		"%st_${var}_bc_2_1 = OpBitcast %u32 %st_${var}_v2_2_1\n"
		"%st_${var}_bc_3_0 = OpBitcast %u32 %st_${var}_v2_3_0\n"
		"%st_${var}_bc_3_1 = OpBitcast %u32 %st_${var}_v2_3_1\n"
		"%st_${var}_bc_4_0 = OpBitcast %u32 %st_${var}_v2_4_0\n"
		"%st_${var}_bc_4_1 = OpBitcast %u32 %st_${var}_v2_4_1\n"
		" %st_${var}_gep_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		" %st_${var}_gep_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		" %st_${var}_gep_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		" %st_${var}_gep_3 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		" %st_${var}_gep_4 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		" %st_${var}_gep_5 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_5\n"
		" %st_${var}_gep_6 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_6\n"
		" %st_${var}_gep_7 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_7\n"
		" %st_${var}_gep_8 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_8\n"
		" %st_${var}_gep_9 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_9\n"
		"                    OpStore %st_${var}_gep_0 %st_${var}_bc_0_0\n"
		"                    OpStore %st_${var}_gep_1 %st_${var}_bc_0_1\n"
		"                    OpStore %st_${var}_gep_2 %st_${var}_bc_1_0\n"
		"                    OpStore %st_${var}_gep_3 %st_${var}_bc_1_1\n"
		"                    OpStore %st_${var}_gep_4 %st_${var}_bc_2_0\n"
		"                    OpStore %st_${var}_gep_5 %st_${var}_bc_2_1\n"
		"                    OpStore %st_${var}_gep_6 %st_${var}_bc_3_0\n"
		"                    OpStore %st_${var}_gep_7 %st_${var}_bc_3_1\n"
		"                    OpStore %st_${var}_gep_8 %st_${var}_bc_4_0\n"
		"                    OpStore %st_${var}_gep_9 %st_${var}_bc_4_1\n"
		"                    OpReturn\n"
		"                    OpFunctionEnd\n"
	);

	const string storeV4F16Arr3
	(
		"        %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		" %st_${var}_param1 = OpFunctionParameter %st_test\n"
		" %st_${var}_param2 = OpFunctionParameter %i32\n"
		"  %st_${var}_entry = OpLabel\n"
		"   %st_${var}_ex_0 = OpCompositeExtract %v4f16 %st_${var}_param1 0 0\n"
		"   %st_${var}_ex_1 = OpCompositeExtract %v4f16 %st_${var}_param1 0 1\n"
		"   %st_${var}_ex_2 = OpCompositeExtract %v4f16 %st_${var}_param1 0 2\n"
		"%st_${var}_vec_0_0 = OpVectorShuffle %v2f16 %st_${var}_ex_0 %st_${var}_ex_0 0 1\n"
		"%st_${var}_vec_0_1 = OpVectorShuffle %v2f16 %st_${var}_ex_0 %st_${var}_ex_0 2 3\n"
		"%st_${var}_vec_1_0 = OpVectorShuffle %v2f16 %st_${var}_ex_1 %st_${var}_ex_1 0 1\n"
		"%st_${var}_vec_1_1 = OpVectorShuffle %v2f16 %st_${var}_ex_1 %st_${var}_ex_1 2 3\n"
		"%st_${var}_vec_2_0 = OpVectorShuffle %v2f16 %st_${var}_ex_2 %st_${var}_ex_2 0 1\n"
		"%st_${var}_vec_2_1 = OpVectorShuffle %v2f16 %st_${var}_ex_2 %st_${var}_ex_2 2 3\n"
		" %st_${var}_bc_0_0 = OpBitcast %u32 %st_${var}_vec_0_0\n"
		" %st_${var}_bc_0_1 = OpBitcast %u32 %st_${var}_vec_0_1\n"
		" %st_${var}_bc_1_0 = OpBitcast %u32 %st_${var}_vec_1_0\n"
		" %st_${var}_bc_1_1 = OpBitcast %u32 %st_${var}_vec_1_1\n"
		" %st_${var}_bc_2_0 = OpBitcast %u32 %st_${var}_vec_2_0\n"
		" %st_${var}_bc_2_1 = OpBitcast %u32 %st_${var}_vec_2_1\n"
		"%st_${var}_gep_0_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"%st_${var}_gep_0_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"%st_${var}_gep_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		"%st_${var}_gep_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		"%st_${var}_gep_2_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"%st_${var}_gep_2_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_5\n"
		"                     OpStore %st_${var}_gep_0_0 %st_${var}_bc_0_0\n"
		"                     OpStore %st_${var}_gep_0_1 %st_${var}_bc_0_1\n"
		"                     OpStore %st_${var}_gep_1_0 %st_${var}_bc_1_0\n"
		"                     OpStore %st_${var}_gep_1_1 %st_${var}_bc_1_1\n"
		"                     OpStore %st_${var}_gep_2_0 %st_${var}_bc_2_0\n"
		"                     OpStore %st_${var}_gep_2_1 %st_${var}_bc_2_1\n"
		"                     OpReturn\n"
		"                     OpFunctionEnd\n"
	);

	const string storeStruct16Arr3
	(
		"          %st_${var} = OpFunction %void None %void_st_test_i32_fn\n"
		"   %st_${var}_param1 = OpFunctionParameter %st_test\n"
		"   %st_${var}_param2 = OpFunctionParameter %i32\n"
		"    %st_${var}_entry = OpLabel\n"
		"     %st_${var}_st_0 = OpCompositeExtract %struct16 %st_${var}_param1 0 0\n"
		"     %st_${var}_st_1 = OpCompositeExtract %struct16 %st_${var}_param1 0 1\n"
		"     %st_${var}_st_2 = OpCompositeExtract %struct16 %st_${var}_param1 0 2\n"
		"   %st_${var}_el_0   = OpCompositeExtract   %f16 %st_${var}_st_0 0\n"
		"   %st_${var}_v2_0_0 = OpCompositeExtract %v2f16 %st_${var}_st_0 1 0\n"
		"   %st_${var}_v2_0_1 = OpCompositeExtract %v2f16 %st_${var}_st_0 1 1\n"
		"   %st_${var}_v2_0_2 = OpCompositeExtract %v2f16 %st_${var}_st_0 1 2\n"
		"   %st_${var}_el_1   = OpCompositeExtract   %f16 %st_${var}_st_1 0\n"
		"   %st_${var}_v2_1_0 = OpCompositeExtract %v2f16 %st_${var}_st_1 1 0\n"
		"   %st_${var}_v2_1_1 = OpCompositeExtract %v2f16 %st_${var}_st_1 1 1\n"
		"   %st_${var}_v2_1_2 = OpCompositeExtract %v2f16 %st_${var}_st_1 1 2\n"
		"   %st_${var}_el_2   = OpCompositeExtract   %f16 %st_${var}_st_2 0\n"
		"   %st_${var}_v2_2_0 = OpCompositeExtract %v2f16 %st_${var}_st_2 1 0\n"
		"   %st_${var}_v2_2_1 = OpCompositeExtract %v2f16 %st_${var}_st_2 1 1\n"
		"   %st_${var}_v2_2_2 = OpCompositeExtract %v2f16 %st_${var}_st_2 1 2\n"
		"     %st_${var}_v2_0 = OpCompositeConstruct %v2f16 %st_${var}_el_0 %c_f16_na\n"
		"     %st_${var}_v2_1 = OpCompositeConstruct %v2f16 %st_${var}_el_1 %c_f16_na\n"
		"     %st_${var}_v2_2 = OpCompositeConstruct %v2f16 %st_${var}_el_2 %c_f16_na\n"
		"   %st_${var}_bc_0   = OpBitcast %u32 %st_${var}_v2_0\n"
		"   %st_${var}_bc_0_0 = OpBitcast %u32 %st_${var}_v2_0_0\n"
		"   %st_${var}_bc_0_1 = OpBitcast %u32 %st_${var}_v2_0_1\n"
		"   %st_${var}_bc_0_2 = OpBitcast %u32 %st_${var}_v2_0_2\n"
		"   %st_${var}_bc_1   = OpBitcast %u32 %st_${var}_v2_1\n"
		"   %st_${var}_bc_1_0 = OpBitcast %u32 %st_${var}_v2_1_0\n"
		"   %st_${var}_bc_1_1 = OpBitcast %u32 %st_${var}_v2_1_1\n"
		"   %st_${var}_bc_1_2 = OpBitcast %u32 %st_${var}_v2_1_2\n"
		"   %st_${var}_bc_2   = OpBitcast %u32 %st_${var}_v2_2\n"
		"   %st_${var}_bc_2_0 = OpBitcast %u32 %st_${var}_v2_2_0\n"
		"   %st_${var}_bc_2_1 = OpBitcast %u32 %st_${var}_v2_2_1\n"
		"   %st_${var}_bc_2_2 = OpBitcast %u32 %st_${var}_v2_2_2\n"
		"%st_${var}_gep_0_0_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_0\n"
		"%st_${var}_gep_0_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_1\n"
		"%st_${var}_gep_0_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_2\n"
		"%st_${var}_gep_0_1_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_3\n"
		"%st_${var}_gep_1_0_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_4\n"
		"%st_${var}_gep_1_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_5\n"
		"%st_${var}_gep_1_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_6\n"
		"%st_${var}_gep_1_1_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_7\n"
		"%st_${var}_gep_2_0_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_8\n"
		"%st_${var}_gep_2_1_0 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_9\n"
		"%st_${var}_gep_2_1_1 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_10\n"
		"%st_${var}_gep_2_1_2 = OpAccessChain %up_u32 %${var} %c_i32_0 %c_i32_11\n"
		"                       OpStore %st_${var}_gep_0_0_0 %st_${var}_bc_0\n"
		"                       OpStore %st_${var}_gep_0_1_0 %st_${var}_bc_0_0\n"
		"                       OpStore %st_${var}_gep_0_1_1 %st_${var}_bc_0_1\n"
		"                       OpStore %st_${var}_gep_0_1_2 %st_${var}_bc_0_2\n"
		"                       OpStore %st_${var}_gep_1_0_0 %st_${var}_bc_1\n"
		"                       OpStore %st_${var}_gep_1_1_0 %st_${var}_bc_1_0\n"
		"                       OpStore %st_${var}_gep_1_1_1 %st_${var}_bc_1_1\n"
		"                       OpStore %st_${var}_gep_1_1_2 %st_${var}_bc_1_2\n"
		"                       OpStore %st_${var}_gep_2_0_0 %st_${var}_bc_2\n"
		"                       OpStore %st_${var}_gep_2_1_0 %st_${var}_bc_2_0\n"
		"                       OpStore %st_${var}_gep_2_1_1 %st_${var}_bc_2_1\n"
		"                       OpStore %st_${var}_gep_2_1_2 %st_${var}_bc_2_2\n"
		"                       OpReturn\n"
		"                       OpFunctionEnd\n"
	);

	struct OpParts
	{
		const char*	premainDecls;
		const char*	swFunCall;
		const char*	swFunHeader;
		const char*	caseDefaultValue;
		const char*	argsPartial;
	};

	OpParts								opPartsArray[]			=
	{
		// OpCompositeInsert
		{
			"       %fun_t = OpTypeFunction %st_test %f16 %st_test %i32\n"
			"    %SSBO_src = OpTypeStruct %ra_f16\n"
			"    %SSBO_dst = OpTypeStruct %ra_st\n",

			"   %val_new = OpFunctionCall %f16 %ld_arg_ssbo_src %ndx\n"
			"   %val_old = OpFunctionCall %st_test %ld_ssbo_dst %c_i32_0\n"
			"   %val_dst = OpFunctionCall %st_test %sw_fun %val_new %val_old %ndx\n",

			"   %sw_fun = OpFunction %st_test None %fun_t\n"
			"%sw_paramv = OpFunctionParameter %f16\n",

			"%sw_param",

			"%st_test %sw_paramv %sw_param",
		},
		// OpCompositeExtract
		{
			"       %fun_t = OpTypeFunction %f16 %st_test %i32\n"
			"    %SSBO_src = OpTypeStruct %ra_st\n"
			"    %SSBO_dst = OpTypeStruct %ra_f16\n",

			"   %val_src = OpFunctionCall %st_test %ld_ssbo_src %c_i32_0\n"
			"   %val_dst = OpFunctionCall %f16 %sw_fun %val_src %ndx\n",

			"   %sw_fun = OpFunction %f16 None %fun_t\n",

			"%c_f16_na",

			"%f16 %sw_param",
		},
	};

	DE_ASSERT(opIndex < DE_LENGTH_OF_ARRAY(opPartsArray));

	const char*	accessPathF16[] =
	{
		"0",			// %f16
		DE_NULL,
	};
	const char*	accessPathV2F16[] =
	{
		"0 0",			// %v2f16
		"0 1",
	};
	const char*	accessPathV3F16[] =
	{
		"0 0",			// %v3f16
		"0 1",
		"0 2",
		DE_NULL,
	};
	const char*	accessPathV4F16[] =
	{
		"0 0",			// %v4f16"
		"0 1",
		"0 2",
		"0 3",
	};
	const char*	accessPathF16Arr3[] =
	{
		"0 0",			// %f16arr3
		"0 1",
		"0 2",
		DE_NULL,
	};
	const char*	accessPathStruct16Arr3[] =
	{
		"0 0 0",		// %struct16arr3
		DE_NULL,
		"0 0 1 0 0",
		"0 0 1 0 1",
		"0 0 1 1 0",
		"0 0 1 1 1",
		"0 0 1 2 0",
		"0 0 1 2 1",
		"0 1 0",
		DE_NULL,
		"0 1 1 0 0",
		"0 1 1 0 1",
		"0 1 1 1 0",
		"0 1 1 1 1",
		"0 1 1 2 0",
		"0 1 1 2 1",
		"0 2 0",
		DE_NULL,
		"0 2 1 0 0",
		"0 2 1 0 1",
		"0 2 1 1 0",
		"0 2 1 1 1",
		"0 2 1 2 0",
		"0 2 1 2 1",
	};
	const char*	accessPathV2F16Arr5[] =
	{
		"0 0 0",		// %v2f16arr5
		"0 0 1",
		"0 1 0",
		"0 1 1",
		"0 2 0",
		"0 2 1",
		"0 3 0",
		"0 3 1",
		"0 4 0",
		"0 4 1",
	};
	const char*	accessPathV3F16Arr5[] =
	{
		"0 0 0",		// %v3f16arr5
		"0 0 1",
		"0 0 2",
		DE_NULL,
		"0 1 0",
		"0 1 1",
		"0 1 2",
		DE_NULL,
		"0 2 0",
		"0 2 1",
		"0 2 2",
		DE_NULL,
		"0 3 0",
		"0 3 1",
		"0 3 2",
		DE_NULL,
		"0 4 0",
		"0 4 1",
		"0 4 2",
		DE_NULL,
	};
	const char*	accessPathV4F16Arr3[] =
	{
		"0 0 0",		// %v4f16arr3
		"0 0 1",
		"0 0 2",
		"0 0 3",
		"0 1 0",
		"0 1 1",
		"0 1 2",
		"0 1 3",
		"0 2 0",
		"0 2 1",
		"0 2 2",
		"0 2 3",
		DE_NULL,
		DE_NULL,
		DE_NULL,
		DE_NULL,
	};

	struct TypeTestParameters
	{
		const char*		name;
		size_t			accessPathLength;
		const char**	accessPath;
		const string	loadFunction;
		const string	storeFunction;
	};

	const TypeTestParameters typeTestParameters[] =
	{
		{	"f16",			DE_LENGTH_OF_ARRAY(accessPathF16),			accessPathF16,			loadF16,			storeF16		 },
		{	"v2f16",		DE_LENGTH_OF_ARRAY(accessPathV2F16),		accessPathV2F16,		loadV2F16,			storeV2F16		 },
		{	"v3f16",		DE_LENGTH_OF_ARRAY(accessPathV3F16),		accessPathV3F16,		loadV3F16,			storeV3F16		 },
		{	"v4f16",		DE_LENGTH_OF_ARRAY(accessPathV4F16),		accessPathV4F16,		loadV4F16,			storeV4F16		  },
		{	"f16arr3",		DE_LENGTH_OF_ARRAY(accessPathF16Arr3),		accessPathF16Arr3,		loadF16Arr3,		storeF16Arr3	  },
		{	"v2f16arr5",	DE_LENGTH_OF_ARRAY(accessPathV2F16Arr5),	accessPathV2F16Arr5,	loadV2F16Arr5,		storeV2F16Arr5	  },
		{	"v3f16arr5",	DE_LENGTH_OF_ARRAY(accessPathV3F16Arr5),	accessPathV3F16Arr5,	loadV3F16Arr5,		storeV3F16Arr5	  },
		{	"v4f16arr3",	DE_LENGTH_OF_ARRAY(accessPathV4F16Arr3),	accessPathV4F16Arr3,	loadV4F16Arr3,		storeV4F16Arr3	  },
		{	"struct16arr3",	DE_LENGTH_OF_ARRAY(accessPathStruct16Arr3),	accessPathStruct16Arr3,	loadStruct16Arr3,	storeStruct16Arr3},
	};

	for (size_t typeTestNdx = 0; typeTestNdx < DE_LENGTH_OF_ARRAY(typeTestParameters); ++typeTestNdx)
	{
		const OpParts		opParts				= opPartsArray[opIndex];
		const string		testName			= typeTestParameters[typeTestNdx].name;
		const size_t		structItemsCount	= typeTestParameters[typeTestNdx].accessPathLength;
		const char**		accessPath			= typeTestParameters[typeTestNdx].accessPath;
		SpecResource		specResource;
		map<string, string>	specs;
		VulkanFeatures		features;
		map<string, string>	fragments;
		vector<string>		extensions;
		vector<deFloat16>	inputFP16;
		vector<deFloat16>	dummyFP16Output;

		// Generate values for input
		inputFP16.reserve(structItemsCount);
		for (deUint32 structItemNdx = 0; structItemNdx < structItemsCount; ++structItemNdx)
			inputFP16.push_back((accessPath[structItemNdx] == DE_NULL) ? exceptionValue : tcu::Float16(float(structItemNdx)).bits());

		dummyFP16Output.resize(structItemsCount);

		// Generate cases for OpSwitch
		{
			string	caseBodies;
			string	caseList;

			for (deUint32 caseNdx = 0; caseNdx < structItemsCount; ++caseNdx)
				if (accessPath[caseNdx] != DE_NULL)
				{
					map<string, string>	specCase;

					specCase["case_ndx"]		= de::toString(caseNdx);
					specCase["access_path"]		= accessPath[caseNdx];
					specCase["op_args_part"]	= opParts.argsPartial;
					specCase["op_name"]			= opName;

					caseBodies	+= testCaseBody.specialize(specCase);
					caseList	+= de::toString(caseNdx) + " %case_" + de::toString(caseNdx) + " ";
				}

			specs["case_bodies"]	= caseBodies;
			specs["case_list"]		= caseList;
		}

		specs["num_elements"]			= de::toString(structItemsCount);
		specs["field_type"]				= typeTestParameters[typeTestNdx].name;
		specs["struct_item_size"]		= de::toString(structItemsCount * sizeof(deFloat16));
		specs["struct_u32s"]			= de::toString(structItemsCount / 2);
		specs["op_premain_decls"]		= opParts.premainDecls;
		specs["op_sw_fun_call"]			= opParts.swFunCall;
		specs["op_sw_fun_header"]		= opParts.swFunHeader;
		specs["op_case_default_value"]	= opParts.caseDefaultValue;
		if (opIndex == 0) {
			specs["st_call"]			= "st_ssbo_dst";
			specs["st_ndx"]				= "c_i32_0";
		} else {
			specs["st_call"]			= "st_fn_ssbo_dst";
			specs["st_ndx"]				= "ndx";
		}

		fragments["capability"]		= "OpCapability Float16\n";
		fragments["decoration"]		= decoration.specialize(specs);
		fragments["pre_main"]		= preMain.specialize(specs);
		fragments["testfun"]		= testFun.specialize(specs);
		if (opIndex == 0) {
			fragments["testfun"]		+= StringTemplate(loadScalarF16FromUint).specialize({{"var", "ssbo_src"}});
			fragments["testfun"]		+= StringTemplate(typeTestParameters[typeTestNdx].loadFunction).specialize({{"var", "ssbo_dst"}});
			fragments["testfun"]		+= StringTemplate(typeTestParameters[typeTestNdx].storeFunction).specialize({{"var", "ssbo_dst"}});
		} else {
			fragments["testfun"]		+= StringTemplate(typeTestParameters[typeTestNdx].loadFunction).specialize({{"var", "ssbo_src"}});
			fragments["testfun"]		+= StringTemplate(storeScalarF16AsUint).specialize({{"var", "ssbo_dst"}});
		}

		specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(inputFP16)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(dummyFP16Output)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
		specResource.verifyIO = compareFP16CompositeFunc;

		extensions.push_back("VK_KHR_shader_float16_int8");

		features.extFloat16Int8		= EXTFLOAT16INT8FEATURES_FLOAT16;

		finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
	}

	return testGroup.release();
}

struct fp16PerComponent
{
	fp16PerComponent()
		: flavor(0)
		, floatFormat16	(-14, 15, 10, true)
		, outCompCount(0)
		, argCompCount(3, 0)
	{
	}

	bool			callOncePerComponent	()									{ return true; }
	deUint32		getComponentValidity	()									{ return static_cast<deUint32>(-1); }

	virtual double	getULPs					(vector<const deFloat16*>&)			{ return 1.0; }
	virtual double	getMin					(double value, double ulps)			{ return value - floatFormat16.ulp(deAbs(value), ulps); }
	virtual double	getMax					(double value, double ulps)			{ return value + floatFormat16.ulp(deAbs(value), ulps); }

	virtual size_t	getFlavorCount			()									{ return flavorNames.empty() ? 1 : flavorNames.size(); }
	virtual void	setFlavor				(size_t flavorNo)					{ DE_ASSERT(flavorNo < getFlavorCount()); flavor = flavorNo; }
	virtual size_t	getFlavor				()									{ return flavor; }
	virtual string	getCurrentFlavorName	()									{ return flavorNames.empty() ? string("") : flavorNames[getFlavor()]; }

	virtual void	setOutCompCount			(size_t compCount)					{ outCompCount = compCount; }
	virtual size_t	getOutCompCount			()									{ return outCompCount; }

	virtual void	setArgCompCount			(size_t argNo, size_t compCount)	{ argCompCount[argNo] = compCount; }
	virtual size_t	getArgCompCount			(size_t argNo)						{ return argCompCount[argNo]; }

protected:
	size_t				flavor;
	tcu::FloatFormat	floatFormat16;
	size_t				outCompCount;
	vector<size_t>		argCompCount;
	vector<string>		flavorNames;
};

struct fp16OpFNegate : public fp16PerComponent
{
	template <class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(0.0 - d);

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Round : public fp16PerComponent
{
	fp16Round() : fp16PerComponent()
	{
		flavorNames.push_back("Floor(x+0.5)");
		flavorNames.push_back("Floor(x-0.5)");
		flavorNames.push_back("RoundEven");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			result	(0.0);

		switch (flavor)
		{
			case 0:		result = deRound(d);		break;
			case 1:		result = deFloor(d - 0.5);	break;
			case 2:		result = deRoundEven(d);	break;
			default:	TCU_THROW(InternalError, "Invalid flavor specified");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16RoundEven : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deRoundEven(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Trunc : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deTrunc(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FAbs : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deAbs(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FSign : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deSign(d));

		if (x.isNaN())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Floor : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deFloor(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Ceil : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deCeil(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Fract : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deFrac(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Radians : public fp16PerComponent
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2.5;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const float		d		(x.asFloat());
		const float		result	(deFloatRadians(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Degrees : public fp16PerComponent
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2.5;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const float		d		(x.asFloat());
		const float		result	(deFloatDegrees(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Sin : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x			(*in[0]);
		const double	d			(x.asDouble());
		const double	result		(deSin(d));
		const double	unspecUlp	(16.0);
		const double	err			(de::inRange(d, -DE_PI_DOUBLE, DE_PI_DOUBLE) ? deLdExp(1.0, -7) : floatFormat16.ulp(deAbs(result), unspecUlp));

		if (!de::inRange(d, -DE_PI_DOUBLE, DE_PI_DOUBLE))
			return false;

		out[0] = fp16type(result).bits();
		min[0] = result - err;
		max[0] = result + err;

		return true;
	}
};

struct fp16Cos : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x			(*in[0]);
		const double	d			(x.asDouble());
		const double	result		(deCos(d));
		const double	unspecUlp	(16.0);
		const double	err			(de::inRange(d, -DE_PI_DOUBLE, DE_PI_DOUBLE) ? deLdExp(1.0, -7) : floatFormat16.ulp(deAbs(result), unspecUlp));

		if (!de::inRange(d, -DE_PI_DOUBLE, DE_PI_DOUBLE))
			return false;

		out[0] = fp16type(result).bits();
		min[0] = result - err;
		max[0] = result + err;

		return true;
	}
};

struct fp16Tan : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deTan(d));

		if (!de::inRange(d, -DE_PI_DOUBLE, DE_PI_DOUBLE))
			return false;

		out[0] = fp16type(result).bits();
		{
			const double	err			= deLdExp(1.0, -7);
			const double	s1			= deSin(d) + err;
			const double	s2			= deSin(d) - err;
			const double	c1			= deCos(d) + err;
			const double	c2			= deCos(d) - err;
			const double	edgeVals[]	= {s1/c1, s1/c2, s2/c1, s2/c2};
			double			edgeLeft	= out[0];
			double			edgeRight	= out[0];

			if (deSign(c1 * c2) < 0.0)
			{
				edgeLeft	= -std::numeric_limits<double>::infinity();
				edgeRight	= +std::numeric_limits<double>::infinity();
			}
			else
			{
				edgeLeft	= *std::min_element(&edgeVals[0], &edgeVals[DE_LENGTH_OF_ARRAY(edgeVals)]);
				edgeRight	= *std::max_element(&edgeVals[0], &edgeVals[DE_LENGTH_OF_ARRAY(edgeVals)]);
			}

			min[0] = edgeLeft;
			max[0] = edgeRight;
		}

		return true;
	}
};

struct fp16Asin : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deAsin(d));
		const double	error	(deAtan2(d, sqrt(1.0 - d * d)));

		if (!x.isNaN() && deAbs(d) > 1.0)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = result - floatFormat16.ulp(deAbs(error), 2 * 5.0); // This is not a precision test. Value is not from spec
		max[0] = result + floatFormat16.ulp(deAbs(error), 2 * 5.0); // This is not a precision test. Value is not from spec

		return true;
	}
};

struct fp16Acos : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deAcos(d));
		const double	error	(deAtan2(sqrt(1.0 - d * d), d));

		if (!x.isNaN() && deAbs(d) > 1.0)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = result - floatFormat16.ulp(deAbs(error), 2 * 5.0); // This is not a precision test. Value is not from spec
		max[0] = result + floatFormat16.ulp(deAbs(error), 2 * 5.0); // This is not a precision test. Value is not from spec

		return true;
	}
};

struct fp16Atan : public fp16PerComponent
{
	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2 * 5.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deAtanOver(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Sinh : public fp16PerComponent
{
	fp16Sinh() : fp16PerComponent()
	{
		flavorNames.push_back("Double");
		flavorNames.push_back("ExpFP16");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	ulps	(64 * (1.0 + 2 * deAbs(d))); // This is not a precision test. Value is not from spec
		double			result	(0.0);
		double			error	(0.0);

		if (getFlavor() == 0)
		{
			result	= deSinh(d);
			error	= floatFormat16.ulp(deAbs(result), ulps);
		}
		else if (getFlavor() == 1)
		{
			const fp16type	epx	(deExp(d));
			const fp16type	enx	(deExp(-d));
			const fp16type	esx	(epx.asDouble() - enx.asDouble());
			const fp16type	sx2	(esx.asDouble() / 2.0);

			result	= sx2.asDouble();
			error	= deAbs(floatFormat16.ulp(epx.asDouble(), ulps)) + deAbs(floatFormat16.ulp(enx.asDouble(), ulps));
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = result - error;
		max[0] = result + error;

		return true;
	}
};

struct fp16Cosh : public fp16PerComponent
{
	fp16Cosh() : fp16PerComponent()
	{
		flavorNames.push_back("Double");
		flavorNames.push_back("ExpFP16");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	ulps	(64 * (1.0 + 2 * deAbs(d))); // This is not a precision test. Value is not from spec
		double			result	(0.0);

		if (getFlavor() == 0)
		{
			result = deCosh(d);
		}
		else if (getFlavor() == 1)
		{
			const fp16type	epx	(deExp(d));
			const fp16type	enx	(deExp(-d));
			const fp16type	esx	(epx.asDouble() + enx.asDouble());
			const fp16type	sx2	(esx.asDouble() / 2.0);

			result = sx2.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = result - floatFormat16.ulp(deAbs(result), ulps);
		max[0] = result + floatFormat16.ulp(deAbs(result), ulps);

		return true;
	}
};

struct fp16Tanh : public fp16PerComponent
{
	fp16Tanh() : fp16PerComponent()
	{
		flavorNames.push_back("Tanh");
		flavorNames.push_back("SinhCosh");
		flavorNames.push_back("SinhCoshFP16");
		flavorNames.push_back("PolyFP16");
	}

	virtual double getULPs (vector<const deFloat16*>& in)
	{
		const tcu::Float16	x	(*in[0]);
		const double		d	(x.asDouble());

		return 2 * (1.0 + 2 * deAbs(d)); // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	inline double calcPoly (const fp16type& espx, const fp16type& esnx, const fp16type& ecpx, const fp16type& ecnx)
	{
		const fp16type	esx	(espx.asDouble() - esnx.asDouble());
		const fp16type	sx2	(esx.asDouble() / 2.0);
		const fp16type	ecx	(ecpx.asDouble() + ecnx.asDouble());
		const fp16type	cx2	(ecx.asDouble() / 2.0);
		const fp16type	tg	(sx2.asDouble() / cx2.asDouble());
		const double	rez	(tg.asDouble());

		return rez;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			result	(0.0);

		if (getFlavor() == 0)
		{
			result	= deTanh(d);
			min[0]	= getMin(result, getULPs(in));
			max[0]	= getMax(result, getULPs(in));
		}
		else if (getFlavor() == 1)
		{
			result	= deSinh(d) / deCosh(d);
			min[0]	= getMin(result, getULPs(in));
			max[0]	= getMax(result, getULPs(in));
		}
		else if (getFlavor() == 2)
		{
			const fp16type	s	(deSinh(d));
			const fp16type	c	(deCosh(d));

			result	= s.asDouble() / c.asDouble();
			min[0]	= getMin(result, getULPs(in));
			max[0]	= getMax(result, getULPs(in));
		}
		else if (getFlavor() == 3)
		{
			const double	ulps	(getULPs(in));
			const double	epxm	(deExp( d));
			const double	enxm	(deExp(-d));
			const double	epxmerr	= floatFormat16.ulp(epxm, ulps);
			const double	enxmerr	= floatFormat16.ulp(enxm, ulps);
			const fp16type	epx[]	= { fp16type(epxm - epxmerr), fp16type(epxm + epxmerr) };
			const fp16type	enx[]	= { fp16type(enxm - enxmerr), fp16type(enxm + enxmerr) };
			const fp16type	epxm16	(epxm);
			const fp16type	enxm16	(enxm);
			vector<double>	tgs;

			for (size_t spNdx = 0; spNdx < DE_LENGTH_OF_ARRAY(epx); ++spNdx)
			for (size_t snNdx = 0; snNdx < DE_LENGTH_OF_ARRAY(enx); ++snNdx)
			for (size_t cpNdx = 0; cpNdx < DE_LENGTH_OF_ARRAY(epx); ++cpNdx)
			for (size_t cnNdx = 0; cnNdx < DE_LENGTH_OF_ARRAY(enx); ++cnNdx)
			{
				const double tgh = calcPoly(epx[spNdx], enx[snNdx], epx[cpNdx], enx[cnNdx]);

				tgs.push_back(tgh);
			}

			result = calcPoly(epxm16, enxm16, epxm16, enxm16);
			min[0] = *std::min_element(tgs.begin(), tgs.end());
			max[0] = *std::max_element(tgs.begin(), tgs.end());
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();

		return true;
	}
};

struct fp16Asinh : public fp16PerComponent
{
	fp16Asinh() : fp16PerComponent()
	{
		flavorNames.push_back("Double");
		flavorNames.push_back("PolyFP16Wiki");
		flavorNames.push_back("PolyFP16Abs");
	}

	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 256.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			result	(0.0);

		if (getFlavor() == 0)
		{
			result = deAsinh(d);
		}
		else if (getFlavor() == 1)
		{
			const fp16type	x2		(d * d);
			const fp16type	x2p1	(x2.asDouble() + 1.0);
			const fp16type	sq		(deSqrt(x2p1.asDouble()));
			const fp16type	sxsq	(d + sq.asDouble());
			const fp16type	lsxsq	(deLog(sxsq.asDouble()));

			if (lsxsq.isInf())
				return false;

			result = lsxsq.asDouble();
		}
		else if (getFlavor() == 2)
		{
			const fp16type	x2		(d * d);
			const fp16type	x2p1	(x2.asDouble() + 1.0);
			const fp16type	sq		(deSqrt(x2p1.asDouble()));
			const fp16type	sxsq	(deAbs(d) + sq.asDouble());
			const fp16type	lsxsq	(deLog(sxsq.asDouble()));

			result = deSign(d) * lsxsq.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Acosh : public fp16PerComponent
{
	fp16Acosh() : fp16PerComponent()
	{
		flavorNames.push_back("Double");
		flavorNames.push_back("PolyFP16");
	}

	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 16.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			result	(0.0);

		if (!x.isNaN() && d < 1.0)
			return false;

		if (getFlavor() == 0)
		{
			result = deAcosh(d);
		}
		else if (getFlavor() == 1)
		{
			const fp16type	x2		(d * d);
			const fp16type	x2m1	(x2.asDouble() - 1.0);
			const fp16type	sq		(deSqrt(x2m1.asDouble()));
			const fp16type	sxsq	(d + sq.asDouble());
			const fp16type	lsxsq	(deLog(sxsq.asDouble()));

			result = lsxsq.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Atanh : public fp16PerComponent
{
	fp16Atanh() : fp16PerComponent()
	{
		flavorNames.push_back("Double");
		flavorNames.push_back("PolyFP16");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			result	(0.0);

		if (deAbs(d) >= 1.0)
			return false;

		if (getFlavor() == 0)
		{
			const double	ulps	(16.0);	// This is not a precision test. Value is not from spec

			result = deAtanh(d);
			min[0] = getMin(result, ulps);
			max[0] = getMax(result, ulps);
		}
		else if (getFlavor() == 1)
		{
			const fp16type	x1a		(1.0 + d);
			const fp16type	x1b		(1.0 - d);
			const fp16type	x1d		(x1a.asDouble() / x1b.asDouble());
			const fp16type	lx1d	(deLog(x1d.asDouble()));
			const fp16type	lx1d2	(0.5 * lx1d.asDouble());
			const double	error	(2 * (de::inRange(deAbs(x1d.asDouble()), 0.5, 2.0) ? deLdExp(2.0, -7) : floatFormat16.ulp(deAbs(x1d.asDouble()), 3.0)));

			result = lx1d2.asDouble();
			min[0] = result - error;
			max[0] = result + error;
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();

		return true;
	}
};

struct fp16Exp : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	ulps	(10.0 * (1.0 + 2.0 * deAbs(d)));
		const double	result	(deExp(d));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, ulps);
		max[0] = getMax(result, ulps);

		return true;
	}
};

struct fp16Log : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deLog(d));
		const double	error	(de::inRange(deAbs(d), 0.5, 2.0) ? deLdExp(2.0, -7) : floatFormat16.ulp(deAbs(result), 3.0));

		if (d <= 0.0)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = result - error;
		max[0] = result + error;

		return true;
	}
};

struct fp16Exp2 : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deExp2(d));
		const double	ulps	(1.0 + 2.0 * deAbs(fp16type(in[0][0]).asDouble()));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, ulps);
		max[0] = getMax(result, ulps);

		return true;
	}
};

struct fp16Log2 : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deLog2(d));
		const double	error	(de::inRange(deAbs(d), 0.5, 2.0) ? deLdExp(2.0, -7) : floatFormat16.ulp(deAbs(result), 3.0));

		if (d <= 0.0)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = result - error;
		max[0] = result + error;

		return true;
	}
};

struct fp16Sqrt : public fp16PerComponent
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 6.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(deSqrt(d));

		if (!x.isNaN() && d < 0.0)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16InverseSqrt : public fp16PerComponent
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		const double	result	(1.0/deSqrt(d));

		if (!x.isNaN() && d <= 0.0)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16ModfFrac : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			i		(0.0);
		const double	result	(deModf(d, &i));

		if (x.isInf() || x.isNaN())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16ModfInt : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		double			i		(0.0);
		const double	dummy	(deModf(d, &i));
		const double	result	(i);

		DE_UNREF(dummy);

		if (x.isInf() || x.isNaN())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FrexpS : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		int				e		(0);
		const double	result	(deFrExp(d, &e));

		if (x.isNaN() || x.isInf())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FrexpE : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const double	d		(x.asDouble());
		int				e		(0);
		const double	dummy	(deFrExp(d, &e));
		const double	result	(static_cast<double>(e));

		DE_UNREF(dummy);

		if (x.isNaN() || x.isInf())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16OpFAdd : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		const double	result	(xd + yd);

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16OpFSub : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		const double	result	(xd - yd);

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16OpFMul : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		const double	result	(xd * yd);

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16OpFDiv : public fp16PerComponent
{
	fp16OpFDiv() : fp16PerComponent()
	{
		flavorNames.push_back("DirectDiv");
		flavorNames.push_back("InverseDiv");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x			(*in[0]);
		const fp16type	y			(*in[1]);
		const double	xd			(x.asDouble());
		const double	yd			(y.asDouble());
		const double	unspecUlp	(16.0);
		const double	ulpCnt		(de::inRange(deAbs(yd), deLdExp(1, -14), deLdExp(1, 14)) ? 2.5 : unspecUlp);
		double			result		(0.0);

		if (y.isZero())
			return false;

		if (getFlavor() == 0)
		{
			result = (xd / yd);
		}
		else if (getFlavor() == 1)
		{
			const double	invyd	(1.0 / yd);
			const fp16type	invy	(invyd);

			result = (xd * invy.asDouble());
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, ulpCnt);
		max[0] = getMax(result, ulpCnt);

		return true;
	}
};

struct fp16Atan2 : public fp16PerComponent
{
	fp16Atan2() : fp16PerComponent()
	{
		flavorNames.push_back("DoubleCalc");
		flavorNames.push_back("DoubleCalc_PI");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2 * 5.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		double			result	(0.0);

		if (x.isZero() && y.isZero())
			return false;

		if (getFlavor() == 0)
		{
			result	= deAtan2(xd, yd);
		}
		else if (getFlavor() == 1)
		{
			const double	ulps	(2.0 * 5.0); // This is not a precision test. Value is not from spec
			const double	eps		(floatFormat16.ulp(DE_PI_DOUBLE, ulps));

			result	= deAtan2(xd, yd);

			if (de::inRange(deAbs(result), DE_PI_DOUBLE - eps, DE_PI_DOUBLE + eps))
				result	= -result;
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Pow : public fp16PerComponent
{
	fp16Pow() : fp16PerComponent()
	{
		flavorNames.push_back("Pow");
		flavorNames.push_back("PowLog2");
		flavorNames.push_back("PowLog2FP16");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		const double	logxeps	(de::inRange(deAbs(xd), 0.5, 2.0) ? deLdExp(1.0, -7) : floatFormat16.ulp(deLog2(xd), 3.0));
		const double	ulps1	(1.0 + 4.0 * deAbs(yd * (deLog2(xd) - logxeps)));
		const double	ulps2	(1.0 + 4.0 * deAbs(yd * (deLog2(xd) + logxeps)));
		const double	ulps	(deMax(deAbs(ulps1), deAbs(ulps2)));
		double			result	(0.0);

		if (xd < 0.0)
			return false;

		if (x.isZero() && yd <= 0.0)
			return false;

		if (getFlavor() == 0)
		{
			result = dePow(xd, yd);
		}
		else if (getFlavor() == 1)
		{
			const double	l2d	(deLog2(xd));
			const double	e2d	(deExp2(yd * l2d));

			result = e2d;
		}
		else if (getFlavor() == 2)
		{
			const double	l2d	(deLog2(xd));
			const fp16type	l2	(l2d);
			const double	e2d	(deExp2(yd * l2.asDouble()));
			const fp16type	e2	(e2d);

			result = e2.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, ulps);
		max[0] = getMax(result, ulps);

		return true;
	}
};

struct fp16FMin : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		const double	result	(deMin(xd, yd));

		if (x.isNaN() || y.isNaN())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FMax : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const double	yd		(y.asDouble());
		const double	result	(deMax(xd, yd));

		if (x.isNaN() || y.isNaN())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Step : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	edge	(*in[0]);
		const fp16type	x		(*in[1]);
		const double	edged	(edge.asDouble());
		const double	xd		(x.asDouble());
		const double	result	(deStep(edged, xd));

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Ldexp : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const double	xd		(x.asDouble());
		const int		yd		(static_cast<int>(deTrunc(y.asDouble())));
		const double	result	(deLdExp(xd, yd));

		if (y.isNaN() || y.isInf() || y.isDenorm() || yd < -14 || yd > 15)
			return false;

		// Spec: "If this product is too large to be represented in the floating-point type, the result is undefined."
		if (fp16type(result).isInf())
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FClamp : public fp16PerComponent
{
	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	minVal	(*in[1]);
		const fp16type	maxVal	(*in[2]);
		const double	xd		(x.asDouble());
		const double	minVald	(minVal.asDouble());
		const double	maxVald	(maxVal.asDouble());
		const double	result	(deClamp(xd, minVald, maxVald));

		if (minVal.isNaN() || maxVal.isNaN() || minVald > maxVald)
			return false;

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16FMix : public fp16PerComponent
{
	fp16FMix() : fp16PerComponent()
	{
		flavorNames.push_back("DoubleCalc");
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("EmulatingFP16YminusX");
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	x		(*in[0]);
		const fp16type	y		(*in[1]);
		const fp16type	a		(*in[2]);
		const double	ulps	(8.0); // This is not a precision test. Value is not from spec
		double			result	(0.0);

		if (getFlavor() == 0)
		{
			const double	xd		(x.asDouble());
			const double	yd		(y.asDouble());
			const double	ad		(a.asDouble());
			const double	xeps	(floatFormat16.ulp(deAbs(xd * (1.0 - ad)), ulps));
			const double	yeps	(floatFormat16.ulp(deAbs(yd * ad), ulps));
			const double	eps		(xeps + yeps);

			result = deMix(xd, yd, ad);
			min[0] = result - eps;
			max[0] = result + eps;
		}
		else if (getFlavor() == 1)
		{
			const double	xd		(x.asDouble());
			const double	yd		(y.asDouble());
			const double	ad		(a.asDouble());
			const fp16type	am		(1.0 - ad);
			const double	amd		(am.asDouble());
			const fp16type	xam		(xd * amd);
			const double	xamd	(xam.asDouble());
			const fp16type	ya		(yd * ad);
			const double	yad		(ya.asDouble());
			const double	xeps	(floatFormat16.ulp(deAbs(xd * (1.0 - ad)), ulps));
			const double	yeps	(floatFormat16.ulp(deAbs(yd * ad), ulps));
			const double	eps		(xeps + yeps);

			result = xamd + yad;
			min[0] = result - eps;
			max[0] = result + eps;
		}
		else if (getFlavor() == 2)
		{
			const double	xd		(x.asDouble());
			const double	yd		(y.asDouble());
			const double	ad		(a.asDouble());
			const fp16type	ymx		(yd - xd);
			const double	ymxd	(ymx.asDouble());
			const fp16type	ymxa	(ymxd * ad);
			const double	ymxad	(ymxa.asDouble());
			const double	xeps	(floatFormat16.ulp(deAbs(xd * (1.0 - ad)), ulps));
			const double	yeps	(floatFormat16.ulp(deAbs(yd * ad), ulps));
			const double	eps		(xeps + yeps);

			result = xd + ymxad;
			min[0] = result - eps;
			max[0] = result + eps;
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();

		return true;
	}
};

struct fp16SmoothStep : public fp16PerComponent
{
	fp16SmoothStep() : fp16PerComponent()
	{
		flavorNames.push_back("FloatCalc");
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("EmulatingFP16WClamp");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 4.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const fp16type	edge0	(*in[0]);
		const fp16type	edge1	(*in[1]);
		const fp16type	x		(*in[2]);
		double			result	(0.0);

		if (edge0.isNaN() || edge1.isNaN() || x.isNaN() || edge0.asDouble() >= edge1.asDouble())
			return false;

		if (edge0.isInf() || edge1.isInf() || x.isInf())
			return false;

		if (getFlavor() == 0)
		{
			const float	edge0d	(edge0.asFloat());
			const float	edge1d	(edge1.asFloat());
			const float	xd		(x.asFloat());
			const float	sstep	(deFloatSmoothStep(edge0d, edge1d, xd));

			result = sstep;
		}
		else if (getFlavor() == 1)
		{
			const double	edge0d	(edge0.asDouble());
			const double	edge1d	(edge1.asDouble());
			const double	xd		(x.asDouble());

			if (xd <= edge0d)
				result = 0.0;
			else if (xd >= edge1d)
				result = 1.0;
			else
			{
				const fp16type	a	(xd - edge0d);
				const fp16type	b	(edge1d - edge0d);
				const fp16type	t	(a.asDouble() / b.asDouble());
				const fp16type	t2	(2.0 * t.asDouble());
				const fp16type	t3	(3.0 - t2.asDouble());
				const fp16type	t4	(t.asDouble() * t3.asDouble());
				const fp16type	t5	(t.asDouble() * t4.asDouble());

				result = t5.asDouble();
			}
		}
		else if (getFlavor() == 2)
		{
			const double	edge0d	(edge0.asDouble());
			const double	edge1d	(edge1.asDouble());
			const double	xd		(x.asDouble());
			const fp16type	a	(xd - edge0d);
			const fp16type	b	(edge1d - edge0d);
			const fp16type	bi	(1.0 / b.asDouble());
			const fp16type	t0	(a.asDouble() * bi.asDouble());
			const double	tc	(deClamp(t0.asDouble(), 0.0, 1.0));
			const fp16type	t	(tc);
			const fp16type	t2	(2.0 * t.asDouble());
			const fp16type	t3	(3.0 - t2.asDouble());
			const fp16type	t4	(t.asDouble() * t3.asDouble());
			const fp16type	t5	(t.asDouble() * t4.asDouble());

			result = t5.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Fma : public fp16PerComponent
{
	fp16Fma()
	{
		flavorNames.push_back("DoubleCalc");
		flavorNames.push_back("EmulatingFP16");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 16.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 3);
		DE_ASSERT(getArgCompCount(0) == getOutCompCount());
		DE_ASSERT(getArgCompCount(1) == getOutCompCount());
		DE_ASSERT(getArgCompCount(2) == getOutCompCount());
		DE_ASSERT(getOutCompCount() > 0);

		const fp16type	a		(*in[0]);
		const fp16type	b		(*in[1]);
		const fp16type	c		(*in[2]);
		double			result	(0.0);

		if (getFlavor() == 0)
		{
			const double	ad	(a.asDouble());
			const double	bd	(b.asDouble());
			const double	cd	(c.asDouble());

			result	= deMadd(ad, bd, cd);
		}
		else if (getFlavor() == 1)
		{
			const double	ad	(a.asDouble());
			const double	bd	(b.asDouble());
			const double	cd	(c.asDouble());
			const fp16type	ab	(ad * bd);
			const fp16type	r	(ab.asDouble() + cd);

			result	= r.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};


struct fp16AllComponents : public fp16PerComponent
{
	bool		callOncePerComponent	()	{ return false; }
};

struct fp16Length : public fp16AllComponents
{
	fp16Length() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("DoubleCalc");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 4.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(getOutCompCount() == 1);
		DE_ASSERT(in.size() == 1);

		double	result	(0.0);

		if (getFlavor() == 0)
		{
			fp16type	r	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	q	(x.asDouble() * x.asDouble());

				r = fp16type(r.asDouble() + q.asDouble());
			}

			result = deSqrt(r.asDouble());

			out[0] = fp16type(result).bits();
		}
		else if (getFlavor() == 1)
		{
			double	r	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const double	q	(x.asDouble() * x.asDouble());

				r += q;
			}

			result = deSqrt(r);

			out[0] = fp16type(result).bits();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Distance : public fp16AllComponents
{
	fp16Distance() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("DoubleCalc");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 4.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(getOutCompCount() == 1);
		DE_ASSERT(in.size() == 2);
		DE_ASSERT(getArgCompCount(0) == getArgCompCount(1));

		double	result	(0.0);

		if (getFlavor() == 0)
		{
			fp16type	r	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	y	(in[1][componentNdx]);
				const fp16type	d	(x.asDouble() - y.asDouble());
				const fp16type	q	(d.asDouble() * d.asDouble());

				r = fp16type(r.asDouble() + q.asDouble());
			}

			result = deSqrt(r.asDouble());
		}
		else if (getFlavor() == 1)
		{
			double	r	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	y	(in[1][componentNdx]);
				const double	d	(x.asDouble() - y.asDouble());
				const double	q	(d * d);

				r += q;
			}

			result = deSqrt(r);
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = getMin(result, getULPs(in));
		max[0] = getMax(result, getULPs(in));

		return true;
	}
};

struct fp16Cross : public fp16AllComponents
{
	fp16Cross() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("DoubleCalc");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 4.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(getOutCompCount() == 3);
		DE_ASSERT(in.size() == 2);
		DE_ASSERT(getArgCompCount(0) == 3);
		DE_ASSERT(getArgCompCount(1) == 3);

		if (getFlavor() == 0)
		{
			const fp16type	x0		(in[0][0]);
			const fp16type	x1		(in[0][1]);
			const fp16type	x2		(in[0][2]);
			const fp16type	y0		(in[1][0]);
			const fp16type	y1		(in[1][1]);
			const fp16type	y2		(in[1][2]);
			const fp16type	x1y2	(x1.asDouble() * y2.asDouble());
			const fp16type	y1x2	(y1.asDouble() * x2.asDouble());
			const fp16type	x2y0	(x2.asDouble() * y0.asDouble());
			const fp16type	y2x0	(y2.asDouble() * x0.asDouble());
			const fp16type	x0y1	(x0.asDouble() * y1.asDouble());
			const fp16type	y0x1	(y0.asDouble() * x1.asDouble());

			out[0] = fp16type(x1y2.asDouble() - y1x2.asDouble()).bits();
			out[1] = fp16type(x2y0.asDouble() - y2x0.asDouble()).bits();
			out[2] = fp16type(x0y1.asDouble() - y0x1.asDouble()).bits();
		}
		else if (getFlavor() == 1)
		{
			const fp16type	x0		(in[0][0]);
			const fp16type	x1		(in[0][1]);
			const fp16type	x2		(in[0][2]);
			const fp16type	y0		(in[1][0]);
			const fp16type	y1		(in[1][1]);
			const fp16type	y2		(in[1][2]);
			const double	x1y2	(x1.asDouble() * y2.asDouble());
			const double	y1x2	(y1.asDouble() * x2.asDouble());
			const double	x2y0	(x2.asDouble() * y0.asDouble());
			const double	y2x0	(y2.asDouble() * x0.asDouble());
			const double	x0y1	(x0.asDouble() * y1.asDouble());
			const double	y0x1	(y0.asDouble() * x1.asDouble());

			out[0] = fp16type(x1y2 - y1x2).bits();
			out[1] = fp16type(x2y0 - y2x0).bits();
			out[2] = fp16type(x0y1 - y0x1).bits();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			min[ndx] = getMin(fp16type(out[ndx]).asDouble(), getULPs(in));
		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			max[ndx] = getMax(fp16type(out[ndx]).asDouble(), getULPs(in));

		return true;
	}
};

struct fp16Normalize : public fp16AllComponents
{
	fp16Normalize() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("DoubleCalc");

		// flavorNames will be extended later
	}

	virtual void	setArgCompCount			(size_t argNo, size_t compCount)
	{
		DE_ASSERT(argCompCount[argNo] == 0); // Once only

		if (argNo == 0 && argCompCount[argNo] == 0)
		{
			const size_t		maxPermutationsCount	= 24u; // Equal to 4!
			std::vector<int>	indices;

			for (size_t componentNdx = 0; componentNdx < compCount; ++componentNdx)
				indices.push_back(static_cast<int>(componentNdx));

			m_permutations.reserve(maxPermutationsCount);

			permutationsFlavorStart = flavorNames.size();

			do
			{
				tcu::UVec4	permutation;
				std::string	name		= "Permutted_";

				for (size_t componentNdx = 0; componentNdx < compCount; ++componentNdx)
				{
					permutation[static_cast<int>(componentNdx)] = indices[componentNdx];
					name += de::toString(indices[componentNdx]);
				}

				m_permutations.push_back(permutation);
				flavorNames.push_back(name);

			} while(std::next_permutation(indices.begin(), indices.end()));

			permutationsFlavorEnd = flavorNames.size();
		}

		fp16AllComponents::setArgCompCount(argNo, compCount);
	}
	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 8.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 1);
		DE_ASSERT(getArgCompCount(0) == getOutCompCount());

		if (getFlavor() == 0)
		{
			fp16type	r(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	q	(x.asDouble() * x.asDouble());

				r = fp16type(r.asDouble() + q.asDouble());
			}

			r = fp16type(deSqrt(r.asDouble()));

			if (r.isZero())
				return false;

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);

				out[componentNdx] = fp16type(x.asDouble() / r.asDouble()).bits();
			}
		}
		else if (getFlavor() == 1)
		{
			double	r(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const double	q	(x.asDouble() * x.asDouble());

				r += q;
			}

			r = deSqrt(r);

			if (r == 0)
				return false;

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);

				out[componentNdx] = fp16type(x.asDouble() / r).bits();
			}
		}
		else if (de::inBounds<size_t>(getFlavor(), permutationsFlavorStart, permutationsFlavorEnd))
		{
			const int			compCount		(static_cast<int>(getArgCompCount(0)));
			const size_t		permutationNdx	(getFlavor() - permutationsFlavorStart);
			const tcu::UVec4&	permutation		(m_permutations[permutationNdx]);
			fp16type			r				(0.0);

			for (int permComponentNdx = 0; permComponentNdx < compCount; ++permComponentNdx)
			{
				const size_t	componentNdx	(permutation[permComponentNdx]);
				const fp16type	x				(in[0][componentNdx]);
				const fp16type	q				(x.asDouble() * x.asDouble());

				r = fp16type(r.asDouble() + q.asDouble());
			}

			r = fp16type(deSqrt(r.asDouble()));

			if (r.isZero())
				return false;

			for (int permComponentNdx = 0; permComponentNdx < compCount; ++permComponentNdx)
			{
				const size_t	componentNdx	(permutation[permComponentNdx]);
				const fp16type	x				(in[0][componentNdx]);

				out[componentNdx] = fp16type(x.asDouble() / r.asDouble()).bits();
			}
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			min[ndx] = getMin(fp16type(out[ndx]).asDouble(), getULPs(in));
		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			max[ndx] = getMax(fp16type(out[ndx]).asDouble(), getULPs(in));

		return true;
	}

private:
	std::vector<tcu::UVec4> m_permutations;
	size_t					permutationsFlavorStart;
	size_t					permutationsFlavorEnd;
};

struct fp16FaceForward : public fp16AllComponents
{
	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 4.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 3);
		DE_ASSERT(getArgCompCount(0) == getOutCompCount());
		DE_ASSERT(getArgCompCount(1) == getOutCompCount());
		DE_ASSERT(getArgCompCount(2) == getOutCompCount());

		fp16type	dp(0.0);

		for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
		{
			const fp16type	x	(in[1][componentNdx]);
			const fp16type	y	(in[2][componentNdx]);
			const double	xd	(x.asDouble());
			const double	yd	(y.asDouble());
			const fp16type	q	(xd * yd);

			dp = fp16type(dp.asDouble() + q.asDouble());
		}

		if (dp.isNaN() || dp.isZero())
			return false;

		for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
		{
			const fp16type	n	(in[0][componentNdx]);

			out[componentNdx] = (dp.signBit() == 1) ? n.bits() : fp16type(-n.asDouble()).bits();
		}

		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			min[ndx] = getMin(fp16type(out[ndx]).asDouble(), getULPs(in));
		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			max[ndx] = getMax(fp16type(out[ndx]).asDouble(), getULPs(in));

		return true;
	}
};

struct fp16Reflect : public fp16AllComponents
{
	fp16Reflect() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("EmulatingFP16+KeepZeroSign");
		flavorNames.push_back("FloatCalc");
		flavorNames.push_back("FloatCalc+KeepZeroSign");
		flavorNames.push_back("EmulatingFP16+2Nfirst");
		flavorNames.push_back("EmulatingFP16+2Ifirst");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 256.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);
		DE_ASSERT(getArgCompCount(0) == getOutCompCount());
		DE_ASSERT(getArgCompCount(1) == getOutCompCount());

		if (getFlavor() < 4)
		{
			const bool	keepZeroSign	((flavor & 1) != 0 ? true : false);
			const bool	floatCalc		((flavor & 2) != 0 ? true : false);

			if (floatCalc)
			{
				float	dp(0.0f);

				for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
				{
					const fp16type	i	(in[0][componentNdx]);
					const fp16type	n	(in[1][componentNdx]);
					const float		id	(i.asFloat());
					const float		nd	(n.asFloat());
					const float		qd	(id * nd);

					if (keepZeroSign)
						dp = (componentNdx == 0) ? qd : dp + qd;
					else
						dp = dp + qd;
				}

				for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
				{
					const fp16type	i		(in[0][componentNdx]);
					const fp16type	n		(in[1][componentNdx]);
					const float		dpnd	(dp * n.asFloat());
					const float		dpn2d	(2.0f * dpnd);
					const float		idpn2d	(i.asFloat() - dpn2d);
					const fp16type	result	(idpn2d);

					out[componentNdx] = result.bits();
				}
			}
			else
			{
				fp16type	dp(0.0);

				for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
				{
					const fp16type	i	(in[0][componentNdx]);
					const fp16type	n	(in[1][componentNdx]);
					const double	id	(i.asDouble());
					const double	nd	(n.asDouble());
					const fp16type	q	(id * nd);

					if (keepZeroSign)
						dp = (componentNdx == 0) ? q : fp16type(dp.asDouble() + q.asDouble());
					else
						dp = fp16type(dp.asDouble() + q.asDouble());
				}

				if (dp.isNaN())
					return false;

				for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
				{
					const fp16type	i		(in[0][componentNdx]);
					const fp16type	n		(in[1][componentNdx]);
					const fp16type	dpn		(dp.asDouble() * n.asDouble());
					const fp16type	dpn2	(2 * dpn.asDouble());
					const fp16type	idpn2	(i.asDouble() - dpn2.asDouble());

					out[componentNdx] = idpn2.bits();
				}
			}
		}
		else if (getFlavor() == 4)
		{
			fp16type	dp(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	i	(in[0][componentNdx]);
				const fp16type	n	(in[1][componentNdx]);
				const double	id	(i.asDouble());
				const double	nd	(n.asDouble());
				const fp16type	q	(id * nd);

				dp = fp16type(dp.asDouble() + q.asDouble());
			}

			if (dp.isNaN())
				return false;

			for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
			{
				const fp16type	i		(in[0][componentNdx]);
				const fp16type	n		(in[1][componentNdx]);
				const fp16type	n2		(2 * n.asDouble());
				const fp16type	dpn2	(dp.asDouble() * n2.asDouble());
				const fp16type	idpn2	(i.asDouble() - dpn2.asDouble());

				out[componentNdx] = idpn2.bits();
			}
		}
		else if (getFlavor() == 5)
		{
			fp16type	dp2(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	i	(in[0][componentNdx]);
				const fp16type	n	(in[1][componentNdx]);
				const fp16type	i2	(2.0 * i.asDouble());
				const double	i2d	(i2.asDouble());
				const double	nd	(n.asDouble());
				const fp16type	q	(i2d * nd);

				dp2 = fp16type(dp2.asDouble() + q.asDouble());
			}

			if (dp2.isNaN())
				return false;

			for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
			{
				const fp16type	i		(in[0][componentNdx]);
				const fp16type	n		(in[1][componentNdx]);
				const fp16type	dpn2	(dp2.asDouble() * n.asDouble());
				const fp16type	idpn2	(i.asDouble() - dpn2.asDouble());

				out[componentNdx] = idpn2.bits();
			}
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			min[ndx] = getMin(fp16type(out[ndx]).asDouble(), getULPs(in));
		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			max[ndx] = getMax(fp16type(out[ndx]).asDouble(), getULPs(in));

		return true;
	}
};

struct fp16Refract : public fp16AllComponents
{
	fp16Refract() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("EmulatingFP16+KeepZeroSign");
		flavorNames.push_back("FloatCalc");
		flavorNames.push_back("FloatCalc+KeepZeroSign");
	}

	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 8192.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 3);
		DE_ASSERT(getArgCompCount(0) == getOutCompCount());
		DE_ASSERT(getArgCompCount(1) == getOutCompCount());
		DE_ASSERT(getArgCompCount(2) == 1);

		const bool		keepZeroSign	((flavor & 1) != 0 ? true : false);
		const bool		doubleCalc		((flavor & 2) != 0 ? true : false);
		const fp16type	eta				(*in[2]);

		if (doubleCalc)
		{
			double	dp	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	i	(in[0][componentNdx]);
				const fp16type	n	(in[1][componentNdx]);
				const double	id	(i.asDouble());
				const double	nd	(n.asDouble());
				const double	qd	(id * nd);

				if (keepZeroSign)
					dp = (componentNdx == 0) ? qd : dp + qd;
				else
					dp = dp + qd;
			}

			const double	eta2	(eta.asDouble() * eta.asDouble());
			const double	dp2		(dp * dp);
			const double	dp1		(1.0 - dp2);
			const double	dpe		(eta2 * dp1);
			const double	k		(1.0 - dpe);

			if (k < 0.0)
			{
				const fp16type	zero	(0.0);

				for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
					out[componentNdx] = zero.bits();
			}
			else
			{
				const double	sk	(deSqrt(k));

				for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
				{
					const fp16type	i		(in[0][componentNdx]);
					const fp16type	n		(in[1][componentNdx]);
					const double	etai	(i.asDouble() * eta.asDouble());
					const double	etadp	(eta.asDouble() * dp);
					const double	etadpk	(etadp + sk);
					const double	etadpkn	(etadpk * n.asDouble());
					const double	full	(etai - etadpkn);
					const fp16type	result	(full);

					if (result.isInf())
						return false;

					out[componentNdx] = result.bits();
				}
			}
		}
		else
		{
			fp16type	dp	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	i	(in[0][componentNdx]);
				const fp16type	n	(in[1][componentNdx]);
				const double	id	(i.asDouble());
				const double	nd	(n.asDouble());
				const fp16type	q	(id * nd);

				if (keepZeroSign)
					dp = (componentNdx == 0) ? q : fp16type(dp.asDouble() + q.asDouble());
				else
					dp = fp16type(dp.asDouble() + q.asDouble());
			}

			if (dp.isNaN())
				return false;

			const fp16type	eta2(eta.asDouble() * eta.asDouble());
			const fp16type	dp2	(dp.asDouble() * dp.asDouble());
			const fp16type	dp1	(1.0 - dp2.asDouble());
			const fp16type	dpe	(eta2.asDouble() * dp1.asDouble());
			const fp16type	k	(1.0 - dpe.asDouble());

			if (k.asDouble() < 0.0)
			{
				const fp16type	zero	(0.0);

				for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
					out[componentNdx] = zero.bits();
			}
			else
			{
				const fp16type	sk	(deSqrt(k.asDouble()));

				for (size_t componentNdx = 0; componentNdx < getOutCompCount(); ++componentNdx)
				{
					const fp16type	i		(in[0][componentNdx]);
					const fp16type	n		(in[1][componentNdx]);
					const fp16type	etai	(i.asDouble() * eta.asDouble());
					const fp16type	etadp	(eta.asDouble() * dp.asDouble());
					const fp16type	etadpk	(etadp.asDouble() + sk.asDouble());
					const fp16type	etadpkn	(etadpk.asDouble() * n.asDouble());
					const fp16type	full	(etai.asDouble() - etadpkn.asDouble());

					if (full.isNaN() || full.isInf())
						return false;

					out[componentNdx] = full.bits();
				}
			}
		}

		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			min[ndx] = getMin(fp16type(out[ndx]).asDouble(), getULPs(in));
		for (size_t ndx = 0; ndx < getOutCompCount(); ++ndx)
			max[ndx] = getMax(fp16type(out[ndx]).asDouble(), getULPs(in));

		return true;
	}
};

struct fp16Dot : public fp16AllComponents
{
	fp16Dot() : fp16AllComponents()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("FloatCalc");
		flavorNames.push_back("DoubleCalc");

		// flavorNames will be extended later
	}

	virtual void	setArgCompCount			(size_t argNo, size_t compCount)
	{
		DE_ASSERT(argCompCount[argNo] == 0); // Once only

		if (argNo == 0 && argCompCount[argNo] == 0)
		{
			const size_t		maxPermutationsCount	= 24u; // Equal to 4!
			std::vector<int>	indices;

			for (size_t componentNdx = 0; componentNdx < compCount; ++componentNdx)
				indices.push_back(static_cast<int>(componentNdx));

			m_permutations.reserve(maxPermutationsCount);

			permutationsFlavorStart = flavorNames.size();

			do
			{
				tcu::UVec4	permutation;
				std::string	name		= "Permutted_";

				for (size_t componentNdx = 0; componentNdx < compCount; ++componentNdx)
				{
					permutation[static_cast<int>(componentNdx)] = indices[componentNdx];
					name += de::toString(indices[componentNdx]);
				}

				m_permutations.push_back(permutation);
				flavorNames.push_back(name);

			} while(std::next_permutation(indices.begin(), indices.end()));

			permutationsFlavorEnd = flavorNames.size();
		}

		fp16AllComponents::setArgCompCount(argNo, compCount);
	}

	virtual double	getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 16.0; // This is not a precision test. Value is not from spec
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);
		DE_ASSERT(getArgCompCount(0) == getArgCompCount(1));
		DE_ASSERT(getOutCompCount() == 1);

		double	result	(0.0);
		double	eps		(0.0);

		if (getFlavor() == 0)
		{
			fp16type	dp	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	y	(in[1][componentNdx]);
				const fp16type	q	(x.asDouble() * y.asDouble());

				dp = fp16type(dp.asDouble() + q.asDouble());
				eps += floatFormat16.ulp(q.asDouble(), 2.0);
			}

			result = dp.asDouble();
		}
		else if (getFlavor() == 1)
		{
			float	dp	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	y	(in[1][componentNdx]);
				const float		q	(x.asFloat() * y.asFloat());

				dp += q;
				eps += floatFormat16.ulp(static_cast<double>(q), 2.0);
			}

			result = dp;
		}
		else if (getFlavor() == 2)
		{
			double	dp	(0.0);

			for (size_t componentNdx = 0; componentNdx < getArgCompCount(1); ++componentNdx)
			{
				const fp16type	x	(in[0][componentNdx]);
				const fp16type	y	(in[1][componentNdx]);
				const double	q	(x.asDouble() * y.asDouble());

				dp += q;
				eps += floatFormat16.ulp(q, 2.0);
			}

			result = dp;
		}
		else if (de::inBounds<size_t>(getFlavor(), permutationsFlavorStart, permutationsFlavorEnd))
		{
			const int			compCount		(static_cast<int>(getArgCompCount(1)));
			const size_t		permutationNdx	(getFlavor() - permutationsFlavorStart);
			const tcu::UVec4&	permutation		(m_permutations[permutationNdx]);
			fp16type			dp				(0.0);

			for (int permComponentNdx = 0; permComponentNdx < compCount; ++permComponentNdx)
			{
				const size_t		componentNdx	(permutation[permComponentNdx]);
				const fp16type		x				(in[0][componentNdx]);
				const fp16type		y				(in[1][componentNdx]);
				const fp16type		q				(x.asDouble() * y.asDouble());

				dp = fp16type(dp.asDouble() + q.asDouble());
				eps += floatFormat16.ulp(q.asDouble(), 2.0);
			}

			result = dp.asDouble();
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		out[0] = fp16type(result).bits();
		min[0] = result - eps;
		max[0] = result + eps;

		return true;
	}

private:
	std::vector<tcu::UVec4> m_permutations;
	size_t					permutationsFlavorStart;
	size_t					permutationsFlavorEnd;
};

struct fp16VectorTimesScalar : public fp16AllComponents
{
	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2.0;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);
		DE_ASSERT(getArgCompCount(0) == getOutCompCount());
		DE_ASSERT(getArgCompCount(1) == 1);

		fp16type	s	(*in[1]);

		for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
		{
			const fp16type	x	   (in[0][componentNdx]);
			const double    result (s.asDouble() * x.asDouble());
			const fp16type	m	   (result);

			out[componentNdx] = m.bits();
			min[componentNdx] = getMin(result, getULPs(in));
			max[componentNdx] = getMax(result, getULPs(in));
		}

		return true;
	}
};

struct fp16MatrixBase : public fp16AllComponents
{
	deUint32		getComponentValidity			()
	{
		return static_cast<deUint32>(-1);
	}

	inline size_t	getNdx							(const size_t rowCount, const size_t col, const size_t row)
	{
		const size_t minComponentCount	= 0;
		const size_t maxComponentCount	= 3;
		const size_t alignedRowsCount	= (rowCount == 3) ? 4 : rowCount;

		DE_ASSERT(de::inRange(rowCount, minComponentCount + 1, maxComponentCount + 1));
		DE_ASSERT(de::inRange(col, minComponentCount, maxComponentCount));
		DE_ASSERT(de::inBounds(row, minComponentCount, rowCount));
		DE_UNREF(minComponentCount);
		DE_UNREF(maxComponentCount);

		return col * alignedRowsCount + row;
	}

	deUint32		getComponentMatrixValidityMask	(size_t cols, size_t rows)
	{
		deUint32	result	= 0u;

		for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
			{
				const size_t bitNdx = getNdx(rows, colNdx, rowNdx);

				DE_ASSERT(bitNdx < sizeof(result) * 8);

				result |= (1<<bitNdx);
			}

		return result;
	}
};

template<size_t cols, size_t rows>
struct fp16Transpose : public fp16MatrixBase
{
	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 1.0;
	}

	deUint32	getComponentValidity	()
	{
		return getComponentMatrixValidityMask(rows, cols);
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 1);

		const size_t		alignedCols	= (cols == 3) ? 4 : cols;
		const size_t		alignedRows	= (rows == 3) ? 4 : rows;
		vector<deFloat16>	output		(alignedCols * alignedRows, 0);

		DE_ASSERT(output.size() == alignedCols * alignedRows);

		for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
				output[rowNdx * alignedCols + colNdx] = in[0][colNdx * alignedRows + rowNdx];

		deMemcpy(out, &output[0], sizeof(deFloat16) * output.size());
		deMemcpy(min, &output[0], sizeof(deFloat16) * output.size());
		deMemcpy(max, &output[0], sizeof(deFloat16) * output.size());

		return true;
	}
};

template<size_t cols, size_t rows>
struct fp16MatrixTimesScalar : public fp16MatrixBase
{
	virtual double getULPs(vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 4.0;
	}

	deUint32	getComponentValidity	()
	{
		return getComponentMatrixValidityMask(cols, rows);
	}

	template<class fp16type>
	bool calc(vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);
		DE_ASSERT(getArgCompCount(1) == 1);

		const fp16type	y			(in[1][0]);
		const float		scalar		(y.asFloat());
		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(getArgCompCount(0) == alignedCols * alignedRows);
		DE_ASSERT(getOutCompCount() == alignedCols * alignedRows);
		DE_UNREF(alignedCols);

		for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
			{
				const size_t	ndx	(colNdx * alignedRows + rowNdx);
				const fp16type	x	(in[0][ndx]);
				const double	result	(scalar * x.asFloat());

				out[ndx] = fp16type(result).bits();
				min[ndx] = getMin(result, getULPs(in));
				max[ndx] = getMax(result, getULPs(in));
			}

		return true;
	}
};

template<size_t cols, size_t rows>
struct fp16VectorTimesMatrix : public fp16MatrixBase
{
	fp16VectorTimesMatrix() : fp16MatrixBase()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("FloatCalc");
	}

	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return (8.0 * cols);
	}

	deUint32 getComponentValidity ()
	{
		return getComponentMatrixValidityMask(cols, 1);
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);

		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(getOutCompCount() == cols);
		DE_ASSERT(getArgCompCount(0) == rows);
		DE_ASSERT(getArgCompCount(1) == alignedCols * alignedRows);
		DE_UNREF(alignedCols);

		if (getFlavor() == 0)
		{
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
			{
				fp16type	s	(fp16type::zero(1));

				for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
				{
					const fp16type	v	(in[0][rowNdx]);
					const float		vf	(v.asFloat());
					const size_t	ndx	(colNdx * alignedRows + rowNdx);
					const fp16type	x	(in[1][ndx]);
					const float		xf	(x.asFloat());
					const fp16type	m	(vf * xf);

					s = fp16type(s.asFloat() + m.asFloat());
				}

				out[colNdx] = s.bits();
				min[colNdx] = getMin(s.asDouble(), getULPs(in));
				max[colNdx] = getMax(s.asDouble(), getULPs(in));
			}
		}
		else if (getFlavor() == 1)
		{
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
			{
				float	s	(0.0f);

				for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
				{
					const fp16type	v	(in[0][rowNdx]);
					const float		vf	(v.asFloat());
					const size_t	ndx	(colNdx * alignedRows + rowNdx);
					const fp16type	x	(in[1][ndx]);
					const float		xf	(x.asFloat());
					const float		m	(vf * xf);

					s += m;
				}

				out[colNdx] = fp16type(s).bits();
				min[colNdx] = getMin(static_cast<double>(s), getULPs(in));
				max[colNdx] = getMax(static_cast<double>(s), getULPs(in));
			}
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		return true;
	}
};

template<size_t cols, size_t rows>
struct fp16MatrixTimesVector : public fp16MatrixBase
{
	fp16MatrixTimesVector() : fp16MatrixBase()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("FloatCalc");
	}

	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return (8.0 * rows);
	}

	deUint32 getComponentValidity ()
	{
		return getComponentMatrixValidityMask(rows, 1);
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);

		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(getOutCompCount() == rows);
		DE_ASSERT(getArgCompCount(0) == alignedCols * alignedRows);
		DE_ASSERT(getArgCompCount(1) == cols);
		DE_UNREF(alignedCols);

		if (getFlavor() == 0)
		{
			for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
			{
				fp16type	s	(fp16type::zero(1));

				for (size_t colNdx = 0; colNdx < cols; ++colNdx)
				{
					const size_t	ndx	(colNdx * alignedRows + rowNdx);
					const fp16type	x	(in[0][ndx]);
					const float		xf	(x.asFloat());
					const fp16type	v	(in[1][colNdx]);
					const float		vf	(v.asFloat());
					const fp16type	m	(vf * xf);

					s = fp16type(s.asFloat() + m.asFloat());
				}

				out[rowNdx] = s.bits();
				min[rowNdx] = getMin(s.asDouble(), getULPs(in));
				max[rowNdx] = getMax(s.asDouble(), getULPs(in));
			}
		}
		else if (getFlavor() == 1)
		{
			for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
			{
				float	s	(0.0f);

				for (size_t colNdx = 0; colNdx < cols; ++colNdx)
				{
					const size_t	ndx	(colNdx * alignedRows + rowNdx);
					const fp16type	x	(in[0][ndx]);
					const float		xf	(x.asFloat());
					const fp16type	v	(in[1][colNdx]);
					const float		vf	(v.asFloat());
					const float		m	(vf * xf);

					s += m;
				}

				out[rowNdx] = fp16type(s).bits();
				min[rowNdx] = getMin(static_cast<double>(s), getULPs(in));
				max[rowNdx] = getMax(static_cast<double>(s), getULPs(in));
			}
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		return true;
	}
};

template<size_t colsL, size_t rowsL, size_t colsR, size_t rowsR>
struct fp16MatrixTimesMatrix : public fp16MatrixBase
{
	fp16MatrixTimesMatrix() : fp16MatrixBase()
	{
		flavorNames.push_back("EmulatingFP16");
		flavorNames.push_back("FloatCalc");
	}

	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 32.0;
	}

	deUint32 getComponentValidity ()
	{
		return getComponentMatrixValidityMask(colsR, rowsL);
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_STATIC_ASSERT(colsL == rowsR);

		DE_ASSERT(in.size() == 2);

		const size_t	alignedColsL	= (colsL == 3) ? 4 : colsL;
		const size_t	alignedRowsL	= (rowsL == 3) ? 4 : rowsL;
		const size_t	alignedColsR	= (colsR == 3) ? 4 : colsR;
		const size_t	alignedRowsR	= (rowsR == 3) ? 4 : rowsR;

		DE_ASSERT(getOutCompCount() == alignedColsR * alignedRowsL);
		DE_ASSERT(getArgCompCount(0) == alignedColsL * alignedRowsL);
		DE_ASSERT(getArgCompCount(1) == alignedColsR * alignedRowsR);
		DE_UNREF(alignedColsL);
		DE_UNREF(alignedColsR);

		if (getFlavor() == 0)
		{
			for (size_t rowNdx = 0; rowNdx < rowsL; ++rowNdx)
			{
				for (size_t colNdx = 0; colNdx < colsR; ++colNdx)
				{
					const size_t	ndx	(colNdx * alignedRowsL + rowNdx);
					fp16type		s	(fp16type::zero(1));

					for (size_t commonNdx = 0; commonNdx < colsL; ++commonNdx)
					{
						const size_t	ndxl	(commonNdx * alignedRowsL + rowNdx);
						const fp16type	l		(in[0][ndxl]);
						const float		lf		(l.asFloat());
						const size_t	ndxr	(colNdx * alignedRowsR + commonNdx);
						const fp16type	r		(in[1][ndxr]);
						const float		rf		(r.asFloat());
						const fp16type	m		(lf * rf);

						s = fp16type(s.asFloat() + m.asFloat());
					}

					out[ndx] = s.bits();
					min[ndx] = getMin(s.asDouble(), getULPs(in));
					max[ndx] = getMax(s.asDouble(), getULPs(in));
				}
			}
		}
		else if (getFlavor() == 1)
		{
			for (size_t rowNdx = 0; rowNdx < rowsL; ++rowNdx)
			{
				for (size_t colNdx = 0; colNdx < colsR; ++colNdx)
				{
					const size_t	ndx	(colNdx * alignedRowsL + rowNdx);
					float			s	(0.0f);

					for (size_t commonNdx = 0; commonNdx < colsL; ++commonNdx)
					{
						const size_t	ndxl	(commonNdx * alignedRowsL + rowNdx);
						const fp16type	l		(in[0][ndxl]);
						const float		lf		(l.asFloat());
						const size_t	ndxr	(colNdx * alignedRowsR + commonNdx);
						const fp16type	r		(in[1][ndxr]);
						const float		rf		(r.asFloat());
						const float		m		(lf * rf);

						s += m;
					}

					out[ndx] = fp16type(s).bits();
					min[ndx] = getMin(static_cast<double>(s), getULPs(in));
					max[ndx] = getMax(static_cast<double>(s), getULPs(in));
				}
			}
		}
		else
		{
			TCU_THROW(InternalError, "Unknown flavor");
		}

		return true;
	}
};

template<size_t cols, size_t rows>
struct fp16OuterProduct : public fp16MatrixBase
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 2.0;
	}

	deUint32 getComponentValidity ()
	{
		return getComponentMatrixValidityMask(cols, rows);
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		DE_ASSERT(in.size() == 2);

		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(getArgCompCount(0) == rows);
		DE_ASSERT(getArgCompCount(1) == cols);
		DE_ASSERT(getOutCompCount() == alignedCols * alignedRows);
		DE_UNREF(alignedCols);

		for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
		{
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
			{
				const size_t	ndx	(colNdx * alignedRows + rowNdx);
				const fp16type	x	(in[0][rowNdx]);
				const float		xf	(x.asFloat());
				const fp16type	y	(in[1][colNdx]);
				const float		yf	(y.asFloat());
				const fp16type	m	(xf * yf);

				out[ndx] = m.bits();
				min[ndx] = getMin(m.asDouble(), getULPs(in));
				max[ndx] = getMax(m.asDouble(), getULPs(in));
			}
		}

		return true;
	}
};

template<size_t size>
struct fp16Determinant;

template<>
struct fp16Determinant<2> : public fp16MatrixBase
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 128.0; // This is not a precision test. Value is not from spec
	}

	deUint32 getComponentValidity ()
	{
		return 1;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const size_t	cols		= 2;
		const size_t	rows		= 2;
		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(in.size() == 1);
		DE_ASSERT(getOutCompCount() == 1);
		DE_ASSERT(getArgCompCount(0) == alignedRows * alignedCols);
		DE_UNREF(alignedCols);
		DE_UNREF(alignedRows);

		// [ a b ]
		// [ c d ]
		const float		a		(fp16type(in[0][getNdx(rows, 0, 0)]).asFloat());
		const float		b		(fp16type(in[0][getNdx(rows, 1, 0)]).asFloat());
		const float		c		(fp16type(in[0][getNdx(rows, 0, 1)]).asFloat());
		const float		d		(fp16type(in[0][getNdx(rows, 1, 1)]).asFloat());
		const float		ad		(a * d);
		const fp16type	adf16	(ad);
		const float		bc		(b * c);
		const fp16type	bcf16	(bc);
		const float		r		(adf16.asFloat() - bcf16.asFloat());
		const fp16type	rf16	(r);

		out[0] = rf16.bits();
		min[0] = getMin(r, getULPs(in));
		max[0] = getMax(r, getULPs(in));

		return true;
	}
};

template<>
struct fp16Determinant<3> : public fp16MatrixBase
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 128.0; // This is not a precision test. Value is not from spec
	}

	deUint32 getComponentValidity ()
	{
		return 1;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const size_t	cols		= 3;
		const size_t	rows		= 3;
		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(in.size() == 1);
		DE_ASSERT(getOutCompCount() == 1);
		DE_ASSERT(getArgCompCount(0) == alignedRows * alignedCols);
		DE_UNREF(alignedCols);
		DE_UNREF(alignedRows);

		// [ a b c ]
		// [ d e f ]
		// [ g h i ]
		const float		a		(fp16type(in[0][getNdx(rows, 0, 0)]).asFloat());
		const float		b		(fp16type(in[0][getNdx(rows, 1, 0)]).asFloat());
		const float		c		(fp16type(in[0][getNdx(rows, 2, 0)]).asFloat());
		const float		d		(fp16type(in[0][getNdx(rows, 0, 1)]).asFloat());
		const float		e		(fp16type(in[0][getNdx(rows, 1, 1)]).asFloat());
		const float		f		(fp16type(in[0][getNdx(rows, 2, 1)]).asFloat());
		const float		g		(fp16type(in[0][getNdx(rows, 0, 2)]).asFloat());
		const float		h		(fp16type(in[0][getNdx(rows, 1, 2)]).asFloat());
		const float		i		(fp16type(in[0][getNdx(rows, 2, 2)]).asFloat());
		const fp16type	aei		(a * e * i);
		const fp16type	bfg		(b * f * g);
		const fp16type	cdh		(c * d * h);
		const fp16type	ceg		(c * e * g);
		const fp16type	bdi		(b * d * i);
		const fp16type	afh		(a * f * h);
		const float		r		(aei.asFloat() + bfg.asFloat() + cdh.asFloat() - ceg.asFloat() - bdi.asFloat() - afh.asFloat());
		const fp16type	rf16	(r);

		out[0] = rf16.bits();
		min[0] = getMin(r, getULPs(in));
		max[0] = getMax(r, getULPs(in));

		return true;
	}
};

template<>
struct fp16Determinant<4> : public fp16MatrixBase
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 128.0; // This is not a precision test. Value is not from spec
	}

	deUint32 getComponentValidity ()
	{
		return 1;
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const size_t	rows		= 4;
		const size_t	cols		= 4;
		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(in.size() == 1);
		DE_ASSERT(getOutCompCount() == 1);
		DE_ASSERT(getArgCompCount(0) == alignedRows * alignedCols);
		DE_UNREF(alignedCols);
		DE_UNREF(alignedRows);

		// [ a b c d ]
		// [ e f g h ]
		// [ i j k l ]
		// [ m n o p ]
		const float		a		(fp16type(in[0][getNdx(rows, 0, 0)]).asFloat());
		const float		b		(fp16type(in[0][getNdx(rows, 1, 0)]).asFloat());
		const float		c		(fp16type(in[0][getNdx(rows, 2, 0)]).asFloat());
		const float		d		(fp16type(in[0][getNdx(rows, 3, 0)]).asFloat());
		const float		e		(fp16type(in[0][getNdx(rows, 0, 1)]).asFloat());
		const float		f		(fp16type(in[0][getNdx(rows, 1, 1)]).asFloat());
		const float		g		(fp16type(in[0][getNdx(rows, 2, 1)]).asFloat());
		const float		h		(fp16type(in[0][getNdx(rows, 3, 1)]).asFloat());
		const float		i		(fp16type(in[0][getNdx(rows, 0, 2)]).asFloat());
		const float		j		(fp16type(in[0][getNdx(rows, 1, 2)]).asFloat());
		const float		k		(fp16type(in[0][getNdx(rows, 2, 2)]).asFloat());
		const float		l		(fp16type(in[0][getNdx(rows, 3, 2)]).asFloat());
		const float		m		(fp16type(in[0][getNdx(rows, 0, 3)]).asFloat());
		const float		n		(fp16type(in[0][getNdx(rows, 1, 3)]).asFloat());
		const float		o		(fp16type(in[0][getNdx(rows, 2, 3)]).asFloat());
		const float		p		(fp16type(in[0][getNdx(rows, 3, 3)]).asFloat());

		// [ f g h ]
		// [ j k l ]
		// [ n o p ]
		const fp16type	fkp		(f * k * p);
		const fp16type	gln		(g * l * n);
		const fp16type	hjo		(h * j * o);
		const fp16type	hkn		(h * k * n);
		const fp16type	gjp		(g * j * p);
		const fp16type	flo		(f * l * o);
		const fp16type	detA	(a * (fkp.asFloat() + gln.asFloat() + hjo.asFloat() - hkn.asFloat() - gjp.asFloat() - flo.asFloat()));

		// [ e g h ]
		// [ i k l ]
		// [ m o p ]
		const fp16type	ekp		(e * k * p);
		const fp16type	glm		(g * l * m);
		const fp16type	hio		(h * i * o);
		const fp16type	hkm		(h * k * m);
		const fp16type	gip		(g * i * p);
		const fp16type	elo		(e * l * o);
		const fp16type	detB	(b * (ekp.asFloat() + glm.asFloat() + hio.asFloat() - hkm.asFloat() - gip.asFloat() - elo.asFloat()));

		// [ e f h ]
		// [ i j l ]
		// [ m n p ]
		const fp16type	ejp		(e * j * p);
		const fp16type	flm		(f * l * m);
		const fp16type	hin		(h * i * n);
		const fp16type	hjm		(h * j * m);
		const fp16type	fip		(f * i * p);
		const fp16type	eln		(e * l * n);
		const fp16type	detC	(c * (ejp.asFloat() + flm.asFloat() + hin.asFloat() - hjm.asFloat() - fip.asFloat() - eln.asFloat()));

		// [ e f g ]
		// [ i j k ]
		// [ m n o ]
		const fp16type	ejo		(e * j * o);
		const fp16type	fkm		(f * k * m);
		const fp16type	gin		(g * i * n);
		const fp16type	gjm		(g * j * m);
		const fp16type	fio		(f * i * o);
		const fp16type	ekn		(e * k * n);
		const fp16type	detD	(d * (ejo.asFloat() + fkm.asFloat() + gin.asFloat() - gjm.asFloat() - fio.asFloat() - ekn.asFloat()));

		const float		r		(detA.asFloat() - detB.asFloat() + detC.asFloat() - detD.asFloat());
		const fp16type	rf16	(r);

		out[0] = rf16.bits();
		min[0] = getMin(r, getULPs(in));
		max[0] = getMax(r, getULPs(in));

		return true;
	}
};

template<size_t size>
struct fp16Inverse;

template<>
struct fp16Inverse<2> : public fp16MatrixBase
{
	virtual double getULPs (vector<const deFloat16*>& in)
	{
		DE_UNREF(in);

		return 128.0; // This is not a precision test. Value is not from spec
	}

	deUint32 getComponentValidity ()
	{
		return getComponentMatrixValidityMask(2, 2);
	}

	template<class fp16type>
	bool calc (vector<const deFloat16*>& in, deFloat16* out, double* min, double* max)
	{
		const size_t	cols		= 2;
		const size_t	rows		= 2;
		const size_t	alignedCols	= (cols == 3) ? 4 : cols;
		const size_t	alignedRows	= (rows == 3) ? 4 : rows;

		DE_ASSERT(in.size() == 1);
		DE_ASSERT(getOutCompCount() == alignedRows * alignedCols);
		DE_ASSERT(getArgCompCount(0) == alignedRows * alignedCols);
		DE_UNREF(alignedCols);

		// [ a b ]
		// [ c d ]
		const float		a		(fp16type(in[0][getNdx(rows, 0, 0)]).asFloat());
		const float		b		(fp16type(in[0][getNdx(rows, 1, 0)]).asFloat());
		const float		c		(fp16type(in[0][getNdx(rows, 0, 1)]).asFloat());
		const float		d		(fp16type(in[0][getNdx(rows, 1, 1)]).asFloat());
		const float		ad		(a * d);
		const fp16type	adf16	(ad);
		const float		bc		(b * c);
		const fp16type	bcf16	(bc);
		const float		det		(adf16.asFloat() - bcf16.asFloat());
		const fp16type	det16	(det);

		out[0] = fp16type( d / det16.asFloat()).bits();
		out[1] = fp16type(-c / det16.asFloat()).bits();
		out[2] = fp16type(-b / det16.asFloat()).bits();
		out[3] = fp16type( a / det16.asFloat()).bits();

		for (size_t rowNdx = 0; rowNdx < rows; ++rowNdx)
			for (size_t colNdx = 0; colNdx < cols; ++colNdx)
			{
				const size_t	ndx	(colNdx * alignedRows + rowNdx);
				const fp16type	s	(out[ndx]);

				min[ndx] = getMin(s.asDouble(), getULPs(in));
				max[ndx] = getMax(s.asDouble(), getULPs(in));
			}

		return true;
	}
};

inline std::string fp16ToString(deFloat16 val)
{
	return tcu::toHex<4>(val).toString() + " (" + de::floatToString(tcu::Float16(val).asFloat(), 10) + ")";
}

template <size_t RES_COMPONENTS, size_t ARG0_COMPONENTS, size_t ARG1_COMPONENTS, size_t ARG2_COMPONENTS, class TestedArithmeticFunction>
bool compareFP16ArithmeticFunc (const std::vector<Resource>& inputs, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog& log)
{
	if (inputs.size() < 1 || inputs.size() > 3 || outputAllocs.size() != 1 || expectedOutputs.size() != 1)
		return false;

	const size_t	resultStep			= (RES_COMPONENTS == 3) ? 4 : RES_COMPONENTS;
	const size_t	iterationsCount		= expectedOutputs[0].getByteSize() / (sizeof(deFloat16) * resultStep);
	const size_t	inputsSteps[3]		=
	{
		(ARG0_COMPONENTS == 3) ? 4 : ARG0_COMPONENTS,
		(ARG1_COMPONENTS == 3) ? 4 : ARG1_COMPONENTS,
		(ARG2_COMPONENTS == 3) ? 4 : ARG2_COMPONENTS,
	};

	DE_ASSERT(expectedOutputs[0].getByteSize() > 0);
	DE_ASSERT(expectedOutputs[0].getByteSize() == sizeof(deFloat16) * iterationsCount * resultStep);

	for (size_t inputNdx = 0; inputNdx < inputs.size(); ++inputNdx)
	{
		DE_ASSERT(inputs[inputNdx].getByteSize() > 0);
		DE_ASSERT(inputs[inputNdx].getByteSize() == sizeof(deFloat16) * iterationsCount * inputsSteps[inputNdx]);
	}

	const deFloat16* const		outputAsFP16					= (const deFloat16*)outputAllocs[0]->getHostPtr();
	TestedArithmeticFunction	func;

	func.setOutCompCount(RES_COMPONENTS);
	func.setArgCompCount(0, ARG0_COMPONENTS);
	func.setArgCompCount(1, ARG1_COMPONENTS);
	func.setArgCompCount(2, ARG2_COMPONENTS);

	const bool					callOncePerComponent			= func.callOncePerComponent();
	const deUint32				componentValidityMask			= func.getComponentValidity();
	const size_t				denormModesCount				= 2;
	const char*					denormModes[denormModesCount]	= { "keep denormal numbers", "flush to zero" };
	const size_t				successfulRunsPerComponent		= denormModesCount * func.getFlavorCount();
	bool						success							= true;
	size_t						validatedCount					= 0;

	vector<deUint8>	inputBytes[3];

	for (size_t inputNdx = 0; inputNdx < inputs.size(); ++inputNdx)
		inputs[inputNdx].getBytes(inputBytes[inputNdx]);

	const deFloat16* const			inputsAsFP16[3]			=
	{
		inputs.size() >= 1 ? (const deFloat16*)&inputBytes[0][0] : DE_NULL,
		inputs.size() >= 2 ? (const deFloat16*)&inputBytes[1][0] : DE_NULL,
		inputs.size() >= 3 ? (const deFloat16*)&inputBytes[2][0] : DE_NULL,
	};

	for (size_t idx = 0; idx < iterationsCount; ++idx)
	{
		std::vector<size_t>			successfulRuns		(RES_COMPONENTS, successfulRunsPerComponent);
		std::vector<std::string>	errors				(RES_COMPONENTS);
		bool						iterationValidated	(true);

		for (size_t denormNdx = 0; denormNdx < 2; ++denormNdx)
		{
			for (size_t flavorNdx = 0; flavorNdx < func.getFlavorCount(); ++flavorNdx)
			{
				func.setFlavor(flavorNdx);

				const deFloat16*			iterationOutputFP16		= &outputAsFP16[idx * resultStep];
				vector<deFloat16>			iterationCalculatedFP16	(resultStep, 0);
				vector<double>				iterationEdgeMin		(resultStep, 0.0);
				vector<double>				iterationEdgeMax		(resultStep, 0.0);
				vector<const deFloat16*>	arguments;

				for (size_t componentNdx = 0; componentNdx < RES_COMPONENTS; ++componentNdx)
				{
					std::string	error;
					bool		reportError = false;

					if (callOncePerComponent || componentNdx == 0)
					{
						bool funcCallResult;

						arguments.clear();

						for (size_t inputNdx = 0; inputNdx < inputs.size(); ++inputNdx)
							arguments.push_back(&inputsAsFP16[inputNdx][idx * inputsSteps[inputNdx] + componentNdx]);

						if (denormNdx == 0)
							funcCallResult = func.template calc<tcu::Float16>(arguments, &iterationCalculatedFP16[componentNdx], &iterationEdgeMin[componentNdx], &iterationEdgeMax[componentNdx]);
						else
							funcCallResult = func.template calc<tcu::Float16Denormless>(arguments, &iterationCalculatedFP16[componentNdx], &iterationEdgeMin[componentNdx], &iterationEdgeMax[componentNdx]);

						if (!funcCallResult)
						{
							iterationValidated = false;

							if (callOncePerComponent)
								continue;
							else
								break;
						}
					}

					if ((componentValidityMask != 0) && (componentValidityMask & (1<<componentNdx)) == 0)
						continue;

					reportError = !compare16BitFloat(iterationCalculatedFP16[componentNdx], iterationOutputFP16[componentNdx], error);

					if (reportError)
					{
						tcu::Float16 expected	(iterationCalculatedFP16[componentNdx]);
						tcu::Float16 outputted	(iterationOutputFP16[componentNdx]);
						tcu::Float64 edgeMin    (iterationEdgeMin[componentNdx]);
						tcu::Float64 edgeMax    (iterationEdgeMax[componentNdx]);

						if (reportError && expected.isNaN())
							reportError = false;

						if (reportError && !expected.isNaN() && !outputted.isNaN())
						{
							if (reportError && !expected.isInf() && !outputted.isInf())
							{
								// Ignore rounding
								if (expected.bits() == outputted.bits() + 1 || expected.bits() + 1 == outputted.bits())
									reportError = false;
							}

							if (reportError && expected.isInf())
							{
								// RTZ rounding mode returns +/-65504 instead of Inf on overflow
								if (expected.sign() == 1 && outputted.bits() == 0x7bff && edgeMin.asDouble() <= std::numeric_limits<double>::max())
									reportError = false;
								else if (expected.sign() == -1 && outputted.bits() == 0xfbff && edgeMax.asDouble() >= -std::numeric_limits<double>::max())
									reportError = false;
							}

							if (reportError)
							{
								const double	outputtedDouble	= outputted.asDouble();

							    DE_ASSERT(edgeMin.isNaN() || edgeMax.isNaN() || (edgeMin.asDouble() <= edgeMax.asDouble()));

								if (de::inRange(outputtedDouble, edgeMin.asDouble(), edgeMax.asDouble()))
									reportError = false;
							}
						}

						if (reportError)
						{
							const size_t		inputsComps[3]	=
							{
								ARG0_COMPONENTS,
								ARG1_COMPONENTS,
								ARG2_COMPONENTS,
							};
							string				inputsValues	("Inputs:");
							string				flavorName		(func.getFlavorCount() == 1 ? "" : string(" flavor ") + de::toString(flavorNdx) + " (" + func.getCurrentFlavorName() + ")");
							std::stringstream	errStream;

							for (size_t inputNdx = 0; inputNdx < inputs.size(); ++inputNdx)
							{
								const size_t	inputCompsCount = inputsComps[inputNdx];

								inputsValues += " [" + de::toString(inputNdx) + "]=(";

								for (size_t compNdx = 0; compNdx < inputCompsCount; ++compNdx)
								{
									const deFloat16 inputComponentValue = inputsAsFP16[inputNdx][idx * inputsSteps[inputNdx] + compNdx];

									inputsValues += fp16ToString(inputComponentValue) + ((compNdx + 1 == inputCompsCount) ? ")": ", ");
								}
							}

							errStream	<< "At"
										<< " iteration " << de::toString(idx)
										<< " component " << de::toString(componentNdx)
										<< " denormMode " << de::toString(denormNdx)
										<< " (" << denormModes[denormNdx] << ")"
										<< " " << flavorName
										<< " " << inputsValues
										<< " outputted:" + fp16ToString(iterationOutputFP16[componentNdx])
										<< " expected:" + fp16ToString(iterationCalculatedFP16[componentNdx])
										<< " or in range: [" << iterationEdgeMin[componentNdx] << ", " << iterationEdgeMax[componentNdx] << "]."
										<< " " << error << "."
										<< std::endl;

							errors[componentNdx] += errStream.str();

							successfulRuns[componentNdx]--;
						}
					}
				}
			}
		}

		for (size_t componentNdx = 0; componentNdx < RES_COMPONENTS; ++componentNdx)
		{
			// Check if any component has total failure
			if (successfulRuns[componentNdx] == 0)
			{
				// Test failed in all denorm modes and all flavors for certain component: dump errors
				log << TestLog::Message << errors[componentNdx] << TestLog::EndMessage;

				success = false;
			}
		}

		if (iterationValidated)
			validatedCount++;
	}

	if (validatedCount < 16)
		TCU_THROW(InternalError, "Too few samples have been validated.");

	return success;
}

// IEEE-754 floating point numbers:
// +--------+------+----------+-------------+
// | binary | sign | exponent | significand |
// +--------+------+----------+-------------+
// | 16-bit |  1   |    5     |     10      |
// +--------+------+----------+-------------+
// | 32-bit |  1   |    8     |     23      |
// +--------+------+----------+-------------+
//
// 16-bit floats:
//
// 0   000 00   00 0000 0001 (0x0001: 2e-24:         minimum positive denormalized)
// 0   000 00   11 1111 1111 (0x03ff: 2e-14 - 2e-24: maximum positive denormalized)
// 0   000 01   00 0000 0000 (0x0400: 2e-14:         minimum positive normalized)
// 0   111 10   11 1111 1111 (0x7bff: 65504:         maximum positive normalized)
//
// 0   000 00   00 0000 0000 (0x0000: +0)
// 0   111 11   00 0000 0000 (0x7c00: +Inf)
// 0   000 00   11 1111 0000 (0x03f0: +Denorm)
// 0   000 01   00 0000 0001 (0x0401: +Norm)
// 0   111 11   00 0000 1111 (0x7c0f: +SNaN)
// 0   111 11   11 1111 0000 (0x7ff0: +QNaN)
// Generate and return 16-bit floats and their corresponding 32-bit values.
//
// The first 14 number pairs are manually picked, while the rest are randomly generated.
// Expected count to be at least 14 (numPicks).
vector<deFloat16> getFloat16a (de::Random& rnd, deUint32 count)
{
	vector<deFloat16>	float16;

	float16.reserve(count);

	// Zero
	float16.push_back(deUint16(0x0000));
	float16.push_back(deUint16(0x8000));
	// Infinity
	float16.push_back(deUint16(0x7c00));
	float16.push_back(deUint16(0xfc00));
	// Normalized
	float16.push_back(deUint16(0x0401));
	float16.push_back(deUint16(0x8401));
	// Some normal number
	float16.push_back(deUint16(0x14cb));
	float16.push_back(deUint16(0x94cb));
	// Min/max positive normal
	float16.push_back(deUint16(0x0400));
	float16.push_back(deUint16(0x7bff));
	// Min/max negative normal
	float16.push_back(deUint16(0x8400));
	float16.push_back(deUint16(0xfbff));
	// PI
	float16.push_back(deUint16(0x4248)); // 3.140625
	float16.push_back(deUint16(0xb248)); // -3.140625
	// PI/2
	float16.push_back(deUint16(0x3e48)); // 1.5703125
	float16.push_back(deUint16(0xbe48)); // -1.5703125
	float16.push_back(deUint16(0x3c00)); // 1.0
	float16.push_back(deUint16(0x3800)); // 0.5
	// Some useful constants
	float16.push_back(tcu::Float16(-2.5f).bits());
	float16.push_back(tcu::Float16(-1.0f).bits());
	float16.push_back(tcu::Float16( 0.4f).bits());
	float16.push_back(tcu::Float16( 2.5f).bits());

	const deUint32		numPicks	= static_cast<deUint32>(float16.size());

	DE_ASSERT(count >= numPicks);
	count -= numPicks;

	for (deUint32 numIdx = 0; numIdx < count; ++numIdx)
	{
		int			sign		= (rnd.getUint16() % 2 == 0) ? +1 : -1;
		int			exponent	= (rnd.getUint16() % 29) - 14 + 1;
		deUint16	mantissa	= static_cast<deUint16>(2 * (rnd.getUint16() % 512));

		// Exclude power of -14 to avoid denorms
		DE_ASSERT(de::inRange(exponent, -13, 15));

		float16.push_back(tcu::Float16::constructBits(sign, exponent, mantissa).bits());
	}

	return float16;
}

static inline vector<deFloat16> getInputData1 (deUint32 seed, size_t count, size_t argNo)
{
	DE_UNREF(argNo);

	de::Random	rnd(seed);

	return getFloat16a(rnd, static_cast<deUint32>(count));
}

static inline vector<deFloat16> getInputData2 (deUint32 seed, size_t count, size_t argNo)
{
	de::Random	rnd		(seed);
	size_t		newCount = static_cast<size_t>(deSqrt(double(count)));

	DE_ASSERT(newCount * newCount == count);

	vector<deFloat16>	float16 = getFloat16a(rnd, static_cast<deUint32>(newCount));

	return squarize(float16, static_cast<deUint32>(argNo));
}

static inline vector<deFloat16> getInputData3 (deUint32 seed, size_t count, size_t argNo)
{
	if (argNo == 0 || argNo == 1)
		return getInputData2(seed, count, argNo);
	else
		return getInputData1(seed<<argNo, count, argNo);
}

vector<deFloat16> getInputData (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	DE_UNREF(stride);

	vector<deFloat16>	result;

	switch (argCount)
	{
		case 1:result = getInputData1(seed, count, argNo); break;
		case 2:result = getInputData2(seed, count, argNo); break;
		case 3:result = getInputData3(seed, count, argNo); break;
		default: TCU_THROW(InternalError, "Invalid argument count specified");
	}

	if (compCount == 3)
	{
		const size_t		newCount = (3 * count) / 4;
		vector<deFloat16>	newResult;

		newResult.reserve(result.size());

		for (size_t ndx = 0; ndx < newCount; ++ndx)
		{
			newResult.push_back(result[ndx]);

			if (ndx % 3 == 2)
				newResult.push_back(0);
		}

		result = newResult;
	}

	DE_ASSERT(result.size() == count);

	return result;
}

// Generator for functions requiring data in range [1, inf]
vector<deFloat16> getInputDataAC (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	vector<deFloat16>	result;

	result = getInputData(seed, count, compCount, stride, argCount, argNo);

	// Filter out values below 1.0 from upper half of numbers
	for (size_t idx = result.size() / 2; idx < result.size(); ++idx)
	{
		const float f = tcu::Float16(result[idx]).asFloat();

		if (f < 1.0f)
			result[idx] = tcu::Float16(1.0f - f).bits();
	}

	return result;
}

// Generator for functions requiring data in range [-1, 1]
vector<deFloat16> getInputDataA (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	vector<deFloat16>	result;

	result = getInputData(seed, count, compCount, stride, argCount, argNo);

	for (size_t idx = result.size() / 2; idx < result.size(); ++idx)
	{
		const float f = tcu::Float16(result[idx]).asFloat();

		if (!de::inRange(f, -1.0f, 1.0f))
			result[idx] = tcu::Float16(deFloatFrac(f)).bits();
	}

	return result;
}

// Generator for functions requiring data in range [-pi, pi]
vector<deFloat16> getInputDataPI (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	vector<deFloat16>	result;

	result = getInputData(seed, count, compCount, stride, argCount, argNo);

	for (size_t idx = result.size() / 2; idx < result.size(); ++idx)
	{
		const float f = tcu::Float16(result[idx]).asFloat();

		if (!de::inRange(f, -DE_PI, DE_PI))
			result[idx] = tcu::Float16(fmodf(f, DE_PI)).bits();
	}

	return result;
}

// Generator for functions requiring data in range [0, inf]
vector<deFloat16> getInputDataP (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	vector<deFloat16>	result;

	result = getInputData(seed, count, compCount, stride, argCount, argNo);

	if (argNo == 0)
	{
		for (size_t idx = result.size() / 2; idx < result.size(); ++idx)
			result[idx] &= static_cast<deFloat16>(~0x8000);
	}

	return result;
}

vector<deFloat16> getInputDataV (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	DE_UNREF(stride);
	DE_UNREF(argCount);

	vector<deFloat16>	result;

	if (argNo == 0)
		result = getInputData2(seed, count, argNo);
	else
	{
		const size_t		alignedCount	= (compCount == 3) ? 4 : compCount;
		const size_t		newCountX		= static_cast<size_t>(deSqrt(double(count * alignedCount)));
		const size_t		newCountY		= count / newCountX;
		de::Random			rnd				(seed);
		vector<deFloat16>	float16			= getFloat16a(rnd, static_cast<deUint32>(newCountX));

		DE_ASSERT(newCountX * newCountX == alignedCount * count);

		for (size_t numIdx = 0; numIdx < newCountX; ++numIdx)
		{
			const vector<deFloat16>	tmp(newCountY, float16[numIdx]);

			result.insert(result.end(), tmp.begin(), tmp.end());
		}
	}

	DE_ASSERT(result.size() == count);

	return result;
}

vector<deFloat16> getInputDataM (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	DE_UNREF(compCount);
	DE_UNREF(stride);
	DE_UNREF(argCount);

	de::Random			rnd		(seed << argNo);
	vector<deFloat16>	result;

	result = getFloat16a(rnd, static_cast<deUint32>(count));

	DE_ASSERT(result.size() == count);

	return result;
}

vector<deFloat16> getInputDataD (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	DE_UNREF(compCount);
	DE_UNREF(argCount);

	de::Random			rnd		(seed << argNo);
	vector<deFloat16>	result;

	for (deUint32 numIdx = 0; numIdx < count; ++numIdx)
	{
		int num	= (rnd.getUint16() % 16) - 8;

		result.push_back(tcu::Float16(float(num)).bits());
	}

	result[0 * stride] = deUint16(0x7c00); // +Inf
	result[1 * stride] = deUint16(0xfc00); // -Inf

	DE_ASSERT(result.size() == count);

	return result;
}

// Generator for smoothstep function
vector<deFloat16> getInputDataSS (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	vector<deFloat16>	result;

	result = getInputDataD(seed, count, compCount, stride, argCount, argNo);

	if (argNo == 0)
	{
		for (size_t idx = result.size() / 2; idx < result.size(); ++idx)
		{
			const float f = tcu::Float16(result[idx]).asFloat();

			if (f > 4.0f)
				result[idx] = tcu::Float16(-f).bits();
		}
	}

	if (argNo == 1)
	{
		for (size_t idx = result.size() / 2; idx < result.size(); ++idx)
		{
			const float f = tcu::Float16(result[idx]).asFloat();

			if (f < 4.0f)
				result[idx] = tcu::Float16(-f).bits();
		}
	}

	return result;
}

// Generates normalized vectors for arguments 0 and 1
vector<deFloat16> getInputDataN (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	DE_UNREF(compCount);
	DE_UNREF(argCount);

	de::Random			rnd		(seed << argNo);
	vector<deFloat16>	result;

	if (argNo == 0 || argNo == 1)
	{
		// The input parameters for the incident vector I and the surface normal N must already be normalized
		for (size_t numIdx = 0; numIdx < count; numIdx += stride)
		{
			vector <float>	unnormolized;
			float			sum				= 0;

			for (size_t compIdx = 0; compIdx < compCount; ++compIdx)
				unnormolized.push_back(float((rnd.getUint16() % 16) - 8));

			for (size_t compIdx = 0; compIdx < compCount; ++compIdx)
				sum += unnormolized[compIdx] * unnormolized[compIdx];

			sum = deFloatSqrt(sum);
			if (sum == 0.0f)
				unnormolized[0] = sum = 1.0f;

			for (size_t compIdx = 0; compIdx < compCount; ++compIdx)
				result.push_back(tcu::Float16(unnormolized[compIdx] / sum).bits());

			for (size_t compIdx = compCount; compIdx < stride; ++compIdx)
				result.push_back(0);
		}
	}
	else
	{
		// Input parameter eta
		for (deUint32 numIdx = 0; numIdx < count; ++numIdx)
		{
			int num	= (rnd.getUint16() % 16) - 8;

			result.push_back(tcu::Float16(float(num)).bits());
		}
	}

	DE_ASSERT(result.size() == count);

	return result;
}

// Data generator for complex matrix functions like determinant and inverse
vector<deFloat16> getInputDataC (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo)
{
	DE_UNREF(compCount);
	DE_UNREF(stride);
	DE_UNREF(argCount);

	de::Random			rnd		(seed << argNo);
	vector<deFloat16>	result;

	for (deUint32 numIdx = 0; numIdx < count; ++numIdx)
	{
		int num	= (rnd.getUint16() % 16) - 8;

		result.push_back(tcu::Float16(float(num)).bits());
	}

	DE_ASSERT(result.size() == count);

	return result;
}

struct Math16TestType
{
	const char*		typePrefix;
	const size_t	typeComponents;
	const size_t	typeArrayStride;
	const size_t	typeStructStride;
	const char*		storage_type;
};

enum Math16DataTypes
{
	NONE	= 0,
	SCALAR	= 1,
	VEC2	= 2,
	VEC3	= 3,
	VEC4	= 4,
	MAT2X2,
	MAT2X3,
	MAT2X4,
	MAT3X2,
	MAT3X3,
	MAT3X4,
	MAT4X2,
	MAT4X3,
	MAT4X4,
	MATH16_TYPE_LAST
};

struct Math16ArgFragments
{
	const char*	bodies;
	const char*	variables;
	const char*	decorations;
	const char*	funcVariables;
};

typedef vector<deFloat16> Math16GetInputData (deUint32 seed, size_t count, size_t compCount, size_t stride, size_t argCount, size_t argNo);

struct Math16TestFunc
{
	const char*					funcName;
	const char*					funcSuffix;
	size_t						funcArgsCount;
	size_t						typeResult;
	size_t						typeArg0;
	size_t						typeArg1;
	size_t						typeArg2;
	Math16GetInputData*			getInputDataFunc;
	VerifyIOFunc				verifyFunc;
};

template<class SpecResource>
void createFloat16ArithmeticFuncTest (tcu::TestContext& testCtx, tcu::TestCaseGroup& testGroup, const size_t testTypeIdx, const Math16TestFunc& testFunc)
{
	const int					testSpecificSeed			= deStringHash(testGroup.getName());
	const int					seed						= testCtx.getCommandLine().getBaseSeed() ^ testSpecificSeed;
	const size_t				numDataPointsByAxis			= 32;
	const size_t				numDataPoints				= numDataPointsByAxis * numDataPointsByAxis;
	const char*					componentType				= "f16";
	const Math16TestType		testTypes[MATH16_TYPE_LAST]	=
	{
		{ "",		0,	 0,						 0,						"" },
		{ "",		1,	 1 * sizeof(deFloat16),	 2 * sizeof(deFloat16),	"u32_half_ndp" },
		{ "v2",		2,	 2 * sizeof(deFloat16),	 2 * sizeof(deFloat16),	"u32_ndp" },
		{ "v3",		3,	 4 * sizeof(deFloat16),	 4 * sizeof(deFloat16),	"u32_ndp_2" },
		{ "v4",		4,	 4 * sizeof(deFloat16),	 4 * sizeof(deFloat16),	"u32_ndp_2" },
		{ "m2x2",	0,	 4 * sizeof(deFloat16),	 4 * sizeof(deFloat16),	"u32_ndp_2" },
		{ "m2x3",	0,	 8 * sizeof(deFloat16),	 8 * sizeof(deFloat16),	"u32_ndp_4" },
		{ "m2x4",	0,	 8 * sizeof(deFloat16),	 8 * sizeof(deFloat16),	"u32_ndp_4" },
		{ "m3x2",	0,	 8 * sizeof(deFloat16),	 8 * sizeof(deFloat16),	"u32_ndp_3" },
		{ "m3x3",	0,	16 * sizeof(deFloat16),	16 * sizeof(deFloat16),	"u32_ndp_6" },
		{ "m3x4",	0,	16 * sizeof(deFloat16),	16 * sizeof(deFloat16),	"u32_ndp_6" },
		{ "m4x2",	0,	 8 * sizeof(deFloat16),	 8 * sizeof(deFloat16),	"u32_ndp_4" },
		{ "m4x3",	0,	16 * sizeof(deFloat16),	16 * sizeof(deFloat16),	"u32_ndp_8" },
		{ "m4x4",	0,	16 * sizeof(deFloat16),	16 * sizeof(deFloat16),	"u32_ndp_8" },
	};

	DE_ASSERT(testTypeIdx == testTypes[testTypeIdx].typeComponents);


	const StringTemplate preMain
	(
		"     %c_i32_ndp  = OpConstant %i32 ${num_data_points}\n"

		"        %f16     = OpTypeFloat 16\n"
		"        %v2f16   = OpTypeVector %f16 2\n"
		"        %v3f16   = OpTypeVector %f16 3\n"
		"        %v4f16   = OpTypeVector %f16 4\n"
		"        %m2x2f16 = OpTypeMatrix %v2f16 2\n"
		"        %m2x3f16 = OpTypeMatrix %v3f16 2\n"
		"        %m2x4f16 = OpTypeMatrix %v4f16 2\n"
		"        %m3x2f16 = OpTypeMatrix %v2f16 3\n"
		"        %m3x3f16 = OpTypeMatrix %v3f16 3\n"
		"        %m3x4f16 = OpTypeMatrix %v4f16 3\n"
		"        %m4x2f16 = OpTypeMatrix %v2f16 4\n"
		"        %m4x3f16 = OpTypeMatrix %v3f16 4\n"
		"        %m4x4f16 = OpTypeMatrix %v4f16 4\n"

		"       %fp_v2i32 = OpTypePointer Function %v2i32\n"
		"       %fp_v3i32 = OpTypePointer Function %v3i32\n"
		"       %fp_v4i32 = OpTypePointer Function %v4i32\n"

		"      %c_u32_ndp = OpConstant %u32 ${num_data_points}\n"
		" %c_u32_half_ndp = OpSpecConstantOp %u32 UDiv %c_i32_ndp %c_u32_2\n"
		"        %c_u32_5 = OpConstant %u32 5\n"
		"        %c_u32_6 = OpConstant %u32 6\n"
		"        %c_u32_7 = OpConstant %u32 7\n"
		"        %c_u32_8 = OpConstant %u32 8\n"
		"        %c_f16_0 = OpConstant %f16 0\n"
		"        %c_f16_1 = OpConstant %f16 1\n"
		"      %c_v2f16_0 = OpConstantComposite %v2f16 %c_f16_0 %c_f16_0\n"
		"         %up_u32 = OpTypePointer Uniform %u32\n"
		"%c_u32_high_ones = OpConstant %u32 0xffff0000\n"
		" %c_u32_low_ones = OpConstant %u32 0x0000ffff\n"

		"    %ra_u32_half_ndp = OpTypeArray %u32 %c_u32_half_ndp\n"
		"  %SSBO_u32_half_ndp = OpTypeStruct %ra_u32_half_ndp\n"
		"%up_SSBO_u32_half_ndp = OpTypePointer Uniform %SSBO_u32_half_ndp\n"
		"         %ra_u32_ndp = OpTypeArray %u32 %c_u32_ndp\n"
		"       %SSBO_u32_ndp = OpTypeStruct %ra_u32_ndp\n"
		"    %up_SSBO_u32_ndp = OpTypePointer Uniform %SSBO_u32_ndp\n"
		"           %ra_u32_2 = OpTypeArray %u32 %c_u32_2\n"
		"        %up_ra_u32_2 = OpTypePointer Uniform %ra_u32_2\n"
		"      %ra_ra_u32_ndp = OpTypeArray %ra_u32_2 %c_u32_ndp\n"
		"     %SSBO_u32_ndp_2 = OpTypeStruct %ra_ra_u32_ndp\n"
		"  %up_SSBO_u32_ndp_2 = OpTypePointer Uniform %SSBO_u32_ndp_2\n"
		"           %ra_u32_4 = OpTypeArray %u32 %c_u32_4\n"
		"        %up_ra_u32_4 = OpTypePointer Uniform %ra_u32_4\n"
		"        %ra_ra_u32_4 = OpTypeArray %ra_u32_4 %c_u32_ndp\n"
		"     %SSBO_u32_ndp_4 = OpTypeStruct %ra_ra_u32_4\n"
		"  %up_SSBO_u32_ndp_4 = OpTypePointer Uniform %SSBO_u32_ndp_4\n"
		"           %ra_u32_3 = OpTypeArray %u32 %c_u32_3\n"
		"        %up_ra_u32_3 = OpTypePointer Uniform %ra_u32_3\n"
		"        %ra_ra_u32_3 = OpTypeArray %ra_u32_3 %c_u32_ndp\n"
		"     %SSBO_u32_ndp_3 = OpTypeStruct %ra_ra_u32_3\n"
		"  %up_SSBO_u32_ndp_3 = OpTypePointer Uniform %SSBO_u32_ndp_3\n"
		"           %ra_u32_6 = OpTypeArray %u32 %c_u32_6\n"
		"        %up_ra_u32_6 = OpTypePointer Uniform %ra_u32_6\n"
		"        %ra_ra_u32_6 = OpTypeArray %ra_u32_6 %c_u32_ndp\n"
		"     %SSBO_u32_ndp_6 = OpTypeStruct %ra_ra_u32_6\n"
		"  %up_SSBO_u32_ndp_6 = OpTypePointer Uniform %SSBO_u32_ndp_6\n"
		"           %ra_u32_8 = OpTypeArray %u32 %c_u32_8\n"
		"        %up_ra_u32_8 = OpTypePointer Uniform %ra_u32_8\n"
		"        %ra_ra_u32_8 = OpTypeArray %ra_u32_8 %c_u32_ndp\n"
		"     %SSBO_u32_ndp_8 = OpTypeStruct %ra_ra_u32_8\n"
		"  %up_SSBO_u32_ndp_8 = OpTypePointer Uniform %SSBO_u32_ndp_8\n"

		"         %f16_i32_fn = OpTypeFunction %f16 %i32\n"
		"       %v2f16_i32_fn = OpTypeFunction %v2f16 %i32\n"
		"       %v3f16_i32_fn = OpTypeFunction %v3f16 %i32\n"
		"       %v4f16_i32_fn = OpTypeFunction %v4f16 %i32\n"
		"     %m2x2f16_i32_fn = OpTypeFunction %m2x2f16 %i32\n"
		"     %m2x3f16_i32_fn = OpTypeFunction %m2x3f16 %i32\n"
		"     %m2x4f16_i32_fn = OpTypeFunction %m2x4f16 %i32\n"
		"     %m3x2f16_i32_fn = OpTypeFunction %m3x2f16 %i32\n"
		"     %m3x3f16_i32_fn = OpTypeFunction %m3x3f16 %i32\n"
		"     %m3x4f16_i32_fn = OpTypeFunction %m3x4f16 %i32\n"
		"     %m4x2f16_i32_fn = OpTypeFunction %m4x2f16 %i32\n"
		"     %m4x3f16_i32_fn = OpTypeFunction %m4x3f16 %i32\n"
		"     %m4x4f16_i32_fn = OpTypeFunction %m4x4f16 %i32\n"
		"    %void_f16_i32_fn = OpTypeFunction %void %f16 %i32\n"
		"  %void_v2f16_i32_fn = OpTypeFunction %void %v2f16 %i32\n"
		"  %void_v3f16_i32_fn = OpTypeFunction %void %v3f16 %i32\n"
		"  %void_v4f16_i32_fn = OpTypeFunction %void %v4f16 %i32\n"
		"%void_m2x2f16_i32_fn = OpTypeFunction %void %m2x2f16 %i32\n"
		"%void_m2x3f16_i32_fn = OpTypeFunction %void %m2x3f16 %i32\n"
		"%void_m2x4f16_i32_fn = OpTypeFunction %void %m2x4f16 %i32\n"
		"%void_m3x2f16_i32_fn = OpTypeFunction %void %m3x2f16 %i32\n"
		"%void_m3x3f16_i32_fn = OpTypeFunction %void %m3x3f16 %i32\n"
		"%void_m3x4f16_i32_fn = OpTypeFunction %void %m3x4f16 %i32\n"
		"%void_m4x2f16_i32_fn = OpTypeFunction %void %m4x2f16 %i32\n"
		"%void_m4x3f16_i32_fn = OpTypeFunction %void %m4x3f16 %i32\n"
		"%void_m4x4f16_i32_fn = OpTypeFunction %void %m4x4f16 %i32\n"
		"${arg_vars}"
	);

	const StringTemplate decoration
	(
		"OpDecorate %ra_u32_half_ndp ArrayStride 4\n"
		"OpMemberDecorate %SSBO_u32_half_ndp 0 Offset 0\n"
		"OpDecorate %SSBO_u32_half_ndp BufferBlock\n"

		"OpDecorate %ra_u32_ndp ArrayStride 4\n"
		"OpMemberDecorate %SSBO_u32_ndp 0 Offset 0\n"
		"OpDecorate %SSBO_u32_ndp BufferBlock\n"

		"OpDecorate %ra_u32_2 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_ndp ArrayStride 8\n"
		"OpMemberDecorate %SSBO_u32_ndp_2 0 Offset 0\n"
		"OpDecorate %SSBO_u32_ndp_2 BufferBlock\n"

		"OpDecorate %ra_u32_4 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_4 ArrayStride 16\n"
		"OpMemberDecorate %SSBO_u32_ndp_4 0 Offset 0\n"
		"OpDecorate %SSBO_u32_ndp_4 BufferBlock\n"

		"OpDecorate %ra_u32_3 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_3 ArrayStride 16\n"
		"OpMemberDecorate %SSBO_u32_ndp_3 0 Offset 0\n"
		"OpDecorate %SSBO_u32_ndp_3 BufferBlock\n"

		"OpDecorate %ra_u32_6 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_6 ArrayStride 32\n"
		"OpMemberDecorate %SSBO_u32_ndp_6 0 Offset 0\n"
		"OpDecorate %SSBO_u32_ndp_6 BufferBlock\n"

		"OpDecorate %ra_u32_8 ArrayStride 4\n"
		"OpDecorate %ra_ra_u32_8 ArrayStride 32\n"
		"OpMemberDecorate %SSBO_u32_ndp_8 0 Offset 0\n"
		"OpDecorate %SSBO_u32_ndp_8 BufferBlock\n"

		"${arg_decorations}"
	);

	const StringTemplate testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"
		"    %entry = OpLabel\n"

		"        %i = OpVariable %fp_i32 Function\n"
		"${arg_infunc_vars}"
		"             OpStore %i %c_i32_0\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"

		"${arg_func_call}"

		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpReturnValue %param\n"
		"             OpFunctionEnd\n"
	);

	const Math16ArgFragments	argFragment1	=
	{
		"     %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %val_dst = ${op} %${tr} ${ext_inst} %val_src0\n"
		"     %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",
		"",
		"",
		"",
	};

	const Math16ArgFragments	argFragment2	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		" %val_src1 = OpFunctionCall %${t1} %ld_arg_ssbo_src1 %ndx\n"
		"  %val_dst = ${op} %${tr} ${ext_inst} %val_src0 %val_src1\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",
		"",
		"",
		"",
	};

	const Math16ArgFragments	argFragment3	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		" %val_src1 = OpFunctionCall %${t1} %ld_arg_ssbo_src1 %ndx\n"
		" %val_src2 = OpFunctionCall %${t2} %ld_arg_ssbo_src2 %ndx\n"
		"  %val_dst = ${op} %${tr} ${ext_inst} %val_src0 %val_src1 %val_src2\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",
		"",
		"",
		"",
	};

	const Math16ArgFragments	argFragmentLdExp	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		" %val_src1 = OpFunctionCall %${t1} %ld_arg_ssbo_src1 %ndx\n"
		"%val_src1i = OpConvertFToS %${dr}i32 %val_src1\n"
		"  %val_dst = ${op} %${tr} ${ext_inst} %val_src0 %val_src1i\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"",

		"",

		"",
	};

	const Math16ArgFragments	argFragmentModfFrac	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %val_dst = ${op} %${tr} ${ext_inst} %val_src0 %tmp\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"   %fp_tmp = OpTypePointer Function %${tr}\n",

		"",

		"      %tmp = OpVariable %fp_tmp Function\n",
	};

	const Math16ArgFragments	argFragmentModfInt	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"%val_dummy = ${op} %${tr} ${ext_inst} %val_src0 %tmp\n"
		"     %tmp0 = OpAccessChain %fp_tmp %tmp\n"
		"  %val_dst = OpLoad %${tr} %tmp0\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"   %fp_tmp = OpTypePointer Function %${tr}\n",

		"",

		"      %tmp = OpVariable %fp_tmp Function\n",
	};

	const Math16ArgFragments	argFragmentModfStruct	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %val_tmp = ${op} %st_tmp ${ext_inst} %val_src0\n"
		"%tmp_ptr_s = OpAccessChain %fp_tmp %tmp\n"
		"             OpStore %tmp_ptr_s %val_tmp\n"
		"%tmp_ptr_l = OpAccessChain %fp_${tr} %tmp %c_${struct_member}\n"
		"  %val_dst = OpLoad %${tr} %tmp_ptr_l\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"  %fp_${tr} = OpTypePointer Function %${tr}\n"
		"   %st_tmp = OpTypeStruct %${tr} %${tr}\n"
		"   %fp_tmp = OpTypePointer Function %st_tmp\n"
		"   %c_frac = OpConstant %i32 0\n"
		"    %c_int = OpConstant %i32 1\n",

		"OpMemberDecorate %st_tmp 0 Offset 0\n"
		"OpMemberDecorate %st_tmp 1 Offset ${struct_stride}\n",

		"      %tmp = OpVariable %fp_tmp Function\n",
	};

	const Math16ArgFragments	argFragmentFrexpStructS	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %val_tmp = ${op} %st_tmp ${ext_inst} %val_src0\n"
		"%tmp_ptr_s = OpAccessChain %fp_tmp %tmp\n"
		"             OpStore %tmp_ptr_s %val_tmp\n"
		"%tmp_ptr_l = OpAccessChain %fp_${tr} %tmp %c_i32_0\n"
		"  %val_dst = OpLoad %${tr} %tmp_ptr_l\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"  %fp_${tr} = OpTypePointer Function %${tr}\n"
		"   %st_tmp = OpTypeStruct %${tr} %${dr}i32\n"
		"   %fp_tmp = OpTypePointer Function %st_tmp\n",

		"OpMemberDecorate %st_tmp 0 Offset 0\n"
		"OpMemberDecorate %st_tmp 1 Offset ${struct_stride}\n",

		"      %tmp = OpVariable %fp_tmp Function\n",
	};

	const Math16ArgFragments	argFragmentFrexpStructE	=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %val_tmp = ${op} %st_tmp ${ext_inst} %val_src0\n"
		"%tmp_ptr_s = OpAccessChain %fp_tmp %tmp\n"
		"             OpStore %tmp_ptr_s %val_tmp\n"
		"%tmp_ptr_l = OpAccessChain %fp_${dr}i32 %tmp %c_i32_1\n"
		"%val_dst_i = OpLoad %${dr}i32 %tmp_ptr_l\n"
		"  %val_dst = OpConvertSToF %${tr} %val_dst_i\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"   %st_tmp = OpTypeStruct %${tr} %${dr}i32\n"
		"   %fp_tmp = OpTypePointer Function %st_tmp\n",

		"OpMemberDecorate %st_tmp 0 Offset 0\n"
		"OpMemberDecorate %st_tmp 1 Offset ${struct_stride}\n",

		"      %tmp = OpVariable %fp_tmp Function\n",
	};

	const Math16ArgFragments	argFragmentFrexpS		=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %out_exp = OpAccessChain %fp_${dr}i32 %tmp\n"
		"  %val_dst = ${op} %${tr} ${ext_inst} %val_src0 %out_exp\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"",

		"",

		"      %tmp = OpVariable %fp_${dr}i32 Function\n",
	};

	const Math16ArgFragments	argFragmentFrexpE		=
	{
		" %val_src0 = OpFunctionCall %${t0} %ld_arg_ssbo_src0 %ndx\n"
		"  %out_exp = OpAccessChain %fp_${dr}i32 %tmp\n"
		"%val_dummy = ${op} %${tr} ${ext_inst} %val_src0 %out_exp\n"
		"%val_dst_i = OpLoad %${dr}i32 %out_exp\n"
		"  %val_dst = OpConvertSToF %${tr} %val_dst_i\n"
		"      %dst = OpFunctionCall %void %st_fn_ssbo_dst %val_dst %ndx\n",

		"",

		"",

		"      %tmp = OpVariable %fp_${dr}i32 Function\n",
	};

	string load_funcs[MATH16_TYPE_LAST];
	load_funcs[SCALAR] = loadScalarF16FromUint;
	load_funcs[VEC2]   = loadV2F16FromUint;
	load_funcs[VEC3]   = loadV3F16FromUints;
	load_funcs[VEC4]   = loadV4F16FromUints;
	load_funcs[MAT2X2] = loadM2x2F16FromUints;
	load_funcs[MAT2X3] = loadM2x3F16FromUints;
	load_funcs[MAT2X4] = loadM2x4F16FromUints;
	load_funcs[MAT3X2] = loadM3x2F16FromUints;
	load_funcs[MAT3X3] = loadM3x3F16FromUints;
	load_funcs[MAT3X4] = loadM3x4F16FromUints;
	load_funcs[MAT4X2] = loadM4x2F16FromUints;
	load_funcs[MAT4X3] = loadM4x3F16FromUints;
	load_funcs[MAT4X4] = loadM4x4F16FromUints;

	string store_funcs[MATH16_TYPE_LAST];
	store_funcs[SCALAR] = storeScalarF16AsUint;
	store_funcs[VEC2]   = storeV2F16AsUint;
	store_funcs[VEC3]   = storeV3F16AsUints;
	store_funcs[VEC4]   = storeV4F16AsUints;
	store_funcs[MAT2X2] = storeM2x2F16AsUints;
	store_funcs[MAT2X3] = storeM2x3F16AsUints;
	store_funcs[MAT2X4] = storeM2x4F16AsUints;
	store_funcs[MAT3X2] = storeM3x2F16AsUints;
	store_funcs[MAT3X3] = storeM3x3F16AsUints;
	store_funcs[MAT3X4] = storeM3x4F16AsUints;
	store_funcs[MAT4X2] = storeM4x2F16AsUints;
	store_funcs[MAT4X3] = storeM4x3F16AsUints;
	store_funcs[MAT4X4] = storeM4x4F16AsUints;

	const Math16TestType&		testType				= testTypes[testTypeIdx];
	const string				funcNameString			= string(testFunc.funcName) + string(testFunc.funcSuffix);
	const string				testName				= de::toLower(funcNameString);
	const Math16ArgFragments*	argFragments			= DE_NULL;
	const size_t				typeStructStride		= testType.typeStructStride;
	const bool					extInst					= !(testFunc.funcName[0] == 'O' && testFunc.funcName[1] == 'p');
	const size_t				numFloatsPerArg0Type	= testTypes[testFunc.typeArg0].typeArrayStride / sizeof(deFloat16);
	const size_t				iterations				= numDataPoints / numFloatsPerArg0Type;
	const size_t				numFloatsPerResultType	= testTypes[testFunc.typeResult].typeArrayStride / sizeof(deFloat16);
	const vector<deFloat16>		float16DummyOutput		(iterations * numFloatsPerResultType, 0);
	VulkanFeatures				features;
	SpecResource				specResource;
	map<string, string>			specs;
	map<string, string>			fragments;
	vector<string>				extensions;
	string						funcCall;
	string						funcVariables;
	string						variables;
	string						declarations;
	string						decorations;
	string						functions;

	switch (testFunc.funcArgsCount)
	{
		case 1:
		{
			argFragments = &argFragment1;

			if (funcNameString == "ModfFrac")		argFragments = &argFragmentModfFrac;
			if (funcNameString == "ModfInt")		argFragments = &argFragmentModfInt;
			if (funcNameString == "ModfStructFrac")	argFragments = &argFragmentModfStruct;
			if (funcNameString == "ModfStructInt")	argFragments = &argFragmentModfStruct;
			if (funcNameString == "FrexpS")			argFragments = &argFragmentFrexpS;
			if (funcNameString == "FrexpE")			argFragments = &argFragmentFrexpE;
			if (funcNameString == "FrexpStructS")	argFragments = &argFragmentFrexpStructS;
			if (funcNameString == "FrexpStructE")	argFragments = &argFragmentFrexpStructE;

			break;
		}
		case 2:
		{
			argFragments = &argFragment2;

			if (funcNameString == "Ldexp")			argFragments = &argFragmentLdExp;

			break;
		}
		case 3:
		{
			argFragments = &argFragment3;

			break;
		}
		default:
		{
			TCU_THROW(InternalError, "Invalid number of arguments");
		}
	}

	functions = StringTemplate(store_funcs[testFunc.typeResult]).specialize({{"var", "ssbo_dst"}});
	if (testFunc.funcArgsCount == 1)
	{
		functions += StringTemplate(load_funcs[testFunc.typeArg0]).specialize({{"var", "ssbo_src0"}});
		variables +=
			" %ssbo_src0 = OpVariable %up_SSBO_${store_t0} Uniform\n"
			"  %ssbo_dst = OpVariable %up_SSBO_${store_tr} Uniform\n";

		decorations +=
			"OpDecorate %ssbo_src0 DescriptorSet 0\n"
			"OpDecorate %ssbo_src0 Binding 0\n"
			"OpDecorate %ssbo_dst DescriptorSet 0\n"
			"OpDecorate %ssbo_dst Binding 1\n";
	}
	else if (testFunc.funcArgsCount == 2)
	{
		functions += StringTemplate(load_funcs[testFunc.typeArg0]).specialize({{"var", "ssbo_src0"}});
		functions += StringTemplate(load_funcs[testFunc.typeArg1]).specialize({{"var", "ssbo_src1"}});
		variables +=
			" %ssbo_src0 = OpVariable %up_SSBO_${store_t0} Uniform\n"
			" %ssbo_src1 = OpVariable %up_SSBO_${store_t1} Uniform\n"
			"  %ssbo_dst = OpVariable %up_SSBO_${store_tr} Uniform\n";

		decorations +=
			"OpDecorate %ssbo_src0 DescriptorSet 0\n"
			"OpDecorate %ssbo_src0 Binding 0\n"
			"OpDecorate %ssbo_src1 DescriptorSet 0\n"
			"OpDecorate %ssbo_src1 Binding 1\n"
			"OpDecorate %ssbo_dst DescriptorSet 0\n"
			"OpDecorate %ssbo_dst Binding 2\n";
	}
	else if (testFunc.funcArgsCount == 3)
	{
		functions += StringTemplate(load_funcs[testFunc.typeArg0]).specialize({{"var", "ssbo_src0"}});
		functions += StringTemplate(load_funcs[testFunc.typeArg1]).specialize({{"var", "ssbo_src1"}});
		functions += StringTemplate(load_funcs[testFunc.typeArg2]).specialize({{"var", "ssbo_src2"}});
		variables +=
			" %ssbo_src0 = OpVariable %up_SSBO_${store_t0} Uniform\n"
			" %ssbo_src1 = OpVariable %up_SSBO_${store_t1} Uniform\n"
			" %ssbo_src2 = OpVariable %up_SSBO_${store_t2} Uniform\n"
			"  %ssbo_dst = OpVariable %up_SSBO_${store_tr} Uniform\n";

		decorations +=
			"OpDecorate %ssbo_src0 DescriptorSet 0\n"
			"OpDecorate %ssbo_src0 Binding 0\n"
			"OpDecorate %ssbo_src1 DescriptorSet 0\n"
			"OpDecorate %ssbo_src1 Binding 1\n"
			"OpDecorate %ssbo_src2 DescriptorSet 0\n"
			"OpDecorate %ssbo_src2 Binding 2\n"
			"OpDecorate %ssbo_dst DescriptorSet 0\n"
			"OpDecorate %ssbo_dst Binding 3\n";
	}
	else
	{
		TCU_THROW(InternalError, "Invalid number of function arguments");
	}

	variables	+= argFragments->variables;
	decorations	+= argFragments->decorations;

	specs["dr"]					= testTypes[testFunc.typeResult].typePrefix;
	specs["d0"]					= testTypes[testFunc.typeArg0].typePrefix;
	specs["d1"]					= testTypes[testFunc.typeArg1].typePrefix;
	specs["d2"]					= testTypes[testFunc.typeArg2].typePrefix;
	specs["tr"]					= string(testTypes[testFunc.typeResult].typePrefix) + componentType;
	specs["t0"]					= string(testTypes[testFunc.typeArg0].typePrefix) + componentType;
	specs["t1"]					= string(testTypes[testFunc.typeArg1].typePrefix) + componentType;
	specs["t2"]					= string(testTypes[testFunc.typeArg2].typePrefix) + componentType;
	specs["store_tr"]			= string(testTypes[testFunc.typeResult].storage_type);
	specs["store_t0"]			= string(testTypes[testFunc.typeArg0].storage_type);
	specs["store_t1"]			= string(testTypes[testFunc.typeArg1].storage_type);
	specs["store_t2"]			= string(testTypes[testFunc.typeArg2].storage_type);
	specs["struct_stride"]		= de::toString(typeStructStride);
	specs["op"]					= extInst ? "OpExtInst" : testFunc.funcName;
	specs["ext_inst"]			= extInst ? string("%ext_import ") + testFunc.funcName : "";
	specs["struct_member"]		= de::toLower(testFunc.funcSuffix);

	variables					= StringTemplate(variables).specialize(specs);
	decorations					= StringTemplate(decorations).specialize(specs);
	funcVariables				= StringTemplate(argFragments->funcVariables).specialize(specs);
	funcCall					= StringTemplate(argFragments->bodies).specialize(specs);

	specs["num_data_points"]	= de::toString(iterations);
	specs["arg_vars"]			= variables;
	specs["arg_decorations"]	= decorations;
	specs["arg_infunc_vars"]	= funcVariables;
	specs["arg_func_call"]		= funcCall;

	fragments["extension"]		= "%ext_import = OpExtInstImport \"GLSL.std.450\"";
	fragments["capability"]		= "OpCapability Matrix\nOpCapability Float16\n";
	fragments["decoration"]		= decoration.specialize(specs);
	fragments["pre_main"]		= preMain.specialize(specs) + functions;
	fragments["testfun"]		= testFun.specialize(specs);

	for (size_t inputArgNdx = 0; inputArgNdx < testFunc.funcArgsCount; ++inputArgNdx)
	{
		const size_t			numFloatsPerItem	= (inputArgNdx == 0) ? testTypes[testFunc.typeArg0].typeArrayStride / sizeof(deFloat16)
													: (inputArgNdx == 1) ? testTypes[testFunc.typeArg1].typeArrayStride / sizeof(deFloat16)
													: (inputArgNdx == 2) ? testTypes[testFunc.typeArg2].typeArrayStride / sizeof(deFloat16)
													: -1;
		const vector<deFloat16>	inputData			= testFunc.getInputDataFunc(seed, numFloatsPerItem * iterations, testTypeIdx, numFloatsPerItem, testFunc.funcArgsCount, inputArgNdx);

		specResource.inputs.push_back(Resource(BufferSp(new Float16Buffer(inputData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
	}

	specResource.outputs.push_back(Resource(BufferSp(new Float16Buffer(float16DummyOutput)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
	specResource.verifyIO = testFunc.verifyFunc;

	extensions.push_back("VK_KHR_shader_float16_int8");

	features.extFloat16Int8		= EXTFLOAT16INT8FEATURES_FLOAT16;

	finalizeTestsCreation(specResource, fragments, testCtx, testGroup, testName, features, extensions, IVec3(1, 1, 1));
}

template<size_t C, class SpecResource>
tcu::TestCaseGroup* createFloat16ArithmeticSet (tcu::TestContext& testCtx)
{
	DE_STATIC_ASSERT(C >= 1 && C <= 4);

	const std::string				testGroupName	(string("arithmetic_") + de::toString(C));
	de::MovePtr<tcu::TestCaseGroup>	testGroup		(new tcu::TestCaseGroup(testCtx, testGroupName.c_str(), "Float 16 arithmetic and related tests"));
	const Math16TestFunc			testFuncs[]		=
	{
		{	"OpFNegate",			"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16OpFNegate>					},
		{	"Round",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Round>						},
		{	"RoundEven",			"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16RoundEven>					},
		{	"Trunc",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Trunc>						},
		{	"FAbs",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16FAbs>						},
		{	"FSign",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16FSign>						},
		{	"Floor",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Floor>						},
		{	"Ceil",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Ceil>						},
		{	"Fract",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Fract>						},
		{	"Radians",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Radians>						},
		{	"Degrees",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Degrees>						},
		{	"Sin",					"",			1,	C,		C,		0,		0, &getInputDataPI,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Sin>							},
		{	"Cos",					"",			1,	C,		C,		0,		0, &getInputDataPI,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Cos>							},
		{	"Tan",					"",			1,	C,		C,		0,		0, &getInputDataPI,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Tan>							},
		{	"Asin",					"",			1,	C,		C,		0,		0, &getInputDataA,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Asin>						},
		{	"Acos",					"",			1,	C,		C,		0,		0, &getInputDataA,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Acos>						},
		{	"Atan",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Atan>						},
		{	"Sinh",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Sinh>						},
		{	"Cosh",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Cosh>						},
		{	"Tanh",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Tanh>						},
		{	"Asinh",				"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Asinh>						},
		{	"Acosh",				"",			1,	C,		C,		0,		0, &getInputDataAC,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Acosh>						},
		{	"Atanh",				"",			1,	C,		C,		0,		0, &getInputDataA,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Atanh>						},
		{	"Exp",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Exp>							},
		{	"Log",					"",			1,	C,		C,		0,		0, &getInputDataP,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Log>							},
		{	"Exp2",					"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Exp2>						},
		{	"Log2",					"",			1,	C,		C,		0,		0, &getInputDataP,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Log2>						},
		{	"Sqrt",					"",			1,	C,		C,		0,		0, &getInputDataP,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Sqrt>						},
		{	"InverseSqrt",			"",			1,	C,		C,		0,		0, &getInputDataP,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16InverseSqrt>					},
		{	"Modf",					"Frac",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16ModfFrac>					},
		{	"Modf",					"Int",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16ModfInt>						},
		{	"ModfStruct",			"Frac",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16ModfFrac>					},
		{	"ModfStruct",			"Int",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16ModfInt>						},
		{	"Frexp",				"S",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16FrexpS>						},
		{	"Frexp",				"E",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16FrexpE>						},
		{	"FrexpStruct",			"S",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16FrexpS>						},
		{	"FrexpStruct",			"E",		1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16FrexpE>						},
		{	"OpFAdd",				"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16OpFAdd>						},
		{	"OpFSub",				"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16OpFSub>						},
		{	"OpFMul",				"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16OpFMul>						},
		{	"OpFDiv",				"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16OpFDiv>						},
		{	"Atan2",				"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16Atan2>						},
		{	"Pow",					"",			2,	C,		C,		C,		0, &getInputDataP,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16Pow>							},
		{	"FMin",					"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16FMin>						},
		{	"FMax",					"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16FMax>						},
		{	"Step",					"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16Step>						},
		{	"Ldexp",				"",			2,	C,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16Ldexp>						},
		{	"FClamp",				"",			3,	C,		C,		C,		C, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  C, fp16FClamp>						},
		{	"FMix",					"",			3,	C,		C,		C,		C, &getInputDataD,	compareFP16ArithmeticFunc<  C,  C,  C,  C, fp16FMix>						},
		{	"SmoothStep",			"",			3,	C,		C,		C,		C, &getInputDataSS,	compareFP16ArithmeticFunc<  C,  C,  C,  C, fp16SmoothStep>					},
		{	"Fma",					"",			3,	C,		C,		C,		C, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  C,  C, fp16Fma>							},
		{	"Length",				"",			1,	1,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  1,  C,  0,  0, fp16Length>						},
		{	"Distance",				"",			2,	1,		C,		C,		0, &getInputData,	compareFP16ArithmeticFunc<  1,  C,  C,  0, fp16Distance>					},
		{	"Cross",				"",			2,	C,		C,		C,		0, &getInputDataD,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16Cross>						},
		{	"Normalize",			"",			1,	C,		C,		0,		0, &getInputData,	compareFP16ArithmeticFunc<  C,  C,  0,  0, fp16Normalize>					},
		{	"FaceForward",			"",			3,	C,		C,		C,		C, &getInputDataD,	compareFP16ArithmeticFunc<  C,  C,  C,  C, fp16FaceForward>					},
		{	"Reflect",				"",			2,	C,		C,		C,		0, &getInputDataD,	compareFP16ArithmeticFunc<  C,  C,  C,  0, fp16Reflect>						},
		{	"Refract",				"",			3,	C,		C,		C,		1, &getInputDataN,	compareFP16ArithmeticFunc<  C,  C,  C,  1, fp16Refract>						},
		{	"OpDot",				"",			2,	1,		C,		C,		0, &getInputDataD,	compareFP16ArithmeticFunc<  1,  C,  C,  0, fp16Dot>							},
		{	"OpVectorTimesScalar",	"",			2,	C,		C,		1,		0, &getInputDataV,	compareFP16ArithmeticFunc<  C,  C,  1,  0, fp16VectorTimesScalar>			},
	};

	for (deUint32 testFuncIdx = 0; testFuncIdx < DE_LENGTH_OF_ARRAY(testFuncs); ++testFuncIdx)
	{
		const Math16TestFunc&	testFunc		= testFuncs[testFuncIdx];
		const string			funcNameString	= testFunc.funcName;

		if ((C != 3) && funcNameString == "Cross")
			continue;

		if ((C < 2) && funcNameString == "OpDot")
			continue;

		if ((C < 2) && funcNameString == "OpVectorTimesScalar")
			continue;

		createFloat16ArithmeticFuncTest<SpecResource>(testCtx, *testGroup.get(), C, testFunc);
	}

	return testGroup.release();
}

template<class SpecResource>
tcu::TestCaseGroup* createFloat16ArithmeticSet (tcu::TestContext& testCtx)
{
	const std::string				testGroupName	("arithmetic");
	de::MovePtr<tcu::TestCaseGroup>	testGroup		(new tcu::TestCaseGroup(testCtx, testGroupName.c_str(), "Float 16 arithmetic and related tests"));
	const Math16TestFunc			testFuncs[]		=
	{
		{	"OpTranspose",			"2x2",		1,	MAT2X2,	MAT2X2,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc<  4,  4,  0,  0, fp16Transpose<2,2> >				},
		{	"OpTranspose",			"3x2",		1,	MAT2X3,	MAT3X2,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc<  8,  8,  0,  0, fp16Transpose<3,2> >				},
		{	"OpTranspose",			"4x2",		1,	MAT2X4,	MAT4X2,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc<  8,  8,  0,  0, fp16Transpose<4,2> >				},
		{	"OpTranspose",			"2x3",		1,	MAT3X2,	MAT2X3,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc<  8,  8,  0,  0, fp16Transpose<2,3> >				},
		{	"OpTranspose",			"3x3",		1,	MAT3X3,	MAT3X3,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc< 16, 16,  0,  0, fp16Transpose<3,3> >				},
		{	"OpTranspose",			"4x3",		1,	MAT3X4,	MAT4X3,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc< 16, 16,  0,  0, fp16Transpose<4,3> >				},
		{	"OpTranspose",			"2x4",		1,	MAT4X2,	MAT2X4,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc<  8,  8,  0,  0, fp16Transpose<2,4> >				},
		{	"OpTranspose",			"3x4",		1,	MAT4X3,	MAT3X4,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc< 16, 16,  0,  0, fp16Transpose<3,4> >				},
		{	"OpTranspose",			"4x4",		1,	MAT4X4,	MAT4X4,	0,		0, &getInputDataM,	compareFP16ArithmeticFunc< 16, 16,  0,  0, fp16Transpose<4,4> >				},
		{	"OpMatrixTimesScalar",	"2x2",		2,	MAT2X2,	MAT2X2,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  4,  1,  0, fp16MatrixTimesScalar<2,2> >		},
		{	"OpMatrixTimesScalar",	"2x3",		2,	MAT2X3,	MAT2X3,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8,  1,  0, fp16MatrixTimesScalar<2,3> >		},
		{	"OpMatrixTimesScalar",	"2x4",		2,	MAT2X4,	MAT2X4,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8,  1,  0, fp16MatrixTimesScalar<2,4> >		},
		{	"OpMatrixTimesScalar",	"3x2",		2,	MAT3X2,	MAT3X2,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8,  1,  0, fp16MatrixTimesScalar<3,2> >		},
		{	"OpMatrixTimesScalar",	"3x3",		2,	MAT3X3,	MAT3X3,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16,  1,  0, fp16MatrixTimesScalar<3,3> >		},
		{	"OpMatrixTimesScalar",	"3x4",		2,	MAT3X4,	MAT3X4,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16,  1,  0, fp16MatrixTimesScalar<3,4> >		},
		{	"OpMatrixTimesScalar",	"4x2",		2,	MAT4X2,	MAT4X2,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8,  1,  0, fp16MatrixTimesScalar<4,2> >		},
		{	"OpMatrixTimesScalar",	"4x3",		2,	MAT4X3,	MAT4X3,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16,  1,  0, fp16MatrixTimesScalar<4,3> >		},
		{	"OpMatrixTimesScalar",	"4x4",		2,	MAT4X4,	MAT4X4,	1,		0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16,  1,  0, fp16MatrixTimesScalar<4,4> >		},
		{	"OpVectorTimesMatrix",	"2x2",		2,	VEC2,	VEC2,	MAT2X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  2,  2,  4,  0, fp16VectorTimesMatrix<2,2> >		},
		{	"OpVectorTimesMatrix",	"2x3",		2,	VEC2,	VEC3,	MAT2X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  2,  3,  8,  0, fp16VectorTimesMatrix<2,3> >		},
		{	"OpVectorTimesMatrix",	"2x4",		2,	VEC2,	VEC4,	MAT2X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  2,  4,  8,  0, fp16VectorTimesMatrix<2,4> >		},
		{	"OpVectorTimesMatrix",	"3x2",		2,	VEC3,	VEC2,	MAT3X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  3,  2,  8,  0, fp16VectorTimesMatrix<3,2> >		},
		{	"OpVectorTimesMatrix",	"3x3",		2,	VEC3,	VEC3,	MAT3X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  3,  3, 16,  0, fp16VectorTimesMatrix<3,3> >		},
		{	"OpVectorTimesMatrix",	"3x4",		2,	VEC3,	VEC4,	MAT3X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  3,  4, 16,  0, fp16VectorTimesMatrix<3,4> >		},
		{	"OpVectorTimesMatrix",	"4x2",		2,	VEC4,	VEC2,	MAT4X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  2,  8,  0, fp16VectorTimesMatrix<4,2> >		},
		{	"OpVectorTimesMatrix",	"4x3",		2,	VEC4,	VEC3,	MAT4X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  3, 16,  0, fp16VectorTimesMatrix<4,3> >		},
		{	"OpVectorTimesMatrix",	"4x4",		2,	VEC4,	VEC4,	MAT4X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  4, 16,  0, fp16VectorTimesMatrix<4,4> >		},
		{	"OpMatrixTimesVector",	"2x2",		2,	VEC2,	MAT2X2,	VEC2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  2,  4,  2,  0, fp16MatrixTimesVector<2,2> >		},
		{	"OpMatrixTimesVector",	"2x3",		2,	VEC3,	MAT2X3,	VEC2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  3,  8,  2,  0, fp16MatrixTimesVector<2,3> >		},
		{	"OpMatrixTimesVector",	"2x4",		2,	VEC4,	MAT2X4,	VEC2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  8,  2,  0, fp16MatrixTimesVector<2,4> >		},
		{	"OpMatrixTimesVector",	"3x2",		2,	VEC2,	MAT3X2,	VEC3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  2,  8,  3,  0, fp16MatrixTimesVector<3,2> >		},
		{	"OpMatrixTimesVector",	"3x3",		2,	VEC3,	MAT3X3,	VEC3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  3, 16,  3,  0, fp16MatrixTimesVector<3,3> >		},
		{	"OpMatrixTimesVector",	"3x4",		2,	VEC4,	MAT3X4,	VEC3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4, 16,  3,  0, fp16MatrixTimesVector<3,4> >		},
		{	"OpMatrixTimesVector",	"4x2",		2,	VEC2,	MAT4X2,	VEC4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  2,  8,  4,  0, fp16MatrixTimesVector<4,2> >		},
		{	"OpMatrixTimesVector",	"4x3",		2,	VEC3,	MAT4X3,	VEC4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  3, 16,  4,  0, fp16MatrixTimesVector<4,3> >		},
		{	"OpMatrixTimesVector",	"4x4",		2,	VEC4,	MAT4X4,	VEC4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4, 16,  4,  0, fp16MatrixTimesVector<4,4> >		},
		{	"OpMatrixTimesMatrix",	"2x2_2x2",	2,	MAT2X2,	MAT2X2,	MAT2X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  4,  4,  0, fp16MatrixTimesMatrix<2,2,2,2> >	},
		{	"OpMatrixTimesMatrix",	"2x2_3x2",	2,	MAT3X2,	MAT2X2,	MAT3X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  4,  8,  0, fp16MatrixTimesMatrix<2,2,3,2> >	},
		{	"OpMatrixTimesMatrix",	"2x2_4x2",	2,	MAT4X2,	MAT2X2,	MAT4X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  4,  8,  0, fp16MatrixTimesMatrix<2,2,4,2> >	},
		{	"OpMatrixTimesMatrix",	"2x3_2x2",	2,	MAT2X3,	MAT2X3,	MAT2X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8,  4,  0, fp16MatrixTimesMatrix<2,3,2,2> >	},
		{	"OpMatrixTimesMatrix",	"2x3_3x2",	2,	MAT3X3,	MAT2X3,	MAT3X2,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  8,  8,  0, fp16MatrixTimesMatrix<2,3,3,2> >	},
		{	"OpMatrixTimesMatrix",	"2x3_4x2",	2,	MAT4X3,	MAT2X3,	MAT4X2,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  8,  8,  0, fp16MatrixTimesMatrix<2,3,4,2> >	},
		{	"OpMatrixTimesMatrix",	"2x4_2x2",	2,	MAT2X4,	MAT2X4,	MAT2X2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8,  4,  0, fp16MatrixTimesMatrix<2,4,2,2> >	},
		{	"OpMatrixTimesMatrix",	"2x4_3x2",	2,	MAT3X4,	MAT2X4,	MAT3X2,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  8,  8,  0, fp16MatrixTimesMatrix<2,4,3,2> >	},
		{	"OpMatrixTimesMatrix",	"2x4_4x2",	2,	MAT4X4,	MAT2X4,	MAT4X2,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  8,  8,  0, fp16MatrixTimesMatrix<2,4,4,2> >	},
		{	"OpMatrixTimesMatrix",	"3x2_2x3",	2,	MAT2X2,	MAT3X2,	MAT2X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  8,  8,  0, fp16MatrixTimesMatrix<3,2,2,3> >	},
		{	"OpMatrixTimesMatrix",	"3x2_3x3",	2,	MAT3X2,	MAT3X2,	MAT3X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8, 16,  0, fp16MatrixTimesMatrix<3,2,3,3> >	},
		{	"OpMatrixTimesMatrix",	"3x2_4x3",	2,	MAT4X2,	MAT3X2,	MAT4X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8, 16,  0, fp16MatrixTimesMatrix<3,2,4,3> >	},
		{	"OpMatrixTimesMatrix",	"3x3_2x3",	2,	MAT2X3,	MAT3X3,	MAT2X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8, 16,  8,  0, fp16MatrixTimesMatrix<3,3,2,3> >	},
		{	"OpMatrixTimesMatrix",	"3x3_3x3",	2,	MAT3X3,	MAT3X3,	MAT3X3,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<3,3,3,3> >	},
		{	"OpMatrixTimesMatrix",	"3x3_4x3",	2,	MAT4X3,	MAT3X3,	MAT4X3,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<3,3,4,3> >	},
		{	"OpMatrixTimesMatrix",	"3x4_2x3",	2,	MAT2X4,	MAT3X4,	MAT2X3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8, 16,  8,  0, fp16MatrixTimesMatrix<3,4,2,3> >	},
		{	"OpMatrixTimesMatrix",	"3x4_3x3",	2,	MAT3X4,	MAT3X4,	MAT3X3,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<3,4,3,3> >	},
		{	"OpMatrixTimesMatrix",	"3x4_4x3",	2,	MAT4X4,	MAT3X4,	MAT4X3,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<3,4,4,3> >	},
		{	"OpMatrixTimesMatrix",	"4x2_2x4",	2,	MAT2X2,	MAT4X2,	MAT2X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  8,  8,  0, fp16MatrixTimesMatrix<4,2,2,4> >	},
		{	"OpMatrixTimesMatrix",	"4x2_3x4",	2,	MAT3X2,	MAT4X2,	MAT3X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8, 16,  0, fp16MatrixTimesMatrix<4,2,3,4> >	},
		{	"OpMatrixTimesMatrix",	"4x2_4x4",	2,	MAT4X2,	MAT4X2,	MAT4X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  8, 16,  0, fp16MatrixTimesMatrix<4,2,4,4> >	},
		{	"OpMatrixTimesMatrix",	"4x3_2x4",	2,	MAT2X3,	MAT4X3,	MAT2X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8, 16,  8,  0, fp16MatrixTimesMatrix<4,3,2,4> >	},
		{	"OpMatrixTimesMatrix",	"4x3_3x4",	2,	MAT3X3,	MAT4X3,	MAT3X4,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<4,3,3,4> >	},
		{	"OpMatrixTimesMatrix",	"4x3_4x4",	2,	MAT4X3,	MAT4X3,	MAT4X4,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<4,3,4,4> >	},
		{	"OpMatrixTimesMatrix",	"4x4_2x4",	2,	MAT2X4,	MAT4X4,	MAT2X4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8, 16,  8,  0, fp16MatrixTimesMatrix<4,4,2,4> >	},
		{	"OpMatrixTimesMatrix",	"4x4_3x4",	2,	MAT3X4,	MAT4X4,	MAT3X4,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<4,4,3,4> >	},
		{	"OpMatrixTimesMatrix",	"4x4_4x4",	2,	MAT4X4,	MAT4X4,	MAT4X4,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16, 16, 16,  0, fp16MatrixTimesMatrix<4,4,4,4> >	},
		{	"OpOuterProduct",		"2x2",		2,	MAT2X2,	VEC2,	VEC2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  4,  2,  2,  0, fp16OuterProduct<2,2> >			},
		{	"OpOuterProduct",		"2x3",		2,	MAT2X3,	VEC3,	VEC2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  3,  2,  0, fp16OuterProduct<2,3> >			},
		{	"OpOuterProduct",		"2x4",		2,	MAT2X4,	VEC4,	VEC2,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  4,  2,  0, fp16OuterProduct<2,4> >			},
		{	"OpOuterProduct",		"3x2",		2,	MAT3X2,	VEC2,	VEC3,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  2,  3,  0, fp16OuterProduct<3,2> >			},
		{	"OpOuterProduct",		"3x3",		2,	MAT3X3,	VEC3,	VEC3,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  3,  3,  0, fp16OuterProduct<3,3> >			},
		{	"OpOuterProduct",		"3x4",		2,	MAT3X4,	VEC4,	VEC3,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  4,  3,  0, fp16OuterProduct<3,4> >			},
		{	"OpOuterProduct",		"4x2",		2,	MAT4X2,	VEC2,	VEC4,	0, &getInputDataD,	compareFP16ArithmeticFunc<  8,  2,  4,  0, fp16OuterProduct<4,2> >			},
		{	"OpOuterProduct",		"4x3",		2,	MAT4X3,	VEC3,	VEC4,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  3,  4,  0, fp16OuterProduct<4,3> >			},
		{	"OpOuterProduct",		"4x4",		2,	MAT4X4,	VEC4,	VEC4,	0, &getInputDataD,	compareFP16ArithmeticFunc< 16,  4,  4,  0, fp16OuterProduct<4,4> >			},
		{	"Determinant",			"2x2",		1,	SCALAR,	MAT2X2,	NONE,	0, &getInputDataC,	compareFP16ArithmeticFunc<  1,  4,  0,  0, fp16Determinant<2> >				},
		{	"Determinant",			"3x3",		1,	SCALAR,	MAT3X3,	NONE,	0, &getInputDataC,	compareFP16ArithmeticFunc<  1, 16,  0,  0, fp16Determinant<3> >				},
		{	"Determinant",			"4x4",		1,	SCALAR,	MAT4X4,	NONE,	0, &getInputDataC,	compareFP16ArithmeticFunc<  1, 16,  0,  0, fp16Determinant<4> >				},
		{	"MatrixInverse",		"2x2",		1,	MAT2X2,	MAT2X2,	NONE,	0, &getInputDataC,	compareFP16ArithmeticFunc<  4,  4,  0,  0, fp16Inverse<2> >					},
	};

	for (deUint32 testFuncIdx = 0; testFuncIdx < DE_LENGTH_OF_ARRAY(testFuncs); ++testFuncIdx)
	{
		const Math16TestFunc&	testFunc	= testFuncs[testFuncIdx];

		createFloat16ArithmeticFuncTest<SpecResource>(testCtx, *testGroup.get(), 0, testFunc);
	}

	return testGroup.release();
}

const string getNumberTypeName (const NumberType type)
{
	if (type == NUMBERTYPE_INT32)
	{
		return "int";
	}
	else if (type == NUMBERTYPE_UINT32)
	{
		return "uint";
	}
	else if (type == NUMBERTYPE_FLOAT32)
	{
		return "float";
	}
	else
	{
		DE_ASSERT(false);
		return "";
	}
}

deInt32 getInt(de::Random& rnd)
{
	return rnd.getInt(std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
}

const string repeatString (const string& str, int times)
{
	string filler;
	for (int i = 0; i < times; ++i)
	{
		filler += str;
	}
	return filler;
}

const string getRandomConstantString (const NumberType type, de::Random& rnd)
{
	if (type == NUMBERTYPE_INT32)
	{
		return numberToString<deInt32>(getInt(rnd));
	}
	else if (type == NUMBERTYPE_UINT32)
	{
		return numberToString<deUint32>(rnd.getUint32());
	}
	else if (type == NUMBERTYPE_FLOAT32)
	{
		return numberToString<float>(rnd.getFloat());
	}
	else
	{
		DE_ASSERT(false);
		return "";
	}
}

void createVectorCompositeCases (vector<map<string, string> >& testCases, de::Random& rnd, const NumberType type)
{
	map<string, string> params;

	// Vec2 to Vec4
	for (int width = 2; width <= 4; ++width)
	{
		const string randomConst = numberToString(getInt(rnd));
		const string widthStr = numberToString(width);
		const string composite_type = "${customType}vec" + widthStr;
		const int index = rnd.getInt(0, width-1);

		params["type"]			= "vec";
		params["name"]			= params["type"] + "_" + widthStr;
		params["compositeDecl"]		= composite_type + " = OpTypeVector ${customType} " + widthStr +"\n";
		params["compositeType"]		= composite_type;
		params["filler"]		= string("%filler    = OpConstant ${customType} ") + getRandomConstantString(type, rnd) + "\n";
		params["compositeConstruct"]	= "%instance  = OpCompositeConstruct " + composite_type + repeatString(" %filler", width) + "\n";
		params["indexes"]		= numberToString(index);
		testCases.push_back(params);
	}
}

void createArrayCompositeCases (vector<map<string, string> >& testCases, de::Random& rnd, const NumberType type)
{
	const int limit = 10;
	map<string, string> params;

	for (int width = 2; width <= limit; ++width)
	{
		string randomConst = numberToString(getInt(rnd));
		string widthStr = numberToString(width);
		int index = rnd.getInt(0, width-1);

		params["type"]			= "array";
		params["name"]			= params["type"] + "_" + widthStr;
		params["compositeDecl"]		= string("%arraywidth = OpConstant %u32 " + widthStr + "\n")
											+	 "%composite = OpTypeArray ${customType} %arraywidth\n";
		params["compositeType"]		= "%composite";
		params["filler"]		= string("%filler    = OpConstant ${customType} ") + getRandomConstantString(type, rnd) + "\n";
		params["compositeConstruct"]	= "%instance  = OpCompositeConstruct %composite" + repeatString(" %filler", width) + "\n";
		params["indexes"]		= numberToString(index);
		testCases.push_back(params);
	}
}

void createStructCompositeCases (vector<map<string, string> >& testCases, de::Random& rnd, const NumberType type)
{
	const int limit = 10;
	map<string, string> params;

	for (int width = 2; width <= limit; ++width)
	{
		string randomConst = numberToString(getInt(rnd));
		int index = rnd.getInt(0, width-1);

		params["type"]			= "struct";
		params["name"]			= params["type"] + "_" + numberToString(width);
		params["compositeDecl"]		= "%composite = OpTypeStruct" + repeatString(" ${customType}", width) + "\n";
		params["compositeType"]		= "%composite";
		params["filler"]		= string("%filler    = OpConstant ${customType} ") + getRandomConstantString(type, rnd) + "\n";
		params["compositeConstruct"]	= "%instance  = OpCompositeConstruct %composite" + repeatString(" %filler", width) + "\n";
		params["indexes"]		= numberToString(index);
		testCases.push_back(params);
	}
}

void createMatrixCompositeCases (vector<map<string, string> >& testCases, de::Random& rnd, const NumberType type)
{
	map<string, string> params;

	// Vec2 to Vec4
	for (int width = 2; width <= 4; ++width)
	{
		string widthStr = numberToString(width);

		for (int column = 2 ; column <= 4; ++column)
		{
			int index_0 = rnd.getInt(0, column-1);
			int index_1 = rnd.getInt(0, width-1);
			string columnStr = numberToString(column);

			params["type"]		= "matrix";
			params["name"]		= params["type"] + "_" + widthStr + "x" + columnStr;
			params["compositeDecl"]	= string("%vectype   = OpTypeVector ${customType} " + widthStr + "\n")
												+	 "%composite = OpTypeMatrix %vectype " + columnStr + "\n";
			params["compositeType"]	= "%composite";

			params["filler"]	= string("%filler    = OpConstant ${customType} ") + getRandomConstantString(type, rnd) + "\n"
												+	 "%fillerVec = OpConstantComposite %vectype" + repeatString(" %filler", width) + "\n";

			params["compositeConstruct"]	= "%instance  = OpCompositeConstruct %composite" + repeatString(" %fillerVec", column) + "\n";
			params["indexes"]	= numberToString(index_0) + " " + numberToString(index_1);
			testCases.push_back(params);
		}
	}
}

void createCompositeCases (vector<map<string, string> >& testCases, de::Random& rnd, const NumberType type)
{
	createVectorCompositeCases(testCases, rnd, type);
	createArrayCompositeCases(testCases, rnd, type);
	createStructCompositeCases(testCases, rnd, type);
	// Matrix only supports float types
	if (type == NUMBERTYPE_FLOAT32)
	{
		createMatrixCompositeCases(testCases, rnd, type);
	}
}

const string getAssemblyTypeDeclaration (const NumberType type)
{
	switch (type)
	{
		case NUMBERTYPE_INT32:		return "OpTypeInt 32 1";
		case NUMBERTYPE_UINT32:		return "OpTypeInt 32 0";
		case NUMBERTYPE_FLOAT32:	return "OpTypeFloat 32";
		default:			DE_ASSERT(false); return "";
	}
}

const string getAssemblyTypeName (const NumberType type)
{
	switch (type)
	{
		case NUMBERTYPE_INT32:		return "%i32";
		case NUMBERTYPE_UINT32:		return "%u32";
		case NUMBERTYPE_FLOAT32:	return "%f32";
		default:			DE_ASSERT(false); return "";
	}
}

const string specializeCompositeInsertShaderTemplate (const NumberType type, const map<string, string>& params)
{
	map<string, string>	parameters(params);

	const string customType = getAssemblyTypeName(type);
	map<string, string> substCustomType;
	substCustomType["customType"] = customType;
	parameters["compositeDecl"] = StringTemplate(parameters.at("compositeDecl")).specialize(substCustomType);
	parameters["compositeType"] = StringTemplate(parameters.at("compositeType")).specialize(substCustomType);
	parameters["compositeConstruct"] = StringTemplate(parameters.at("compositeConstruct")).specialize(substCustomType);
	parameters["filler"] = StringTemplate(parameters.at("filler")).specialize(substCustomType);
	parameters["customType"] = customType;
	parameters["compositeDecorator"] = (parameters["type"] == "array") ? "OpDecorate %composite ArrayStride 4\n" : "";

	if (parameters.at("compositeType") != "%u32vec3")
	{
		parameters["u32vec3Decl"] = "%u32vec3   = OpTypeVector %u32 3\n";
	}

	return StringTemplate(
		"OpCapability Shader\n"
		"OpCapability Matrix\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		// Decorators
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata DescriptorSet 0\n"
		"OpDecorate %indata Binding 0\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 1\n"
		"OpDecorate %customarr ArrayStride 4\n"
		"${compositeDecorator}"
		"OpMemberDecorate %buf 0 Offset 0\n"

		// General types
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%u32       = OpTypeInt 32 0\n"
		"%i32       = OpTypeInt 32 1\n"
		"%f32       = OpTypeFloat 32\n"

		// Composite declaration
		"${compositeDecl}"

		// Constants
		"${filler}"

		"${u32vec3Decl:opt}"
		"%uvec3ptr  = OpTypePointer Input %u32vec3\n"

		// Inherited from custom
		"%customptr = OpTypePointer Uniform ${customType}\n"
		"%customarr = OpTypeRuntimeArray ${customType}\n"
		"%buf       = OpTypeStruct %customarr\n"
		"%bufptr    = OpTypePointer Uniform %buf\n"

		"%indata    = OpVariable %bufptr Uniform\n"
		"%outdata   = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %i32 0\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %u32vec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"

		"%inloc     = OpAccessChain %customptr %indata %zero %x\n"
		"%outloc    = OpAccessChain %customptr %outdata %zero %x\n"
		// Read the input value
		"%inval     = OpLoad ${customType} %inloc\n"
		// Create the composite and fill it
		"${compositeConstruct}"
		// Insert the input value to a place
		"%instance2 = OpCompositeInsert ${compositeType} %inval %instance ${indexes}\n"
		// Read back the value from the position
		"%out_val   = OpCompositeExtract ${customType} %instance2 ${indexes}\n"
		// Store it in the output position
		"             OpStore %outloc %out_val\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n"
	).specialize(parameters);
}

template<typename T>
BufferSp createCompositeBuffer(T number)
{
	return BufferSp(new Buffer<T>(vector<T>(1, number)));
}

tcu::TestCaseGroup* createOpCompositeInsertGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "opcompositeinsert", "Test the OpCompositeInsert instruction"));
	de::Random						rnd		(deStringHash(group->getName()));

	for (int type = NUMBERTYPE_INT32; type != NUMBERTYPE_END32; ++type)
	{
		NumberType						numberType		= NumberType(type);
		const string					typeName		= getNumberTypeName(numberType);
		const string					description		= "Test the OpCompositeInsert instruction with " + typeName + "s";
		de::MovePtr<tcu::TestCaseGroup>	subGroup		(new tcu::TestCaseGroup(testCtx, typeName.c_str(), description.c_str()));
		vector<map<string, string> >	testCases;

		createCompositeCases(testCases, rnd, numberType);

		for (vector<map<string, string> >::const_iterator test = testCases.begin(); test != testCases.end(); ++test)
		{
			ComputeShaderSpec	spec;

			spec.assembly = specializeCompositeInsertShaderTemplate(numberType, *test);

			switch (numberType)
			{
				case NUMBERTYPE_INT32:
				{
					deInt32 number = getInt(rnd);
					spec.inputs.push_back(createCompositeBuffer<deInt32>(number));
					spec.outputs.push_back(createCompositeBuffer<deInt32>(number));
					break;
				}
				case NUMBERTYPE_UINT32:
				{
					deUint32 number = rnd.getUint32();
					spec.inputs.push_back(createCompositeBuffer<deUint32>(number));
					spec.outputs.push_back(createCompositeBuffer<deUint32>(number));
					break;
				}
				case NUMBERTYPE_FLOAT32:
				{
					float number = rnd.getFloat();
					spec.inputs.push_back(createCompositeBuffer<float>(number));
					spec.outputs.push_back(createCompositeBuffer<float>(number));
					break;
				}
				default:
					DE_ASSERT(false);
			}

			spec.numWorkGroups = IVec3(1, 1, 1);
			subGroup->addChild(new SpvAsmComputeShaderCase(testCtx, test->at("name").c_str(), "OpCompositeInsert test", spec));
		}
		group->addChild(subGroup.release());
	}
	return group.release();
}

struct AssemblyStructInfo
{
	AssemblyStructInfo (const deUint32 comp, const deUint32 idx)
	: components	(comp)
	, index			(idx)
	{}

	deUint32 components;
	deUint32 index;
};

const string specializeInBoundsShaderTemplate (const NumberType type, const AssemblyStructInfo& structInfo, const map<string, string>& params)
{
	// Create the full index string
	string				fullIndex	= numberToString(structInfo.index) + " " + params.at("indexes");
	// Convert it to list of indexes
	vector<string>		indexes		= de::splitString(fullIndex, ' ');

	map<string, string>	parameters	(params);
	parameters["structType"]	= repeatString(" ${compositeType}", structInfo.components);
	parameters["structConstruct"]	= repeatString(" %instance", structInfo.components);
	parameters["insertIndexes"]	= fullIndex;

	// In matrix cases the last two index is the CompositeExtract indexes
	const deUint32 extractIndexes = (parameters["type"] == "matrix") ? 2 : 1;

	// Construct the extractIndex
	for (vector<string>::const_iterator index = indexes.end() - extractIndexes; index != indexes.end(); ++index)
	{
		parameters["extractIndexes"] += " " + *index;
	}

	// Remove the last 1 or 2 element depends on matrix case or not
	indexes.erase(indexes.end() - extractIndexes, indexes.end());

	deUint32 id = 0;
	// Generate AccessChain index expressions (except for the last one, because we use ptr to the composite)
	for (vector<string>::const_iterator index = indexes.begin(); index != indexes.end(); ++index)
	{
		string indexId = "%index_" + numberToString(id++);
		parameters["accessChainConstDeclaration"] += indexId + "   = OpConstant %u32 " + *index + "\n";
		parameters["accessChainIndexes"] += " " + indexId;
	}

	parameters["compositeDecorator"] = (parameters["type"] == "array") ? "OpDecorate %composite ArrayStride 4\n" : "";

	const string customType = getAssemblyTypeName(type);
	map<string, string> substCustomType;
	substCustomType["customType"] = customType;
	parameters["compositeDecl"] = StringTemplate(parameters.at("compositeDecl")).specialize(substCustomType);
	parameters["compositeType"] = StringTemplate(parameters.at("compositeType")).specialize(substCustomType);
	parameters["compositeConstruct"] = StringTemplate(parameters.at("compositeConstruct")).specialize(substCustomType);
	parameters["filler"] = StringTemplate(parameters.at("filler")).specialize(substCustomType);
	parameters["customType"] = customType;

	const string compositeType = parameters.at("compositeType");
	map<string, string> substCompositeType;
	substCompositeType["compositeType"] = compositeType;
	parameters["structType"] = StringTemplate(parameters.at("structType")).specialize(substCompositeType);
	if (compositeType != "%u32vec3")
	{
		parameters["u32vec3Decl"] = "%u32vec3   = OpTypeVector %u32 3\n";
	}

	return StringTemplate(
		"OpCapability Shader\n"
		"OpCapability Matrix\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"

		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"
		// Decorators
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %buf BufferBlock\n"
		"OpDecorate %indata DescriptorSet 0\n"
		"OpDecorate %indata Binding 0\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 1\n"
		"OpDecorate %customarr ArrayStride 4\n"
		"${compositeDecorator}"
		"OpMemberDecorate %buf 0 Offset 0\n"
		// General types
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%i32       = OpTypeInt 32 1\n"
		"%u32       = OpTypeInt 32 0\n"
		"%f32       = OpTypeFloat 32\n"
		// Custom types
		"${compositeDecl}"
		// %u32vec3 if not already declared in ${compositeDecl}
		"${u32vec3Decl:opt}"
		"%uvec3ptr  = OpTypePointer Input %u32vec3\n"
		// Inherited from composite
		"%composite_p = OpTypePointer Function ${compositeType}\n"
		"%struct_t  = OpTypeStruct${structType}\n"
		"%struct_p  = OpTypePointer Function %struct_t\n"
		// Constants
		"${filler}"
		"${accessChainConstDeclaration}"
		// Inherited from custom
		"%customptr = OpTypePointer Uniform ${customType}\n"
		"%customarr = OpTypeRuntimeArray ${customType}\n"
		"%buf       = OpTypeStruct %customarr\n"
		"%bufptr    = OpTypePointer Uniform %buf\n"
		"%indata    = OpVariable %bufptr Uniform\n"
		"%outdata   = OpVariable %bufptr Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"
		"%zero      = OpConstant %u32 0\n"
		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%struct_v  = OpVariable %struct_p Function\n"
		"%idval     = OpLoad %u32vec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		// Create the input/output type
		"%inloc     = OpInBoundsAccessChain %customptr %indata %zero %x\n"
		"%outloc    = OpInBoundsAccessChain %customptr %outdata %zero %x\n"
		// Read the input value
		"%inval     = OpLoad ${customType} %inloc\n"
		// Create the composite and fill it
		"${compositeConstruct}"
		// Create the struct and fill it with the composite
		"%struct    = OpCompositeConstruct %struct_t${structConstruct}\n"
		// Insert the value
		"%comp_obj  = OpCompositeInsert %struct_t %inval %struct ${insertIndexes}\n"
		// Store the object
		"             OpStore %struct_v %comp_obj\n"
		// Get deepest possible composite pointer
		"%inner_ptr = OpInBoundsAccessChain %composite_p %struct_v${accessChainIndexes}\n"
		"%read_obj  = OpLoad ${compositeType} %inner_ptr\n"
		// Read back the stored value
		"%read_val  = OpCompositeExtract ${customType} %read_obj${extractIndexes}\n"
		"             OpStore %outloc %read_val\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n"
	).specialize(parameters);
}

tcu::TestCaseGroup* createOpInBoundsAccessChainGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opinboundsaccesschain", "Test the OpInBoundsAccessChain instruction"));
	de::Random						rnd				(deStringHash(group->getName()));

	for (int type = NUMBERTYPE_INT32; type != NUMBERTYPE_END32; ++type)
	{
		NumberType						numberType	= NumberType(type);
		const string					typeName	= getNumberTypeName(numberType);
		const string					description	= "Test the OpInBoundsAccessChain instruction with " + typeName + "s";
		de::MovePtr<tcu::TestCaseGroup>	subGroup	(new tcu::TestCaseGroup(testCtx, typeName.c_str(), description.c_str()));

		vector<map<string, string> >	testCases;
		createCompositeCases(testCases, rnd, numberType);

		for (vector<map<string, string> >::const_iterator test = testCases.begin(); test != testCases.end(); ++test)
		{
			ComputeShaderSpec	spec;

			// Number of components inside of a struct
			deUint32 structComponents = rnd.getInt(2, 8);
			// Component index value
			deUint32 structIndex = rnd.getInt(0, structComponents - 1);
			AssemblyStructInfo structInfo(structComponents, structIndex);

			spec.assembly = specializeInBoundsShaderTemplate(numberType, structInfo, *test);

			switch (numberType)
			{
				case NUMBERTYPE_INT32:
				{
					deInt32 number = getInt(rnd);
					spec.inputs.push_back(createCompositeBuffer<deInt32>(number));
					spec.outputs.push_back(createCompositeBuffer<deInt32>(number));
					break;
				}
				case NUMBERTYPE_UINT32:
				{
					deUint32 number = rnd.getUint32();
					spec.inputs.push_back(createCompositeBuffer<deUint32>(number));
					spec.outputs.push_back(createCompositeBuffer<deUint32>(number));
					break;
				}
				case NUMBERTYPE_FLOAT32:
				{
					float number = rnd.getFloat();
					spec.inputs.push_back(createCompositeBuffer<float>(number));
					spec.outputs.push_back(createCompositeBuffer<float>(number));
					break;
				}
				default:
					DE_ASSERT(false);
			}
			spec.numWorkGroups = IVec3(1, 1, 1);
			subGroup->addChild(new SpvAsmComputeShaderCase(testCtx, test->at("name").c_str(), "OpInBoundsAccessChain test", spec));
		}
		group->addChild(subGroup.release());
	}
	return group.release();
}

// If the params missing, uninitialized case
const string specializeDefaultOutputShaderTemplate (const NumberType type, const map<string, string>& params = map<string, string>())
{
	map<string, string> parameters(params);

	parameters["customType"]	= getAssemblyTypeName(type);

	// Declare the const value, and use it in the initializer
	if (params.find("constValue") != params.end())
	{
		parameters["variableInitializer"]	= " %const";
	}
	// Uninitialized case
	else
	{
		parameters["commentDecl"]	= ";";
	}

	return StringTemplate(
		"OpCapability Shader\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"
		// Decorators
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"OpDecorate %indata DescriptorSet 0\n"
		"OpDecorate %indata Binding 0\n"
		"OpDecorate %outdata DescriptorSet 0\n"
		"OpDecorate %outdata Binding 1\n"
		"OpDecorate %in_arr ArrayStride 4\n"
		"OpDecorate %in_buf BufferBlock\n"
		"OpMemberDecorate %in_buf 0 Offset 0\n"
		// Base types
		"%void       = OpTypeVoid\n"
		"%voidf      = OpTypeFunction %void\n"
		"%u32        = OpTypeInt 32 0\n"
		"%i32        = OpTypeInt 32 1\n"
		"%f32        = OpTypeFloat 32\n"
		"%uvec3      = OpTypeVector %u32 3\n"
		"%uvec3ptr   = OpTypePointer Input %uvec3\n"
		"${commentDecl:opt}%const      = OpConstant ${customType} ${constValue:opt}\n"
		// Derived types
		"%in_ptr     = OpTypePointer Uniform ${customType}\n"
		"%in_arr     = OpTypeRuntimeArray ${customType}\n"
		"%in_buf     = OpTypeStruct %in_arr\n"
		"%in_bufptr  = OpTypePointer Uniform %in_buf\n"
		"%indata     = OpVariable %in_bufptr Uniform\n"
		"%outdata    = OpVariable %in_bufptr Uniform\n"
		"%id         = OpVariable %uvec3ptr Input\n"
		"%var_ptr    = OpTypePointer Function ${customType}\n"
		// Constants
		"%zero       = OpConstant %i32 0\n"
		// Main function
		"%main       = OpFunction %void None %voidf\n"
		"%label      = OpLabel\n"
		"%out_var    = OpVariable %var_ptr Function${variableInitializer:opt}\n"
		"%idval      = OpLoad %uvec3 %id\n"
		"%x          = OpCompositeExtract %u32 %idval 0\n"
		"%inloc      = OpAccessChain %in_ptr %indata %zero %x\n"
		"%outloc     = OpAccessChain %in_ptr %outdata %zero %x\n"

		"%outval     = OpLoad ${customType} %out_var\n"
		"              OpStore %outloc %outval\n"
		"              OpReturn\n"
		"              OpFunctionEnd\n"
	).specialize(parameters);
}

bool compareFloats (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog& log)
{
	DE_ASSERT(outputAllocs.size() != 0);
	DE_ASSERT(outputAllocs.size() == expectedOutputs.size());

	// Use custom epsilon because of the float->string conversion
	const float	epsilon	= 0.00001f;

	for (size_t outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
	{
		vector<deUint8>	expectedBytes;
		float			expected;
		float			actual;

		expectedOutputs[outputNdx].getBytes(expectedBytes);
		memcpy(&expected, &expectedBytes.front(), expectedBytes.size());
		memcpy(&actual, outputAllocs[outputNdx]->getHostPtr(), expectedBytes.size());

		// Test with epsilon
		if (fabs(expected - actual) > epsilon)
		{
			log << TestLog::Message << "Error: The actual and expected values not matching."
				<< " Expected: " << expected << " Actual: " << actual << " Epsilon: " << epsilon << TestLog::EndMessage;
			return false;
		}
	}
	return true;
}

// Checks if the driver crash with uninitialized cases
bool passthruVerify (const std::vector<Resource>&, const vector<AllocationSp>& outputAllocs, const std::vector<Resource>& expectedOutputs, TestLog&)
{
	DE_ASSERT(outputAllocs.size() != 0);
	DE_ASSERT(outputAllocs.size() == expectedOutputs.size());

	// Copy and discard the result.
	for (size_t outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
	{
		vector<deUint8>	expectedBytes;
		expectedOutputs[outputNdx].getBytes(expectedBytes);

		const size_t	width			= expectedBytes.size();
		vector<char>	data			(width);

		memcpy(&data[0], outputAllocs[outputNdx]->getHostPtr(), width);
	}
	return true;
}

tcu::TestCaseGroup* createShaderDefaultOutputGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "shader_default_output", "Test shader default output."));
	de::Random						rnd		(deStringHash(group->getName()));

	for (int type = NUMBERTYPE_INT32; type != NUMBERTYPE_END32; ++type)
	{
		NumberType						numberType	= NumberType(type);
		const string					typeName	= getNumberTypeName(numberType);
		const string					description	= "Test the OpVariable initializer with " + typeName + ".";
		de::MovePtr<tcu::TestCaseGroup>	subGroup	(new tcu::TestCaseGroup(testCtx, typeName.c_str(), description.c_str()));

		// 2 similar subcases (initialized and uninitialized)
		for (int subCase = 0; subCase < 2; ++subCase)
		{
			ComputeShaderSpec spec;
			spec.numWorkGroups = IVec3(1, 1, 1);

			map<string, string>				params;

			switch (numberType)
			{
				case NUMBERTYPE_INT32:
				{
					deInt32 number = getInt(rnd);
					spec.inputs.push_back(createCompositeBuffer<deInt32>(number));
					spec.outputs.push_back(createCompositeBuffer<deInt32>(number));
					params["constValue"] = numberToString(number);
					break;
				}
				case NUMBERTYPE_UINT32:
				{
					deUint32 number = rnd.getUint32();
					spec.inputs.push_back(createCompositeBuffer<deUint32>(number));
					spec.outputs.push_back(createCompositeBuffer<deUint32>(number));
					params["constValue"] = numberToString(number);
					break;
				}
				case NUMBERTYPE_FLOAT32:
				{
					float number = rnd.getFloat();
					spec.inputs.push_back(createCompositeBuffer<float>(number));
					spec.outputs.push_back(createCompositeBuffer<float>(number));
					spec.verifyIO = &compareFloats;
					params["constValue"] = numberToString(number);
					break;
				}
				default:
					DE_ASSERT(false);
			}

			// Initialized subcase
			if (!subCase)
			{
				spec.assembly = specializeDefaultOutputShaderTemplate(numberType, params);
				subGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "initialized", "OpVariable initializer tests.", spec));
			}
			// Uninitialized subcase
			else
			{
				spec.assembly = specializeDefaultOutputShaderTemplate(numberType);
				spec.verifyIO = &passthruVerify;
				subGroup->addChild(new SpvAsmComputeShaderCase(testCtx, "uninitialized", "OpVariable initializer tests.", spec));
			}
		}
		group->addChild(subGroup.release());
	}
	return group.release();
}

tcu::TestCaseGroup* createOpNopTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	testGroup (new tcu::TestCaseGroup(testCtx, "opnop", "Test OpNop"));
	RGBA							defaultColors[4];
	map<string, string>				opNopFragments;

	getDefaultColors(defaultColors);

	opNopFragments["testfun"]		=
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1 = OpFunctionParameter %v4f32\n"
		"%label_testfun = OpLabel\n"
		"OpNop\n"
		"OpNop\n"
		"OpNop\n"
		"OpNop\n"
		"OpNop\n"
		"OpNop\n"
		"OpNop\n"
		"OpNop\n"
		"%a = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%b = OpFAdd %f32 %a %a\n"
		"OpNop\n"
		"%c = OpFSub %f32 %b %a\n"
		"%ret = OpVectorInsertDynamic %v4f32 %param1 %c %c_i32_0\n"
		"OpNop\n"
		"OpNop\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	createTestsForAllStages("opnop", defaultColors, defaultColors, opNopFragments, testGroup.get());

	return testGroup.release();
}

tcu::TestCaseGroup* createOpNameTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	testGroup	(new tcu::TestCaseGroup(testCtx, "opname","Test OpName"));
	RGBA							defaultColors[4];
	map<string, string>				opNameFragments;

	getDefaultColors(defaultColors);

	opNameFragments["testfun"] =
		"%test_code  = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1     = OpFunctionParameter %v4f32\n"
		"%label_func = OpLabel\n"
		"%a          = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%b          = OpFAdd %f32 %a %a\n"
		"%c          = OpFSub %f32 %b %a\n"
		"%ret        = OpVectorInsertDynamic %v4f32 %param1 %c %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	opNameFragments["debug"] =
		"OpName %BP_main \"not_main\"";

	createTestsForAllStages("opname", defaultColors, defaultColors, opNameFragments, testGroup.get());

	return testGroup.release();
}

tcu::TestCaseGroup* createFloat16Tests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "float16", "Float 16 tests"));

	testGroup->addChild(createOpConstantFloat16Tests(testCtx));
	testGroup->addChild(createFloat16LogicalSet<GraphicsResources>(testCtx, TEST_WITH_NAN));
	testGroup->addChild(createFloat16LogicalSet<GraphicsResources>(testCtx, TEST_WITHOUT_NAN));
	testGroup->addChild(createFloat16FuncSet<GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16VectorExtractSet<GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16VectorInsertSet<GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16VectorShuffleSet<GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16CompositeConstructSet<GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16CompositeInsertExtractSet<GraphicsResources>(testCtx, "OpCompositeExtract"));
	testGroup->addChild(createFloat16CompositeInsertExtractSet<GraphicsResources>(testCtx, "OpCompositeInsert"));
	testGroup->addChild(createFloat16ArithmeticSet<GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<1, GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<2, GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<3, GraphicsResources>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<4, GraphicsResources>(testCtx));

	return testGroup.release();
}

tcu::TestCaseGroup* createFloat16Group (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "float16", "Float 16 tests"));

	testGroup->addChild(createFloat16OpConstantCompositeGroup(testCtx));
	testGroup->addChild(createFloat16LogicalSet<ComputeShaderSpec>(testCtx, TEST_WITH_NAN));
	testGroup->addChild(createFloat16LogicalSet<ComputeShaderSpec>(testCtx, TEST_WITHOUT_NAN));
	testGroup->addChild(createFloat16FuncSet<ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16VectorExtractSet<ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16VectorInsertSet<ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16VectorShuffleSet<ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16CompositeConstructSet<ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16CompositeInsertExtractSet<ComputeShaderSpec>(testCtx, "OpCompositeExtract"));
	testGroup->addChild(createFloat16CompositeInsertExtractSet<ComputeShaderSpec>(testCtx, "OpCompositeInsert"));
	testGroup->addChild(createFloat16ArithmeticSet<ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<1, ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<2, ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<3, ComputeShaderSpec>(testCtx));
	testGroup->addChild(createFloat16ArithmeticSet<4, ComputeShaderSpec>(testCtx));

	return testGroup.release();
}

tcu::TestCaseGroup* createBoolMixedBitSizeGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "mixed_bitsize", "Tests boolean operands produced from instructions of different bit-sizes"));

	de::Random						rnd				(deStringHash(group->getName()));
	const int		numElements		= 100;
	vector<float>	inputData		(numElements, 0);
	vector<float>	outputData		(numElements, 0);
	fillRandomScalars(rnd, 0.0f, 100.0f, &inputData[0], 100);

	const StringTemplate			shaderTemplate	(
		"${CAPS}\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpSource GLSL 430\n"
		"OpName %main           \"main\"\n"
		"OpName %id             \"gl_GlobalInvocationID\"\n"

		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		+ string(getComputeAsmInputOutputBufferTraits()) + string(getComputeAsmCommonTypes()) + string(getComputeAsmInputOutputBuffer()) +

		"%id        = OpVariable %uvec3ptr Input\n"
		"${CONST}\n"
		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %f32ptr %indata %c0i32 %x\n"

		"${TEST}\n"

		"%outloc    = OpAccessChain %f32ptr %outdata %c0i32 %x\n"
		"             OpStore %outloc %res\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n"
	);

	// Each test case produces 4 boolean values, and we want each of these values
	// to come froma different combination of the available bit-sizes, so compute
	// all possible combinations here.
	vector<deUint32>	widths;
	widths.push_back(32);
	widths.push_back(16);
	widths.push_back(8);

	vector<IVec4>	cases;
	for (size_t width0 = 0; width0 < widths.size(); width0++)
	{
		for (size_t width1 = 0; width1 < widths.size(); width1++)
		{
			for (size_t width2 = 0; width2 < widths.size(); width2++)
			{
				for (size_t width3 = 0; width3 < widths.size(); width3++)
				{
					cases.push_back(IVec4(widths[width0], widths[width1], widths[width2], widths[width3]));
				}
			}
		}
	}

	for (size_t caseNdx = 0; caseNdx < cases.size(); caseNdx++)
	{
		/// Skip cases where all bitsizes are the same, we are only interested in testing booleans produced from instructions with different native bit-sizes
		if (cases[caseNdx][0] == cases[caseNdx][1] && cases[caseNdx][0] == cases[caseNdx][2] && cases[caseNdx][0] == cases[caseNdx][3])
			continue;

		map<string, string>	specializations;
		ComputeShaderSpec	spec;

		// Inject appropriate capabilities and reference constants depending
		// on the bit-sizes required by this test case
		bool hasFloat32	= cases[caseNdx][0] == 32 || cases[caseNdx][1] == 32 || cases[caseNdx][2] == 32 || cases[caseNdx][3] == 32;
		bool hasFloat16	= cases[caseNdx][0] == 16 || cases[caseNdx][1] == 16 || cases[caseNdx][2] == 16 || cases[caseNdx][3] == 16;
		bool hasInt8	= cases[caseNdx][0] == 8 || cases[caseNdx][1] == 8 || cases[caseNdx][2] == 8 || cases[caseNdx][3] == 8;

		string capsStr	= "OpCapability Shader\n";
		string constStr	=
			"%c0i32     = OpConstant %i32 0\n"
			"%c1f32     = OpConstant %f32 1.0\n"
			"%c0f32     = OpConstant %f32 0.0\n";

		if (hasFloat32)
		{
			constStr	+=
				"%c10f32    = OpConstant %f32 10.0\n"
				"%c25f32    = OpConstant %f32 25.0\n"
				"%c50f32    = OpConstant %f32 50.0\n"
				"%c90f32    = OpConstant %f32 90.0\n";
		}

		if (hasFloat16)
		{
			capsStr		+= "OpCapability Float16\n";
			constStr	+=
				"%f16       = OpTypeFloat 16\n"
				"%c10f16    = OpConstant %f16 10.0\n"
				"%c25f16    = OpConstant %f16 25.0\n"
				"%c50f16    = OpConstant %f16 50.0\n"
				"%c90f16    = OpConstant %f16 90.0\n";
		}

		if (hasInt8)
		{
			capsStr		+= "OpCapability Int8\n";
			constStr	+=
				"%i8        = OpTypeInt 8 1\n"
				"%c10i8     = OpConstant %i8 10\n"
				"%c25i8     = OpConstant %i8 25\n"
				"%c50i8     = OpConstant %i8 50\n"
				"%c90i8     = OpConstant %i8 90\n";
		}

		// Each invocation reads a different float32 value as input. Depending on
		// the bit-sizes required by the particular test case, we also produce
		// float16 and/or and int8 values by converting from the 32-bit float.
		string testStr	= "";
		testStr			+= "%inval32   = OpLoad %f32 %inloc\n";
		if (hasFloat16)
			testStr		+= "%inval16   = OpFConvert %f16 %inval32\n";
		if (hasInt8)
			testStr		+= "%inval8    = OpConvertFToS %i8 %inval32\n";

		// Because conversions from Float to Int round towards 0 we want our "greater" comparisons to be >=,
		// that way a float32/float16 comparison such as 50.6f >= 50.0f will preserve its result
		// when converted to int8, since FtoS(50.6f) results in 50. For "less" comparisons, it is the
		// other way around, so in this case we want < instead of <=.
		if (cases[caseNdx][0] == 32)
			testStr		+= "%cmp1      = OpFOrdGreaterThanEqual %bool %inval32 %c25f32\n";
		else if (cases[caseNdx][0] == 16)
			testStr		+= "%cmp1      = OpFOrdGreaterThanEqual %bool %inval16 %c25f16\n";
		else
			testStr		+= "%cmp1      = OpSGreaterThanEqual %bool %inval8 %c25i8\n";

		if (cases[caseNdx][1] == 32)
			testStr		+= "%cmp2      = OpFOrdLessThan %bool %inval32 %c50f32\n";
		else if (cases[caseNdx][1] == 16)
			testStr		+= "%cmp2      = OpFOrdLessThan %bool %inval16 %c50f16\n";
		else
			testStr		+= "%cmp2      = OpSLessThan %bool %inval8 %c50i8\n";

		if (cases[caseNdx][2] == 32)
			testStr		+= "%cmp3      = OpFOrdLessThan %bool %inval32 %c10f32\n";
		else if (cases[caseNdx][2] == 16)
			testStr		+= "%cmp3      = OpFOrdLessThan %bool %inval16 %c10f16\n";
		else
			testStr		+= "%cmp3      = OpSLessThan %bool %inval8 %c10i8\n";

		if (cases[caseNdx][3] == 32)
			testStr		+= "%cmp4      = OpFOrdGreaterThanEqual %bool %inval32 %c90f32\n";
		else if (cases[caseNdx][3] == 16)
			testStr		+= "%cmp4      = OpFOrdGreaterThanEqual %bool %inval16 %c90f16\n";
		else
			testStr		+= "%cmp4      = OpSGreaterThanEqual %bool %inval8 %c90i8\n";

		testStr			+= "%and1      = OpLogicalAnd %bool %cmp1 %cmp2\n";
		testStr			+= "%or1       = OpLogicalOr %bool %cmp3 %cmp4\n";
		testStr			+= "%or2       = OpLogicalOr %bool %and1 %or1\n";
		testStr			+= "%not1      = OpLogicalNot %bool %or2\n";
		testStr			+= "%res       = OpSelect %f32 %not1 %c1f32 %c0f32\n";

		specializations["CAPS"]		= capsStr;
		specializations["CONST"]	= constStr;
		specializations["TEST"]		= testStr;

		// Compute expected result by evaluating the boolean expression computed in the shader for each input value
		for (size_t ndx = 0; ndx < numElements; ++ndx)
			outputData[ndx] = !((inputData[ndx] >= 25.0f && inputData[ndx] < 50.0f) || (inputData[ndx] < 10.0f || inputData[ndx] >= 90.0f));

		spec.assembly = shaderTemplate.specialize(specializations);
		spec.inputs.push_back(BufferSp(new Float32Buffer(inputData)));
		spec.outputs.push_back(BufferSp(new Float32Buffer(outputData)));
		spec.numWorkGroups = IVec3(numElements, 1, 1);
		if (hasFloat16)
			spec.requestedVulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_FLOAT16;
		if (hasInt8)
			spec.requestedVulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;
		spec.extensions.push_back("VK_KHR_shader_float16_int8");

		string testName = "b" + de::toString(cases[caseNdx][0]) + "b" + de::toString(cases[caseNdx][1]) + "b" + de::toString(cases[caseNdx][2]) + "b" + de::toString(cases[caseNdx][3]);
		group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), "", spec));
	}

	return group.release();
}

tcu::TestCaseGroup* createBoolGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>		testGroup			(new tcu::TestCaseGroup(testCtx, "bool", "Boolean tests"));

	testGroup->addChild(createBoolMixedBitSizeGroup(testCtx));

	return testGroup.release();
}

tcu::TestCaseGroup* createOpNameAbuseTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	abuseGroup(new tcu::TestCaseGroup(testCtx, "opname_abuse", "OpName abuse tests"));
	vector<CaseParameter>			abuseCases;
	RGBA							defaultColors[4];
	map<string, string>				opNameFragments;

	getOpNameAbuseCases(abuseCases);
	getDefaultColors(defaultColors);

	opNameFragments["testfun"] =
		"%test_code  = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1     = OpFunctionParameter %v4f32\n"
		"%label_func = OpLabel\n"
		"%a          = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%b          = OpFAdd %f32 %a %a\n"
		"%c          = OpFSub %f32 %b %a\n"
		"%ret        = OpVectorInsertDynamic %v4f32 %param1 %c %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	for (unsigned int i = 0; i < abuseCases.size(); i++)
	{
		string casename;
		casename = string("main") + abuseCases[i].name;

		opNameFragments["debug"] =
			"OpName %BP_main \"" + abuseCases[i].param + "\"";

		createTestsForAllStages(casename, defaultColors, defaultColors, opNameFragments, abuseGroup.get());
	}

	for (unsigned int i = 0; i < abuseCases.size(); i++)
	{
		string casename;
		casename = string("b") + abuseCases[i].name;

		opNameFragments["debug"] =
			"OpName %b \"" + abuseCases[i].param + "\"";

		createTestsForAllStages(casename, defaultColors, defaultColors, opNameFragments, abuseGroup.get());
	}

	{
		opNameFragments["debug"] =
			"OpName %test_code \"name1\"\n"
			"OpName %param1    \"name2\"\n"
			"OpName %a         \"name3\"\n"
			"OpName %b         \"name4\"\n"
			"OpName %c         \"name5\"\n"
			"OpName %ret       \"name6\"\n";

		createTestsForAllStages("everything_named", defaultColors, defaultColors, opNameFragments, abuseGroup.get());
	}

	{
		opNameFragments["debug"] =
			"OpName %test_code \"the_same\"\n"
			"OpName %param1    \"the_same\"\n"
			"OpName %a         \"the_same\"\n"
			"OpName %b         \"the_same\"\n"
			"OpName %c         \"the_same\"\n"
			"OpName %ret       \"the_same\"\n";

		createTestsForAllStages("everything_named_the_same", defaultColors, defaultColors, opNameFragments, abuseGroup.get());
	}

	{
		opNameFragments["debug"] =
			"OpName %BP_main \"to_be\"\n"
			"OpName %BP_main \"or_not\"\n"
			"OpName %BP_main \"to_be\"\n";

		createTestsForAllStages("main_has_multiple_names", defaultColors, defaultColors, opNameFragments, abuseGroup.get());
	}

	{
		opNameFragments["debug"] =
			"OpName %b \"to_be\"\n"
			"OpName %b \"or_not\"\n"
			"OpName %b \"to_be\"\n";

		createTestsForAllStages("b_has_multiple_names", defaultColors, defaultColors, opNameFragments, abuseGroup.get());
	}

	return abuseGroup.release();
}


tcu::TestCaseGroup* createOpMemberNameAbuseTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	abuseGroup(new tcu::TestCaseGroup(testCtx, "opmembername_abuse", "OpName abuse tests"));
	vector<CaseParameter>			abuseCases;
	RGBA							defaultColors[4];
	map<string, string>				opMemberNameFragments;

	getOpNameAbuseCases(abuseCases);
	getDefaultColors(defaultColors);

	opMemberNameFragments["pre_main"] =
		"%f3str = OpTypeStruct %f32 %f32 %f32\n";

	opMemberNameFragments["testfun"] =
		"%test_code  = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param1     = OpFunctionParameter %v4f32\n"
		"%label_func = OpLabel\n"
		"%a          = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
		"%b          = OpFAdd %f32 %a %a\n"
		"%c          = OpFSub %f32 %b %a\n"
		"%cstr       = OpCompositeConstruct %f3str %c %c %c\n"
		"%d          = OpCompositeExtract %f32 %cstr 0\n"
		"%ret        = OpVectorInsertDynamic %v4f32 %param1 %d %c_i32_0\n"
		"OpReturnValue %ret\n"
		"OpFunctionEnd\n";

	for (unsigned int i = 0; i < abuseCases.size(); i++)
	{
		string casename;
		casename = string("f3str_x") + abuseCases[i].name;

		opMemberNameFragments["debug"] =
			"OpMemberName %f3str 0 \"" + abuseCases[i].param + "\"";

		createTestsForAllStages(casename, defaultColors, defaultColors, opMemberNameFragments, abuseGroup.get());
	}

	{
		opMemberNameFragments["debug"] =
			"OpMemberName %f3str 0 \"name1\"\n"
			"OpMemberName %f3str 1 \"name2\"\n"
			"OpMemberName %f3str 2 \"name3\"\n";

		createTestsForAllStages("everything_named", defaultColors, defaultColors, opMemberNameFragments, abuseGroup.get());
	}

	{
		opMemberNameFragments["debug"] =
			"OpMemberName %f3str 0 \"the_same\"\n"
			"OpMemberName %f3str 1 \"the_same\"\n"
			"OpMemberName %f3str 2 \"the_same\"\n";

		createTestsForAllStages("everything_named_the_same", defaultColors, defaultColors, opMemberNameFragments, abuseGroup.get());
	}

	{
		opMemberNameFragments["debug"] =
			"OpMemberName %f3str 0 \"to_be\"\n"
			"OpMemberName %f3str 1 \"or_not\"\n"
			"OpMemberName %f3str 0 \"to_be\"\n"
			"OpMemberName %f3str 2 \"makes_no\"\n"
			"OpMemberName %f3str 0 \"difference\"\n"
			"OpMemberName %f3str 0 \"to_me\"\n";


		createTestsForAllStages("f3str_x_has_multiple_names", defaultColors, defaultColors, opMemberNameFragments, abuseGroup.get());
	}

	return abuseGroup.release();
}

vector<deUint32> getSparseIdsAbuseData (const deUint32 numDataPoints, const deUint32 seed)
{
	vector<deUint32>	result;
	de::Random			rnd		(seed);

	result.reserve(numDataPoints);

	for (deUint32 dataPointNdx = 0; dataPointNdx < numDataPoints; ++dataPointNdx)
		result.push_back(rnd.getUint32());

	return result;
}

vector<deUint32> getSparseIdsAbuseResults (const vector<deUint32>& inData1, const vector<deUint32>& inData2)
{
	vector<deUint32>	result;

	result.reserve(inData1.size());

	for (size_t dataPointNdx = 0; dataPointNdx < inData1.size(); ++dataPointNdx)
		result.push_back(inData1[dataPointNdx] + inData2[dataPointNdx]);

	return result;
}

template<class SpecResource>
void createSparseIdsAbuseTest (tcu::TestContext& testCtx, de::MovePtr<tcu::TestCaseGroup>& testGroup)
{
	const deUint32			numDataPoints	= 16;
	const std::string		testName		("sparse_ids");
	const deUint32			seed			(deStringHash(testName.c_str()));
	const vector<deUint32>	inData1			(getSparseIdsAbuseData(numDataPoints, seed + 1));
	const vector<deUint32>	inData2			(getSparseIdsAbuseData(numDataPoints, seed + 2));
	const vector<deUint32>	outData			(getSparseIdsAbuseResults(inData1, inData2));
	const StringTemplate	preMain
	(
		"%c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
		"   %up_u32 = OpTypePointer Uniform %u32\n"
		"   %ra_u32 = OpTypeArray %u32 %c_i32_ndp\n"
		"   %SSBO32 = OpTypeStruct %ra_u32\n"
		"%up_SSBO32 = OpTypePointer Uniform %SSBO32\n"
		"%ssbo_src0 = OpVariable %up_SSBO32 Uniform\n"
		"%ssbo_src1 = OpVariable %up_SSBO32 Uniform\n"
		" %ssbo_dst = OpVariable %up_SSBO32 Uniform\n"
	);
	const StringTemplate	decoration
	(
		"OpDecorate %ra_u32 ArrayStride 4\n"
		"OpMemberDecorate %SSBO32 0 Offset 0\n"
		"OpDecorate %SSBO32 BufferBlock\n"
		"OpDecorate %ssbo_src0 DescriptorSet 0\n"
		"OpDecorate %ssbo_src0 Binding 0\n"
		"OpDecorate %ssbo_src1 DescriptorSet 0\n"
		"OpDecorate %ssbo_src1 Binding 1\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 2\n"
	);
	const StringTemplate	testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"

		"    %entry = OpLabel\n"
		"        %i = OpVariable %fp_i32 Function\n"
		"             OpStore %i %c_i32_0\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"

		"      %127 = OpAccessChain %up_u32 %ssbo_src0 %c_i32_0 %ndx\n"
		"      %128 = OpLoad %u32 %127\n"

		// The test relies on SPIR-V compiler option SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS set in assembleSpirV()
		"  %4194000 = OpAccessChain %up_u32 %ssbo_src1 %c_i32_0 %ndx\n"
		"  %4194001 = OpLoad %u32 %4194000\n"

		"  %2097151 = OpIAdd %u32 %128 %4194001\n"
		"  %2097152 = OpAccessChain %up_u32 %ssbo_dst %c_i32_0 %ndx\n"
		"             OpStore %2097152 %2097151\n"
		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpReturnValue %param\n"

		"             OpFunctionEnd\n"
	);
	SpecResource			specResource;
	map<string, string>		specs;
	VulkanFeatures			features;
	map<string, string>		fragments;
	vector<string>			extensions;

	specs["num_data_points"]	= de::toString(numDataPoints);

	fragments["decoration"]		= decoration.specialize(specs);
	fragments["pre_main"]		= preMain.specialize(specs);
	fragments["testfun"]		= testFun.specialize(specs);

	specResource.inputs.push_back(Resource(BufferSp(new Uint32Buffer(inData1)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
	specResource.inputs.push_back(Resource(BufferSp(new Uint32Buffer(inData2)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
	specResource.outputs.push_back(Resource(BufferSp(new Uint32Buffer(outData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

	features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
	features.coreFeatures.fragmentStoresAndAtomics			= true;

	finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
}

vector<deUint32> getLotsIdsAbuseData (const deUint32 numDataPoints, const deUint32 seed)
{
	vector<deUint32>	result;
	de::Random			rnd		(seed);

	result.reserve(numDataPoints);

	// Fixed value
	result.push_back(1u);

	// Random values
	for (deUint32 dataPointNdx = 1; dataPointNdx < numDataPoints; ++dataPointNdx)
		result.push_back(rnd.getUint8());

	return result;
}

vector<deUint32> getLotsIdsAbuseResults (const vector<deUint32>& inData1, const vector<deUint32>& inData2, const deUint32 count)
{
	vector<deUint32>	result;

	result.reserve(inData1.size());

	for (size_t dataPointNdx = 0; dataPointNdx < inData1.size(); ++dataPointNdx)
		result.push_back(inData1[dataPointNdx] + count * inData2[dataPointNdx]);

	return result;
}

template<class SpecResource>
void createLotsIdsAbuseTest (tcu::TestContext& testCtx, de::MovePtr<tcu::TestCaseGroup>& testGroup)
{
	const deUint32			numDataPoints	= 16;
	const deUint32			firstNdx		= 100u;
	const deUint32			sequenceCount	= 10000u;
	const std::string		testName		("lots_ids");
	const deUint32			seed			(deStringHash(testName.c_str()));
	const vector<deUint32>	inData1			(getLotsIdsAbuseData(numDataPoints, seed + 1));
	const vector<deUint32>	inData2			(getLotsIdsAbuseData(numDataPoints, seed + 2));
	const vector<deUint32>	outData			(getLotsIdsAbuseResults(inData1, inData2, sequenceCount));
	const StringTemplate preMain
	(
		"%c_i32_ndp = OpConstant %i32 ${num_data_points}\n"
		"   %up_u32 = OpTypePointer Uniform %u32\n"
		"   %ra_u32 = OpTypeArray %u32 %c_i32_ndp\n"
		"   %SSBO32 = OpTypeStruct %ra_u32\n"
		"%up_SSBO32 = OpTypePointer Uniform %SSBO32\n"
		"%ssbo_src0 = OpVariable %up_SSBO32 Uniform\n"
		"%ssbo_src1 = OpVariable %up_SSBO32 Uniform\n"
		" %ssbo_dst = OpVariable %up_SSBO32 Uniform\n"
	);
	const StringTemplate decoration
	(
		"OpDecorate %ra_u32 ArrayStride 4\n"
		"OpMemberDecorate %SSBO32 0 Offset 0\n"
		"OpDecorate %SSBO32 BufferBlock\n"
		"OpDecorate %ssbo_src0 DescriptorSet 0\n"
		"OpDecorate %ssbo_src0 Binding 0\n"
		"OpDecorate %ssbo_src1 DescriptorSet 0\n"
		"OpDecorate %ssbo_src1 Binding 1\n"
		"OpDecorate %ssbo_dst DescriptorSet 0\n"
		"OpDecorate %ssbo_dst Binding 2\n"
	);
	const StringTemplate testFun
	(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"

		"    %entry = OpLabel\n"
		"        %i = OpVariable %fp_i32 Function\n"
		"             OpStore %i %c_i32_0\n"
		"             OpBranch %loop\n"

		"     %loop = OpLabel\n"
		"    %i_cmp = OpLoad %i32 %i\n"
		"       %lt = OpSLessThan %bool %i_cmp %c_i32_ndp\n"
		"             OpLoopMerge %merge %next None\n"
		"             OpBranchConditional %lt %write %merge\n"

		"    %write = OpLabel\n"
		"      %ndx = OpLoad %i32 %i\n"

		"       %90 = OpAccessChain %up_u32 %ssbo_src1 %c_i32_0 %ndx\n"
		"       %91 = OpLoad %u32 %90\n"

		"       %98 = OpAccessChain %up_u32 %ssbo_src0 %c_i32_0 %ndx\n"
		"       %${zeroth_id} = OpLoad %u32 %98\n"

		"${seq}\n"

		// The test relies on SPIR-V compiler option SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS set in assembleSpirV()
		"      %dst = OpAccessChain %up_u32 %ssbo_dst %c_i32_0 %ndx\n"
		"             OpStore %dst %${last_id}\n"
		"             OpBranch %next\n"

		"     %next = OpLabel\n"
		"    %i_cur = OpLoad %i32 %i\n"
		"    %i_new = OpIAdd %i32 %i_cur %c_i32_1\n"
		"             OpStore %i %i_new\n"
		"             OpBranch %loop\n"

		"    %merge = OpLabel\n"
		"             OpReturnValue %param\n"

		"             OpFunctionEnd\n"
	);
	deUint32				lastId			= firstNdx;
	SpecResource			specResource;
	map<string, string>		specs;
	VulkanFeatures			features;
	map<string, string>		fragments;
	vector<string>			extensions;
	std::string				sequence;

	for (deUint32 sequenceNdx = 0; sequenceNdx < sequenceCount; ++sequenceNdx)
	{
		const deUint32		sequenceId		= sequenceNdx + firstNdx;
		const std::string	sequenceIdStr	= de::toString(sequenceId);

		sequence += "%" + sequenceIdStr + " = OpIAdd %u32 %91 %" + de::toString(sequenceId - 1) + "\n";
		lastId = sequenceId;

		if (sequenceNdx == 0)
			sequence.reserve((10 + sequence.length()) * sequenceCount);
	}

	specs["num_data_points"]	= de::toString(numDataPoints);
	specs["zeroth_id"]			= de::toString(firstNdx - 1);
	specs["last_id"]			= de::toString(lastId);
	specs["seq"]				= sequence;

	fragments["decoration"]		= decoration.specialize(specs);
	fragments["pre_main"]		= preMain.specialize(specs);
	fragments["testfun"]		= testFun.specialize(specs);

	specResource.inputs.push_back(Resource(BufferSp(new Uint32Buffer(inData1)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
	specResource.inputs.push_back(Resource(BufferSp(new Uint32Buffer(inData2)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
	specResource.outputs.push_back(Resource(BufferSp(new Uint32Buffer(outData)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

	features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
	features.coreFeatures.fragmentStoresAndAtomics			= true;

	finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
}

tcu::TestCaseGroup* createSpirvIdsAbuseTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	testGroup	(new tcu::TestCaseGroup(testCtx, "spirv_ids_abuse", "SPIR-V abuse tests"));

	createSparseIdsAbuseTest<GraphicsResources>(testCtx, testGroup);
	createLotsIdsAbuseTest<GraphicsResources>(testCtx, testGroup);

	return testGroup.release();
}

tcu::TestCaseGroup* createSpirvIdsAbuseGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	testGroup	(new tcu::TestCaseGroup(testCtx, "spirv_ids_abuse", "SPIR-V abuse tests"));

	createSparseIdsAbuseTest<ComputeShaderSpec>(testCtx, testGroup);
	createLotsIdsAbuseTest<ComputeShaderSpec>(testCtx, testGroup);

	return testGroup.release();
}

tcu::TestCaseGroup* createFunctionParamsGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup>	testGroup (new tcu::TestCaseGroup(testCtx, "function_params", "Function parameter tests"));

	static const char data_dir[] = "spirv_assembly/instruction/function_params";

	static const struct
	{
		const std::string name;
		const std::string desc;
	} cases[] =
	{
		{ "sampler_param", "Test combined image sampler as function parameter" },
	};

	for (int i = 0; i < DE_LENGTH_OF_ARRAY(cases); ++i)
	{
		cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx,
																			cases[i].name.c_str(),
																			cases[i].desc.c_str(),
																			data_dir,
																			cases[i].name + ".amber");
		testGroup->addChild(testCase);
	}

	return testGroup.release();
}

tcu::TestCaseGroup* createInstructionTests (tcu::TestContext& testCtx)
{
	const bool testComputePipeline = true;

	de::MovePtr<tcu::TestCaseGroup> instructionTests	(new tcu::TestCaseGroup(testCtx, "instruction", "Instructions with special opcodes/operands"));
	de::MovePtr<tcu::TestCaseGroup> computeTests		(new tcu::TestCaseGroup(testCtx, "compute", "Compute Instructions with special opcodes/operands"));
	de::MovePtr<tcu::TestCaseGroup> graphicsTests		(new tcu::TestCaseGroup(testCtx, "graphics", "Graphics Instructions with special opcodes/operands"));

	computeTests->addChild(createSpivVersionCheckTests(testCtx, testComputePipeline));
	computeTests->addChild(createLocalSizeGroup(testCtx));
	computeTests->addChild(createNonSemanticInfoGroup(testCtx));
	computeTests->addChild(createOpNopGroup(testCtx));
	computeTests->addChild(createOpFUnordGroup(testCtx, TEST_WITHOUT_NAN));
	computeTests->addChild(createOpFUnordGroup(testCtx, TEST_WITH_NAN));
	computeTests->addChild(createOpAtomicGroup(testCtx, false));
	computeTests->addChild(createOpAtomicGroup(testCtx, true));					// Using new StorageBuffer decoration
	computeTests->addChild(createOpAtomicGroup(testCtx, false, 1024, true));	// Return value validation
	computeTests->addChild(createOpAtomicGroup(testCtx, true, 65536, false, true));	// volatile atomics
	computeTests->addChild(createOpLineGroup(testCtx));
	computeTests->addChild(createOpModuleProcessedGroup(testCtx));
	computeTests->addChild(createOpNoLineGroup(testCtx));
	computeTests->addChild(createOpConstantNullGroup(testCtx));
	computeTests->addChild(createOpConstantCompositeGroup(testCtx));
	computeTests->addChild(createOpConstantUsageGroup(testCtx));
	computeTests->addChild(createSpecConstantGroup(testCtx));
	computeTests->addChild(createOpSourceGroup(testCtx));
	computeTests->addChild(createOpSourceExtensionGroup(testCtx));
	computeTests->addChild(createDecorationGroupGroup(testCtx));
	computeTests->addChild(createOpPhiGroup(testCtx));
	computeTests->addChild(createLoopControlGroup(testCtx));
	computeTests->addChild(createFunctionControlGroup(testCtx));
	computeTests->addChild(createSelectionControlGroup(testCtx));
	computeTests->addChild(createBlockOrderGroup(testCtx));
	computeTests->addChild(createMultipleShaderGroup(testCtx));
	computeTests->addChild(createMemoryAccessGroup(testCtx));
	computeTests->addChild(createOpCopyMemoryGroup(testCtx));
	computeTests->addChild(createOpCopyObjectGroup(testCtx));
	computeTests->addChild(createNoContractionGroup(testCtx));
	computeTests->addChild(createOpUndefGroup(testCtx));
	computeTests->addChild(createOpUnreachableGroup(testCtx));
	computeTests->addChild(createOpQuantizeToF16Group(testCtx));
	computeTests->addChild(createOpFRemGroup(testCtx));
	computeTests->addChild(createOpSRemComputeGroup(testCtx, QP_TEST_RESULT_PASS));
	computeTests->addChild(createOpSRemComputeGroup64(testCtx, QP_TEST_RESULT_PASS));
	computeTests->addChild(createOpSModComputeGroup(testCtx, QP_TEST_RESULT_PASS));
	computeTests->addChild(createOpSModComputeGroup64(testCtx, QP_TEST_RESULT_PASS));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpSConvert", "sconvert"));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpUConvert", "uconvert"));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpFConvert", "fconvert"));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpConvertSToF", "convertstof"));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpConvertFToS", "convertftos"));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpConvertUToF", "convertutof"));
	computeTests->addChild(createConvertComputeTests(testCtx, "OpConvertFToU", "convertftou"));
	computeTests->addChild(createOpCompositeInsertGroup(testCtx));
	computeTests->addChild(createOpInBoundsAccessChainGroup(testCtx));
	computeTests->addChild(createShaderDefaultOutputGroup(testCtx));
	computeTests->addChild(createOpNMinGroup(testCtx));
	computeTests->addChild(createOpNMaxGroup(testCtx));
	computeTests->addChild(createOpNClampGroup(testCtx));
	computeTests->addChild(createFloatControlsExtensionlessGroup(testCtx));
	{
		de::MovePtr<tcu::TestCaseGroup>	computeAndroidTests	(new tcu::TestCaseGroup(testCtx, "android", "Android CTS Tests"));

		computeAndroidTests->addChild(createOpSRemComputeGroup(testCtx, QP_TEST_RESULT_QUALITY_WARNING));
		computeAndroidTests->addChild(createOpSModComputeGroup(testCtx, QP_TEST_RESULT_QUALITY_WARNING));

		computeTests->addChild(computeAndroidTests.release());
	}

	computeTests->addChild(create8BitStorageComputeGroup(testCtx));
	computeTests->addChild(create16BitStorageComputeGroup(testCtx));
	computeTests->addChild(createFloatControlsComputeGroup(testCtx));
	computeTests->addChild(createUboMatrixPaddingComputeGroup(testCtx));
	computeTests->addChild(createCompositeInsertComputeGroup(testCtx));
	computeTests->addChild(createVariableInitComputeGroup(testCtx));
	computeTests->addChild(createConditionalBranchComputeGroup(testCtx));
	computeTests->addChild(createIndexingComputeGroup(testCtx));
	computeTests->addChild(createVariablePointersComputeGroup(testCtx));
	computeTests->addChild(createPhysicalPointersComputeGroup(testCtx));
	computeTests->addChild(createImageSamplerComputeGroup(testCtx));
	computeTests->addChild(createOpNameGroup(testCtx));
	computeTests->addChild(createOpMemberNameGroup(testCtx));
	computeTests->addChild(createPointerParameterComputeGroup(testCtx));
	computeTests->addChild(createFloat16Group(testCtx));
	computeTests->addChild(createBoolGroup(testCtx));
	computeTests->addChild(createWorkgroupMemoryComputeGroup(testCtx));
	computeTests->addChild(createSpirvIdsAbuseGroup(testCtx));
	computeTests->addChild(createSignedIntCompareGroup(testCtx));
	computeTests->addChild(createUnusedVariableComputeTests(testCtx));
	computeTests->addChild(createPtrAccessChainGroup(testCtx));
	computeTests->addChild(createHlslComputeGroup(testCtx));
	computeTests->addChild(create64bitCompareComputeGroup(testCtx));

	graphicsTests->addChild(createCrossStageInterfaceTests(testCtx));
	graphicsTests->addChild(createSpivVersionCheckTests(testCtx, !testComputePipeline));
	graphicsTests->addChild(createOpNopTests(testCtx));
	graphicsTests->addChild(createOpSourceTests(testCtx));
	graphicsTests->addChild(createOpSourceContinuedTests(testCtx));
	graphicsTests->addChild(createOpModuleProcessedTests(testCtx));
	graphicsTests->addChild(createOpLineTests(testCtx));
	graphicsTests->addChild(createOpNoLineTests(testCtx));
	graphicsTests->addChild(createOpConstantNullTests(testCtx));
	graphicsTests->addChild(createOpConstantCompositeTests(testCtx));
	graphicsTests->addChild(createMemoryAccessTests(testCtx));
	graphicsTests->addChild(createOpUndefTests(testCtx));
	graphicsTests->addChild(createSelectionBlockOrderTests(testCtx));
	graphicsTests->addChild(createModuleTests(testCtx));
	graphicsTests->addChild(createUnusedVariableTests(testCtx));
	graphicsTests->addChild(createSwitchBlockOrderTests(testCtx));
	graphicsTests->addChild(createOpPhiTests(testCtx));
	graphicsTests->addChild(createNoContractionTests(testCtx));
	graphicsTests->addChild(createOpQuantizeTests(testCtx));
	graphicsTests->addChild(createLoopTests(testCtx));
	graphicsTests->addChild(createSpecConstantTests(testCtx));
	graphicsTests->addChild(createSpecConstantOpQuantizeToF16Group(testCtx));
	graphicsTests->addChild(createBarrierTests(testCtx));
	graphicsTests->addChild(createDecorationGroupTests(testCtx));
	graphicsTests->addChild(createFRemTests(testCtx));
	graphicsTests->addChild(createOpSRemGraphicsTests(testCtx, QP_TEST_RESULT_PASS));
	graphicsTests->addChild(createOpSModGraphicsTests(testCtx, QP_TEST_RESULT_PASS));

	{
		de::MovePtr<tcu::TestCaseGroup>	graphicsAndroidTests	(new tcu::TestCaseGroup(testCtx, "android", "Android CTS Tests"));

		graphicsAndroidTests->addChild(createOpSRemGraphicsTests(testCtx, QP_TEST_RESULT_QUALITY_WARNING));
		graphicsAndroidTests->addChild(createOpSModGraphicsTests(testCtx, QP_TEST_RESULT_QUALITY_WARNING));

		graphicsTests->addChild(graphicsAndroidTests.release());
	}
	graphicsTests->addChild(createOpNameTests(testCtx));
	graphicsTests->addChild(createOpNameAbuseTests(testCtx));
	graphicsTests->addChild(createOpMemberNameAbuseTests(testCtx));

	graphicsTests->addChild(create8BitStorageGraphicsGroup(testCtx));
	graphicsTests->addChild(create16BitStorageGraphicsGroup(testCtx));
	graphicsTests->addChild(createFloatControlsGraphicsGroup(testCtx));
	graphicsTests->addChild(createUboMatrixPaddingGraphicsGroup(testCtx));
	graphicsTests->addChild(createCompositeInsertGraphicsGroup(testCtx));
	graphicsTests->addChild(createVariableInitGraphicsGroup(testCtx));
	graphicsTests->addChild(createConditionalBranchGraphicsGroup(testCtx));
	graphicsTests->addChild(createIndexingGraphicsGroup(testCtx));
	graphicsTests->addChild(createVariablePointersGraphicsGroup(testCtx));
	graphicsTests->addChild(createImageSamplerGraphicsGroup(testCtx));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpSConvert", "sconvert"));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpUConvert", "uconvert"));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpFConvert", "fconvert"));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpConvertSToF", "convertstof"));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpConvertFToS", "convertftos"));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpConvertUToF", "convertutof"));
	graphicsTests->addChild(createConvertGraphicsTests(testCtx, "OpConvertFToU", "convertftou"));
	graphicsTests->addChild(createPointerParameterGraphicsGroup(testCtx));
	graphicsTests->addChild(createVaryingNameGraphicsGroup(testCtx));
	graphicsTests->addChild(createFloat16Tests(testCtx));
	graphicsTests->addChild(createSpirvIdsAbuseTests(testCtx));
	graphicsTests->addChild(create64bitCompareGraphicsGroup(testCtx));

	instructionTests->addChild(computeTests.release());
	instructionTests->addChild(graphicsTests.release());
	instructionTests->addChild(createSpirvVersion1p4Group(testCtx));
	instructionTests->addChild(createFunctionParamsGroup(testCtx));

	return instructionTests.release();
}

} // SpirVAssembly
} // vkt
