prepare for code concatenation
diff --git a/src/etnaviv_verifyops.c b/src/etnaviv_verifyops.c
index 0d5341e..bc6ccf6 100644
--- a/src/etnaviv_verifyops.c
+++ b/src/etnaviv_verifyops.c
@@ -16,34 +16,65 @@
 
 #include "drm_setup.h"
 #include "cmdstream.h"
+#include "memutil.h"
 
 #include "state.xml.h"
 #include "state_3d.xml.h"
 #include "common.xml.h"
 
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define GPU_CODE(x) {x, ARRAY_SIZE(x)}
+struct gpu_code {
+    const uint32_t *code;
+    unsigned size;
+};
+
+struct op_test {
+    const char *op_name;
+    size_t unit_size;
+    void (*generate_values_h)(size_t seed, void *a, size_t width);
+    // Leave NULL for unary ops
+    void (*generate_values_v)(size_t seed, void *b, size_t height);
+    void (*compute_cpu)(void *out, const void *a, const void *b, size_t width, size_t height);
+    struct gpu_code code;
+};
+
+struct gpu_code prelude = GPU_CODE(((uint32_t[]){
+    0x0082100c, 0x15600800, 0x800100c0, 0x0000000a,  /* 0x4c.u32      t2.x___, t0.yyyy, u1.xxxx, t0.xxxx */
+    0x01021019, 0x00200800, 0x80010000, 0x203fc008,  /* lshift.u32    t2._y__, t0.xxxx, void, u0.wwww */
+    0x01011032, 0x15600800, 0x80aa0150, 0x00000000,  /* load.u32      t1._y__, u0.yyyy, t2.yyyy, void */
+    0x01021009, 0x00000000, 0x00000000, 0x00154018,  /* mov   t2._y__, void, void, t1.yyyy            */
+    0x00801019, 0x15600800, 0x80010000, 0x203fc008,  /* lshift.u32    t0.x___, t0.yyyy, void, u0.wwww */
+    0x00811032, 0x2aa00800, 0x80000050, 0x00000000,  /* load.u32      t1.x___, u0.zzzz, t0.xxxx, void */
+    0x00801009, 0x00000000, 0x00000000, 0x00000018,  /* mov   t0.x___, void, void, t1.xxxx            */
+}));
+
+struct gpu_code postlude = GPU_CODE(((uint32_t[]){
+    0x01001019, 0x00202800, 0x80010000, 0x203fc008,  /* lshift.u32    t0._y__, t2.xxxx, void, u0.wwww */
+    0x00800033, 0x00200800, 0x80aa0050, 0x00000008,  /* store.u32     mem.x___, u0.xxxx, t0.yyyy, t0.xxxx */
+    0x00000000, 0x00000000, 0x00000000, 0x00000000,  /* nop   void, void, void, void                  */
+}));
 
 static void gen_cmd_stream(struct etna_cmd_stream *stream, struct etna_bo *out, struct etna_bo *in0, struct etna_bo *in1)
 {
+    unsigned num_inst = 10;
     etna_set_state(stream, VIVS_PA_SYSTEM_MODE, VIVS_PA_SYSTEM_MODE_UNK0 | VIVS_PA_SYSTEM_MODE_UNK4);
     etna_set_state(stream, VIVS_GL_API_MODE, VIVS_GL_API_MODE_OPENCL);
+
     etna_set_state(stream, VIVS_VS_INPUT_COUNT, VIVS_VS_INPUT_COUNT_COUNT(1) | VIVS_VS_INPUT_COUNT_UNK8(31));
     etna_set_state(stream, VIVS_VS_INPUT(0), VIVS_VS_INPUT_I0(0) | VIVS_VS_INPUT_I1(1) | VIVS_VS_INPUT_I2(2) | VIVS_VS_INPUT_I3(3));
     etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10));
     etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0);
     etna_set_state(stream, VIVS_CL_UNK00924, 0x0);
-    etna_set_state(stream, VIVS_VS_INPUT_COUNT, VIVS_VS_INPUT_COUNT_COUNT(1) | VIVS_VS_INPUT_COUNT_UNK8(31));
-    etna_set_state(stream, VIVS_VS_INPUT(0), VIVS_VS_INPUT_I0(0) | VIVS_VS_INPUT_I1(1) | VIVS_VS_INPUT_I2(2) | VIVS_VS_INPUT_I3(3));
-    etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10));
-    etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0);
-    etna_set_state(stream, VIVS_CL_UNK00924, 0x0);
+
     etna_set_state_from_bo(stream, VIVS_VS_UNIFORMS(0), out);
     etna_set_state_from_bo(stream, VIVS_VS_UNIFORMS(1), in0);
     etna_set_state_from_bo(stream, VIVS_VS_UNIFORMS(2), in1);
+    etna_set_state(stream, VIVS_VS_UNIFORMS(3), 0x2);
     etna_set_state(stream, VIVS_VS_UNIFORMS(4), 0x10);
     etna_set_state(stream, VIVS_VS_UNIFORMS(5), 0x10);
     etna_set_state(stream, VIVS_VS_UNIFORMS(6), 0x0);
     etna_set_state(stream, VIVS_VS_UNIFORMS(7), 0x0);
