diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 943743a..7aa62fb 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -142,6 +142,7 @@
     spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destTypeId, spv::Id operand);
     spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
     spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
+    spv::Id createInvocationsOperation(glslang::TOperator, spv::Id typeId, spv::Id operand);
     spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createNoArgOperation(glslang::TOperator op);
     spv::Id getSymbolId(const glslang::TIntermSymbol* node);
@@ -3253,16 +3254,9 @@
         break;
 
     case glslang::EOpAnyInvocation:
-        builder.addCapability(spv::CapabilityGroups);
-        unaryOp = spv::OpGroupAny;
-        break;
     case glslang::EOpAllInvocations:
-        builder.addCapability(spv::CapabilityGroups);
-        unaryOp = spv::OpGroupAll;
-        break;
     case glslang::EOpAllInvocationsEqual:
-        builder.addCapability(spv::CapabilityGroups);
-        break;
+        return createInvocationsOperation(op, typeId, operand);
 
     default:
         return 0;
@@ -3274,25 +3268,7 @@
         args.push_back(operand);
         id = builder.createBuiltinCall(typeId, stdBuiltins, libCall, args);
     } else {
-        if (op == glslang::EOpAnyInvocation || op == glslang::EOpAllInvocations || op == glslang::EOpAllInvocationsEqual) {
-            std::vector<spv::Id> operands;
-            operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
-            operands.push_back(operand);
-
-            if (op == glslang::EOpAnyInvocation || op == glslang::EOpAllInvocations)
-                id = builder.createOp(unaryOp, typeId, operands);
-            else if (op == glslang::EOpAllInvocationsEqual) {
-                spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, operands);
-                spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, operands);
-
-                id  = builder.createBinOp(spv::OpLogicalOr,
-                                          typeId,
-                                          groupAll,
-                                          builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny));
-            }
-        }
-        else
-            id = builder.createUnaryOp(unaryOp, typeId, operand);
+        id = builder.createUnaryOp(unaryOp, typeId, operand);
     }
 
     return builder.setPrecision(id, precision);
@@ -3592,6 +3568,34 @@
     return builder.createOp(opCode, typeId, spvAtomicOperands);
 }
 
+// Create group invocation operations.
+spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, spv::Id operand)
+{
+    builder.addCapability(spv::CapabilityGroups);
+
+    std::vector<spv::Id> operands;
+    operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
+    operands.push_back(operand);
+
+    switch (op) {
+    case glslang::EOpAnyInvocation:
+    case glslang::EOpAllInvocations:
+        return builder.createOp(op == glslang::EOpAnyInvocation ? spv::OpGroupAny : spv::OpGroupAll, typeId, operands);
+
+    case glslang::EOpAllInvocationsEqual:
+    {
+        spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, operands);
+        spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, operands);
+
+        return builder.createBinOp(spv::OpLogicalOr, typeId, groupAll,
+                                   builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny));
+    }
+    default:
+        logger->missingFunctionality("invocation operation");
+        return spv::NoResult;
+    }
+}
+
 spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
 {
     bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
