vtn: handle bitcast with pointer src/dest
authorKarol Herbst <kherbst@redhat.com>
Sat, 9 Mar 2019 19:32:52 +0000 (20:32 +0100)
committerKarol Herbst <kherbst@redhat.com>
Sat, 4 May 2019 10:27:51 +0000 (12:27 +0200)
v2: use vtn_push_ssa and vtn_ssa_value

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_alu.c
src/compiler/spirv/vtn_private.h

index 751ceddaffb31638f4a45a83b3d53e62cf954e87..7d2fafe4bdec149a16dbb005fe36e7365d308dfb 100644 (file)
@@ -4300,7 +4300,6 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
    case SpvOpQuantizeToF16:
    case SpvOpPtrCastToGeneric:
    case SpvOpGenericCastToPtr:
-   case SpvOpBitcast:
    case SpvOpIsNan:
    case SpvOpIsInf:
    case SpvOpIsFinite:
@@ -4385,6 +4384,10 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
       vtn_handle_alu(b, opcode, w, count);
       break;
 
+   case SpvOpBitcast:
+      vtn_handle_bitcast(b, w, count);
+      break;
+
    case SpvOpVectorExtractDynamic:
    case SpvOpVectorInsertDynamic:
    case SpvOpVectorShuffle:
index 6d4347887cdc1b8f6ab538abf43cc4a44266006e..8f53a7c03e40d8848c5c8176ab5b4b718a652b35 100644 (file)
@@ -562,34 +562,6 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
       break;
    }
 
-   case SpvOpBitcast:
-      /* From the definition of OpBitcast in the SPIR-V 1.2 spec:
-       *
-       *    "If Result Type has the same number of components as Operand, they
-       *    must also have the same component width, and results are computed
-       *    per component.
-       *
-       *    If Result Type has a different number of components than Operand,
-       *    the total number of bits in Result Type must equal the total
-       *    number of bits in Operand. Let L be the type, either Result Type
-       *    or Operand’s type, that has the larger number of components. Let S
-       *    be the other type, with the smaller number of components. The
-       *    number of components in L must be an integer multiple of the
-       *    number of components in S.  The first component (that is, the only
-       *    or lowest-numbered component) of S maps to the first components of
-       *    L, and so on, up to the last component of S mapping to the last
-       *    components of L. Within this mapping, any single component of S
-       *    (mapping to multiple components of L) maps its lower-ordered bits
-       *    to the lower-numbered components of L."
-       */
-      vtn_fail_if(src[0]->num_components * src[0]->bit_size !=
-                  glsl_get_vector_elements(type) * glsl_get_bit_size(type),
-                  "Source and destination of OpBitcast must have the same "
-                  "total number of bits");
-      val->ssa->def = nir_bitcast_vector(&b->nb, src[0],
-                                         glsl_get_bit_size(type));
-      break;
-
    case SpvOpFConvert: {
       nir_alu_type src_alu_type = nir_get_nir_type_for_glsl_type(vtn_src[0]->type);
       nir_alu_type dst_alu_type = nir_get_nir_type_for_glsl_type(type);
@@ -681,3 +653,41 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
 
    b->nb.exact = b->exact;
 }
+
+void
+vtn_handle_bitcast(struct vtn_builder *b, const uint32_t *w, unsigned count)
+{
+   vtn_assert(count == 4);
+   /* From the definition of OpBitcast in the SPIR-V 1.2 spec:
+    *
+    *    "If Result Type has the same number of components as Operand, they
+    *    must also have the same component width, and results are computed per
+    *    component.
+    *
+    *    If Result Type has a different number of components than Operand, the
+    *    total number of bits in Result Type must equal the total number of
+    *    bits in Operand. Let L be the type, either Result Type or Operand’s
+    *    type, that has the larger number of components. Let S be the other
+    *    type, with the smaller number of components. The number of components
+    *    in L must be an integer multiple of the number of components in S.
+    *    The first component (that is, the only or lowest-numbered component)
+    *    of S maps to the first components of L, and so on, up to the last
+    *    component of S mapping to the last components of L. Within this
+    *    mapping, any single component of S (mapping to multiple components of
+    *    L) maps its lower-ordered bits to the lower-numbered components of L."
+    */
+
+   struct vtn_type *type = vtn_value(b, w[1], vtn_value_type_type)->type;
+   struct vtn_ssa_value *vtn_src = vtn_ssa_value(b, w[3]);
+   struct nir_ssa_def *src = vtn_src->def;
+   struct vtn_ssa_value *val = vtn_create_ssa_value(b, type->type);
+
+   vtn_assert(glsl_type_is_vector_or_scalar(vtn_src->type));
+
+   vtn_fail_if(src->num_components * src->bit_size !=
+               glsl_get_vector_elements(type->type) * glsl_get_bit_size(type->type),
+               "Source and destination of OpBitcast must have the same "
+               "total number of bits");
+   val->def = nir_bitcast_vector(&b->nb, src, glsl_get_bit_size(type->type));
+   vtn_push_ssa(b, w[2], type, val);
+}
index 0fc2bc4da7b44ad60b594a671d43cbd4f8153469..cfe2893e04f04d99e546dab3386795d05043141f 100644 (file)
@@ -777,6 +777,9 @@ nir_op vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b,
 void vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
                     const uint32_t *w, unsigned count);
 
+void vtn_handle_bitcast(struct vtn_builder *b, const uint32_t *w,
+                        unsigned count);
+
 void vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
                          const uint32_t *w, unsigned count);