Merge pull request #2631 from godlikepanos/master

Add support for 64bit integer types and 64bit integer vector types to bitCount() builtin
diff --git a/Test/baseResults/spv.int64.frag.out b/Test/baseResults/spv.int64.frag.out
index 4b5e450..b7a93a5 100644
--- a/Test/baseResults/spv.int64.frag.out
+++ b/Test/baseResults/spv.int64.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 489
+// Id's are bound by 499
 
                               Capability Shader
                               Capability Float64
@@ -47,45 +47,45 @@
                               Name 392  "iv"
                               Name 397  "uv"
                               Name 401  "bv"
-                              Name 462  "Block"
-                              MemberName 462(Block) 0  "i64v"
-                              MemberName 462(Block) 1  "u64"
-                              Name 464  "block"
-                              Name 465  "si64"
-                              Name 466  "su64"
-                              Name 467  "si"
-                              Name 468  "su"
-                              Name 469  "sb"
-                              Name 470  "su64inc"
-                              Name 471  "i64_to_b"
-                              Name 472  "u64_to_b"
-                              Name 473  "b_to_i64"
-                              Name 474  "b_to_u64"
-                              Name 475  "i64_to_i"
-                              Name 476  "i_to_i64"
-                              Name 477  "u64_to_u"
-                              Name 478  "u_to_u64"
-                              Name 479  "u64_to_i64"
-                              Name 480  "i64_to_u64"
-                              Name 482  "u64_to_i"
-                              Name 484  "i_to_u64"
-                              Name 486  "i64_to_u"
-                              Name 488  "u_to_i64"
+                              Name 472  "Block"
+                              MemberName 472(Block) 0  "i64v"
+                              MemberName 472(Block) 1  "u64"
+                              Name 474  "block"
+                              Name 475  "si64"
+                              Name 476  "su64"
+                              Name 477  "si"
+                              Name 478  "su"
+                              Name 479  "sb"
+                              Name 480  "su64inc"
+                              Name 481  "i64_to_b"
+                              Name 482  "u64_to_b"
+                              Name 483  "b_to_i64"
+                              Name 484  "b_to_u64"
+                              Name 485  "i64_to_i"
+                              Name 486  "i_to_i64"
+                              Name 487  "u64_to_u"
+                              Name 488  "u_to_u64"
+                              Name 489  "u64_to_i64"
+                              Name 490  "i64_to_u64"
+                              Name 492  "u64_to_i"
+                              Name 494  "i_to_u64"
+                              Name 496  "i64_to_u"
+                              Name 498  "u_to_i64"
                               MemberDecorate 28(Uniforms) 0 Offset 0
                               Decorate 28(Uniforms) Block
                               Decorate 30 DescriptorSet 0
                               Decorate 30 Binding 0
-                              MemberDecorate 462(Block) 0 Offset 0
-                              MemberDecorate 462(Block) 1 Offset 24
-                              Decorate 462(Block) Block
-                              Decorate 464(block) DescriptorSet 0
-                              Decorate 464(block) Binding 1
-                              Decorate 465(si64) SpecId 100
-                              Decorate 466(su64) SpecId 101
-                              Decorate 467(si) SpecId 102
-                              Decorate 468(su) SpecId 103
-                              Decorate 469(sb) SpecId 104
-                              Decorate 470(su64inc) SpecId 105
+                              MemberDecorate 472(Block) 0 Offset 0
+                              MemberDecorate 472(Block) 1 Offset 24
+                              Decorate 472(Block) Block
+                              Decorate 474(block) DescriptorSet 0
+                              Decorate 474(block) Binding 1
+                              Decorate 475(si64) SpecId 100
+                              Decorate 476(su64) SpecId 101
+                              Decorate 477(si) SpecId 102
+                              Decorate 478(su) SpecId 103
+                              Decorate 479(sb) SpecId 104
+                              Decorate 480(su64inc) SpecId 105
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 64 0
@@ -166,33 +166,33 @@
              390:   74(ivec2) ConstantComposite 388 389
              395:   81(ivec2) ConstantComposite 217 22
              400:             TypePointer Function 368(bvec3)
