spv_check_supported(subgroup_shuffle, cap);
          break;
 
+      case SpvCapabilityGroupNonUniformQuad:
+         spv_check_supported(subgroup_quad, cap);
+
       case SpvCapabilityVariablePointersStorageBuffer:
       case SpvCapabilityVariablePointers:
          spv_check_supported(variable_pointers, cap);
 
       break;
    }
 
+   case SpvOpGroupNonUniformQuadBroadcast:
+      vtn_build_subgroup_instr(b, nir_intrinsic_quad_broadcast,
+                               val->ssa, vtn_ssa_value(b, w[4]),
+                               vtn_ssa_value(b, w[5])->def);
+      break;
+
+   case SpvOpGroupNonUniformQuadSwap: {
+      unsigned direction = vtn_constant_value(b, w[5])->values[0].u32[0];
+      nir_intrinsic_op op;
+      switch (direction) {
+      case 0:
+         op = nir_intrinsic_quad_swap_horizontal;
+         break;
+      case 1:
+         op = nir_intrinsic_quad_swap_vertical;
+         break;
+      case 2:
+         op = nir_intrinsic_quad_swap_diagonal;
+         break;
+      }
+      vtn_build_subgroup_instr(b, op, val->ssa, vtn_ssa_value(b, w[4]), NULL);
+      break;
+   }
+
    case SpvOpGroupNonUniformIAdd:
    case SpvOpGroupNonUniformFAdd:
    case SpvOpGroupNonUniformIMul:
    case SpvOpGroupNonUniformLogicalAnd:
    case SpvOpGroupNonUniformLogicalOr:
    case SpvOpGroupNonUniformLogicalXor:
-   case SpvOpGroupNonUniformQuadBroadcast:
-   case SpvOpGroupNonUniformQuadSwap:
    default:
       unreachable("Invalid SPIR-V opcode");
    }