i965/vec4: add a byte_offset helper
authorIago Toral Quiroga <itoral@igalia.com>
Mon, 3 Oct 2016 11:24:22 +0000 (13:24 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Thu, 27 Oct 2016 08:59:31 +0000 (10:59 +0200)
v2: wrap the helper in a namespace to make clear that it is an
    implementation detail of byte_offset() and is not intended
    to be used independently (Curro).

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/mesa/drivers/dri/i965/brw_ir_vec4.h

index a8e5f4a18f0f70708cf5009a5c29bedada27e5ab..1633c4ce0d5a54fc3ce3514f3e1f58917c2a8845 100644 (file)
@@ -60,6 +60,49 @@ retype(src_reg reg, enum brw_reg_type type)
    return reg;
 }
 
+namespace detail {
+
+static inline void
+add_byte_offset(backend_reg *reg, unsigned bytes)
+{
+   switch (reg->file) {
+      case BAD_FILE:
+         break;
+      case VGRF:
+      case ATTR:
+      case UNIFORM:
+         reg->offset += bytes;
+         assert(reg->offset % 16 == 0);
+         break;
+      case MRF: {
+         const unsigned suboffset = reg->offset + bytes;
+         reg->nr += suboffset / REG_SIZE;
+         reg->offset = suboffset % REG_SIZE;
+         assert(reg->offset % 16 == 0);
+         break;
+      }
+      case ARF:
+      case FIXED_GRF: {
+         const unsigned suboffset = reg->subnr + bytes;
+         reg->nr += suboffset / REG_SIZE;
+         reg->subnr = suboffset % REG_SIZE;
+         assert(reg->subnr % 16 == 0);
+         break;
+      }
+      default:
+         assert(bytes == 0);
+   }
+}
+
+} /* namepace detail */
+
+static inline src_reg
+byte_offset(src_reg reg, unsigned bytes)
+{
+   detail::add_byte_offset(&reg, bytes);
+   return reg;
+}
+
 static inline src_reg
 offset(src_reg reg, unsigned delta)
 {
@@ -129,6 +172,13 @@ retype(dst_reg reg, enum brw_reg_type type)
    return reg;
 }
 
+static inline dst_reg
+byte_offset(dst_reg reg, unsigned bytes)
+{
+   detail::add_byte_offset(&reg, bytes);
+   return reg;
+}
+
 static inline dst_reg
 offset(dst_reg reg, unsigned delta)
 {