-      462(Block):             TypeStruct 136(i64vec3) 14(int64_t)
-             463:             TypePointer Uniform 462(Block)
-      464(block):    463(ptr) Variable Uniform
-       465(si64): 18(int64_t) SpecConstant 4294967286 4294967295
-       466(su64): 14(int64_t) SpecConstant 20 0
-         467(si):     31(int) SpecConstant 4294967291
-         468(su):     21(int) SpecConstant 4
-         469(sb):    55(bool) SpecConstantTrue
-    470(su64inc): 14(int64_t) SpecConstantOp 128 466(su64) 70
-   471(i64_to_b):    55(bool) SpecConstantOp 171 465(si64) 69
-   472(u64_to_b):    55(bool) SpecConstantOp 171 466(su64) 69
-   473(b_to_i64): 18(int64_t) SpecConstantOp 169 469(sb) 61 60
-   474(b_to_u64): 14(int64_t) SpecConstantOp 169 469(sb) 70 69
-   475(i64_to_i):     31(int) SpecConstantOp 114 465(si64)
-   476(i_to_i64): 18(int64_t) SpecConstantOp 114 467(si)
-   477(u64_to_u):     21(int) SpecConstantOp 113 466(su64)
-   478(u_to_u64): 14(int64_t) SpecConstantOp 113 468(su)
- 479(u64_to_i64): 18(int64_t) SpecConstantOp 128 466(su64) 69
- 480(i64_to_u64): 14(int64_t) SpecConstantOp 128 465(si64) 69
-             481:     21(int) SpecConstantOp 113 466(su64)
-   482(u64_to_i):     31(int) SpecConstantOp 128 481 227
-             483: 18(int64_t) SpecConstantOp 114 467(si)
-   484(i_to_u64): 14(int64_t) SpecConstantOp 128 483 69
-             485:     31(int) SpecConstantOp 114 465(si64)
-   486(i64_to_u):     21(int) SpecConstantOp 128 485 227
-             487: 14(int64_t) SpecConstantOp 113 468(su)
-   488(u_to_i64): 18(int64_t) SpecConstantOp 128 487 69
+      472(Block):             TypeStruct 136(i64vec3) 14(int64_t)
+             473:             TypePointer Uniform 472(Block)
+      474(block):    473(ptr) Variable Uniform
+       475(si64): 18(int64_t) SpecConstant 4294967286 4294967295
+       476(su64): 14(int64_t) SpecConstant 20 0
+         477(si):     31(int) SpecConstant 4294967291
+         478(su):     21(int) SpecConstant 4
+         479(sb):    55(bool) SpecConstantTrue
+    480(su64inc): 14(int64_t) SpecConstantOp 128 476(su64) 70
+   481(i64_to_b):    55(bool) SpecConstantOp 171 475(si64) 69
+   482(u64_to_b):    55(bool) SpecConstantOp 171 476(su64) 69
+   483(b_to_i64): 18(int64_t) SpecConstantOp 169 479(sb) 61 60
+   484(b_to_u64): 14(int64_t) SpecConstantOp 169 479(sb) 70 69
+   485(i64_to_i):     31(int) SpecConstantOp 114 475(si64)
+   486(i_to_i64): 18(int64_t) SpecConstantOp 114 477(si)
+   487(u64_to_u):     21(int) SpecConstantOp 113 476(su64)
+   488(u_to_u64): 14(int64_t) SpecConstantOp 113 478(su)
+ 489(u64_to_i64): 18(int64_t) SpecConstantOp 128 476(su64) 69
+ 490(i64_to_u64): 14(int64_t) SpecConstantOp 128 475(si64) 69
+             491:     21(int) SpecConstantOp 113 476(su64)
+   492(u64_to_i):     31(int) SpecConstantOp 128 491 227
+             493: 18(int64_t) SpecConstantOp 114 477(si)
+   494(i_to_u64): 14(int64_t) SpecConstantOp 128 493 69
+             495:     31(int) SpecConstantOp 114 475(si64)
+   496(i64_to_u):     21(int) SpecConstantOp 128 495 227
+             497: 14(int64_t) SpecConstantOp 113 478(su)
+   498(u_to_i64): 18(int64_t) SpecConstantOp 128 497 69
          4(main):           2 Function None 3
                5:             Label
                               Store 16(u64Max) 17
@@ -681,5 +681,19 @@
              460:  368(bvec3) Load 401(bv)
              461:  368(bvec3) VectorShuffle 460 459 3 4 2
                               Store 401(bv) 461
+             462: 14(int64_t) Load 301(u64)
+             463: 18(int64_t) ExtInst 1(GLSL.std.450) 73(FindILsb) 462
+                              Store 289(i64) 463
+             464: 14(int64_t) Load 301(u64)
+             465: 65(i64vec2) CompositeConstruct 464 464
+             466: 52(i64vec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 465
+                              Store 286(i64v) 466
+             467: 14(int64_t) Load 301(u64)
+             468: 18(int64_t) BitCount 467
+                              Store 289(i64) 468
+             469: 14(int64_t) Load 301(u64)
+             470: 65(i64vec2) CompositeConstruct 469 469
+             471: 52(i64vec2) BitCount 470
+                              Store 286(i64v) 471
                               Return
                               FunctionEnd
diff --git a/Test/spv.int64.frag b/Test/spv.int64.frag
index 5390fb7..0f80d55 100644
--- a/Test/spv.int64.frag
+++ b/Test/spv.int64.frag
@@ -228,6 +228,14 @@
     // notEqual()

     bv    = notEqual(u64v, u64vec3(u64));

     bv.xy = notEqual(i64v, i64vec2(i64));

+

+    // findLSB()

+    i64   = findLSB(u64);

+    i64v  = findLSB(u64vec2(u64));

+

+    // bitCount()

+    i64   = bitCount(u64);

+    i64v  = bitCount(u64vec2(u64));

 }

 

 // Type conversion for specialization constant

diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 7f10a0a..321a902 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1261,6 +1261,16 @@
             "bvec3 notEqual(u64vec3, u64vec3);"
             "bvec4 notEqual(u64vec4, u64vec4);"
 
+            "int64_t bitCount(int64_t);"
+            "i64vec2 bitCount(i64vec2);"
+            "i64vec3 bitCount(i64vec3);"
+            "i64vec4 bitCount(i64vec4);"
+
+            "int64_t bitCount(uint64_t);"
+            "i64vec2 bitCount(u64vec2);"
+            "i64vec3 bitCount(u64vec3);"
+            "i64vec4 bitCount(u64vec4);"
+
             "int64_t findLSB(int64_t);"
             "i64vec2 findLSB(i64vec2);"
             "i64vec3 findLSB(i64vec3);"