Add modfStruct comparison tests
authorMika Väinölä <mika.vainola@siru.fi>
Thu, 14 May 2020 19:50:16 +0000 (22:50 +0300)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 19 Jun 2020 08:42:56 +0000 (04:42 -0400)
Add tests for comparing the output of modf and modfStruct with 32-bit floats
and vectors as input. Update Amber and implement delegate for loading buffers
from files in AmberScript.

New tests:
dEQP-VK.spirv_assembly.instruction.*.float32.comparison_*.modfstruct*

Components: Vulkan

VK-GL-CTS issue: 1728

Change-Id: If2ee37779472be543038bae313792e2367051bdf

33 files changed:
android/cts/master/vk-master-2020-03-01.txt
android/cts/master/vk-master.txt
external/amber/CMakeLists.txt
external/fetch_sources.py
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/grid_vertices.txt [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/input.txt [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_comp.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_frag.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_geom.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_tesc.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_tese.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_vert.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_comp.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_frag.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_geom.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_tesc.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_tese.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_vert.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_comp.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_frag.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_geom.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_tesc.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_tese.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_vert.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_comp.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_frag.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_geom.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_tesc.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_tese.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_vert.amber [new file with mode: 0644]
external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
external/vulkancts/mustpass/master/vk-default.txt

index b67025f..3971fcc 100644 (file)
@@ -124914,6 +124914,10 @@ dEQP-VK.spirv_assembly.instruction.compute.physical_pointers.complex_types_compu
 dEQP-VK.spirv_assembly.instruction.compute.physical_pointers.complex_types_compute.opphi_float_single_buffer_first_input
 dEQP-VK.spirv_assembly.instruction.compute.physical_pointers.complex_types_compute.opcopyobject_float_single_buffer_first_input
 dEQP-VK.spirv_assembly.instruction.compute.physical_pointers.complex_types_compute.opptraccesschain_float_single_buffer_first_input
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_1.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_2.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_3.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_4.modfstruct
 dEQP-VK.spirv_assembly.instruction.compute.spirv_ids_abuse.sparse_ids
 dEQP-VK.spirv_assembly.instruction.compute.spirv_ids_abuse.lots_ids
 dEQP-VK.spirv_assembly.instruction.compute.signed_int_compare.uint_sgreaterthanequal
@@ -126560,6 +126564,26 @@ dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float16_no_stora
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float16_no_storage_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float16_no_storage_geom
 dEQP-VK.spirv_assembly.instruction.graphics.fconvert.float64_to_float16_no_storage_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_frag
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_vert
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_tesse
index 97f7292..708b0fa 100644 (file)
@@ -350410,6 +350410,10 @@ dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.reflect
 dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.refract
 dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.opdot
 dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.opvectortimesscalar
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_1.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_2.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_3.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_4.modfstruct
 dEQP-VK.spirv_assembly.instruction.compute.bool.mixed_bitsize.b32b32b32b16
 dEQP-VK.spirv_assembly.instruction.compute.bool.mixed_bitsize.b32b32b32b8
 dEQP-VK.spirv_assembly.instruction.compute.bool.mixed_bitsize.b32b32b16b32
@@ -364466,6 +364470,26 @@ dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimessc
 dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar_geom
 dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_frag
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_vert
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_tesse
index 74930f4..f6d0899 100644 (file)
@@ -6,6 +6,7 @@ set(AMBER_SKIP_SPIRV_TOOLS TRUE)
 set(AMBER_SKIP_SHADERC TRUE)
 set(AMBER_SKIP_SAMPLES TRUE)
 set(AMBER_ENABLE_SHARED_CRT TRUE)
+set(AMBER_ENABLE_RTTI TRUE CACHE BOOL "Enable runtime type information" FORCE)
 set(Vulkan-Headers_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../vulkancts/framework/vulkan/)
 
 add_subdirectory(src)
index 4e4c4d0..accbc55 100644 (file)
@@ -332,7 +332,7 @@ PACKAGES = [
        GitRepo(
                "https://github.com/google/amber.git",
                None,
-               "a40bef4dba98d2d80b48e5a940d8574fbfceb197",
+               "2f42dc26a78fe0ff9afa73d698344fb2170658d9",
                "amber"),
 ]
 
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/grid_vertices.txt b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/grid_vertices.txt
new file mode 100644 (file)
index 0000000..5218e7c
--- /dev/null
@@ -0,0 +1,1297 @@
+# 36x36 grid
+-0.944444 -0.944444 -1.000000 -0.944444 -1.000000 -1.000000 -0.944444 -0.944444 -1.000000 -1.000000 -0.944444 -1.000000
+-0.888889 -0.944444 -0.944444 -0.944444 -0.944444 -1.000000 -0.888889 -0.944444 -0.944444 -1.000000 -0.888889 -1.000000
+-0.833333 -0.944444 -0.888889 -0.944444 -0.888889 -1.000000 -0.833333 -0.944444 -0.888889 -1.000000 -0.833333 -1.000000
+-0.777778 -0.944444 -0.833333 -0.944444 -0.833333 -1.000000 -0.777778 -0.944444 -0.833333 -1.000000 -0.777778 -1.000000
+-0.722222 -0.944444 -0.777778 -0.944444 -0.777778 -1.000000 -0.722222 -0.944444 -0.777778 -1.000000 -0.722222 -1.000000
+-0.666667 -0.944444 -0.722222 -0.944444 -0.722222 -1.000000 -0.666667 -0.944444 -0.722222 -1.000000 -0.666667 -1.000000
+-0.611111 -0.944444 -0.666667 -0.944444 -0.666667 -1.000000 -0.611111 -0.944444 -0.666667 -1.000000 -0.611111 -1.000000
+-0.555556 -0.944444 -0.611111 -0.944444 -0.611111 -1.000000 -0.555556 -0.944444 -0.611111 -1.000000 -0.555556 -1.000000
+-0.500000 -0.944444 -0.555556 -0.944444 -0.555556 -1.000000 -0.500000 -0.944444 -0.555556 -1.000000 -0.500000 -1.000000
+-0.444444 -0.944444 -0.500000 -0.944444 -0.500000 -1.000000 -0.444444 -0.944444 -0.500000 -1.000000 -0.444444 -1.000000
+-0.388889 -0.944444 -0.444444 -0.944444 -0.444444 -1.000000 -0.388889 -0.944444 -0.444444 -1.000000 -0.388889 -1.000000
+-0.333333 -0.944444 -0.388889 -0.944444 -0.388889 -1.000000 -0.333333 -0.944444 -0.388889 -1.000000 -0.333333 -1.000000
+-0.277778 -0.944444 -0.333333 -0.944444 -0.333333 -1.000000 -0.277778 -0.944444 -0.333333 -1.000000 -0.277778 -1.000000
+-0.222222 -0.944444 -0.277778 -0.944444 -0.277778 -1.000000 -0.222222 -0.944444 -0.277778 -1.000000 -0.222222 -1.000000
+-0.166667 -0.944444 -0.222222 -0.944444 -0.222222 -1.000000 -0.166667 -0.944444 -0.222222 -1.000000 -0.166667 -1.000000
+-0.111111 -0.944444 -0.166667 -0.944444 -0.166667 -1.000000 -0.111111 -0.944444 -0.166667 -1.000000 -0.111111 -1.000000
+-0.055556 -0.944444 -0.111111 -0.944444 -0.111111 -1.000000 -0.055556 -0.944444 -0.111111 -1.000000 -0.055556 -1.000000
+ 0.000000 -0.944444 -0.055556 -0.944444 -0.055556 -1.000000  0.000000 -0.944444 -0.055556 -1.000000  0.000000 -1.000000
+ 0.055556 -0.944444  0.000000 -0.944444  0.000000 -1.000000  0.055556 -0.944444  0.000000 -1.000000  0.055556 -1.000000
+ 0.111111 -0.944444  0.055556 -0.944444  0.055556 -1.000000  0.111111 -0.944444  0.055556 -1.000000  0.111111 -1.000000
+ 0.166667 -0.944444  0.111111 -0.944444  0.111111 -1.000000  0.166667 -0.944444  0.111111 -1.000000  0.166667 -1.000000
+ 0.222222 -0.944444  0.166667 -0.944444  0.166667 -1.000000  0.222222 -0.944444  0.166667 -1.000000  0.222222 -1.000000
+ 0.277778 -0.944444  0.222222 -0.944444  0.222222 -1.000000  0.277778 -0.944444  0.222222 -1.000000  0.277778 -1.000000
+ 0.333333 -0.944444  0.277778 -0.944444  0.277778 -1.000000  0.333333 -0.944444  0.277778 -1.000000  0.333333 -1.000000
+ 0.388889 -0.944444  0.333333 -0.944444  0.333333 -1.000000  0.388889 -0.944444  0.333333 -1.000000  0.388889 -1.000000
+ 0.444444 -0.944444  0.388889 -0.944444  0.388889 -1.000000  0.444444 -0.944444  0.388889 -1.000000  0.444444 -1.000000
+ 0.500000 -0.944444  0.444444 -0.944444  0.444444 -1.000000  0.500000 -0.944444  0.444444 -1.000000  0.500000 -1.000000
+ 0.555556 -0.944444  0.500000 -0.944444  0.500000 -1.000000  0.555556 -0.944444  0.500000 -1.000000  0.555556 -1.000000
+ 0.611111 -0.944444  0.555556 -0.944444  0.555556 -1.000000  0.611111 -0.944444  0.555556 -1.000000  0.611111 -1.000000
+ 0.666667 -0.944444  0.611111 -0.944444  0.611111 -1.000000  0.666667 -0.944444  0.611111 -1.000000  0.666667 -1.000000
+ 0.722222 -0.944444  0.666667 -0.944444  0.666667 -1.000000  0.722222 -0.944444  0.666667 -1.000000  0.722222 -1.000000
+ 0.777778 -0.944444  0.722222 -0.944444  0.722222 -1.000000  0.777778 -0.944444  0.722222 -1.000000  0.777778 -1.000000
+ 0.833333 -0.944444  0.777778 -0.944444  0.777778 -1.000000  0.833333 -0.944444  0.777778 -1.000000  0.833333 -1.000000
+ 0.888889 -0.944444  0.833333 -0.944444  0.833333 -1.000000  0.888889 -0.944444  0.833333 -1.000000  0.888889 -1.000000
+ 0.944444 -0.944444  0.888889 -0.944444  0.888889 -1.000000  0.944444 -0.944444  0.888889 -1.000000  0.944444 -1.000000
+ 1.000000 -0.944444  0.944444 -0.944444  0.944444 -1.000000  1.000000 -0.944444  0.944444 -1.000000  1.000000 -1.000000
+-0.944444 -0.888889 -1.000000 -0.888889 -1.000000 -0.944444 -0.944444 -0.888889 -1.000000 -0.944444 -0.944444 -0.944444
+-0.888889 -0.888889 -0.944444 -0.888889 -0.944444 -0.944444 -0.888889 -0.888889 -0.944444 -0.944444 -0.888889 -0.944444
+-0.833333 -0.888889 -0.888889 -0.888889 -0.888889 -0.944444 -0.833333 -0.888889 -0.888889 -0.944444 -0.833333 -0.944444
+-0.777778 -0.888889 -0.833333 -0.888889 -0.833333 -0.944444 -0.777778 -0.888889 -0.833333 -0.944444 -0.777778 -0.944444
+-0.722222 -0.888889 -0.777778 -0.888889 -0.777778 -0.944444 -0.722222 -0.888889 -0.777778 -0.944444 -0.722222 -0.944444
+-0.666667 -0.888889 -0.722222 -0.888889 -0.722222 -0.944444 -0.666667 -0.888889 -0.722222 -0.944444 -0.666667 -0.944444
+-0.611111 -0.888889 -0.666667 -0.888889 -0.666667 -0.944444 -0.611111 -0.888889 -0.666667 -0.944444 -0.611111 -0.944444
+-0.555556 -0.888889 -0.611111 -0.888889 -0.611111 -0.944444 -0.555556 -0.888889 -0.611111 -0.944444 -0.555556 -0.944444
+-0.500000 -0.888889 -0.555556 -0.888889 -0.555556 -0.944444 -0.500000 -0.888889 -0.555556 -0.944444 -0.500000 -0.944444
+-0.444444 -0.888889 -0.500000 -0.888889 -0.500000 -0.944444 -0.444444 -0.888889 -0.500000 -0.944444 -0.444444 -0.944444
+-0.388889 -0.888889 -0.444444 -0.888889 -0.444444 -0.944444 -0.388889 -0.888889 -0.444444 -0.944444 -0.388889 -0.944444
+-0.333333 -0.888889 -0.388889 -0.888889 -0.388889 -0.944444 -0.333333 -0.888889 -0.388889 -0.944444 -0.333333 -0.944444
+-0.277778 -0.888889 -0.333333 -0.888889 -0.333333 -0.944444 -0.277778 -0.888889 -0.333333 -0.944444 -0.277778 -0.944444
+-0.222222 -0.888889 -0.277778 -0.888889 -0.277778 -0.944444 -0.222222 -0.888889 -0.277778 -0.944444 -0.222222 -0.944444
+-0.166667 -0.888889 -0.222222 -0.888889 -0.222222 -0.944444 -0.166667 -0.888889 -0.222222 -0.944444 -0.166667 -0.944444
+-0.111111 -0.888889 -0.166667 -0.888889 -0.166667 -0.944444 -0.111111 -0.888889 -0.166667 -0.944444 -0.111111 -0.944444
+-0.055556 -0.888889 -0.111111 -0.888889 -0.111111 -0.944444 -0.055556 -0.888889 -0.111111 -0.944444 -0.055556 -0.944444
+ 0.000000 -0.888889 -0.055556 -0.888889 -0.055556 -0.944444  0.000000 -0.888889 -0.055556 -0.944444  0.000000 -0.944444
+ 0.055556 -0.888889  0.000000 -0.888889  0.000000 -0.944444  0.055556 -0.888889  0.000000 -0.944444  0.055556 -0.944444
+ 0.111111 -0.888889  0.055556 -0.888889  0.055556 -0.944444  0.111111 -0.888889  0.055556 -0.944444  0.111111 -0.944444
+ 0.166667 -0.888889  0.111111 -0.888889  0.111111 -0.944444  0.166667 -0.888889  0.111111 -0.944444  0.166667 -0.944444
+ 0.222222 -0.888889  0.166667 -0.888889  0.166667 -0.944444  0.222222 -0.888889  0.166667 -0.944444  0.222222 -0.944444
+ 0.277778 -0.888889  0.222222 -0.888889  0.222222 -0.944444  0.277778 -0.888889  0.222222 -0.944444  0.277778 -0.944444
+ 0.333333 -0.888889  0.277778 -0.888889  0.277778 -0.944444  0.333333 -0.888889  0.277778 -0.944444  0.333333 -0.944444
+ 0.388889 -0.888889  0.333333 -0.888889  0.333333 -0.944444  0.388889 -0.888889  0.333333 -0.944444  0.388889 -0.944444
+ 0.444444 -0.888889  0.388889 -0.888889  0.388889 -0.944444  0.444444 -0.888889  0.388889 -0.944444  0.444444 -0.944444
+ 0.500000 -0.888889  0.444444 -0.888889  0.444444 -0.944444  0.500000 -0.888889  0.444444 -0.944444  0.500000 -0.944444
+ 0.555556 -0.888889  0.500000 -0.888889  0.500000 -0.944444  0.555556 -0.888889  0.500000 -0.944444  0.555556 -0.944444
+ 0.611111 -0.888889  0.555556 -0.888889  0.555556 -0.944444  0.611111 -0.888889  0.555556 -0.944444  0.611111 -0.944444
+ 0.666667 -0.888889  0.611111 -0.888889  0.611111 -0.944444  0.666667 -0.888889  0.611111 -0.944444  0.666667 -0.944444
+ 0.722222 -0.888889  0.666667 -0.888889  0.666667 -0.944444  0.722222 -0.888889  0.666667 -0.944444  0.722222 -0.944444
+ 0.777778 -0.888889  0.722222 -0.888889  0.722222 -0.944444  0.777778 -0.888889  0.722222 -0.944444  0.777778 -0.944444
+ 0.833333 -0.888889  0.777778 -0.888889  0.777778 -0.944444  0.833333 -0.888889  0.777778 -0.944444  0.833333 -0.944444
+ 0.888889 -0.888889  0.833333 -0.888889  0.833333 -0.944444  0.888889 -0.888889  0.833333 -0.944444  0.888889 -0.944444
+ 0.944444 -0.888889  0.888889 -0.888889  0.888889 -0.944444  0.944444 -0.888889  0.888889 -0.944444  0.944444 -0.944444
+ 1.000000 -0.888889  0.944444 -0.888889  0.944444 -0.944444  1.000000 -0.888889  0.944444 -0.944444  1.000000 -0.944444
+-0.944444 -0.833333 -1.000000 -0.833333 -1.000000 -0.888889 -0.944444 -0.833333 -1.000000 -0.888889 -0.944444 -0.888889
+-0.888889 -0.833333 -0.944444 -0.833333 -0.944444 -0.888889 -0.888889 -0.833333 -0.944444 -0.888889 -0.888889 -0.888889
+-0.833333 -0.833333 -0.888889 -0.833333 -0.888889 -0.888889 -0.833333 -0.833333 -0.888889 -0.888889 -0.833333 -0.888889
+-0.777778 -0.833333 -0.833333 -0.833333 -0.833333 -0.888889 -0.777778 -0.833333 -0.833333 -0.888889 -0.777778 -0.888889
+-0.722222 -0.833333 -0.777778 -0.833333 -0.777778 -0.888889 -0.722222 -0.833333 -0.777778 -0.888889 -0.722222 -0.888889
+-0.666667 -0.833333 -0.722222 -0.833333 -0.722222 -0.888889 -0.666667 -0.833333 -0.722222 -0.888889 -0.666667 -0.888889
+-0.611111 -0.833333 -0.666667 -0.833333 -0.666667 -0.888889 -0.611111 -0.833333 -0.666667 -0.888889 -0.611111 -0.888889
+-0.555556 -0.833333 -0.611111 -0.833333 -0.611111 -0.888889 -0.555556 -0.833333 -0.611111 -0.888889 -0.555556 -0.888889
+-0.500000 -0.833333 -0.555556 -0.833333 -0.555556 -0.888889 -0.500000 -0.833333 -0.555556 -0.888889 -0.500000 -0.888889
+-0.444444 -0.833333 -0.500000 -0.833333 -0.500000 -0.888889 -0.444444 -0.833333 -0.500000 -0.888889 -0.444444 -0.888889
+-0.388889 -0.833333 -0.444444 -0.833333 -0.444444 -0.888889 -0.388889 -0.833333 -0.444444 -0.888889 -0.388889 -0.888889
+-0.333333 -0.833333 -0.388889 -0.833333 -0.388889 -0.888889 -0.333333 -0.833333 -0.388889 -0.888889 -0.333333 -0.888889
+-0.277778 -0.833333 -0.333333 -0.833333 -0.333333 -0.888889 -0.277778 -0.833333 -0.333333 -0.888889 -0.277778 -0.888889
+-0.222222 -0.833333 -0.277778 -0.833333 -0.277778 -0.888889 -0.222222 -0.833333 -0.277778 -0.888889 -0.222222 -0.888889
+-0.166667 -0.833333 -0.222222 -0.833333 -0.222222 -0.888889 -0.166667 -0.833333 -0.222222 -0.888889 -0.166667 -0.888889
+-0.111111 -0.833333 -0.166667 -0.833333 -0.166667 -0.888889 -0.111111 -0.833333 -0.166667 -0.888889 -0.111111 -0.888889
+-0.055556 -0.833333 -0.111111 -0.833333 -0.111111 -0.888889 -0.055556 -0.833333 -0.111111 -0.888889 -0.055556 -0.888889
+ 0.000000 -0.833333 -0.055556 -0.833333 -0.055556 -0.888889  0.000000 -0.833333 -0.055556 -0.888889  0.000000 -0.888889
+ 0.055556 -0.833333  0.000000 -0.833333  0.000000 -0.888889  0.055556 -0.833333  0.000000 -0.888889  0.055556 -0.888889
+ 0.111111 -0.833333  0.055556 -0.833333  0.055556 -0.888889  0.111111 -0.833333  0.055556 -0.888889  0.111111 -0.888889
+ 0.166667 -0.833333  0.111111 -0.833333  0.111111 -0.888889  0.166667 -0.833333  0.111111 -0.888889  0.166667 -0.888889
+ 0.222222 -0.833333  0.166667 -0.833333  0.166667 -0.888889  0.222222 -0.833333  0.166667 -0.888889  0.222222 -0.888889
+ 0.277778 -0.833333  0.222222 -0.833333  0.222222 -0.888889  0.277778 -0.833333  0.222222 -0.888889  0.277778 -0.888889
+ 0.333333 -0.833333  0.277778 -0.833333  0.277778 -0.888889  0.333333 -0.833333  0.277778 -0.888889  0.333333 -0.888889
+ 0.388889 -0.833333  0.333333 -0.833333  0.333333 -0.888889  0.388889 -0.833333  0.333333 -0.888889  0.388889 -0.888889
+ 0.444444 -0.833333  0.388889 -0.833333  0.388889 -0.888889  0.444444 -0.833333  0.388889 -0.888889  0.444444 -0.888889
+ 0.500000 -0.833333  0.444444 -0.833333  0.444444 -0.888889  0.500000 -0.833333  0.444444 -0.888889  0.500000 -0.888889
+ 0.555556 -0.833333  0.500000 -0.833333  0.500000 -0.888889  0.555556 -0.833333  0.500000 -0.888889  0.555556 -0.888889
+ 0.611111 -0.833333  0.555556 -0.833333  0.555556 -0.888889  0.611111 -0.833333  0.555556 -0.888889  0.611111 -0.888889
+ 0.666667 -0.833333  0.611111 -0.833333  0.611111 -0.888889  0.666667 -0.833333  0.611111 -0.888889  0.666667 -0.888889
+ 0.722222 -0.833333  0.666667 -0.833333  0.666667 -0.888889  0.722222 -0.833333  0.666667 -0.888889  0.722222 -0.888889
+ 0.777778 -0.833333  0.722222 -0.833333  0.722222 -0.888889  0.777778 -0.833333  0.722222 -0.888889  0.777778 -0.888889
+ 0.833333 -0.833333  0.777778 -0.833333  0.777778 -0.888889  0.833333 -0.833333  0.777778 -0.888889  0.833333 -0.888889
+ 0.888889 -0.833333  0.833333 -0.833333  0.833333 -0.888889  0.888889 -0.833333  0.833333 -0.888889  0.888889 -0.888889
+ 0.944444 -0.833333  0.888889 -0.833333  0.888889 -0.888889  0.944444 -0.833333  0.888889 -0.888889  0.944444 -0.888889
+ 1.000000 -0.833333  0.944444 -0.833333  0.944444 -0.888889  1.000000 -0.833333  0.944444 -0.888889  1.000000 -0.888889
+-0.944444 -0.777778 -1.000000 -0.777778 -1.000000 -0.833333 -0.944444 -0.777778 -1.000000 -0.833333 -0.944444 -0.833333
+-0.888889 -0.777778 -0.944444 -0.777778 -0.944444 -0.833333 -0.888889 -0.777778 -0.944444 -0.833333 -0.888889 -0.833333
+-0.833333 -0.777778 -0.888889 -0.777778 -0.888889 -0.833333 -0.833333 -0.777778 -0.888889 -0.833333 -0.833333 -0.833333
+-0.777778 -0.777778 -0.833333 -0.777778 -0.833333 -0.833333 -0.777778 -0.777778 -0.833333 -0.833333 -0.777778 -0.833333
+-0.722222 -0.777778 -0.777778 -0.777778 -0.777778 -0.833333 -0.722222 -0.777778 -0.777778 -0.833333 -0.722222 -0.833333
+-0.666667 -0.777778 -0.722222 -0.777778 -0.722222 -0.833333 -0.666667 -0.777778 -0.722222 -0.833333 -0.666667 -0.833333
+-0.611111 -0.777778 -0.666667 -0.777778 -0.666667 -0.833333 -0.611111 -0.777778 -0.666667 -0.833333 -0.611111 -0.833333
+-0.555556 -0.777778 -0.611111 -0.777778 -0.611111 -0.833333 -0.555556 -0.777778 -0.611111 -0.833333 -0.555556 -0.833333
+-0.500000 -0.777778 -0.555556 -0.777778 -0.555556 -0.833333 -0.500000 -0.777778 -0.555556 -0.833333 -0.500000 -0.833333
+-0.444444 -0.777778 -0.500000 -0.777778 -0.500000 -0.833333 -0.444444 -0.777778 -0.500000 -0.833333 -0.444444 -0.833333
+-0.388889 -0.777778 -0.444444 -0.777778 -0.444444 -0.833333 -0.388889 -0.777778 -0.444444 -0.833333 -0.388889 -0.833333
+-0.333333 -0.777778 -0.388889 -0.777778 -0.388889 -0.833333 -0.333333 -0.777778 -0.388889 -0.833333 -0.333333 -0.833333
+-0.277778 -0.777778 -0.333333 -0.777778 -0.333333 -0.833333 -0.277778 -0.777778 -0.333333 -0.833333 -0.277778 -0.833333
+-0.222222 -0.777778 -0.277778 -0.777778 -0.277778 -0.833333 -0.222222 -0.777778 -0.277778 -0.833333 -0.222222 -0.833333
+-0.166667 -0.777778 -0.222222 -0.777778 -0.222222 -0.833333 -0.166667 -0.777778 -0.222222 -0.833333 -0.166667 -0.833333
+-0.111111 -0.777778 -0.166667 -0.777778 -0.166667 -0.833333 -0.111111 -0.777778 -0.166667 -0.833333 -0.111111 -0.833333
+-0.055556 -0.777778 -0.111111 -0.777778 -0.111111 -0.833333 -0.055556 -0.777778 -0.111111 -0.833333 -0.055556 -0.833333
+ 0.000000 -0.777778 -0.055556 -0.777778 -0.055556 -0.833333  0.000000 -0.777778 -0.055556 -0.833333  0.000000 -0.833333
+ 0.055556 -0.777778  0.000000 -0.777778  0.000000 -0.833333  0.055556 -0.777778  0.000000 -0.833333  0.055556 -0.833333
+ 0.111111 -0.777778  0.055556 -0.777778  0.055556 -0.833333  0.111111 -0.777778  0.055556 -0.833333  0.111111 -0.833333
+ 0.166667 -0.777778  0.111111 -0.777778  0.111111 -0.833333  0.166667 -0.777778  0.111111 -0.833333  0.166667 -0.833333
+ 0.222222 -0.777778  0.166667 -0.777778  0.166667 -0.833333  0.222222 -0.777778  0.166667 -0.833333  0.222222 -0.833333
+ 0.277778 -0.777778  0.222222 -0.777778  0.222222 -0.833333  0.277778 -0.777778  0.222222 -0.833333  0.277778 -0.833333
+ 0.333333 -0.777778  0.277778 -0.777778  0.277778 -0.833333  0.333333 -0.777778  0.277778 -0.833333  0.333333 -0.833333
+ 0.388889 -0.777778  0.333333 -0.777778  0.333333 -0.833333  0.388889 -0.777778  0.333333 -0.833333  0.388889 -0.833333
+ 0.444444 -0.777778  0.388889 -0.777778  0.388889 -0.833333  0.444444 -0.777778  0.388889 -0.833333  0.444444 -0.833333
+ 0.500000 -0.777778  0.444444 -0.777778  0.444444 -0.833333  0.500000 -0.777778  0.444444 -0.833333  0.500000 -0.833333
+ 0.555556 -0.777778  0.500000 -0.777778  0.500000 -0.833333  0.555556 -0.777778  0.500000 -0.833333  0.555556 -0.833333
+ 0.611111 -0.777778  0.555556 -0.777778  0.555556 -0.833333  0.611111 -0.777778  0.555556 -0.833333  0.611111 -0.833333
+ 0.666667 -0.777778  0.611111 -0.777778  0.611111 -0.833333  0.666667 -0.777778  0.611111 -0.833333  0.666667 -0.833333
+ 0.722222 -0.777778  0.666667 -0.777778  0.666667 -0.833333  0.722222 -0.777778  0.666667 -0.833333  0.722222 -0.833333
+ 0.777778 -0.777778  0.722222 -0.777778  0.722222 -0.833333  0.777778 -0.777778  0.722222 -0.833333  0.777778 -0.833333
+ 0.833333 -0.777778  0.777778 -0.777778  0.777778 -0.833333  0.833333 -0.777778  0.777778 -0.833333  0.833333 -0.833333
+ 0.888889 -0.777778  0.833333 -0.777778  0.833333 -0.833333  0.888889 -0.777778  0.833333 -0.833333  0.888889 -0.833333
+ 0.944444 -0.777778  0.888889 -0.777778  0.888889 -0.833333  0.944444 -0.777778  0.888889 -0.833333  0.944444 -0.833333
+ 1.000000 -0.777778  0.944444 -0.777778  0.944444 -0.833333  1.000000 -0.777778  0.944444 -0.833333  1.000000 -0.833333
+-0.944444 -0.722222 -1.000000 -0.722222 -1.000000 -0.777778 -0.944444 -0.722222 -1.000000 -0.777778 -0.944444 -0.777778
+-0.888889 -0.722222 -0.944444 -0.722222 -0.944444 -0.777778 -0.888889 -0.722222 -0.944444 -0.777778 -0.888889 -0.777778
+-0.833333 -0.722222 -0.888889 -0.722222 -0.888889 -0.777778 -0.833333 -0.722222 -0.888889 -0.777778 -0.833333 -0.777778
+-0.777778 -0.722222 -0.833333 -0.722222 -0.833333 -0.777778 -0.777778 -0.722222 -0.833333 -0.777778 -0.777778 -0.777778
+-0.722222 -0.722222 -0.777778 -0.722222 -0.777778 -0.777778 -0.722222 -0.722222 -0.777778 -0.777778 -0.722222 -0.777778
+-0.666667 -0.722222 -0.722222 -0.722222 -0.722222 -0.777778 -0.666667 -0.722222 -0.722222 -0.777778 -0.666667 -0.777778
+-0.611111 -0.722222 -0.666667 -0.722222 -0.666667 -0.777778 -0.611111 -0.722222 -0.666667 -0.777778 -0.611111 -0.777778
+-0.555556 -0.722222 -0.611111 -0.722222 -0.611111 -0.777778 -0.555556 -0.722222 -0.611111 -0.777778 -0.555556 -0.777778
+-0.500000 -0.722222 -0.555556 -0.722222 -0.555556 -0.777778 -0.500000 -0.722222 -0.555556 -0.777778 -0.500000 -0.777778
+-0.444444 -0.722222 -0.500000 -0.722222 -0.500000 -0.777778 -0.444444 -0.722222 -0.500000 -0.777778 -0.444444 -0.777778
+-0.388889 -0.722222 -0.444444 -0.722222 -0.444444 -0.777778 -0.388889 -0.722222 -0.444444 -0.777778 -0.388889 -0.777778
+-0.333333 -0.722222 -0.388889 -0.722222 -0.388889 -0.777778 -0.333333 -0.722222 -0.388889 -0.777778 -0.333333 -0.777778
+-0.277778 -0.722222 -0.333333 -0.722222 -0.333333 -0.777778 -0.277778 -0.722222 -0.333333 -0.777778 -0.277778 -0.777778
+-0.222222 -0.722222 -0.277778 -0.722222 -0.277778 -0.777778 -0.222222 -0.722222 -0.277778 -0.777778 -0.222222 -0.777778
+-0.166667 -0.722222 -0.222222 -0.722222 -0.222222 -0.777778 -0.166667 -0.722222 -0.222222 -0.777778 -0.166667 -0.777778
+-0.111111 -0.722222 -0.166667 -0.722222 -0.166667 -0.777778 -0.111111 -0.722222 -0.166667 -0.777778 -0.111111 -0.777778
+-0.055556 -0.722222 -0.111111 -0.722222 -0.111111 -0.777778 -0.055556 -0.722222 -0.111111 -0.777778 -0.055556 -0.777778
+ 0.000000 -0.722222 -0.055556 -0.722222 -0.055556 -0.777778  0.000000 -0.722222 -0.055556 -0.777778  0.000000 -0.777778
+ 0.055556 -0.722222  0.000000 -0.722222  0.000000 -0.777778  0.055556 -0.722222  0.000000 -0.777778  0.055556 -0.777778
+ 0.111111 -0.722222  0.055556 -0.722222  0.055556 -0.777778  0.111111 -0.722222  0.055556 -0.777778  0.111111 -0.777778
+ 0.166667 -0.722222  0.111111 -0.722222  0.111111 -0.777778  0.166667 -0.722222  0.111111 -0.777778  0.166667 -0.777778
+ 0.222222 -0.722222  0.166667 -0.722222  0.166667 -0.777778  0.222222 -0.722222  0.166667 -0.777778  0.222222 -0.777778
+ 0.277778 -0.722222  0.222222 -0.722222  0.222222 -0.777778  0.277778 -0.722222  0.222222 -0.777778  0.277778 -0.777778
+ 0.333333 -0.722222  0.277778 -0.722222  0.277778 -0.777778  0.333333 -0.722222  0.277778 -0.777778  0.333333 -0.777778
+ 0.388889 -0.722222  0.333333 -0.722222  0.333333 -0.777778  0.388889 -0.722222  0.333333 -0.777778  0.388889 -0.777778
+ 0.444444 -0.722222  0.388889 -0.722222  0.388889 -0.777778  0.444444 -0.722222  0.388889 -0.777778  0.444444 -0.777778
+ 0.500000 -0.722222  0.444444 -0.722222  0.444444 -0.777778  0.500000 -0.722222  0.444444 -0.777778  0.500000 -0.777778
+ 0.555556 -0.722222  0.500000 -0.722222  0.500000 -0.777778  0.555556 -0.722222  0.500000 -0.777778  0.555556 -0.777778
+ 0.611111 -0.722222  0.555556 -0.722222  0.555556 -0.777778  0.611111 -0.722222  0.555556 -0.777778  0.611111 -0.777778
+ 0.666667 -0.722222  0.611111 -0.722222  0.611111 -0.777778  0.666667 -0.722222  0.611111 -0.777778  0.666667 -0.777778
+ 0.722222 -0.722222  0.666667 -0.722222  0.666667 -0.777778  0.722222 -0.722222  0.666667 -0.777778  0.722222 -0.777778
+ 0.777778 -0.722222  0.722222 -0.722222  0.722222 -0.777778  0.777778 -0.722222  0.722222 -0.777778  0.777778 -0.777778
+ 0.833333 -0.722222  0.777778 -0.722222  0.777778 -0.777778  0.833333 -0.722222  0.777778 -0.777778  0.833333 -0.777778
+ 0.888889 -0.722222  0.833333 -0.722222  0.833333 -0.777778  0.888889 -0.722222  0.833333 -0.777778  0.888889 -0.777778
+ 0.944444 -0.722222  0.888889 -0.722222  0.888889 -0.777778  0.944444 -0.722222  0.888889 -0.777778  0.944444 -0.777778
+ 1.000000 -0.722222  0.944444 -0.722222  0.944444 -0.777778  1.000000 -0.722222  0.944444 -0.777778  1.000000 -0.777778
+-0.944444 -0.666667 -1.000000 -0.666667 -1.000000 -0.722222 -0.944444 -0.666667 -1.000000 -0.722222 -0.944444 -0.722222
+-0.888889 -0.666667 -0.944444 -0.666667 -0.944444 -0.722222 -0.888889 -0.666667 -0.944444 -0.722222 -0.888889 -0.722222
+-0.833333 -0.666667 -0.888889 -0.666667 -0.888889 -0.722222 -0.833333 -0.666667 -0.888889 -0.722222 -0.833333 -0.722222
+-0.777778 -0.666667 -0.833333 -0.666667 -0.833333 -0.722222 -0.777778 -0.666667 -0.833333 -0.722222 -0.777778 -0.722222
+-0.722222 -0.666667 -0.777778 -0.666667 -0.777778 -0.722222 -0.722222 -0.666667 -0.777778 -0.722222 -0.722222 -0.722222
+-0.666667 -0.666667 -0.722222 -0.666667 -0.722222 -0.722222 -0.666667 -0.666667 -0.722222 -0.722222 -0.666667 -0.722222
+-0.611111 -0.666667 -0.666667 -0.666667 -0.666667 -0.722222 -0.611111 -0.666667 -0.666667 -0.722222 -0.611111 -0.722222
+-0.555556 -0.666667 -0.611111 -0.666667 -0.611111 -0.722222 -0.555556 -0.666667 -0.611111 -0.722222 -0.555556 -0.722222
+-0.500000 -0.666667 -0.555556 -0.666667 -0.555556 -0.722222 -0.500000 -0.666667 -0.555556 -0.722222 -0.500000 -0.722222
+-0.444444 -0.666667 -0.500000 -0.666667 -0.500000 -0.722222 -0.444444 -0.666667 -0.500000 -0.722222 -0.444444 -0.722222
+-0.388889 -0.666667 -0.444444 -0.666667 -0.444444 -0.722222 -0.388889 -0.666667 -0.444444 -0.722222 -0.388889 -0.722222
+-0.333333 -0.666667 -0.388889 -0.666667 -0.388889 -0.722222 -0.333333 -0.666667 -0.388889 -0.722222 -0.333333 -0.722222
+-0.277778 -0.666667 -0.333333 -0.666667 -0.333333 -0.722222 -0.277778 -0.666667 -0.333333 -0.722222 -0.277778 -0.722222
+-0.222222 -0.666667 -0.277778 -0.666667 -0.277778 -0.722222 -0.222222 -0.666667 -0.277778 -0.722222 -0.222222 -0.722222
+-0.166667 -0.666667 -0.222222 -0.666667 -0.222222 -0.722222 -0.166667 -0.666667 -0.222222 -0.722222 -0.166667 -0.722222
+-0.111111 -0.666667 -0.166667 -0.666667 -0.166667 -0.722222 -0.111111 -0.666667 -0.166667 -0.722222 -0.111111 -0.722222
+-0.055556 -0.666667 -0.111111 -0.666667 -0.111111 -0.722222 -0.055556 -0.666667 -0.111111 -0.722222 -0.055556 -0.722222
+ 0.000000 -0.666667 -0.055556 -0.666667 -0.055556 -0.722222  0.000000 -0.666667 -0.055556 -0.722222  0.000000 -0.722222
+ 0.055556 -0.666667  0.000000 -0.666667  0.000000 -0.722222  0.055556 -0.666667  0.000000 -0.722222  0.055556 -0.722222
+ 0.111111 -0.666667  0.055556 -0.666667  0.055556 -0.722222  0.111111 -0.666667  0.055556 -0.722222  0.111111 -0.722222
+ 0.166667 -0.666667  0.111111 -0.666667  0.111111 -0.722222  0.166667 -0.666667  0.111111 -0.722222  0.166667 -0.722222
+ 0.222222 -0.666667  0.166667 -0.666667  0.166667 -0.722222  0.222222 -0.666667  0.166667 -0.722222  0.222222 -0.722222
+ 0.277778 -0.666667  0.222222 -0.666667  0.222222 -0.722222  0.277778 -0.666667  0.222222 -0.722222  0.277778 -0.722222
+ 0.333333 -0.666667  0.277778 -0.666667  0.277778 -0.722222  0.333333 -0.666667  0.277778 -0.722222  0.333333 -0.722222
+ 0.388889 -0.666667  0.333333 -0.666667  0.333333 -0.722222  0.388889 -0.666667  0.333333 -0.722222  0.388889 -0.722222
+ 0.444444 -0.666667  0.388889 -0.666667  0.388889 -0.722222  0.444444 -0.666667  0.388889 -0.722222  0.444444 -0.722222
+ 0.500000 -0.666667  0.444444 -0.666667  0.444444 -0.722222  0.500000 -0.666667  0.444444 -0.722222  0.500000 -0.722222
+ 0.555556 -0.666667  0.500000 -0.666667  0.500000 -0.722222  0.555556 -0.666667  0.500000 -0.722222  0.555556 -0.722222
+ 0.611111 -0.666667  0.555556 -0.666667  0.555556 -0.722222  0.611111 -0.666667  0.555556 -0.722222  0.611111 -0.722222
+ 0.666667 -0.666667  0.611111 -0.666667  0.611111 -0.722222  0.666667 -0.666667  0.611111 -0.722222  0.666667 -0.722222
+ 0.722222 -0.666667  0.666667 -0.666667  0.666667 -0.722222  0.722222 -0.666667  0.666667 -0.722222  0.722222 -0.722222
+ 0.777778 -0.666667  0.722222 -0.666667  0.722222 -0.722222  0.777778 -0.666667  0.722222 -0.722222  0.777778 -0.722222
+ 0.833333 -0.666667  0.777778 -0.666667  0.777778 -0.722222  0.833333 -0.666667  0.777778 -0.722222  0.833333 -0.722222
+ 0.888889 -0.666667  0.833333 -0.666667  0.833333 -0.722222  0.888889 -0.666667  0.833333 -0.722222  0.888889 -0.722222
+ 0.944444 -0.666667  0.888889 -0.666667  0.888889 -0.722222  0.944444 -0.666667  0.888889 -0.722222  0.944444 -0.722222
+ 1.000000 -0.666667  0.944444 -0.666667  0.944444 -0.722222  1.000000 -0.666667  0.944444 -0.722222  1.000000 -0.722222
+-0.944444 -0.611111 -1.000000 -0.611111 -1.000000 -0.666667 -0.944444 -0.611111 -1.000000 -0.666667 -0.944444 -0.666667
+-0.888889 -0.611111 -0.944444 -0.611111 -0.944444 -0.666667 -0.888889 -0.611111 -0.944444 -0.666667 -0.888889 -0.666667
+-0.833333 -0.611111 -0.888889 -0.611111 -0.888889 -0.666667 -0.833333 -0.611111 -0.888889 -0.666667 -0.833333 -0.666667
+-0.777778 -0.611111 -0.833333 -0.611111 -0.833333 -0.666667 -0.777778 -0.611111 -0.833333 -0.666667 -0.777778 -0.666667
+-0.722222 -0.611111 -0.777778 -0.611111 -0.777778 -0.666667 -0.722222 -0.611111 -0.777778 -0.666667 -0.722222 -0.666667
+-0.666667 -0.611111 -0.722222 -0.611111 -0.722222 -0.666667 -0.666667 -0.611111 -0.722222 -0.666667 -0.666667 -0.666667
+-0.611111 -0.611111 -0.666667 -0.611111 -0.666667 -0.666667 -0.611111 -0.611111 -0.666667 -0.666667 -0.611111 -0.666667
+-0.555556 -0.611111 -0.611111 -0.611111 -0.611111 -0.666667 -0.555556 -0.611111 -0.611111 -0.666667 -0.555556 -0.666667
+-0.500000 -0.611111 -0.555556 -0.611111 -0.555556 -0.666667 -0.500000 -0.611111 -0.555556 -0.666667 -0.500000 -0.666667
+-0.444444 -0.611111 -0.500000 -0.611111 -0.500000 -0.666667 -0.444444 -0.611111 -0.500000 -0.666667 -0.444444 -0.666667
+-0.388889 -0.611111 -0.444444 -0.611111 -0.444444 -0.666667 -0.388889 -0.611111 -0.444444 -0.666667 -0.388889 -0.666667
+-0.333333 -0.611111 -0.388889 -0.611111 -0.388889 -0.666667 -0.333333 -0.611111 -0.388889 -0.666667 -0.333333 -0.666667
+-0.277778 -0.611111 -0.333333 -0.611111 -0.333333 -0.666667 -0.277778 -0.611111 -0.333333 -0.666667 -0.277778 -0.666667
+-0.222222 -0.611111 -0.277778 -0.611111 -0.277778 -0.666667 -0.222222 -0.611111 -0.277778 -0.666667 -0.222222 -0.666667
+-0.166667 -0.611111 -0.222222 -0.611111 -0.222222 -0.666667 -0.166667 -0.611111 -0.222222 -0.666667 -0.166667 -0.666667
+-0.111111 -0.611111 -0.166667 -0.611111 -0.166667 -0.666667 -0.111111 -0.611111 -0.166667 -0.666667 -0.111111 -0.666667
+-0.055556 -0.611111 -0.111111 -0.611111 -0.111111 -0.666667 -0.055556 -0.611111 -0.111111 -0.666667 -0.055556 -0.666667
+ 0.000000 -0.611111 -0.055556 -0.611111 -0.055556 -0.666667  0.000000 -0.611111 -0.055556 -0.666667  0.000000 -0.666667
+ 0.055556 -0.611111  0.000000 -0.611111  0.000000 -0.666667  0.055556 -0.611111  0.000000 -0.666667  0.055556 -0.666667
+ 0.111111 -0.611111  0.055556 -0.611111  0.055556 -0.666667  0.111111 -0.611111  0.055556 -0.666667  0.111111 -0.666667
+ 0.166667 -0.611111  0.111111 -0.611111  0.111111 -0.666667  0.166667 -0.611111  0.111111 -0.666667  0.166667 -0.666667
+ 0.222222 -0.611111  0.166667 -0.611111  0.166667 -0.666667  0.222222 -0.611111  0.166667 -0.666667  0.222222 -0.666667
+ 0.277778 -0.611111  0.222222 -0.611111  0.222222 -0.666667  0.277778 -0.611111  0.222222 -0.666667  0.277778 -0.666667
+ 0.333333 -0.611111  0.277778 -0.611111  0.277778 -0.666667  0.333333 -0.611111  0.277778 -0.666667  0.333333 -0.666667
+ 0.388889 -0.611111  0.333333 -0.611111  0.333333 -0.666667  0.388889 -0.611111  0.333333 -0.666667  0.388889 -0.666667
+ 0.444444 -0.611111  0.388889 -0.611111  0.388889 -0.666667  0.444444 -0.611111  0.388889 -0.666667  0.444444 -0.666667
+ 0.500000 -0.611111  0.444444 -0.611111  0.444444 -0.666667  0.500000 -0.611111  0.444444 -0.666667  0.500000 -0.666667
+ 0.555556 -0.611111  0.500000 -0.611111  0.500000 -0.666667  0.555556 -0.611111  0.500000 -0.666667  0.555556 -0.666667
+ 0.611111 -0.611111  0.555556 -0.611111  0.555556 -0.666667  0.611111 -0.611111  0.555556 -0.666667  0.611111 -0.666667
+ 0.666667 -0.611111  0.611111 -0.611111  0.611111 -0.666667  0.666667 -0.611111  0.611111 -0.666667  0.666667 -0.666667
+ 0.722222 -0.611111  0.666667 -0.611111  0.666667 -0.666667  0.722222 -0.611111  0.666667 -0.666667  0.722222 -0.666667
+ 0.777778 -0.611111  0.722222 -0.611111  0.722222 -0.666667  0.777778 -0.611111  0.722222 -0.666667  0.777778 -0.666667
+ 0.833333 -0.611111  0.777778 -0.611111  0.777778 -0.666667  0.833333 -0.611111  0.777778 -0.666667  0.833333 -0.666667
+ 0.888889 -0.611111  0.833333 -0.611111  0.833333 -0.666667  0.888889 -0.611111  0.833333 -0.666667  0.888889 -0.666667
+ 0.944444 -0.611111  0.888889 -0.611111  0.888889 -0.666667  0.944444 -0.611111  0.888889 -0.666667  0.944444 -0.666667
+ 1.000000 -0.611111  0.944444 -0.611111  0.944444 -0.666667  1.000000 -0.611111  0.944444 -0.666667  1.000000 -0.666667
+-0.944444 -0.555556 -1.000000 -0.555556 -1.000000 -0.611111 -0.944444 -0.555556 -1.000000 -0.611111 -0.944444 -0.611111
+-0.888889 -0.555556 -0.944444 -0.555556 -0.944444 -0.611111 -0.888889 -0.555556 -0.944444 -0.611111 -0.888889 -0.611111
+-0.833333 -0.555556 -0.888889 -0.555556 -0.888889 -0.611111 -0.833333 -0.555556 -0.888889 -0.611111 -0.833333 -0.611111
+-0.777778 -0.555556 -0.833333 -0.555556 -0.833333 -0.611111 -0.777778 -0.555556 -0.833333 -0.611111 -0.777778 -0.611111
+-0.722222 -0.555556 -0.777778 -0.555556 -0.777778 -0.611111 -0.722222 -0.555556 -0.777778 -0.611111 -0.722222 -0.611111
+-0.666667 -0.555556 -0.722222 -0.555556 -0.722222 -0.611111 -0.666667 -0.555556 -0.722222 -0.611111 -0.666667 -0.611111
+-0.611111 -0.555556 -0.666667 -0.555556 -0.666667 -0.611111 -0.611111 -0.555556 -0.666667 -0.611111 -0.611111 -0.611111
+-0.555556 -0.555556 -0.611111 -0.555556 -0.611111 -0.611111 -0.555556 -0.555556 -0.611111 -0.611111 -0.555556 -0.611111
+-0.500000 -0.555556 -0.555556 -0.555556 -0.555556 -0.611111 -0.500000 -0.555556 -0.555556 -0.611111 -0.500000 -0.611111
+-0.444444 -0.555556 -0.500000 -0.555556 -0.500000 -0.611111 -0.444444 -0.555556 -0.500000 -0.611111 -0.444444 -0.611111
+-0.388889 -0.555556 -0.444444 -0.555556 -0.444444 -0.611111 -0.388889 -0.555556 -0.444444 -0.611111 -0.388889 -0.611111
+-0.333333 -0.555556 -0.388889 -0.555556 -0.388889 -0.611111 -0.333333 -0.555556 -0.388889 -0.611111 -0.333333 -0.611111
+-0.277778 -0.555556 -0.333333 -0.555556 -0.333333 -0.611111 -0.277778 -0.555556 -0.333333 -0.611111 -0.277778 -0.611111
+-0.222222 -0.555556 -0.277778 -0.555556 -0.277778 -0.611111 -0.222222 -0.555556 -0.277778 -0.611111 -0.222222 -0.611111
+-0.166667 -0.555556 -0.222222 -0.555556 -0.222222 -0.611111 -0.166667 -0.555556 -0.222222 -0.611111 -0.166667 -0.611111
+-0.111111 -0.555556 -0.166667 -0.555556 -0.166667 -0.611111 -0.111111 -0.555556 -0.166667 -0.611111 -0.111111 -0.611111
+-0.055556 -0.555556 -0.111111 -0.555556 -0.111111 -0.611111 -0.055556 -0.555556 -0.111111 -0.611111 -0.055556 -0.611111
+ 0.000000 -0.555556 -0.055556 -0.555556 -0.055556 -0.611111  0.000000 -0.555556 -0.055556 -0.611111  0.000000 -0.611111
+ 0.055556 -0.555556  0.000000 -0.555556  0.000000 -0.611111  0.055556 -0.555556  0.000000 -0.611111  0.055556 -0.611111
+ 0.111111 -0.555556  0.055556 -0.555556  0.055556 -0.611111  0.111111 -0.555556  0.055556 -0.611111  0.111111 -0.611111
+ 0.166667 -0.555556  0.111111 -0.555556  0.111111 -0.611111  0.166667 -0.555556  0.111111 -0.611111  0.166667 -0.611111
+ 0.222222 -0.555556  0.166667 -0.555556  0.166667 -0.611111  0.222222 -0.555556  0.166667 -0.611111  0.222222 -0.611111
+ 0.277778 -0.555556  0.222222 -0.555556  0.222222 -0.611111  0.277778 -0.555556  0.222222 -0.611111  0.277778 -0.611111
+ 0.333333 -0.555556  0.277778 -0.555556  0.277778 -0.611111  0.333333 -0.555556  0.277778 -0.611111  0.333333 -0.611111
+ 0.388889 -0.555556  0.333333 -0.555556  0.333333 -0.611111  0.388889 -0.555556  0.333333 -0.611111  0.388889 -0.611111
+ 0.444444 -0.555556  0.388889 -0.555556  0.388889 -0.611111  0.444444 -0.555556  0.388889 -0.611111  0.444444 -0.611111
+ 0.500000 -0.555556  0.444444 -0.555556  0.444444 -0.611111  0.500000 -0.555556  0.444444 -0.611111  0.500000 -0.611111
+ 0.555556 -0.555556  0.500000 -0.555556  0.500000 -0.611111  0.555556 -0.555556  0.500000 -0.611111  0.555556 -0.611111
+ 0.611111 -0.555556  0.555556 -0.555556  0.555556 -0.611111  0.611111 -0.555556  0.555556 -0.611111  0.611111 -0.611111
+ 0.666667 -0.555556  0.611111 -0.555556  0.611111 -0.611111  0.666667 -0.555556  0.611111 -0.611111  0.666667 -0.611111
+ 0.722222 -0.555556  0.666667 -0.555556  0.666667 -0.611111  0.722222 -0.555556  0.666667 -0.611111  0.722222 -0.611111
+ 0.777778 -0.555556  0.722222 -0.555556  0.722222 -0.611111  0.777778 -0.555556  0.722222 -0.611111  0.777778 -0.611111
+ 0.833333 -0.555556  0.777778 -0.555556  0.777778 -0.611111  0.833333 -0.555556  0.777778 -0.611111  0.833333 -0.611111
+ 0.888889 -0.555556  0.833333 -0.555556  0.833333 -0.611111  0.888889 -0.555556  0.833333 -0.611111  0.888889 -0.611111
+ 0.944444 -0.555556  0.888889 -0.555556  0.888889 -0.611111  0.944444 -0.555556  0.888889 -0.611111  0.944444 -0.611111
+ 1.000000 -0.555556  0.944444 -0.555556  0.944444 -0.611111  1.000000 -0.555556  0.944444 -0.611111  1.000000 -0.611111
+-0.944444 -0.500000 -1.000000 -0.500000 -1.000000 -0.555556 -0.944444 -0.500000 -1.000000 -0.555556 -0.944444 -0.555556
+-0.888889 -0.500000 -0.944444 -0.500000 -0.944444 -0.555556 -0.888889 -0.500000 -0.944444 -0.555556 -0.888889 -0.555556
+-0.833333 -0.500000 -0.888889 -0.500000 -0.888889 -0.555556 -0.833333 -0.500000 -0.888889 -0.555556 -0.833333 -0.555556
+-0.777778 -0.500000 -0.833333 -0.500000 -0.833333 -0.555556 -0.777778 -0.500000 -0.833333 -0.555556 -0.777778 -0.555556
+-0.722222 -0.500000 -0.777778 -0.500000 -0.777778 -0.555556 -0.722222 -0.500000 -0.777778 -0.555556 -0.722222 -0.555556
+-0.666667 -0.500000 -0.722222 -0.500000 -0.722222 -0.555556 -0.666667 -0.500000 -0.722222 -0.555556 -0.666667 -0.555556
+-0.611111 -0.500000 -0.666667 -0.500000 -0.666667 -0.555556 -0.611111 -0.500000 -0.666667 -0.555556 -0.611111 -0.555556
+-0.555556 -0.500000 -0.611111 -0.500000 -0.611111 -0.555556 -0.555556 -0.500000 -0.611111 -0.555556 -0.555556 -0.555556
+-0.500000 -0.500000 -0.555556 -0.500000 -0.555556 -0.555556 -0.500000 -0.500000 -0.555556 -0.555556 -0.500000 -0.555556
+-0.444444 -0.500000 -0.500000 -0.500000 -0.500000 -0.555556 -0.444444 -0.500000 -0.500000 -0.555556 -0.444444 -0.555556
+-0.388889 -0.500000 -0.444444 -0.500000 -0.444444 -0.555556 -0.388889 -0.500000 -0.444444 -0.555556 -0.388889 -0.555556
+-0.333333 -0.500000 -0.388889 -0.500000 -0.388889 -0.555556 -0.333333 -0.500000 -0.388889 -0.555556 -0.333333 -0.555556
+-0.277778 -0.500000 -0.333333 -0.500000 -0.333333 -0.555556 -0.277778 -0.500000 -0.333333 -0.555556 -0.277778 -0.555556
+-0.222222 -0.500000 -0.277778 -0.500000 -0.277778 -0.555556 -0.222222 -0.500000 -0.277778 -0.555556 -0.222222 -0.555556
+-0.166667 -0.500000 -0.222222 -0.500000 -0.222222 -0.555556 -0.166667 -0.500000 -0.222222 -0.555556 -0.166667 -0.555556
+-0.111111 -0.500000 -0.166667 -0.500000 -0.166667 -0.555556 -0.111111 -0.500000 -0.166667 -0.555556 -0.111111 -0.555556
+-0.055556 -0.500000 -0.111111 -0.500000 -0.111111 -0.555556 -0.055556 -0.500000 -0.111111 -0.555556 -0.055556 -0.555556
+ 0.000000 -0.500000 -0.055556 -0.500000 -0.055556 -0.555556  0.000000 -0.500000 -0.055556 -0.555556  0.000000 -0.555556
+ 0.055556 -0.500000  0.000000 -0.500000  0.000000 -0.555556  0.055556 -0.500000  0.000000 -0.555556  0.055556 -0.555556
+ 0.111111 -0.500000  0.055556 -0.500000  0.055556 -0.555556  0.111111 -0.500000  0.055556 -0.555556  0.111111 -0.555556
+ 0.166667 -0.500000  0.111111 -0.500000  0.111111 -0.555556  0.166667 -0.500000  0.111111 -0.555556  0.166667 -0.555556
+ 0.222222 -0.500000  0.166667 -0.500000  0.166667 -0.555556  0.222222 -0.500000  0.166667 -0.555556  0.222222 -0.555556
+ 0.277778 -0.500000  0.222222 -0.500000  0.222222 -0.555556  0.277778 -0.500000  0.222222 -0.555556  0.277778 -0.555556
+ 0.333333 -0.500000  0.277778 -0.500000  0.277778 -0.555556  0.333333 -0.500000  0.277778 -0.555556  0.333333 -0.555556
+ 0.388889 -0.500000  0.333333 -0.500000  0.333333 -0.555556  0.388889 -0.500000  0.333333 -0.555556  0.388889 -0.555556
+ 0.444444 -0.500000  0.388889 -0.500000  0.388889 -0.555556  0.444444 -0.500000  0.388889 -0.555556  0.444444 -0.555556
+ 0.500000 -0.500000  0.444444 -0.500000  0.444444 -0.555556  0.500000 -0.500000  0.444444 -0.555556  0.500000 -0.555556
+ 0.555556 -0.500000  0.500000 -0.500000  0.500000 -0.555556  0.555556 -0.500000  0.500000 -0.555556  0.555556 -0.555556
+ 0.611111 -0.500000  0.555556 -0.500000  0.555556 -0.555556  0.611111 -0.500000  0.555556 -0.555556  0.611111 -0.555556
+ 0.666667 -0.500000  0.611111 -0.500000  0.611111 -0.555556  0.666667 -0.500000  0.611111 -0.555556  0.666667 -0.555556
+ 0.722222 -0.500000  0.666667 -0.500000  0.666667 -0.555556  0.722222 -0.500000  0.666667 -0.555556  0.722222 -0.555556
+ 0.777778 -0.500000  0.722222 -0.500000  0.722222 -0.555556  0.777778 -0.500000  0.722222 -0.555556  0.777778 -0.555556
+ 0.833333 -0.500000  0.777778 -0.500000  0.777778 -0.555556  0.833333 -0.500000  0.777778 -0.555556  0.833333 -0.555556
+ 0.888889 -0.500000  0.833333 -0.500000  0.833333 -0.555556  0.888889 -0.500000  0.833333 -0.555556  0.888889 -0.555556
+ 0.944444 -0.500000  0.888889 -0.500000  0.888889 -0.555556  0.944444 -0.500000  0.888889 -0.555556  0.944444 -0.555556
+ 1.000000 -0.500000  0.944444 -0.500000  0.944444 -0.555556  1.000000 -0.500000  0.944444 -0.555556  1.000000 -0.555556
+-0.944444 -0.444444 -1.000000 -0.444444 -1.000000 -0.500000 -0.944444 -0.444444 -1.000000 -0.500000 -0.944444 -0.500000
+-0.888889 -0.444444 -0.944444 -0.444444 -0.944444 -0.500000 -0.888889 -0.444444 -0.944444 -0.500000 -0.888889 -0.500000
+-0.833333 -0.444444 -0.888889 -0.444444 -0.888889 -0.500000 -0.833333 -0.444444 -0.888889 -0.500000 -0.833333 -0.500000
+-0.777778 -0.444444 -0.833333 -0.444444 -0.833333 -0.500000 -0.777778 -0.444444 -0.833333 -0.500000 -0.777778 -0.500000
+-0.722222 -0.444444 -0.777778 -0.444444 -0.777778 -0.500000 -0.722222 -0.444444 -0.777778 -0.500000 -0.722222 -0.500000
+-0.666667 -0.444444 -0.722222 -0.444444 -0.722222 -0.500000 -0.666667 -0.444444 -0.722222 -0.500000 -0.666667 -0.500000
+-0.611111 -0.444444 -0.666667 -0.444444 -0.666667 -0.500000 -0.611111 -0.444444 -0.666667 -0.500000 -0.611111 -0.500000
+-0.555556 -0.444444 -0.611111 -0.444444 -0.611111 -0.500000 -0.555556 -0.444444 -0.611111 -0.500000 -0.555556 -0.500000
+-0.500000 -0.444444 -0.555556 -0.444444 -0.555556 -0.500000 -0.500000 -0.444444 -0.555556 -0.500000 -0.500000 -0.500000
+-0.444444 -0.444444 -0.500000 -0.444444 -0.500000 -0.500000 -0.444444 -0.444444 -0.500000 -0.500000 -0.444444 -0.500000
+-0.388889 -0.444444 -0.444444 -0.444444 -0.444444 -0.500000 -0.388889 -0.444444 -0.444444 -0.500000 -0.388889 -0.500000
+-0.333333 -0.444444 -0.388889 -0.444444 -0.388889 -0.500000 -0.333333 -0.444444 -0.388889 -0.500000 -0.333333 -0.500000
+-0.277778 -0.444444 -0.333333 -0.444444 -0.333333 -0.500000 -0.277778 -0.444444 -0.333333 -0.500000 -0.277778 -0.500000
+-0.222222 -0.444444 -0.277778 -0.444444 -0.277778 -0.500000 -0.222222 -0.444444 -0.277778 -0.500000 -0.222222 -0.500000
+-0.166667 -0.444444 -0.222222 -0.444444 -0.222222 -0.500000 -0.166667 -0.444444 -0.222222 -0.500000 -0.166667 -0.500000
+-0.111111 -0.444444 -0.166667 -0.444444 -0.166667 -0.500000 -0.111111 -0.444444 -0.166667 -0.500000 -0.111111 -0.500000
+-0.055556 -0.444444 -0.111111 -0.444444 -0.111111 -0.500000 -0.055556 -0.444444 -0.111111 -0.500000 -0.055556 -0.500000
+ 0.000000 -0.444444 -0.055556 -0.444444 -0.055556 -0.500000  0.000000 -0.444444 -0.055556 -0.500000  0.000000 -0.500000
+ 0.055556 -0.444444  0.000000 -0.444444  0.000000 -0.500000  0.055556 -0.444444  0.000000 -0.500000  0.055556 -0.500000
+ 0.111111 -0.444444  0.055556 -0.444444  0.055556 -0.500000  0.111111 -0.444444  0.055556 -0.500000  0.111111 -0.500000
+ 0.166667 -0.444444  0.111111 -0.444444  0.111111 -0.500000  0.166667 -0.444444  0.111111 -0.500000  0.166667 -0.500000
+ 0.222222 -0.444444  0.166667 -0.444444  0.166667 -0.500000  0.222222 -0.444444  0.166667 -0.500000  0.222222 -0.500000
+ 0.277778 -0.444444  0.222222 -0.444444  0.222222 -0.500000  0.277778 -0.444444  0.222222 -0.500000  0.277778 -0.500000
+ 0.333333 -0.444444  0.277778 -0.444444  0.277778 -0.500000  0.333333 -0.444444  0.277778 -0.500000  0.333333 -0.500000
+ 0.388889 -0.444444  0.333333 -0.444444  0.333333 -0.500000  0.388889 -0.444444  0.333333 -0.500000  0.388889 -0.500000
+ 0.444444 -0.444444  0.388889 -0.444444  0.388889 -0.500000  0.444444 -0.444444  0.388889 -0.500000  0.444444 -0.500000
+ 0.500000 -0.444444  0.444444 -0.444444  0.444444 -0.500000  0.500000 -0.444444  0.444444 -0.500000  0.500000 -0.500000
+ 0.555556 -0.444444  0.500000 -0.444444  0.500000 -0.500000  0.555556 -0.444444  0.500000 -0.500000  0.555556 -0.500000
+ 0.611111 -0.444444  0.555556 -0.444444  0.555556 -0.500000  0.611111 -0.444444  0.555556 -0.500000  0.611111 -0.500000
+ 0.666667 -0.444444  0.611111 -0.444444  0.611111 -0.500000  0.666667 -0.444444  0.611111 -0.500000  0.666667 -0.500000
+ 0.722222 -0.444444  0.666667 -0.444444  0.666667 -0.500000  0.722222 -0.444444  0.666667 -0.500000  0.722222 -0.500000
+ 0.777778 -0.444444  0.722222 -0.444444  0.722222 -0.500000  0.777778 -0.444444  0.722222 -0.500000  0.777778 -0.500000
+ 0.833333 -0.444444  0.777778 -0.444444  0.777778 -0.500000  0.833333 -0.444444  0.777778 -0.500000  0.833333 -0.500000
+ 0.888889 -0.444444  0.833333 -0.444444  0.833333 -0.500000  0.888889 -0.444444  0.833333 -0.500000  0.888889 -0.500000
+ 0.944444 -0.444444  0.888889 -0.444444  0.888889 -0.500000  0.944444 -0.444444  0.888889 -0.500000  0.944444 -0.500000
+ 1.000000 -0.444444  0.944444 -0.444444  0.944444 -0.500000  1.000000 -0.444444  0.944444 -0.500000  1.000000 -0.500000
+-0.944444 -0.388889 -1.000000 -0.388889 -1.000000 -0.444444 -0.944444 -0.388889 -1.000000 -0.444444 -0.944444 -0.444444
+-0.888889 -0.388889 -0.944444 -0.388889 -0.944444 -0.444444 -0.888889 -0.388889 -0.944444 -0.444444 -0.888889 -0.444444
+-0.833333 -0.388889 -0.888889 -0.388889 -0.888889 -0.444444 -0.833333 -0.388889 -0.888889 -0.444444 -0.833333 -0.444444
+-0.777778 -0.388889 -0.833333 -0.388889 -0.833333 -0.444444 -0.777778 -0.388889 -0.833333 -0.444444 -0.777778 -0.444444
+-0.722222 -0.388889 -0.777778 -0.388889 -0.777778 -0.444444 -0.722222 -0.388889 -0.777778 -0.444444 -0.722222 -0.444444
+-0.666667 -0.388889 -0.722222 -0.388889 -0.722222 -0.444444 -0.666667 -0.388889 -0.722222 -0.444444 -0.666667 -0.444444
+-0.611111 -0.388889 -0.666667 -0.388889 -0.666667 -0.444444 -0.611111 -0.388889 -0.666667 -0.444444 -0.611111 -0.444444
+-0.555556 -0.388889 -0.611111 -0.388889 -0.611111 -0.444444 -0.555556 -0.388889 -0.611111 -0.444444 -0.555556 -0.444444
+-0.500000 -0.388889 -0.555556 -0.388889 -0.555556 -0.444444 -0.500000 -0.388889 -0.555556 -0.444444 -0.500000 -0.444444
+-0.444444 -0.388889 -0.500000 -0.388889 -0.500000 -0.444444 -0.444444 -0.388889 -0.500000 -0.444444 -0.444444 -0.444444
+-0.388889 -0.388889 -0.444444 -0.388889 -0.444444 -0.444444 -0.388889 -0.388889 -0.444444 -0.444444 -0.388889 -0.444444
+-0.333333 -0.388889 -0.388889 -0.388889 -0.388889 -0.444444 -0.333333 -0.388889 -0.388889 -0.444444 -0.333333 -0.444444
+-0.277778 -0.388889 -0.333333 -0.388889 -0.333333 -0.444444 -0.277778 -0.388889 -0.333333 -0.444444 -0.277778 -0.444444
+-0.222222 -0.388889 -0.277778 -0.388889 -0.277778 -0.444444 -0.222222 -0.388889 -0.277778 -0.444444 -0.222222 -0.444444
+-0.166667 -0.388889 -0.222222 -0.388889 -0.222222 -0.444444 -0.166667 -0.388889 -0.222222 -0.444444 -0.166667 -0.444444
+-0.111111 -0.388889 -0.166667 -0.388889 -0.166667 -0.444444 -0.111111 -0.388889 -0.166667 -0.444444 -0.111111 -0.444444
+-0.055556 -0.388889 -0.111111 -0.388889 -0.111111 -0.444444 -0.055556 -0.388889 -0.111111 -0.444444 -0.055556 -0.444444
+ 0.000000 -0.388889 -0.055556 -0.388889 -0.055556 -0.444444  0.000000 -0.388889 -0.055556 -0.444444  0.000000 -0.444444
+ 0.055556 -0.388889  0.000000 -0.388889  0.000000 -0.444444  0.055556 -0.388889  0.000000 -0.444444  0.055556 -0.444444
+ 0.111111 -0.388889  0.055556 -0.388889  0.055556 -0.444444  0.111111 -0.388889  0.055556 -0.444444  0.111111 -0.444444
+ 0.166667 -0.388889  0.111111 -0.388889  0.111111 -0.444444  0.166667 -0.388889  0.111111 -0.444444  0.166667 -0.444444
+ 0.222222 -0.388889  0.166667 -0.388889  0.166667 -0.444444  0.222222 -0.388889  0.166667 -0.444444  0.222222 -0.444444
+ 0.277778 -0.388889  0.222222 -0.388889  0.222222 -0.444444  0.277778 -0.388889  0.222222 -0.444444  0.277778 -0.444444
+ 0.333333 -0.388889  0.277778 -0.388889  0.277778 -0.444444  0.333333 -0.388889  0.277778 -0.444444  0.333333 -0.444444
+ 0.388889 -0.388889  0.333333 -0.388889  0.333333 -0.444444  0.388889 -0.388889  0.333333 -0.444444  0.388889 -0.444444
+ 0.444444 -0.388889  0.388889 -0.388889  0.388889 -0.444444  0.444444 -0.388889  0.388889 -0.444444  0.444444 -0.444444
+ 0.500000 -0.388889  0.444444 -0.388889  0.444444 -0.444444  0.500000 -0.388889  0.444444 -0.444444  0.500000 -0.444444
+ 0.555556 -0.388889  0.500000 -0.388889  0.500000 -0.444444  0.555556 -0.388889  0.500000 -0.444444  0.555556 -0.444444
+ 0.611111 -0.388889  0.555556 -0.388889  0.555556 -0.444444  0.611111 -0.388889  0.555556 -0.444444  0.611111 -0.444444
+ 0.666667 -0.388889  0.611111 -0.388889  0.611111 -0.444444  0.666667 -0.388889  0.611111 -0.444444  0.666667 -0.444444
+ 0.722222 -0.388889  0.666667 -0.388889  0.666667 -0.444444  0.722222 -0.388889  0.666667 -0.444444  0.722222 -0.444444
+ 0.777778 -0.388889  0.722222 -0.388889  0.722222 -0.444444  0.777778 -0.388889  0.722222 -0.444444  0.777778 -0.444444
+ 0.833333 -0.388889  0.777778 -0.388889  0.777778 -0.444444  0.833333 -0.388889  0.777778 -0.444444  0.833333 -0.444444
+ 0.888889 -0.388889  0.833333 -0.388889  0.833333 -0.444444  0.888889 -0.388889  0.833333 -0.444444  0.888889 -0.444444
+ 0.944444 -0.388889  0.888889 -0.388889  0.888889 -0.444444  0.944444 -0.388889  0.888889 -0.444444  0.944444 -0.444444
+ 1.000000 -0.388889  0.944444 -0.388889  0.944444 -0.444444  1.000000 -0.388889  0.944444 -0.444444  1.000000 -0.444444
+-0.944444 -0.333333 -1.000000 -0.333333 -1.000000 -0.388889 -0.944444 -0.333333 -1.000000 -0.388889 -0.944444 -0.388889
+-0.888889 -0.333333 -0.944444 -0.333333 -0.944444 -0.388889 -0.888889 -0.333333 -0.944444 -0.388889 -0.888889 -0.388889
+-0.833333 -0.333333 -0.888889 -0.333333 -0.888889 -0.388889 -0.833333 -0.333333 -0.888889 -0.388889 -0.833333 -0.388889
+-0.777778 -0.333333 -0.833333 -0.333333 -0.833333 -0.388889 -0.777778 -0.333333 -0.833333 -0.388889 -0.777778 -0.388889
+-0.722222 -0.333333 -0.777778 -0.333333 -0.777778 -0.388889 -0.722222 -0.333333 -0.777778 -0.388889 -0.722222 -0.388889
+-0.666667 -0.333333 -0.722222 -0.333333 -0.722222 -0.388889 -0.666667 -0.333333 -0.722222 -0.388889 -0.666667 -0.388889
+-0.611111 -0.333333 -0.666667 -0.333333 -0.666667 -0.388889 -0.611111 -0.333333 -0.666667 -0.388889 -0.611111 -0.388889
+-0.555556 -0.333333 -0.611111 -0.333333 -0.611111 -0.388889 -0.555556 -0.333333 -0.611111 -0.388889 -0.555556 -0.388889
+-0.500000 -0.333333 -0.555556 -0.333333 -0.555556 -0.388889 -0.500000 -0.333333 -0.555556 -0.388889 -0.500000 -0.388889
+-0.444444 -0.333333 -0.500000 -0.333333 -0.500000 -0.388889 -0.444444 -0.333333 -0.500000 -0.388889 -0.444444 -0.388889
+-0.388889 -0.333333 -0.444444 -0.333333 -0.444444 -0.388889 -0.388889 -0.333333 -0.444444 -0.388889 -0.388889 -0.388889
+-0.333333 -0.333333 -0.388889 -0.333333 -0.388889 -0.388889 -0.333333 -0.333333 -0.388889 -0.388889 -0.333333 -0.388889
+-0.277778 -0.333333 -0.333333 -0.333333 -0.333333 -0.388889 -0.277778 -0.333333 -0.333333 -0.388889 -0.277778 -0.388889
+-0.222222 -0.333333 -0.277778 -0.333333 -0.277778 -0.388889 -0.222222 -0.333333 -0.277778 -0.388889 -0.222222 -0.388889
+-0.166667 -0.333333 -0.222222 -0.333333 -0.222222 -0.388889 -0.166667 -0.333333 -0.222222 -0.388889 -0.166667 -0.388889
+-0.111111 -0.333333 -0.166667 -0.333333 -0.166667 -0.388889 -0.111111 -0.333333 -0.166667 -0.388889 -0.111111 -0.388889
+-0.055556 -0.333333 -0.111111 -0.333333 -0.111111 -0.388889 -0.055556 -0.333333 -0.111111 -0.388889 -0.055556 -0.388889
+ 0.000000 -0.333333 -0.055556 -0.333333 -0.055556 -0.388889  0.000000 -0.333333 -0.055556 -0.388889  0.000000 -0.388889
+ 0.055556 -0.333333  0.000000 -0.333333  0.000000 -0.388889  0.055556 -0.333333  0.000000 -0.388889  0.055556 -0.388889
+ 0.111111 -0.333333  0.055556 -0.333333  0.055556 -0.388889  0.111111 -0.333333  0.055556 -0.388889  0.111111 -0.388889
+ 0.166667 -0.333333  0.111111 -0.333333  0.111111 -0.388889  0.166667 -0.333333  0.111111 -0.388889  0.166667 -0.388889
+ 0.222222 -0.333333  0.166667 -0.333333  0.166667 -0.388889  0.222222 -0.333333  0.166667 -0.388889  0.222222 -0.388889
+ 0.277778 -0.333333  0.222222 -0.333333  0.222222 -0.388889  0.277778 -0.333333  0.222222 -0.388889  0.277778 -0.388889
+ 0.333333 -0.333333  0.277778 -0.333333  0.277778 -0.388889  0.333333 -0.333333  0.277778 -0.388889  0.333333 -0.388889
+ 0.388889 -0.333333  0.333333 -0.333333  0.333333 -0.388889  0.388889 -0.333333  0.333333 -0.388889  0.388889 -0.388889
+ 0.444444 -0.333333  0.388889 -0.333333  0.388889 -0.388889  0.444444 -0.333333  0.388889 -0.388889  0.444444 -0.388889
+ 0.500000 -0.333333  0.444444 -0.333333  0.444444 -0.388889  0.500000 -0.333333  0.444444 -0.388889  0.500000 -0.388889
+ 0.555556 -0.333333  0.500000 -0.333333  0.500000 -0.388889  0.555556 -0.333333  0.500000 -0.388889  0.555556 -0.388889
+ 0.611111 -0.333333  0.555556 -0.333333  0.555556 -0.388889  0.611111 -0.333333  0.555556 -0.388889  0.611111 -0.388889
+ 0.666667 -0.333333  0.611111 -0.333333  0.611111 -0.388889  0.666667 -0.333333  0.611111 -0.388889  0.666667 -0.388889
+ 0.722222 -0.333333  0.666667 -0.333333  0.666667 -0.388889  0.722222 -0.333333  0.666667 -0.388889  0.722222 -0.388889
+ 0.777778 -0.333333  0.722222 -0.333333  0.722222 -0.388889  0.777778 -0.333333  0.722222 -0.388889  0.777778 -0.388889
+ 0.833333 -0.333333  0.777778 -0.333333  0.777778 -0.388889  0.833333 -0.333333  0.777778 -0.388889  0.833333 -0.388889
+ 0.888889 -0.333333  0.833333 -0.333333  0.833333 -0.388889  0.888889 -0.333333  0.833333 -0.388889  0.888889 -0.388889
+ 0.944444 -0.333333  0.888889 -0.333333  0.888889 -0.388889  0.944444 -0.333333  0.888889 -0.388889  0.944444 -0.388889
+ 1.000000 -0.333333  0.944444 -0.333333  0.944444 -0.388889  1.000000 -0.333333  0.944444 -0.388889  1.000000 -0.388889
+-0.944444 -0.277778 -1.000000 -0.277778 -1.000000 -0.333333 -0.944444 -0.277778 -1.000000 -0.333333 -0.944444 -0.333333
+-0.888889 -0.277778 -0.944444 -0.277778 -0.944444 -0.333333 -0.888889 -0.277778 -0.944444 -0.333333 -0.888889 -0.333333
+-0.833333 -0.277778 -0.888889 -0.277778 -0.888889 -0.333333 -0.833333 -0.277778 -0.888889 -0.333333 -0.833333 -0.333333
+-0.777778 -0.277778 -0.833333 -0.277778 -0.833333 -0.333333 -0.777778 -0.277778 -0.833333 -0.333333 -0.777778 -0.333333
+-0.722222 -0.277778 -0.777778 -0.277778 -0.777778 -0.333333 -0.722222 -0.277778 -0.777778 -0.333333 -0.722222 -0.333333
+-0.666667 -0.277778 -0.722222 -0.277778 -0.722222 -0.333333 -0.666667 -0.277778 -0.722222 -0.333333 -0.666667 -0.333333
+-0.611111 -0.277778 -0.666667 -0.277778 -0.666667 -0.333333 -0.611111 -0.277778 -0.666667 -0.333333 -0.611111 -0.333333
+-0.555556 -0.277778 -0.611111 -0.277778 -0.611111 -0.333333 -0.555556 -0.277778 -0.611111 -0.333333 -0.555556 -0.333333
+-0.500000 -0.277778 -0.555556 -0.277778 -0.555556 -0.333333 -0.500000 -0.277778 -0.555556 -0.333333 -0.500000 -0.333333
+-0.444444 -0.277778 -0.500000 -0.277778 -0.500000 -0.333333 -0.444444 -0.277778 -0.500000 -0.333333 -0.444444 -0.333333
+-0.388889 -0.277778 -0.444444 -0.277778 -0.444444 -0.333333 -0.388889 -0.277778 -0.444444 -0.333333 -0.388889 -0.333333
+-0.333333 -0.277778 -0.388889 -0.277778 -0.388889 -0.333333 -0.333333 -0.277778 -0.388889 -0.333333 -0.333333 -0.333333
+-0.277778 -0.277778 -0.333333 -0.277778 -0.333333 -0.333333 -0.277778 -0.277778 -0.333333 -0.333333 -0.277778 -0.333333
+-0.222222 -0.277778 -0.277778 -0.277778 -0.277778 -0.333333 -0.222222 -0.277778 -0.277778 -0.333333 -0.222222 -0.333333
+-0.166667 -0.277778 -0.222222 -0.277778 -0.222222 -0.333333 -0.166667 -0.277778 -0.222222 -0.333333 -0.166667 -0.333333
+-0.111111 -0.277778 -0.166667 -0.277778 -0.166667 -0.333333 -0.111111 -0.277778 -0.166667 -0.333333 -0.111111 -0.333333
+-0.055556 -0.277778 -0.111111 -0.277778 -0.111111 -0.333333 -0.055556 -0.277778 -0.111111 -0.333333 -0.055556 -0.333333
+ 0.000000 -0.277778 -0.055556 -0.277778 -0.055556 -0.333333  0.000000 -0.277778 -0.055556 -0.333333  0.000000 -0.333333
+ 0.055556 -0.277778  0.000000 -0.277778  0.000000 -0.333333  0.055556 -0.277778  0.000000 -0.333333  0.055556 -0.333333
+ 0.111111 -0.277778  0.055556 -0.277778  0.055556 -0.333333  0.111111 -0.277778  0.055556 -0.333333  0.111111 -0.333333
+ 0.166667 -0.277778  0.111111 -0.277778  0.111111 -0.333333  0.166667 -0.277778  0.111111 -0.333333  0.166667 -0.333333
+ 0.222222 -0.277778  0.166667 -0.277778  0.166667 -0.333333  0.222222 -0.277778  0.166667 -0.333333  0.222222 -0.333333
+ 0.277778 -0.277778  0.222222 -0.277778  0.222222 -0.333333  0.277778 -0.277778  0.222222 -0.333333  0.277778 -0.333333
+ 0.333333 -0.277778  0.277778 -0.277778  0.277778 -0.333333  0.333333 -0.277778  0.277778 -0.333333  0.333333 -0.333333
+ 0.388889 -0.277778  0.333333 -0.277778  0.333333 -0.333333  0.388889 -0.277778  0.333333 -0.333333  0.388889 -0.333333
+ 0.444444 -0.277778  0.388889 -0.277778  0.388889 -0.333333  0.444444 -0.277778  0.388889 -0.333333  0.444444 -0.333333
+ 0.500000 -0.277778  0.444444 -0.277778  0.444444 -0.333333  0.500000 -0.277778  0.444444 -0.333333  0.500000 -0.333333
+ 0.555556 -0.277778  0.500000 -0.277778  0.500000 -0.333333  0.555556 -0.277778  0.500000 -0.333333  0.555556 -0.333333
+ 0.611111 -0.277778  0.555556 -0.277778  0.555556 -0.333333  0.611111 -0.277778  0.555556 -0.333333  0.611111 -0.333333
+ 0.666667 -0.277778  0.611111 -0.277778  0.611111 -0.333333  0.666667 -0.277778  0.611111 -0.333333  0.666667 -0.333333
+ 0.722222 -0.277778  0.666667 -0.277778  0.666667 -0.333333  0.722222 -0.277778  0.666667 -0.333333  0.722222 -0.333333
+ 0.777778 -0.277778  0.722222 -0.277778  0.722222 -0.333333  0.777778 -0.277778  0.722222 -0.333333  0.777778 -0.333333
+ 0.833333 -0.277778  0.777778 -0.277778  0.777778 -0.333333  0.833333 -0.277778  0.777778 -0.333333  0.833333 -0.333333
+ 0.888889 -0.277778  0.833333 -0.277778  0.833333 -0.333333  0.888889 -0.277778  0.833333 -0.333333  0.888889 -0.333333
+ 0.944444 -0.277778  0.888889 -0.277778  0.888889 -0.333333  0.944444 -0.277778  0.888889 -0.333333  0.944444 -0.333333
+ 1.000000 -0.277778  0.944444 -0.277778  0.944444 -0.333333  1.000000 -0.277778  0.944444 -0.333333  1.000000 -0.333333
+-0.944444 -0.222222 -1.000000 -0.222222 -1.000000 -0.277778 -0.944444 -0.222222 -1.000000 -0.277778 -0.944444 -0.277778
+-0.888889 -0.222222 -0.944444 -0.222222 -0.944444 -0.277778 -0.888889 -0.222222 -0.944444 -0.277778 -0.888889 -0.277778
+-0.833333 -0.222222 -0.888889 -0.222222 -0.888889 -0.277778 -0.833333 -0.222222 -0.888889 -0.277778 -0.833333 -0.277778
+-0.777778 -0.222222 -0.833333 -0.222222 -0.833333 -0.277778 -0.777778 -0.222222 -0.833333 -0.277778 -0.777778 -0.277778
+-0.722222 -0.222222 -0.777778 -0.222222 -0.777778 -0.277778 -0.722222 -0.222222 -0.777778 -0.277778 -0.722222 -0.277778
+-0.666667 -0.222222 -0.722222 -0.222222 -0.722222 -0.277778 -0.666667 -0.222222 -0.722222 -0.277778 -0.666667 -0.277778
+-0.611111 -0.222222 -0.666667 -0.222222 -0.666667 -0.277778 -0.611111 -0.222222 -0.666667 -0.277778 -0.611111 -0.277778
+-0.555556 -0.222222 -0.611111 -0.222222 -0.611111 -0.277778 -0.555556 -0.222222 -0.611111 -0.277778 -0.555556 -0.277778
+-0.500000 -0.222222 -0.555556 -0.222222 -0.555556 -0.277778 -0.500000 -0.222222 -0.555556 -0.277778 -0.500000 -0.277778
+-0.444444 -0.222222 -0.500000 -0.222222 -0.500000 -0.277778 -0.444444 -0.222222 -0.500000 -0.277778 -0.444444 -0.277778
+-0.388889 -0.222222 -0.444444 -0.222222 -0.444444 -0.277778 -0.388889 -0.222222 -0.444444 -0.277778 -0.388889 -0.277778
+-0.333333 -0.222222 -0.388889 -0.222222 -0.388889 -0.277778 -0.333333 -0.222222 -0.388889 -0.277778 -0.333333 -0.277778
+-0.277778 -0.222222 -0.333333 -0.222222 -0.333333 -0.277778 -0.277778 -0.222222 -0.333333 -0.277778 -0.277778 -0.277778
+-0.222222 -0.222222 -0.277778 -0.222222 -0.277778 -0.277778 -0.222222 -0.222222 -0.277778 -0.277778 -0.222222 -0.277778
+-0.166667 -0.222222 -0.222222 -0.222222 -0.222222 -0.277778 -0.166667 -0.222222 -0.222222 -0.277778 -0.166667 -0.277778
+-0.111111 -0.222222 -0.166667 -0.222222 -0.166667 -0.277778 -0.111111 -0.222222 -0.166667 -0.277778 -0.111111 -0.277778
+-0.055556 -0.222222 -0.111111 -0.222222 -0.111111 -0.277778 -0.055556 -0.222222 -0.111111 -0.277778 -0.055556 -0.277778
+ 0.000000 -0.222222 -0.055556 -0.222222 -0.055556 -0.277778  0.000000 -0.222222 -0.055556 -0.277778  0.000000 -0.277778
+ 0.055556 -0.222222  0.000000 -0.222222  0.000000 -0.277778  0.055556 -0.222222  0.000000 -0.277778  0.055556 -0.277778
+ 0.111111 -0.222222  0.055556 -0.222222  0.055556 -0.277778  0.111111 -0.222222  0.055556 -0.277778  0.111111 -0.277778
+ 0.166667 -0.222222  0.111111 -0.222222  0.111111 -0.277778  0.166667 -0.222222  0.111111 -0.277778  0.166667 -0.277778
+ 0.222222 -0.222222  0.166667 -0.222222  0.166667 -0.277778  0.222222 -0.222222  0.166667 -0.277778  0.222222 -0.277778
+ 0.277778 -0.222222  0.222222 -0.222222  0.222222 -0.277778  0.277778 -0.222222  0.222222 -0.277778  0.277778 -0.277778
+ 0.333333 -0.222222  0.277778 -0.222222  0.277778 -0.277778  0.333333 -0.222222  0.277778 -0.277778  0.333333 -0.277778
+ 0.388889 -0.222222  0.333333 -0.222222  0.333333 -0.277778  0.388889 -0.222222  0.333333 -0.277778  0.388889 -0.277778
+ 0.444444 -0.222222  0.388889 -0.222222  0.388889 -0.277778  0.444444 -0.222222  0.388889 -0.277778  0.444444 -0.277778
+ 0.500000 -0.222222  0.444444 -0.222222  0.444444 -0.277778  0.500000 -0.222222  0.444444 -0.277778  0.500000 -0.277778
+ 0.555556 -0.222222  0.500000 -0.222222  0.500000 -0.277778  0.555556 -0.222222  0.500000 -0.277778  0.555556 -0.277778
+ 0.611111 -0.222222  0.555556 -0.222222  0.555556 -0.277778  0.611111 -0.222222  0.555556 -0.277778  0.611111 -0.277778
+ 0.666667 -0.222222  0.611111 -0.222222  0.611111 -0.277778  0.666667 -0.222222  0.611111 -0.277778  0.666667 -0.277778
+ 0.722222 -0.222222  0.666667 -0.222222  0.666667 -0.277778  0.722222 -0.222222  0.666667 -0.277778  0.722222 -0.277778
+ 0.777778 -0.222222  0.722222 -0.222222  0.722222 -0.277778  0.777778 -0.222222  0.722222 -0.277778  0.777778 -0.277778
+ 0.833333 -0.222222  0.777778 -0.222222  0.777778 -0.277778  0.833333 -0.222222  0.777778 -0.277778  0.833333 -0.277778
+ 0.888889 -0.222222  0.833333 -0.222222  0.833333 -0.277778  0.888889 -0.222222  0.833333 -0.277778  0.888889 -0.277778
+ 0.944444 -0.222222  0.888889 -0.222222  0.888889 -0.277778  0.944444 -0.222222  0.888889 -0.277778  0.944444 -0.277778
+ 1.000000 -0.222222  0.944444 -0.222222  0.944444 -0.277778  1.000000 -0.222222  0.944444 -0.277778  1.000000 -0.277778
+-0.944444 -0.166667 -1.000000 -0.166667 -1.000000 -0.222222 -0.944444 -0.166667 -1.000000 -0.222222 -0.944444 -0.222222
+-0.888889 -0.166667 -0.944444 -0.166667 -0.944444 -0.222222 -0.888889 -0.166667 -0.944444 -0.222222 -0.888889 -0.222222
+-0.833333 -0.166667 -0.888889 -0.166667 -0.888889 -0.222222 -0.833333 -0.166667 -0.888889 -0.222222 -0.833333 -0.222222
+-0.777778 -0.166667 -0.833333 -0.166667 -0.833333 -0.222222 -0.777778 -0.166667 -0.833333 -0.222222 -0.777778 -0.222222
+-0.722222 -0.166667 -0.777778 -0.166667 -0.777778 -0.222222 -0.722222 -0.166667 -0.777778 -0.222222 -0.722222 -0.222222
+-0.666667 -0.166667 -0.722222 -0.166667 -0.722222 -0.222222 -0.666667 -0.166667 -0.722222 -0.222222 -0.666667 -0.222222
+-0.611111 -0.166667 -0.666667 -0.166667 -0.666667 -0.222222 -0.611111 -0.166667 -0.666667 -0.222222 -0.611111 -0.222222
+-0.555556 -0.166667 -0.611111 -0.166667 -0.611111 -0.222222 -0.555556 -0.166667 -0.611111 -0.222222 -0.555556 -0.222222
+-0.500000 -0.166667 -0.555556 -0.166667 -0.555556 -0.222222 -0.500000 -0.166667 -0.555556 -0.222222 -0.500000 -0.222222
+-0.444444 -0.166667 -0.500000 -0.166667 -0.500000 -0.222222 -0.444444 -0.166667 -0.500000 -0.222222 -0.444444 -0.222222
+-0.388889 -0.166667 -0.444444 -0.166667 -0.444444 -0.222222 -0.388889 -0.166667 -0.444444 -0.222222 -0.388889 -0.222222
+-0.333333 -0.166667 -0.388889 -0.166667 -0.388889 -0.222222 -0.333333 -0.166667 -0.388889 -0.222222 -0.333333 -0.222222
+-0.277778 -0.166667 -0.333333 -0.166667 -0.333333 -0.222222 -0.277778 -0.166667 -0.333333 -0.222222 -0.277778 -0.222222
+-0.222222 -0.166667 -0.277778 -0.166667 -0.277778 -0.222222 -0.222222 -0.166667 -0.277778 -0.222222 -0.222222 -0.222222
+-0.166667 -0.166667 -0.222222 -0.166667 -0.222222 -0.222222 -0.166667 -0.166667 -0.222222 -0.222222 -0.166667 -0.222222
+-0.111111 -0.166667 -0.166667 -0.166667 -0.166667 -0.222222 -0.111111 -0.166667 -0.166667 -0.222222 -0.111111 -0.222222
+-0.055556 -0.166667 -0.111111 -0.166667 -0.111111 -0.222222 -0.055556 -0.166667 -0.111111 -0.222222 -0.055556 -0.222222
+ 0.000000 -0.166667 -0.055556 -0.166667 -0.055556 -0.222222  0.000000 -0.166667 -0.055556 -0.222222  0.000000 -0.222222
+ 0.055556 -0.166667  0.000000 -0.166667  0.000000 -0.222222  0.055556 -0.166667  0.000000 -0.222222  0.055556 -0.222222
+ 0.111111 -0.166667  0.055556 -0.166667  0.055556 -0.222222  0.111111 -0.166667  0.055556 -0.222222  0.111111 -0.222222
+ 0.166667 -0.166667  0.111111 -0.166667  0.111111 -0.222222  0.166667 -0.166667  0.111111 -0.222222  0.166667 -0.222222
+ 0.222222 -0.166667  0.166667 -0.166667  0.166667 -0.222222  0.222222 -0.166667  0.166667 -0.222222  0.222222 -0.222222
+ 0.277778 -0.166667  0.222222 -0.166667  0.222222 -0.222222  0.277778 -0.166667  0.222222 -0.222222  0.277778 -0.222222
+ 0.333333 -0.166667  0.277778 -0.166667  0.277778 -0.222222  0.333333 -0.166667  0.277778 -0.222222  0.333333 -0.222222
+ 0.388889 -0.166667  0.333333 -0.166667  0.333333 -0.222222  0.388889 -0.166667  0.333333 -0.222222  0.388889 -0.222222
+ 0.444444 -0.166667  0.388889 -0.166667  0.388889 -0.222222  0.444444 -0.166667  0.388889 -0.222222  0.444444 -0.222222
+ 0.500000 -0.166667  0.444444 -0.166667  0.444444 -0.222222  0.500000 -0.166667  0.444444 -0.222222  0.500000 -0.222222
+ 0.555556 -0.166667  0.500000 -0.166667  0.500000 -0.222222  0.555556 -0.166667  0.500000 -0.222222  0.555556 -0.222222
+ 0.611111 -0.166667  0.555556 -0.166667  0.555556 -0.222222  0.611111 -0.166667  0.555556 -0.222222  0.611111 -0.222222
+ 0.666667 -0.166667  0.611111 -0.166667  0.611111 -0.222222  0.666667 -0.166667  0.611111 -0.222222  0.666667 -0.222222
+ 0.722222 -0.166667  0.666667 -0.166667  0.666667 -0.222222  0.722222 -0.166667  0.666667 -0.222222  0.722222 -0.222222
+ 0.777778 -0.166667  0.722222 -0.166667  0.722222 -0.222222  0.777778 -0.166667  0.722222 -0.222222  0.777778 -0.222222
+ 0.833333 -0.166667  0.777778 -0.166667  0.777778 -0.222222  0.833333 -0.166667  0.777778 -0.222222  0.833333 -0.222222
+ 0.888889 -0.166667  0.833333 -0.166667  0.833333 -0.222222  0.888889 -0.166667  0.833333 -0.222222  0.888889 -0.222222
+ 0.944444 -0.166667  0.888889 -0.166667  0.888889 -0.222222  0.944444 -0.166667  0.888889 -0.222222  0.944444 -0.222222
+ 1.000000 -0.166667  0.944444 -0.166667  0.944444 -0.222222  1.000000 -0.166667  0.944444 -0.222222  1.000000 -0.222222
+-0.944444 -0.111111 -1.000000 -0.111111 -1.000000 -0.166667 -0.944444 -0.111111 -1.000000 -0.166667 -0.944444 -0.166667
+-0.888889 -0.111111 -0.944444 -0.111111 -0.944444 -0.166667 -0.888889 -0.111111 -0.944444 -0.166667 -0.888889 -0.166667
+-0.833333 -0.111111 -0.888889 -0.111111 -0.888889 -0.166667 -0.833333 -0.111111 -0.888889 -0.166667 -0.833333 -0.166667
+-0.777778 -0.111111 -0.833333 -0.111111 -0.833333 -0.166667 -0.777778 -0.111111 -0.833333 -0.166667 -0.777778 -0.166667
+-0.722222 -0.111111 -0.777778 -0.111111 -0.777778 -0.166667 -0.722222 -0.111111 -0.777778 -0.166667 -0.722222 -0.166667
+-0.666667 -0.111111 -0.722222 -0.111111 -0.722222 -0.166667 -0.666667 -0.111111 -0.722222 -0.166667 -0.666667 -0.166667
+-0.611111 -0.111111 -0.666667 -0.111111 -0.666667 -0.166667 -0.611111 -0.111111 -0.666667 -0.166667 -0.611111 -0.166667
+-0.555556 -0.111111 -0.611111 -0.111111 -0.611111 -0.166667 -0.555556 -0.111111 -0.611111 -0.166667 -0.555556 -0.166667
+-0.500000 -0.111111 -0.555556 -0.111111 -0.555556 -0.166667 -0.500000 -0.111111 -0.555556 -0.166667 -0.500000 -0.166667
+-0.444444 -0.111111 -0.500000 -0.111111 -0.500000 -0.166667 -0.444444 -0.111111 -0.500000 -0.166667 -0.444444 -0.166667
+-0.388889 -0.111111 -0.444444 -0.111111 -0.444444 -0.166667 -0.388889 -0.111111 -0.444444 -0.166667 -0.388889 -0.166667
+-0.333333 -0.111111 -0.388889 -0.111111 -0.388889 -0.166667 -0.333333 -0.111111 -0.388889 -0.166667 -0.333333 -0.166667
+-0.277778 -0.111111 -0.333333 -0.111111 -0.333333 -0.166667 -0.277778 -0.111111 -0.333333 -0.166667 -0.277778 -0.166667
+-0.222222 -0.111111 -0.277778 -0.111111 -0.277778 -0.166667 -0.222222 -0.111111 -0.277778 -0.166667 -0.222222 -0.166667
+-0.166667 -0.111111 -0.222222 -0.111111 -0.222222 -0.166667 -0.166667 -0.111111 -0.222222 -0.166667 -0.166667 -0.166667
+-0.111111 -0.111111 -0.166667 -0.111111 -0.166667 -0.166667 -0.111111 -0.111111 -0.166667 -0.166667 -0.111111 -0.166667
+-0.055556 -0.111111 -0.111111 -0.111111 -0.111111 -0.166667 -0.055556 -0.111111 -0.111111 -0.166667 -0.055556 -0.166667
+ 0.000000 -0.111111 -0.055556 -0.111111 -0.055556 -0.166667  0.000000 -0.111111 -0.055556 -0.166667  0.000000 -0.166667
+ 0.055556 -0.111111  0.000000 -0.111111  0.000000 -0.166667  0.055556 -0.111111  0.000000 -0.166667  0.055556 -0.166667
+ 0.111111 -0.111111  0.055556 -0.111111  0.055556 -0.166667  0.111111 -0.111111  0.055556 -0.166667  0.111111 -0.166667
+ 0.166667 -0.111111  0.111111 -0.111111  0.111111 -0.166667  0.166667 -0.111111  0.111111 -0.166667  0.166667 -0.166667
+ 0.222222 -0.111111  0.166667 -0.111111  0.166667 -0.166667  0.222222 -0.111111  0.166667 -0.166667  0.222222 -0.166667
+ 0.277778 -0.111111  0.222222 -0.111111  0.222222 -0.166667  0.277778 -0.111111  0.222222 -0.166667  0.277778 -0.166667
+ 0.333333 -0.111111  0.277778 -0.111111  0.277778 -0.166667  0.333333 -0.111111  0.277778 -0.166667  0.333333 -0.166667
+ 0.388889 -0.111111  0.333333 -0.111111  0.333333 -0.166667  0.388889 -0.111111  0.333333 -0.166667  0.388889 -0.166667
+ 0.444444 -0.111111  0.388889 -0.111111  0.388889 -0.166667  0.444444 -0.111111  0.388889 -0.166667  0.444444 -0.166667
+ 0.500000 -0.111111  0.444444 -0.111111  0.444444 -0.166667  0.500000 -0.111111  0.444444 -0.166667  0.500000 -0.166667
+ 0.555556 -0.111111  0.500000 -0.111111  0.500000 -0.166667  0.555556 -0.111111  0.500000 -0.166667  0.555556 -0.166667
+ 0.611111 -0.111111  0.555556 -0.111111  0.555556 -0.166667  0.611111 -0.111111  0.555556 -0.166667  0.611111 -0.166667
+ 0.666667 -0.111111  0.611111 -0.111111  0.611111 -0.166667  0.666667 -0.111111  0.611111 -0.166667  0.666667 -0.166667
+ 0.722222 -0.111111  0.666667 -0.111111  0.666667 -0.166667  0.722222 -0.111111  0.666667 -0.166667  0.722222 -0.166667
+ 0.777778 -0.111111  0.722222 -0.111111  0.722222 -0.166667  0.777778 -0.111111  0.722222 -0.166667  0.777778 -0.166667
+ 0.833333 -0.111111  0.777778 -0.111111  0.777778 -0.166667  0.833333 -0.111111  0.777778 -0.166667  0.833333 -0.166667
+ 0.888889 -0.111111  0.833333 -0.111111  0.833333 -0.166667  0.888889 -0.111111  0.833333 -0.166667  0.888889 -0.166667
+ 0.944444 -0.111111  0.888889 -0.111111  0.888889 -0.166667  0.944444 -0.111111  0.888889 -0.166667  0.944444 -0.166667
+ 1.000000 -0.111111  0.944444 -0.111111  0.944444 -0.166667  1.000000 -0.111111  0.944444 -0.166667  1.000000 -0.166667
+-0.944444 -0.055556 -1.000000 -0.055556 -1.000000 -0.111111 -0.944444 -0.055556 -1.000000 -0.111111 -0.944444 -0.111111
+-0.888889 -0.055556 -0.944444 -0.055556 -0.944444 -0.111111 -0.888889 -0.055556 -0.944444 -0.111111 -0.888889 -0.111111
+-0.833333 -0.055556 -0.888889 -0.055556 -0.888889 -0.111111 -0.833333 -0.055556 -0.888889 -0.111111 -0.833333 -0.111111
+-0.777778 -0.055556 -0.833333 -0.055556 -0.833333 -0.111111 -0.777778 -0.055556 -0.833333 -0.111111 -0.777778 -0.111111
+-0.722222 -0.055556 -0.777778 -0.055556 -0.777778 -0.111111 -0.722222 -0.055556 -0.777778 -0.111111 -0.722222 -0.111111
+-0.666667 -0.055556 -0.722222 -0.055556 -0.722222 -0.111111 -0.666667 -0.055556 -0.722222 -0.111111 -0.666667 -0.111111
+-0.611111 -0.055556 -0.666667 -0.055556 -0.666667 -0.111111 -0.611111 -0.055556 -0.666667 -0.111111 -0.611111 -0.111111
+-0.555556 -0.055556 -0.611111 -0.055556 -0.611111 -0.111111 -0.555556 -0.055556 -0.611111 -0.111111 -0.555556 -0.111111
+-0.500000 -0.055556 -0.555556 -0.055556 -0.555556 -0.111111 -0.500000 -0.055556 -0.555556 -0.111111 -0.500000 -0.111111
+-0.444444 -0.055556 -0.500000 -0.055556 -0.500000 -0.111111 -0.444444 -0.055556 -0.500000 -0.111111 -0.444444 -0.111111
+-0.388889 -0.055556 -0.444444 -0.055556 -0.444444 -0.111111 -0.388889 -0.055556 -0.444444 -0.111111 -0.388889 -0.111111
+-0.333333 -0.055556 -0.388889 -0.055556 -0.388889 -0.111111 -0.333333 -0.055556 -0.388889 -0.111111 -0.333333 -0.111111
+-0.277778 -0.055556 -0.333333 -0.055556 -0.333333 -0.111111 -0.277778 -0.055556 -0.333333 -0.111111 -0.277778 -0.111111
+-0.222222 -0.055556 -0.277778 -0.055556 -0.277778 -0.111111 -0.222222 -0.055556 -0.277778 -0.111111 -0.222222 -0.111111
+-0.166667 -0.055556 -0.222222 -0.055556 -0.222222 -0.111111 -0.166667 -0.055556 -0.222222 -0.111111 -0.166667 -0.111111
+-0.111111 -0.055556 -0.166667 -0.055556 -0.166667 -0.111111 -0.111111 -0.055556 -0.166667 -0.111111 -0.111111 -0.111111
+-0.055556 -0.055556 -0.111111 -0.055556 -0.111111 -0.111111 -0.055556 -0.055556 -0.111111 -0.111111 -0.055556 -0.111111
+ 0.000000 -0.055556 -0.055556 -0.055556 -0.055556 -0.111111  0.000000 -0.055556 -0.055556 -0.111111  0.000000 -0.111111
+ 0.055556 -0.055556  0.000000 -0.055556  0.000000 -0.111111  0.055556 -0.055556  0.000000 -0.111111  0.055556 -0.111111
+ 0.111111 -0.055556  0.055556 -0.055556  0.055556 -0.111111  0.111111 -0.055556  0.055556 -0.111111  0.111111 -0.111111
+ 0.166667 -0.055556  0.111111 -0.055556  0.111111 -0.111111  0.166667 -0.055556  0.111111 -0.111111  0.166667 -0.111111
+ 0.222222 -0.055556  0.166667 -0.055556  0.166667 -0.111111  0.222222 -0.055556  0.166667 -0.111111  0.222222 -0.111111
+ 0.277778 -0.055556  0.222222 -0.055556  0.222222 -0.111111  0.277778 -0.055556  0.222222 -0.111111  0.277778 -0.111111
+ 0.333333 -0.055556  0.277778 -0.055556  0.277778 -0.111111  0.333333 -0.055556  0.277778 -0.111111  0.333333 -0.111111
+ 0.388889 -0.055556  0.333333 -0.055556  0.333333 -0.111111  0.388889 -0.055556  0.333333 -0.111111  0.388889 -0.111111
+ 0.444444 -0.055556  0.388889 -0.055556  0.388889 -0.111111  0.444444 -0.055556  0.388889 -0.111111  0.444444 -0.111111
+ 0.500000 -0.055556  0.444444 -0.055556  0.444444 -0.111111  0.500000 -0.055556  0.444444 -0.111111  0.500000 -0.111111
+ 0.555556 -0.055556  0.500000 -0.055556  0.500000 -0.111111  0.555556 -0.055556  0.500000 -0.111111  0.555556 -0.111111
+ 0.611111 -0.055556  0.555556 -0.055556  0.555556 -0.111111  0.611111 -0.055556  0.555556 -0.111111  0.611111 -0.111111
+ 0.666667 -0.055556  0.611111 -0.055556  0.611111 -0.111111  0.666667 -0.055556  0.611111 -0.111111  0.666667 -0.111111
+ 0.722222 -0.055556  0.666667 -0.055556  0.666667 -0.111111  0.722222 -0.055556  0.666667 -0.111111  0.722222 -0.111111
+ 0.777778 -0.055556  0.722222 -0.055556  0.722222 -0.111111  0.777778 -0.055556  0.722222 -0.111111  0.777778 -0.111111
+ 0.833333 -0.055556  0.777778 -0.055556  0.777778 -0.111111  0.833333 -0.055556  0.777778 -0.111111  0.833333 -0.111111
+ 0.888889 -0.055556  0.833333 -0.055556  0.833333 -0.111111  0.888889 -0.055556  0.833333 -0.111111  0.888889 -0.111111
+ 0.944444 -0.055556  0.888889 -0.055556  0.888889 -0.111111  0.944444 -0.055556  0.888889 -0.111111  0.944444 -0.111111
+ 1.000000 -0.055556  0.944444 -0.055556  0.944444 -0.111111  1.000000 -0.055556  0.944444 -0.111111  1.000000 -0.111111
+-0.944444  0.000000 -1.000000  0.000000 -1.000000 -0.055556 -0.944444  0.000000 -1.000000 -0.055556 -0.944444 -0.055556
+-0.888889  0.000000 -0.944444  0.000000 -0.944444 -0.055556 -0.888889  0.000000 -0.944444 -0.055556 -0.888889 -0.055556
+-0.833333  0.000000 -0.888889  0.000000 -0.888889 -0.055556 -0.833333  0.000000 -0.888889 -0.055556 -0.833333 -0.055556
+-0.777778  0.000000 -0.833333  0.000000 -0.833333 -0.055556 -0.777778  0.000000 -0.833333 -0.055556 -0.777778 -0.055556
+-0.722222  0.000000 -0.777778  0.000000 -0.777778 -0.055556 -0.722222  0.000000 -0.777778 -0.055556 -0.722222 -0.055556
+-0.666667  0.000000 -0.722222  0.000000 -0.722222 -0.055556 -0.666667  0.000000 -0.722222 -0.055556 -0.666667 -0.055556
+-0.611111  0.000000 -0.666667  0.000000 -0.666667 -0.055556 -0.611111  0.000000 -0.666667 -0.055556 -0.611111 -0.055556
+-0.555556  0.000000 -0.611111  0.000000 -0.611111 -0.055556 -0.555556  0.000000 -0.611111 -0.055556 -0.555556 -0.055556
+-0.500000  0.000000 -0.555556  0.000000 -0.555556 -0.055556 -0.500000  0.000000 -0.555556 -0.055556 -0.500000 -0.055556
+-0.444444  0.000000 -0.500000  0.000000 -0.500000 -0.055556 -0.444444  0.000000 -0.500000 -0.055556 -0.444444 -0.055556
+-0.388889  0.000000 -0.444444  0.000000 -0.444444 -0.055556 -0.388889  0.000000 -0.444444 -0.055556 -0.388889 -0.055556
+-0.333333  0.000000 -0.388889  0.000000 -0.388889 -0.055556 -0.333333  0.000000 -0.388889 -0.055556 -0.333333 -0.055556
+-0.277778  0.000000 -0.333333  0.000000 -0.333333 -0.055556 -0.277778  0.000000 -0.333333 -0.055556 -0.277778 -0.055556
+-0.222222  0.000000 -0.277778  0.000000 -0.277778 -0.055556 -0.222222  0.000000 -0.277778 -0.055556 -0.222222 -0.055556
+-0.166667  0.000000 -0.222222  0.000000 -0.222222 -0.055556 -0.166667  0.000000 -0.222222 -0.055556 -0.166667 -0.055556
+-0.111111  0.000000 -0.166667  0.000000 -0.166667 -0.055556 -0.111111  0.000000 -0.166667 -0.055556 -0.111111 -0.055556
+-0.055556  0.000000 -0.111111  0.000000 -0.111111 -0.055556 -0.055556  0.000000 -0.111111 -0.055556 -0.055556 -0.055556
+ 0.000000  0.000000 -0.055556  0.000000 -0.055556 -0.055556  0.000000  0.000000 -0.055556 -0.055556  0.000000 -0.055556
+ 0.055556  0.000000  0.000000  0.000000  0.000000 -0.055556  0.055556  0.000000  0.000000 -0.055556  0.055556 -0.055556
+ 0.111111  0.000000  0.055556  0.000000  0.055556 -0.055556  0.111111  0.000000  0.055556 -0.055556  0.111111 -0.055556
+ 0.166667  0.000000  0.111111  0.000000  0.111111 -0.055556  0.166667  0.000000  0.111111 -0.055556  0.166667 -0.055556
+ 0.222222  0.000000  0.166667  0.000000  0.166667 -0.055556  0.222222  0.000000  0.166667 -0.055556  0.222222 -0.055556
+ 0.277778  0.000000  0.222222  0.000000  0.222222 -0.055556  0.277778  0.000000  0.222222 -0.055556  0.277778 -0.055556
+ 0.333333  0.000000  0.277778  0.000000  0.277778 -0.055556  0.333333  0.000000  0.277778 -0.055556  0.333333 -0.055556
+ 0.388889  0.000000  0.333333  0.000000  0.333333 -0.055556  0.388889  0.000000  0.333333 -0.055556  0.388889 -0.055556
+ 0.444444  0.000000  0.388889  0.000000  0.388889 -0.055556  0.444444  0.000000  0.388889 -0.055556  0.444444 -0.055556
+ 0.500000  0.000000  0.444444  0.000000  0.444444 -0.055556  0.500000  0.000000  0.444444 -0.055556  0.500000 -0.055556
+ 0.555556  0.000000  0.500000  0.000000  0.500000 -0.055556  0.555556  0.000000  0.500000 -0.055556  0.555556 -0.055556
+ 0.611111  0.000000  0.555556  0.000000  0.555556 -0.055556  0.611111  0.000000  0.555556 -0.055556  0.611111 -0.055556
+ 0.666667  0.000000  0.611111  0.000000  0.611111 -0.055556  0.666667  0.000000  0.611111 -0.055556  0.666667 -0.055556
+ 0.722222  0.000000  0.666667  0.000000  0.666667 -0.055556  0.722222  0.000000  0.666667 -0.055556  0.722222 -0.055556
+ 0.777778  0.000000  0.722222  0.000000  0.722222 -0.055556  0.777778  0.000000  0.722222 -0.055556  0.777778 -0.055556
+ 0.833333  0.000000  0.777778  0.000000  0.777778 -0.055556  0.833333  0.000000  0.777778 -0.055556  0.833333 -0.055556
+ 0.888889  0.000000  0.833333  0.000000  0.833333 -0.055556  0.888889  0.000000  0.833333 -0.055556  0.888889 -0.055556
+ 0.944444  0.000000  0.888889  0.000000  0.888889 -0.055556  0.944444  0.000000  0.888889 -0.055556  0.944444 -0.055556
+ 1.000000  0.000000  0.944444  0.000000  0.944444 -0.055556  1.000000  0.000000  0.944444 -0.055556  1.000000 -0.055556
+-0.944444  0.055556 -1.000000  0.055556 -1.000000  0.000000 -0.944444  0.055556 -1.000000  0.000000 -0.944444  0.000000
+-0.888889  0.055556 -0.944444  0.055556 -0.944444  0.000000 -0.888889  0.055556 -0.944444  0.000000 -0.888889  0.000000
+-0.833333  0.055556 -0.888889  0.055556 -0.888889  0.000000 -0.833333  0.055556 -0.888889  0.000000 -0.833333  0.000000
+-0.777778  0.055556 -0.833333  0.055556 -0.833333  0.000000 -0.777778  0.055556 -0.833333  0.000000 -0.777778  0.000000
+-0.722222  0.055556 -0.777778  0.055556 -0.777778  0.000000 -0.722222  0.055556 -0.777778  0.000000 -0.722222  0.000000
+-0.666667  0.055556 -0.722222  0.055556 -0.722222  0.000000 -0.666667  0.055556 -0.722222  0.000000 -0.666667  0.000000
+-0.611111  0.055556 -0.666667  0.055556 -0.666667  0.000000 -0.611111  0.055556 -0.666667  0.000000 -0.611111  0.000000
+-0.555556  0.055556 -0.611111  0.055556 -0.611111  0.000000 -0.555556  0.055556 -0.611111  0.000000 -0.555556  0.000000
+-0.500000  0.055556 -0.555556  0.055556 -0.555556  0.000000 -0.500000  0.055556 -0.555556  0.000000 -0.500000  0.000000
+-0.444444  0.055556 -0.500000  0.055556 -0.500000  0.000000 -0.444444  0.055556 -0.500000  0.000000 -0.444444  0.000000
+-0.388889  0.055556 -0.444444  0.055556 -0.444444  0.000000 -0.388889  0.055556 -0.444444  0.000000 -0.388889  0.000000
+-0.333333  0.055556 -0.388889  0.055556 -0.388889  0.000000 -0.333333  0.055556 -0.388889  0.000000 -0.333333  0.000000
+-0.277778  0.055556 -0.333333  0.055556 -0.333333  0.000000 -0.277778  0.055556 -0.333333  0.000000 -0.277778  0.000000
+-0.222222  0.055556 -0.277778  0.055556 -0.277778  0.000000 -0.222222  0.055556 -0.277778  0.000000 -0.222222  0.000000
+-0.166667  0.055556 -0.222222  0.055556 -0.222222  0.000000 -0.166667  0.055556 -0.222222  0.000000 -0.166667  0.000000
+-0.111111  0.055556 -0.166667  0.055556 -0.166667  0.000000 -0.111111  0.055556 -0.166667  0.000000 -0.111111  0.000000
+-0.055556  0.055556 -0.111111  0.055556 -0.111111  0.000000 -0.055556  0.055556 -0.111111  0.000000 -0.055556  0.000000
+ 0.000000  0.055556 -0.055556  0.055556 -0.055556  0.000000  0.000000  0.055556 -0.055556  0.000000  0.000000  0.000000
+ 0.055556  0.055556  0.000000  0.055556  0.000000  0.000000  0.055556  0.055556  0.000000  0.000000  0.055556  0.000000
+ 0.111111  0.055556  0.055556  0.055556  0.055556  0.000000  0.111111  0.055556  0.055556  0.000000  0.111111  0.000000
+ 0.166667  0.055556  0.111111  0.055556  0.111111  0.000000  0.166667  0.055556  0.111111  0.000000  0.166667  0.000000
+ 0.222222  0.055556  0.166667  0.055556  0.166667  0.000000  0.222222  0.055556  0.166667  0.000000  0.222222  0.000000
+ 0.277778  0.055556  0.222222  0.055556  0.222222  0.000000  0.277778  0.055556  0.222222  0.000000  0.277778  0.000000
+ 0.333333  0.055556  0.277778  0.055556  0.277778  0.000000  0.333333  0.055556  0.277778  0.000000  0.333333  0.000000
+ 0.388889  0.055556  0.333333  0.055556  0.333333  0.000000  0.388889  0.055556  0.333333  0.000000  0.388889  0.000000
+ 0.444444  0.055556  0.388889  0.055556  0.388889  0.000000  0.444444  0.055556  0.388889  0.000000  0.444444  0.000000
+ 0.500000  0.055556  0.444444  0.055556  0.444444  0.000000  0.500000  0.055556  0.444444  0.000000  0.500000  0.000000
+ 0.555556  0.055556  0.500000  0.055556  0.500000  0.000000  0.555556  0.055556  0.500000  0.000000  0.555556  0.000000
+ 0.611111  0.055556  0.555556  0.055556  0.555556  0.000000  0.611111  0.055556  0.555556  0.000000  0.611111  0.000000
+ 0.666667  0.055556  0.611111  0.055556  0.611111  0.000000  0.666667  0.055556  0.611111  0.000000  0.666667  0.000000
+ 0.722222  0.055556  0.666667  0.055556  0.666667  0.000000  0.722222  0.055556  0.666667  0.000000  0.722222  0.000000
+ 0.777778  0.055556  0.722222  0.055556  0.722222  0.000000  0.777778  0.055556  0.722222  0.000000  0.777778  0.000000
+ 0.833333  0.055556  0.777778  0.055556  0.777778  0.000000  0.833333  0.055556  0.777778  0.000000  0.833333  0.000000
+ 0.888889  0.055556  0.833333  0.055556  0.833333  0.000000  0.888889  0.055556  0.833333  0.000000  0.888889  0.000000
+ 0.944444  0.055556  0.888889  0.055556  0.888889  0.000000  0.944444  0.055556  0.888889  0.000000  0.944444  0.000000
+ 1.000000  0.055556  0.944444  0.055556  0.944444  0.000000  1.000000  0.055556  0.944444  0.000000  1.000000  0.000000
+-0.944444  0.111111 -1.000000  0.111111 -1.000000  0.055556 -0.944444  0.111111 -1.000000  0.055556 -0.944444  0.055556
+-0.888889  0.111111 -0.944444  0.111111 -0.944444  0.055556 -0.888889  0.111111 -0.944444  0.055556 -0.888889  0.055556
+-0.833333  0.111111 -0.888889  0.111111 -0.888889  0.055556 -0.833333  0.111111 -0.888889  0.055556 -0.833333  0.055556
+-0.777778  0.111111 -0.833333  0.111111 -0.833333  0.055556 -0.777778  0.111111 -0.833333  0.055556 -0.777778  0.055556
+-0.722222  0.111111 -0.777778  0.111111 -0.777778  0.055556 -0.722222  0.111111 -0.777778  0.055556 -0.722222  0.055556
+-0.666667  0.111111 -0.722222  0.111111 -0.722222  0.055556 -0.666667  0.111111 -0.722222  0.055556 -0.666667  0.055556
+-0.611111  0.111111 -0.666667  0.111111 -0.666667  0.055556 -0.611111  0.111111 -0.666667  0.055556 -0.611111  0.055556
+-0.555556  0.111111 -0.611111  0.111111 -0.611111  0.055556 -0.555556  0.111111 -0.611111  0.055556 -0.555556  0.055556
+-0.500000  0.111111 -0.555556  0.111111 -0.555556  0.055556 -0.500000  0.111111 -0.555556  0.055556 -0.500000  0.055556
+-0.444444  0.111111 -0.500000  0.111111 -0.500000  0.055556 -0.444444  0.111111 -0.500000  0.055556 -0.444444  0.055556
+-0.388889  0.111111 -0.444444  0.111111 -0.444444  0.055556 -0.388889  0.111111 -0.444444  0.055556 -0.388889  0.055556
+-0.333333  0.111111 -0.388889  0.111111 -0.388889  0.055556 -0.333333  0.111111 -0.388889  0.055556 -0.333333  0.055556
+-0.277778  0.111111 -0.333333  0.111111 -0.333333  0.055556 -0.277778  0.111111 -0.333333  0.055556 -0.277778  0.055556
+-0.222222  0.111111 -0.277778  0.111111 -0.277778  0.055556 -0.222222  0.111111 -0.277778  0.055556 -0.222222  0.055556
+-0.166667  0.111111 -0.222222  0.111111 -0.222222  0.055556 -0.166667  0.111111 -0.222222  0.055556 -0.166667  0.055556
+-0.111111  0.111111 -0.166667  0.111111 -0.166667  0.055556 -0.111111  0.111111 -0.166667  0.055556 -0.111111  0.055556
+-0.055556  0.111111 -0.111111  0.111111 -0.111111  0.055556 -0.055556  0.111111 -0.111111  0.055556 -0.055556  0.055556
+ 0.000000  0.111111 -0.055556  0.111111 -0.055556  0.055556  0.000000  0.111111 -0.055556  0.055556  0.000000  0.055556
+ 0.055556  0.111111  0.000000  0.111111  0.000000  0.055556  0.055556  0.111111  0.000000  0.055556  0.055556  0.055556
+ 0.111111  0.111111  0.055556  0.111111  0.055556  0.055556  0.111111  0.111111  0.055556  0.055556  0.111111  0.055556
+ 0.166667  0.111111  0.111111  0.111111  0.111111  0.055556  0.166667  0.111111  0.111111  0.055556  0.166667  0.055556
+ 0.222222  0.111111  0.166667  0.111111  0.166667  0.055556  0.222222  0.111111  0.166667  0.055556  0.222222  0.055556
+ 0.277778  0.111111  0.222222  0.111111  0.222222  0.055556  0.277778  0.111111  0.222222  0.055556  0.277778  0.055556
+ 0.333333  0.111111  0.277778  0.111111  0.277778  0.055556  0.333333  0.111111  0.277778  0.055556  0.333333  0.055556
+ 0.388889  0.111111  0.333333  0.111111  0.333333  0.055556  0.388889  0.111111  0.333333  0.055556  0.388889  0.055556
+ 0.444444  0.111111  0.388889  0.111111  0.388889  0.055556  0.444444  0.111111  0.388889  0.055556  0.444444  0.055556
+ 0.500000  0.111111  0.444444  0.111111  0.444444  0.055556  0.500000  0.111111  0.444444  0.055556  0.500000  0.055556
+ 0.555556  0.111111  0.500000  0.111111  0.500000  0.055556  0.555556  0.111111  0.500000  0.055556  0.555556  0.055556
+ 0.611111  0.111111  0.555556  0.111111  0.555556  0.055556  0.611111  0.111111  0.555556  0.055556  0.611111  0.055556
+ 0.666667  0.111111  0.611111  0.111111  0.611111  0.055556  0.666667  0.111111  0.611111  0.055556  0.666667  0.055556
+ 0.722222  0.111111  0.666667  0.111111  0.666667  0.055556  0.722222  0.111111  0.666667  0.055556  0.722222  0.055556
+ 0.777778  0.111111  0.722222  0.111111  0.722222  0.055556  0.777778  0.111111  0.722222  0.055556  0.777778  0.055556
+ 0.833333  0.111111  0.777778  0.111111  0.777778  0.055556  0.833333  0.111111  0.777778  0.055556  0.833333  0.055556
+ 0.888889  0.111111  0.833333  0.111111  0.833333  0.055556  0.888889  0.111111  0.833333  0.055556  0.888889  0.055556
+ 0.944444  0.111111  0.888889  0.111111  0.888889  0.055556  0.944444  0.111111  0.888889  0.055556  0.944444  0.055556
+ 1.000000  0.111111  0.944444  0.111111  0.944444  0.055556  1.000000  0.111111  0.944444  0.055556  1.000000  0.055556
+-0.944444  0.166667 -1.000000  0.166667 -1.000000  0.111111 -0.944444  0.166667 -1.000000  0.111111 -0.944444  0.111111
+-0.888889  0.166667 -0.944444  0.166667 -0.944444  0.111111 -0.888889  0.166667 -0.944444  0.111111 -0.888889  0.111111
+-0.833333  0.166667 -0.888889  0.166667 -0.888889  0.111111 -0.833333  0.166667 -0.888889  0.111111 -0.833333  0.111111
+-0.777778  0.166667 -0.833333  0.166667 -0.833333  0.111111 -0.777778  0.166667 -0.833333  0.111111 -0.777778  0.111111
+-0.722222  0.166667 -0.777778  0.166667 -0.777778  0.111111 -0.722222  0.166667 -0.777778  0.111111 -0.722222  0.111111
+-0.666667  0.166667 -0.722222  0.166667 -0.722222  0.111111 -0.666667  0.166667 -0.722222  0.111111 -0.666667  0.111111
+-0.611111  0.166667 -0.666667  0.166667 -0.666667  0.111111 -0.611111  0.166667 -0.666667  0.111111 -0.611111  0.111111
+-0.555556  0.166667 -0.611111  0.166667 -0.611111  0.111111 -0.555556  0.166667 -0.611111  0.111111 -0.555556  0.111111
+-0.500000  0.166667 -0.555556  0.166667 -0.555556  0.111111 -0.500000  0.166667 -0.555556  0.111111 -0.500000  0.111111
+-0.444444  0.166667 -0.500000  0.166667 -0.500000  0.111111 -0.444444  0.166667 -0.500000  0.111111 -0.444444  0.111111
+-0.388889  0.166667 -0.444444  0.166667 -0.444444  0.111111 -0.388889  0.166667 -0.444444  0.111111 -0.388889  0.111111
+-0.333333  0.166667 -0.388889  0.166667 -0.388889  0.111111 -0.333333  0.166667 -0.388889  0.111111 -0.333333  0.111111
+-0.277778  0.166667 -0.333333  0.166667 -0.333333  0.111111 -0.277778  0.166667 -0.333333  0.111111 -0.277778  0.111111
+-0.222222  0.166667 -0.277778  0.166667 -0.277778  0.111111 -0.222222  0.166667 -0.277778  0.111111 -0.222222  0.111111
+-0.166667  0.166667 -0.222222  0.166667 -0.222222  0.111111 -0.166667  0.166667 -0.222222  0.111111 -0.166667  0.111111
+-0.111111  0.166667 -0.166667  0.166667 -0.166667  0.111111 -0.111111  0.166667 -0.166667  0.111111 -0.111111  0.111111
+-0.055556  0.166667 -0.111111  0.166667 -0.111111  0.111111 -0.055556  0.166667 -0.111111  0.111111 -0.055556  0.111111
+ 0.000000  0.166667 -0.055556  0.166667 -0.055556  0.111111  0.000000  0.166667 -0.055556  0.111111  0.000000  0.111111
+ 0.055556  0.166667  0.000000  0.166667  0.000000  0.111111  0.055556  0.166667  0.000000  0.111111  0.055556  0.111111
+ 0.111111  0.166667  0.055556  0.166667  0.055556  0.111111  0.111111  0.166667  0.055556  0.111111  0.111111  0.111111
+ 0.166667  0.166667  0.111111  0.166667  0.111111  0.111111  0.166667  0.166667  0.111111  0.111111  0.166667  0.111111
+ 0.222222  0.166667  0.166667  0.166667  0.166667  0.111111  0.222222  0.166667  0.166667  0.111111  0.222222  0.111111
+ 0.277778  0.166667  0.222222  0.166667  0.222222  0.111111  0.277778  0.166667  0.222222  0.111111  0.277778  0.111111
+ 0.333333  0.166667  0.277778  0.166667  0.277778  0.111111  0.333333  0.166667  0.277778  0.111111  0.333333  0.111111
+ 0.388889  0.166667  0.333333  0.166667  0.333333  0.111111  0.388889  0.166667  0.333333  0.111111  0.388889  0.111111
+ 0.444444  0.166667  0.388889  0.166667  0.388889  0.111111  0.444444  0.166667  0.388889  0.111111  0.444444  0.111111
+ 0.500000  0.166667  0.444444  0.166667  0.444444  0.111111  0.500000  0.166667  0.444444  0.111111  0.500000  0.111111
+ 0.555556  0.166667  0.500000  0.166667  0.500000  0.111111  0.555556  0.166667  0.500000  0.111111  0.555556  0.111111
+ 0.611111  0.166667  0.555556  0.166667  0.555556  0.111111  0.611111  0.166667  0.555556  0.111111  0.611111  0.111111
+ 0.666667  0.166667  0.611111  0.166667  0.611111  0.111111  0.666667  0.166667  0.611111  0.111111  0.666667  0.111111
+ 0.722222  0.166667  0.666667  0.166667  0.666667  0.111111  0.722222  0.166667  0.666667  0.111111  0.722222  0.111111
+ 0.777778  0.166667  0.722222  0.166667  0.722222  0.111111  0.777778  0.166667  0.722222  0.111111  0.777778  0.111111
+ 0.833333  0.166667  0.777778  0.166667  0.777778  0.111111  0.833333  0.166667  0.777778  0.111111  0.833333  0.111111
+ 0.888889  0.166667  0.833333  0.166667  0.833333  0.111111  0.888889  0.166667  0.833333  0.111111  0.888889  0.111111
+ 0.944444  0.166667  0.888889  0.166667  0.888889  0.111111  0.944444  0.166667  0.888889  0.111111  0.944444  0.111111
+ 1.000000  0.166667  0.944444  0.166667  0.944444  0.111111  1.000000  0.166667  0.944444  0.111111  1.000000  0.111111
+-0.944444  0.222222 -1.000000  0.222222 -1.000000  0.166667 -0.944444  0.222222 -1.000000  0.166667 -0.944444  0.166667
+-0.888889  0.222222 -0.944444  0.222222 -0.944444  0.166667 -0.888889  0.222222 -0.944444  0.166667 -0.888889  0.166667
+-0.833333  0.222222 -0.888889  0.222222 -0.888889  0.166667 -0.833333  0.222222 -0.888889  0.166667 -0.833333  0.166667
+-0.777778  0.222222 -0.833333  0.222222 -0.833333  0.166667 -0.777778  0.222222 -0.833333  0.166667 -0.777778  0.166667
+-0.722222  0.222222 -0.777778  0.222222 -0.777778  0.166667 -0.722222  0.222222 -0.777778  0.166667 -0.722222  0.166667
+-0.666667  0.222222 -0.722222  0.222222 -0.722222  0.166667 -0.666667  0.222222 -0.722222  0.166667 -0.666667  0.166667
+-0.611111  0.222222 -0.666667  0.222222 -0.666667  0.166667 -0.611111  0.222222 -0.666667  0.166667 -0.611111  0.166667
+-0.555556  0.222222 -0.611111  0.222222 -0.611111  0.166667 -0.555556  0.222222 -0.611111  0.166667 -0.555556  0.166667
+-0.500000  0.222222 -0.555556  0.222222 -0.555556  0.166667 -0.500000  0.222222 -0.555556  0.166667 -0.500000  0.166667
+-0.444444  0.222222 -0.500000  0.222222 -0.500000  0.166667 -0.444444  0.222222 -0.500000  0.166667 -0.444444  0.166667
+-0.388889  0.222222 -0.444444  0.222222 -0.444444  0.166667 -0.388889  0.222222 -0.444444  0.166667 -0.388889  0.166667
+-0.333333  0.222222 -0.388889  0.222222 -0.388889  0.166667 -0.333333  0.222222 -0.388889  0.166667 -0.333333  0.166667
+-0.277778  0.222222 -0.333333  0.222222 -0.333333  0.166667 -0.277778  0.222222 -0.333333  0.166667 -0.277778  0.166667
+-0.222222  0.222222 -0.277778  0.222222 -0.277778  0.166667 -0.222222  0.222222 -0.277778  0.166667 -0.222222  0.166667
+-0.166667  0.222222 -0.222222  0.222222 -0.222222  0.166667 -0.166667  0.222222 -0.222222  0.166667 -0.166667  0.166667
+-0.111111  0.222222 -0.166667  0.222222 -0.166667  0.166667 -0.111111  0.222222 -0.166667  0.166667 -0.111111  0.166667
+-0.055556  0.222222 -0.111111  0.222222 -0.111111  0.166667 -0.055556  0.222222 -0.111111  0.166667 -0.055556  0.166667
+ 0.000000  0.222222 -0.055556  0.222222 -0.055556  0.166667  0.000000  0.222222 -0.055556  0.166667  0.000000  0.166667
+ 0.055556  0.222222  0.000000  0.222222  0.000000  0.166667  0.055556  0.222222  0.000000  0.166667  0.055556  0.166667
+ 0.111111  0.222222  0.055556  0.222222  0.055556  0.166667  0.111111  0.222222  0.055556  0.166667  0.111111  0.166667
+ 0.166667  0.222222  0.111111  0.222222  0.111111  0.166667  0.166667  0.222222  0.111111  0.166667  0.166667  0.166667
+ 0.222222  0.222222  0.166667  0.222222  0.166667  0.166667  0.222222  0.222222  0.166667  0.166667  0.222222  0.166667
+ 0.277778  0.222222  0.222222  0.222222  0.222222  0.166667  0.277778  0.222222  0.222222  0.166667  0.277778  0.166667
+ 0.333333  0.222222  0.277778  0.222222  0.277778  0.166667  0.333333  0.222222  0.277778  0.166667  0.333333  0.166667
+ 0.388889  0.222222  0.333333  0.222222  0.333333  0.166667  0.388889  0.222222  0.333333  0.166667  0.388889  0.166667
+ 0.444444  0.222222  0.388889  0.222222  0.388889  0.166667  0.444444  0.222222  0.388889  0.166667  0.444444  0.166667
+ 0.500000  0.222222  0.444444  0.222222  0.444444  0.166667  0.500000  0.222222  0.444444  0.166667  0.500000  0.166667
+ 0.555556  0.222222  0.500000  0.222222  0.500000  0.166667  0.555556  0.222222  0.500000  0.166667  0.555556  0.166667
+ 0.611111  0.222222  0.555556  0.222222  0.555556  0.166667  0.611111  0.222222  0.555556  0.166667  0.611111  0.166667
+ 0.666667  0.222222  0.611111  0.222222  0.611111  0.166667  0.666667  0.222222  0.611111  0.166667  0.666667  0.166667
+ 0.722222  0.222222  0.666667  0.222222  0.666667  0.166667  0.722222  0.222222  0.666667  0.166667  0.722222  0.166667
+ 0.777778  0.222222  0.722222  0.222222  0.722222  0.166667  0.777778  0.222222  0.722222  0.166667  0.777778  0.166667
+ 0.833333  0.222222  0.777778  0.222222  0.777778  0.166667  0.833333  0.222222  0.777778  0.166667  0.833333  0.166667
+ 0.888889  0.222222  0.833333  0.222222  0.833333  0.166667  0.888889  0.222222  0.833333  0.166667  0.888889  0.166667
+ 0.944444  0.222222  0.888889  0.222222  0.888889  0.166667  0.944444  0.222222  0.888889  0.166667  0.944444  0.166667
+ 1.000000  0.222222  0.944444  0.222222  0.944444  0.166667  1.000000  0.222222  0.944444  0.166667  1.000000  0.166667
+-0.944444  0.277778 -1.000000  0.277778 -1.000000  0.222222 -0.944444  0.277778 -1.000000  0.222222 -0.944444  0.222222
+-0.888889  0.277778 -0.944444  0.277778 -0.944444  0.222222 -0.888889  0.277778 -0.944444  0.222222 -0.888889  0.222222
+-0.833333  0.277778 -0.888889  0.277778 -0.888889  0.222222 -0.833333  0.277778 -0.888889  0.222222 -0.833333  0.222222
+-0.777778  0.277778 -0.833333  0.277778 -0.833333  0.222222 -0.777778  0.277778 -0.833333  0.222222 -0.777778  0.222222
+-0.722222  0.277778 -0.777778  0.277778 -0.777778  0.222222 -0.722222  0.277778 -0.777778  0.222222 -0.722222  0.222222
+-0.666667  0.277778 -0.722222  0.277778 -0.722222  0.222222 -0.666667  0.277778 -0.722222  0.222222 -0.666667  0.222222
+-0.611111  0.277778 -0.666667  0.277778 -0.666667  0.222222 -0.611111  0.277778 -0.666667  0.222222 -0.611111  0.222222
+-0.555556  0.277778 -0.611111  0.277778 -0.611111  0.222222 -0.555556  0.277778 -0.611111  0.222222 -0.555556  0.222222
+-0.500000  0.277778 -0.555556  0.277778 -0.555556  0.222222 -0.500000  0.277778 -0.555556  0.222222 -0.500000  0.222222
+-0.444444  0.277778 -0.500000  0.277778 -0.500000  0.222222 -0.444444  0.277778 -0.500000  0.222222 -0.444444  0.222222
+-0.388889  0.277778 -0.444444  0.277778 -0.444444  0.222222 -0.388889  0.277778 -0.444444  0.222222 -0.388889  0.222222
+-0.333333  0.277778 -0.388889  0.277778 -0.388889  0.222222 -0.333333  0.277778 -0.388889  0.222222 -0.333333  0.222222
+-0.277778  0.277778 -0.333333  0.277778 -0.333333  0.222222 -0.277778  0.277778 -0.333333  0.222222 -0.277778  0.222222
+-0.222222  0.277778 -0.277778  0.277778 -0.277778  0.222222 -0.222222  0.277778 -0.277778  0.222222 -0.222222  0.222222
+-0.166667  0.277778 -0.222222  0.277778 -0.222222  0.222222 -0.166667  0.277778 -0.222222  0.222222 -0.166667  0.222222
+-0.111111  0.277778 -0.166667  0.277778 -0.166667  0.222222 -0.111111  0.277778 -0.166667  0.222222 -0.111111  0.222222
+-0.055556  0.277778 -0.111111  0.277778 -0.111111  0.222222 -0.055556  0.277778 -0.111111  0.222222 -0.055556  0.222222
+ 0.000000  0.277778 -0.055556  0.277778 -0.055556  0.222222  0.000000  0.277778 -0.055556  0.222222  0.000000  0.222222
+ 0.055556  0.277778  0.000000  0.277778  0.000000  0.222222  0.055556  0.277778  0.000000  0.222222  0.055556  0.222222
+ 0.111111  0.277778  0.055556  0.277778  0.055556  0.222222  0.111111  0.277778  0.055556  0.222222  0.111111  0.222222
+ 0.166667  0.277778  0.111111  0.277778  0.111111  0.222222  0.166667  0.277778  0.111111  0.222222  0.166667  0.222222
+ 0.222222  0.277778  0.166667  0.277778  0.166667  0.222222  0.222222  0.277778  0.166667  0.222222  0.222222  0.222222
+ 0.277778  0.277778  0.222222  0.277778  0.222222  0.222222  0.277778  0.277778  0.222222  0.222222  0.277778  0.222222
+ 0.333333  0.277778  0.277778  0.277778  0.277778  0.222222  0.333333  0.277778  0.277778  0.222222  0.333333  0.222222
+ 0.388889  0.277778  0.333333  0.277778  0.333333  0.222222  0.388889  0.277778  0.333333  0.222222  0.388889  0.222222
+ 0.444444  0.277778  0.388889  0.277778  0.388889  0.222222  0.444444  0.277778  0.388889  0.222222  0.444444  0.222222
+ 0.500000  0.277778  0.444444  0.277778  0.444444  0.222222  0.500000  0.277778  0.444444  0.222222  0.500000  0.222222
+ 0.555556  0.277778  0.500000  0.277778  0.500000  0.222222  0.555556  0.277778  0.500000  0.222222  0.555556  0.222222
+ 0.611111  0.277778  0.555556  0.277778  0.555556  0.222222  0.611111  0.277778  0.555556  0.222222  0.611111  0.222222
+ 0.666667  0.277778  0.611111  0.277778  0.611111  0.222222  0.666667  0.277778  0.611111  0.222222  0.666667  0.222222
+ 0.722222  0.277778  0.666667  0.277778  0.666667  0.222222  0.722222  0.277778  0.666667  0.222222  0.722222  0.222222
+ 0.777778  0.277778  0.722222  0.277778  0.722222  0.222222  0.777778  0.277778  0.722222  0.222222  0.777778  0.222222
+ 0.833333  0.277778  0.777778  0.277778  0.777778  0.222222  0.833333  0.277778  0.777778  0.222222  0.833333  0.222222
+ 0.888889  0.277778  0.833333  0.277778  0.833333  0.222222  0.888889  0.277778  0.833333  0.222222  0.888889  0.222222
+ 0.944444  0.277778  0.888889  0.277778  0.888889  0.222222  0.944444  0.277778  0.888889  0.222222  0.944444  0.222222
+ 1.000000  0.277778  0.944444  0.277778  0.944444  0.222222  1.000000  0.277778  0.944444  0.222222  1.000000  0.222222
+-0.944444  0.333333 -1.000000  0.333333 -1.000000  0.277778 -0.944444  0.333333 -1.000000  0.277778 -0.944444  0.277778
+-0.888889  0.333333 -0.944444  0.333333 -0.944444  0.277778 -0.888889  0.333333 -0.944444  0.277778 -0.888889  0.277778
+-0.833333  0.333333 -0.888889  0.333333 -0.888889  0.277778 -0.833333  0.333333 -0.888889  0.277778 -0.833333  0.277778
+-0.777778  0.333333 -0.833333  0.333333 -0.833333  0.277778 -0.777778  0.333333 -0.833333  0.277778 -0.777778  0.277778
+-0.722222  0.333333 -0.777778  0.333333 -0.777778  0.277778 -0.722222  0.333333 -0.777778  0.277778 -0.722222  0.277778
+-0.666667  0.333333 -0.722222  0.333333 -0.722222  0.277778 -0.666667  0.333333 -0.722222  0.277778 -0.666667  0.277778
+-0.611111  0.333333 -0.666667  0.333333 -0.666667  0.277778 -0.611111  0.333333 -0.666667  0.277778 -0.611111  0.277778
+-0.555556  0.333333 -0.611111  0.333333 -0.611111  0.277778 -0.555556  0.333333 -0.611111  0.277778 -0.555556  0.277778
+-0.500000  0.333333 -0.555556  0.333333 -0.555556  0.277778 -0.500000  0.333333 -0.555556  0.277778 -0.500000  0.277778
+-0.444444  0.333333 -0.500000  0.333333 -0.500000  0.277778 -0.444444  0.333333 -0.500000  0.277778 -0.444444  0.277778
+-0.388889  0.333333 -0.444444  0.333333 -0.444444  0.277778 -0.388889  0.333333 -0.444444  0.277778 -0.388889  0.277778
+-0.333333  0.333333 -0.388889  0.333333 -0.388889  0.277778 -0.333333  0.333333 -0.388889  0.277778 -0.333333  0.277778
+-0.277778  0.333333 -0.333333  0.333333 -0.333333  0.277778 -0.277778  0.333333 -0.333333  0.277778 -0.277778  0.277778
+-0.222222  0.333333 -0.277778  0.333333 -0.277778  0.277778 -0.222222  0.333333 -0.277778  0.277778 -0.222222  0.277778
+-0.166667  0.333333 -0.222222  0.333333 -0.222222  0.277778 -0.166667  0.333333 -0.222222  0.277778 -0.166667  0.277778
+-0.111111  0.333333 -0.166667  0.333333 -0.166667  0.277778 -0.111111  0.333333 -0.166667  0.277778 -0.111111  0.277778
+-0.055556  0.333333 -0.111111  0.333333 -0.111111  0.277778 -0.055556  0.333333 -0.111111  0.277778 -0.055556  0.277778
+ 0.000000  0.333333 -0.055556  0.333333 -0.055556  0.277778  0.000000  0.333333 -0.055556  0.277778  0.000000  0.277778
+ 0.055556  0.333333  0.000000  0.333333  0.000000  0.277778  0.055556  0.333333  0.000000  0.277778  0.055556  0.277778
+ 0.111111  0.333333  0.055556  0.333333  0.055556  0.277778  0.111111  0.333333  0.055556  0.277778  0.111111  0.277778
+ 0.166667  0.333333  0.111111  0.333333  0.111111  0.277778  0.166667  0.333333  0.111111  0.277778  0.166667  0.277778
+ 0.222222  0.333333  0.166667  0.333333  0.166667  0.277778  0.222222  0.333333  0.166667  0.277778  0.222222  0.277778
+ 0.277778  0.333333  0.222222  0.333333  0.222222  0.277778  0.277778  0.333333  0.222222  0.277778  0.277778  0.277778
+ 0.333333  0.333333  0.277778  0.333333  0.277778  0.277778  0.333333  0.333333  0.277778  0.277778  0.333333  0.277778
+ 0.388889  0.333333  0.333333  0.333333  0.333333  0.277778  0.388889  0.333333  0.333333  0.277778  0.388889  0.277778
+ 0.444444  0.333333  0.388889  0.333333  0.388889  0.277778  0.444444  0.333333  0.388889  0.277778  0.444444  0.277778
+ 0.500000  0.333333  0.444444  0.333333  0.444444  0.277778  0.500000  0.333333  0.444444  0.277778  0.500000  0.277778
+ 0.555556  0.333333  0.500000  0.333333  0.500000  0.277778  0.555556  0.333333  0.500000  0.277778  0.555556  0.277778
+ 0.611111  0.333333  0.555556  0.333333  0.555556  0.277778  0.611111  0.333333  0.555556  0.277778  0.611111  0.277778
+ 0.666667  0.333333  0.611111  0.333333  0.611111  0.277778  0.666667  0.333333  0.611111  0.277778  0.666667  0.277778
+ 0.722222  0.333333  0.666667  0.333333  0.666667  0.277778  0.722222  0.333333  0.666667  0.277778  0.722222  0.277778
+ 0.777778  0.333333  0.722222  0.333333  0.722222  0.277778  0.777778  0.333333  0.722222  0.277778  0.777778  0.277778
+ 0.833333  0.333333  0.777778  0.333333  0.777778  0.277778  0.833333  0.333333  0.777778  0.277778  0.833333  0.277778
+ 0.888889  0.333333  0.833333  0.333333  0.833333  0.277778  0.888889  0.333333  0.833333  0.277778  0.888889  0.277778
+ 0.944444  0.333333  0.888889  0.333333  0.888889  0.277778  0.944444  0.333333  0.888889  0.277778  0.944444  0.277778
+ 1.000000  0.333333  0.944444  0.333333  0.944444  0.277778  1.000000  0.333333  0.944444  0.277778  1.000000  0.277778
+-0.944444  0.388889 -1.000000  0.388889 -1.000000  0.333333 -0.944444  0.388889 -1.000000  0.333333 -0.944444  0.333333
+-0.888889  0.388889 -0.944444  0.388889 -0.944444  0.333333 -0.888889  0.388889 -0.944444  0.333333 -0.888889  0.333333
+-0.833333  0.388889 -0.888889  0.388889 -0.888889  0.333333 -0.833333  0.388889 -0.888889  0.333333 -0.833333  0.333333
+-0.777778  0.388889 -0.833333  0.388889 -0.833333  0.333333 -0.777778  0.388889 -0.833333  0.333333 -0.777778  0.333333
+-0.722222  0.388889 -0.777778  0.388889 -0.777778  0.333333 -0.722222  0.388889 -0.777778  0.333333 -0.722222  0.333333
+-0.666667  0.388889 -0.722222  0.388889 -0.722222  0.333333 -0.666667  0.388889 -0.722222  0.333333 -0.666667  0.333333
+-0.611111  0.388889 -0.666667  0.388889 -0.666667  0.333333 -0.611111  0.388889 -0.666667  0.333333 -0.611111  0.333333
+-0.555556  0.388889 -0.611111  0.388889 -0.611111  0.333333 -0.555556  0.388889 -0.611111  0.333333 -0.555556  0.333333
+-0.500000  0.388889 -0.555556  0.388889 -0.555556  0.333333 -0.500000  0.388889 -0.555556  0.333333 -0.500000  0.333333
+-0.444444  0.388889 -0.500000  0.388889 -0.500000  0.333333 -0.444444  0.388889 -0.500000  0.333333 -0.444444  0.333333
+-0.388889  0.388889 -0.444444  0.388889 -0.444444  0.333333 -0.388889  0.388889 -0.444444  0.333333 -0.388889  0.333333
+-0.333333  0.388889 -0.388889  0.388889 -0.388889  0.333333 -0.333333  0.388889 -0.388889  0.333333 -0.333333  0.333333
+-0.277778  0.388889 -0.333333  0.388889 -0.333333  0.333333 -0.277778  0.388889 -0.333333  0.333333 -0.277778  0.333333
+-0.222222  0.388889 -0.277778  0.388889 -0.277778  0.333333 -0.222222  0.388889 -0.277778  0.333333 -0.222222  0.333333
+-0.166667  0.388889 -0.222222  0.388889 -0.222222  0.333333 -0.166667  0.388889 -0.222222  0.333333 -0.166667  0.333333
+-0.111111  0.388889 -0.166667  0.388889 -0.166667  0.333333 -0.111111  0.388889 -0.166667  0.333333 -0.111111  0.333333
+-0.055556  0.388889 -0.111111  0.388889 -0.111111  0.333333 -0.055556  0.388889 -0.111111  0.333333 -0.055556  0.333333
+ 0.000000  0.388889 -0.055556  0.388889 -0.055556  0.333333  0.000000  0.388889 -0.055556  0.333333  0.000000  0.333333
+ 0.055556  0.388889  0.000000  0.388889  0.000000  0.333333  0.055556  0.388889  0.000000  0.333333  0.055556  0.333333
+ 0.111111  0.388889  0.055556  0.388889  0.055556  0.333333  0.111111  0.388889  0.055556  0.333333  0.111111  0.333333
+ 0.166667  0.388889  0.111111  0.388889  0.111111  0.333333  0.166667  0.388889  0.111111  0.333333  0.166667  0.333333
+ 0.222222  0.388889  0.166667  0.388889  0.166667  0.333333  0.222222  0.388889  0.166667  0.333333  0.222222  0.333333
+ 0.277778  0.388889  0.222222  0.388889  0.222222  0.333333  0.277778  0.388889  0.222222  0.333333  0.277778  0.333333
+ 0.333333  0.388889  0.277778  0.388889  0.277778  0.333333  0.333333  0.388889  0.277778  0.333333  0.333333  0.333333
+ 0.388889  0.388889  0.333333  0.388889  0.333333  0.333333  0.388889  0.388889  0.333333  0.333333  0.388889  0.333333
+ 0.444444  0.388889  0.388889  0.388889  0.388889  0.333333  0.444444  0.388889  0.388889  0.333333  0.444444  0.333333
+ 0.500000  0.388889  0.444444  0.388889  0.444444  0.333333  0.500000  0.388889  0.444444  0.333333  0.500000  0.333333
+ 0.555556  0.388889  0.500000  0.388889  0.500000  0.333333  0.555556  0.388889  0.500000  0.333333  0.555556  0.333333
+ 0.611111  0.388889  0.555556  0.388889  0.555556  0.333333  0.611111  0.388889  0.555556  0.333333  0.611111  0.333333
+ 0.666667  0.388889  0.611111  0.388889  0.611111  0.333333  0.666667  0.388889  0.611111  0.333333  0.666667  0.333333
+ 0.722222  0.388889  0.666667  0.388889  0.666667  0.333333  0.722222  0.388889  0.666667  0.333333  0.722222  0.333333
+ 0.777778  0.388889  0.722222  0.388889  0.722222  0.333333  0.777778  0.388889  0.722222  0.333333  0.777778  0.333333
+ 0.833333  0.388889  0.777778  0.388889  0.777778  0.333333  0.833333  0.388889  0.777778  0.333333  0.833333  0.333333
+ 0.888889  0.388889  0.833333  0.388889  0.833333  0.333333  0.888889  0.388889  0.833333  0.333333  0.888889  0.333333
+ 0.944444  0.388889  0.888889  0.388889  0.888889  0.333333  0.944444  0.388889  0.888889  0.333333  0.944444  0.333333
+ 1.000000  0.388889  0.944444  0.388889  0.944444  0.333333  1.000000  0.388889  0.944444  0.333333  1.000000  0.333333
+-0.944444  0.444444 -1.000000  0.444444 -1.000000  0.388889 -0.944444  0.444444 -1.000000  0.388889 -0.944444  0.388889
+-0.888889  0.444444 -0.944444  0.444444 -0.944444  0.388889 -0.888889  0.444444 -0.944444  0.388889 -0.888889  0.388889
+-0.833333  0.444444 -0.888889  0.444444 -0.888889  0.388889 -0.833333  0.444444 -0.888889  0.388889 -0.833333  0.388889
+-0.777778  0.444444 -0.833333  0.444444 -0.833333  0.388889 -0.777778  0.444444 -0.833333  0.388889 -0.777778  0.388889
+-0.722222  0.444444 -0.777778  0.444444 -0.777778  0.388889 -0.722222  0.444444 -0.777778  0.388889 -0.722222  0.388889
+-0.666667  0.444444 -0.722222  0.444444 -0.722222  0.388889 -0.666667  0.444444 -0.722222  0.388889 -0.666667  0.388889
+-0.611111  0.444444 -0.666667  0.444444 -0.666667  0.388889 -0.611111  0.444444 -0.666667  0.388889 -0.611111  0.388889
+-0.555556  0.444444 -0.611111  0.444444 -0.611111  0.388889 -0.555556  0.444444 -0.611111  0.388889 -0.555556  0.388889
+-0.500000  0.444444 -0.555556  0.444444 -0.555556  0.388889 -0.500000  0.444444 -0.555556  0.388889 -0.500000  0.388889
+-0.444444  0.444444 -0.500000  0.444444 -0.500000  0.388889 -0.444444  0.444444 -0.500000  0.388889 -0.444444  0.388889
+-0.388889  0.444444 -0.444444  0.444444 -0.444444  0.388889 -0.388889  0.444444 -0.444444  0.388889 -0.388889  0.388889
+-0.333333  0.444444 -0.388889  0.444444 -0.388889  0.388889 -0.333333  0.444444 -0.388889  0.388889 -0.333333  0.388889
+-0.277778  0.444444 -0.333333  0.444444 -0.333333  0.388889 -0.277778  0.444444 -0.333333  0.388889 -0.277778  0.388889
+-0.222222  0.444444 -0.277778  0.444444 -0.277778  0.388889 -0.222222  0.444444 -0.277778  0.388889 -0.222222  0.388889
+-0.166667  0.444444 -0.222222  0.444444 -0.222222  0.388889 -0.166667  0.444444 -0.222222  0.388889 -0.166667  0.388889
+-0.111111  0.444444 -0.166667  0.444444 -0.166667  0.388889 -0.111111  0.444444 -0.166667  0.388889 -0.111111  0.388889
+-0.055556  0.444444 -0.111111  0.444444 -0.111111  0.388889 -0.055556  0.444444 -0.111111  0.388889 -0.055556  0.388889
+ 0.000000  0.444444 -0.055556  0.444444 -0.055556  0.388889  0.000000  0.444444 -0.055556  0.388889  0.000000  0.388889
+ 0.055556  0.444444  0.000000  0.444444  0.000000  0.388889  0.055556  0.444444  0.000000  0.388889  0.055556  0.388889
+ 0.111111  0.444444  0.055556  0.444444  0.055556  0.388889  0.111111  0.444444  0.055556  0.388889  0.111111  0.388889
+ 0.166667  0.444444  0.111111  0.444444  0.111111  0.388889  0.166667  0.444444  0.111111  0.388889  0.166667  0.388889
+ 0.222222  0.444444  0.166667  0.444444  0.166667  0.388889  0.222222  0.444444  0.166667  0.388889  0.222222  0.388889
+ 0.277778  0.444444  0.222222  0.444444  0.222222  0.388889  0.277778  0.444444  0.222222  0.388889  0.277778  0.388889
+ 0.333333  0.444444  0.277778  0.444444  0.277778  0.388889  0.333333  0.444444  0.277778  0.388889  0.333333  0.388889
+ 0.388889  0.444444  0.333333  0.444444  0.333333  0.388889  0.388889  0.444444  0.333333  0.388889  0.388889  0.388889
+ 0.444444  0.444444  0.388889  0.444444  0.388889  0.388889  0.444444  0.444444  0.388889  0.388889  0.444444  0.388889
+ 0.500000  0.444444  0.444444  0.444444  0.444444  0.388889  0.500000  0.444444  0.444444  0.388889  0.500000  0.388889
+ 0.555556  0.444444  0.500000  0.444444  0.500000  0.388889  0.555556  0.444444  0.500000  0.388889  0.555556  0.388889
+ 0.611111  0.444444  0.555556  0.444444  0.555556  0.388889  0.611111  0.444444  0.555556  0.388889  0.611111  0.388889
+ 0.666667  0.444444  0.611111  0.444444  0.611111  0.388889  0.666667  0.444444  0.611111  0.388889  0.666667  0.388889
+ 0.722222  0.444444  0.666667  0.444444  0.666667  0.388889  0.722222  0.444444  0.666667  0.388889  0.722222  0.388889
+ 0.777778  0.444444  0.722222  0.444444  0.722222  0.388889  0.777778  0.444444  0.722222  0.388889  0.777778  0.388889
+ 0.833333  0.444444  0.777778  0.444444  0.777778  0.388889  0.833333  0.444444  0.777778  0.388889  0.833333  0.388889
+ 0.888889  0.444444  0.833333  0.444444  0.833333  0.388889  0.888889  0.444444  0.833333  0.388889  0.888889  0.388889
+ 0.944444  0.444444  0.888889  0.444444  0.888889  0.388889  0.944444  0.444444  0.888889  0.388889  0.944444  0.388889
+ 1.000000  0.444444  0.944444  0.444444  0.944444  0.388889  1.000000  0.444444  0.944444  0.388889  1.000000  0.388889
+-0.944444  0.500000 -1.000000  0.500000 -1.000000  0.444444 -0.944444  0.500000 -1.000000  0.444444 -0.944444  0.444444
+-0.888889  0.500000 -0.944444  0.500000 -0.944444  0.444444 -0.888889  0.500000 -0.944444  0.444444 -0.888889  0.444444
+-0.833333  0.500000 -0.888889  0.500000 -0.888889  0.444444 -0.833333  0.500000 -0.888889  0.444444 -0.833333  0.444444
+-0.777778  0.500000 -0.833333  0.500000 -0.833333  0.444444 -0.777778  0.500000 -0.833333  0.444444 -0.777778  0.444444
+-0.722222  0.500000 -0.777778  0.500000 -0.777778  0.444444 -0.722222  0.500000 -0.777778  0.444444 -0.722222  0.444444
+-0.666667  0.500000 -0.722222  0.500000 -0.722222  0.444444 -0.666667  0.500000 -0.722222  0.444444 -0.666667  0.444444
+-0.611111  0.500000 -0.666667  0.500000 -0.666667  0.444444 -0.611111  0.500000 -0.666667  0.444444 -0.611111  0.444444
+-0.555556  0.500000 -0.611111  0.500000 -0.611111  0.444444 -0.555556  0.500000 -0.611111  0.444444 -0.555556  0.444444
+-0.500000  0.500000 -0.555556  0.500000 -0.555556  0.444444 -0.500000  0.500000 -0.555556  0.444444 -0.500000  0.444444
+-0.444444  0.500000 -0.500000  0.500000 -0.500000  0.444444 -0.444444  0.500000 -0.500000  0.444444 -0.444444  0.444444
+-0.388889  0.500000 -0.444444  0.500000 -0.444444  0.444444 -0.388889  0.500000 -0.444444  0.444444 -0.388889  0.444444
+-0.333333  0.500000 -0.388889  0.500000 -0.388889  0.444444 -0.333333  0.500000 -0.388889  0.444444 -0.333333  0.444444
+-0.277778  0.500000 -0.333333  0.500000 -0.333333  0.444444 -0.277778  0.500000 -0.333333  0.444444 -0.277778  0.444444
+-0.222222  0.500000 -0.277778  0.500000 -0.277778  0.444444 -0.222222  0.500000 -0.277778  0.444444 -0.222222  0.444444
+-0.166667  0.500000 -0.222222  0.500000 -0.222222  0.444444 -0.166667  0.500000 -0.222222  0.444444 -0.166667  0.444444
+-0.111111  0.500000 -0.166667  0.500000 -0.166667  0.444444 -0.111111  0.500000 -0.166667  0.444444 -0.111111  0.444444
+-0.055556  0.500000 -0.111111  0.500000 -0.111111  0.444444 -0.055556  0.500000 -0.111111  0.444444 -0.055556  0.444444
+ 0.000000  0.500000 -0.055556  0.500000 -0.055556  0.444444  0.000000  0.500000 -0.055556  0.444444  0.000000  0.444444
+ 0.055556  0.500000  0.000000  0.500000  0.000000  0.444444  0.055556  0.500000  0.000000  0.444444  0.055556  0.444444
+ 0.111111  0.500000  0.055556  0.500000  0.055556  0.444444  0.111111  0.500000  0.055556  0.444444  0.111111  0.444444
+ 0.166667  0.500000  0.111111  0.500000  0.111111  0.444444  0.166667  0.500000  0.111111  0.444444  0.166667  0.444444
+ 0.222222  0.500000  0.166667  0.500000  0.166667  0.444444  0.222222  0.500000  0.166667  0.444444  0.222222  0.444444
+ 0.277778  0.500000  0.222222  0.500000  0.222222  0.444444  0.277778  0.500000  0.222222  0.444444  0.277778  0.444444
+ 0.333333  0.500000  0.277778  0.500000  0.277778  0.444444  0.333333  0.500000  0.277778  0.444444  0.333333  0.444444
+ 0.388889  0.500000  0.333333  0.500000  0.333333  0.444444  0.388889  0.500000  0.333333  0.444444  0.388889  0.444444
+ 0.444444  0.500000  0.388889  0.500000  0.388889  0.444444  0.444444  0.500000  0.388889  0.444444  0.444444  0.444444
+ 0.500000  0.500000  0.444444  0.500000  0.444444  0.444444  0.500000  0.500000  0.444444  0.444444  0.500000  0.444444
+ 0.555556  0.500000  0.500000  0.500000  0.500000  0.444444  0.555556  0.500000  0.500000  0.444444  0.555556  0.444444
+ 0.611111  0.500000  0.555556  0.500000  0.555556  0.444444  0.611111  0.500000  0.555556  0.444444  0.611111  0.444444
+ 0.666667  0.500000  0.611111  0.500000  0.611111  0.444444  0.666667  0.500000  0.611111  0.444444  0.666667  0.444444
+ 0.722222  0.500000  0.666667  0.500000  0.666667  0.444444  0.722222  0.500000  0.666667  0.444444  0.722222  0.444444
+ 0.777778  0.500000  0.722222  0.500000  0.722222  0.444444  0.777778  0.500000  0.722222  0.444444  0.777778  0.444444
+ 0.833333  0.500000  0.777778  0.500000  0.777778  0.444444  0.833333  0.500000  0.777778  0.444444  0.833333  0.444444
+ 0.888889  0.500000  0.833333  0.500000  0.833333  0.444444  0.888889  0.500000  0.833333  0.444444  0.888889  0.444444
+ 0.944444  0.500000  0.888889  0.500000  0.888889  0.444444  0.944444  0.500000  0.888889  0.444444  0.944444  0.444444
+ 1.000000  0.500000  0.944444  0.500000  0.944444  0.444444  1.000000  0.500000  0.944444  0.444444  1.000000  0.444444
+-0.944444  0.555556 -1.000000  0.555556 -1.000000  0.500000 -0.944444  0.555556 -1.000000  0.500000 -0.944444  0.500000
+-0.888889  0.555556 -0.944444  0.555556 -0.944444  0.500000 -0.888889  0.555556 -0.944444  0.500000 -0.888889  0.500000
+-0.833333  0.555556 -0.888889  0.555556 -0.888889  0.500000 -0.833333  0.555556 -0.888889  0.500000 -0.833333  0.500000
+-0.777778  0.555556 -0.833333  0.555556 -0.833333  0.500000 -0.777778  0.555556 -0.833333  0.500000 -0.777778  0.500000
+-0.722222  0.555556 -0.777778  0.555556 -0.777778  0.500000 -0.722222  0.555556 -0.777778  0.500000 -0.722222  0.500000
+-0.666667  0.555556 -0.722222  0.555556 -0.722222  0.500000 -0.666667  0.555556 -0.722222  0.500000 -0.666667  0.500000
+-0.611111  0.555556 -0.666667  0.555556 -0.666667  0.500000 -0.611111  0.555556 -0.666667  0.500000 -0.611111  0.500000
+-0.555556  0.555556 -0.611111  0.555556 -0.611111  0.500000 -0.555556  0.555556 -0.611111  0.500000 -0.555556  0.500000
+-0.500000  0.555556 -0.555556  0.555556 -0.555556  0.500000 -0.500000  0.555556 -0.555556  0.500000 -0.500000  0.500000
+-0.444444  0.555556 -0.500000  0.555556 -0.500000  0.500000 -0.444444  0.555556 -0.500000  0.500000 -0.444444  0.500000
+-0.388889  0.555556 -0.444444  0.555556 -0.444444  0.500000 -0.388889  0.555556 -0.444444  0.500000 -0.388889  0.500000
+-0.333333  0.555556 -0.388889  0.555556 -0.388889  0.500000 -0.333333  0.555556 -0.388889  0.500000 -0.333333  0.500000
+-0.277778  0.555556 -0.333333  0.555556 -0.333333  0.500000 -0.277778  0.555556 -0.333333  0.500000 -0.277778  0.500000
+-0.222222  0.555556 -0.277778  0.555556 -0.277778  0.500000 -0.222222  0.555556 -0.277778  0.500000 -0.222222  0.500000
+-0.166667  0.555556 -0.222222  0.555556 -0.222222  0.500000 -0.166667  0.555556 -0.222222  0.500000 -0.166667  0.500000
+-0.111111  0.555556 -0.166667  0.555556 -0.166667  0.500000 -0.111111  0.555556 -0.166667  0.500000 -0.111111  0.500000
+-0.055556  0.555556 -0.111111  0.555556 -0.111111  0.500000 -0.055556  0.555556 -0.111111  0.500000 -0.055556  0.500000
+ 0.000000  0.555556 -0.055556  0.555556 -0.055556  0.500000  0.000000  0.555556 -0.055556  0.500000  0.000000  0.500000
+ 0.055556  0.555556  0.000000  0.555556  0.000000  0.500000  0.055556  0.555556  0.000000  0.500000  0.055556  0.500000
+ 0.111111  0.555556  0.055556  0.555556  0.055556  0.500000  0.111111  0.555556  0.055556  0.500000  0.111111  0.500000
+ 0.166667  0.555556  0.111111  0.555556  0.111111  0.500000  0.166667  0.555556  0.111111  0.500000  0.166667  0.500000
+ 0.222222  0.555556  0.166667  0.555556  0.166667  0.500000  0.222222  0.555556  0.166667  0.500000  0.222222  0.500000
+ 0.277778  0.555556  0.222222  0.555556  0.222222  0.500000  0.277778  0.555556  0.222222  0.500000  0.277778  0.500000
+ 0.333333  0.555556  0.277778  0.555556  0.277778  0.500000  0.333333  0.555556  0.277778  0.500000  0.333333  0.500000
+ 0.388889  0.555556  0.333333  0.555556  0.333333  0.500000  0.388889  0.555556  0.333333  0.500000  0.388889  0.500000
+ 0.444444  0.555556  0.388889  0.555556  0.388889  0.500000  0.444444  0.555556  0.388889  0.500000  0.444444  0.500000
+ 0.500000  0.555556  0.444444  0.555556  0.444444  0.500000  0.500000  0.555556  0.444444  0.500000  0.500000  0.500000
+ 0.555556  0.555556  0.500000  0.555556  0.500000  0.500000  0.555556  0.555556  0.500000  0.500000  0.555556  0.500000
+ 0.611111  0.555556  0.555556  0.555556  0.555556  0.500000  0.611111  0.555556  0.555556  0.500000  0.611111  0.500000
+ 0.666667  0.555556  0.611111  0.555556  0.611111  0.500000  0.666667  0.555556  0.611111  0.500000  0.666667  0.500000
+ 0.722222  0.555556  0.666667  0.555556  0.666667  0.500000  0.722222  0.555556  0.666667  0.500000  0.722222  0.500000
+ 0.777778  0.555556  0.722222  0.555556  0.722222  0.500000  0.777778  0.555556  0.722222  0.500000  0.777778  0.500000
+ 0.833333  0.555556  0.777778  0.555556  0.777778  0.500000  0.833333  0.555556  0.777778  0.500000  0.833333  0.500000
+ 0.888889  0.555556  0.833333  0.555556  0.833333  0.500000  0.888889  0.555556  0.833333  0.500000  0.888889  0.500000
+ 0.944444  0.555556  0.888889  0.555556  0.888889  0.500000  0.944444  0.555556  0.888889  0.500000  0.944444  0.500000
+ 1.000000  0.555556  0.944444  0.555556  0.944444  0.500000  1.000000  0.555556  0.944444  0.500000  1.000000  0.500000
+-0.944444  0.611111 -1.000000  0.611111 -1.000000  0.555556 -0.944444  0.611111 -1.000000  0.555556 -0.944444  0.555556
+-0.888889  0.611111 -0.944444  0.611111 -0.944444  0.555556 -0.888889  0.611111 -0.944444  0.555556 -0.888889  0.555556
+-0.833333  0.611111 -0.888889  0.611111 -0.888889  0.555556 -0.833333  0.611111 -0.888889  0.555556 -0.833333  0.555556
+-0.777778  0.611111 -0.833333  0.611111 -0.833333  0.555556 -0.777778  0.611111 -0.833333  0.555556 -0.777778  0.555556
+-0.722222  0.611111 -0.777778  0.611111 -0.777778  0.555556 -0.722222  0.611111 -0.777778  0.555556 -0.722222  0.555556
+-0.666667  0.611111 -0.722222  0.611111 -0.722222  0.555556 -0.666667  0.611111 -0.722222  0.555556 -0.666667  0.555556
+-0.611111  0.611111 -0.666667  0.611111 -0.666667  0.555556 -0.611111  0.611111 -0.666667  0.555556 -0.611111  0.555556
+-0.555556  0.611111 -0.611111  0.611111 -0.611111  0.555556 -0.555556  0.611111 -0.611111  0.555556 -0.555556  0.555556
+-0.500000  0.611111 -0.555556  0.611111 -0.555556  0.555556 -0.500000  0.611111 -0.555556  0.555556 -0.500000  0.555556
+-0.444444  0.611111 -0.500000  0.611111 -0.500000  0.555556 -0.444444  0.611111 -0.500000  0.555556 -0.444444  0.555556
+-0.388889  0.611111 -0.444444  0.611111 -0.444444  0.555556 -0.388889  0.611111 -0.444444  0.555556 -0.388889  0.555556
+-0.333333  0.611111 -0.388889  0.611111 -0.388889  0.555556 -0.333333  0.611111 -0.388889  0.555556 -0.333333  0.555556
+-0.277778  0.611111 -0.333333  0.611111 -0.333333  0.555556 -0.277778  0.611111 -0.333333  0.555556 -0.277778  0.555556
+-0.222222  0.611111 -0.277778  0.611111 -0.277778  0.555556 -0.222222  0.611111 -0.277778  0.555556 -0.222222  0.555556
+-0.166667  0.611111 -0.222222  0.611111 -0.222222  0.555556 -0.166667  0.611111 -0.222222  0.555556 -0.166667  0.555556
+-0.111111  0.611111 -0.166667  0.611111 -0.166667  0.555556 -0.111111  0.611111 -0.166667  0.555556 -0.111111  0.555556
+-0.055556  0.611111 -0.111111  0.611111 -0.111111  0.555556 -0.055556  0.611111 -0.111111  0.555556 -0.055556  0.555556
+ 0.000000  0.611111 -0.055556  0.611111 -0.055556  0.555556  0.000000  0.611111 -0.055556  0.555556  0.000000  0.555556
+ 0.055556  0.611111  0.000000  0.611111  0.000000  0.555556  0.055556  0.611111  0.000000  0.555556  0.055556  0.555556
+ 0.111111  0.611111  0.055556  0.611111  0.055556  0.555556  0.111111  0.611111  0.055556  0.555556  0.111111  0.555556
+ 0.166667  0.611111  0.111111  0.611111  0.111111  0.555556  0.166667  0.611111  0.111111  0.555556  0.166667  0.555556
+ 0.222222  0.611111  0.166667  0.611111  0.166667  0.555556  0.222222  0.611111  0.166667  0.555556  0.222222  0.555556
+ 0.277778  0.611111  0.222222  0.611111  0.222222  0.555556  0.277778  0.611111  0.222222  0.555556  0.277778  0.555556
+ 0.333333  0.611111  0.277778  0.611111  0.277778  0.555556  0.333333  0.611111  0.277778  0.555556  0.333333  0.555556
+ 0.388889  0.611111  0.333333  0.611111  0.333333  0.555556  0.388889  0.611111  0.333333  0.555556  0.388889  0.555556
+ 0.444444  0.611111  0.388889  0.611111  0.388889  0.555556  0.444444  0.611111  0.388889  0.555556  0.444444  0.555556
+ 0.500000  0.611111  0.444444  0.611111  0.444444  0.555556  0.500000  0.611111  0.444444  0.555556  0.500000  0.555556
+ 0.555556  0.611111  0.500000  0.611111  0.500000  0.555556  0.555556  0.611111  0.500000  0.555556  0.555556  0.555556
+ 0.611111  0.611111  0.555556  0.611111  0.555556  0.555556  0.611111  0.611111  0.555556  0.555556  0.611111  0.555556
+ 0.666667  0.611111  0.611111  0.611111  0.611111  0.555556  0.666667  0.611111  0.611111  0.555556  0.666667  0.555556
+ 0.722222  0.611111  0.666667  0.611111  0.666667  0.555556  0.722222  0.611111  0.666667  0.555556  0.722222  0.555556
+ 0.777778  0.611111  0.722222  0.611111  0.722222  0.555556  0.777778  0.611111  0.722222  0.555556  0.777778  0.555556
+ 0.833333  0.611111  0.777778  0.611111  0.777778  0.555556  0.833333  0.611111  0.777778  0.555556  0.833333  0.555556
+ 0.888889  0.611111  0.833333  0.611111  0.833333  0.555556  0.888889  0.611111  0.833333  0.555556  0.888889  0.555556
+ 0.944444  0.611111  0.888889  0.611111  0.888889  0.555556  0.944444  0.611111  0.888889  0.555556  0.944444  0.555556
+ 1.000000  0.611111  0.944444  0.611111  0.944444  0.555556  1.000000  0.611111  0.944444  0.555556  1.000000  0.555556
+-0.944444  0.666667 -1.000000  0.666667 -1.000000  0.611111 -0.944444  0.666667 -1.000000  0.611111 -0.944444  0.611111
+-0.888889  0.666667 -0.944444  0.666667 -0.944444  0.611111 -0.888889  0.666667 -0.944444  0.611111 -0.888889  0.611111
+-0.833333  0.666667 -0.888889  0.666667 -0.888889  0.611111 -0.833333  0.666667 -0.888889  0.611111 -0.833333  0.611111
+-0.777778  0.666667 -0.833333  0.666667 -0.833333  0.611111 -0.777778  0.666667 -0.833333  0.611111 -0.777778  0.611111
+-0.722222  0.666667 -0.777778  0.666667 -0.777778  0.611111 -0.722222  0.666667 -0.777778  0.611111 -0.722222  0.611111
+-0.666667  0.666667 -0.722222  0.666667 -0.722222  0.611111 -0.666667  0.666667 -0.722222  0.611111 -0.666667  0.611111
+-0.611111  0.666667 -0.666667  0.666667 -0.666667  0.611111 -0.611111  0.666667 -0.666667  0.611111 -0.611111  0.611111
+-0.555556  0.666667 -0.611111  0.666667 -0.611111  0.611111 -0.555556  0.666667 -0.611111  0.611111 -0.555556  0.611111
+-0.500000  0.666667 -0.555556  0.666667 -0.555556  0.611111 -0.500000  0.666667 -0.555556  0.611111 -0.500000  0.611111
+-0.444444  0.666667 -0.500000  0.666667 -0.500000  0.611111 -0.444444  0.666667 -0.500000  0.611111 -0.444444  0.611111
+-0.388889  0.666667 -0.444444  0.666667 -0.444444  0.611111 -0.388889  0.666667 -0.444444  0.611111 -0.388889  0.611111
+-0.333333  0.666667 -0.388889  0.666667 -0.388889  0.611111 -0.333333  0.666667 -0.388889  0.611111 -0.333333  0.611111
+-0.277778  0.666667 -0.333333  0.666667 -0.333333  0.611111 -0.277778  0.666667 -0.333333  0.611111 -0.277778  0.611111
+-0.222222  0.666667 -0.277778  0.666667 -0.277778  0.611111 -0.222222  0.666667 -0.277778  0.611111 -0.222222  0.611111
+-0.166667  0.666667 -0.222222  0.666667 -0.222222  0.611111 -0.166667  0.666667 -0.222222  0.611111 -0.166667  0.611111
+-0.111111  0.666667 -0.166667  0.666667 -0.166667  0.611111 -0.111111  0.666667 -0.166667  0.611111 -0.111111  0.611111
+-0.055556  0.666667 -0.111111  0.666667 -0.111111  0.611111 -0.055556  0.666667 -0.111111  0.611111 -0.055556  0.611111
+ 0.000000  0.666667 -0.055556  0.666667 -0.055556  0.611111  0.000000  0.666667 -0.055556  0.611111  0.000000  0.611111
+ 0.055556  0.666667  0.000000  0.666667  0.000000  0.611111  0.055556  0.666667  0.000000  0.611111  0.055556  0.611111
+ 0.111111  0.666667  0.055556  0.666667  0.055556  0.611111  0.111111  0.666667  0.055556  0.611111  0.111111  0.611111
+ 0.166667  0.666667  0.111111  0.666667  0.111111  0.611111  0.166667  0.666667  0.111111  0.611111  0.166667  0.611111
+ 0.222222  0.666667  0.166667  0.666667  0.166667  0.611111  0.222222  0.666667  0.166667  0.611111  0.222222  0.611111
+ 0.277778  0.666667  0.222222  0.666667  0.222222  0.611111  0.277778  0.666667  0.222222  0.611111  0.277778  0.611111
+ 0.333333  0.666667  0.277778  0.666667  0.277778  0.611111  0.333333  0.666667  0.277778  0.611111  0.333333  0.611111
+ 0.388889  0.666667  0.333333  0.666667  0.333333  0.611111  0.388889  0.666667  0.333333  0.611111  0.388889  0.611111
+ 0.444444  0.666667  0.388889  0.666667  0.388889  0.611111  0.444444  0.666667  0.388889  0.611111  0.444444  0.611111
+ 0.500000  0.666667  0.444444  0.666667  0.444444  0.611111  0.500000  0.666667  0.444444  0.611111  0.500000  0.611111
+ 0.555556  0.666667  0.500000  0.666667  0.500000  0.611111  0.555556  0.666667  0.500000  0.611111  0.555556  0.611111
+ 0.611111  0.666667  0.555556  0.666667  0.555556  0.611111  0.611111  0.666667  0.555556  0.611111  0.611111  0.611111
+ 0.666667  0.666667  0.611111  0.666667  0.611111  0.611111  0.666667  0.666667  0.611111  0.611111  0.666667  0.611111
+ 0.722222  0.666667  0.666667  0.666667  0.666667  0.611111  0.722222  0.666667  0.666667  0.611111  0.722222  0.611111
+ 0.777778  0.666667  0.722222  0.666667  0.722222  0.611111  0.777778  0.666667  0.722222  0.611111  0.777778  0.611111
+ 0.833333  0.666667  0.777778  0.666667  0.777778  0.611111  0.833333  0.666667  0.777778  0.611111  0.833333  0.611111
+ 0.888889  0.666667  0.833333  0.666667  0.833333  0.611111  0.888889  0.666667  0.833333  0.611111  0.888889  0.611111
+ 0.944444  0.666667  0.888889  0.666667  0.888889  0.611111  0.944444  0.666667  0.888889  0.611111  0.944444  0.611111
+ 1.000000  0.666667  0.944444  0.666667  0.944444  0.611111  1.000000  0.666667  0.944444  0.611111  1.000000  0.611111
+-0.944444  0.722222 -1.000000  0.722222 -1.000000  0.666667 -0.944444  0.722222 -1.000000  0.666667 -0.944444  0.666667
+-0.888889  0.722222 -0.944444  0.722222 -0.944444  0.666667 -0.888889  0.722222 -0.944444  0.666667 -0.888889  0.666667
+-0.833333  0.722222 -0.888889  0.722222 -0.888889  0.666667 -0.833333  0.722222 -0.888889  0.666667 -0.833333  0.666667
+-0.777778  0.722222 -0.833333  0.722222 -0.833333  0.666667 -0.777778  0.722222 -0.833333  0.666667 -0.777778  0.666667
+-0.722222  0.722222 -0.777778  0.722222 -0.777778  0.666667 -0.722222  0.722222 -0.777778  0.666667 -0.722222  0.666667
+-0.666667  0.722222 -0.722222  0.722222 -0.722222  0.666667 -0.666667  0.722222 -0.722222  0.666667 -0.666667  0.666667
+-0.611111  0.722222 -0.666667  0.722222 -0.666667  0.666667 -0.611111  0.722222 -0.666667  0.666667 -0.611111  0.666667
+-0.555556  0.722222 -0.611111  0.722222 -0.611111  0.666667 -0.555556  0.722222 -0.611111  0.666667 -0.555556  0.666667
+-0.500000  0.722222 -0.555556  0.722222 -0.555556  0.666667 -0.500000  0.722222 -0.555556  0.666667 -0.500000  0.666667
+-0.444444  0.722222 -0.500000  0.722222 -0.500000  0.666667 -0.444444  0.722222 -0.500000  0.666667 -0.444444  0.666667
+-0.388889  0.722222 -0.444444  0.722222 -0.444444  0.666667 -0.388889  0.722222 -0.444444  0.666667 -0.388889  0.666667
+-0.333333  0.722222 -0.388889  0.722222 -0.388889  0.666667 -0.333333  0.722222 -0.388889  0.666667 -0.333333  0.666667
+-0.277778  0.722222 -0.333333  0.722222 -0.333333  0.666667 -0.277778  0.722222 -0.333333  0.666667 -0.277778  0.666667
+-0.222222  0.722222 -0.277778  0.722222 -0.277778  0.666667 -0.222222  0.722222 -0.277778  0.666667 -0.222222  0.666667
+-0.166667  0.722222 -0.222222  0.722222 -0.222222  0.666667 -0.166667  0.722222 -0.222222  0.666667 -0.166667  0.666667
+-0.111111  0.722222 -0.166667  0.722222 -0.166667  0.666667 -0.111111  0.722222 -0.166667  0.666667 -0.111111  0.666667
+-0.055556  0.722222 -0.111111  0.722222 -0.111111  0.666667 -0.055556  0.722222 -0.111111  0.666667 -0.055556  0.666667
+ 0.000000  0.722222 -0.055556  0.722222 -0.055556  0.666667  0.000000  0.722222 -0.055556  0.666667  0.000000  0.666667
+ 0.055556  0.722222  0.000000  0.722222  0.000000  0.666667  0.055556  0.722222  0.000000  0.666667  0.055556  0.666667
+ 0.111111  0.722222  0.055556  0.722222  0.055556  0.666667  0.111111  0.722222  0.055556  0.666667  0.111111  0.666667
+ 0.166667  0.722222  0.111111  0.722222  0.111111  0.666667  0.166667  0.722222  0.111111  0.666667  0.166667  0.666667
+ 0.222222  0.722222  0.166667  0.722222  0.166667  0.666667  0.222222  0.722222  0.166667  0.666667  0.222222  0.666667
+ 0.277778  0.722222  0.222222  0.722222  0.222222  0.666667  0.277778  0.722222  0.222222  0.666667  0.277778  0.666667
+ 0.333333  0.722222  0.277778  0.722222  0.277778  0.666667  0.333333  0.722222  0.277778  0.666667  0.333333  0.666667
+ 0.388889  0.722222  0.333333  0.722222  0.333333  0.666667  0.388889  0.722222  0.333333  0.666667  0.388889  0.666667
+ 0.444444  0.722222  0.388889  0.722222  0.388889  0.666667  0.444444  0.722222  0.388889  0.666667  0.444444  0.666667
+ 0.500000  0.722222  0.444444  0.722222  0.444444  0.666667  0.500000  0.722222  0.444444  0.666667  0.500000  0.666667
+ 0.555556  0.722222  0.500000  0.722222  0.500000  0.666667  0.555556  0.722222  0.500000  0.666667  0.555556  0.666667
+ 0.611111  0.722222  0.555556  0.722222  0.555556  0.666667  0.611111  0.722222  0.555556  0.666667  0.611111  0.666667
+ 0.666667  0.722222  0.611111  0.722222  0.611111  0.666667  0.666667  0.722222  0.611111  0.666667  0.666667  0.666667
+ 0.722222  0.722222  0.666667  0.722222  0.666667  0.666667  0.722222  0.722222  0.666667  0.666667  0.722222  0.666667
+ 0.777778  0.722222  0.722222  0.722222  0.722222  0.666667  0.777778  0.722222  0.722222  0.666667  0.777778  0.666667
+ 0.833333  0.722222  0.777778  0.722222  0.777778  0.666667  0.833333  0.722222  0.777778  0.666667  0.833333  0.666667
+ 0.888889  0.722222  0.833333  0.722222  0.833333  0.666667  0.888889  0.722222  0.833333  0.666667  0.888889  0.666667
+ 0.944444  0.722222  0.888889  0.722222  0.888889  0.666667  0.944444  0.722222  0.888889  0.666667  0.944444  0.666667
+ 1.000000  0.722222  0.944444  0.722222  0.944444  0.666667  1.000000  0.722222  0.944444  0.666667  1.000000  0.666667
+-0.944444  0.777778 -1.000000  0.777778 -1.000000  0.722222 -0.944444  0.777778 -1.000000  0.722222 -0.944444  0.722222
+-0.888889  0.777778 -0.944444  0.777778 -0.944444  0.722222 -0.888889  0.777778 -0.944444  0.722222 -0.888889  0.722222
+-0.833333  0.777778 -0.888889  0.777778 -0.888889  0.722222 -0.833333  0.777778 -0.888889  0.722222 -0.833333  0.722222
+-0.777778  0.777778 -0.833333  0.777778 -0.833333  0.722222 -0.777778  0.777778 -0.833333  0.722222 -0.777778  0.722222
+-0.722222  0.777778 -0.777778  0.777778 -0.777778  0.722222 -0.722222  0.777778 -0.777778  0.722222 -0.722222  0.722222
+-0.666667  0.777778 -0.722222  0.777778 -0.722222  0.722222 -0.666667  0.777778 -0.722222  0.722222 -0.666667  0.722222
+-0.611111  0.777778 -0.666667  0.777778 -0.666667  0.722222 -0.611111  0.777778 -0.666667  0.722222 -0.611111  0.722222
+-0.555556  0.777778 -0.611111  0.777778 -0.611111  0.722222 -0.555556  0.777778 -0.611111  0.722222 -0.555556  0.722222
+-0.500000  0.777778 -0.555556  0.777778 -0.555556  0.722222 -0.500000  0.777778 -0.555556  0.722222 -0.500000  0.722222
+-0.444444  0.777778 -0.500000  0.777778 -0.500000  0.722222 -0.444444  0.777778 -0.500000  0.722222 -0.444444  0.722222
+-0.388889  0.777778 -0.444444  0.777778 -0.444444  0.722222 -0.388889  0.777778 -0.444444  0.722222 -0.388889  0.722222
+-0.333333  0.777778 -0.388889  0.777778 -0.388889  0.722222 -0.333333  0.777778 -0.388889  0.722222 -0.333333  0.722222
+-0.277778  0.777778 -0.333333  0.777778 -0.333333  0.722222 -0.277778  0.777778 -0.333333  0.722222 -0.277778  0.722222
+-0.222222  0.777778 -0.277778  0.777778 -0.277778  0.722222 -0.222222  0.777778 -0.277778  0.722222 -0.222222  0.722222
+-0.166667  0.777778 -0.222222  0.777778 -0.222222  0.722222 -0.166667  0.777778 -0.222222  0.722222 -0.166667  0.722222
+-0.111111  0.777778 -0.166667  0.777778 -0.166667  0.722222 -0.111111  0.777778 -0.166667  0.722222 -0.111111  0.722222
+-0.055556  0.777778 -0.111111  0.777778 -0.111111  0.722222 -0.055556  0.777778 -0.111111  0.722222 -0.055556  0.722222
+ 0.000000  0.777778 -0.055556  0.777778 -0.055556  0.722222  0.000000  0.777778 -0.055556  0.722222  0.000000  0.722222
+ 0.055556  0.777778  0.000000  0.777778  0.000000  0.722222  0.055556  0.777778  0.000000  0.722222  0.055556  0.722222
+ 0.111111  0.777778  0.055556  0.777778  0.055556  0.722222  0.111111  0.777778  0.055556  0.722222  0.111111  0.722222
+ 0.166667  0.777778  0.111111  0.777778  0.111111  0.722222  0.166667  0.777778  0.111111  0.722222  0.166667  0.722222
+ 0.222222  0.777778  0.166667  0.777778  0.166667  0.722222  0.222222  0.777778  0.166667  0.722222  0.222222  0.722222
+ 0.277778  0.777778  0.222222  0.777778  0.222222  0.722222  0.277778  0.777778  0.222222  0.722222  0.277778  0.722222
+ 0.333333  0.777778  0.277778  0.777778  0.277778  0.722222  0.333333  0.777778  0.277778  0.722222  0.333333  0.722222
+ 0.388889  0.777778  0.333333  0.777778  0.333333  0.722222  0.388889  0.777778  0.333333  0.722222  0.388889  0.722222
+ 0.444444  0.777778  0.388889  0.777778  0.388889  0.722222  0.444444  0.777778  0.388889  0.722222  0.444444  0.722222
+ 0.500000  0.777778  0.444444  0.777778  0.444444  0.722222  0.500000  0.777778  0.444444  0.722222  0.500000  0.722222
+ 0.555556  0.777778  0.500000  0.777778  0.500000  0.722222  0.555556  0.777778  0.500000  0.722222  0.555556  0.722222
+ 0.611111  0.777778  0.555556  0.777778  0.555556  0.722222  0.611111  0.777778  0.555556  0.722222  0.611111  0.722222
+ 0.666667  0.777778  0.611111  0.777778  0.611111  0.722222  0.666667  0.777778  0.611111  0.722222  0.666667  0.722222
+ 0.722222  0.777778  0.666667  0.777778  0.666667  0.722222  0.722222  0.777778  0.666667  0.722222  0.722222  0.722222
+ 0.777778  0.777778  0.722222  0.777778  0.722222  0.722222  0.777778  0.777778  0.722222  0.722222  0.777778  0.722222
+ 0.833333  0.777778  0.777778  0.777778  0.777778  0.722222  0.833333  0.777778  0.777778  0.722222  0.833333  0.722222
+ 0.888889  0.777778  0.833333  0.777778  0.833333  0.722222  0.888889  0.777778  0.833333  0.722222  0.888889  0.722222
+ 0.944444  0.777778  0.888889  0.777778  0.888889  0.722222  0.944444  0.777778  0.888889  0.722222  0.944444  0.722222
+ 1.000000  0.777778  0.944444  0.777778  0.944444  0.722222  1.000000  0.777778  0.944444  0.722222  1.000000  0.722222
+-0.944444  0.833333 -1.000000  0.833333 -1.000000  0.777778 -0.944444  0.833333 -1.000000  0.777778 -0.944444  0.777778
+-0.888889  0.833333 -0.944444  0.833333 -0.944444  0.777778 -0.888889  0.833333 -0.944444  0.777778 -0.888889  0.777778
+-0.833333  0.833333 -0.888889  0.833333 -0.888889  0.777778 -0.833333  0.833333 -0.888889  0.777778 -0.833333  0.777778
+-0.777778  0.833333 -0.833333  0.833333 -0.833333  0.777778 -0.777778  0.833333 -0.833333  0.777778 -0.777778  0.777778
+-0.722222  0.833333 -0.777778  0.833333 -0.777778  0.777778 -0.722222  0.833333 -0.777778  0.777778 -0.722222  0.777778
+-0.666667  0.833333 -0.722222  0.833333 -0.722222  0.777778 -0.666667  0.833333 -0.722222  0.777778 -0.666667  0.777778
+-0.611111  0.833333 -0.666667  0.833333 -0.666667  0.777778 -0.611111  0.833333 -0.666667  0.777778 -0.611111  0.777778
+-0.555556  0.833333 -0.611111  0.833333 -0.611111  0.777778 -0.555556  0.833333 -0.611111  0.777778 -0.555556  0.777778
+-0.500000  0.833333 -0.555556  0.833333 -0.555556  0.777778 -0.500000  0.833333 -0.555556  0.777778 -0.500000  0.777778
+-0.444444  0.833333 -0.500000  0.833333 -0.500000  0.777778 -0.444444  0.833333 -0.500000  0.777778 -0.444444  0.777778
+-0.388889  0.833333 -0.444444  0.833333 -0.444444  0.777778 -0.388889  0.833333 -0.444444  0.777778 -0.388889  0.777778
+-0.333333  0.833333 -0.388889  0.833333 -0.388889  0.777778 -0.333333  0.833333 -0.388889  0.777778 -0.333333  0.777778
+-0.277778  0.833333 -0.333333  0.833333 -0.333333  0.777778 -0.277778  0.833333 -0.333333  0.777778 -0.277778  0.777778
+-0.222222  0.833333 -0.277778  0.833333 -0.277778  0.777778 -0.222222  0.833333 -0.277778  0.777778 -0.222222  0.777778
+-0.166667  0.833333 -0.222222  0.833333 -0.222222  0.777778 -0.166667  0.833333 -0.222222  0.777778 -0.166667  0.777778
+-0.111111  0.833333 -0.166667  0.833333 -0.166667  0.777778 -0.111111  0.833333 -0.166667  0.777778 -0.111111  0.777778
+-0.055556  0.833333 -0.111111  0.833333 -0.111111  0.777778 -0.055556  0.833333 -0.111111  0.777778 -0.055556  0.777778
+ 0.000000  0.833333 -0.055556  0.833333 -0.055556  0.777778  0.000000  0.833333 -0.055556  0.777778  0.000000  0.777778
+ 0.055556  0.833333  0.000000  0.833333  0.000000  0.777778  0.055556  0.833333  0.000000  0.777778  0.055556  0.777778
+ 0.111111  0.833333  0.055556  0.833333  0.055556  0.777778  0.111111  0.833333  0.055556  0.777778  0.111111  0.777778
+ 0.166667  0.833333  0.111111  0.833333  0.111111  0.777778  0.166667  0.833333  0.111111  0.777778  0.166667  0.777778
+ 0.222222  0.833333  0.166667  0.833333  0.166667  0.777778  0.222222  0.833333  0.166667  0.777778  0.222222  0.777778
+ 0.277778  0.833333  0.222222  0.833333  0.222222  0.777778  0.277778  0.833333  0.222222  0.777778  0.277778  0.777778
+ 0.333333  0.833333  0.277778  0.833333  0.277778  0.777778  0.333333  0.833333  0.277778  0.777778  0.333333  0.777778
+ 0.388889  0.833333  0.333333  0.833333  0.333333  0.777778  0.388889  0.833333  0.333333  0.777778  0.388889  0.777778
+ 0.444444  0.833333  0.388889  0.833333  0.388889  0.777778  0.444444  0.833333  0.388889  0.777778  0.444444  0.777778
+ 0.500000  0.833333  0.444444  0.833333  0.444444  0.777778  0.500000  0.833333  0.444444  0.777778  0.500000  0.777778
+ 0.555556  0.833333  0.500000  0.833333  0.500000  0.777778  0.555556  0.833333  0.500000  0.777778  0.555556  0.777778
+ 0.611111  0.833333  0.555556  0.833333  0.555556  0.777778  0.611111  0.833333  0.555556  0.777778  0.611111  0.777778
+ 0.666667  0.833333  0.611111  0.833333  0.611111  0.777778  0.666667  0.833333  0.611111  0.777778  0.666667  0.777778
+ 0.722222  0.833333  0.666667  0.833333  0.666667  0.777778  0.722222  0.833333  0.666667  0.777778  0.722222  0.777778
+ 0.777778  0.833333  0.722222  0.833333  0.722222  0.777778  0.777778  0.833333  0.722222  0.777778  0.777778  0.777778
+ 0.833333  0.833333  0.777778  0.833333  0.777778  0.777778  0.833333  0.833333  0.777778  0.777778  0.833333  0.777778
+ 0.888889  0.833333  0.833333  0.833333  0.833333  0.777778  0.888889  0.833333  0.833333  0.777778  0.888889  0.777778
+ 0.944444  0.833333  0.888889  0.833333  0.888889  0.777778  0.944444  0.833333  0.888889  0.777778  0.944444  0.777778
+ 1.000000  0.833333  0.944444  0.833333  0.944444  0.777778  1.000000  0.833333  0.944444  0.777778  1.000000  0.777778
+-0.944444  0.888889 -1.000000  0.888889 -1.000000  0.833333 -0.944444  0.888889 -1.000000  0.833333 -0.944444  0.833333
+-0.888889  0.888889 -0.944444  0.888889 -0.944444  0.833333 -0.888889  0.888889 -0.944444  0.833333 -0.888889  0.833333
+-0.833333  0.888889 -0.888889  0.888889 -0.888889  0.833333 -0.833333  0.888889 -0.888889  0.833333 -0.833333  0.833333
+-0.777778  0.888889 -0.833333  0.888889 -0.833333  0.833333 -0.777778  0.888889 -0.833333  0.833333 -0.777778  0.833333
+-0.722222  0.888889 -0.777778  0.888889 -0.777778  0.833333 -0.722222  0.888889 -0.777778  0.833333 -0.722222  0.833333
+-0.666667  0.888889 -0.722222  0.888889 -0.722222  0.833333 -0.666667  0.888889 -0.722222  0.833333 -0.666667  0.833333
+-0.611111  0.888889 -0.666667  0.888889 -0.666667  0.833333 -0.611111  0.888889 -0.666667  0.833333 -0.611111  0.833333
+-0.555556  0.888889 -0.611111  0.888889 -0.611111  0.833333 -0.555556  0.888889 -0.611111  0.833333 -0.555556  0.833333
+-0.500000  0.888889 -0.555556  0.888889 -0.555556  0.833333 -0.500000  0.888889 -0.555556  0.833333 -0.500000  0.833333
+-0.444444  0.888889 -0.500000  0.888889 -0.500000  0.833333 -0.444444  0.888889 -0.500000  0.833333 -0.444444  0.833333
+-0.388889  0.888889 -0.444444  0.888889 -0.444444  0.833333 -0.388889  0.888889 -0.444444  0.833333 -0.388889  0.833333
+-0.333333  0.888889 -0.388889  0.888889 -0.388889  0.833333 -0.333333  0.888889 -0.388889  0.833333 -0.333333  0.833333
+-0.277778  0.888889 -0.333333  0.888889 -0.333333  0.833333 -0.277778  0.888889 -0.333333  0.833333 -0.277778  0.833333
+-0.222222  0.888889 -0.277778  0.888889 -0.277778  0.833333 -0.222222  0.888889 -0.277778  0.833333 -0.222222  0.833333
+-0.166667  0.888889 -0.222222  0.888889 -0.222222  0.833333 -0.166667  0.888889 -0.222222  0.833333 -0.166667  0.833333
+-0.111111  0.888889 -0.166667  0.888889 -0.166667  0.833333 -0.111111  0.888889 -0.166667  0.833333 -0.111111  0.833333
+-0.055556  0.888889 -0.111111  0.888889 -0.111111  0.833333 -0.055556  0.888889 -0.111111  0.833333 -0.055556  0.833333
+ 0.000000  0.888889 -0.055556  0.888889 -0.055556  0.833333  0.000000  0.888889 -0.055556  0.833333  0.000000  0.833333
+ 0.055556  0.888889  0.000000  0.888889  0.000000  0.833333  0.055556  0.888889  0.000000  0.833333  0.055556  0.833333
+ 0.111111  0.888889  0.055556  0.888889  0.055556  0.833333  0.111111  0.888889  0.055556  0.833333  0.111111  0.833333
+ 0.166667  0.888889  0.111111  0.888889  0.111111  0.833333  0.166667  0.888889  0.111111  0.833333  0.166667  0.833333
+ 0.222222  0.888889  0.166667  0.888889  0.166667  0.833333  0.222222  0.888889  0.166667  0.833333  0.222222  0.833333
+ 0.277778  0.888889  0.222222  0.888889  0.222222  0.833333  0.277778  0.888889  0.222222  0.833333  0.277778  0.833333
+ 0.333333  0.888889  0.277778  0.888889  0.277778  0.833333  0.333333  0.888889  0.277778  0.833333  0.333333  0.833333
+ 0.388889  0.888889  0.333333  0.888889  0.333333  0.833333  0.388889  0.888889  0.333333  0.833333  0.388889  0.833333
+ 0.444444  0.888889  0.388889  0.888889  0.388889  0.833333  0.444444  0.888889  0.388889  0.833333  0.444444  0.833333
+ 0.500000  0.888889  0.444444  0.888889  0.444444  0.833333  0.500000  0.888889  0.444444  0.833333  0.500000  0.833333
+ 0.555556  0.888889  0.500000  0.888889  0.500000  0.833333  0.555556  0.888889  0.500000  0.833333  0.555556  0.833333
+ 0.611111  0.888889  0.555556  0.888889  0.555556  0.833333  0.611111  0.888889  0.555556  0.833333  0.611111  0.833333
+ 0.666667  0.888889  0.611111  0.888889  0.611111  0.833333  0.666667  0.888889  0.611111  0.833333  0.666667  0.833333
+ 0.722222  0.888889  0.666667  0.888889  0.666667  0.833333  0.722222  0.888889  0.666667  0.833333  0.722222  0.833333
+ 0.777778  0.888889  0.722222  0.888889  0.722222  0.833333  0.777778  0.888889  0.722222  0.833333  0.777778  0.833333
+ 0.833333  0.888889  0.777778  0.888889  0.777778  0.833333  0.833333  0.888889  0.777778  0.833333  0.833333  0.833333
+ 0.888889  0.888889  0.833333  0.888889  0.833333  0.833333  0.888889  0.888889  0.833333  0.833333  0.888889  0.833333
+ 0.944444  0.888889  0.888889  0.888889  0.888889  0.833333  0.944444  0.888889  0.888889  0.833333  0.944444  0.833333
+ 1.000000  0.888889  0.944444  0.888889  0.944444  0.833333  1.000000  0.888889  0.944444  0.833333  1.000000  0.833333
+-0.944444  0.944444 -1.000000  0.944444 -1.000000  0.888889 -0.944444  0.944444 -1.000000  0.888889 -0.944444  0.888889
+-0.888889  0.944444 -0.944444  0.944444 -0.944444  0.888889 -0.888889  0.944444 -0.944444  0.888889 -0.888889  0.888889
+-0.833333  0.944444 -0.888889  0.944444 -0.888889  0.888889 -0.833333  0.944444 -0.888889  0.888889 -0.833333  0.888889
+-0.777778  0.944444 -0.833333  0.944444 -0.833333  0.888889 -0.777778  0.944444 -0.833333  0.888889 -0.777778  0.888889
+-0.722222  0.944444 -0.777778  0.944444 -0.777778  0.888889 -0.722222  0.944444 -0.777778  0.888889 -0.722222  0.888889
+-0.666667  0.944444 -0.722222  0.944444 -0.722222  0.888889 -0.666667  0.944444 -0.722222  0.888889 -0.666667  0.888889
+-0.611111  0.944444 -0.666667  0.944444 -0.666667  0.888889 -0.611111  0.944444 -0.666667  0.888889 -0.611111  0.888889
+-0.555556  0.944444 -0.611111  0.944444 -0.611111  0.888889 -0.555556  0.944444 -0.611111  0.888889 -0.555556  0.888889
+-0.500000  0.944444 -0.555556  0.944444 -0.555556  0.888889 -0.500000  0.944444 -0.555556  0.888889 -0.500000  0.888889
+-0.444444  0.944444 -0.500000  0.944444 -0.500000  0.888889 -0.444444  0.944444 -0.500000  0.888889 -0.444444  0.888889
+-0.388889  0.944444 -0.444444  0.944444 -0.444444  0.888889 -0.388889  0.944444 -0.444444  0.888889 -0.388889  0.888889
+-0.333333  0.944444 -0.388889  0.944444 -0.388889  0.888889 -0.333333  0.944444 -0.388889  0.888889 -0.333333  0.888889
+-0.277778  0.944444 -0.333333  0.944444 -0.333333  0.888889 -0.277778  0.944444 -0.333333  0.888889 -0.277778  0.888889
+-0.222222  0.944444 -0.277778  0.944444 -0.277778  0.888889 -0.222222  0.944444 -0.277778  0.888889 -0.222222  0.888889
+-0.166667  0.944444 -0.222222  0.944444 -0.222222  0.888889 -0.166667  0.944444 -0.222222  0.888889 -0.166667  0.888889
+-0.111111  0.944444 -0.166667  0.944444 -0.166667  0.888889 -0.111111  0.944444 -0.166667  0.888889 -0.111111  0.888889
+-0.055556  0.944444 -0.111111  0.944444 -0.111111  0.888889 -0.055556  0.944444 -0.111111  0.888889 -0.055556  0.888889
+ 0.000000  0.944444 -0.055556  0.944444 -0.055556  0.888889  0.000000  0.944444 -0.055556  0.888889  0.000000  0.888889
+ 0.055556  0.944444  0.000000  0.944444  0.000000  0.888889  0.055556  0.944444  0.000000  0.888889  0.055556  0.888889
+ 0.111111  0.944444  0.055556  0.944444  0.055556  0.888889  0.111111  0.944444  0.055556  0.888889  0.111111  0.888889
+ 0.166667  0.944444  0.111111  0.944444  0.111111  0.888889  0.166667  0.944444  0.111111  0.888889  0.166667  0.888889
+ 0.222222  0.944444  0.166667  0.944444  0.166667  0.888889  0.222222  0.944444  0.166667  0.888889  0.222222  0.888889
+ 0.277778  0.944444  0.222222  0.944444  0.222222  0.888889  0.277778  0.944444  0.222222  0.888889  0.277778  0.888889
+ 0.333333  0.944444  0.277778  0.944444  0.277778  0.888889  0.333333  0.944444  0.277778  0.888889  0.333333  0.888889
+ 0.388889  0.944444  0.333333  0.944444  0.333333  0.888889  0.388889  0.944444  0.333333  0.888889  0.388889  0.888889
+ 0.444444  0.944444  0.388889  0.944444  0.388889  0.888889  0.444444  0.944444  0.388889  0.888889  0.444444  0.888889
+ 0.500000  0.944444  0.444444  0.944444  0.444444  0.888889  0.500000  0.944444  0.444444  0.888889  0.500000  0.888889
+ 0.555556  0.944444  0.500000  0.944444  0.500000  0.888889  0.555556  0.944444  0.500000  0.888889  0.555556  0.888889
+ 0.611111  0.944444  0.555556  0.944444  0.555556  0.888889  0.611111  0.944444  0.555556  0.888889  0.611111  0.888889
+ 0.666667  0.944444  0.611111  0.944444  0.611111  0.888889  0.666667  0.944444  0.611111  0.888889  0.666667  0.888889
+ 0.722222  0.944444  0.666667  0.944444  0.666667  0.888889  0.722222  0.944444  0.666667  0.888889  0.722222  0.888889
+ 0.777778  0.944444  0.722222  0.944444  0.722222  0.888889  0.777778  0.944444  0.722222  0.888889  0.777778  0.888889
+ 0.833333  0.944444  0.777778  0.944444  0.777778  0.888889  0.833333  0.944444  0.777778  0.888889  0.833333  0.888889
+ 0.888889  0.944444  0.833333  0.944444  0.833333  0.888889  0.888889  0.944444  0.833333  0.888889  0.888889  0.888889
+ 0.944444  0.944444  0.888889  0.944444  0.888889  0.888889  0.944444  0.944444  0.888889  0.888889  0.944444  0.888889
+ 1.000000  0.944444  0.944444  0.944444  0.944444  0.888889  1.000000  0.944444  0.944444  0.888889  1.000000  0.888889
+-0.944444  1.000000 -1.000000  1.000000 -1.000000  0.944444 -0.944444  1.000000 -1.000000  0.944444 -0.944444  0.944444
+-0.888889  1.000000 -0.944444  1.000000 -0.944444  0.944444 -0.888889  1.000000 -0.944444  0.944444 -0.888889  0.944444
+-0.833333  1.000000 -0.888889  1.000000 -0.888889  0.944444 -0.833333  1.000000 -0.888889  0.944444 -0.833333  0.944444
+-0.777778  1.000000 -0.833333  1.000000 -0.833333  0.944444 -0.777778  1.000000 -0.833333  0.944444 -0.777778  0.944444
+-0.722222  1.000000 -0.777778  1.000000 -0.777778  0.944444 -0.722222  1.000000 -0.777778  0.944444 -0.722222  0.944444
+-0.666667  1.000000 -0.722222  1.000000 -0.722222  0.944444 -0.666667  1.000000 -0.722222  0.944444 -0.666667  0.944444
+-0.611111  1.000000 -0.666667  1.000000 -0.666667  0.944444 -0.611111  1.000000 -0.666667  0.944444 -0.611111  0.944444
+-0.555556  1.000000 -0.611111  1.000000 -0.611111  0.944444 -0.555556  1.000000 -0.611111  0.944444 -0.555556  0.944444
+-0.500000  1.000000 -0.555556  1.000000 -0.555556  0.944444 -0.500000  1.000000 -0.555556  0.944444 -0.500000  0.944444
+-0.444444  1.000000 -0.500000  1.000000 -0.500000  0.944444 -0.444444  1.000000 -0.500000  0.944444 -0.444444  0.944444
+-0.388889  1.000000 -0.444444  1.000000 -0.444444  0.944444 -0.388889  1.000000 -0.444444  0.944444 -0.388889  0.944444
+-0.333333  1.000000 -0.388889  1.000000 -0.388889  0.944444 -0.333333  1.000000 -0.388889  0.944444 -0.333333  0.944444
+-0.277778  1.000000 -0.333333  1.000000 -0.333333  0.944444 -0.277778  1.000000 -0.333333  0.944444 -0.277778  0.944444
+-0.222222  1.000000 -0.277778  1.000000 -0.277778  0.944444 -0.222222  1.000000 -0.277778  0.944444 -0.222222  0.944444
+-0.166667  1.000000 -0.222222  1.000000 -0.222222  0.944444 -0.166667  1.000000 -0.222222  0.944444 -0.166667  0.944444
+-0.111111  1.000000 -0.166667  1.000000 -0.166667  0.944444 -0.111111  1.000000 -0.166667  0.944444 -0.111111  0.944444
+-0.055556  1.000000 -0.111111  1.000000 -0.111111  0.944444 -0.055556  1.000000 -0.111111  0.944444 -0.055556  0.944444
+ 0.000000  1.000000 -0.055556  1.000000 -0.055556  0.944444  0.000000  1.000000 -0.055556  0.944444  0.000000  0.944444
+ 0.055556  1.000000  0.000000  1.000000  0.000000  0.944444  0.055556  1.000000  0.000000  0.944444  0.055556  0.944444
+ 0.111111  1.000000  0.055556  1.000000  0.055556  0.944444  0.111111  1.000000  0.055556  0.944444  0.111111  0.944444
+ 0.166667  1.000000  0.111111  1.000000  0.111111  0.944444  0.166667  1.000000  0.111111  0.944444  0.166667  0.944444
+ 0.222222  1.000000  0.166667  1.000000  0.166667  0.944444  0.222222  1.000000  0.166667  0.944444  0.222222  0.944444
+ 0.277778  1.000000  0.222222  1.000000  0.222222  0.944444  0.277778  1.000000  0.222222  0.944444  0.277778  0.944444
+ 0.333333  1.000000  0.277778  1.000000  0.277778  0.944444  0.333333  1.000000  0.277778  0.944444  0.333333  0.944444
+ 0.388889  1.000000  0.333333  1.000000  0.333333  0.944444  0.388889  1.000000  0.333333  0.944444  0.388889  0.944444
+ 0.444444  1.000000  0.388889  1.000000  0.388889  0.944444  0.444444  1.000000  0.388889  0.944444  0.444444  0.944444
+ 0.500000  1.000000  0.444444  1.000000  0.444444  0.944444  0.500000  1.000000  0.444444  0.944444  0.500000  0.944444
+ 0.555556  1.000000  0.500000  1.000000  0.500000  0.944444  0.555556  1.000000  0.500000  0.944444  0.555556  0.944444
+ 0.611111  1.000000  0.555556  1.000000  0.555556  0.944444  0.611111  1.000000  0.555556  0.944444  0.611111  0.944444
+ 0.666667  1.000000  0.611111  1.000000  0.611111  0.944444  0.666667  1.000000  0.611111  0.944444  0.666667  0.944444
+ 0.722222  1.000000  0.666667  1.000000  0.666667  0.944444  0.722222  1.000000  0.666667  0.944444  0.722222  0.944444
+ 0.777778  1.000000  0.722222  1.000000  0.722222  0.944444  0.777778  1.000000  0.722222  0.944444  0.777778  0.944444
+ 0.833333  1.000000  0.777778  1.000000  0.777778  0.944444  0.833333  1.000000  0.777778  0.944444  0.833333  0.944444
+ 0.888889  1.000000  0.833333  1.000000  0.833333  0.944444  0.888889  1.000000  0.833333  0.944444  0.888889  0.944444
+ 0.944444  1.000000  0.888889  1.000000  0.888889  0.944444  0.944444  1.000000  0.888889  0.944444  0.944444  0.944444
+ 1.000000  1.000000  0.944444  1.000000  0.944444  0.944444  1.000000  1.000000  0.944444  0.944444  1.000000  0.944444
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/input.txt b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/input.txt
new file mode 100644 (file)
index 0000000..4777a11
--- /dev/null
@@ -0,0 +1,444 @@
+# Zero
+0x00000000 0x80000000
+# One
+0x3F800000 0xBF800000
+# Infinity
+0x7F800000 0xFF800000
+# Largest number less than one
+0x3F7FFFFF 0xBF7FFFFF
+# Smallest number greater than one
+0x3F800001 0xBF800001
+# Pi
+0x40490FDB 0xC0490FDB
+# Random values
+0x07AFC3A1 0x64E79E95 0x19FE2471 0x2C9DB77E 0x2E493787 0x113BD6FB 0x301FB86B 0x213173BE 0x05AC27AA 0x709578E1 0x50AFD1F0 0x3046495C
+0x28ECDDD1 0x69F73F5B 0x3669D464 0x3E49F1A5 0x65357EE5 0x7A464B87 0x5B5C6066 0x2D0F9171 0x6BC4B2BE 0x2E6278B5 0x3106D28B 0x0A0BD697
+0x1647B840 0x70B42FAE 0x1BFD1DFC 0x7BFF652C 0x6575BA6F 0x0072CC2C 0x16B7C1ED 0x6D257E10 0x655A6AC1 0x30B5E65E 0x19C3358F 0x13A3A249
+0x41F1BD59 0x49E2EDFA 0x34D51607 0x479DE504 0x3A7866DC 0x0584E7F7 0x77E42E60 0x636544AD 0x6F7C2753 0x2E4E02C4 0x21AF3652 0x54B1A638
+0x28944E4B 0x7D0B96B8 0x01C137A9 0x14590109 0x2B6E0F6E 0x32C80A35 0x1E64D7A1 0x41B5C7AE 0x237C39E3 0x3A61F59D 0x3DB52CDA 0x08F1F453
+0x3AD4C1C9 0x546CEEC7 0x76177263 0x202F2C8B 0x0522D525 0x0FDAA7F2 0x33D2CED4 0x4714927F 0x59BD95ED 0x68A7E4DB 0x0EB27783 0x1435FCC9
+0x6E2CCCD3 0x0696A5E3 0x779B4176 0x5DA8F426 0x34E4A8A7 0x194A77C8 0x325A9A5E 0x5D78F6F2 0x16560E80 0x341BD207 0x71D1F7FC 0x41C41DEE
+0x66E3DC3C 0x1036CF9D 0x0379E59C 0x0A601620 0x4A98C53A 0x412F1276 0x13520A73 0x056D8704 0x159C013D 0x09697CD6 0x259CB38F 0x1ABED663
+0x194424C9 0x596F8263 0x61D368E2 0x7301BAB6 0x4217673E 0x7085E065 0x0737B77F 0x30443411 0x771C8648 0x7ED2F8F5 0x0DED2837 0x2C012EEF
+0x181D70BD 0x4047C295 0x097A25E1 0x2E737F3D 0x7463949D 0x7B4C1DDD 0x70379D2C 0x5B4770D9 0x0B82ED7A 0x73B182C8 0x65A786F9 0x561BB2B5
+0x34E0953F 0x78F9916C 0x5B8939B9 0x4A7C967C 0x02630E43 0x0125ED48 0x653B6CDF 0x1BA7330C 0x5A956FAB 0x470ED5C1 0x0EA8EDC2 0x1CACD6E9
+0x3794B626 0x15E0A541 0x4CF10AFB 0x2EB13C6E 0x14B39E36 0x5ADE3332 0x5AB26B5D 0x2CD10EF3 0x1B25F5C8 0x642C913F 0x5B448E30 0x0F898A65
+0x5F78AF1C 0x4B7C2B5C 0x6AD0FB3E 0x6AFB9C97 0x3F2DAE25 0x50788238 0x41174F4C 0x740E4364 0x497213A4 0x1CA08905 0x3E8AD9E0 0x4BD521E7
+0x1DC6764D 0x23C646C0 0x677C54F3 0x785BE5F8 0x6AD51C81 0x762542B5 0x1508BCE1 0x2269D2A8 0x0C05E7F6 0x61F9C7DC 0x511B0F16 0x20B9862C
+0x3CD7FB0F 0x2BCD7A74 0x4D8A951F 0x57FDF0D7 0x0FFA0BB3 0x28CF2350 0x67877B3C 0x6F72BACF 0x744B4EAC 0x5258767A 0x5A6E5766 0x3378FCD1
+0x22D0F8B2 0x1B85A6B2 0x27874035 0x6C430C57 0x38262FB7 0x66121A16 0x38182E3E 0x55ECA604 0x09D860D6 0x1F948332 0x4E488BFC 0x74AD7D57
+0x15B9C5E7 0x635148DE 0x17174FFF 0x21BFADDE 0x454B10BA 0x68325F16 0x4279340A 0x02230BC9 0x13FFD98A 0x1003C92A 0x5A20FCA0 0x23F9E53D
+0x38D2EC7A 0x41A877DC 0x136CA00C 0x2D1E3B26 0x1400EE57 0x6DDAF773 0x609737F8 0x36D1E709 0x09609E25 0x081E782D 0x2314F360 0x4186CDDD
+0x6E309243 0x5B2D219F 0x177373E1 0x7808F319 0x7AC1A4D1 0x65BBFFDE 0x6CB67071 0x107B6AB8 0x490D48BC 0x03CDC070 0x323B1896 0x0E585976
+0x6C001F86 0x74B44CA1 0x107B6540 0x7FFFF910 0x04B815CB 0x6A9C61E0 0x23F9DE4D 0x3D8B0245 0x2C44D9BD 0x37667E5A 0x6AA93D6B 0x4045C814
+0x254175CD 0x4B407563 0x7717AF1D 0x2EA213F2 0x535EED91 0x1A2CA27E 0x7028E1CF 0x418F7FD4 0x7559C41D 0x079C55B1 0x399872EE 0x701B68EE
+0x6D58558F 0x264EE35F 0x0096D3A6 0x36659E4B 0x2A1CA3CF 0x32D1EC3D 0x44BDF7C1 0x161CC356 0x278638DE 0x55395D01 0x161CBC66 0x2C3E4EA9
+0x3FD5BEE2 0x3A169AB4 0x69C950EE 0x6C1A989F 0x717D190E 0x54728E59 0x2C6060B3 0x16BE8EDB 0x1FB303BD 0x23780FD0 0x4560A2CD 0x7311F14E
+0x3DA4B24E 0x3589849D 0x34A17122 0x32FE766B 0x3D25DA4E 0x6E39E410 0x2319DF59 0x2A7E2FDD 0x1488C76F 0x23B0B300 0x60E3CE28 0x3EA56B3F
+0x56829F3D 0x25A1C5E9 0x54C22E95 0x7E08D81B 0x7ADB22EB 0x6ADEEAFB 0x2A4726C4 0x3AB0E1CD 0x24F585AF 0x141077B2 0x26CB7A6C 0x16729EBD
+0x6883060B 0x532BDB1F 0x2D312D98 0x083609C8 0x76A3EAEF 0x7291D066 0x7B47FB16 0x34489D3E 0x281B5503 0x2FE96C39 0x674713A9 0x65412F51
+0x1E235049 0x0A60F303 0x0FBF5F2E 0x32AC17B9 0x2E11A603 0x70A32D56 0x715182F8 0x04944540 0x1644F33F 0x4613B18D 0x029D1D5B 0x1120162A
+0x30F29C88 0x2CE4441F 0x4BD0F7F7 0x55E82238 0x40F4BBD1 0x729C7263 0x6C5AC0F5 0x2977C1DC 0x45C84D82 0x198BEE8E 0x31ADCBA5 0x3C6C3872
+0x0C1DBEF4 0x2CF5C6BB 0x70B4D5B0 0x343913F7 0x5CDF32F4 0x57FBE959 0x197A4348 0x7B02833E 0x625CDC5C 0x2939A276 0x2DAE9AF7 0x106E825F
+0x19DCCFCC 0x1F001DEF 0x1502C79F 0x3021C30B 0x6513CF7C 0x179FE4FA 0x4141D936 0x16066C04 0x44842919 0x0D12D12D 0x6BEE8E3C 0x0578E4EA
+0x7FAF4391 0x58494F32 0x2EF0A6C7 0x45779113 0x71D53DC0 0x609E726C 0x01E3C985 0x7DF2FCB4 0x0D943927 0x72989F35 0x322C10AB 0x6A736C1C
+0x4A94888F 0x4BA653F3 0x6575EF5A 0x2CF164EB 0x74DFF669 0x13248A51 0x3D5FE74B 0x0EBCC635 0x3224A840 0x5262AEEA 0x3EDE8940 0x173877BC
+0x6A0293E5 0x00206276 0x2D3EE3C0 0x2E86BCFE 0x0D3333A4 0x192D71FD 0x33FFA1E9 0x0CE27735 0x7176C12F 0x62F048B0 0x525A0848 0x634BFEEF
+0x438EBB1C 0x543DD1CE 0x613EFBA3 0x5122F443 0x46D67103 0x136B0C4E 0x3B96605F 0x116AF992 0x5F116041 0x210C4FB9 0x3E5C5E7E 0x53F156AA
+0x3430DA0A 0x7BBC45C9 0x62AE1CDF 0x6655824A 0x4E1EF4B3 0x218CA61F 0x7D8DFA06 0x38218898 0x21AD0896 0x2ACCDDC7 0x66A84597 0x2EE03C3A
+0x43FA4FC4 0x1AA7E780 0x3BC2B36F 0x357110F3 0x7D983030 0x0E1CBBB7 0x18BD0FE2 0x4126EB4C 0x625A8D85 0x79FC0B85 0x1249DF8F 0x2930FE89
+0x0D6717D3 0x4DE03FEF 0x3A9BF81B 0x6C787814 0x6EEC8FA8 0x78F85699 0x4069CEBE 0x231D69B3 0x74B49C62 0x2317EB9D 0x0972EBFD 0x42D39116
+0x44A491BC 0x0700E604 0x7AF519AE 0x66519A52 0x31CDC3CB 0x619D5F45 0x1531D68C 0x75C8138F 0x7C4546C5 0x50F489FB 0x2B392482 0x79DD76F5
+0x5F1145B3 0x43F63464 0x3B046241 0x416BD338 0x3DF23FE9 0x4D4E41D1 0x6A9CD1C1 0x4B5957BC 0x1B2E81C0 0x2538C9DD 0x37D1CFD0 0x0A1B1168
+0x1E312076 0x783B9E8E 0x2D387B1B 0x12E5BCD9 0x1B538A2B 0x36AB6719 0x55B94DEF 0x5FF81BE7 0x3DAC4D1D 0x50AE679D 0x4649B63A 0x6F7A10E8
+0x324BC6E3 0x5B7B8CC6 0x65422477 0x2E910DA8 0x2C7016C2 0x107B48F9 0x286E849E 0x0B815C75 0x54717D5D 0x6372E6DF 0x4CED2FAD 0x1263BD46
+0x30C128B0 0x378A016F 0x5DBD1502 0x4BEFAA70 0x5CC2CB4C 0x158EE4D2 0x560ABBD9 0x7AF3EBC2 0x0DCA8360 0x034336F4 0x0DD9A89B 0x291E0D8B
+0x39EE9E0D 0x6392F68A 0x09162972 0x779AEB2A 0x34415E28 0x4F5FDFAC 0x6714FC12 0x668D250B 0x2ADB6C73 0x4C572089 0x151E32B3 0x574B8335
+0x5CD26982 0x3D8CB751 0x62CCDFAA 0x3143E6DF 0x20FF9E31 0x2FBA0F57 0x43A7A425 0x51C0C6E1 0x674410C6 0x2164B927 0x1DB07152 0x4406DC12
+0x36F39DF9 0x73BB2D2B 0x3EFAC7D5 0x44BE2159 0x76FE641F 0x4CD47070 0x6DDC2EE4 0x30ED022D 0x306766FB 0x76F25857 0x2887ED57 0x64A8C523
+0x46523803 0x0F9CE96A 0x4B35EA2E 0x712DA476 0x5BF409F3 0x60541CE1 0x487927AB 0x38C67376 0x1DE0D433 0x2B460755 0x6A0A5A55 0x3EE07264
+0x5B0016AD 0x2DB1FE7B 0x10A13945 0x42442773 0x4F16B7A2 0x2E51AA97 0x064B0386 0x060A559C 0x220CD7C2 0x4545CB5B 0x4AC876F5 0x190B3BE2
+0x121A3BCB 0x38A4A5DA 0x49F83E0F 0x4281A2C6 0x2F96FE31 0x72802B66 0x272A67E9 0x75E93634 0x021D14D0 0x72605217 0x6716DAAB 0x5E111EC4
+0x52B46EF9 0x2F900256 0x16D7923A 0x7095432C 0x5AD609AC 0x00E1EC8F 0x2F75B590 0x35D62059 0x2E93EB0A 0x4016EED5 0x781A47CC 0x7DAAA2AD
+0x6E68996D 0x7E654B52 0x03B4F849 0x1075712F 0x43AB16AD 0x4E7D6F3E 0x2980AD11 0x55C55279 0x07221518 0x7378EB20 0x1846F53F 0x36B91349
+0x65F91687 0x3F715D29 0x2CA2497E 0x68162B57 0x31D1AF40 0x13B92429 0x46274A1B 0x04861E39 0x4349267F 0x5CFEDC55 0x751B6165 0x1E1F302B
+0x5DE0C8E5 0x249116F5 0x53F55084 0x0C74B3EF 0x64A805CB 0x4C0F9851 0x0A1F569C 0x53109F38 0x4A74E3A3 0x0DD44EE5 0x63861067 0x0E1FFA51
+0x5C51BE24 0x0D06BD79 0x63E54CCA 0x6373D33C 0x007FA899 0x7C2C4209 0x1A2CE686 0x6678BF20 0x3B9D9F32 0x46CF3004 0x4E8EEA78 0x6D6F4E73
+0x5A88542D 0x14B63493 0x71F56CAC 0x1DD17AAC 0x71B510E9 0x6710CE12 0x3BF0AAD8 0x4F95D9CE 0x0BA1E507 0x0FE5FB5C 0x5C0A8DBD 0x7049EAD2
+0x5BF593AD 0x6629E45A 0x435A8A0A 0x266A7751 0x73FE333F 0x26E09A72 0x348A71A2 0x504FF163 0x33E757EB 0x186FBE6C 0x33C3C4A0 0x34670084
+0x149C0075 0x4DF0AB26 0x1ADFBFA5 0x50399FA8 0x14BFDB2A 0x696EAA1D 0x3DA8EE1B 0x6F482F57 0x7E24DEB0 0x2F9E5AC7 0x0D19AA03 0x6FD9EF99
+0x16AF28D9 0x490A54DB 0x3F6FC967 0x22510DE1 0x58F05038 0x1B7A5725 0x129AF8B3 0x34E5E3E5 0x01A43B7F 0x55F582BE 0x5B505B36 0x75A26EBE
+0x7CD61D30 0x0FDACCD8 0x45F26022 0x30BD751B 0x284A8B44 0x79B624C2 0x6524759F 0x3CE68BBA 0x47A6CFE8 0x00043544 0x0D202B62 0x5C66AB12
+0x6972DF61 0x4AC9197D 0x4BAEDA69 0x6797BE12 0x7A677444 0x58C8846C 0x5771ADAB 0x11169D1E 0x21D2D948 0x16E17713 0x3367AAFF 0x7AC32980
+0x325BCE38 0x4602A3B2 0x2FA90D65 0x340009B7 0x1BF82670 0x0AF9689C 0x29A27875 0x18CE43A0 0x1AD43574 0x6F94D897 0x498BB8BB 0x431EC0B9
+0x694AFD59 0x2EB02E5B 0x00054C73 0x30F1CD41 0x2EB4639F 0x0D2577D5 0x0D587853 0x18274301 0x57EE9152 0x590752BC 0x7FBF0113 0x52560596
+0x31CFD729 0x5730AEBE 0x636CA2B4 0x53A2B071 0x6E1225D1 0x16D44DB3 0x4E65D9F1 0x206DF409 0x5CD6F166 0x7E0EE756 0x546DFDC0 0x78CF17D6
+0x09084FF2 0x7E107636 0x119D5B77 0x23DC8567 0x6DA54ECD 0x5B291432 0x66FB4620 0x56F04C27 0x09D9428D 0x67009293 0x07E21968 0x388DA62D
+0x74260A68 0x153A91BC 0x50B4E92E 0x4C149BBA 0x6E41E478 0x5073EA41 0x1E6AA150 0x2011BBA1 0x27A498FF 0x01D74405 0x73B46C12 0x15B6BED1
+0x18AB91B8 0x421A4603 0x3624B2DA 0x7582831E 0x40292D5A 0x0A92B09B 0x6E519AF5 0x49317D4C 0x08A326D1 0x7FEEF66C 0x6D0E02B3 0x7648759E
+0x5B180A9E 0x540948D3 0x4D38C1C5 0x64F14D2C 0x3B09DB66 0x551ADB2E 0x1D7EF359 0x2F2FE5CE 0x6A556CEA 0x6E33DC87 0x7B448188 0x58975162
+0x3EA7C6C8 0x19AF22D9 0x78A90D04 0x664C5FC7 0x1B8666DE 0x6C5D7916 0x7C031E98 0x3431F896 0x2E77BF1A 0x3227D173 0x29B47BB5 0x6EA0EC74
+0x3CBA820E 0x180616AA 0x37D269C0 0x455DA8DF 0x17F50D16 0x24E06C74 0x3BA61E7D 0x730D17B4 0x78E9B547 0x08DEE043 0x57FE64E0 0x33F390AE
+0x5DF9BB71 0x757D5839 0x6323767C 0x484F285B 0x63B134C0 0x5E67F805 0x20E679BD 0x2258FB88 0x78171ADE 0x198F86C1 0x08A55B50 0x139D81BC
+0x05ECFFD8 0x04A879E8 0x47CF7A52 0x3464BEF2 0x36D04B5B 0x7183F607 0x2305AB66 0x738ACD69 0x098A0CB1 0x5AD81526 0x38E87648 0x217F19C7
+0x7FB8819A 0x748E94C6 0x148C317C 0x78A236E2 0x7D6D7509 0x6C8A965C 0x2C95C790 0x5B67307A 0x6207EE96 0x0FB93E0C 0x23B658D5 0x45B92356
+0x6E213611 0x449CD292 0x68121EDF 0x663850EF 0x5E2C5954 0x70B77A2F 0x79D5D2AB 0x6419592C 0x755FF417 0x41A54CFE 0x187E181E 0x2C303F73
+0x33294305 0x3B83C384 0x1FBB0CDC 0x3CB34FB7 0x165BD8AA 0x58A38325 0x5E32697E 0x16145A45 0x4D3217EB 0x72BE9AFA 0x0EB69127 0x4A9F8CF4
+0x5F493157 0x3B4C58B7 0x2606BD6E 0x41511FED 0x4B0596C3 0x49BD1643 0x070A4343 0x3926CCD5 0x0E59E8D5 0x6F1C6222 0x1F5F1DC4 0x6C864229
+0x5FD3DC51 0x1934F070 0x509F9B55 0x5533D069 0x5ADA3D6E 0x691DB373 0x01640FDC 0x0E038073 0x24A176F7 0x211F1CB8 0x4AB6D02A 0x3AFD4FA2
+0x79C29FDD 0x28E939A9 0x5111A9E7 0x46F4B7C8 0x1BA7D4A3 0x5FC83B0E 0x119444BC 0x7AF105FA 0x1B1493C5 0x379B022A 0x3C4225E7 0x661A2A88
+0x0158186D 0x434C692B 0x1F40F75D 0x0FB20143 0x3268CB4D 0x3EA01522 0x7C38436C 0x123CA79F 0x57D50592 0x4CD7DEC2 0x67707808 0x32AF4300
+0x35F59235 0x68D487E4 0x40B2C373 0x5A97092D 0x09F3A49C 0x0B69939E 0x159458CF 0x03B6447A 0x3452CD47 0x66A602B6 0x4AAAFC42 0x4FFAA1EA
+0x466E3DC4 0x5C3F40FF 0x4AEBA7E5 0x6182D189 0x13DA4329 0x072DCDCC 0x479CFC11 0x15325B97 0x4A7A36F7 0x66DDF36F 0x24E45CDA 0x7CE30245
+0x257E0891 0x211CA046 0x0F1FA9E4 0x7D530E23 0x6DF47F08 0x769021EC 0x30025123 0x23EA113E 0x5F64A9D0 0x70B51496 0x7E811A6B 0x69584E6C
+0x7C1EA834 0x1415733A 0x6D0E92E6 0x3071757B 0x7ABB75F0 0x37B98F29 0x006C1766 0x4129B3B4 0x13F8D028 0x4B57BF4B 0x22AC853D 0x27D31351
+0x52858D17 0x6A49814E 0x3D056EE8 0x1CFFC40F 0x512774BD 0x61E9CBC2 0x19E2C654 0x76A57D4E 0x03066C09 0x29027038 0x73F88B71 0x70FAEB11
+0x1F929224 0x23FADC94 0x14E4FC4F 0x7EF73BF4 0x14AFF12B 0x136616BA 0x684F8A60 0x10CE995F 0x277B89F4 0x555E1D47 0x41400EDB 0x2236FFE4
+0x0D17AC70 0x41AC2641 0x6360B398 0x21107C98 0x0D03E58C 0x060D38D5 0x48E38FE9 0x5F8972A3 0x7056BA24 0x05E8FED2 0x7C8936B2 0x417E2EE1
+0x67D2CA94 0x166BFD06 0x3823AC30 0x6AD9369D 0x3F6E6D3E 0x2C1C37A1 0x5BD421AF 0x5F00FF62 0x50171436 0x70B91DFE 0x5DF83B56 0x64C70561
+0x041F34B9 0x4647C5B7 0x75959EC0 0x2B9ABEAD 0x1BA5E2FE 0x36D5AD9B 0x4DD1BE92 0x28BD8F6E 0x7881D3DC 0x3132722A 0x49CE0C06 0x0585B968
+0x373FAB00 0x12B19BEF 0x650F2C0C 0x27966524 0x189A9AC1 0x619862BE 0x69149405 0x006D6556 0x78045FC5 0x21384035 0x6B469BF3 0x3772CD03
+0x4D5477D7 0x471ABDA2 0x1673CC66 0x1D6B8C0D 0x37D3DBA1 0x746C07BC 0x0232916E 0x3BF3105A 0x3AB3CD73 0x77C8302E 0x678DCF07 0x5659B071
+0x2E9DDDCA 0x355F8D99 0x7F173FDF 0x271FB1A6 0x6691FFC4 0x48E54BE5 0x2CA56B0F 0x1DD1AAC4 0x5B96E7D5 0x11B4971B 0x45680FE8 0x74318296
+0x734CF9D9 0x2E7CA3ED 0x749EE7EC 0x6B51599E 0x4FB4E423 0x5FE583E0 0x22C426A2 0x1D095BFA 0x27004182 0x3937F308 0x3A74E807 0x5ED41D23
+0x2DA3FAC4 0x3CA77975 0x1AC72D7D 0x6857C838 0x346FA9A3 0x0254FC85 0x3EB178A9 0x630D876D 0x37B48A1E 0x3DC8B889 0x0A2D3914 0x1E4689E2
+0x06AE046E 0x36D2A423 0x3C1834A6 0x6244EC43 0x48873B3E 0x0180448E 0x56766EDA 0x3BD43517 0x2FFCE87C 0x4B1556C6 0x27258EB6 0x7FB1CC9F
+0x2AFADAA6 0x49E9B558 0x1CBB2899 0x51FB1C29 0x0321A860 0x573010A0 0x30CF394C 0x30C5A324 0x13D78A15 0x4B9666CA 0x191D6B5C 0x484733B8
+0x4DEB634F 0x57CEE406 0x2B54BB26 0x059FED6D 0x15979C8F 0x3581F43A 0x23E67750 0x1C45A0FD 0x6C54985D 0x5FFEABF6 0x7E8A8D41 0x34DBD39B
+0x617EF085 0x5500FC1B 0x70B008B2 0x117BD901 0x201652E1 0x17D59768 0x112DA5A0 0x4B112D88 0x61BF4CC0 0x2DE8CE39 0x1D0C49B1 0x64E0F520
+0x0518DED9 0x4DDB82FD 0x15A69845 0x18F068EE 0x1971E9C7 0x2EC403A1 0x61379CA6 0x675D4D16 0x0692E7A7 0x0C8C57CC 0x6CFD3A84 0x1C2A8436
+0x420E4C06 0x10E3B1D4 0x38702534 0x2E62E463 0x70E25DCA 0x36FAB275 0x633EB7FE 0x52614E4F 0x0BFBAE90 0x53EEC0B1 0x63DD2750 0x2C120171
+0x6BC45819 0x750ACCF0 0x77232EF9 0x4D83A4DA 0x22F39B29 0x142F78AA 0x326499FA 0x280C7A02 0x620AFBA8 0x480B323F 0x40FCE2F0 0x7B7CE56F
+0x76CF35E1 0x22347F97 0x62DA3286 0x7D621D88 0x2EC0D763 0x4FD76D0A 0x198CA1BF 0x70CF236A 0x60BB1EDE 0x51FCC6F3 0x1F3207CD 0x519D7CA8
+0x08F77968 0x0270BFCC 0x23FECAF8 0x14F327F8 0x565F807D 0x07DBF248 0x41052969 0x4223D896 0x7CE6BF39 0x38285863 0x0FA77D70 0x1FDA5A62
+0x4C57D10D 0x420C176B 0x47E6D465 0x2E62CCB5 0x0A1749AA 0x08E3B755 0x29DFB225 0x00E67F8B 0x2B1836EC 0x0CB9E4AB 0x7E489D14 0x59D90E50
+0x5C9151B5 0x17D53ED3 0x4AA831BA 0x3D4C7093 0x69D205C6 0x69DA3987 0x0EE9ED3B 0x72C97F2E 0x6C4AF953 0x32E8B833 0x07BCA726 0x42AA79D0
+0x3AC4AA7C 0x48C1D08F 0x04CE5267 0x37AB69B5 0x00EA28F2 0x1475CFD7 0x5785C417 0x4D41FA00 0x5681E742 0x1F6C987C 0x7BA4C6B5 0x609930ED
+0x28504FD2 0x258478DA 0x617FB078 0x536886BE 0x323E5D85 0x5FC84D8C 0x2D41950E 0x0ECFAF3A 0x779D8C5F 0x77E9C6C8 0x4C1C1FCD 0x616F9225
+0x61C40050 0x5B060D09 0x54391153 0x4E0EF9A3 0x0DEEC53C 0x5BF5B879 0x10B97374 0x48B36FB8 0x24B78909 0x1587C5DB 0x005ED96D 0x25A1B1FB
+0x29FD95B2 0x57E49D85 0x72E3ABFB 0x007F7CF5 0x77513601 0x6E8872B1 0x6118ADE2 0x1FA185D3 0x140CEB8B 0x42985E5A 0x730A0C92 0x464B4911
+0x2260ABE7 0x204BA1A0 0x551AF84B 0x19FE3846 0x18356869 0x21371819 0x7B6DCA6C 0x79F968B9 0x7C3D2522 0x4FA6DBBF 0x4808625C 0x0A2BEA5E
+0x2B9C9439 0x58C1D5D0 0x52DF5A17 0x50541D42 0x6E499BAB 0x533E3384 0x75F5CF3D 0x1847315E 0x2B22D109 0x68D97B39 0x18C6AE53 0x2274070B
+0x5761EDEA 0x79DF5C35 0x42158CDE 0x6B6ED975 0x3C77BA8F 0x351F9970 0x31BA2286 0x5ED86676 0x556B3B11 0x06D51AD2 0x78D69EBD 0x6DA0A37A
+0x280C32EB 0x74446929 0x679A0C33 0x2449580D 0x43EB44E8 0x2FA26E8F 0x2E75426B 0x6F87D921 0x08644460 0x01549C82 0x3FDBF663 0x76ADE00B
+0x5492D007 0x35D1C5A1 0x0EF51169 0x7FB5A110 0x1EAB40DA 0x27BBBFBC 0x2229A81B 0x760D2EC4 0x219B1BF1 0x643F34FA 0x617C0839 0x5E12D681
+0x195ECE6A 0x13362AC0 0x3CEB3CF7 0x6ECA097B 0x1A0B4592 0x35C1DBB4 0x5C6AACF5 0x4217787D 0x2A0644DD 0x4404B928 0x6660D08A 0x6DF189C6
+0x73A727B8 0x14D612F5 0x5D7962E7 0x7C0B6C18 0x162AAF78 0x1D55594B 0x72B94C23 0x6ABD7F7F 0x53271EEC 0x01AE5D8D 0x6A73208F 0x71D25FC6
+0x296A1D49 0x0C9CC8AB 0x67DF8E8A 0x4B05393B 0x70DBFDA5 0x495B96C3 0x29180FBC 0x0A3ACC0F 0x5C91C183 0x66034CB3 0x7904D58B 0x769D0715
+0x1BC52868 0x556F8280 0x38B47F92 0x45CB6D45 0x19743BA9 0x1F15501C 0x33BCF70B 0x0D1B6361 0x33EB6312 0x113659F3 0x0926CF79 0x4A16128A
+0x2E8BB33E 0x7BE01B9C 0x34D39209 0x01B2D22A 0x7D8E7929 0x1F46B298 0x738531F0 0x26F89673 0x2BE37B43 0x5B64C07A 0x71FDCFAE 0x1CBF78E8
+0x24C0573D 0x1B15DF6A 0x26FA44F8 0x015218C1 0x01192C1D 0x1FFF1A83 0x77EF1FD6 0x1CDE5485 0x756E9D03 0x30A39F69 0x62A9C1CB 0x0EE2D8AC
+0x4FB8EF85 0x1666B8D6 0x1BFE3C0D 0x03A45297 0x279D12C9 0x25250B86 0x4DBA6521 0x5628C607 0x21052723 0x028DF72A 0x57DB9831 0x1E93A04C
+0x21D4A9C3 0x4B60CA21 0x458C36BF 0x4DB82506 0x26C58A9B 0x378A066D 0x6A779DEF 0x4B85E1D9 0x529FE5D7 0x1171E2E7 0x4CD7FA9A 0x53B911F5
+0x3170FD6A 0x44C71A70 0x7097667A 0x26DF9A6D 0x756AB9D9 0x53412845 0x35C2731A 0x4523A95F 0x69A7E11C 0x51C0AF27 0x48C7FBF6 0x1144F3E5
+0x76E5BAAE 0x16826118 0x676DB9ED 0x17EAE1D1 0x19105842 0x3F49521E 0x367E821D 0x3AE50205 0x0AAA1C40 0x7C0AB8DD 0x089D270C 0x316FA6DB
+0x3394BF4A 0x7314C4FB 0x7CF588B4 0x0634A522 0x0486A7E2 0x49CD834E 0x59EDB717 0x35F7A54C 0x0E949DBF 0x4A851D91 0x5CD73FB9 0x03FF5798
+0x1DC645D7 0x1299B2D3 0x492300F7 0x076E26F3 0x645A61FB 0x11EAFCEE 0x18B31AD8 0x5B401CA9 0x286D5E06 0x0020D4C5 0x732AFE7A 0x417DB648
+0x3F6A26E4 0x29A98097 0x7C62B84E 0x4A144324 0x25B43974 0x04FFDF5A 0x7B83E9FF 0x5948F8BF 0x7814A455 0x787972B4 0x5F7D9DE1 0x7C9B4C37
+0x4246F602 0x396B54F8 0x3292F183 0x50DB93C1 0x03F07289 0x0F6A313C 0x54DAEB5A 0x21B6B860 0x2203E410 0x1DFDEC51 0x2924DF53 0x065E460B
+0x2FE8E93F 0x41D7FA2C 0x619E62B4 0x58564745 0x41F8CEF1 0x54C9612E 0x19D3FD8E 0x0162F5D5 0x7E72E1C5 0x1636B5DC 0x4B7738F9 0x24271B3A
+0x1B369536 0x46FB22F9 0x7D7013F9 0x134B398B 0x3F7495AD 0x5CEDB1DA 0x0FE685C2 0x01BB8BAF 0x165906D2 0x42797745 0x52971F71 0x1A49795B
+0x51E3A881 0x27720ACB 0x3C0031BC 0x73E78C91 0x456FF71C 0x6525110F 0x7A45D29C 0x7558E05C 0x26FD0B3B 0x5BE43550 0x4DAF27A1 0x68F5DA2D
+0x30AD967E 0x6783252F 0x6A58D002 0x2F207844 0x7DB9DB0B 0x35D008FC 0x5347937E 0x18F07041 0x7CCB2BF5 0x50B7A777 0x2C3BA9CC 0x3C3FC1A2
+0x2DA55951 0x3C222F8E 0x3DFB4D51 0x43FE6023 0x7E9BA6D3 0x10926CC2 0x5E47D97E 0x507F4F55 0x3804778D 0x1A480B3A 0x4466DBE6 0x7D746EAA
+0x7F6D1C4A 0x3EACAE83 0x72CD4F06 0x266A2785 0x1A90E3D3 0x407C76A7 0x0F6001B2 0x4B3E7A52 0x27FF9BD7 0x79B8D1B5 0x7A5EF296 0x25B976E2
+0x2F88DAB1 0x4DA68614 0x3EA9E724 0x2C5406A6 0x1E5E2D8B 0x6AE590F0 0x6893C848 0x4C0386DC 0x2707C07F 0x268F1599 0x1001E6FF 0x25A36752
+0x3721825C 0x6E49C07D 0x7622B6A7 0x6F25F9E9 0x0891CBB8 0x3A89928E 0x6C9A6893 0x07FEE802 0x79364111 0x5F67B799 0x2E690F87 0x13C724E4
+0x1FE42E41 0x3DC9113A 0x5F059F36 0x47E3CA18 0x3781E2EF 0x596491CC 0x6D9D40FA 0x670ABDA0 0x270B17E0 0x2C47281E 0x135EC446 0x4569456B
+0x172CB90F 0x7BF28C8E 0x116CCC47 0x3E34798E 0x2281A227 0x216EB346 0x63D7E0E0 0x59A32483 0x0FB873C4 0x59FA9788 0x48C91E6D 0x184A3F7C
+0x14842A16 0x35638700 0x2049277E 0x0DBA6B27 0x14CB3E9A 0x4EB23705 0x2181900B 0x34AF6CDB 0x0C7B483F 0x00872F42 0x7C9336F3 0x43FD2B2E
+0x59EBC10E 0x6A3077ED 0x2B07E8CE 0x00F6D8EF 0x1677A00C 0x3E66AD14 0x46601E5A 0x2DA4591B 0x3A5939A2 0x57CCEAA2 0x6BD8D2A9 0x5CDADBCA
+0x793B9DE8 0x4FB0B389 0x367E004D 0x08F411AC 0x29AB4B11 0x7F471EBA 0x213E5128 0x3E2F7527 0x34AAA5BB 0x418778A6 0x4BE9E04E 0x4975E455
+0x1039AFAC 0x6D6B705A 0x7E255130 0x1CB4F7EB 0x6DF29F9C 0x7AB88823 0x60B2231A 0x47DE60AA 0x64E90010 0x0BBA0BE8 0x48D53999 0x7B60A01C
+0x4A20B8FD 0x0F3557F4 0x2904F937 0x0479F29F 0x67024296 0x14DDCBE0 0x6154CE69 0x603DE07E 0x648E7F6A 0x17D2CEB7 0x6931F22B 0x0E39CA7B
+0x1719ED71 0x0A704353 0x4C693FA3 0x4BC4932C 0x4BF7BBFA 0x18531FF1 0x153A7781 0x5C316BA6 0x05BE904B 0x135FC8B1 0x78E66391 0x73B12FE7
+0x0E1850D4 0x599886AB 0x3B8F9092 0x730150E5 0x65529294 0x0464CA2B 0x6E61F101 0x2F734B91 0x139A221F 0x1766EA39 0x33ED3E30 0x7A9C64B5
+0x2C44B619 0x15420C9A 0x5ADA4534 0x10D33583 0x2D14DB51 0x440C375F 0x1F0CFFFF 0x442EC8C2 0x4E7C7AB2 0x6B763FA2 0x0FF35BEF 0x1A7436AC
+0x03C95F93 0x252DD370 0x76A5A252 0x0987EFDF 0x388D9C22 0x6F8C05E4 0x7D391FC6 0x46A5ECF6 0x49248C8F 0x38C8B058 0x39A73DDB 0x2E771F23
+0x3D2D7A84 0x28092EDD 0x5DEA6AB4 0x50C79CA3 0x3F701916 0x11D7A8E5 0x4B640159 0x6BB4CF2F 0x2719B57F 0x263E468D 0x7C8804B3 0x542E90D0
+0x6A4A7DEC 0x1B9504B2 0x185D5992 0x38C6F89E 0x070B4454 0x2850B581 0x533B2F4B 0x0AD4A3E7 0x4D7E88F2 0x49E0D19D 0x145C93C6 0x060C2514
+0x396CD781 0x1195B38D 0x4CB2120A 0x02916411 0x4A5E63E5 0x06594FE6 0x31088334 0x078BDE69 0x2E627EC3 0x0EF2EDE9 0x58537B0D 0x6DD297D9
+0x20CA96CE 0x23B77C66 0x59876708 0x47E44C4D 0x49F5C2F3 0x560F6BBB 0x1C12DD1D 0x344040DF 0x71A4706D 0x347036AF 0x6D07397D 0x78AFB4C1
+0x5CC0EC31 0x404268C8 0x038458A9 0x2A3F7523 0x0A233A66 0x17E0EC6F 0x304B9A37 0x439011E7 0x29769FFC 0x7CFDAC41 0x462175F8 0x73D503E2
+0x0356FC27 0x7729F92D 0x7B60E24B 0x31B97AEA 0x061CE716 0x53B45D58 0x1F8C12C3 0x26E77DE4 0x776BD9BE 0x791379CC 0x6ECBCA31 0x41619CB1
+0x4F22E587 0x0ADEA74E 0x75A1DD90 0x40C755F5 0x3F4EDDFD 0x62A9170E 0x39770AB6 0x1C0FCA2E 0x22EB7FD6 0x3CFB635F 0x464F3F51 0x2D0EBA3C
+0x54DC4FCF 0x769AD988 0x709ECC24 0x7E52EFCB 0x739885CA 0x36C0421C 0x7227F3AD 0x76EF81F1 0x2DEA3B49 0x6D88D5F9 0x28A8FCDC 0x3407225F
+0x413D3351 0x48350F9F 0x5AEEA043 0x38A90D10 0x4148896B 0x49BA6A74 0x7A0AA9C1 0x106B6EF3 0x549911C2 0x6FAC8752 0x5132C4E8 0x13E7EFC0
+0x52559E60 0x0AA9CF9E 0x2FF7B9EE 0x75411E36 0x47A532FE 0x7646F940 0x224FD873 0x1C8182CD 0x6CE1D2C8 0x12EEA497 0x1AD47298 0x607A5892
+0x49AEE6B3 0x0CFC6646 0x5769DA84 0x779921FD 0x7A853C3F 0x0012D760 0x2BA0445C 0x3BC26F90 0x4847E6FF 0x068EE4A0 0x746B7CA0 0x0990706B
+0x50494F14 0x6E762662 0x19FBDF5E 0x24E260D7 0x5E22ADB4 0x6B2EA446 0x38CA5097 0x30784C14 0x75D873E4 0x68C20A85 0x25B96A4A 0x3D7DA6E2
+0x5F0903C5 0x480942BD 0x59FF29AF 0x4BEAD68E 0x5AF7E754 0x74D39C48 0x2C652F20 0x24A6CE08 0x01D0028E 0x03CF09A4 0x1C3FF005 0x7C553ECD
+0x03E1E104 0x47E03461 0x3817AE5D 0x4C29C804 0x4E6F1901 0x2C832AFE 0x55BA386F 0x1EB86816 0x1AF95160 0x6FB617CD 0x439AC8ED 0x791BFF14
+0x5AE4BC13 0x7C651984 0x29944B28 0x50BD2FF7 0x65272409 0x4F4DB572 0x0E3AD6DA 0x443027CF 0x1756F830 0x683A0089 0x101AFE5D 0x724EDF84
+0x5D0D9CD1 0x3C802D7D 0x16F5AD8C 0x5EDD9F5F 0x404F3722 0x33359D91 0x5B32DE2C 0x44311826 0x7B15D1F3 0x134A8C8A 0x105AE02A 0x4984EAF4
+0x3FCDB788 0x66151899 0x683D530A 0x5AC708E8 0x55CB3066 0x2BD81BF7 0x53E307FC 0x30AFEC79 0x283D357B 0x7D775324 0x016D1C71 0x0D645985
+0x4CC50896 0x0FA7F34B 0x51948154 0x641C00C6 0x77E1F3D4 0x61AF7FB1 0x566AE04B 0x54EF90A6 0x1E2FAD2E 0x6D608DD7 0x33CD3005 0x5E7EE450
+0x20962B69 0x0F000E32 0x22AFFC77 0x1BABFD5C 0x224A9ABC 0x330ADCA1 0x6530E850 0x62185244 0x191FF53B 0x4D6E3B5B 0x3CDF5B2C 0x6EEB25A1
+0x79465752 0x10C26328 0x1F9B121B 0x21838CCE 0x0E39B64C 0x21082E8C 0x2EE7E653 0x5AFEBEE2 0x30B021D7 0x007C67A7 0x3F1ABFA9 0x289215AB
+0x622BE758 0x15859FF4 0x7D81A651 0x005B9486 0x02E62DCB 0x314ED657 0x5EDA78D7 0x237C5934 0x404EE489 0x018A754E 0x3F285690 0x62997F45
+0x349551EF 0x24593EE1 0x44B1D189 0x4DB5472A 0x71C77A3C 0x01912CB5 0x3CA06CCC 0x6B0DD18E 0x12538FDD 0x5C3B7EE7 0x0C915E5C 0x208D4629
+0x7D43AD73 0x3B7944AF 0x7B8C050B 0x2DF3CF4A 0x3BF5AC56 0x3AA6C4B4 0x5685E4F5 0x1E2193AE 0x502C64A8 0x54078B47 0x1E7D2835 0x53129274
+0x0556619E 0x7D57A10C 0x768EEBA8 0x45A54627 0x7EE2165A 0x35B74239 0x283EC56C 0x33776849 0x5A10811A 0x6CF096F5 0x012CAF74 0x4BD7FB56
+0x6E81C3AA 0x3DCD1C40 0x36E5CCE4 0x00D55387 0x1A089B27 0x43772B41 0x216299B0 0x174C489A 0x7EF06FF0 0x1CEE9EBB 0x454017E4 0x3AE61C47
+0x57956370 0x1BC5FCD9 0x5907AFF5 0x27C1C818 0x6FCD8820 0x7784D82A 0x7AD45A8C 0x7523E9BE 0x74DC7936 0x71634635 0x3AC92FE5 0x73BE8F90
+0x271A886E 0x6307F551 0x2735F7DA 0x012B0988 0x4FF88C46 0x2862A74E 0x4D0304DE 0x3E7A4FF0 0x662FC38E 0x03E8D1C2 0x3F4FA377 0x00385EB5
+0x475FFD03 0x60B23D27 0x1784A74F 0x46506CF4 0x7DA0DBE3 0x5CC4BF33 0x0136893B 0x55363F53 0x788ABC0C 0x5A3E3930 0x7CF8076B 0x6858442D
+0x51C3115B 0x77CC61F8 0x5D7C2DEB 0x469F8A91 0x692FA82D 0x18455DD1 0x3A5E1A22 0x104A309B 0x7B4D5322 0x619411FC 0x11753A23 0x4B45DF69
+0x09F6B94A 0x5E783F01 0x09C02F59 0x70267CD8 0x626110C3 0x490FD2D1 0x705EDB8D 0x29C10DC7 0x29C20FF8 0x07E382DC 0x70117ABB 0x2762EBDB
+0x64A8420F 0x714803F6 0x7C992B2E 0x5D32FE1B 0x4B863D26 0x7991329A 0x458B4248 0x1D494E81 0x715D9492 0x23077034 0x63E8D913 0x5A8D3CBF
+0x3B4CCE05 0x1E46F335 0x6AD76D5A 0x369A2127 0x7FDB0531 0x7C4CA77D 0x01E00090 0x09D1BE7B 0x5AC4E67E 0x0BA02FEA 0x79F83B53 0x3D25F741
+0x54B002BB 0x6A5716E0 0x66E70508 0x7E7212B3 0x723A99BC 0x56F87FC3 0x25D4FE8F 0x56E2DBCB 0x484083B9 0x226E29BD 0x3415D9E6 0x13C6C0E0
+0x1BFF5C57 0x79A11C2F 0x31100F61 0x0D5CF0E9 0x1CA88C63 0x14F8E874 0x67EA2DA8 0x57F55A68 0x333FDBA9 0x52C19B02 0x0E8F7B8F 0x331AE0DA
+0x4F0E427F 0x106F7C20 0x3CEC9F55 0x29D328FD 0x1C0FAC0A 0x36E4DAA8 0x66F9203F 0x70BFAEC5 0x213BF188 0x4DE02547 0x6F31C178 0x13768B44
+0x24D8A50B 0x1506C007 0x6A59670F 0x6D1928C4 0x3774E9C5 0x1E6F40F6 0x00DFE9A4 0x5374461C 0x18105D25 0x31EFF906 0x60D13706 0x34B8E988
+0x46E8E17A 0x48BB64AE 0x0CAE43F0 0x7A28BD24 0x1B7CFFB1 0x1B3DBF7F 0x2D439DFE 0x6A8B4230 0x2BAD3B9F 0x6A303D54 0x145E6B2E 0x47BCE7A9
+0x211517FC 0x7B578B6D 0x387C966E 0x42510985 0x4937B0B4 0x27AE57E7 0x55C794C9 0x6E1055BF 0x3CB517EE 0x4020FBD9 0x5B297E84 0x742A01B3
+0x5E903CCF 0x5C096828 0x479E47D0 0x76A099F4 0x0DF9612E 0x286F7ED6 0x2B59837C 0x54E242A9 0x712AE384 0x3807C76C 0x4F0AFFCD 0x0CA7E335
+0x534586EB 0x7C4E9DCB 0x77332566 0x7EF2C28B 0x667EDB1F 0x0B919094 0x46AFAA34 0x0793F31C 0x06E91C01 0x7F2C40A3 0x49E4FCA1 0x5020CCB5
+0x26DA988A 0x1FAC916A 0x3E312275 0x638FB078 0x5FCD8D43 0x195AA0F9 0x57B9B22C 0x3E5DCA12 0x75640921 0x1F57F9FC 0x34FE6406 0x035D6A50
+0x47C778D2 0x6057E782 0x583FACF9 0x38F25C56 0x185FAEEE 0x274AACC6 0x459A3F8C 0x6BA535DA 0x23994A91 0x3CCD64F2 0x6A97F865 0x0A1825B1
+0x485EF586 0x3147A299 0x11AC18CD 0x4F481187 0x3073E33C 0x5B91156E 0x1F68DE3C 0x574E7BC6 0x7B3DA6D8 0x5D9A00B1 0x3ADE2C3F 0x5B0B341C
+0x76F4A1AA 0x1297DE6B 0x1968FE2E 0x6C58AACC 0x31EFD867 0x4E676235 0x6FB6151C 0x79B75139 0x2EBF49B7 0x47F5C215 0x32A9AD8F 0x471EF8A6
+0x6F406EDB 0x7843ED1B 0x32C42E80 0x12D9B96C 0x3511520D 0x1D5C26E5 0x1CF1DF1D 0x7D704793 0x4EA3C97E 0x2E9DF7EA 0x4CB8591A 0x7F17ACBB
+0x0A2F0D58 0x6C213757 0x56662881 0x056CB431 0x49BB3808 0x114454C0 0x6077E84D 0x40AFD9B3 0x23DC332B 0x79E0E67B 0x2D08847F 0x55CC0B92
+0x484848B0 0x1CBE999B 0x4F835CCB 0x77079268 0x64B45BB0 0x022D0A5B 0x3E268B0E 0x53F4CA8B 0x7A70F776 0x70EAB98E 0x66CE83F7 0x2F824984
+0x0E46E073 0x03C06315 0x2CF29117 0x5CEAA9F1 0x325E5AFF 0x79AAEA32 0x5C0256AC 0x3C8D6858 0x65CC2189 0x32687F2E 0x41FA1C89 0x2F875991
+0x43ACD3EE 0x227204D6 0x70373344 0x6789071A 0x1C52EB51 0x1D3FB7C3 0x3D5512AC 0x649B3402 0x39FE515E 0x0CD86F78 0x5BA2C66A 0x1EB2AD0E
+0x0F0579D3 0x19C95178 0x72A77799 0x09767149 0x0AB40B06 0x5975FB91 0x38F8BACD 0x18FAEB79 0x5D365EA6 0x65EB4BE5 0x75E5956A 0x0F94B9A5
+0x5F963617 0x51E7EC17 0x4C2221FD 0x456257A0 0x04506B45 0x0E1C3E86 0x74E9B131 0x47FD3F33 0x308E435C 0x6520E476 0x2F86464D 0x4CE12EAE
+0x02609C39 0x6CDB58FA 0x317C62B0 0x3C5EED98 0x79B3C872 0x0D1F291A 0x5B119AA6 0x08B94245 0x26E87A92 0x4DB91240 0x122FB38E 0x319C8598
+0x272F0DD1 0x4B286E5C 0x4A977111 0x04656C77 0x3113BA41 0x407D067B 0x13FA261C 0x10A9F058 0x1264F292 0x601C481A 0x560C47F8 0x16B55DD7
+0x6E3886A0 0x4AF5F929 0x5EB29D0B 0x1EC6C9FD 0x3016DD9F 0x0E38E358 0x6BA7F8AB 0x327779D9 0x7B143C52 0x1D245B5B 0x6ED66771 0x74C804C4
+0x2A438475 0x49E80217 0x7D814709 0x512BFF07 0x17A11457 0x0FB0FA98 0x02C8849F 0x3ED02228 0x5AD968F4 0x4D5FF5B0 0x43358E9F 0x0BED2335
+0x0DDCFC2B 0x572FB4BC 0x1C97138D 0x2041EEBE 0x374BFCD6 0x72A35B85 0x36F74C95 0x25848376 0x3D9954AE 0x15A9E9A0 0x444B4D73 0x6DB0324E
+0x23E2CCF9 0x2FF3461E 0x2027AC27 0x1EF7094B 0x4D17A179 0x0EFE1398 0x13BF0E10 0x775B25EE 0x58E615AF 0x11405519 0x488724F5 0x70872A07
+0x20F14FB1 0x4B4FA994 0x2F574C2F 0x7BCAB8A5 0x18AF9F44 0x728CDACF 0x07B7DBDA 0x268C9B70 0x49BC8F8B 0x244EEF67 0x46CE8A2E 0x01088C61
+0x16F24AEC 0x7DC5D6C3 0x268D0FD7 0x548B9F9B 0x136FC064 0x6AD85D4B 0x423BD1E9 0x37528D5D 0x1ACBA369 0x62637E10 0x564996A8 0x67E344E3
+0x716191A8 0x6A08A4B8 0x5F3E6AD1 0x4A47A757 0x7B48F9D2 0x27C58FC7 0x3ACED15E 0x1C3A4983 0x7315395B 0x6A261D8E 0x18050229 0x0BC4D8A0
+0x5CB2F85D 0x1FBCDE03 0x32517410 0x266F87E8 0x440BCD6B 0x791FFE3E 0x27781449 0x5AFE1857 0x76E5D501 0x4E052420 0x2F89B7F2 0x0A559565
+0x38DD816B 0x71C589DB 0x41A822C2 0x53A924D5 0x542907EB 0x17F1B96B 0x3B8C69B8 0x458A9993 0x01FA5E23 0x1ACAD489 0x0FD240EB 0x7D4357F5
+0x42906450 0x4AA11249 0x197DA179 0x35A59DAC 0x34C72FD7 0x3182A3A2 0x416A764C 0x117A2834 0x513F81A5 0x73BBEA5C 0x37E9B01C 0x154B4F10
+0x6CDBE89A 0x5F61C465 0x70496768 0x63C1BD9B 0x2D66E886 0x1FD31F5A 0x6E175301 0x664469F1 0x1198A936 0x2FBF75C3 0x39ED8EC6 0x65C1B121
+0x47B12F2E 0x7579F87E 0x2B4C4AB5 0x49AB8D52 0x1044CD08 0x3B1E8BA0 0x46EEE547 0x52D53158 0x05BF9DE9 0x606C86C0 0x087ACF04 0x3A86CDC1
+0x11EF2A62 0x49E54550 0x4C00F5F5 0x632EAC08 0x3DA12FAC 0x03EAA612 0x7879FB18 0x2A7D1846 0x634C6A77 0x68C36280 0x0E3ED5E2 0x10B352FD
+0x089681DB 0x7C5628E3 0x76F7BCEF 0x1A2F2B11 0x2C159EA6 0x30E54BB5 0x7FF0DC32 0x73C6CDD5 0x265F4434 0x2B3D26E7 0x3D725B27 0x36A4113C
+0x665BB287 0x0461406E 0x09794294 0x6C1B5071 0x64CDC72F 0x11F41199 0x26A21E32 0x76BCF191 0x5BD956E9 0x72A31427 0x59EB9D99 0x197A8696
+0x768DBA39 0x526598B2 0x43F79EDC 0x59DA24B1 0x3B28FB32 0x523674BE 0x6A8D77AE 0x43BF7D0D 0x4E8C9DA1 0x6185349D 0x5DEEA81E 0x7AA23C48
+0x126A8053 0x5DDF8451 0x6E690A1D 0x38C9C487 0x091CAB38 0x2BDB6544 0x6F6DD5C3 0x6F785DC0 0x303CA5B2 0x78E71857 0x5B93AE31 0x150A6CE1
+0x0ADB29F0 0x0235CC63 0x0BC75E73 0x66B480DA 0x74D8E08A 0x65B2FC0C 0x002F0770 0x6B669AC4 0x381894BE 0x4426A64C 0x4540BF75 0x73418FF1
+0x165D1B0B 0x2FCE3723 0x37010CFE 0x64E9B8AC 0x11536BC1 0x14EFB51D 0x5F8BF4F4 0x23BDEC14 0x72CF396E 0x4DF4FF11 0x5C87B09B 0x7BEBE4A6
+0x79D06455 0x4BF5865E 0x6B644266 0x2A0D0A08 0x44DC9EB5 0x46F7F097 0x3F1776E9 0x4FB7C8A6 0x492DBCFA 0x4ADED55C 0x366C4980 0x3E069D85
+0x3091D169 0x369B50F0 0x296D3849 0x68AA6627 0x7AC1F73C 0x6EADF7BE 0x5BEBF618 0x111F1247 0x1E7C2EE1 0x12ED0317 0x7608CAF4 0x2FCF9AA2
+0x27DCB834 0x5594BFE8 0x538D86B6 0x1AABF1A2 0x2389BEFA 0x30153751 0x1697D648 0x1D5A234F 0x7C0ABDAF 0x01FC18AF 0x47672D57 0x40E75C65
+0x48F40946 0x067EA441 0x109F250B 0x1221C641 0x515D799D 0x470B6E8B 0x502863C6 0x01EF4B06 0x7DA6BF7B 0x79959C0F 0x6A99B12E 0x7868B6B7
+0x684393CD 0x4685A746 0x0987C8FF 0x06BFC2AE 0x5972AA5D 0x7F9093F3 0x368F5D51 0x014F6291 0x552553DB 0x0A1CE407 0x1BFB5433 0x78AF12D5
+0x3A321B59 0x32932A7C 0x16093625 0x363CD908 0x348F432B 0x5D70637C 0x7724356D 0x7D834C71 0x63EF07BD 0x07C35A78 0x0FA512B2 0x354C815B
+0x4ECEC903 0x5FCD7678 0x373BCC61 0x4C75887E 0x59631287 0x21D57D8F 0x44DE3F36 0x41A6A654 0x685B24D6 0x4E660835 0x48666903 0x41CDCF33
+0x4DF69C28 0x7EF5C654 0x431D31C5 0x231BF003 0x0912AA5B 0x5F1885F8 0x1BCB02D9 0x4344C5B4 0x11ABB074 0x31D438FE 0x79819EBD 0x463AF39F
+0x0F449C7A 0x70A5D42A 0x43BE4011 0x7333A438 0x78692EA3 0x536352C3 0x28802593 0x4737F7A6 0x3330C93C 0x5FBBF1F4 0x13AD8025 0x0C93DBC3
+0x01916F84 0x588BBF5B 0x4E3A8218 0x69EC945A 0x26F1C790 0x16A0EB1B 0x2BBA638D 0x74E863B8 0x1596B16F 0x6ED79552 0x180453BB 0x1EA95BCA
+0x4DF01B4B 0x33CF5694 0x61EE217F 0x5F9BCBBF 0x65A38F92 0x5B6FC03C 0x25D6BF5F 0x74E82C0D 0x4C159466 0x6994FF70 0x681BD045 0x447EC309
+0x3CF85233 0x109BF5D8 0x0BB6BAB0 0x70291B6F 0x7057E7CC 0x1F643AD5 0x7CBCF733 0x71E95750 0x77EFFA30 0x4AF7794B 0x5BD5EBAA 0x1EE1C1C0
+0x61986466 0x07904F38 0x13CA2578 0x772F15D5 0x7667E48A 0x2BCE7933 0x15D8719F 0x4457FFD5 0x5F9DCFC8 0x77C6931E 0x23F3CB95 0x45415F5A
+0x5336535A 0x49CA8AF4 0x3A298B67 0x1F4BE7C1 0x335F8A64 0x22455BAC 0x63CAAACA 0x7057DC97 0x32E15184 0x6F81657A 0x6080F807 0x23393951
+0x0EE5A04F 0x5D3DEF3A 0x152290A1 0x06D59A7F 0x28356885 0x70F87C4C 0x25B75C3F 0x09CDCCEB 0x7888CB84 0x398181B7 0x00FCE2C0 0x6EF0B00E
+0x654FFAEB 0x16D5545F 0x3348AFE4 0x44EDCAB3 0x0E9BE77E 0x573C7B79 0x0A2F2A0D 0x61D23AD8 0x2107066D 0x4458B575 0x011E2299 0x546690D1
+0x669E1121 0x64E8CD64 0x44BE6D68 0x197F62A6 0x546A32DE 0x253F656F 0x3CB89BF7 0x634FD32E 0x027D54A9 0x51DB2C98 0x6A256DAD 0x2AB2BD2E
+0x42D3A8E4 0x0FDCC9ED 0x34808A19 0x3B5C7468 0x495E4BA4 0x357D6CD9 0x2A4D2477 0x2EAE468F 0x4C52C139 0x5D95D45B 0x739C1142 0x5AEEA8B7
+0x34D24FD4 0x7DCB3B50 0x3CC0E38F 0x55D95641 0x4223F0C5 0x3DDF0629 0x2A3FE712 0x28C201E6 0x22C7D38D 0x6EFE547A 0x4241648C 0x7732066B
+0x143DB9EA 0x7EFA0083 0x5A81D999 0x16BB0E93 0x50D52D1C 0x44A74747 0x416DCBC2 0x13A8D600 0x54841134 0x75EE55DB 0x4F054A69 0x1DE25CD8
+0x2B6BC2B5 0x79526EE0 0x4C90A368 0x77BE83EE 0x56E8433B 0x402CB4AA 0x52AD2CA5 0x0BBA930F 0x3DF7EFFA 0x0F6E1034 0x6193E950 0x001BE0BF
+0x4D4D165D 0x0BD3D062 0x28DDE2A6 0x7014E9EA 0x7AD224DC 0x6B1F4732 0x6746F056 0x0F0FDEC6 0x6A1947B6 0x41C8C9EF 0x25CAED5A 0x3AEE74D2
+0x06701136 0x6738B91C 0x4E974AD2 0x5AF4226A 0x5D270EF7 0x1D9C953B 0x78D67F43 0x0892D1AC 0x16EF041B 0x456722AB 0x0051559A 0x6DD74756
+0x0593D755 0x52FE823F 0x7991DA65 0x438BC750 0x626C9274 0x5B25C3B5 0x43A7A80F 0x2FB9A8D1 0x66F99417 0x6C858AB5 0x1FCE92BC 0x61CBB8F4
+0x57A4D1E8 0x07158312 0x70DB97BA 0x41BE199E 0x48DE4D01 0x16A68514 0x7CAC8E70 0x4F4E5E38 0x7DDF3E30 0x4B43D942 0x2A4280A2 0x5B064D28
+0x68E06E7E 0x2318FFE5 0x63991ED4 0x7FCF7299 0x68802290 0x63EA746F 0x6DA6B9F0 0x6E13F9E6 0x36E8F6AE 0x67389455 0x319FC136 0x19558922
+0x425E580B 0x75476945 0x490F31F4 0x2957EC22 0x61CCF3FB 0x68DDC4B0 0x0B23A516 0x3971C5E3 0x6FF347C2 0x7BFF3CD1 0x7B2FDF81 0x38D194C3
+0x12A5C1E5 0x77DC6DF1 0x081FF2FB 0x10850016 0x43204733 0x3262739E 0x6B8B4D3E 0x2C00B5B1 0x557B7383 0x4F246C12 0x2BD0284B 0x3DFB9614
+0x330EE081 0x1976E23B 0x2C0F8FFA 0x69F7D730 0x00AF7690 0x5DAF5130 0x034D6052 0x430DCE9B 0x52F6BA75 0x4C5C9246 0x6C65BABE 0x34C3AE70
+0x353A56F6 0x77895FD4 0x6E357453 0x252D9EB8 0x73889CA5 0x696553D4 0x5DFF337C 0x062E5E8B 0x6141C1C5 0x661F2677 0x16B35EA1 0x246208F9
+0x18819A15 0x023EABDF 0x5062BEAA 0x6DFD0D99 0x516317F1 0x7C32E6F5 0x2BF8A3AD 0x0471F873 0x15A9C930 0x580833A7 0x6E69CFA3 0x16593FC1
+0x35B784D7 0x71B72FF5 0x59670E5C 0x08AE3F4C 0x3E13C23C 0x45CCC91A 0x3D71EDBD 0x734E1932 0x3D5628EF 0x2BA76210 0x187BB7EB 0x30DEC594
+0x150CB5E5 0x767AEB67 0x370D241F 0x764E77AA 0x5C9A11DE 0x4DC082C0 0x1AB080A3 0x751BABF4 0x4FFF2E9F 0x6B133F4E 0x6318B98D 0x21624691
+0x67462643 0x0F115D3A 0x25D43F04 0x7CEFEF74 0x671990E1 0x143E0EA7 0x13492F35 0x1CD115B8 0x05F53E9C 0x6CB03D91 0x257F5504 0x440900D8
+0x327D06AC 0x62F142C1 0x37571A0B 0x6FD32F9B 0x0E98A4D2 0x4FD2D1F6 0x20B1F52F 0x23A55AB7 0x464DBD5D 0x57BF194F 0x19F3D261 0x22E7CF3B
+0x257F9C0F 0x34A45305 0x18037B2F 0x757ECAAF 0x1FB79253 0x7B1C34BC 0x16E11140 0x06FDB896 0x0A2D91F6 0x3CB55044 0x03EDA80A 0x714722D7
+0x50F35EEB 0x1736D73F 0x0E18388F 0x56E89D87 0x03E714D1 0x33978D94 0x1AF19E60 0x36641B7D 0x1688D055 0x5248B86B 0x26374B18 0x25217527
+0x221B8A61 0x46E94047 0x48C6CFDE 0x686947BE 0x1EA85996 0x62BAA240 0x0B5116F9 0x4427F5A6 0x175EF545 0x23549229 0x39A6C055 0x37168798
+0x1E70C6E5 0x5087D195 0x3E14402E 0x289E58DC 0x0D3D21D9 0x4201E839 0x19E57BB3 0x5E3080C4 0x5938BF78 0x27FDB443 0x35191E4B 0x5D1FD449
+0x5B9541D7 0x500ABCAB 0x1383EFC6 0x721E122C 0x22537516 0x39BB3ADE 0x173F8754 0x446EFF77 0x00A47B26 0x60065732 0x2CD84735 0x1F4CD4BC
+0x42C0F972 0x38295E2F 0x6374CA62 0x5A1FEEB7 0x5B7DF058 0x1D1B8AB7 0x1136764F 0x79EEB73D 0x6DA35C4C 0x4F4AB67E 0x228D1019 0x7AE07E25
+0x114C9EB7 0x3C728BCD 0x5910FEE9 0x6A855E2F 0x64704010 0x0E2A1D35 0x47A53279 0x400581E7 0x5E34D9E0 0x5B29223F 0x32239413 0x00884EF7
+0x14E45D1E 0x49631B67 0x44F74E6E 0x1588D844 0x2969729A 0x71CF95A4 0x34D5AD00 0x6C2A6C0C 0x29F8F3D3 0x184A7763 0x464A5AC4 0x0576E42B
+0x3566021A 0x5780D113 0x7F659B68 0x23095E67 0x26CB8791 0x21F2AB82 0x1DE9DC8C 0x38182648 0x5E65374F 0x76FADB76 0x229D8478 0x42D5775F
+0x0524F8AB 0x6A42B6F1 0x02DAF946 0x6359D28B 0x456BD930 0x34FE8D59 0x63E22182 0x5A50364E 0x7E61A8C1 0x28D96FF1 0x6FD90E92 0x27CB1B5B
+0x1AA90595 0x24AEBB93 0x13F58767 0x44A1F968 0x3CF932F6 0x5A3FE22B 0x4A18DD93 0x725F3510 0x31C0B33F 0x497E78FB 0x15689377 0x588C3AD0
+0x6B71247D 0x33527004 0x10A46119 0x49D65BCC 0x2A4D4B7A 0x3341E591 0x0CABD32B 0x2F724425 0x1D849C82 0x0F86CC71 0x12CC16B0 0x62F075B2
+0x448559CB 0x76AE3833 0x3D40AC01 0x42E7028C 0x1F87A824 0x2D19BA93 0x6AB21DE7 0x3A30ADB9 0x51C87626 0x7EA7A54E 0x7ED2A721 0x0EC1A91C
+0x58E7877A 0x48EB84B4 0x0120DE2D 0x0AA83AB9 0x1269FDAF 0x168971A4 0x63347589 0x7DDB222D 0x49DBE1A8 0x73D8D6A2 0x47B17DF9 0x74292D22
+0x271ABC33 0x545D5125 0x239B7147 0x449F58B5 0x63E41D96 0x366787F8 0x278FCE68 0x28697761 0x2D15C02B 0x64D07A69 0x6B5079ED 0x4C9D684F
+0x11EA34FC 0x560297D4 0x06CE1608 0x63B2AB23 0x54AA3D23 0x05A0BD29 0x7274543F 0x2D91C49D 0x4E8C41DD 0x7395326C 0x3839FF56 0x60F63F8C
+0x0A1EA411 0x1B6E74DF 0x5ED161B9 0x53FA85B9 0x0F474B82 0x2682DFB3 0x4823B2DC 0x366207B5 0x7AE030D8 0x6BBF2423 0x7B01606B 0x5EC44E6E
+0x2226AC1B 0x22912ED3 0x072DC5D0 0x4F3C6C46 0x0761A93C 0x727E3FBD 0x1BD9D495 0x194BDE38 0x4880D792 0x22A7EA9D 0x7CFE895B 0x1D2B14B5
+0x2848A7C6 0x6F72DD9B 0x4ABCD952 0x76D4E9A3 0x63081007 0x02F6D8A8 0x57CB2930 0x6D26B418 0x1E654D87 0x369C8AE9 0x412139D2 0x2DAC9909
+0x5D1F6A9C 0x0944ECAE 0x640EA0BF 0x57FF9B74 0x750410D1 0x5F10012A 0x36C3E9E3 0x172ABCED 0x01A12FFD 0x3DF1AFB3 0x66672933 0x0902D939
+0x306FEF70 0x0240FDC9 0x224EB771 0x78F0C702 0x24E8E866 0x1F4D40CD 0x161BDBB7 0x4D31902D 0x0EC01E68 0x60D8B509 0x440679D0 0x71C82E6F
+0x63CF8DB1 0x1BD1A300 0x5EEEE288 0x0234DB39 0x526E2DEA 0x20101C5A 0x2FE17442 0x2F8D9886 0x29550908 0x13F01501 0x078D33FB 0x1E5919D9
+0x7300162B 0x3E511DDE 0x3583D6C6 0x74A14628 0x7C42CD91 0x1BEAFFFA 0x7DA41F61 0x2CB2BD01 0x1E2BFDC3 0x1FF2D6D3 0x25A38404 0x4314E629
+0x3F4017A0 0x3BBF5FBB 0x10467656 0x4E003608 0x1C9814C5 0x544CF027 0x3FC86477 0x0067A276 0x701E9327 0x1EB746FF 0x029C7DAF 0x428CC111
+0x3EC76359 0x327DF1F2 0x721A5998 0x681C6C61 0x466E06F3 0x79A78D93 0x0675863B 0x396E1D1F 0x37F8AB71 0x3BF95D01 0x2E0F6347 0x343B7902
+0x57E45CFB 0x2BB382A9 0x60EE3603 0x76105ABE 0x4BA6597C 0x0691BA07 0x392540E8 0x0AE6711C 0x425119C3 0x496BB73E 0x58E6A724 0x5EE92E88
+0x1DB8A765 0x18AF0B9B 0x5F50D0FE 0x0DD73A8D 0x3766529B 0x61ED4EAE 0x5063FB9E 0x762DB5F4 0x146B40A0 0x427E5536 0x5E4A2256 0x5AD94793
+0x3C25E2C9 0x64BFA891 0x144764B2 0x741E8E3A 0x20B90592 0x4256C7FA 0x285A073C 0x789D628E 0x6E0A4AA3 0x09483D40 0x6EADBD4C 0x39B0A41F
+0x0FD9F747 0x27D2FE34 0x4497153B 0x522B110A 0x713EB573 0x1D7DBC5F 0x31143F92 0x0EF75CD8 0x362CC7FA 0x10651091 0x1CCE9765 0x6D931A95
+0x72525F3F 0x6D329304 0x63C0D08A 0x06BD9FDF 0x2FB0E83A 0x420AF2E0 0x6196E772 0x6BD6CB04 0x26CA9B71 0x75DE4C25 0x5FF5593E 0x4783A103
+0x3835141F 0x084F607B 0x40210391 0x263F5EC2 0x11979DBB 0x2ECEC0DE 0x5FF002E1 0x21719502 0x56A1BF12 0x2487181C 0x739CA60D 0x47E07485
+0x4204D47B 0x24B0E59F 0x56D7D15E 0x78319C75 0x3515F630 0x73A668C3 0x65C4B70B 0x2768556F 0x60D8FBC7 0x49858795 0x2E25F54E 0x1089E402
+0x0B907A75 0x0FBCDCC1 0x7C60AF06 0x325B15E6 0x059B28E6 0x5C560844 0x79DEB6E9 0x3DD03D05 0x64A568BF 0x39FFBA7B 0x640F9BC7 0x763D067A
+0x68CE7B59 0x43FF9EA8 0x17AE9B7D 0x3F703A6B 0x6886B6C4 0x0B4B418A 0x0750AEF1 0x2A8B8B3F 0x2FFC2729 0x5E28804F 0x22BD27B4 0x65121D5A
+0x51CEE912 0x0881DEBF 0x0C7A72C9 0x32A7E4DA 0x52076654 0x3AA06818 0x4331C8DC 0x5D97E0C9 0x4A5D44D9 0x3F9277E2 0x0FF2F6AF 0x4FF86DBF
+0x1BE88026 0x09D1AD99 0x0DC8AAC4 0x008DE8E6 0x43D16814 0x71D8468B 0x76CAEF60 0x2C9FE36D 0x35D7E533 0x0E798ADD 0x6C101DD8 0x1E5E9BF7
+0x19C4CC67 0x7360CCC9 0x48EA2736 0x49C0F391 0x51894D18 0x6BA74EEA 0x2ED310EB 0x2358362B 0x74292DAA 0x3B4D83B4 0x56001B05 0x463093FE
+0x75EDEBCC 0x1931E3E1 0x23C874C8 0x404B30A5 0x58C45BC3 0x33BB6B77 0x10439E64 0x74ACDBE9 0x3D8D1910 0x1E0C4928 0x753AC4CF 0x015E8124
+0x0FE48FB3 0x6C05B430 0x2DFE6491 0x45BC74E6 0x7A7F3F0D 0x1A0E826A 0x641B10DD 0x14440B75 0x0D6F4F33 0x2D053813 0x5E04FF06 0x5EF89C4C
+0x18AC86FE 0x0CD80FF1 0x0250D277 0x0CD5B4A8 0x482593A5 0x5850ED7C 0x530648A6 0x3E137F72 0x7182D15D 0x76CEBD6E 0x7E5EB017 0x4A472D20
+0x2A8A28E6 0x0EA24E7C 0x3EF40909 0x681741F6 0x2CAE97A4 0x342ECDD9 0x6975C31B 0x3C932758 0x20348209 0x177427AC 0x024F9C3E 0x1AB3C116
+0x3182AA16 0x666AAD1C 0x2EF7CC8B 0x3EF1F94A 0x136FE52F 0x0CFCCB91 0x1DEA9596 0x2C1C6C2D 0x19D4DB82 0x203B680D 0x38F220D5 0x61FA6F28
+0x788C5589 0x0BF8697C 0x200DEE9A 0x6A0F26E6 0x02C726EA 0x1E6C9EB1 0x34565406 0x2D514FD0 0x2D0EED2D 0x734A5D0F 0x156891C7 0x59BD84D2
+0x27792AE8 0x7EDE54E2 0x1650AC2A 0x47ADACF1 0x16527C8E 0x18A04868 0x62616E08 0x47D526A5 0x7F0AF584 0x11593A93 0x06C71FEF 0x127ADAB4
+0x1E560625 0x24B1B585 0x3E9746E1 0x382AE1A7 0x44ED1D92 0x778967B7 0x1A2550CF 0x3D79731B 0x0381D133 0x3A333F69 0x27889A01 0x0648F81D
+0x589FDE1B 0x5BDEEE07 0x339A47EE 0x05AECB48 0x4F294B16 0x4902D9B5 0x5F6C501A 0x76A275FF 0x47E12E97 0x75BCFC44 0x3E5022F0 0x5E33AB25
+0x0E5D44AD 0x20B190F8 0x2608D1CA 0x0D683A31 0x320ACB8C 0x2CCFF1B9 0x1FE314E5 0x5060D1B1 0x5181A73E 0x5E7A5BC7 0x088BB358 0x166EC4D0
+0x5603C37E 0x22B10428 0x53E837EB 0x598594B1 0x5CE44391 0x7B70D1EC 0x5FCE8CCE 0x358421AC 0x574FBFF3 0x1368D4BC 0x3B32ECF5 0x26790B0A
+0x5C6BAE71 0x1A9F3D0F 0x1D1B8109 0x244CDD08 0x105C3954 0x5B6BA3F9 0x0280882E 0x1EB97E01 0x7C1D34F2 0x288959F8 0x2C21B832 0x2E28007E
+0x55594BB2 0x4C04CD18 0x7E88D22F 0x26DAF2F0 0x2A7F28DF 0x07148587 0x3D49B7C1 0x0082EC5D 0x29C589AF 0x1131EFAC 0x5A08810E 0x06A9CD41
+0x0CA2C199 0x39D70DDC 0x3C2DEEED 0x63F2818C 0x4D3FE299 0x7760DBE2 0x0A6B8C96 0x29AB910A 0x120018F2 0x27870D9F 0x4DF86E13 0x225C5246
+0x02F2B199 0x5078F641 0x4115D047 0x7F0FE68B 0x79025039 0x6D378879 0x2D37E709 0x4E5B9BEB 0x393C5591 0x2BC0B938 0x75368EDC 0x63BB7E70
+0x32D53EBF 0x3280469D 0x643E6ACD 0x5C9AC86F 0x43B23649 0x3E46EBDB 0x634495B0 0x5054F7E2 0x781DF9B8 0x1F72849D 0x3447796F 0x455DDC51
+0x16D36080 0x3EB30605 0x6F096D5B 0x28D37972 0x663A13A5 0x3D01DB6E 0x4B2FCBB8 0x692CC53E 0x0D7AD1AF 0x0C459BFF 0x683CABC9 0x067D21E9
+0x797D2478 0x157492D2 0x54D8BDD4 0x32B97A0A 0x41354C0A 0x4A0F4CB0 0x1674F87A 0x740A8AC9 0x7C8F934D 0x7AB36348 0x50A55338 0x4041C997
+0x38FA4F23 0x33E9E8E8 0x1096C179 0x311848DB 0x535C6D86 0x44DE3AE8 0x7676252C 0x6A2FCE06 0x039140EE 0x657F9288 0x13034778 0x69CB5493
+0x22816DF6 0x5E331330 0x52F819D1 0x2FFC3FA6 0x6A78AF2F 0x3B34C59A 0x3679618F 0x63F5D3A7 0x50A9586C 0x0B521F63 0x16AF4DB1 0x11DEA476
+0x55616C14 0x2D24462C 0x05E92F3F 0x51F0FF61 0x27D7A974 0x568E8278 0x1232C8F8 0x60D1F897 0x0A786B60 0x22C98A72 0x11EA4173 0x5DD4D8E6
+0x67A7C55A 0x0860669F 0x4804A6EC 0x6B390648 0x6DDFF927 0x5B07EE64 0x55045ADB 0x1061671E 0x393B0194 0x27FC74AC 0x405DA6C4 0x23B3B0C3
+0x63313A46 0x76D70853 0x07A9846B 0x33DA92B2 0x022927B6 0x1E58D21C 0x45B93728 0x578A93CA 0x4B7D1848 0x4BA26668 0x297B932C 0x7354C1BC
+0x2230E8E0 0x3BAE5C24 0x5426BA54 0x2CA95440 0x5E77E696 0x6610FBC7 0x0A7E2D27 0x461FABF1 0x6E716266 0x5282D413 0x3158B239 0x5C515B8E
+0x2D8AC278 0x065D0D15 0x6CB2C2AC 0x66C5C40C 0x2E5981C1 0x2D106970 0x0A7974D0 0x118ABC08 0x23E771C3 0x1222F93B 0x45654EBA 0x26109979
+0x307BCB57 0x0B1E85E3 0x7D9B2D44 0x7BF8E3A0 0x56C0EC4B 0x2716C070 0x6F4DA55C 0x78F1D52B 0x62C51C94 0x43745FB0 0x259B296B 0x413D032B
+0x29855B77 0x30195692 0x075CAF1C 0x17F6BDDE 0x029C2AA6 0x38B56155 0x7448196C 0x3026ED1E 0x3F126E6A 0x60FADC18 0x16ECB12A 0x6D6BF02C
+0x0E0B4588 0x216625FA 0x7EF6AC34 0x31F2B74B 0x33891F35 0x445BFAEE 0x580350C4 0x6404EA8D 0x4F7A80D1 0x559E7E08 0x5FFDCE2D 0x263B6D1C
+0x7CB53E78 0x4F4B7389 0x1F2D4247 0x5F7A5B0D 0x12BFD33A 0x44C86BB3 0x20B75E38 0x3C452EB1 0x74E1C245 0x28140D54 0x543BEC8F 0x777DECEB
+0x60C96EA9 0x488405FB 0x27A4DA09 0x1FDBDD14 0x297EE213 0x3E918B34 0x0D47CD40 0x378A279B 0x5FF7B12E 0x0C3E7974 0x697CDEE6 0x1380D064
+0x509A7462 0x41802FAB 0x7785BAF1 0x2014F534 0x171EADB3 0x5783891E 0x46506250 0x13D3EC2C 0x26CEFCA7 0x657DA498 0x734E4739 0x398ECFE1
+0x2A46104B 0x1405A571 0x75D3FE93 0x1F27D290 0x3C19B2C5 0x4A0FEB22 0x16A5BF7C 0x1CE3216E 0x1293F11E 0x3E4A9985 0x3CBEFE82 0x3C12D331
+0x7CDC24B9 0x4A06CBC2 0x739CFACD 0x5CD3D5E8 0x56454536 0x5D19D9B3 0x7054A64C 0x26DFB999 0x1E9A095E 0x67DA613D 0x46F4AECD 0x35B8B712
+0x3F5DEA5B 0x0D45111D 0x498CA33E 0x662CE702 0x72C2B5B5 0x3CDAEA77 0x1FBBB6E4 0x1D08C600 0x50E08FE8 0x158FB577 0x3C309891 0x0CFA42AD
+0x5F9FA099 0x52D6580D 0x29DD641B 0x723391B7 0x1120F192 0x669C629E 0x2E4664E9 0x0DFD164C 0x30A32E60 0x21E35FB6 0x6AD0EC34 0x06E87397
+0x7EFD3969 0x5B259280 0x2DC82D30 0x1D9742C8 0x42FFF3BD 0x74BCDBFD 0x534FF9DA 0x025DDE18 0x0201ED1A 0x1CDC9D18 0x688AC51A 0x74C4A2D0
+0x59B7878F 0x08467BFE 0x11CD68D0 0x2A981777 0x1DD63175 0x4DFE0161 0x37925A24 0x7D75D20F 0x20D4596E 0x616FBE3F 0x6FA963C6 0x31F54B01
+0x480C20DD 0x1DEFC8AF 0x3FF2614D 0x78AF4F3E 0x3FD32865 0x2AC34D81 0x7F97C2D5 0x3ED061CF 0x05E8E001 0x2D5FF005 0x5C67A497 0x48E8D3BE
+0x221CCC02 0x2FB79E71 0x4B46B1D6 0x241EB91C 0x4C943B89 0x33D176F0 0x18E35BEC 0x264BC318 0x3C17F2EF 0x2AB0C4BD 0x50E3DA8F 0x59EE2464
+0x78AEC61E 0x087634B3 0x5763F673 0x19831F8D 0x69E5F2F2 0x470D5A3A 0x4B786A8E 0x31F213D0 0x64FD22E9 0x0B6ACBDB 0x2AA1630E 0x24D04B4F
+0x362E195C 0x2A3925E3 0x63A0AD1E 0x3C16F95D 0x579915E8 0x400851B5 0x04FFCD1B 0x79B5E1EA 0x6FBFF026 0x50467EF1 0x1DD49B06 0x3C542BAF
+0x0417F5E1 0x36B7F6F3 0x629FEEC7 0x402FE8D0 0x6168BBB0 0x3383C956 0x1A1E0D35 0x5A1781CE 0x3BF9FE09 0x718203A8 0x739AA15B 0x25DFF0FB
+0x388F5DE2 0x3F130BE9 0x57D204CB 0x1D8C80CC 0x4A7DD7C4 0x027367D9 0x425CCC1B 0x00ABF120 0x2CAC8DBC 0x25FD7939 0x3CC2EA7D 0x0445A3A4
+0x6605CAEE 0x41C2B798 0x7DFB858E 0x55C5BB14 0x12093689 0x1BD02095 0x1219E6C3 0x16212C6B 0x52881788 0x74B9D58A 0x5651153B 0x33F0D338
+0x283D9EE0 0x706F2270 0x0E085506 0x64379CE9 0x61F12619 0x01A2F662 0x0A178DE4 0x1A8083FB 0x40B6024B 0x61E992B0 0x380D04C7 0x0B33DA10
+0x645CFA89 0x7A69D0E2 0x0BDFCB30 0x11098846 0x20674A1B 0x48A2B5AE 0x154F2BEA 0x066D1509 0x0A656D46 0x134AB179 0x5C32D01D 0x1C6EA3D0
+0x2F1AD20E 0x6E4CB6E0 0x328FD03B 0x01A2E996 0x63068C6A 0x08E0E576 0x3593BCCE 0x0B442B4A 0x795007E7 0x439C11D4 0x6F7BC833 0x5B412E00
+0x453F0836 0x79935618 0x75C1B1FB 0x05F50A82 0x5B7CE8C8 0x2DCEB6C3 0x1128E492 0x3FD9E351 0x283887A5 0x1D08AFC2 0x50E36B97 0x489FD1C1
+0x65AB6570 0x66329782 0x4F0CE6CA 0x7010D2B7 0x797D48FB 0x2B3FB6E8 0x0C7F7687 0x28981B09 0x198C6DC8 0x3F0F46C2 0x2A3B049F 0x7C92FA33
+0x47F02C38 0x5FCEC16D 0x07D7257D 0x4140341F 0x236AD341 0x7752EDB1 0x1C81621F 0x68A9DB78 0x70E643C9 0x1243141B 0x6E9EE5FA 0x4C632C91
+0x4011CADE 0x7FC7CA8C 0x0C3D0FE2 0x684A5283 0x1CD07A4E 0x5D207B7A 0x30EA2444 0x027BDFBF 0x435312FC 0x7FF70B0F 0x728CB276 0x3CD05BF7
+0x2B36C1F7 0x7F0C28FD 0x65687700 0x44C32FBF 0x3E1B6FBF 0x0FA37B9F 0x415629F2 0x060B9BF7 0x6F723D0C 0x492D4F70 0x474BD017 0x12DD104D
+0x40803D21 0x63CD3236 0x7B86EBC5 0x316680EA 0x76104651 0x6A25D1BF 0x7DC9AD7B 0x3622112F 0x69ED9C4B 0x0A06BD5D 0x1E6C63B3 0x06BE169A
+0x672738D7 0x4F5687F7 0x0939F659 0x2A7A4BD3 0x4F4D9306 0x7BC6A8CF 0x674AA7CA 0x7A8454FD 0x7AD2D1CC 0x4CB31ECA 0x3F4784BD 0x38EE418B
+0x5C569A69 0x009DAEAF 0x3EF9DD82 0x4BC8D775 0x49CAFE1F 0x0645AD99 0x5EA5E7C3 0x0A4B3B40 0x6A12DFD0 0x5A2CD388 0x3BB1BC2A 0x60232621
+0x4452A548 0x397B69A5 0x16453751 0x2E404193 0x43822703 0x34B19B04 0x34FE582D 0x2AA95FDA 0x040822FB 0x3E384E86 0x5523ABAE 0x5355B602
+0x39FEF755 0x3C6E5378 0x4DDA0AFF 0x34D1C921 0x09217243 0x0D218FBC 0x6DC00AAC 0x65780CAC 0x0DBF3E6C 0x2CB9E82F 0x3140E422 0x578A3C8B
+0x32FF95C8 0x0FE6CBE5 0x61D577CC 0x1D127598 0x6A139F6D 0x1D8733F6 0x7D359BBA 0x2E6644B5 0x57029D9C 0x137AD30B 0x5CA68649 0x1A84C49F
+0x482C6E0F 0x11A4DE76 0x452E2479 0x4C34910A 0x4FDD2CFD 0x1A51D027 0x1F8A470C 0x09DC2452 0x56C023A0 0x6D64520C 0x3EADED74 0x5FE195E3
+0x7A85E1C8 0x2C6DF820 0x4559A28F 0x08452034 0x5927E04F 0x769A86B1 0x5FCF5CC0 0x0C277618 0x06815296 0x41A4D48C 0x2939EBB0 0x7094F204
+0x5F2C0882 0x266F876A 0x1EFB36B9 0x362EA61E 0x39EA5A75 0x7BA1BD02 0x50B36ABD 0x0216C884 0x0D469B79 0x15E18F37 0x4E4B598F 0x5D23C876
+0x30335F5E 0x6DD5A09B 0x66FFECC8 0x06F382FE 0x5B39F2A7 0x25ADDA3C 0x66D518E1 0x55BFD470 0x521BD25D 0x2C2EBB71 0x5E04F4A4 0x2B43B2AC
+0x22C94222 0x3DD45164 0x376B28C4 0x294A94B9 0x7F7925F0 0x60A51475 0x19DF86BD 0x5EA52E73 0x07149BDF 0x38DABD76 0x14D3D491 0x40FEF655
+0x347C7A79 0x65873F4F 0x4315BED9 0x41C315F2 0x7B68CE86 0x11611868 0x1EE6DE68 0x2B9C2DE4 0x7F36B904 0x05E6CB30 0x328FB0E3 0x5A70ABAB
+0x2B94A56D 0x1964C9C4 0x3030801B 0x7DB077CA 0x45938535 0x0E3574C0 0x28F42A76 0x685CC758 0x4C09C624 0x605F533B 0x11A75C11 0x4B82EC15
+0x410467B0 0x2B86E2CE 0x2A281A88 0x4819038F 0x6461A044 0x3EFBEF19 0x0917F9E4 0x18DE1ABD 0x24832E68 0x4C2DB8BE 0x5AA130AF 0x1FEBFCEE
+0x5D8ED126 0x79880F17 0x4B882AD3 0x5CC58A2A 0x7F6EDA48 0x7E17DBB6 0x373635D6 0x2B037FB5 0x177CA57A 0x6766B5F1 0x28B3F77F 0x5D102AB0
+0x759C2AB1 0x51A821F5 0x456CF208 0x41A5F0D6 0x32077530 0x57144E19 0x0D28DCEB 0x730BDCE0 0x029B30E7 0x3750F773 0x3B24E070 0x66FCD12B
+0x764CE68C 0x443CDA54 0x7FDAEBE9 0x1AD014F5 0x106A9312 0x5A7C1C98 0x3ABC11E3 0x6DF96439 0x54042BB0 0x06443CB6 0x4ABEEE63 0x537305F8
+0x045C186C 0x01F52439 0x7E7685AD 0x1BD8BDE7 0x695BDA2B 0x272A7D2C 0x78E8E897 0x5EF804DC 0x78D29F21 0x3E55DA9F 0x209DF5B2 0x2ADA1452
+0x156A28B8 0x2DC6D29D 0x1DE5F132 0x1805599F 0x6517CA10 0x590AD1A2 0x7F022ACA 0x5B64B09D 0x1D47ABF7 0x7EDD16B3 0x7634C592 0x2DB23F09
+0x5959334C 0x30F0D775 0x1BABA342 0x2D5D5EFC 0x3735142C 0x666A91A6 0x00D064F4 0x3B912C98 0x685FB5DF 0x7F46EAA1 0x5769EA7F 0x51BB900A
+0x267167CD 0x5052D316 0x30B394E7 0x1F4406EE 0x0EA8ADB5 0x51518A99 0x4A1E1B40 0x2412D66D 0x7F185D37 0x68040C73 0x3C18300C 0x64302747
+0x410EDE15 0x3B1A5AD7 0x3F94D7E4 0x5E568A0C 0x39F7718A 0x35C99D76 0x0C08C916 0x1350A4D6 0x66BA74EC 0x27B46C58 0x40AE03D2 0x1DEF8918
+0x0E1EFDFE 0x417E68C6 0x5980B5B0 0x767EB3DE 0x40C55367 0x30EAA030 0x483A43E8 0x6736BB34 0x013D7346 0x78EDD8CF 0x067AC223 0x0FE620FC
+0x4A3F6369 0x5098DD63 0x33F8F769 0x4957C0A0 0x389CE9D6 0x70112776 0x2D87E7E7 0x79ABC7EC 0x2B2B824D 0x6D1CBFCC 0x580251F8 0x6522F3D7
+0x22E65D42 0x640B1B0E 0x787398AE 0x09A0D22E 0x0BBF8767 0x39219C80 0x27905B46 0x19DE8565 0x7AA00547 0x011110F7 0x105D3943 0x3B6558AE
+0x31FBB127 0x58977D2C 0x229C13E3 0x3339246D 0x518555FB 0x2916D606 0x431F4569 0x1BC4B964 0x79AFB369 0x77183CD3 0x651C7A04 0x324C9D40
+0x67296449 0x12A461EC 0x2BF8652C 0x1254E696 0x7FC121B8 0x03FAB724 0x7777DA6D 0x22A77EFA 0x6805D233 0x6FEB731B 0x2C485129 0x73C5599A
+0x290D0F9C 0x53D8AC6F 0x0DA3DEFF 0x23AD14E3 0x54E9BD66 0x1E011843 0x5F126D91 0x06E56E8D 0x7698956F 0x01AE8174 0x3A1E92FB 0x481DEB6A
+0x2AC5577A 0x7D3DD864 0x63E2A4CF 0x24750AE4 0x74561537 0x48FF1ED3 0x56C1A824 0x5B7F7980 0x5BA380BF 0x02BA0D50 0x6DD46016 0x5B64A277
+0x06B4C474 0x654C3A84 0x7E0C2172 0x6EBA96A7 0x5537AD9F 0x2A54729B 0x627FF041 0x7E44BD3B 0x7E2D1F0A 0x7023CF41 0x21F1D21E 0x5316DC71
+0x0E24E784 0x01043FB0 0x59FC4AFE 0x04BD7CF3 0x02B2C124 0x141ADDF9 0x4CDB685D 0x2D78189F 0x1158B65E 0x30BE0D2C 0x51ED2383 0x05AECB95
+0x79BD2C00 0x28AECBA7 0x612E4516 0x5560ACBF 0x2B68D8F7 0x4F02A52C 0x30C54F37 0x321D9D6B 0x344EDFB0 0x2ED170A9 0x20D83413 0x09868D50
+0x5925E344 0x03582454 0x07CB4A8B 0x5753024E 0x737BF395 0x29BD1CAA 0x2A69DEBF 0x01A0DB19 0x2AC15C5A 0x046629BE 0x065E580C 0x2D741D7E
+0x188107B7 0x5339C06A 0x5AEC361D 0x29D9BE15 0x03F7CD96 0x2CD959A0 0x2F8889AB 0x7DB4F996 0x55882547 0x10B6CEC1 0x5315A656 0x00F0FE3E
+0x5FB973ED 0x03DAF58D 0x330E9BAA 0x1408539E 0x32AC6636 0x53E6CFBD 0x1D8EE0EE 0x0BD2497A 0x573EF411 0x255A2B79 0x63254BC8 0x4ABAE7A7
+0x4F174823 0x0D8F2A88 0x4C5BC2C0 0x79D8A47D 0x11F55446 0x52BA1ACD 0x274CC1FC 0x2A765BFD 0x25F3DB37 0x0238F819 0x54501A13 0x29EBA8CD
+0x2F1251BA 0x03D8A3BE 0x27A0A264 0x049A7701 0x148F727F 0x7AB648BA 0x058B7540 0x7448E66C 0x7E913E47 0x389A10EA 0x08513A0A 0x313DA47D
+0x0C80E0A7 0x25E01AF8 0x3D0FEDF7 0x63BFD4B8 0x4B3A4672 0x203539BF 0x2E7ABC5F 0x1A518E95 0x2DC46447 0x7AD67F20 0x142A3313 0x3FB9B88D
+0x4D9099ED 0x3B76F50F 0x6A30148B 0x73847524 0x3DAFED28 0x3E802E9E 0x1D701DF1 0x6CC23EE2 0x4258D25C 0x4510C055 0x715CB5E4 0x56E844DB
+0x3FC7090F 0x76E82B24 0x4B312B47 0x3E584756 0x2F823C0E 0x53826552 0x6F95EBD3 0x3C031CB5 0x7962804A 0x2CA5D9CA 0x1FC2F16D 0x449CC6BC
+0x4CDB138A 0x4E3DADCD 0x5EEE5552 0x7A9F77D1 0x49142CED 0x73188865 0x3A59305F 0x16A4C6DA 0x2E8F7D74 0x248944EA 0x0A293BFE 0x6C3F6A9C
+0x63097388 0x279959EF 0x5901A97F 0x256245E4 0x6CAA1A45 0x4A5E5F63 0x7C4A8ABF 0x2C712354 0x41468A87 0x477BB606 0x6AC96AAB 0x70C8C695
+0x1AFE1B58 0x5A5F567E 0x2CCBE34A 0x14609BA3 0x07053049 0x4C8ED4B7 0x58FD625F 0x53E043D3 0x1ACC8284 0x37EBB7B1 0x4E7FBBA4 0x63E0AF71
+0x2B044016 0x08D8EC03 0x7A85764B 0x5993BD8A 0x2D6230ED 0x04AEB249 0x45D32827 0x106BA475 0x2C480C39 0x1ED4D1A6 0x35CDEA59 0x18F2267E
+0x69333109 0x32187518 0x456349D2 0x2A79BB90 0x79942B1F 0x302CB47D 0x1B428225 0x14924677 0x0A8C0AFC 0x480E656F 0x28F2E21A 0x11913B45
+0x149D3A26 0x01F0447A 0x65717F18 0x2F69BCAB 0x39DBFC2B 0x33F13ABC 0x134A6C1C 0x64E03C42 0x3CCA26C0 0x0DCFE268 0x3E73F9CC 0x6A2C57AD
+0x127E94B1 0x044721F3 0x7A97FC23 0x3EC6A0EA 0x231BF399 0x3065E67C 0x57B8C768 0x0C4F24A2 0x627E5B95 0x1D1C113B 0x36C8E032 0x5C1286B4
+0x4D48C5B8 0x520B6257 0x70A4CD2B 0x57D4D0B4 0x1A19C7C6 0x1997AF46 0x69660BF9 0x2EB701ED 0x1B87F3C0 0x4ED78B11 0x5E20BE98 0x5563EFEB
+0x02C8C5CE 0x716B2AB4 0x3A442C2D 0x3F92EC8E 0x7F3B0D1C 0x78B825FA 0x29BF443B 0x11B9A1CE 0x7CFF47ED 0x2457405E 0x508042B8 0x201B3B87
+0x54BD26DB 0x28390A21 0x2C6A6029 0x373B8270 0x45551B5C 0x6333405C 0x134E0924 0x129DE114 0x353EA2B3 0x03F2D64F 0x6A72B1C9 0x4F586A7A
+0x1D8A8595 0x53D8BDC2 0x7E0F6C67 0x39127955 0x22B048D4 0x5C302AFF 0x0E766941 0x25790EA2 0x4D9B55B3 0x48BA956E 0x650BFB30 0x4CD662D0
+0x4172BB68 0x0ECB3F6B 0x5E90049E 0x3E720356 0x33227FCA 0x2F104756 0x5E8D3EDD 0x07DFA6A5 0x57495177 0x0AF79F06 0x3F1B2915 0x1C9E6CD3
+0x6E2ADF62 0x52693239 0x2F3C4DE8 0x23698216 0x565C0888 0x19AEFFB1 0x72C1EC90 0x73E68E1E 0x6D87BD73 0x70D158F7 0x2CF90773 0x10380647
+0x4D0183F6 0x3B6F70B4 0x35B114E9 0x1A9CD9A9 0x042A0623 0x1ABD1019 0x67733C79 0x459CC18B 0x29884F85 0x46034117 0x040EC4E1 0x5CAACF4F
+0x7513886E 0x629C03BE 0x648A75F4 0x4C5CD9E5 0x6D93A2C5 0x23A59F09 0x68FB46B9 0x5BBE8227 0x760ED142 0x183794A1 0x7F28043D 0x4C6AD9CA
+0x31E69452 0x71E9F0CD 0x405167E8 0x1F6E51C5 0x62BB49C4 0x6D4A6F5C 0x2FA6580D 0x2FBCCDBA 0x28B9E010 0x65576CF6 0x4A59A764 0x2CE3E633
+0x00147D10 0x31CCE3DD 0x7280A7BF 0x299CCC95 0x77D024F5 0x768F6CA0 0x06479BE4 0x6CE3AD63 0x592B705F 0x6AD211D8 0x39408748 0x46BF1324
+0x0E77B0E1 0x223BCE01 0x227D954B 0x04868223 0x3A7362A2 0x21A59989 0x50F15BED 0x6C59F6F4 0x138F8A56 0x1142C3D6 0x0BC848BA 0x764AD41B
+0x7E8D3332 0x3B6EA0C7 0x2607A1D5 0x27471342 0x20C60DBD 0x70614939 0x542AF976 0x20DA8ACD 0x222E2D17 0x46ABA135 0x4A775762 0x19FE520C
+0x3D3B0DD5 0x50BEF346 0x06E1FF6F 0x16667E34 0x3B91051E 0x402286B7 0x5D259158 0x4A08B5FF 0x625E54B9 0x7FA326A4 0x4E8F3822 0x1CD1B75B
+0x2148C02D 0x1F809410 0x092BAE50 0x34D84A83 0x30C357E6 0x14F3F70A 0x2B231E9E 0x2F508B18 0x506297D1 0x512AC074 0x56979E5A 0x7128A58E
+0x418C09AD 0x2AC297D0 0x1203305C 0x63BA36C4 0x716E3905 0x5C7A87BE 0x7DB888D0 0x2EA946DB 0x2D397B05 0x049A883F 0x450FC50F 0x68CA8023
+0x44BD0EF7 0x22355668 0x32D33623 0x271B63B0 0x21D87D0C 0x01626E45 0x43ED1B0B 0x43213D39 0x20E30255 0x4D18C95B 0x77F987BC 0x51A65A3B
+0x620CC065 0x231CA65B 0x00F6E553 0x326F5836 0x744766CF 0x578E83AE 0x2397FDC5 0x35D3707C 0x02511B7E 0x359B2E21 0x198DA741 0x73BF5484
+0x1215B5DF 0x17463011 0x22689B5F 0x3F4F30E4 0x1BE0B851 0x6778606E 0x2819B108 0x609DC748 0x09ADB6D6 0x5AECE72B 0x07B92AF8 0x2B8633E2
+0x5C4F5570 0x4BA64603 0x6EA7711B 0x7D3257C6 0x18BF0F5F 0x66A0F8D8 0x4ED8B201 0x7ACBCFC4 0x09BD9F33 0x4FCF9755 0x2D3B27FB 0x7E050602
+0x275E1B03 0x50D325C0 0x33D8767E 0x29AF3681 0x066E53E1 0x4D661DBF 0x1D6E8B05 0x188409C0 0x64AC4DD1 0x3FD72664 0x57D33AA5 0x008D0622
+0x274F86D3 0x7FECEBAD 0x612ACD6A 0x30FD3DA9 0x5AD9D2D8 0x68E3F862 0x5C83718C 0x37292848 0x348A3E65 0x4B2AE2A7 0x345B800E 0x4D494DC4
+0x31CBDB7F 0x03343210 0x48151D89 0x3B897AB2 0x5303C965 0x75504584 0x398E80B4 0x7A61E468 0x46236B44 0x6D66F733 0x24111AE9 0x4C91BF25
+0x3ACD14F2 0x417FA5EF 0x6515C8E5 0x1F7962C3 0x0156CC53 0x3CE9038A 0x200668E5 0x28A65326 0x3CD5EF37 0x0131364F 0x59A390D0 0x17AFC20F
+0x6A152EB1 0x3627025C 0x4ED8EA58 0x1E9F6D17 0x0151E503 0x03346A66 0x6BE8BADB 0x331DC083 0x06689C76 0x33FDD864 0x6EA73B35 0x596C65DB
+0x294E1DE8 0x2835BBEA 0x53CE4A43 0x6F71892C 0x159CB31D 0x77DF652D 0x3C034851 0x5069C80F 0x395F0B1C 0x21191137 0x6FE32AD3 0x3AB5D76F
+0x5E0214C1 0x0FE993B8 0x635C2A96 0x1AD803F9 0x111ACA08 0x3CFFBB66 0x3287C608 0x7B2FF8B9 0x7326BDC2 0x0160B060 0x19CF65D0 0x7478A2C5
+0x04951AC7 0x05B820AC 0x27966348 0x0AFDB73D 0x39B5F910 0x163D9E7E 0x646A1D19 0x630416F9 0x3E735A68 0x3838675C 0x5275A025 0x54100D85
+0x3017CC89 0x0E78E877 0x2479D594 0x6976D7A5 0x2F91F9AE 0x145D0067 0x242CAF15 0x0D940E6F 0x24469420 0x0788D9AB 0x286C1268 0x35615E28
+0x44889511 0x5AF3D871 0x309156E1 0x37AF52D3 0x5C5488D1 0x4A60BCB2 0x2C27F598 0x60E9A398 0x5018DD5E 0x53BE58E1 0x6BE75AD6 0x09CED66E
+0x69FBF75F 0x505177EF 0x6CD2ED67 0x286F51C7 0x0889DF4B 0x3F488D8D 0x7C7F5F4C 0x38A1ABD5 0x4DC17604 0x20F934E0 0x2218837A 0x7D536FB2
+0x35563548 0x4645328F 0x0AE77E21 0x599CC968 0x4DCE0C3A 0x3353908A 0x0EFE2790 0x1256A14B 0x0E4768FB 0x3F8F7E71 0x4A05F41E 0x6A9BF1CC
+0x09F03B23 0x762DE9B7 0x4B859565 0x5A091881 0x49EC4298 0x376CF03B 0x63D7EEF0 0x33E839F7 0x07BE682A 0x50AADC57 0x5C578BBE 0x10484775
+0x0FF369E4 0x58D6EB0A 0x48E9F34A 0x5DB4DFE8 0x79D01FEA 0x6B0276C5 0x5B084F9A 0x2F265532 0x3147A954 0x65EFCDBC 0x08C31E9A 0x7F15B58F
+0x19435E46 0x17C1462A 0x116C56DA 0x278AC741 0x5750C49C 0x5B724AF9 0x1226B90D 0x6140FFBF 0x51A034B0 0x5DAC4E72 0x3B4A1841 0x1B8C7748
+0x15193EAD 0x1F220731 0x4F74B13F 0x1CD7A6D7 0x6FCCE388 0x2BCC3CFD 0x2D1FEE4D 0x7FC04D6D 0x04A32807 0x7609E197 0x5D752D55 0x7E7347F1
+0x610C585C 0x387D7CF0 0x2D999D24 0x125401B1 0x1E6D4AAC 0x365CBBBE 0x1169B740 0x37B0A8F2 0x4E1E01E9 0x22D60E1A 0x5F3B7033 0x256EC685
+0x7E485913 0x71622940 0x06AFC644 0x4FE88DC3 0x4F0E77B3 0x41F9DE85 0x6B75050B 0x6427B660 0x611BE5B6 0x3AE9B64A 0x00FF5D38 0x50E8C93F
+0x66B5F347 0x2E1F4B85 0x50A916AC 0x6B591B4E 0x24292D1C 0x2E1E4401 0x69CC6340 0x05358579 0x669BC0F1 0x17660064 0x1789872A 0x05090B9D
+0x4DC2BC22 0x28F33E6A 0x3CB9B48F 0x1BE0BE0B 0x4BC94C84 0x1BF524C2 0x414F8490 0x4A11A598 0x0D574E03 0x47FF4AD5 0x19FA335B 0x5C65C5B6
+0x09F9295A 0x056F3867 0x408D7C16 0x6B150F11 0x4058EEB1 0x418CD94E 0x3BFDD850 0x270EE1F9 0x6FAC24D3 0x0CA6EEFC 0x1267FD47 0x13D551F0
+0x3AC532FD 0x7C346087 0x190AD769 0x2160F3EF 0x139A60EB 0x30945E93 0x2669FF8C 0x615D1D0E 0x59879CFD 0x6323B41C 0x7D3DDB19 0x2550E981
+0x7F18D8DE 0x3E8D5FAA 0x6F628F19 0x0C7026E1 0x068CAA7F 0x095CC275 0x68D5EC97 0x1085D3D9 0x0ECBFADC 0x296368AE 0x7B9AE2EA 0x4F24E98D
+0x6AF041FC 0x3798BB3A 0x7633CB86 0x5A9C66D0 0x443FAA36 0x089BC8CE 0x6E71B8C0 0x7F04DD34 0x04D02955 0x077C9029 0x2065D123 0x186A8A41
+0x3810EEBC 0x46CFD0AF 0x79C7A74F 0x11988BB9 0x29F384CB 0x77058268 0x36E9753A 0x290C5DAA 0x3592E212 0x264C0454 0x357C848B 0x3C1F8C91
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_comp.amber
new file mode 100644 (file)
index 0000000..c54c5e1
--- /dev/null
@@ -0,0 +1,195 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A compute shader test for ModfStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 1;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uint in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+#     float modf_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+#     float modfStruct_out[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     float x;
+#     float i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (float orig)
+# {
+#     float x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (uint ndx = 0; ndx < ndp; ndx += 2)
+#     {
+#         uint in_uint = in_values[ndx/2];
+#         float in_float = uintBitsToFloat(in_uint);
+#         modf_out[ndx+1] = modf(in_float, modf_out[ndx]);
+#         modfStructType res = modfStruct(in_float);
+#         modfStruct_out[ndx] = res.i;
+#         modfStruct_out[ndx+1] = res.x;
+#     }
+#
+#     return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpDecorate %_arr_uint_uint_648 ArrayStride 4
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_1296 ArrayStride 4
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %block1 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_arr_float_uint_1296_0 ArrayStride 4
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %block2 BufferBlock
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%modfStructType = OpTypeStruct %float %float
+          %9 = OpTypeFunction %modfStructType %_ptr_Function_float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+  %uint_1296 = OpConstant %uint 1296
+       %bool = OpTypeBool
+   %uint_648 = OpConstant %uint 648
+%_arr_uint_uint_648 = OpTypeArray %uint %uint_648
+     %block0 = OpTypeStruct %_arr_uint_uint_648
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_arr_float_uint_1296 = OpTypeArray %float %uint_1296
+     %block1 = OpTypeStruct %_arr_float_uint_1296
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_arr_float_uint_1296_0 = OpTypeArray %float %uint_1296
+     %block2 = OpTypeStruct %_arr_float_uint_1296_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+        %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_uint Function
+   %in_float = OpVariable %_ptr_Function_float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %ndx %uint_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %uint %ndx
+         %37 = OpULessThan %bool %34 %uint_1296
+               OpBranchConditional %37 %30 %31
+         %30 = OpLabel
+         %46 = OpLoad %uint %ndx
+         %48 = OpUDiv %uint %46 %uint_2
+         %50 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %48
+         %51 = OpLoad %uint %50
+               OpStore %in_uint %51
+         %53 = OpLoad %uint %in_uint
+         %54 = OpBitcast %float %53
+               OpStore %in_float %54
+         %59 = OpLoad %uint %ndx
+         %61 = OpIAdd %uint %59 %uint_1
+         %62 = OpLoad %float %in_float
+         %63 = OpLoad %uint %ndx
+         %65 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %63
+         %66 = OpExtInst %float %1 Modf %62 %65
+         %67 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %61
+               OpStore %67 %66
+         %70 = OpLoad %float %in_float
+         %71 = OpExtInst %modfStructType %1 ModfStruct %70
+               OpStore %res_0 %71
+         %76 = OpLoad %uint %ndx
+         %78 = OpAccessChain %_ptr_Function_float %res_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %76
+               OpStore %80 %79
+         %81 = OpLoad %uint %ndx
+         %82 = OpIAdd %uint %81 %uint_1
+         %83 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %82
+               OpStore %85 %84
+               OpBranch %32
+         %32 = OpLabel
+         %86 = OpLoad %uint %ndx
+         %87 = OpIAdd %uint %86 %uint_2
+               OpStore %ndx %87
+               OpBranch %29
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_modf DATA_TYPE float SIZE 1296 FILL 0.0
+BUFFER buf_modfStruct DATA_TYPE float SIZE 1296 FILL 1.0
+
+PIPELINE compute test_pipeline
+    ATTACH comp_shader
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER buf_modf AS storage DESCRIPTOR_SET 0 BINDING 1
+    BIND BUFFER buf_modfStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_modf EQ_BUFFER buf_modfStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_frag.amber
new file mode 100644 (file)
index 0000000..c868b02
--- /dev/null
@@ -0,0 +1,278 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A fragment shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uint in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     float x;
+#     float i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (float orig)
+# {
+#     float x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uint in_uint = in_values[ndx_in];
+#     float in_float = uintBitsToFloat(in_uint);
+#     float x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.r = x;
+#     modf_i_out.r = i;
+#     modfStruct_x_out.r = res.x;
+#     modfStruct_i_out.r = res.i;
+#
+#     return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%modfStructType = OpTypeStruct %float %float
+          %9 = OpTypeFunction %modfStructType %_ptr_Function_float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+     %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_uint Function
+   %in_float = OpVariable %_ptr_Function_float Function
+        %x_0 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %37 = OpLoad %uint %ndx_in
+         %39 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %37
+         %40 = OpLoad %uint %39
+               OpStore %in_uint %40
+         %42 = OpLoad %uint %in_uint
+         %43 = OpBitcast %float %42
+               OpStore %in_float %43
+         %45 = OpLoad %float %in_float
+         %47 = OpExtInst %float %1 Modf %45 %i_0
+               OpStore %x_0 %47
+         %50 = OpLoad %float %in_float
+         %51 = OpExtInst %modfStructType %1 ModfStruct %50
+               OpStore %res_0 %51
+               OpStore %modf_x_out %57
+               OpStore %modf_i_out %57
+               OpStore %modfStruct_x_out %57
+               OpStore %modfStruct_i_out %57
+         %61 = OpLoad %float %x_0
+         %64 = OpAccessChain %_ptr_Output_float %modf_x_out %uint_0
+               OpStore %64 %61
+         %65 = OpLoad %float %i_0
+         %66 = OpAccessChain %_ptr_Output_float %modf_i_out %uint_0
+               OpStore %66 %65
+         %67 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Output_float %modfStruct_x_out %uint_0
+               OpStore %69 %68
+         %71 = OpAccessChain %_ptr_Function_float %res_0 %int_1
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Output_float %modfStruct_i_out %uint_0
+               OpStore %73 %72
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_geom.amber
new file mode 100644 (file)
index 0000000..ef83439
--- /dev/null
@@ -0,0 +1,420 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A geometry shader test for ModfStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uint in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out float modf_x_out;
+# layout (location = 1) flat out float modf_i_out;
+# layout (location = 2) flat out float modfStruct_x_out;
+# layout (location = 3) flat out float modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     float x;
+#     float i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (float orig)
+# {
+#     float x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (int vertex = 0; vertex < 3; vertex++)
+#     {
+#         uint in_uint = in_values[ndx_in[vertex]];
+#         float in_float = uintBitsToFloat(in_uint);
+#         float x, i;
+#         modfStructType res;
+#
+#         x = modf(in_float, i);
+#         res = modfStruct(in_float);
+#
+#         modf_x_out = x;
+#         modf_i_out = i;
+#         modfStruct_x_out = res.x;
+#         modfStruct_i_out = res.i;
+#
+#         gl_Position = gl_in[vertex].gl_Position;
+#         EmitVertex();
+#     }
+#
+#     EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+               OpCapability Geometry
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Geometry %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0 %gl_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main Invocations 1
+               OpExecutionMode %main OutputTriangleStrip
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%modfStructType = OpTypeStruct %float %float
+          %9 = OpTypeFunction %modfStructType %_ptr_Function_float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+     %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+     %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_float = OpTypePointer Output %float
+ %modf_x_out = OpVariable %_ptr_Output_float Output
+ %modf_i_out = OpVariable %_ptr_Output_float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_float Output
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %vertex = OpVariable %_ptr_Function_int Function
+    %in_uint = OpVariable %_ptr_Function_uint Function
+   %in_float = OpVariable %_ptr_Function_float Function
+        %x_0 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %vertex %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %vertex
+         %37 = OpSLessThan %bool %34 %int_3
+               OpBranchConditional %37 %30 %31
+         %30 = OpLabel
+         %50 = OpLoad %int %vertex
+         %52 = OpAccessChain %_ptr_Input_uint %ndx_in %50
+         %53 = OpLoad %uint %52
+         %55 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %53
+         %56 = OpLoad %uint %55
+               OpStore %in_uint %56
+         %58 = OpLoad %uint %in_uint
+         %59 = OpBitcast %float %58
+               OpStore %in_float %59
+         %61 = OpLoad %float %in_float
+         %63 = OpExtInst %float %1 Modf %61 %i_0
+               OpStore %x_0 %63
+         %66 = OpLoad %float %in_float
+         %67 = OpExtInst %modfStructType %1 ModfStruct %66
+               OpStore %res_0 %67
+         %70 = OpLoad %float %x_0
+               OpStore %modf_x_out %70
+         %72 = OpLoad %float %i_0
+               OpStore %modf_i_out %72
+         %74 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+         %75 = OpLoad %float %74
+               OpStore %modfStruct_x_out %75
+         %78 = OpAccessChain %_ptr_Function_float %res_0 %int_1
+         %79 = OpLoad %float %78
+               OpStore %modfStruct_i_out %79
+         %90 = OpLoad %int %vertex
+         %92 = OpAccessChain %_ptr_Input_v4float %gl_in %90 %int_0
+         %93 = OpLoad %v4float %92
+         %95 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %95 %93
+               OpEmitVertex
+               OpBranch %32
+         %32 = OpLabel
+         %96 = OpLoad %int %vertex
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %vertex %97
+               OpBranch %29
+         %31 = OpLabel
+               OpEndPrimitive
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float modf_x_in;
+# layout (location = 1) flat in float modf_i_in;
+# layout (location = 2) flat in float modfStruct_x_in;
+# layout (location = 3) flat in float modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.r = modf_x_in;
+#     modf_i_out.r = modf_i_in;
+#     modfStruct_x_out.r = modfStruct_x_in;
+#     modfStruct_i_out.r = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+  %modf_x_in = OpVariable %_ptr_Input_float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+  %modf_i_in = OpVariable %_ptr_Input_float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %18 = OpLoad %float %modf_x_in
+         %22 = OpAccessChain %_ptr_Output_float %modf_x_out %uint_0
+               OpStore %22 %18
+         %24 = OpLoad %float %modf_i_in
+         %25 = OpAccessChain %_ptr_Output_float %modf_i_out %uint_0
+               OpStore %25 %24
+         %27 = OpLoad %float %modfStruct_x_in
+         %28 = OpAccessChain %_ptr_Output_float %modfStruct_x_out %uint_0
+               OpStore %28 %27
+         %30 = OpLoad %float %modfStruct_i_in
+         %31 = OpAccessChain %_ptr_Output_float %modfStruct_i_out %uint_0
+               OpStore %31 %30
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH geom_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_tesc.amber
new file mode 100644 (file)
index 0000000..bc72715
--- /dev/null
@@ -0,0 +1,575 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out float modf_x_out[];
+# layout (location = 1) flat out float modf_i_out[];
+# layout (location = 2) flat out float modfStruct_x_out[];
+# layout (location = 3) flat out float modfStruct_i_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uint in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     float x;
+#     float i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (float orig)
+# {
+#     float x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uint in_uint = in_values[ndx_in[gl_InvocationID]];
+#     float in_float = uintBitsToFloat(in_uint);
+#     float x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out[gl_InvocationID] = x;
+#     modf_i_out[gl_InvocationID] = i;
+#     modfStruct_x_out[gl_InvocationID] = res.x;
+#     modfStruct_i_out[gl_InvocationID] = res.i;
+#
+#     gl_TessLevelInner[0] = 1.0;
+#     gl_TessLevelInner[1] = 1.0;
+#     gl_TessLevelOuter[0] = 1.0;
+#     gl_TessLevelOuter[1] = 1.0;
+#     gl_TessLevelOuter[2] = 1.0;
+#     gl_TessLevelOuter[3] = 1.0;
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%modfStructType = OpTypeStruct %float %float
+          %9 = OpTypeFunction %modfStructType %_ptr_Function_float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+     %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Output__arr_float_uint_3 = OpTypePointer Output %_arr_float_uint_3
+ %modf_x_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+%_ptr_Output_float = OpTypePointer Output %float
+ %modf_i_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+%modfStruct_x_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+%modfStruct_i_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+    %float_1 = OpConstant %float 1
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_uint Function
+   %in_float = OpVariable %_ptr_Function_float Function
+        %x_0 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %41 = OpLoad %int %gl_InvocationID
+         %43 = OpAccessChain %_ptr_Input_uint %ndx_in %41
+         %44 = OpLoad %uint %43
+         %46 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %44
+         %47 = OpLoad %uint %46
+               OpStore %in_uint %47
+         %49 = OpLoad %uint %in_uint
+         %50 = OpBitcast %float %49
+               OpStore %in_float %50
+         %52 = OpLoad %float %in_float
+         %54 = OpExtInst %float %1 Modf %52 %i_0
+               OpStore %x_0 %54
+         %57 = OpLoad %float %in_float
+         %58 = OpExtInst %modfStructType %1 ModfStruct %57
+               OpStore %res_0 %58
+         %63 = OpLoad %int %gl_InvocationID
+         %64 = OpLoad %float %x_0
+         %66 = OpAccessChain %_ptr_Output_float %modf_x_out %63
+               OpStore %66 %64
+         %68 = OpLoad %int %gl_InvocationID
+         %69 = OpLoad %float %i_0
+         %70 = OpAccessChain %_ptr_Output_float %modf_i_out %68
+               OpStore %70 %69
+         %72 = OpLoad %int %gl_InvocationID
+         %73 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Output_float %modfStruct_x_out %72
+               OpStore %75 %74
+         %77 = OpLoad %int %gl_InvocationID
+         %79 = OpAccessChain %_ptr_Function_float %res_0 %int_1
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Output_float %modfStruct_i_out %77
+               OpStore %81 %80
+         %87 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %87 %float_1
+         %88 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %88 %float_1
+         %93 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %93 %float_1
+         %94 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %94 %float_1
+         %96 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %96 %float_1
+         %98 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %98 %float_1
+        %106 = OpLoad %int %gl_InvocationID
+        %111 = OpLoad %int %gl_InvocationID
+        %113 = OpAccessChain %_ptr_Input_v4float %gl_in %111 %int_0
+        %114 = OpLoad %v4float %113
+        %116 = OpAccessChain %_ptr_Output_v4float %gl_out %106 %int_0
+               OpStore %116 %114
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in float modf_x_in[];
+# layout (location = 1) flat in float modf_i_in[];
+# layout (location = 2) flat in float modfStruct_x_in[];
+# layout (location = 3) flat in float modfStruct_i_in[];
+#
+# layout (location = 0) flat out float modf_x_out;
+# layout (location = 1) flat out float modf_i_out;
+# layout (location = 2) flat out float modfStruct_x_out;
+# layout (location = 3) flat out float modfStruct_i_out;
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     modf_x_out = modf_x_in[0];
+#     modf_i_out = modf_i_in[0];
+#     modfStruct_x_out = modfStruct_x_in[0];
+#     modfStruct_i_out = modfStruct_i_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output_float = OpTypePointer Output %float
+ %modf_x_out = OpVariable %_ptr_Output_float Output
+%_arr_float_uint_32 = OpTypeArray %float %uint_32
+%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
+  %modf_x_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+ %modf_i_out = OpVariable %_ptr_Output_float Output
+  %modf_i_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+%modfStruct_x_out = OpVariable %_ptr_Output_float Output
+%modfStruct_x_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+%modfStruct_i_out = OpVariable %_ptr_Output_float Output
+%modfStruct_i_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %22 = OpLoad %float %21
+         %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %30 = OpLoad %v4float %29
+         %31 = OpVectorTimesScalar %v4float %30 %22
+         %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %36 = OpLoad %v4float %35
+         %37 = OpVectorTimesScalar %v4float %36 %33
+         %38 = OpFAdd %v4float %31 %37
+         %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %44 = OpLoad %v4float %43
+         %45 = OpVectorTimesScalar %v4float %44 %41
+         %46 = OpFAdd %v4float %38 %45
+         %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %48 %46
+         %54 = OpAccessChain %_ptr_Input_float %modf_x_in %int_0
+         %55 = OpLoad %float %54
+               OpStore %modf_x_out %55
+         %58 = OpAccessChain %_ptr_Input_float %modf_i_in %int_0
+         %59 = OpLoad %float %58
+               OpStore %modf_i_out %59
+         %62 = OpAccessChain %_ptr_Input_float %modfStruct_x_in %int_0
+         %63 = OpLoad %float %62
+               OpStore %modfStruct_x_out %63
+         %66 = OpAccessChain %_ptr_Input_float %modfStruct_i_in %int_0
+         %67 = OpLoad %float %66
+               OpStore %modfStruct_i_out %67
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float modf_x_in;
+# layout (location = 1) flat in float modf_i_in;
+# layout (location = 2) flat in float modfStruct_x_in;
+# layout (location = 3) flat in float modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.r = modf_x_in;
+#     modf_i_out.r = modf_i_in;
+#     modfStruct_x_out.r = modfStruct_x_in;
+#     modfStruct_i_out.r = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+  %modf_x_in = OpVariable %_ptr_Input_float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+  %modf_i_in = OpVariable %_ptr_Input_float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %18 = OpLoad %float %modf_x_in
+         %22 = OpAccessChain %_ptr_Output_float %modf_x_out %uint_0
+               OpStore %22 %18
+         %24 = OpLoad %float %modf_i_in
+         %25 = OpAccessChain %_ptr_Output_float %modf_i_out %uint_0
+               OpStore %25 %24
+         %27 = OpLoad %float %modfStruct_x_in
+         %28 = OpAccessChain %_ptr_Output_float %modfStruct_x_out %uint_0
+               OpStore %28 %27
+         %30 = OpLoad %float %modfStruct_i_in
+         %31 = OpAccessChain %_ptr_Output_float %modfStruct_i_out %uint_0
+               OpStore %31 %30
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_tese.amber
new file mode 100644 (file)
index 0000000..72cd2e7
--- /dev/null
@@ -0,0 +1,531 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+#     gl_TessLevelInner[0]    = 1.0;
+#     gl_TessLevelInner[1]    = 1.0;
+#     gl_TessLevelOuter[0]    = 1.0;
+#     gl_TessLevelOuter[1]    = 1.0;
+#     gl_TessLevelOuter[2]    = 1.0;
+#     gl_TessLevelOuter[3]    = 1.0;
+#
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+#     ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+      %int_1 = OpConstant %int 1
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+     %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+    %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %16 %float_1
+         %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %18 %float_1
+         %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %23 %float_1
+         %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %24 %float_1
+         %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %26 %float_1
+         %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %28 %float_1
+         %39 = OpLoad %int %gl_InvocationID
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+         %48 = OpLoad %v4float %47
+         %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+               OpStore %50 %48
+         %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+         %61 = OpLoad %uint %60
+         %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+               OpStore %63 %61
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out float modf_x_out;
+# layout (location = 1) flat out float modf_i_out;
+# layout (location = 2) flat out float modfStruct_x_out;
+# layout (location = 3) flat out float modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uint in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     float x;
+#     float i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (float orig)
+# {
+#     float x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     uint in_uint = in_values[ndx_in[0]];
+#     float in_float = uintBitsToFloat(in_uint);
+#     float x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = res.i;
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%modfStructType = OpTypeStruct %float %float
+          %9 = OpTypeFunction %modfStructType %_ptr_Function_float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Function_uint = OpTypePointer Function %uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+     %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_float = OpTypePointer Output %float
+ %modf_x_out = OpVariable %_ptr_Output_float Output
+ %modf_i_out = OpVariable %_ptr_Output_float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_float Output
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_uint Function
+   %in_float = OpVariable %_ptr_Function_float Function
+        %x_0 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %39 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %40 = OpLoad %float %39
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %48 = OpLoad %v4float %47
+         %49 = OpVectorTimesScalar %v4float %48 %40
+         %50 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %54 = OpLoad %v4float %53
+         %55 = OpVectorTimesScalar %v4float %54 %51
+         %56 = OpFAdd %v4float %49 %55
+         %58 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %62 = OpLoad %v4float %61
+         %63 = OpVectorTimesScalar %v4float %62 %59
+         %64 = OpFAdd %v4float %56 %63
+         %66 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %66 %64
+         %78 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+         %79 = OpLoad %uint %78
+         %81 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %79
+         %82 = OpLoad %uint %81
+               OpStore %in_uint %82
+         %84 = OpLoad %uint %in_uint
+         %85 = OpBitcast %float %84
+               OpStore %in_float %85
+         %87 = OpLoad %float %in_float
+         %89 = OpExtInst %float %1 Modf %87 %i_0
+               OpStore %x_0 %89
+         %92 = OpLoad %float %in_float
+         %93 = OpExtInst %modfStructType %1 ModfStruct %92
+               OpStore %res_0 %93
+         %96 = OpLoad %float %x_0
+               OpStore %modf_x_out %96
+         %98 = OpLoad %float %i_0
+               OpStore %modf_i_out %98
+        %100 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+        %101 = OpLoad %float %100
+               OpStore %modfStruct_x_out %101
+        %103 = OpAccessChain %_ptr_Function_float %res_0 %int_1
+        %104 = OpLoad %float %103
+               OpStore %modfStruct_i_out %104
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float modf_x_in;
+# layout (location = 1) flat in float modf_i_in;
+# layout (location = 2) flat in float modfStruct_x_in;
+# layout (location = 3) flat in float modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.r = modf_x_in;
+#     modf_i_out.r = modf_i_in;
+#     modfStruct_x_out.r = modfStruct_x_in;
+#     modfStruct_i_out.r = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+  %modf_x_in = OpVariable %_ptr_Input_float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+  %modf_i_in = OpVariable %_ptr_Input_float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %18 = OpLoad %float %modf_x_in
+         %22 = OpAccessChain %_ptr_Output_float %modf_x_out %uint_0
+               OpStore %22 %18
+         %24 = OpLoad %float %modf_i_in
+         %25 = OpAccessChain %_ptr_Output_float %modf_i_out %uint_0
+               OpStore %25 %24
+         %27 = OpLoad %float %modfStruct_x_in
+         %28 = OpAccessChain %_ptr_Output_float %modfStruct_x_out %uint_0
+               OpStore %28 %27
+         %30 = OpLoad %float %modfStruct_i_in
+         %31 = OpAccessChain %_ptr_Output_float %modfStruct_i_out %uint_0
+               OpStore %31 %30
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_1_vert.amber
new file mode 100644 (file)
index 0000000..0dde427
--- /dev/null
@@ -0,0 +1,321 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A vertex shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out float modf_x_out;
+# layout (location = 1) flat out float modf_i_out;
+# layout (location = 2) flat out float modfStruct_x_out;
+# layout (location = 3) flat out float modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uint in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     float x;
+#     float i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (float orig)
+# {
+#     float x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     uint ndx = xcoord + ycoord * ndpSqrt;
+#
+#     uint in_uint = in_values[ndx];
+#     float in_float = uintBitsToFloat(in_uint);
+#     float x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = i;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0
+               OpDecorate %position Location 0
+               OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%modfStructType = OpTypeStruct %float %float
+          %9 = OpTypeFunction %modfStructType %_ptr_Function_float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+   %float_36 = OpConstant %float 36
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+     %uint_1 = OpConstant %uint 1
+    %uint_36 = OpConstant %uint 36
+  %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+     %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_float = OpTypePointer Output %float
+ %modf_x_out = OpVariable %_ptr_Output_float Output
+ %modf_i_out = OpVariable %_ptr_Output_float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_float Output
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %xcoord = OpVariable %_ptr_Function_uint Function
+     %ycoord = OpVariable %_ptr_Function_uint Function
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_uint Function
+   %in_float = OpVariable %_ptr_Function_float Function
+        %x_0 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %34 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpFAdd %float %35 %float_0_027777778
+         %39 = OpFAdd %float %37 %float_1
+         %41 = OpFDiv %float %39 %float_2
+         %42 = OpFMul %float %float_36 %41
+         %43 = OpFSub %float %42 %float_1
+         %44 = OpConvertFToU %uint %43
+               OpStore %xcoord %44
+         %47 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpFAdd %float %48 %float_0_027777778
+         %50 = OpFAdd %float %49 %float_1
+         %51 = OpFDiv %float %50 %float_2
+         %52 = OpFMul %float %float_36 %51
+         %53 = OpFSub %float %52 %float_1
+         %54 = OpConvertFToU %uint %53
+               OpStore %ycoord %54
+         %56 = OpLoad %uint %xcoord
+         %57 = OpLoad %uint %ycoord
+         %59 = OpIMul %uint %57 %uint_36
+         %60 = OpIAdd %uint %56 %59
+               OpStore %ndx %60
+         %69 = OpLoad %uint %ndx
+         %71 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %69
+         %72 = OpLoad %uint %71
+               OpStore %in_uint %72
+         %74 = OpLoad %uint %in_uint
+         %75 = OpBitcast %float %74
+               OpStore %in_float %75
+         %77 = OpLoad %float %in_float
+         %79 = OpExtInst %float %1 Modf %77 %i_0
+               OpStore %x_0 %79
+         %82 = OpLoad %float %in_float
+         %83 = OpExtInst %modfStructType %1 ModfStruct %82
+               OpStore %res_0 %83
+         %86 = OpLoad %float %x_0
+               OpStore %modf_x_out %86
+         %88 = OpLoad %float %i_0
+               OpStore %modf_i_out %88
+         %90 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+         %91 = OpLoad %float %90
+               OpStore %modfStruct_x_out %91
+         %93 = OpLoad %float %i_0
+               OpStore %modfStruct_i_out %93
+         %99 = OpLoad %v2float %position
+        %101 = OpCompositeExtract %float %99 0
+        %102 = OpCompositeExtract %float %99 1
+        %103 = OpCompositeConstruct %v4float %101 %102 %float_0 %float_1
+        %105 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %105 %103
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float modf_x_in;
+# layout (location = 1) flat in float modf_i_in;
+# layout (location = 2) flat in float modfStruct_x_in;
+# layout (location = 3) flat in float modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.r = modf_x_in;
+#     modf_i_out.r = modf_i_in;
+#     modfStruct_x_out.r = modfStruct_x_in;
+#     modfStruct_i_out.r = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+  %modf_x_in = OpVariable %_ptr_Input_float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+  %modf_i_in = OpVariable %_ptr_Input_float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %18 = OpLoad %float %modf_x_in
+         %22 = OpAccessChain %_ptr_Output_float %modf_x_out %uint_0
+               OpStore %22 %18
+         %24 = OpLoad %float %modf_i_in
+         %25 = OpAccessChain %_ptr_Output_float %modf_i_out %uint_0
+               OpStore %25 %24
+         %27 = OpLoad %float %modfStruct_x_in
+         %28 = OpAccessChain %_ptr_Output_float %modfStruct_x_out %uint_0
+               OpStore %28 %27
+         %30 = OpLoad %float %modfStruct_i_in
+         %31 = OpAccessChain %_ptr_Output_float %modfStruct_i_out %uint_0
+               OpStore %31 %30
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_comp.amber
new file mode 100644 (file)
index 0000000..67aaaa2
--- /dev/null
@@ -0,0 +1,198 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A compute shader test for ModfStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 2;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec2 in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+#     vec2 modf_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+#     vec2 modfStruct_out[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec2 x;
+#     vec2 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec2 orig)
+# {
+#     vec2 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (uint ndx = 0; ndx < ndp; ndx += 2)
+#     {
+#         uvec2 in_uint = in_values[ndx/2];
+#         vec2 in_float = uintBitsToFloat(in_uint);
+#         modf_out[ndx+1] = modf(in_float, modf_out[ndx]);
+#         modfStructType res = modfStruct(in_float);
+#         modfStruct_out[ndx] = res.i;
+#         modfStruct_out[ndx+1] = res.x;
+#     }
+#
+#     return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpDecorate %_arr_v2uint_uint_324 ArrayStride 8
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_v2float_uint_648 ArrayStride 8
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %block1 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_arr_v2float_uint_648_0 ArrayStride 8
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %block2 BufferBlock
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%modfStructType = OpTypeStruct %v2float %v2float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v2float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+   %uint_648 = OpConstant %uint 648
+       %bool = OpTypeBool
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+   %uint_324 = OpConstant %uint 324
+%_arr_v2uint_uint_324 = OpTypeArray %v2uint %uint_324
+     %block0 = OpTypeStruct %_arr_v2uint_uint_324
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_arr_v2float_uint_648 = OpTypeArray %v2float %uint_648
+     %block1 = OpTypeStruct %_arr_v2float_uint_648
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_arr_v2float_uint_648_0 = OpTypeArray %v2float %uint_648
+     %block2 = OpTypeStruct %_arr_v2float_uint_648_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+        %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_v2uint Function
+   %in_float = OpVariable %_ptr_Function_v2float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %ndx %uint_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %uint %ndx
+         %38 = OpULessThan %bool %35 %uint_648
+               OpBranchConditional %38 %31 %32
+         %31 = OpLabel
+         %49 = OpLoad %uint %ndx
+         %51 = OpUDiv %uint %49 %uint_2
+         %53 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %51
+         %54 = OpLoad %v2uint %53
+               OpStore %in_uint %54
+         %56 = OpLoad %v2uint %in_uint
+         %57 = OpBitcast %v2float %56
+               OpStore %in_float %57
+         %62 = OpLoad %uint %ndx
+         %64 = OpIAdd %uint %62 %uint_1
+         %65 = OpLoad %v2float %in_float
+         %66 = OpLoad %uint %ndx
+         %68 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %66
+         %69 = OpExtInst %v2float %1 Modf %65 %68
+         %70 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %64
+               OpStore %70 %69
+         %73 = OpLoad %v2float %in_float
+         %74 = OpExtInst %modfStructType %1 ModfStruct %73
+               OpStore %res_0 %74
+         %79 = OpLoad %uint %ndx
+         %81 = OpAccessChain %_ptr_Function_v2float %res_0 %int_1
+         %82 = OpLoad %v2float %81
+         %83 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0 %79
+               OpStore %83 %82
+         %84 = OpLoad %uint %ndx
+         %85 = OpIAdd %uint %84 %uint_1
+         %86 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+         %87 = OpLoad %v2float %86
+         %88 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0 %85
+               OpStore %88 %87
+               OpBranch %33
+         %33 = OpLabel
+         %89 = OpLoad %uint %ndx
+         %90 = OpIAdd %uint %89 %uint_2
+               OpStore %ndx %90
+               OpBranch %30
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_modf DATA_TYPE vec2<float> SIZE 648 FILL 0.0
+BUFFER buf_modfStruct DATA_TYPE vec2<float> SIZE 648 FILL 1.0
+
+PIPELINE compute test_pipeline
+    ATTACH comp_shader
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER buf_modf AS storage DESCRIPTOR_SET 0 BINDING 1
+    BIND BUFFER buf_modfStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_modf EQ_BUFFER buf_modfStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_frag.amber
new file mode 100644 (file)
index 0000000..0f34df9
--- /dev/null
@@ -0,0 +1,282 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A fragment shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec2 in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     vec2 x;
+#     vec2 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec2 orig)
+# {
+#     vec2 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uvec2 in_uint = in_values[ndx_in];
+#     vec2 in_float = uintBitsToFloat(in_uint);
+#     vec2 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rg = x;
+#     modf_i_out.rg = i;
+#     modfStruct_x_out.rg = res.x;
+#     modfStruct_i_out.rg = res.i;
+#
+#     return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%modfStructType = OpTypeStruct %v2float %v2float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v2float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %59 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v2uint Function
+   %in_float = OpVariable %_ptr_Function_v2float Function
+        %x_0 = OpVariable %_ptr_Function_v2float Function
+        %i_0 = OpVariable %_ptr_Function_v2float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %39 = OpLoad %uint %ndx_in
+         %41 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %39
+         %42 = OpLoad %v2uint %41
+               OpStore %in_uint %42
+         %44 = OpLoad %v2uint %in_uint
+         %45 = OpBitcast %v2float %44
+               OpStore %in_float %45
+         %47 = OpLoad %v2float %in_float
+         %49 = OpExtInst %v2float %1 Modf %47 %i_0
+               OpStore %x_0 %49
+         %52 = OpLoad %v2float %in_float
+         %53 = OpExtInst %modfStructType %1 ModfStruct %52
+               OpStore %res_0 %53
+               OpStore %modf_x_out %59
+               OpStore %modf_i_out %59
+               OpStore %modfStruct_x_out %59
+               OpStore %modfStruct_i_out %59
+         %63 = OpLoad %v2float %x_0
+         %64 = OpLoad %v4float %modf_x_out
+         %65 = OpVectorShuffle %v4float %64 %63 4 5 2 3
+               OpStore %modf_x_out %65
+         %66 = OpLoad %v2float %i_0
+         %67 = OpLoad %v4float %modf_i_out
+         %68 = OpVectorShuffle %v4float %67 %66 4 5 2 3
+               OpStore %modf_i_out %68
+         %69 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+         %70 = OpLoad %v2float %69
+         %71 = OpLoad %v4float %modfStruct_x_out
+         %72 = OpVectorShuffle %v4float %71 %70 4 5 2 3
+               OpStore %modfStruct_x_out %72
+         %74 = OpAccessChain %_ptr_Function_v2float %res_0 %int_1
+         %75 = OpLoad %v2float %74
+         %76 = OpLoad %v4float %modfStruct_i_out
+         %77 = OpVectorShuffle %v4float %76 %75 4 5 2 3
+               OpStore %modfStruct_i_out %77
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_geom.amber
new file mode 100644 (file)
index 0000000..1a496b4
--- /dev/null
@@ -0,0 +1,424 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A geometry shader test for ModfStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec2 in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec2 modf_x_out;
+# layout (location = 1) flat out vec2 modf_i_out;
+# layout (location = 2) flat out vec2 modfStruct_x_out;
+# layout (location = 3) flat out vec2 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     vec2 x;
+#     vec2 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec2 orig)
+# {
+#     vec2 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (int vertex = 0; vertex < 3; vertex++)
+#     {
+#         uvec2 in_uint = in_values[ndx_in[vertex]];
+#         vec2 in_float = uintBitsToFloat(in_uint);
+#         vec2 x, i;
+#         modfStructType res;
+#
+#         x = modf(in_float, i);
+#         res = modfStruct(in_float);
+#
+#         modf_x_out = x;
+#         modf_i_out = i;
+#         modfStruct_x_out = res.x;
+#         modfStruct_i_out = res.i;
+#
+#         gl_Position = gl_in[vertex].gl_Position;
+#         EmitVertex();
+#     }
+#
+#     EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+               OpCapability Geometry
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Geometry %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0 %gl_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main Invocations 1
+               OpExecutionMode %main OutputTriangleStrip
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%modfStructType = OpTypeStruct %v2float %v2float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v2float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+     %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+ %modf_x_out = OpVariable %_ptr_Output_v2float Output
+ %modf_i_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v2float Output
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %vertex = OpVariable %_ptr_Function_int Function
+    %in_uint = OpVariable %_ptr_Function_v2uint Function
+   %in_float = OpVariable %_ptr_Function_v2float Function
+        %x_0 = OpVariable %_ptr_Function_v2float Function
+        %i_0 = OpVariable %_ptr_Function_v2float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %vertex %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %vertex
+         %38 = OpSLessThan %bool %35 %int_3
+               OpBranchConditional %38 %31 %32
+         %31 = OpLabel
+         %52 = OpLoad %int %vertex
+         %54 = OpAccessChain %_ptr_Input_uint %ndx_in %52
+         %55 = OpLoad %uint %54
+         %57 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %55
+         %58 = OpLoad %v2uint %57
+               OpStore %in_uint %58
+         %60 = OpLoad %v2uint %in_uint
+         %61 = OpBitcast %v2float %60
+               OpStore %in_float %61
+         %63 = OpLoad %v2float %in_float
+         %65 = OpExtInst %v2float %1 Modf %63 %i_0
+               OpStore %x_0 %65
+         %68 = OpLoad %v2float %in_float
+         %69 = OpExtInst %modfStructType %1 ModfStruct %68
+               OpStore %res_0 %69
+         %72 = OpLoad %v2float %x_0
+               OpStore %modf_x_out %72
+         %74 = OpLoad %v2float %i_0
+               OpStore %modf_i_out %74
+         %76 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+         %77 = OpLoad %v2float %76
+               OpStore %modfStruct_x_out %77
+         %80 = OpAccessChain %_ptr_Function_v2float %res_0 %int_1
+         %81 = OpLoad %v2float %80
+               OpStore %modfStruct_i_out %81
+         %92 = OpLoad %int %vertex
+         %94 = OpAccessChain %_ptr_Input_v4float %gl_in %92 %int_0
+         %95 = OpLoad %v4float %94
+         %97 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %97 %95
+               OpEmitVertex
+               OpBranch %33
+         %33 = OpLabel
+         %98 = OpLoad %int %vertex
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %vertex %99
+               OpBranch %30
+         %32 = OpLabel
+               OpEndPrimitive
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 modf_x_in;
+# layout (location = 1) flat in vec2 modf_i_in;
+# layout (location = 2) flat in vec2 modfStruct_x_in;
+# layout (location = 3) flat in vec2 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rg = modf_x_in;
+#     modf_i_out.rg = modf_i_in;
+#     modfStruct_x_out.rg = modfStruct_x_in;
+#     modfStruct_i_out.rg = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+  %modf_x_in = OpVariable %_ptr_Input_v2float Input
+  %modf_i_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v2float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v2float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v2float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v2float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v2float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH geom_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_tesc.amber
new file mode 100644 (file)
index 0000000..8d47b83
--- /dev/null
@@ -0,0 +1,582 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec2 modf_x_out[];
+# layout (location = 1) flat out vec2 modf_i_out[];
+# layout (location = 2) flat out vec2 modfStruct_x_out[];
+# layout (location = 3) flat out vec2 modfStruct_i_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec2 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec2 x;
+#     vec2 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec2 orig)
+# {
+#     vec2 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uvec2 in_uint = in_values[ndx_in[gl_InvocationID]];
+#     vec2 in_float = uintBitsToFloat(in_uint);
+#     vec2 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out[gl_InvocationID] = x;
+#     modf_i_out[gl_InvocationID] = i;
+#     modfStruct_x_out[gl_InvocationID] = res.x;
+#     modfStruct_i_out[gl_InvocationID] = res.i;
+#
+#     gl_TessLevelInner[0] = 1.0;
+#     gl_TessLevelInner[1] = 1.0;
+#     gl_TessLevelOuter[0] = 1.0;
+#     gl_TessLevelOuter[1] = 1.0;
+#     gl_TessLevelOuter[2] = 1.0;
+#     gl_TessLevelOuter[3] = 1.0;
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%modfStructType = OpTypeStruct %v2float %v2float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v2float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+     %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%_ptr_Output__arr_v2float_uint_3 = OpTypePointer Output %_arr_v2float_uint_3
+ %modf_x_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+ %modf_i_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+%modfStruct_x_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+%modfStruct_i_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v2uint Function
+   %in_float = OpVariable %_ptr_Function_v2float Function
+        %x_0 = OpVariable %_ptr_Function_v2float Function
+        %i_0 = OpVariable %_ptr_Function_v2float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %43 = OpLoad %int %gl_InvocationID
+         %45 = OpAccessChain %_ptr_Input_uint %ndx_in %43
+         %46 = OpLoad %uint %45
+         %48 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %46
+         %49 = OpLoad %v2uint %48
+               OpStore %in_uint %49
+         %51 = OpLoad %v2uint %in_uint
+         %52 = OpBitcast %v2float %51
+               OpStore %in_float %52
+         %54 = OpLoad %v2float %in_float
+         %56 = OpExtInst %v2float %1 Modf %54 %i_0
+               OpStore %x_0 %56
+         %59 = OpLoad %v2float %in_float
+         %60 = OpExtInst %modfStructType %1 ModfStruct %59
+               OpStore %res_0 %60
+         %65 = OpLoad %int %gl_InvocationID
+         %66 = OpLoad %v2float %x_0
+         %68 = OpAccessChain %_ptr_Output_v2float %modf_x_out %65
+               OpStore %68 %66
+         %70 = OpLoad %int %gl_InvocationID
+         %71 = OpLoad %v2float %i_0
+         %72 = OpAccessChain %_ptr_Output_v2float %modf_i_out %70
+               OpStore %72 %71
+         %74 = OpLoad %int %gl_InvocationID
+         %75 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+         %76 = OpLoad %v2float %75
+         %77 = OpAccessChain %_ptr_Output_v2float %modfStruct_x_out %74
+               OpStore %77 %76
+         %79 = OpLoad %int %gl_InvocationID
+         %81 = OpAccessChain %_ptr_Function_v2float %res_0 %int_1
+         %82 = OpLoad %v2float %81
+         %83 = OpAccessChain %_ptr_Output_v2float %modfStruct_i_out %79
+               OpStore %83 %82
+         %90 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %90 %float_1
+         %91 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %91 %float_1
+         %96 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %96 %float_1
+         %97 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %97 %float_1
+         %99 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %99 %float_1
+        %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %101 %float_1
+        %109 = OpLoad %int %gl_InvocationID
+        %114 = OpLoad %int %gl_InvocationID
+        %116 = OpAccessChain %_ptr_Input_v4float %gl_in %114 %int_0
+        %117 = OpLoad %v4float %116
+        %119 = OpAccessChain %_ptr_Output_v4float %gl_out %109 %int_0
+               OpStore %119 %117
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in vec2 modf_x_in[];
+# layout (location = 1) flat in vec2 modf_i_in[];
+# layout (location = 2) flat in vec2 modfStruct_x_in[];
+# layout (location = 3) flat in vec2 modfStruct_i_in[];
+#
+# layout (location = 0) flat out vec2 modf_x_out;
+# layout (location = 1) flat out vec2 modf_i_out;
+# layout (location = 2) flat out vec2 modfStruct_x_out;
+# layout (location = 3) flat out vec2 modfStruct_i_out;
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     modf_x_out = modf_x_in[0];
+#     modf_i_out = modf_i_in[0];
+#     modfStruct_x_out = modfStruct_x_in[0];
+#     modfStruct_i_out = modfStruct_i_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+    %v2float = OpTypeVector %float 2
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+ %modf_x_out = OpVariable %_ptr_Output_v2float Output
+%_arr_v2float_uint_32 = OpTypeArray %v2float %uint_32
+%_ptr_Input__arr_v2float_uint_32 = OpTypePointer Input %_arr_v2float_uint_32
+  %modf_x_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %modf_i_out = OpVariable %_ptr_Output_v2float Output
+  %modf_i_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_x_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_i_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %22 = OpLoad %float %21
+         %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %30 = OpLoad %v4float %29
+         %31 = OpVectorTimesScalar %v4float %30 %22
+         %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %36 = OpLoad %v4float %35
+         %37 = OpVectorTimesScalar %v4float %36 %33
+         %38 = OpFAdd %v4float %31 %37
+         %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %44 = OpLoad %v4float %43
+         %45 = OpVectorTimesScalar %v4float %44 %41
+         %46 = OpFAdd %v4float %38 %45
+         %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %48 %46
+         %56 = OpAccessChain %_ptr_Input_v2float %modf_x_in %int_0
+         %57 = OpLoad %v2float %56
+               OpStore %modf_x_out %57
+         %60 = OpAccessChain %_ptr_Input_v2float %modf_i_in %int_0
+         %61 = OpLoad %v2float %60
+               OpStore %modf_i_out %61
+         %64 = OpAccessChain %_ptr_Input_v2float %modfStruct_x_in %int_0
+         %65 = OpLoad %v2float %64
+               OpStore %modfStruct_x_out %65
+         %68 = OpAccessChain %_ptr_Input_v2float %modfStruct_i_in %int_0
+         %69 = OpLoad %v2float %68
+               OpStore %modfStruct_i_out %69
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 modf_x_in;
+# layout (location = 1) flat in vec2 modf_i_in;
+# layout (location = 2) flat in vec2 modfStruct_x_in;
+# layout (location = 3) flat in vec2 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rg = modf_x_in;
+#     modf_i_out.rg = modf_i_in;
+#     modfStruct_x_out.rg = modfStruct_x_in;
+#     modfStruct_i_out.rg = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+  %modf_x_in = OpVariable %_ptr_Input_v2float Input
+  %modf_i_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v2float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v2float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v2float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v2float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v2float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_tese.amber
new file mode 100644 (file)
index 0000000..4aa6288
--- /dev/null
@@ -0,0 +1,535 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+#     gl_TessLevelInner[0]    = 1.0;
+#     gl_TessLevelInner[1]    = 1.0;
+#     gl_TessLevelOuter[0]    = 1.0;
+#     gl_TessLevelOuter[1]    = 1.0;
+#     gl_TessLevelOuter[2]    = 1.0;
+#     gl_TessLevelOuter[3]    = 1.0;
+#
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+#     ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+      %int_1 = OpConstant %int 1
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+     %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+    %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %16 %float_1
+         %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %18 %float_1
+         %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %23 %float_1
+         %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %24 %float_1
+         %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %26 %float_1
+         %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %28 %float_1
+         %39 = OpLoad %int %gl_InvocationID
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+         %48 = OpLoad %v4float %47
+         %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+               OpStore %50 %48
+         %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+         %61 = OpLoad %uint %60
+         %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+               OpStore %63 %61
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec2 modf_x_out;
+# layout (location = 1) flat out vec2 modf_i_out;
+# layout (location = 2) flat out vec2 modfStruct_x_out;
+# layout (location = 3) flat out vec2 modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec2 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec2 x;
+#     vec2 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec2 orig)
+# {
+#     vec2 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     uvec2 in_uint = in_values[ndx_in[0]];
+#     vec2 in_float = uintBitsToFloat(in_uint);
+#     vec2 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = res.i;
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%modfStructType = OpTypeStruct %v2float %v2float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v2float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+ %modf_x_out = OpVariable %_ptr_Output_v2float Output
+ %modf_i_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v2float Output
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v2uint Function
+   %in_float = OpVariable %_ptr_Function_v2float Function
+        %x_0 = OpVariable %_ptr_Function_v2float Function
+        %i_0 = OpVariable %_ptr_Function_v2float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %41 = OpLoad %float %40
+         %48 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %49 = OpLoad %v4float %48
+         %50 = OpVectorTimesScalar %v4float %49 %41
+         %51 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %52 = OpLoad %float %51
+         %54 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %55 = OpLoad %v4float %54
+         %56 = OpVectorTimesScalar %v4float %55 %52
+         %57 = OpFAdd %v4float %50 %56
+         %59 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %63 = OpLoad %v4float %62
+         %64 = OpVectorTimesScalar %v4float %63 %60
+         %65 = OpFAdd %v4float %57 %64
+         %67 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %67 %65
+         %80 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+         %81 = OpLoad %uint %80
+         %83 = OpAccessChain %_ptr_Uniform_v2uint %__0 %int_0 %81
+         %84 = OpLoad %v2uint %83
+               OpStore %in_uint %84
+         %86 = OpLoad %v2uint %in_uint
+         %87 = OpBitcast %v2float %86
+               OpStore %in_float %87
+         %89 = OpLoad %v2float %in_float
+         %91 = OpExtInst %v2float %1 Modf %89 %i_0
+               OpStore %x_0 %91
+         %94 = OpLoad %v2float %in_float
+         %95 = OpExtInst %modfStructType %1 ModfStruct %94
+               OpStore %res_0 %95
+         %98 = OpLoad %v2float %x_0
+               OpStore %modf_x_out %98
+        %100 = OpLoad %v2float %i_0
+               OpStore %modf_i_out %100
+        %102 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+        %103 = OpLoad %v2float %102
+               OpStore %modfStruct_x_out %103
+        %105 = OpAccessChain %_ptr_Function_v2float %res_0 %int_1
+        %106 = OpLoad %v2float %105
+               OpStore %modfStruct_i_out %106
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 modf_x_in;
+# layout (location = 1) flat in vec2 modf_i_in;
+# layout (location = 2) flat in vec2 modfStruct_x_in;
+# layout (location = 3) flat in vec2 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rg = modf_x_in;
+#     modf_i_out.rg = modf_i_in;
+#     modfStruct_x_out.rg = modfStruct_x_in;
+#     modfStruct_i_out.rg = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+  %modf_x_in = OpVariable %_ptr_Input_v2float Input
+  %modf_i_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v2float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v2float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v2float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v2float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v2float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_2_vert.amber
new file mode 100644 (file)
index 0000000..e84edaf
--- /dev/null
@@ -0,0 +1,325 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A vertex shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out vec2 modf_x_out;
+# layout (location = 1) flat out vec2 modf_i_out;
+# layout (location = 2) flat out vec2 modfStruct_x_out;
+# layout (location = 3) flat out vec2 modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec2 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec2 x;
+#     vec2 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec2 orig)
+# {
+#     vec2 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     uint ndx = xcoord + ycoord * ndpSqrt;
+#
+#     uvec2 in_uint = in_values[ndx];
+#     vec2 in_float = uintBitsToFloat(in_uint);
+#     vec2 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = i;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0
+               OpDecorate %position Location 0
+               OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%modfStructType = OpTypeStruct %v2float %v2float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v2float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+   %float_36 = OpConstant %float 36
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+     %uint_1 = OpConstant %uint 1
+    %uint_36 = OpConstant %uint 36
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+ %modf_x_out = OpVariable %_ptr_Output_v2float Output
+ %modf_i_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v2float Output
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %xcoord = OpVariable %_ptr_Function_uint Function
+     %ycoord = OpVariable %_ptr_Function_uint Function
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_v2uint Function
+   %in_float = OpVariable %_ptr_Function_v2float Function
+        %x_0 = OpVariable %_ptr_Function_v2float Function
+        %i_0 = OpVariable %_ptr_Function_v2float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %34 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpFAdd %float %35 %float_0_027777778
+         %39 = OpFAdd %float %37 %float_1
+         %41 = OpFDiv %float %39 %float_2
+         %42 = OpFMul %float %float_36 %41
+         %43 = OpFSub %float %42 %float_1
+         %44 = OpConvertFToU %uint %43
+               OpStore %xcoord %44
+         %47 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpFAdd %float %48 %float_0_027777778
+         %50 = OpFAdd %float %49 %float_1
+         %51 = OpFDiv %float %50 %float_2
+         %52 = OpFMul %float %float_36 %51
+         %53 = OpFSub %float %52 %float_1
+         %54 = OpConvertFToU %uint %53
+               OpStore %ycoord %54
+         %56 = OpLoad %uint %xcoord
+         %57 = OpLoad %uint %ycoord
+         %59 = OpIMul %uint %57 %uint_36
+         %60 = OpIAdd %uint %56 %59
+               OpStore %ndx %60
+         %71 = OpLoad %uint %ndx
+         %73 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %71
+         %74 = OpLoad %v2uint %73
+               OpStore %in_uint %74
+         %76 = OpLoad %v2uint %in_uint
+         %77 = OpBitcast %v2float %76
+               OpStore %in_float %77
+         %79 = OpLoad %v2float %in_float
+         %81 = OpExtInst %v2float %1 Modf %79 %i_0
+               OpStore %x_0 %81
+         %84 = OpLoad %v2float %in_float
+         %85 = OpExtInst %modfStructType %1 ModfStruct %84
+               OpStore %res_0 %85
+         %88 = OpLoad %v2float %x_0
+               OpStore %modf_x_out %88
+         %90 = OpLoad %v2float %i_0
+               OpStore %modf_i_out %90
+         %92 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+         %93 = OpLoad %v2float %92
+               OpStore %modfStruct_x_out %93
+         %95 = OpLoad %v2float %i_0
+               OpStore %modfStruct_i_out %95
+        %101 = OpLoad %v2float %position
+        %103 = OpCompositeExtract %float %101 0
+        %104 = OpCompositeExtract %float %101 1
+        %105 = OpCompositeConstruct %v4float %103 %104 %float_0 %float_1
+        %107 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %107 %105
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 modf_x_in;
+# layout (location = 1) flat in vec2 modf_i_in;
+# layout (location = 2) flat in vec2 modfStruct_x_in;
+# layout (location = 3) flat in vec2 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rg = modf_x_in;
+#     modf_i_out.rg = modf_i_in;
+#     modfStruct_x_out.rg = modfStruct_x_in;
+#     modfStruct_i_out.rg = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+  %modf_x_in = OpVariable %_ptr_Input_v2float Input
+  %modf_i_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v2float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v2float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v2float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v2float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v2float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_comp.amber
new file mode 100644 (file)
index 0000000..ab999e5
--- /dev/null
@@ -0,0 +1,198 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A compute shader test for ModfStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 3;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec3 in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+#     vec3 modf_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+#     vec3 modfStruct_out[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec3 x;
+#     vec3 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec3 orig)
+# {
+#     vec3 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (uint ndx = 0; ndx < ndp; ndx += 2)
+#     {
+#         uvec3 in_uint = in_values[ndx/2];
+#         vec3 in_float = uintBitsToFloat(in_uint);
+#         modf_out[ndx+1] = modf(in_float, modf_out[ndx]);
+#         modfStructType res = modfStruct(in_float);
+#         modfStruct_out[ndx] = res.i;
+#         modfStruct_out[ndx+1] = res.x;
+#     }
+#
+#     return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpDecorate %_arr_v3uint_uint_216 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_v3float_uint_432 ArrayStride 16
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %block1 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_arr_v3float_uint_432_0 ArrayStride 16
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %block2 BufferBlock
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%modfStructType = OpTypeStruct %v3float %v3float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v3float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+   %uint_432 = OpConstant %uint 432
+       %bool = OpTypeBool
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+   %uint_216 = OpConstant %uint 216
+%_arr_v3uint_uint_216 = OpTypeArray %v3uint %uint_216
+     %block0 = OpTypeStruct %_arr_v3uint_uint_216
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_arr_v3float_uint_432 = OpTypeArray %v3float %uint_432
+     %block1 = OpTypeStruct %_arr_v3float_uint_432
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
+%_arr_v3float_uint_432_0 = OpTypeArray %v3float %uint_432
+     %block2 = OpTypeStruct %_arr_v3float_uint_432_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+        %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_v3uint Function
+   %in_float = OpVariable %_ptr_Function_v3float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %ndx %uint_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %uint %ndx
+         %38 = OpULessThan %bool %35 %uint_432
+               OpBranchConditional %38 %31 %32
+         %31 = OpLabel
+         %49 = OpLoad %uint %ndx
+         %51 = OpUDiv %uint %49 %uint_2
+         %53 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %51
+         %54 = OpLoad %v3uint %53
+               OpStore %in_uint %54
+         %56 = OpLoad %v3uint %in_uint
+         %57 = OpBitcast %v3float %56
+               OpStore %in_float %57
+         %62 = OpLoad %uint %ndx
+         %64 = OpIAdd %uint %62 %uint_1
+         %65 = OpLoad %v3float %in_float
+         %66 = OpLoad %uint %ndx
+         %68 = OpAccessChain %_ptr_Uniform_v3float %__0 %int_0 %66
+         %69 = OpExtInst %v3float %1 Modf %65 %68
+         %70 = OpAccessChain %_ptr_Uniform_v3float %__0 %int_0 %64
+               OpStore %70 %69
+         %73 = OpLoad %v3float %in_float
+         %74 = OpExtInst %modfStructType %1 ModfStruct %73
+               OpStore %res_0 %74
+         %79 = OpLoad %uint %ndx
+         %81 = OpAccessChain %_ptr_Function_v3float %res_0 %int_1
+         %82 = OpLoad %v3float %81
+         %83 = OpAccessChain %_ptr_Uniform_v3float %__1 %int_0 %79
+               OpStore %83 %82
+         %84 = OpLoad %uint %ndx
+         %85 = OpIAdd %uint %84 %uint_1
+         %86 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+         %87 = OpLoad %v3float %86
+         %88 = OpAccessChain %_ptr_Uniform_v3float %__1 %int_0 %85
+               OpStore %88 %87
+               OpBranch %33
+         %33 = OpLabel
+         %89 = OpLoad %uint %ndx
+         %90 = OpIAdd %uint %89 %uint_2
+               OpStore %ndx %90
+               OpBranch %30
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_modf DATA_TYPE vec3<float> SIZE 432 FILL 0.0
+BUFFER buf_modfStruct DATA_TYPE vec3<float> SIZE 432 FILL 1.0
+
+PIPELINE compute test_pipeline
+    ATTACH comp_shader
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER buf_modf AS storage DESCRIPTOR_SET 0 BINDING 1
+    BIND BUFFER buf_modfStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_modf EQ_BUFFER buf_modfStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_frag.amber
new file mode 100644 (file)
index 0000000..69dbd14
--- /dev/null
@@ -0,0 +1,282 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A fragment shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec3 in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     vec3 x;
+#     vec3 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec3 orig)
+# {
+#     vec3 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uvec3 in_uint = in_values[ndx_in];
+#     vec3 in_float = uintBitsToFloat(in_uint);
+#     vec3 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rgb = x;
+#     modf_i_out.rgb = i;
+#     modfStruct_x_out.rgb = res.x;
+#     modfStruct_i_out.rgb = res.i;
+#
+#     return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%modfStructType = OpTypeStruct %v3float %v3float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v3float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %59 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v3uint Function
+   %in_float = OpVariable %_ptr_Function_v3float Function
+        %x_0 = OpVariable %_ptr_Function_v3float Function
+        %i_0 = OpVariable %_ptr_Function_v3float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %39 = OpLoad %uint %ndx_in
+         %41 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %39
+         %42 = OpLoad %v3uint %41
+               OpStore %in_uint %42
+         %44 = OpLoad %v3uint %in_uint
+         %45 = OpBitcast %v3float %44
+               OpStore %in_float %45
+         %47 = OpLoad %v3float %in_float
+         %49 = OpExtInst %v3float %1 Modf %47 %i_0
+               OpStore %x_0 %49
+         %52 = OpLoad %v3float %in_float
+         %53 = OpExtInst %modfStructType %1 ModfStruct %52
+               OpStore %res_0 %53
+               OpStore %modf_x_out %59
+               OpStore %modf_i_out %59
+               OpStore %modfStruct_x_out %59
+               OpStore %modfStruct_i_out %59
+         %63 = OpLoad %v3float %x_0
+         %64 = OpLoad %v4float %modf_x_out
+         %65 = OpVectorShuffle %v4float %64 %63 4 5 6 3
+               OpStore %modf_x_out %65
+         %66 = OpLoad %v3float %i_0
+         %67 = OpLoad %v4float %modf_i_out
+         %68 = OpVectorShuffle %v4float %67 %66 4 5 6 3
+               OpStore %modf_i_out %68
+         %69 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+         %70 = OpLoad %v3float %69
+         %71 = OpLoad %v4float %modfStruct_x_out
+         %72 = OpVectorShuffle %v4float %71 %70 4 5 6 3
+               OpStore %modfStruct_x_out %72
+         %74 = OpAccessChain %_ptr_Function_v3float %res_0 %int_1
+         %75 = OpLoad %v3float %74
+         %76 = OpLoad %v4float %modfStruct_i_out
+         %77 = OpVectorShuffle %v4float %76 %75 4 5 6 3
+               OpStore %modfStruct_i_out %77
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_geom.amber
new file mode 100644 (file)
index 0000000..95c0364
--- /dev/null
@@ -0,0 +1,424 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A geometry shader test for ModfStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec3 in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec3 modf_x_out;
+# layout (location = 1) flat out vec3 modf_i_out;
+# layout (location = 2) flat out vec3 modfStruct_x_out;
+# layout (location = 3) flat out vec3 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     vec3 x;
+#     vec3 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec3 orig)
+# {
+#     vec3 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (int vertex = 0; vertex < 3; vertex++)
+#     {
+#         uvec3 in_uint = in_values[ndx_in[vertex]];
+#         vec3 in_float = uintBitsToFloat(in_uint);
+#         vec3 x, i;
+#         modfStructType res;
+#
+#         x = modf(in_float, i);
+#         res = modfStruct(in_float);
+#
+#         modf_x_out = x;
+#         modf_i_out = i;
+#         modfStruct_x_out = res.x;
+#         modfStruct_i_out = res.i;
+#
+#         gl_Position = gl_in[vertex].gl_Position;
+#         EmitVertex();
+#     }
+#
+#     EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+               OpCapability Geometry
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Geometry %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0 %gl_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main Invocations 1
+               OpExecutionMode %main OutputTriangleStrip
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%modfStructType = OpTypeStruct %v3float %v3float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v3float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+     %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+ %modf_x_out = OpVariable %_ptr_Output_v3float Output
+ %modf_i_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v3float Output
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %vertex = OpVariable %_ptr_Function_int Function
+    %in_uint = OpVariable %_ptr_Function_v3uint Function
+   %in_float = OpVariable %_ptr_Function_v3float Function
+        %x_0 = OpVariable %_ptr_Function_v3float Function
+        %i_0 = OpVariable %_ptr_Function_v3float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %vertex %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %vertex
+         %38 = OpSLessThan %bool %35 %int_3
+               OpBranchConditional %38 %31 %32
+         %31 = OpLabel
+         %52 = OpLoad %int %vertex
+         %54 = OpAccessChain %_ptr_Input_uint %ndx_in %52
+         %55 = OpLoad %uint %54
+         %57 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %55
+         %58 = OpLoad %v3uint %57
+               OpStore %in_uint %58
+         %60 = OpLoad %v3uint %in_uint
+         %61 = OpBitcast %v3float %60
+               OpStore %in_float %61
+         %63 = OpLoad %v3float %in_float
+         %65 = OpExtInst %v3float %1 Modf %63 %i_0
+               OpStore %x_0 %65
+         %68 = OpLoad %v3float %in_float
+         %69 = OpExtInst %modfStructType %1 ModfStruct %68
+               OpStore %res_0 %69
+         %72 = OpLoad %v3float %x_0
+               OpStore %modf_x_out %72
+         %74 = OpLoad %v3float %i_0
+               OpStore %modf_i_out %74
+         %76 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+         %77 = OpLoad %v3float %76
+               OpStore %modfStruct_x_out %77
+         %80 = OpAccessChain %_ptr_Function_v3float %res_0 %int_1
+         %81 = OpLoad %v3float %80
+               OpStore %modfStruct_i_out %81
+         %92 = OpLoad %int %vertex
+         %94 = OpAccessChain %_ptr_Input_v4float %gl_in %92 %int_0
+         %95 = OpLoad %v4float %94
+         %97 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %97 %95
+               OpEmitVertex
+               OpBranch %33
+         %33 = OpLabel
+         %98 = OpLoad %int %vertex
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %vertex %99
+               OpBranch %30
+         %32 = OpLabel
+               OpEndPrimitive
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 modf_x_in;
+# layout (location = 1) flat in vec3 modf_i_in;
+# layout (location = 2) flat in vec3 modfStruct_x_in;
+# layout (location = 3) flat in vec3 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rgb = modf_x_in;
+#     modf_i_out.rgb = modf_i_in;
+#     modfStruct_x_out.rgb = modfStruct_x_in;
+#     modfStruct_i_out.rgb = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+  %modf_x_in = OpVariable %_ptr_Input_v3float Input
+  %modf_i_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v3float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v3float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v3float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v3float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v3float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH geom_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_tesc.amber
new file mode 100644 (file)
index 0000000..a333797
--- /dev/null
@@ -0,0 +1,580 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec3 modf_x_out[];
+# layout (location = 1) flat out vec3 modf_i_out[];
+# layout (location = 2) flat out vec3 modfStruct_x_out[];
+# layout (location = 3) flat out vec3 modfStruct_i_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec3 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec3 x;
+#     vec3 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec3 orig)
+# {
+#     vec3 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uvec3 in_uint = in_values[ndx_in[gl_InvocationID]];
+#     vec3 in_float = uintBitsToFloat(in_uint);
+#     vec3 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out[gl_InvocationID] = x;
+#     modf_i_out[gl_InvocationID] = i;
+#     modfStruct_x_out[gl_InvocationID] = res.x;
+#     modfStruct_i_out[gl_InvocationID] = res.i;
+#
+#     gl_TessLevelInner[0] = 1.0;
+#     gl_TessLevelInner[1] = 1.0;
+#     gl_TessLevelOuter[0] = 1.0;
+#     gl_TessLevelOuter[1] = 1.0;
+#     gl_TessLevelOuter[2] = 1.0;
+#     gl_TessLevelOuter[3] = 1.0;
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%modfStructType = OpTypeStruct %v3float %v3float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v3float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+     %uint_3 = OpConstant %uint 3
+%_arr_v3float_uint_3 = OpTypeArray %v3float %uint_3
+%_ptr_Output__arr_v3float_uint_3 = OpTypePointer Output %_arr_v3float_uint_3
+ %modf_x_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+ %modf_i_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+%modfStruct_x_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+%modfStruct_i_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v3uint Function
+   %in_float = OpVariable %_ptr_Function_v3float Function
+        %x_0 = OpVariable %_ptr_Function_v3float Function
+        %i_0 = OpVariable %_ptr_Function_v3float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %43 = OpLoad %int %gl_InvocationID
+         %45 = OpAccessChain %_ptr_Input_uint %ndx_in %43
+         %46 = OpLoad %uint %45
+         %48 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %46
+         %49 = OpLoad %v3uint %48
+               OpStore %in_uint %49
+         %51 = OpLoad %v3uint %in_uint
+         %52 = OpBitcast %v3float %51
+               OpStore %in_float %52
+         %54 = OpLoad %v3float %in_float
+         %56 = OpExtInst %v3float %1 Modf %54 %i_0
+               OpStore %x_0 %56
+         %59 = OpLoad %v3float %in_float
+         %60 = OpExtInst %modfStructType %1 ModfStruct %59
+               OpStore %res_0 %60
+         %65 = OpLoad %int %gl_InvocationID
+         %66 = OpLoad %v3float %x_0
+         %68 = OpAccessChain %_ptr_Output_v3float %modf_x_out %65
+               OpStore %68 %66
+         %70 = OpLoad %int %gl_InvocationID
+         %71 = OpLoad %v3float %i_0
+         %72 = OpAccessChain %_ptr_Output_v3float %modf_i_out %70
+               OpStore %72 %71
+         %74 = OpLoad %int %gl_InvocationID
+         %75 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+         %76 = OpLoad %v3float %75
+         %77 = OpAccessChain %_ptr_Output_v3float %modfStruct_x_out %74
+               OpStore %77 %76
+         %79 = OpLoad %int %gl_InvocationID
+         %81 = OpAccessChain %_ptr_Function_v3float %res_0 %int_1
+         %82 = OpLoad %v3float %81
+         %83 = OpAccessChain %_ptr_Output_v3float %modfStruct_i_out %79
+               OpStore %83 %82
+         %90 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %90 %float_1
+         %91 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %91 %float_1
+         %96 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %96 %float_1
+         %97 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %97 %float_1
+         %99 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %99 %float_1
+        %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %101 %float_1
+        %109 = OpLoad %int %gl_InvocationID
+        %114 = OpLoad %int %gl_InvocationID
+        %116 = OpAccessChain %_ptr_Input_v4float %gl_in %114 %int_0
+        %117 = OpLoad %v4float %116
+        %119 = OpAccessChain %_ptr_Output_v4float %gl_out %109 %int_0
+               OpStore %119 %117
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in vec3 modf_x_in[];
+# layout (location = 1) flat in vec3 modf_i_in[];
+# layout (location = 2) flat in vec3 modfStruct_x_in[];
+# layout (location = 3) flat in vec3 modfStruct_i_in[];
+#
+# layout (location = 0) flat out vec3 modf_x_out;
+# layout (location = 1) flat out vec3 modf_i_out;
+# layout (location = 2) flat out vec3 modfStruct_x_out;
+# layout (location = 3) flat out vec3 modfStruct_i_out;
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     modf_x_out = modf_x_in[0];
+#     modf_i_out = modf_i_in[0];
+#     modfStruct_x_out = modfStruct_x_in[0];
+#     modfStruct_i_out = modfStruct_i_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+ %modf_x_out = OpVariable %_ptr_Output_v3float Output
+%_arr_v3float_uint_32 = OpTypeArray %v3float %uint_32
+%_ptr_Input__arr_v3float_uint_32 = OpTypePointer Input %_arr_v3float_uint_32
+  %modf_x_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+ %modf_i_out = OpVariable %_ptr_Output_v3float Output
+  %modf_i_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_x_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_i_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %22 = OpLoad %float %21
+         %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %30 = OpLoad %v4float %29
+         %31 = OpVectorTimesScalar %v4float %30 %22
+         %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %36 = OpLoad %v4float %35
+         %37 = OpVectorTimesScalar %v4float %36 %33
+         %38 = OpFAdd %v4float %31 %37
+         %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %44 = OpLoad %v4float %43
+         %45 = OpVectorTimesScalar %v4float %44 %41
+         %46 = OpFAdd %v4float %38 %45
+         %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %48 %46
+         %54 = OpAccessChain %_ptr_Input_v3float %modf_x_in %int_0
+         %55 = OpLoad %v3float %54
+               OpStore %modf_x_out %55
+         %58 = OpAccessChain %_ptr_Input_v3float %modf_i_in %int_0
+         %59 = OpLoad %v3float %58
+               OpStore %modf_i_out %59
+         %62 = OpAccessChain %_ptr_Input_v3float %modfStruct_x_in %int_0
+         %63 = OpLoad %v3float %62
+               OpStore %modfStruct_x_out %63
+         %66 = OpAccessChain %_ptr_Input_v3float %modfStruct_i_in %int_0
+         %67 = OpLoad %v3float %66
+               OpStore %modfStruct_i_out %67
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 modf_x_in;
+# layout (location = 1) flat in vec3 modf_i_in;
+# layout (location = 2) flat in vec3 modfStruct_x_in;
+# layout (location = 3) flat in vec3 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rgb = modf_x_in;
+#     modf_i_out.rgb = modf_i_in;
+#     modfStruct_x_out.rgb = modfStruct_x_in;
+#     modfStruct_i_out.rgb = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+  %modf_x_in = OpVariable %_ptr_Input_v3float Input
+  %modf_i_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v3float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v3float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v3float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v3float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v3float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_tese.amber
new file mode 100644 (file)
index 0000000..3c22a61
--- /dev/null
@@ -0,0 +1,534 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+#     gl_TessLevelInner[0]    = 1.0;
+#     gl_TessLevelInner[1]    = 1.0;
+#     gl_TessLevelOuter[0]    = 1.0;
+#     gl_TessLevelOuter[1]    = 1.0;
+#     gl_TessLevelOuter[2]    = 1.0;
+#     gl_TessLevelOuter[3]    = 1.0;
+#
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+#     ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+      %int_1 = OpConstant %int 1
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+     %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+    %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %16 %float_1
+         %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %18 %float_1
+         %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %23 %float_1
+         %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %24 %float_1
+         %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %26 %float_1
+         %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %28 %float_1
+         %39 = OpLoad %int %gl_InvocationID
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+         %48 = OpLoad %v4float %47
+         %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+               OpStore %50 %48
+         %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+         %61 = OpLoad %uint %60
+         %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+               OpStore %63 %61
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec3 modf_x_out;
+# layout (location = 1) flat out vec3 modf_i_out;
+# layout (location = 2) flat out vec3 modfStruct_x_out;
+# layout (location = 3) flat out vec3 modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec3 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec3 x;
+#     vec3 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec3 orig)
+# {
+#     vec3 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     uvec3 in_uint = in_values[ndx_in[0]];
+#     vec3 in_float = uintBitsToFloat(in_uint);
+#     vec3 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = res.i;
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%modfStructType = OpTypeStruct %v3float %v3float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v3float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+ %modf_x_out = OpVariable %_ptr_Output_v3float Output
+ %modf_i_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v3float Output
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v3uint Function
+   %in_float = OpVariable %_ptr_Function_v3float Function
+        %x_0 = OpVariable %_ptr_Function_v3float Function
+        %i_0 = OpVariable %_ptr_Function_v3float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %39 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %40 = OpLoad %float %39
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %48 = OpLoad %v4float %47
+         %49 = OpVectorTimesScalar %v4float %48 %40
+         %50 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %54 = OpLoad %v4float %53
+         %55 = OpVectorTimesScalar %v4float %54 %51
+         %56 = OpFAdd %v4float %49 %55
+         %58 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %62 = OpLoad %v4float %61
+         %63 = OpVectorTimesScalar %v4float %62 %59
+         %64 = OpFAdd %v4float %56 %63
+         %66 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %66 %64
+         %79 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+         %80 = OpLoad %uint %79
+         %82 = OpAccessChain %_ptr_Uniform_v3uint %__0 %int_0 %80
+         %83 = OpLoad %v3uint %82
+               OpStore %in_uint %83
+         %85 = OpLoad %v3uint %in_uint
+         %86 = OpBitcast %v3float %85
+               OpStore %in_float %86
+         %88 = OpLoad %v3float %in_float
+         %90 = OpExtInst %v3float %1 Modf %88 %i_0
+               OpStore %x_0 %90
+         %93 = OpLoad %v3float %in_float
+         %94 = OpExtInst %modfStructType %1 ModfStruct %93
+               OpStore %res_0 %94
+         %97 = OpLoad %v3float %x_0
+               OpStore %modf_x_out %97
+         %99 = OpLoad %v3float %i_0
+               OpStore %modf_i_out %99
+        %101 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+        %102 = OpLoad %v3float %101
+               OpStore %modfStruct_x_out %102
+        %104 = OpAccessChain %_ptr_Function_v3float %res_0 %int_1
+        %105 = OpLoad %v3float %104
+               OpStore %modfStruct_i_out %105
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 modf_x_in;
+# layout (location = 1) flat in vec3 modf_i_in;
+# layout (location = 2) flat in vec3 modfStruct_x_in;
+# layout (location = 3) flat in vec3 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rgb = modf_x_in;
+#     modf_i_out.rgb = modf_i_in;
+#     modfStruct_x_out.rgb = modfStruct_x_in;
+#     modfStruct_i_out.rgb = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+  %modf_x_in = OpVariable %_ptr_Input_v3float Input
+  %modf_i_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v3float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v3float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v3float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v3float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v3float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_3_vert.amber
new file mode 100644 (file)
index 0000000..807024b
--- /dev/null
@@ -0,0 +1,326 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A vertex shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out vec3 modf_x_out;
+# layout (location = 1) flat out vec3 modf_i_out;
+# layout (location = 2) flat out vec3 modfStruct_x_out;
+# layout (location = 3) flat out vec3 modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec3 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec3 x;
+#     vec3 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec3 orig)
+# {
+#     vec3 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     uint ndx = xcoord + ycoord * ndpSqrt;
+#
+#     uvec3 in_uint = in_values[ndx];
+#     vec3 in_float = uintBitsToFloat(in_uint);
+#     vec3 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = i;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0
+               OpDecorate %position Location 0
+               OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%modfStructType = OpTypeStruct %v3float %v3float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v3float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+   %float_36 = OpConstant %float 36
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+     %uint_1 = OpConstant %uint 1
+    %uint_36 = OpConstant %uint 36
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+ %modf_x_out = OpVariable %_ptr_Output_v3float Output
+ %modf_i_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v3float Output
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %xcoord = OpVariable %_ptr_Function_uint Function
+     %ycoord = OpVariable %_ptr_Function_uint Function
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_v3uint Function
+   %in_float = OpVariable %_ptr_Function_v3float Function
+        %x_0 = OpVariable %_ptr_Function_v3float Function
+        %i_0 = OpVariable %_ptr_Function_v3float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %35 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %36 = OpLoad %float %35
+         %38 = OpFAdd %float %36 %float_0_027777778
+         %40 = OpFAdd %float %38 %float_1
+         %42 = OpFDiv %float %40 %float_2
+         %43 = OpFMul %float %float_36 %42
+         %44 = OpFSub %float %43 %float_1
+         %45 = OpConvertFToU %uint %44
+               OpStore %xcoord %45
+         %48 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpFAdd %float %49 %float_0_027777778
+         %51 = OpFAdd %float %50 %float_1
+         %52 = OpFDiv %float %51 %float_2
+         %53 = OpFMul %float %float_36 %52
+         %54 = OpFSub %float %53 %float_1
+         %55 = OpConvertFToU %uint %54
+               OpStore %ycoord %55
+         %57 = OpLoad %uint %xcoord
+         %58 = OpLoad %uint %ycoord
+         %60 = OpIMul %uint %58 %uint_36
+         %61 = OpIAdd %uint %57 %60
+               OpStore %ndx %61
+         %72 = OpLoad %uint %ndx
+         %74 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %72
+         %75 = OpLoad %v3uint %74
+               OpStore %in_uint %75
+         %77 = OpLoad %v3uint %in_uint
+         %78 = OpBitcast %v3float %77
+               OpStore %in_float %78
+         %80 = OpLoad %v3float %in_float
+         %82 = OpExtInst %v3float %1 Modf %80 %i_0
+               OpStore %x_0 %82
+         %85 = OpLoad %v3float %in_float
+         %86 = OpExtInst %modfStructType %1 ModfStruct %85
+               OpStore %res_0 %86
+         %89 = OpLoad %v3float %x_0
+               OpStore %modf_x_out %89
+         %91 = OpLoad %v3float %i_0
+               OpStore %modf_i_out %91
+         %93 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+         %94 = OpLoad %v3float %93
+               OpStore %modfStruct_x_out %94
+         %96 = OpLoad %v3float %i_0
+               OpStore %modfStruct_i_out %96
+        %102 = OpLoad %v2float %position
+        %104 = OpCompositeExtract %float %102 0
+        %105 = OpCompositeExtract %float %102 1
+        %106 = OpCompositeConstruct %v4float %104 %105 %float_0 %float_1
+        %108 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %108 %106
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 modf_x_in;
+# layout (location = 1) flat in vec3 modf_i_in;
+# layout (location = 2) flat in vec3 modfStruct_x_in;
+# layout (location = 3) flat in vec3 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+#     modf_x_out = clear_value;
+#     modf_i_out = clear_value;
+#     modfStruct_x_out = clear_value;
+#     modfStruct_i_out = clear_value;
+#     modf_x_out.rgb = modf_x_in;
+#     modf_i_out.rgb = modf_i_in;
+#     modfStruct_x_out.rgb = modfStruct_x_in;
+#     modfStruct_i_out.rgb = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %modf_x_in %modf_i_in %modfStruct_x_in %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+  %modf_x_in = OpVariable %_ptr_Input_v3float Input
+  %modf_i_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%modfStruct_i_in = OpVariable %_ptr_Input_v3float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+               OpStore %modf_x_out %12
+               OpStore %modf_i_out %12
+               OpStore %modfStruct_x_out %12
+               OpStore %modfStruct_i_out %12
+         %19 = OpLoad %v3float %modf_x_in
+         %20 = OpLoad %v4float %modf_x_out
+         %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+               OpStore %modf_x_out %21
+         %23 = OpLoad %v3float %modf_i_in
+         %24 = OpLoad %v4float %modf_i_out
+         %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+               OpStore %modf_i_out %25
+         %27 = OpLoad %v3float %modfStruct_x_in
+         %28 = OpLoad %v4float %modfStruct_x_out
+         %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+               OpStore %modfStruct_x_out %29
+         %31 = OpLoad %v3float %modfStruct_i_in
+         %32 = OpLoad %v4float %modfStruct_i_out
+         %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+               OpStore %modfStruct_i_out %33
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_comp.amber
new file mode 100644 (file)
index 0000000..fed02e3
--- /dev/null
@@ -0,0 +1,198 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A compute shader test for ModfStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 4;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec4 in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+#     vec4 modf_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+#     vec4 modfStruct_out[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec4 x;
+#     vec4 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec4 orig)
+# {
+#     vec4 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (uint ndx = 0; ndx < ndp; ndx += 2)
+#     {
+#         uvec4 in_uint = in_values[ndx/2];
+#         vec4 in_float = uintBitsToFloat(in_uint);
+#         modf_out[ndx+1] = modf(in_float, modf_out[ndx]);
+#         modfStructType res = modfStruct(in_float);
+#         modfStruct_out[ndx] = res.i;
+#         modfStruct_out[ndx+1] = res.x;
+#     }
+#
+#     return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpDecorate %_arr_v4uint_uint_162 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_v4float_uint_324 ArrayStride 16
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %block1 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_arr_v4float_uint_324_0 ArrayStride 16
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %block2 BufferBlock
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%modfStructType = OpTypeStruct %v4float %v4float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v4float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+   %uint_324 = OpConstant %uint 324
+       %bool = OpTypeBool
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+   %uint_162 = OpConstant %uint 162
+%_arr_v4uint_uint_162 = OpTypeArray %v4uint %uint_162
+     %block0 = OpTypeStruct %_arr_v4uint_uint_162
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_arr_v4float_uint_324 = OpTypeArray %v4float %uint_324
+     %block1 = OpTypeStruct %_arr_v4float_uint_324
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+%_arr_v4float_uint_324_0 = OpTypeArray %v4float %uint_324
+     %block2 = OpTypeStruct %_arr_v4float_uint_324_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+        %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_v4uint Function
+   %in_float = OpVariable %_ptr_Function_v4float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %ndx %uint_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %uint %ndx
+         %38 = OpULessThan %bool %35 %uint_324
+               OpBranchConditional %38 %31 %32
+         %31 = OpLabel
+         %49 = OpLoad %uint %ndx
+         %51 = OpUDiv %uint %49 %uint_2
+         %53 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %51
+         %54 = OpLoad %v4uint %53
+               OpStore %in_uint %54
+         %56 = OpLoad %v4uint %in_uint
+         %57 = OpBitcast %v4float %56
+               OpStore %in_float %57
+         %62 = OpLoad %uint %ndx
+         %64 = OpIAdd %uint %62 %uint_1
+         %65 = OpLoad %v4float %in_float
+         %66 = OpLoad %uint %ndx
+         %68 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %66
+         %69 = OpExtInst %v4float %1 Modf %65 %68
+         %70 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %64
+               OpStore %70 %69
+         %73 = OpLoad %v4float %in_float
+         %74 = OpExtInst %modfStructType %1 ModfStruct %73
+               OpStore %res_0 %74
+         %79 = OpLoad %uint %ndx
+         %81 = OpAccessChain %_ptr_Function_v4float %res_0 %int_1
+         %82 = OpLoad %v4float %81
+         %83 = OpAccessChain %_ptr_Uniform_v4float %__1 %int_0 %79
+               OpStore %83 %82
+         %84 = OpLoad %uint %ndx
+         %85 = OpIAdd %uint %84 %uint_1
+         %86 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+         %87 = OpLoad %v4float %86
+         %88 = OpAccessChain %_ptr_Uniform_v4float %__1 %int_0 %85
+               OpStore %88 %87
+               OpBranch %33
+         %33 = OpLabel
+         %89 = OpLoad %uint %ndx
+         %90 = OpIAdd %uint %89 %uint_2
+               OpStore %ndx %90
+               OpBranch %30
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_modf DATA_TYPE vec4<float> SIZE 324 FILL 0.0
+BUFFER buf_modfStruct DATA_TYPE vec4<float> SIZE 324 FILL 1.0
+
+PIPELINE compute test_pipeline
+    ATTACH comp_shader
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER buf_modf AS storage DESCRIPTOR_SET 0 BINDING 1
+    BIND BUFFER buf_modfStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_modf EQ_BUFFER buf_modfStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_frag.amber
new file mode 100644 (file)
index 0000000..0285d1f
--- /dev/null
@@ -0,0 +1,261 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A fragment shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec4 in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     vec4 x;
+#     vec4 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec4 orig)
+# {
+#     vec4 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uvec4 in_uint = in_values[ndx_in];
+#     vec4 in_float = uintBitsToFloat(in_uint);
+#     vec4 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out.rgba = x;
+#     modf_i_out.rgba = i;
+#     modfStruct_x_out.rgba = res.x;
+#     modfStruct_i_out.rgba = res.i;
+#
+#     return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%modfStructType = OpTypeStruct %v4float %v4float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v4float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v4uint Function
+   %in_float = OpVariable %_ptr_Function_v4float Function
+        %x_0 = OpVariable %_ptr_Function_v4float Function
+        %i_0 = OpVariable %_ptr_Function_v4float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %39 = OpLoad %uint %ndx_in
+         %41 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %39
+         %42 = OpLoad %v4uint %41
+               OpStore %in_uint %42
+         %44 = OpLoad %v4uint %in_uint
+         %45 = OpBitcast %v4float %44
+               OpStore %in_float %45
+         %47 = OpLoad %v4float %in_float
+         %49 = OpExtInst %v4float %1 Modf %47 %i_0
+               OpStore %x_0 %49
+         %52 = OpLoad %v4float %in_float
+         %53 = OpExtInst %modfStructType %1 ModfStruct %52
+               OpStore %res_0 %53
+         %56 = OpLoad %v4float %x_0
+               OpStore %modf_x_out %56
+         %58 = OpLoad %v4float %i_0
+               OpStore %modf_i_out %58
+         %60 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+         %61 = OpLoad %v4float %60
+               OpStore %modfStruct_x_out %61
+         %64 = OpAccessChain %_ptr_Function_v4float %res_0 %int_1
+         %65 = OpLoad %v4float %64
+               OpStore %modfStruct_i_out %65
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_geom.amber
new file mode 100644 (file)
index 0000000..b0acf8d
--- /dev/null
@@ -0,0 +1,401 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A geometry shader test for ModfStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec4 in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec4 modf_x_out;
+# layout (location = 1) flat out vec4 modf_i_out;
+# layout (location = 2) flat out vec4 modfStruct_x_out;
+# layout (location = 3) flat out vec4 modfStruct_i_out;
+#
+# struct modfStructType
+# {
+#     vec4 x;
+#     vec4 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec4 orig)
+# {
+#     vec4 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     for (int vertex = 0; vertex < 3; vertex++)
+#     {
+#         uvec4 in_uint = in_values[ndx_in[vertex]];
+#         vec4 in_float = uintBitsToFloat(in_uint);
+#         vec4 x, i;
+#         modfStructType res;
+#
+#         x = modf(in_float, i);
+#         res = modfStruct(in_float);
+#
+#         modf_x_out = x;
+#         modf_i_out = i;
+#         modfStruct_x_out = res.x;
+#         modfStruct_i_out = res.i;
+#
+#         gl_Position = gl_in[vertex].gl_Position;
+#         EmitVertex();
+#     }
+#
+#     EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+               OpCapability Geometry
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Geometry %main "main" %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0 %gl_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main Invocations 1
+               OpExecutionMode %main OutputTriangleStrip
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%modfStructType = OpTypeStruct %v4float %v4float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v4float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+     %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %vertex = OpVariable %_ptr_Function_int Function
+    %in_uint = OpVariable %_ptr_Function_v4uint Function
+   %in_float = OpVariable %_ptr_Function_v4float Function
+        %x_0 = OpVariable %_ptr_Function_v4float Function
+        %i_0 = OpVariable %_ptr_Function_v4float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+               OpStore %vertex %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %vertex
+         %38 = OpSLessThan %bool %35 %int_3
+               OpBranchConditional %38 %31 %32
+         %31 = OpLabel
+         %52 = OpLoad %int %vertex
+         %54 = OpAccessChain %_ptr_Input_uint %ndx_in %52
+         %55 = OpLoad %uint %54
+         %57 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %55
+         %58 = OpLoad %v4uint %57
+               OpStore %in_uint %58
+         %60 = OpLoad %v4uint %in_uint
+         %61 = OpBitcast %v4float %60
+               OpStore %in_float %61
+         %63 = OpLoad %v4float %in_float
+         %65 = OpExtInst %v4float %1 Modf %63 %i_0
+               OpStore %x_0 %65
+         %68 = OpLoad %v4float %in_float
+         %69 = OpExtInst %modfStructType %1 ModfStruct %68
+               OpStore %res_0 %69
+         %72 = OpLoad %v4float %x_0
+               OpStore %modf_x_out %72
+         %74 = OpLoad %v4float %i_0
+               OpStore %modf_i_out %74
+         %76 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+         %77 = OpLoad %v4float %76
+               OpStore %modfStruct_x_out %77
+         %80 = OpAccessChain %_ptr_Function_v4float %res_0 %int_1
+         %81 = OpLoad %v4float %80
+               OpStore %modfStruct_i_out %81
+         %91 = OpLoad %int %vertex
+         %93 = OpAccessChain %_ptr_Input_v4float %gl_in %91 %int_0
+         %94 = OpLoad %v4float %93
+         %95 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %95 %94
+               OpEmitVertex
+               OpBranch %33
+         %33 = OpLabel
+         %96 = OpLoad %int %vertex
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %vertex %97
+               OpBranch %30
+         %32 = OpLabel
+               OpEndPrimitive
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 modf_x_in;
+# layout (location = 1) flat in vec4 modf_i_in;
+# layout (location = 2) flat in vec4 modfStruct_x_in;
+# layout (location = 3) flat in vec4 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+#
+# void main ()
+# {
+#     modf_x_out.rgba = modf_x_in;
+#     modf_i_out.rgba = modf_i_in;
+#     modfStruct_x_out.rgba = modfStruct_x_in;
+#     modfStruct_i_out.rgba = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+  %modf_x_in = OpVariable %_ptr_Input_v4float Input
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+  %modf_i_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_in = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %12 = OpLoad %v4float %modf_x_in
+               OpStore %modf_x_out %12
+         %15 = OpLoad %v4float %modf_i_in
+               OpStore %modf_i_out %15
+         %18 = OpLoad %v4float %modfStruct_x_in
+               OpStore %modfStruct_x_out %18
+         %21 = OpLoad %v4float %modfStruct_i_in
+               OpStore %modfStruct_i_out %21
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH geom_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_tesc.amber
new file mode 100644 (file)
index 0000000..8da9d34
--- /dev/null
@@ -0,0 +1,556 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec4 modf_x_out[];
+# layout (location = 1) flat out vec4 modf_i_out[];
+# layout (location = 2) flat out vec4 modfStruct_x_out[];
+# layout (location = 3) flat out vec4 modfStruct_i_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec4 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec4 x;
+#     vec4 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec4 orig)
+# {
+#     vec4 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uvec4 in_uint = in_values[ndx_in[gl_InvocationID]];
+#     vec4 in_float = uintBitsToFloat(in_uint);
+#     vec4 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out[gl_InvocationID] = x;
+#     modf_i_out[gl_InvocationID] = i;
+#     modfStruct_x_out[gl_InvocationID] = res.x;
+#     modfStruct_i_out[gl_InvocationID] = res.i;
+#
+#     gl_TessLevelInner[0] = 1.0;
+#     gl_TessLevelInner[1] = 1.0;
+#     gl_TessLevelOuter[0] = 1.0;
+#     gl_TessLevelOuter[1] = 1.0;
+#     gl_TessLevelOuter[2] = 1.0;
+#     gl_TessLevelOuter[3] = 1.0;
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%modfStructType = OpTypeStruct %v4float %v4float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v4float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+     %uint_3 = OpConstant %uint 3
+%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3
+%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3
+ %modf_x_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_i_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%modfStruct_x_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%modfStruct_i_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v4uint Function
+   %in_float = OpVariable %_ptr_Function_v4float Function
+        %x_0 = OpVariable %_ptr_Function_v4float Function
+        %i_0 = OpVariable %_ptr_Function_v4float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %43 = OpLoad %int %gl_InvocationID
+         %45 = OpAccessChain %_ptr_Input_uint %ndx_in %43
+         %46 = OpLoad %uint %45
+         %48 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %46
+         %49 = OpLoad %v4uint %48
+               OpStore %in_uint %49
+         %51 = OpLoad %v4uint %in_uint
+         %52 = OpBitcast %v4float %51
+               OpStore %in_float %52
+         %54 = OpLoad %v4float %in_float
+         %56 = OpExtInst %v4float %1 Modf %54 %i_0
+               OpStore %x_0 %56
+         %59 = OpLoad %v4float %in_float
+         %60 = OpExtInst %modfStructType %1 ModfStruct %59
+               OpStore %res_0 %60
+         %65 = OpLoad %int %gl_InvocationID
+         %66 = OpLoad %v4float %x_0
+         %68 = OpAccessChain %_ptr_Output_v4float %modf_x_out %65
+               OpStore %68 %66
+         %70 = OpLoad %int %gl_InvocationID
+         %71 = OpLoad %v4float %i_0
+         %72 = OpAccessChain %_ptr_Output_v4float %modf_i_out %70
+               OpStore %72 %71
+         %74 = OpLoad %int %gl_InvocationID
+         %75 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+         %76 = OpLoad %v4float %75
+         %77 = OpAccessChain %_ptr_Output_v4float %modfStruct_x_out %74
+               OpStore %77 %76
+         %79 = OpLoad %int %gl_InvocationID
+         %81 = OpAccessChain %_ptr_Function_v4float %res_0 %int_1
+         %82 = OpLoad %v4float %81
+         %83 = OpAccessChain %_ptr_Output_v4float %modfStruct_i_out %79
+               OpStore %83 %82
+         %90 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %90 %float_1
+         %91 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %91 %float_1
+         %96 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %96 %float_1
+         %97 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %97 %float_1
+         %99 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %99 %float_1
+        %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %101 %float_1
+        %108 = OpLoad %int %gl_InvocationID
+        %113 = OpLoad %int %gl_InvocationID
+        %115 = OpAccessChain %_ptr_Input_v4float %gl_in %113 %int_0
+        %116 = OpLoad %v4float %115
+        %117 = OpAccessChain %_ptr_Output_v4float %gl_out %108 %int_0
+               OpStore %117 %116
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in vec4 modf_x_in[];
+# layout (location = 1) flat in vec4 modf_i_in[];
+# layout (location = 2) flat in vec4 modfStruct_x_in[];
+# layout (location = 3) flat in vec4 modfStruct_i_in[];
+#
+# layout (location = 0) flat out vec4 modf_x_out;
+# layout (location = 1) flat out vec4 modf_i_out;
+# layout (location = 2) flat out vec4 modfStruct_x_out;
+# layout (location = 3) flat out vec4 modfStruct_i_out;
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     modf_x_out = modf_x_in[0];
+#     modf_i_out = modf_i_in[0];
+#     modfStruct_x_out = modfStruct_x_in[0];
+#     modfStruct_i_out = modfStruct_i_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
+%_ptr_Input__arr_v4float_uint_32 = OpTypePointer Input %_arr_v4float_uint_32
+  %modf_x_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+  %modf_i_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %22 = OpLoad %float %21
+         %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %30 = OpLoad %v4float %29
+         %31 = OpVectorTimesScalar %v4float %30 %22
+         %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %36 = OpLoad %v4float %35
+         %37 = OpVectorTimesScalar %v4float %36 %33
+         %38 = OpFAdd %v4float %31 %37
+         %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %44 = OpLoad %v4float %43
+         %45 = OpVectorTimesScalar %v4float %44 %41
+         %46 = OpFAdd %v4float %38 %45
+         %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %48 %46
+         %53 = OpAccessChain %_ptr_Input_v4float %modf_x_in %int_0
+         %54 = OpLoad %v4float %53
+               OpStore %modf_x_out %54
+         %57 = OpAccessChain %_ptr_Input_v4float %modf_i_in %int_0
+         %58 = OpLoad %v4float %57
+               OpStore %modf_i_out %58
+         %61 = OpAccessChain %_ptr_Input_v4float %modfStruct_x_in %int_0
+         %62 = OpLoad %v4float %61
+               OpStore %modfStruct_x_out %62
+         %65 = OpAccessChain %_ptr_Input_v4float %modfStruct_i_in %int_0
+         %66 = OpLoad %v4float %65
+               OpStore %modfStruct_i_out %66
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 modf_x_in;
+# layout (location = 1) flat in vec4 modf_i_in;
+# layout (location = 2) flat in vec4 modfStruct_x_in;
+# layout (location = 3) flat in vec4 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+#
+# void main ()
+# {
+#     modf_x_out.rgba = modf_x_in;
+#     modf_i_out.rgba = modf_i_in;
+#     modfStruct_x_out.rgba = modfStruct_x_in;
+#     modfStruct_i_out.rgba = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+  %modf_x_in = OpVariable %_ptr_Input_v4float Input
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+  %modf_i_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_in = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %12 = OpLoad %v4float %modf_x_in
+               OpStore %modf_x_out %12
+         %15 = OpLoad %v4float %modf_i_in
+               OpStore %modf_i_out %15
+         %18 = OpLoad %v4float %modfStruct_x_in
+               OpStore %modfStruct_x_out %18
+         %21 = OpLoad %v4float %modfStruct_i_in
+               OpStore %modfStruct_i_out %21
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_tese.amber
new file mode 100644 (file)
index 0000000..5d6208d
--- /dev/null
@@ -0,0 +1,512 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for ModfStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     ndx_out = xcoord + ycoord * ndpSqrt;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %ndx_out %_
+               OpDecorate %position Location 0
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+    %ndx_out = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %17 = OpLoad %float %16
+         %21 = OpFAdd %float %17 %float_1_02777779
+         %24 = OpFMul %float %21 %float_18
+         %25 = OpFSub %float %24 %float_1
+         %26 = OpConvertFToU %uint %25
+         %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFAdd %float %30 %float_1_02777779
+         %34 = OpFMul %float %32 %float_18
+         %35 = OpFSub %float %34 %float_1
+         %36 = OpConvertFToU %uint %35
+         %42 = OpIMul %uint %36 %uint_36
+         %43 = OpIAdd %uint %26 %42
+               OpStore %ndx_out %43
+         %51 = OpLoad %v2float %position
+         %53 = OpCompositeExtract %float %51 0
+         %54 = OpCompositeExtract %float %51 1
+         %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+         %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %57 %55
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+#     gl_TessLevelInner[0]    = 1.0;
+#     gl_TessLevelInner[1]    = 1.0;
+#     gl_TessLevelOuter[0]    = 1.0;
+#     gl_TessLevelOuter[1]    = 1.0;
+#     gl_TessLevelOuter[2]    = 1.0;
+#     gl_TessLevelOuter[3]    = 1.0;
+#
+#     gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+#     ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+               OpExecutionMode %main OutputVertices 3
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %ndx_out Flat
+               OpDecorate %ndx_out Location 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+      %int_1 = OpConstant %int 1
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+     %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+    %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+               OpStore %16 %float_1
+         %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+               OpStore %18 %float_1
+         %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+               OpStore %23 %float_1
+         %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+               OpStore %24 %float_1
+         %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+               OpStore %26 %float_1
+         %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+               OpStore %28 %float_1
+         %39 = OpLoad %int %gl_InvocationID
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+         %48 = OpLoad %v4float %47
+         %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+               OpStore %50 %48
+         %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+         %61 = OpLoad %uint %60
+         %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+               OpStore %63 %61
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec4 modf_x_out;
+# layout (location = 1) flat out vec4 modf_i_out;
+# layout (location = 2) flat out vec4 modfStruct_x_out;
+# layout (location = 3) flat out vec4 modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec4 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec4 x;
+#     vec4 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec4 orig)
+# {
+#     vec4 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+#                   gl_TessCoord.y * gl_in[1].gl_Position +
+#                   gl_TessCoord.z * gl_in[2].gl_Position;
+#
+#     uvec4 in_uint = in_values[ndx_in[0]];
+#     vec4 in_float = uintBitsToFloat(in_uint);
+#     vec4 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = res.i;
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %ndx_in Flat
+               OpDecorate %ndx_in Location 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%modfStructType = OpTypeStruct %v4float %v4float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v4float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+      %int_1 = OpConstant %int 1
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+     %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+    %in_uint = OpVariable %_ptr_Function_v4uint Function
+   %in_float = OpVariable %_ptr_Function_v4float Function
+        %x_0 = OpVariable %_ptr_Function_v4float Function
+        %i_0 = OpVariable %_ptr_Function_v4float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %39 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %40 = OpLoad %float %39
+         %47 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %48 = OpLoad %v4float %47
+         %49 = OpVectorTimesScalar %v4float %48 %40
+         %50 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %54 = OpLoad %v4float %53
+         %55 = OpVectorTimesScalar %v4float %54 %51
+         %56 = OpFAdd %v4float %49 %55
+         %58 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %62 = OpLoad %v4float %61
+         %63 = OpVectorTimesScalar %v4float %62 %59
+         %64 = OpFAdd %v4float %56 %63
+         %66 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %66 %64
+         %79 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+         %80 = OpLoad %uint %79
+         %82 = OpAccessChain %_ptr_Uniform_v4uint %__0 %int_0 %80
+         %83 = OpLoad %v4uint %82
+               OpStore %in_uint %83
+         %85 = OpLoad %v4uint %in_uint
+         %86 = OpBitcast %v4float %85
+               OpStore %in_float %86
+         %88 = OpLoad %v4float %in_float
+         %90 = OpExtInst %v4float %1 Modf %88 %i_0
+               OpStore %x_0 %90
+         %93 = OpLoad %v4float %in_float
+         %94 = OpExtInst %modfStructType %1 ModfStruct %93
+               OpStore %res_0 %94
+         %96 = OpLoad %v4float %x_0
+               OpStore %modf_x_out %96
+         %98 = OpLoad %v4float %i_0
+               OpStore %modf_i_out %98
+        %100 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+        %101 = OpLoad %v4float %100
+               OpStore %modfStruct_x_out %101
+        %103 = OpAccessChain %_ptr_Function_v4float %res_0 %int_1
+        %104 = OpLoad %v4float %103
+               OpStore %modfStruct_i_out %104
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 modf_x_in;
+# layout (location = 1) flat in vec4 modf_i_in;
+# layout (location = 2) flat in vec4 modfStruct_x_in;
+# layout (location = 3) flat in vec4 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+#
+# void main ()
+# {
+#     modf_x_out.rgba = modf_x_in;
+#     modf_i_out.rgba = modf_i_in;
+#     modfStruct_x_out.rgba = modfStruct_x_in;
+#     modfStruct_i_out.rgba = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+  %modf_x_in = OpVariable %_ptr_Input_v4float Input
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+  %modf_i_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_in = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %12 = OpLoad %v4float %modf_x_in
+               OpStore %modf_x_out %12
+         %15 = OpLoad %v4float %modf_i_in
+               OpStore %modf_i_out %15
+         %18 = OpLoad %v4float %modfStruct_x_in
+               OpStore %modfStruct_x_out %18
+         %21 = OpLoad %v4float %modfStruct_i_in
+               OpStore %modfStruct_i_out %21
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH tesc_shader
+    ATTACH tese_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/modfstruct_4_vert.amber
new file mode 100644 (file)
index 0000000..56bcec1
--- /dev/null
@@ -0,0 +1,303 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+# A vertex shader test for ModfStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out vec4 modf_x_out;
+# layout (location = 1) flat out vec4 modf_i_out;
+# layout (location = 2) flat out vec4 modfStruct_x_out;
+# layout (location = 3) flat out vec4 modfStruct_i_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+#     uvec4 in_values[ndp];
+# };
+#
+# struct modfStructType
+# {
+#     vec4 x;
+#     vec4 i;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# modfStructType modfStruct (vec4 orig)
+# {
+#     vec4 x, i;
+#     x = modf(orig, i);
+#     modfStructType res = { x, i };
+#     return res;
+# }
+#
+# void main ()
+# {
+#     uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+#     uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+#     uint ndx = xcoord + ycoord * ndpSqrt;
+#
+#     uvec4 in_uint = in_values[ndx];
+#     vec4 in_float = uintBitsToFloat(in_uint);
+#     vec4 x, i;
+#     modfStructType res;
+#
+#     x = modf(in_float, i);
+#     res = modfStruct(in_float);
+#
+#     modf_x_out = x;
+#     modf_i_out = i;
+#     modfStruct_x_out = res.x;
+#     modfStruct_i_out = i;
+#
+#     gl_Position = vec4(position, 0, 1);
+#
+#     return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %position %modf_x_out %modf_i_out %modfStruct_x_out %modfStruct_i_out %__0
+               OpDecorate %position Location 0
+               OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+               OpMemberDecorate %block0 0 NonWritable
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %modf_x_out Flat
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_i_out Flat
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modfStruct_x_out Flat
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_i_out Flat
+               OpDecorate %modfStruct_i_out Location 3
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%modfStructType = OpTypeStruct %v4float %v4float
+         %10 = OpTypeFunction %modfStructType %_ptr_Function_v4float
+%_ptr_Function_modfStructType = OpTypePointer Function %modfStructType
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+   %float_36 = OpConstant %float 36
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+   %position = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+     %uint_1 = OpConstant %uint 1
+    %uint_36 = OpConstant %uint 36
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+  %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+     %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+          %_ = OpVariable %_ptr_Uniform_block0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+     %xcoord = OpVariable %_ptr_Function_uint Function
+     %ycoord = OpVariable %_ptr_Function_uint Function
+        %ndx = OpVariable %_ptr_Function_uint Function
+    %in_uint = OpVariable %_ptr_Function_v4uint Function
+   %in_float = OpVariable %_ptr_Function_v4float Function
+        %x_0 = OpVariable %_ptr_Function_v4float Function
+        %i_0 = OpVariable %_ptr_Function_v4float Function
+      %res_0 = OpVariable %_ptr_Function_modfStructType Function
+         %35 = OpAccessChain %_ptr_Input_float %position %uint_0
+         %36 = OpLoad %float %35
+         %38 = OpFAdd %float %36 %float_0_027777778
+         %40 = OpFAdd %float %38 %float_1
+         %42 = OpFDiv %float %40 %float_2
+         %43 = OpFMul %float %float_36 %42
+         %44 = OpFSub %float %43 %float_1
+         %45 = OpConvertFToU %uint %44
+               OpStore %xcoord %45
+         %48 = OpAccessChain %_ptr_Input_float %position %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpFAdd %float %49 %float_0_027777778
+         %51 = OpFAdd %float %50 %float_1
+         %52 = OpFDiv %float %51 %float_2
+         %53 = OpFMul %float %float_36 %52
+         %54 = OpFSub %float %53 %float_1
+         %55 = OpConvertFToU %uint %54
+               OpStore %ycoord %55
+         %57 = OpLoad %uint %xcoord
+         %58 = OpLoad %uint %ycoord
+         %60 = OpIMul %uint %58 %uint_36
+         %61 = OpIAdd %uint %57 %60
+               OpStore %ndx %61
+         %72 = OpLoad %uint %ndx
+         %74 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %72
+         %75 = OpLoad %v4uint %74
+               OpStore %in_uint %75
+         %77 = OpLoad %v4uint %in_uint
+         %78 = OpBitcast %v4float %77
+               OpStore %in_float %78
+         %80 = OpLoad %v4float %in_float
+         %82 = OpExtInst %v4float %1 Modf %80 %i_0
+               OpStore %x_0 %82
+         %85 = OpLoad %v4float %in_float
+         %86 = OpExtInst %modfStructType %1 ModfStruct %85
+               OpStore %res_0 %86
+         %89 = OpLoad %v4float %x_0
+               OpStore %modf_x_out %89
+         %91 = OpLoad %v4float %i_0
+               OpStore %modf_i_out %91
+         %93 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+         %94 = OpLoad %v4float %93
+               OpStore %modfStruct_x_out %94
+         %96 = OpLoad %v4float %i_0
+               OpStore %modfStruct_i_out %96
+        %101 = OpLoad %v2float %position
+        %103 = OpCompositeExtract %float %101 0
+        %104 = OpCompositeExtract %float %101 1
+        %105 = OpCompositeConstruct %v4float %103 %104 %float_0 %float_1
+        %106 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %106 %105
+               OpReturn
+               OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 modf_x_in;
+# layout (location = 1) flat in vec4 modf_i_in;
+# layout (location = 2) flat in vec4 modfStruct_x_in;
+# layout (location = 3) flat in vec4 modfStruct_i_in;
+#
+# layout (location = 0) out vec4 modf_x_out;
+# layout (location = 1) out vec4 modf_i_out;
+# layout (location = 2) out vec4 modfStruct_x_out;
+# layout (location = 3) out vec4 modfStruct_i_out;
+#
+#
+# void main ()
+# {
+#     modf_x_out.rgba = modf_x_in;
+#     modf_i_out.rgba = modf_i_in;
+#     modfStruct_x_out.rgba = modfStruct_x_in;
+#     modfStruct_i_out.rgba = modfStruct_i_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %modf_x_out %modf_x_in %modf_i_out %modf_i_in %modfStruct_x_out %modfStruct_x_in %modfStruct_i_out %modfStruct_i_in
+               OpExecutionMode %main OriginUpperLeft
+               OpDecorate %modf_x_out Location 0
+               OpDecorate %modf_x_in Flat
+               OpDecorate %modf_x_in Location 0
+               OpDecorate %modf_i_out Location 1
+               OpDecorate %modf_i_in Flat
+               OpDecorate %modf_i_in Location 1
+               OpDecorate %modfStruct_x_out Location 2
+               OpDecorate %modfStruct_x_in Flat
+               OpDecorate %modfStruct_x_in Location 2
+               OpDecorate %modfStruct_i_out Location 3
+               OpDecorate %modfStruct_i_in Flat
+               OpDecorate %modfStruct_i_in Location 3
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %modf_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+  %modf_x_in = OpVariable %_ptr_Input_v4float Input
+ %modf_i_out = OpVariable %_ptr_Output_v4float Output
+  %modf_i_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%modfStruct_i_out = OpVariable %_ptr_Output_v4float Output
+%modfStruct_i_in = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %12 = OpLoad %v4float %modf_x_in
+               OpStore %modf_x_out %12
+         %15 = OpLoad %v4float %modf_i_in
+               OpStore %modf_i_out %15
+         %18 = OpLoad %v4float %modfStruct_x_in
+               OpStore %modfStruct_x_out %18
+         %21 = OpLoad %v4float %modfStruct_i_in
+               OpStore %modfStruct_i_out %21
+               OpReturn
+               OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER modf_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modf_i FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER modfStruct_i FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+    FRAMEBUFFER_SIZE 144 144
+
+    ATTACH vert_shader
+    ATTACH frag_shader
+
+    VERTEX_DATA vertices LOCATION 0
+
+    BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+    BIND BUFFER modf_x AS color LOCATION 0
+    BIND BUFFER modf_i AS color LOCATION 1
+    BIND BUFFER modfStruct_x AS color LOCATION 2
+    BIND BUFFER modfStruct_i AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT modf_x EQ_BUFFER modfStruct_x
+EXPECT modf_i EQ_BUFFER modfStruct_i
index 299752b..beac1f2 100644 (file)
@@ -162,15 +162,85 @@ void AmberTestCase::checkSupport(Context& ctx) const
        }
 }
 
+class Delegate : public amber::Delegate
+{
+public:
+                                       Delegate                                (tcu::TestContext& testCtx);
+
+       amber::Result   LoadBufferData                  (const std::string                      file_name,
+                                                                                        amber::BufferDataFileType      file_type,
+                                                                                        amber::BufferInfo*                     buffer) const override;
+
+       void                    Log                                             (const std::string& /*message*/) override       { DE_FATAL("amber::Delegate::Log unimplemented"); }
+       bool                    LogGraphicsCalls                (void) const override                                           { return m_logGraphicsCalls; }
+       void                    SetLogGraphicsCalls             (bool log_graphics_calls)                                       { m_logGraphicsCalls = log_graphics_calls; }
+       bool                    LogExecuteCalls                 (void) const override                                           { return m_logExecuteCalls; }
+       void                    SetLogExecuteCalls              (bool log_execute_calls)                                        { m_logExecuteCalls = log_execute_calls; }
+       bool                    LogGraphicsCallsTime    (void) const override                                           { return m_logGraphicsCallsTime; }
+       void                    SetLogGraphicsCallsTime (bool log_graphics_calls_time)                          { m_logGraphicsCallsTime = log_graphics_calls_time; }
+       deUint64                GetTimestampNs                  (void) const override                                           { DE_FATAL("amber::Delegate::GetTimestampNs unimplemented"); return 0; }
+       void                    SetScriptPath                   (std::string path)                                                      { m_path = path; }
+
+private:
+       tcu::TestContext&       m_testCtx;
+       std::string                     m_path;
+       bool                            m_logGraphicsCalls;
+       bool                            m_logGraphicsCallsTime;
+       bool                            m_logExecuteCalls;
+};
+
+Delegate::Delegate (tcu::TestContext& testCtx)
+       : m_testCtx                                     (testCtx)
+       , m_path                                        ("")
+       , m_logGraphicsCalls            (false)
+       , m_logGraphicsCallsTime        (false)
+       , m_logExecuteCalls                     (false)
+{
+}
+
+amber::Result Delegate::LoadBufferData (const std::string                      file_name,
+                                                                               amber::BufferDataFileType       file_type,
+                                                                               amber::BufferInfo*                      buffer) const
+{
+       const tcu::Archive&                             archive         = m_testCtx.getArchive();
+       const de::FilePath                              filePath        = de::FilePath(m_path).join(file_name);
+       de::UniquePtr<tcu::Resource>    file            (archive.getResource(filePath.getPath()));
+       int                                                             numBytes        = file->getSize();
+       std::vector<deUint8>                    bytes           (numBytes);
+
+       if (file_type == amber::BufferDataFileType::kPng)
+               return amber::Result("Amber PNG loading unimplemented");
+
+       file->read(bytes.data(), numBytes);
+
+       if (bytes.empty())
+               return amber::Result("Failed to load buffer data " + file_name);
+
+       for (deUint8 byte : bytes)
+       {
+               amber::Value value;
+               value.SetIntValue(static_cast<deUint64>(byte));
+               buffer->values.push_back(value);
+       }
+
+       buffer->width   = 1;
+       buffer->height  = 1;
+
+       return {};
+}
+
 bool AmberTestCase::parse(const std::string& readFilename)
 {
        std::string script = ShaderSourceProvider::getSource(m_testCtx.getArchive(), readFilename.c_str());
        if (script.empty())
                return false;
 
+       Delegate delegate (m_testCtx);
+       delegate.SetScriptPath(de::FilePath(readFilename).getDirName());
+
        m_recipe = new amber::Recipe();
 
-       amber::Amber am;
+       amber::Amber am (&delegate);
        amber::Result r = am.Parse(script, m_recipe);
 
        m_recipe->SetFenceTimeout(1000 * 60 * 10); // 10 minutes
@@ -255,14 +325,13 @@ void AmberTestCase::initPrograms(vk::SourceCollections& programCollection) const
 
 tcu::TestStatus AmberTestInstance::iterate (void)
 {
-       amber::Amber            am;
+       amber::Amber            am (DE_NULL);
        amber::Options          amber_options;
        amber::ShaderMap        shaderMap;
        amber::Result           r;
 
        amber_options.engine                    = amber::kEngineTypeVulkan;
        amber_options.config                    = createEngineConfig(m_context);
-       amber_options.delegate                  = DE_NULL;
        amber_options.execution_type    = amber::ExecutionType::kExecute;
 
        // Check for extensions as declared by the Amber script itself.  Throw an internal
index c4be68c..ca0d267 100644 (file)
@@ -18758,6 +18758,84 @@ tcu::TestCaseGroup* createFloat16ArithmeticSet (tcu::TestContext& testCtx)
        return testGroup.release();
 }
 
+struct ComparisonCase
+{
+       string name;
+       string desc;
+};
+
+template<size_t C>
+tcu::TestCaseGroup* createFloat32ComparisonComputeSet (tcu::TestContext& testCtx)
+{
+       const string                                    testGroupName   ("comparison_" + de::toString(C));
+       de::MovePtr<tcu::TestCaseGroup> testGroup               (new tcu::TestCaseGroup(testCtx, testGroupName.c_str(), "Float 32 comparison tests"));
+       const char*                                             dataDir                 = "spirv_assembly/instruction/float32/comparison";
+
+       const ComparisonCase                    amberTests[]    =
+       {
+               { "modfstruct", "modf and modfStruct" }
+       };
+
+       for (ComparisonCase test : amberTests)
+       {
+               const string caseDesc ("Compare output of " + test.desc);
+               const string fileName (test.name + "_" + de::toString(C) + "_comp.amber");
+
+               testGroup->addChild(cts_amber::createAmberTestCase(testCtx,
+                                                                                                                  test.name.c_str(),
+                                                                                                                  caseDesc.c_str(),
+                                                                                                                  dataDir,
+                                                                                                                  fileName));
+       }
+
+       return testGroup.release();
+}
+
+struct ShaderStage
+{
+       string                  name;
+       vector<string>  requirement;
+};
+
+template<size_t C>
+tcu::TestCaseGroup* createFloat32ComparisonGraphicsSet (tcu::TestContext& testCtx)
+{
+       const string                                    testGroupName   ("comparison_" + de::toString(C));
+       de::MovePtr<tcu::TestCaseGroup> testGroup               (new tcu::TestCaseGroup(testCtx, testGroupName.c_str(), "Float 32 comparison tests"));
+       const char*                                             dataDir                 = "spirv_assembly/instruction/float32/comparison";
+
+       const ShaderStage                               stages[]                =
+       {
+               { "vert", vector<string>(0) },
+               { "tesc", vector<string>(1, "Features.tessellationShader") },
+               { "tese", vector<string>(1, "Features.tessellationShader") },
+               { "geom", vector<string>(1, "Features.geometryShader") },
+               { "frag", vector<string>(0) }
+       };
+
+       const ComparisonCase                    amberTests[]    =
+       {
+               { "modfstruct", "modf and modfStruct" }
+       };
+
+       for (ComparisonCase test : amberTests)
+       for (ShaderStage stage : stages)
+       {
+               const string caseName (test.name + "_" + stage.name);
+               const string caseDesc ("Compare output of " + test.desc);
+               const string fileName (test.name + "_" + de::toString(C) + "_" + stage.name + ".amber");
+
+               testGroup->addChild(cts_amber::createAmberTestCase(testCtx,
+                                                                                                                  caseName.c_str(),
+                                                                                                                  caseDesc.c_str(),
+                                                                                                                  dataDir,
+                                                                                                                  fileName,
+                                                                                                                  stage.requirement));
+       }
+
+       return testGroup.release();
+}
+
 const string getNumberTypeName (const NumberType type)
 {
        if (type == NUMBERTYPE_INT32)
@@ -19577,6 +19655,18 @@ tcu::TestCaseGroup* createFloat16Tests (tcu::TestContext& testCtx)
        return testGroup.release();
 }
 
+tcu::TestCaseGroup* createFloat32Tests (tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> testGroup       (new tcu::TestCaseGroup(testCtx, "float32", "Float 32 tests"));
+
+       testGroup->addChild(createFloat32ComparisonGraphicsSet<1>(testCtx));
+       testGroup->addChild(createFloat32ComparisonGraphicsSet<2>(testCtx));
+       testGroup->addChild(createFloat32ComparisonGraphicsSet<3>(testCtx));
+       testGroup->addChild(createFloat32ComparisonGraphicsSet<4>(testCtx));
+
+       return testGroup.release();
+}
+
 tcu::TestCaseGroup* createFloat16Group (tcu::TestContext& testCtx)
 {
        de::MovePtr<tcu::TestCaseGroup>         testGroup                       (new tcu::TestCaseGroup(testCtx, "float16", "Float 16 tests"));
@@ -19600,6 +19690,18 @@ tcu::TestCaseGroup* createFloat16Group (tcu::TestContext& testCtx)
        return testGroup.release();
 }
 
+tcu::TestCaseGroup* createFloat32Group (tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> testGroup       (new tcu::TestCaseGroup(testCtx, "float32", "Float 32 tests"));
+
+       testGroup->addChild(createFloat32ComparisonComputeSet<1>(testCtx));
+       testGroup->addChild(createFloat32ComparisonComputeSet<2>(testCtx));
+       testGroup->addChild(createFloat32ComparisonComputeSet<3>(testCtx));
+       testGroup->addChild(createFloat32ComparisonComputeSet<4>(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"));
@@ -20354,6 +20456,7 @@ tcu::TestCaseGroup* createInstructionTests (tcu::TestContext& testCtx)
        computeTests->addChild(createOpMemberNameGroup(testCtx));
        computeTests->addChild(createPointerParameterComputeGroup(testCtx));
        computeTests->addChild(createFloat16Group(testCtx));
+       computeTests->addChild(createFloat32Group(testCtx));
        computeTests->addChild(createBoolGroup(testCtx));
        computeTests->addChild(createWorkgroupMemoryComputeGroup(testCtx));
        computeTests->addChild(createSpirvIdsAbuseGroup(testCtx));
@@ -20424,6 +20527,7 @@ tcu::TestCaseGroup* createInstructionTests (tcu::TestContext& testCtx)
        graphicsTests->addChild(createPointerParameterGraphicsGroup(testCtx));
        graphicsTests->addChild(createVaryingNameGraphicsGroup(testCtx));
        graphicsTests->addChild(createFloat16Tests(testCtx));
+       graphicsTests->addChild(createFloat32Tests(testCtx));
        graphicsTests->addChild(createSpirvIdsAbuseTests(testCtx));
        graphicsTests->addChild(create64bitCompareGraphicsGroup(testCtx));
 
index 0aee652..3e800a3 100644 (file)
@@ -350293,6 +350293,10 @@ dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.reflect
 dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.refract
 dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.opdot
 dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.opvectortimesscalar
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_1.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_2.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_3.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_4.modfstruct
 dEQP-VK.spirv_assembly.instruction.compute.bool.mixed_bitsize.b32b32b32b16
 dEQP-VK.spirv_assembly.instruction.compute.bool.mixed_bitsize.b32b32b32b8
 dEQP-VK.spirv_assembly.instruction.compute.bool.mixed_bitsize.b32b32b16b32
@@ -364329,6 +364333,26 @@ dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimessc
 dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar_geom
 dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_frag
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_vert
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.spirv_ids_abuse.sparse_ids_tesse