Make capabilities a bitfield in opcode/operand tables.
diff --git a/source/opcode.cpp b/source/opcode.cpp
index b3532cb..3344a98 100644
--- a/source/opcode.cpp
+++ b/source/opcode.cpp
@@ -45,20 +45,14 @@
 spv_opcode_desc_t opcodeTableEntries[] = {
 #define EmptyList {}
 #define List(...) {__VA_ARGS__}
-#define Capability(X) Capability##X
-#define CapabilityNone -1
-// TODO(dneto): Some things can be enabled by one of two different capabilities.
-// The capabilities field in spv_operand_desc_t can't handle that yet.
-// Maybe have to make it a 64-bit mask.  Currently there are 54 distinct
-// capabilities.
-// For now, just select the first one.  This must be fixed for the validator
-// to work.
-#define Capability2(X,Y) Capability##X
+#define Capability(X) SPV_CAPABILITY_AS_MASK(Capability##X)
+#define Capability2(X,Y) Capability(X)|Capability(Y)
+#define CapabilityNone 0  // Needed so Capability(None) still expands to valid syntax.
 #define Instruction(Name,HasResult,HasType,NumLogicalOperands,NumCapabilities,CapabilityRequired,IsVariable,LogicalArgsList) \
   { #Name, \
     Op##Name, \
-    ((CapabilityRequired != CapabilityNone ? SPV_OPCODE_FLAGS_CAPABILITIES : 0)), \
-    uint32_t(CapabilityRequired), \
+    (NumCapabilities) ? SPV_OPCODE_FLAGS_CAPABILITIES : 0, \
+    (NumCapabilities) ? (CapabilityRequired) : 0, \
     0, {}, /* Filled in later. Operand list, including result id and type id, if needed */ \
     HasResult, \
     HasType, \
@@ -67,6 +61,7 @@
 #undef EmptyList
 #undef List
 #undef Capability
+#undef Capability2
 #undef CapabilityNone
 #undef Instruction
 };