+
     etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, VIVS_GL_SEMAPHORE_TOKEN_FROM(SYNC_RECIPIENT_FE) | VIVS_GL_SEMAPHORE_TOKEN_TO(SYNC_RECIPIENT_PE));
     etna_set_state(stream, VIVS_VS_INPUT_COUNT, VIVS_VS_INPUT_COUNT_COUNT(1) | VIVS_VS_INPUT_COUNT_UNK8(1));
     etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10));
@@ -51,8 +82,8 @@
     etna_set_state(stream, VIVS_GL_VARYING_NUM_COMPONENTS, VIVS_GL_VARYING_NUM_COMPONENTS_VAR0(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR1(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR2(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR3(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR4(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR5(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR6(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR7(0x0));
     etna_set_state(stream, VIVS_GL_UNK03834, 0x0);
     etna_set_state(stream, VIVS_VS_NEW_UNK00860, 0x0);
-    etna_set_state(stream, VIVS_VS_RANGE, VIVS_VS_RANGE_LOW(0x0) | VIVS_VS_RANGE_HIGH(0x9));
-    etna_set_state(stream, VIVS_VS_UNIFORMS(3), 0x2);
+    etna_set_state(stream, VIVS_VS_RANGE, VIVS_VS_RANGE_LOW(0x0) | VIVS_VS_RANGE_HIGH(num_inst - 1));
+
     etna_set_state(stream, VIVS_SH_INST_MEM(0), 0x82100c);
     etna_set_state(stream, VIVS_SH_INST_MEM(1), 0x15600800);
     etna_set_state(stream, VIVS_SH_INST_MEM(2), 0x800100c0);
@@ -97,6 +128,7 @@
     etna_set_state(stream, VIVS_SH_INST_MEM(41), 0x0);
     etna_set_state(stream, VIVS_SH_INST_MEM(42), 0x0);
     etna_set_state(stream, VIVS_SH_INST_MEM(43), 0x0);
+
     etna_set_state(stream, VIVS_PS_INPUT_COUNT, VIVS_PS_INPUT_COUNT_COUNT(1) | VIVS_PS_INPUT_COUNT_UNK8(31));
     etna_set_state(stream, VIVS_PS_TEMP_REGISTER_CONTROL, VIVS_PS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10));
     etna_set_state(stream, VIVS_PS_CONTROL, 0);
@@ -113,7 +145,9 @@
     etna_set_state(stream, VIVS_CL_WORKGROUP_Y, VIVS_CL_WORKGROUP_Y_SIZE(0x7) | VIVS_CL_WORKGROUP_Y_COUNT(0x1));
     etna_set_state(stream, VIVS_CL_WORKGROUP_Z, VIVS_CL_WORKGROUP_Z_SIZE(0x3ff) | VIVS_CL_WORKGROUP_Z_COUNT(0xffff));
     etna_set_state(stream, VIVS_CL_THREAD_ALLOCATION, 0x4);
+    // Kick off program
     etna_set_state(stream, VIVS_CL_KICKER, 0xbadabeeb);
+
     etna_set_state(stream, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_TEXTURE | VIVS_GL_FLUSH_CACHE_SHADER_L1);
     etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, VIVS_GL_SEMAPHORE_TOKEN_FROM(SYNC_RECIPIENT_FE) | VIVS_GL_SEMAPHORE_TOKEN_TO(SYNC_RECIPIENT_PE));
     etna_set_state(stream, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_DEPTH | VIVS_GL_FLUSH_CACHE_COLOR);
@@ -148,24 +182,11 @@
     }
 }
 
-struct op_test {
-    const char *op_name;
-    size_t unit_size;
-    void (*generate_values_h)(size_t seed, void *a, size_t width);
-    // Leave NULL for unary ops
-    void (*generate_values_v)(size_t seed, void *b, size_t height);
-    void (*compute_cpu)(void *out, const void *a, const void *b, size_t width, size_t height);
-    const uint32_t *gpu_code;
-    unsigned gpu_code_words;
-};
-
-#define GPU_CODE(x) x, ARRAY_SIZE(x)
 
 struct op_test op_tests[] = {
     {"add", 4, i32_generate_values_h, i32_generate_values_v, add_compute_cpu,
         GPU_CODE(((uint32_t[]){
-            0x00000000, 0x00000000, 0x00000000, 0x00000000,
-            0x00000000, 0x00000000, 0x00000000, 0x00000000,
+            0x00801001, 0x15602800, 0x80000000, 0x00000008  /* add.u32       t0.x___, t2.yyyy, void, t0.xxxx */
         }))
     }
 };
@@ -226,7 +247,7 @@
         }
     } else {
         errors = 1;
-        printf("Unhandled unit_size %d\n", (int)cur_test->unit_size);
+        printf("No comparison implemented for unit_size %d\n", (int)cur_test->unit_size);
     }
     if (errors == 0) {
         printf("PASS\n");