emulation: Add offset to emulation functions
authorDavid Schleef <ds@schleef.org>
Thu, 5 Aug 2010 21:16:12 +0000 (14:16 -0700)
committerDavid Schleef <ds@schleef.org>
Thu, 5 Aug 2010 21:16:12 +0000 (14:16 -0700)
orc/generate-emulation.c
orc/orcemulateopcodes.c
orc/orcemulateopcodes.h
orc/orcexecutor.c
orc/orcfunctions.c
orc/orcprogram.h

index cb4f6f9..05ac4eb 100644 (file)
@@ -283,9 +283,9 @@ output_code_emulate (OrcProgram *p, FILE *output)
 
   fprintf(output, "void\n");
   if (p->constant_n) {
-    fprintf(output, "%s (OrcOpcodeExecutor *ex)\n", p->name);
+    fprintf(output, "%s (OrcOpcodeExecutor *ex, int offset)\n", p->name);
   } else {
-    fprintf(output, "%s (OrcOpcodeExecutor *ex, int n)\n", p->name);
+    fprintf(output, "%s (OrcOpcodeExecutor *ex, int offset, int n)\n", p->name);
   }
   fprintf(output, "{\n");
   {
index 7b020ca..e26c2eb 100644 (file)
@@ -42,7 +42,7 @@
 
 
 void
-emulate_absb (OrcOpcodeExecutor *ex, int n)
+emulate_absb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -55,19 +55,17 @@ emulate_absb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: absb */
     var33 = ORC_ABS(var32);
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_addb (OrcOpcodeExecutor *ex, int n)
+emulate_addb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -83,22 +81,19 @@ emulate_addb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addb */
     var34 = var32 + var33;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_addssb (OrcOpcodeExecutor *ex, int n)
+emulate_addssb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -114,22 +109,19 @@ emulate_addssb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addssb */
     var34 = ORC_CLAMP_SB(var32 + var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_addusb (OrcOpcodeExecutor *ex, int n)
+emulate_addusb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -145,22 +137,19 @@ emulate_addusb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addusb */
     var34 = ORC_CLAMP_UB((orc_uint8)var32 + (orc_uint8)var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_andb (OrcOpcodeExecutor *ex, int n)
+emulate_andb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -176,22 +165,19 @@ emulate_andb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: andb */
     var34 = var32 & var33;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_andnb (OrcOpcodeExecutor *ex, int n)
+emulate_andnb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -207,22 +193,19 @@ emulate_andnb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: andnb */
     var34 = (~var32) & var33;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_avgsb (OrcOpcodeExecutor *ex, int n)
+emulate_avgsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -238,22 +221,19 @@ emulate_avgsb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: avgsb */
     var34 = (var32 + var33 + 1)>>1;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_avgub (OrcOpcodeExecutor *ex, int n)
+emulate_avgub (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -269,22 +249,19 @@ emulate_avgub (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: avgub */
     var34 = ((orc_uint8)var32 + (orc_uint8)var33 + 1)>>1;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpeqb (OrcOpcodeExecutor *ex, int n)
+emulate_cmpeqb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -300,22 +277,19 @@ emulate_cmpeqb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpeqb */
     var34 = (var32 == var33) ? (~0) : 0;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpgtsb (OrcOpcodeExecutor *ex, int n)
+emulate_cmpgtsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -331,22 +305,19 @@ emulate_cmpgtsb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpgtsb */
     var34 = (var32 > var33) ? (~0) : 0;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_copyb (OrcOpcodeExecutor *ex, int n)
+emulate_copyb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -359,19 +330,17 @@ emulate_copyb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: copyb */
     var33 = var32;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_loadb (OrcOpcodeExecutor *ex, int n)
+emulate_loadb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -383,17 +352,76 @@ emulate_loadb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[offset + i];
     /* 1: storeb */
-    *ptr0 = var32;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var32;
   }
 
 }
 
 void
-emulate_loadpb (OrcOpcodeExecutor *ex, int n)
+emulate_loadoffb (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_int8 * ptr0;
+  const orc_int8 * ptr4;
+  const int var24 = ((orc_union32 *)(ex->src_ptrs[1]))->i;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *)ex->dest_ptrs[0];
+  ptr4 = (orc_int8 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadoffb */
+    var32 = ptr4[offset + i+var24];
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_loadupdb (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_int8 * ptr0;
+  const orc_int8 * ptr4;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *)ex->dest_ptrs[0];
+  ptr4 = (orc_int8 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadupdb */
+    var32 = ptr4[(offset + i)>>1];
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_loadupib (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_int8 * ptr0;
+  const orc_int8 * ptr4;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *)ex->dest_ptrs[0];
+  ptr4 = (orc_int8 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadupib */
+    var32 = ((offset + i)&1) ? (ptr4[(offset + i)>>1] + ptr4[((offset + i)>>1)+1] + 1)>>1 : ptr4[(offset + i)>>1];
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_loadpb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -406,14 +434,13 @@ emulate_loadpb (OrcOpcodeExecutor *ex, int n)
     /* 0: loadpb */
     var32 = var24;
     /* 1: storeb */
-    *ptr0 = var32;
-    ptr0++;
+    ptr0[i] = var32;
   }
 
 }
 
 void
-emulate_maxsb (OrcOpcodeExecutor *ex, int n)
+emulate_maxsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -429,22 +456,19 @@ emulate_maxsb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxsb */
     var34 = ORC_MAX(var32, var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_maxub (OrcOpcodeExecutor *ex, int n)
+emulate_maxub (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -460,22 +484,19 @@ emulate_maxub (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxub */
     var34 = ORC_MAX((orc_uint8)var32, (orc_uint8)var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minsb (OrcOpcodeExecutor *ex, int n)
+emulate_minsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -491,22 +512,19 @@ emulate_minsb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minsb */
     var34 = ORC_MIN(var32, var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minub (OrcOpcodeExecutor *ex, int n)
+emulate_minub (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -522,22 +540,19 @@ emulate_minub (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minub */
     var34 = ORC_MIN((orc_uint8)var32, (orc_uint8)var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mullb (OrcOpcodeExecutor *ex, int n)
+emulate_mullb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -553,22 +568,19 @@ emulate_mullb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mullb */
     var34 = (var32 * var33) & 0xff;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulhsb (OrcOpcodeExecutor *ex, int n)
+emulate_mulhsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -584,22 +596,19 @@ emulate_mulhsb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulhsb */
     var34 = (var32 * var33) >> 8;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulhub (OrcOpcodeExecutor *ex, int n)
+emulate_mulhub (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -615,22 +624,19 @@ emulate_mulhub (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulhub */
     var34 = ((orc_uint32)(orc_uint8)var32 * (orc_uint32)(orc_uint8)var33) >> 8;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_orb (OrcOpcodeExecutor *ex, int n)
+emulate_orb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -646,22 +652,19 @@ emulate_orb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: orb */
     var34 = var32 | var33;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_shlb (OrcOpcodeExecutor *ex, int n)
+emulate_shlb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -675,19 +678,17 @@ emulate_shlb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shlb */
     var33 = var32 << var24;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_shrsb (OrcOpcodeExecutor *ex, int n)
+emulate_shrsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -701,19 +702,17 @@ emulate_shrsb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shrsb */
     var33 = var32 >> var24;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_shrub (OrcOpcodeExecutor *ex, int n)
+emulate_shrub (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -727,19 +726,17 @@ emulate_shrub (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shrub */
     var33 = ((orc_uint8)var32) >> var24;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_signb (OrcOpcodeExecutor *ex, int n)
+emulate_signb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -752,19 +749,17 @@ emulate_signb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: signb */
     var33 = ORC_CLAMP(var32,-1,1);
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_storeb (OrcOpcodeExecutor *ex, int n)
+emulate_storeb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -776,17 +771,15 @@ emulate_storeb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: storeb */
-    *ptr0 = var32;
-    ptr0++;
-    ptr4++;
+    ptr0[offset + i] = var32;
   }
 
 }
 
 void
-emulate_subb (OrcOpcodeExecutor *ex, int n)
+emulate_subb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -802,22 +795,19 @@ emulate_subb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subb */
     var34 = var32 - var33;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subssb (OrcOpcodeExecutor *ex, int n)
+emulate_subssb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -833,22 +823,19 @@ emulate_subssb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subssb */
     var34 = ORC_CLAMP_SB(var32 - var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subusb (OrcOpcodeExecutor *ex, int n)
+emulate_subusb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -864,22 +851,19 @@ emulate_subusb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subusb */
     var34 = ORC_CLAMP_UB((orc_uint8)var32 - (orc_uint8)var33);
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_xorb (OrcOpcodeExecutor *ex, int n)
+emulate_xorb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -895,22 +879,19 @@ emulate_xorb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: xorb */
     var34 = var32 ^ var33;
     /* 3: storeb */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_absw (OrcOpcodeExecutor *ex, int n)
+emulate_absw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -923,19 +904,17 @@ emulate_absw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: absw */
     var33 = ORC_ABS(var32);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_addw (OrcOpcodeExecutor *ex, int n)
+emulate_addw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -951,22 +930,19 @@ emulate_addw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addw */
     var34 = var32 + var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_addssw (OrcOpcodeExecutor *ex, int n)
+emulate_addssw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -982,22 +958,19 @@ emulate_addssw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addssw */
     var34 = ORC_CLAMP_SW(var32 + var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_addusw (OrcOpcodeExecutor *ex, int n)
+emulate_addusw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1013,22 +986,19 @@ emulate_addusw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addusw */
     var34 = ORC_CLAMP_UW((orc_uint16)var32 + (orc_uint16)var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_andw (OrcOpcodeExecutor *ex, int n)
+emulate_andw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1044,22 +1014,19 @@ emulate_andw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: andw */
     var34 = var32 & var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_andnw (OrcOpcodeExecutor *ex, int n)
+emulate_andnw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1075,22 +1042,19 @@ emulate_andnw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: andnw */
     var34 = (~var32) & var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_avgsw (OrcOpcodeExecutor *ex, int n)
+emulate_avgsw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1106,22 +1070,19 @@ emulate_avgsw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: avgsw */
     var34 = (var32 + var33 + 1)>>1;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_avguw (OrcOpcodeExecutor *ex, int n)
+emulate_avguw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1137,22 +1098,19 @@ emulate_avguw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: avguw */
     var34 = ((orc_uint16)var32 + (orc_uint16)var33 + 1)>>1;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpeqw (OrcOpcodeExecutor *ex, int n)
+emulate_cmpeqw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1168,22 +1126,19 @@ emulate_cmpeqw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpeqw */
     var34 = (var32 == var33) ? (~0) : 0;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpgtsw (OrcOpcodeExecutor *ex, int n)
+emulate_cmpgtsw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1199,22 +1154,19 @@ emulate_cmpgtsw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpgtsw */
     var34 = (var32 > var33) ? (~0) : 0;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_copyw (OrcOpcodeExecutor *ex, int n)
+emulate_copyw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1227,19 +1179,17 @@ emulate_copyw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: copyw */
     var33 = var32;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_loadw (OrcOpcodeExecutor *ex, int n)
+emulate_loadw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1251,17 +1201,36 @@ emulate_loadw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[offset + i];
     /* 1: storew */
-    *ptr0 = var32;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var32;
   }
 
 }
 
 void
-emulate_loadpw (OrcOpcodeExecutor *ex, int n)
+emulate_loadoffw (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_int16 * ptr0;
+  const orc_int16 * ptr4;
+  const int var24 = ((orc_union32 *)(ex->src_ptrs[1]))->i;
+  orc_int16 var32;
+
+  ptr0 = (orc_int16 *)ex->dest_ptrs[0];
+  ptr4 = (orc_int16 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadoffw */
+    var32 = ptr4[offset + i+var24];
+    /* 1: storew */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_loadpw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1274,14 +1243,13 @@ emulate_loadpw (OrcOpcodeExecutor *ex, int n)
     /* 0: loadpw */
     var32 = var24;
     /* 1: storew */
-    *ptr0 = var32;
-    ptr0++;
+    ptr0[i] = var32;
   }
 
 }
 
 void
-emulate_maxsw (OrcOpcodeExecutor *ex, int n)
+emulate_maxsw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1297,22 +1265,19 @@ emulate_maxsw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxsw */
     var34 = ORC_MAX(var32, var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_maxuw (OrcOpcodeExecutor *ex, int n)
+emulate_maxuw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1328,22 +1293,19 @@ emulate_maxuw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxuw */
     var34 = ORC_MAX((orc_uint16)var32, (orc_uint16)var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minsw (OrcOpcodeExecutor *ex, int n)
+emulate_minsw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1359,22 +1321,19 @@ emulate_minsw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minsw */
     var34 = ORC_MIN(var32, var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minuw (OrcOpcodeExecutor *ex, int n)
+emulate_minuw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1390,22 +1349,19 @@ emulate_minuw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minuw */
     var34 = ORC_MIN((orc_uint16)var32, (orc_uint16)var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mullw (OrcOpcodeExecutor *ex, int n)
+emulate_mullw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1421,22 +1377,19 @@ emulate_mullw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mullw */
     var34 = (var32 * var33) & 0xffff;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulhsw (OrcOpcodeExecutor *ex, int n)
+emulate_mulhsw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1452,22 +1405,19 @@ emulate_mulhsw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulhsw */
     var34 = (var32 * var33) >> 16;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulhuw (OrcOpcodeExecutor *ex, int n)
+emulate_mulhuw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1483,22 +1433,19 @@ emulate_mulhuw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulhuw */
     var34 = ((orc_uint32)((orc_uint16)var32) * (orc_uint32)((orc_uint16)var33)) >> 16;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_orw (OrcOpcodeExecutor *ex, int n)
+emulate_orw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1514,22 +1461,19 @@ emulate_orw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: orw */
     var34 = var32 | var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_shlw (OrcOpcodeExecutor *ex, int n)
+emulate_shlw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1543,19 +1487,17 @@ emulate_shlw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shlw */
     var33 = var32 << var24;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_shrsw (OrcOpcodeExecutor *ex, int n)
+emulate_shrsw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1569,19 +1511,17 @@ emulate_shrsw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shrsw */
     var33 = var32 >> var24;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_shruw (OrcOpcodeExecutor *ex, int n)
+emulate_shruw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1595,19 +1535,17 @@ emulate_shruw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shruw */
     var33 = ((orc_uint16)var32) >> var24;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_signw (OrcOpcodeExecutor *ex, int n)
+emulate_signw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1620,19 +1558,17 @@ emulate_signw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: signw */
     var33 = ORC_CLAMP(var32,-1,1);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_storew (OrcOpcodeExecutor *ex, int n)
+emulate_storew (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1644,17 +1580,15 @@ emulate_storew (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: storew */
-    *ptr0 = var32;
-    ptr0++;
-    ptr4++;
+    ptr0[offset + i] = var32;
   }
 
 }
 
 void
-emulate_subw (OrcOpcodeExecutor *ex, int n)
+emulate_subw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1670,22 +1604,19 @@ emulate_subw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subw */
     var34 = var32 - var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subssw (OrcOpcodeExecutor *ex, int n)
+emulate_subssw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1701,22 +1632,19 @@ emulate_subssw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subssw */
     var34 = ORC_CLAMP_SW(var32 - var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subusw (OrcOpcodeExecutor *ex, int n)
+emulate_subusw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1732,22 +1660,19 @@ emulate_subusw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subusw */
     var34 = ORC_CLAMP_UW((orc_uint16)var32 - (orc_uint16)var33);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_xorw (OrcOpcodeExecutor *ex, int n)
+emulate_xorw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -1763,22 +1688,19 @@ emulate_xorw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: xorw */
     var34 = var32 ^ var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_absl (OrcOpcodeExecutor *ex, int n)
+emulate_absl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1791,19 +1713,17 @@ emulate_absl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: absl */
     var33.i = ORC_ABS(var32.i);
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_addl (OrcOpcodeExecutor *ex, int n)
+emulate_addl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1819,22 +1739,19 @@ emulate_addl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addl */
     var34.i = var32.i + var33.i;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_addssl (OrcOpcodeExecutor *ex, int n)
+emulate_addssl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1850,22 +1767,19 @@ emulate_addssl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addssl */
     var34.i = ORC_CLAMP_SL((orc_int64)var32.i + (orc_int64)var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_addusl (OrcOpcodeExecutor *ex, int n)
+emulate_addusl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1881,22 +1795,19 @@ emulate_addusl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addusl */
     var34.i = ORC_CLAMP_UL((orc_int64)(orc_uint32)var32.i + (orc_int64)(orc_uint32)var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_andl (OrcOpcodeExecutor *ex, int n)
+emulate_andl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1912,22 +1823,19 @@ emulate_andl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: andl */
     var34.i = var32.i & var33.i;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_andnl (OrcOpcodeExecutor *ex, int n)
+emulate_andnl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1943,22 +1851,19 @@ emulate_andnl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: andnl */
     var34.i = (~var32.i) & var33.i;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_avgsl (OrcOpcodeExecutor *ex, int n)
+emulate_avgsl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -1974,22 +1879,19 @@ emulate_avgsl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: avgsl */
     var34.i = ((orc_int64)var32.i + (orc_int64)var33.i + 1)>>1;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_avgul (OrcOpcodeExecutor *ex, int n)
+emulate_avgul (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2005,22 +1907,19 @@ emulate_avgul (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: avgul */
     var34.i = ((orc_uint64)(orc_uint32)var32.i + (orc_uint64)(orc_uint32)var33.i + 1)>>1;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpeql (OrcOpcodeExecutor *ex, int n)
+emulate_cmpeql (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2036,22 +1935,19 @@ emulate_cmpeql (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpeql */
     var34.i = (var32.i == var33.i) ? (~0) : 0;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpgtsl (OrcOpcodeExecutor *ex, int n)
+emulate_cmpgtsl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2067,22 +1963,19 @@ emulate_cmpgtsl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpgtsl */
     var34.i = (var32.i > var33.i) ? (~0) : 0;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_copyl (OrcOpcodeExecutor *ex, int n)
+emulate_copyl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2095,19 +1988,17 @@ emulate_copyl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: copyl */
     var33.i = var32.i;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_loadl (OrcOpcodeExecutor *ex, int n)
+emulate_loadl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2119,17 +2010,36 @@ emulate_loadl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[offset + i];
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_loadoffl (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_union32 * ptr0;
+  const orc_union32 * ptr4;
+  const int var24 = ((orc_union32 *)(ex->src_ptrs[1]))->i;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *)ex->dest_ptrs[0];
+  ptr4 = (orc_union32 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadoffl */
+    var32 = ptr4[offset + i+var24];
     /* 1: storel */
-    *ptr0 = var32;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var32;
   }
 
 }
 
 void
-emulate_loadpl (OrcOpcodeExecutor *ex, int n)
+emulate_loadpl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2142,14 +2052,13 @@ emulate_loadpl (OrcOpcodeExecutor *ex, int n)
     /* 0: loadpl */
     var32.i = var24;
     /* 1: storel */
-    *ptr0 = var32;
-    ptr0++;
+    ptr0[i] = var32;
   }
 
 }
 
 void
-emulate_maxsl (OrcOpcodeExecutor *ex, int n)
+emulate_maxsl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2165,22 +2074,19 @@ emulate_maxsl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxsl */
     var34.i = ORC_MAX(var32.i, var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_maxul (OrcOpcodeExecutor *ex, int n)
+emulate_maxul (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2196,22 +2102,19 @@ emulate_maxul (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxul */
     var34.i = ORC_MAX((orc_uint32)var32.i, (orc_uint32)var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minsl (OrcOpcodeExecutor *ex, int n)
+emulate_minsl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2227,22 +2130,19 @@ emulate_minsl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minsl */
     var34.i = ORC_MIN(var32.i, var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minul (OrcOpcodeExecutor *ex, int n)
+emulate_minul (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2258,22 +2158,19 @@ emulate_minul (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minul */
     var34.i = ORC_MIN((orc_uint32)var32.i, (orc_uint32)var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulll (OrcOpcodeExecutor *ex, int n)
+emulate_mulll (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2289,22 +2186,19 @@ emulate_mulll (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulll */
     var34.i = (var32.i * var33.i) & 0xffffffff;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulhsl (OrcOpcodeExecutor *ex, int n)
+emulate_mulhsl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2320,22 +2214,19 @@ emulate_mulhsl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulhsl */
     var34.i = ((orc_int64)var32.i * (orc_int64)var33.i) >> 32;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulhul (OrcOpcodeExecutor *ex, int n)
+emulate_mulhul (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2351,22 +2242,19 @@ emulate_mulhul (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulhul */
     var34.i = ((orc_uint64)(orc_uint32)var32.i * (orc_uint64)(orc_uint32)var33.i) >> 32;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_orl (OrcOpcodeExecutor *ex, int n)
+emulate_orl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2382,22 +2270,19 @@ emulate_orl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: orl */
     var34.i = var32.i | var33.i;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_shll (OrcOpcodeExecutor *ex, int n)
+emulate_shll (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2411,19 +2296,17 @@ emulate_shll (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shll */
     var33.i = var32.i << var24;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_shrsl (OrcOpcodeExecutor *ex, int n)
+emulate_shrsl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2437,19 +2320,17 @@ emulate_shrsl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shrsl */
     var33.i = var32.i >> var24;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_shrul (OrcOpcodeExecutor *ex, int n)
+emulate_shrul (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2463,19 +2344,17 @@ emulate_shrul (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: shrul */
     var33.i = ((orc_uint32)var32.i) >> var24;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_signl (OrcOpcodeExecutor *ex, int n)
+emulate_signl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2488,19 +2367,17 @@ emulate_signl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: signl */
     var33.i = ORC_CLAMP(var32.i,-1,1);
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_storel (OrcOpcodeExecutor *ex, int n)
+emulate_storel (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2512,17 +2389,15 @@ emulate_storel (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: storel */
-    *ptr0 = var32;
-    ptr0++;
-    ptr4++;
+    ptr0[offset + i] = var32;
   }
 
 }
 
 void
-emulate_subl (OrcOpcodeExecutor *ex, int n)
+emulate_subl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2538,22 +2413,19 @@ emulate_subl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subl */
     var34.i = var32.i - var33.i;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subssl (OrcOpcodeExecutor *ex, int n)
+emulate_subssl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2569,22 +2441,19 @@ emulate_subssl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subssl */
     var34.i = ORC_CLAMP_SL((orc_int64)var32.i - (orc_int64)var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subusl (OrcOpcodeExecutor *ex, int n)
+emulate_subusl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2600,22 +2469,19 @@ emulate_subusl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subusl */
     var34.i = ORC_CLAMP_UL((orc_int64)(orc_uint32)var32.i - (orc_int64)(orc_uint32)var33.i);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_xorl (OrcOpcodeExecutor *ex, int n)
+emulate_xorl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2631,22 +2497,19 @@ emulate_xorl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: xorl */
     var34.i = var32.i ^ var33.i;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_convsbw (OrcOpcodeExecutor *ex, int n)
+emulate_convsbw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2659,19 +2522,17 @@ emulate_convsbw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convsbw */
     var33 = var32;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convubw (OrcOpcodeExecutor *ex, int n)
+emulate_convubw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2684,19 +2545,17 @@ emulate_convubw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convubw */
     var33 = (orc_uint8)var32;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convswl (OrcOpcodeExecutor *ex, int n)
+emulate_convswl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2709,19 +2568,17 @@ emulate_convswl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convswl */
     var33.i = var32;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convuwl (OrcOpcodeExecutor *ex, int n)
+emulate_convuwl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -2734,19 +2591,17 @@ emulate_convuwl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convuwl */
     var33.i = (orc_uint16)var32;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convwb (OrcOpcodeExecutor *ex, int n)
+emulate_convwb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -2759,19 +2614,17 @@ emulate_convwb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convwb */
     var33 = var32;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convssswb (OrcOpcodeExecutor *ex, int n)
+emulate_convssswb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -2784,19 +2637,17 @@ emulate_convssswb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convssswb */
     var33 = ORC_CLAMP_SB(var32);
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convsuswb (OrcOpcodeExecutor *ex, int n)
+emulate_convsuswb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -2809,19 +2660,17 @@ emulate_convsuswb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convsuswb */
     var33 = ORC_CLAMP_UB(var32);
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convusswb (OrcOpcodeExecutor *ex, int n)
+emulate_convusswb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -2834,19 +2683,17 @@ emulate_convusswb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convusswb */
     var33 = ORC_CLAMP_SB((orc_uint16)var32);
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convuuswb (OrcOpcodeExecutor *ex, int n)
+emulate_convuuswb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -2859,19 +2706,17 @@ emulate_convuuswb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convuuswb */
     var33 = ORC_CLAMP_UB((orc_uint16)var32);
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convlw (OrcOpcodeExecutor *ex, int n)
+emulate_convlw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2884,19 +2729,17 @@ emulate_convlw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convlw */
     var33 = var32.i;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convssslw (OrcOpcodeExecutor *ex, int n)
+emulate_convssslw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2909,19 +2752,17 @@ emulate_convssslw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convssslw */
     var33 = ORC_CLAMP_SW(var32.i);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convsuslw (OrcOpcodeExecutor *ex, int n)
+emulate_convsuslw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2934,19 +2775,17 @@ emulate_convsuslw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convsuslw */
     var33 = ORC_CLAMP_UW(var32.i);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convusslw (OrcOpcodeExecutor *ex, int n)
+emulate_convusslw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2959,19 +2798,17 @@ emulate_convusslw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convusslw */
     var33 = ORC_CLAMP_SW((orc_uint32)var32.i);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convuuslw (OrcOpcodeExecutor *ex, int n)
+emulate_convuuslw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -2984,19 +2821,17 @@ emulate_convuuslw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convuuslw */
     var33 = ORC_CLAMP_UW((orc_uint32)var32.i);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_mulsbw (OrcOpcodeExecutor *ex, int n)
+emulate_mulsbw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3012,22 +2847,19 @@ emulate_mulsbw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulsbw */
     var34 = var32 * var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulubw (OrcOpcodeExecutor *ex, int n)
+emulate_mulubw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3043,22 +2875,19 @@ emulate_mulubw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulubw */
     var34 = (orc_uint8)var32 * (orc_uint8)var33;
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulswl (OrcOpcodeExecutor *ex, int n)
+emulate_mulswl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3074,22 +2903,19 @@ emulate_mulswl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulswl */
     var34.i = var32 * var33;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_muluwl (OrcOpcodeExecutor *ex, int n)
+emulate_muluwl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3105,22 +2931,19 @@ emulate_muluwl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: muluwl */
     var34.i = (orc_uint16)var32 * (orc_uint16)var33;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_accw (OrcOpcodeExecutor *ex, int n)
+emulate_accw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   const orc_int16 * ptr4;
@@ -3131,17 +2954,16 @@ emulate_accw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: accw */
     var12 = var12 + var32;
-    ptr4++;
   }
   ((orc_union32 *)ex->dest_ptrs[0])->i = (var12 + ((orc_union32 *)ex->dest_ptrs[0])->i) & 0xffff;
 
 }
 
 void
-emulate_accl (OrcOpcodeExecutor *ex, int n)
+emulate_accl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   const orc_union32 * ptr4;
@@ -3152,17 +2974,16 @@ emulate_accl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: accl */
     var12.i = var12.i + var32.i;
-    ptr4++;
   }
   ((orc_union32 *)ex->dest_ptrs[0])->i += var12.i;
 
 }
 
 void
-emulate_accsadubl (OrcOpcodeExecutor *ex, int n)
+emulate_accsadubl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   const orc_int8 * ptr4;
@@ -3176,20 +2997,18 @@ emulate_accsadubl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: accsadubl */
     var12.i = var12.i + ORC_ABS((orc_int32)(orc_uint8)var32 - (orc_int32)(orc_uint8)var33);
-    ptr4++;
-    ptr5++;
   }
   ((orc_union32 *)ex->dest_ptrs[0])->i += var12.i;
 
 }
 
 void
-emulate_swapw (OrcOpcodeExecutor *ex, int n)
+emulate_swapw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3202,19 +3021,17 @@ emulate_swapw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: swapw */
     var33 = ORC_SWAP_W(var32);
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_swapl (OrcOpcodeExecutor *ex, int n)
+emulate_swapl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3227,19 +3044,17 @@ emulate_swapl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: swapl */
     var33.i = ORC_SWAP_L(var32.i);
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_select0wb (OrcOpcodeExecutor *ex, int n)
+emulate_select0wb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -3252,19 +3067,17 @@ emulate_select0wb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: select0wb */
     var33 = (orc_uint16)var32 & 0xff;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_select1wb (OrcOpcodeExecutor *ex, int n)
+emulate_select1wb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -3277,19 +3090,17 @@ emulate_select1wb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: select1wb */
     var33 = ((orc_uint16)var32 >> 8)&0xff;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_select0lw (OrcOpcodeExecutor *ex, int n)
+emulate_select0lw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3302,19 +3113,17 @@ emulate_select0lw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: select0lw */
     var33 = (orc_uint32)var32.i & 0xffff;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_select1lw (OrcOpcodeExecutor *ex, int n)
+emulate_select1lw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3327,19 +3136,17 @@ emulate_select1lw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: select1lw */
     var33 = ((orc_uint32)var32.i >> 16)&0xffff;
     /* 2: storew */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_mergewl (OrcOpcodeExecutor *ex, int n)
+emulate_mergewl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3355,22 +3162,19 @@ emulate_mergewl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadw */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mergewl */
     var34.i = ((orc_uint16)var32) | ((orc_uint16)var33 << 16);
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mergebw (OrcOpcodeExecutor *ex, int n)
+emulate_mergebw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3386,22 +3190,19 @@ emulate_mergebw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadb */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mergebw */
     var34 = ((orc_uint8)var32) | ((orc_uint8)var33 << 8);
     /* 3: storew */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_splitlw (OrcOpcodeExecutor *ex, int n)
+emulate_splitlw (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int16 * ptr0;
@@ -3417,23 +3218,20 @@ emulate_splitlw (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: splitlw */
     var33 = (var32.i >> 16) & 0xffff;
     var34 = var32.i & 0xffff;
     /* 2: storew */
-    *ptr0 = var33;
+    ptr0[i] = var33;
     /* 3: storew */
-    *ptr1 = var34;
-    ptr0++;
-    ptr1++;
-    ptr4++;
+    ptr1[i] = var34;
   }
 
 }
 
 void
-emulate_splitwb (OrcOpcodeExecutor *ex, int n)
+emulate_splitwb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_int8 * ptr0;
@@ -3449,23 +3247,20 @@ emulate_splitwb (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadw */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: splitwb */
     var33 = (var32 >> 8) & 0xff;
     var34 = var32 & 0xff;
     /* 2: storeb */
-    *ptr0 = var33;
+    ptr0[i] = var33;
     /* 3: storeb */
-    *ptr1 = var34;
-    ptr0++;
-    ptr1++;
-    ptr4++;
+    ptr1[i] = var34;
   }
 
 }
 
 void
-emulate_addf (OrcOpcodeExecutor *ex, int n)
+emulate_addf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3481,22 +3276,19 @@ emulate_addf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: addf */
     var34.f = ORC_DENORMAL(ORC_DENORMAL(var32.f) + ORC_DENORMAL(var33.f));
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_subf (OrcOpcodeExecutor *ex, int n)
+emulate_subf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3512,22 +3304,19 @@ emulate_subf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: subf */
     var34.f = ORC_DENORMAL(ORC_DENORMAL(var32.f) - ORC_DENORMAL(var33.f));
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_mulf (OrcOpcodeExecutor *ex, int n)
+emulate_mulf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3543,22 +3332,19 @@ emulate_mulf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: mulf */
     var34.f = ORC_DENORMAL(ORC_DENORMAL(var32.f) * ORC_DENORMAL(var33.f));
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_divf (OrcOpcodeExecutor *ex, int n)
+emulate_divf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3574,22 +3360,19 @@ emulate_divf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: divf */
     var34.f = ORC_DENORMAL(ORC_DENORMAL(var32.f) / ORC_DENORMAL(var33.f));
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_sqrtf (OrcOpcodeExecutor *ex, int n)
+emulate_sqrtf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3602,19 +3385,17 @@ emulate_sqrtf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: sqrtf */
     var33.f = sqrt(ORC_DENORMAL(var32.f));
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_maxf (OrcOpcodeExecutor *ex, int n)
+emulate_maxf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3630,22 +3411,19 @@ emulate_maxf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: maxf */
     var34.f = ORC_MAXF(ORC_DENORMAL(var32.f),ORC_DENORMAL(var33.f));
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_minf (OrcOpcodeExecutor *ex, int n)
+emulate_minf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3661,22 +3439,19 @@ emulate_minf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: minf */
     var34.f = ORC_MINF(ORC_DENORMAL(var32.f),ORC_DENORMAL(var33.f));
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpeqf (OrcOpcodeExecutor *ex, int n)
+emulate_cmpeqf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3692,22 +3467,19 @@ emulate_cmpeqf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpeqf */
     var34.i = (ORC_DENORMAL(var32.f) == ORC_DENORMAL(var33.f)) ? (~0) : 0;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmpltf (OrcOpcodeExecutor *ex, int n)
+emulate_cmpltf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3723,22 +3495,19 @@ emulate_cmpltf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmpltf */
     var34.i = (ORC_DENORMAL(var32.f) < ORC_DENORMAL(var33.f)) ? (~0) : 0;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_cmplef (OrcOpcodeExecutor *ex, int n)
+emulate_cmplef (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3754,22 +3523,19 @@ emulate_cmplef (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: loadl */
-    var33 = *ptr5;
+    var33 = ptr5[i];
     /* 2: cmplef */
     var34.i = (ORC_DENORMAL(var32.f) <= ORC_DENORMAL(var33.f)) ? (~0) : 0;
     /* 3: storel */
-    *ptr0 = var34;
-    ptr0++;
-    ptr4++;
-    ptr5++;
+    ptr0[i] = var34;
   }
 
 }
 
 void
-emulate_convfl (OrcOpcodeExecutor *ex, int n)
+emulate_convfl (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3782,19 +3548,17 @@ emulate_convfl (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convfl */
     var33.i = (int)var32.f;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
 
 void
-emulate_convlf (OrcOpcodeExecutor *ex, int n)
+emulate_convlf (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
   orc_union32 * ptr0;
@@ -3807,13 +3571,11 @@ emulate_convlf (OrcOpcodeExecutor *ex, int n)
 
   for (i = 0; i < n; i++) {
     /* 0: loadl */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: convlf */
     var33.f = var32.i;
     /* 2: storel */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
index 53efd0b..047cb01 100644 (file)
-void emulate_loadpb (OrcOpcodeExecutor *ex, int n);
-void emulate_loadpw (OrcOpcodeExecutor *ex, int n);
-void emulate_loadpl (OrcOpcodeExecutor *ex, int n);
-void emulate_absb (OrcOpcodeExecutor *ex, int n);
+void emulate_loadupdb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadupib (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadoffb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadoffw (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadoffl (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadpb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadpw (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadpl (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_absb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_absb (OrcOpcodeExecutor *ex);
-void emulate_addb (OrcOpcodeExecutor *ex, int n);
+void emulate_addb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addb (OrcOpcodeExecutor *ex);
-void emulate_addssb (OrcOpcodeExecutor *ex, int n);
+void emulate_addssb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addssb (OrcOpcodeExecutor *ex);
-void emulate_addusb (OrcOpcodeExecutor *ex, int n);
+void emulate_addusb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addusb (OrcOpcodeExecutor *ex);
-void emulate_andb (OrcOpcodeExecutor *ex, int n);
+void emulate_andb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_andb (OrcOpcodeExecutor *ex);
-void emulate_andnb (OrcOpcodeExecutor *ex, int n);
+void emulate_andnb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_andnb (OrcOpcodeExecutor *ex);
-void emulate_avgsb (OrcOpcodeExecutor *ex, int n);
+void emulate_avgsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_avgsb (OrcOpcodeExecutor *ex);
-void emulate_avgub (OrcOpcodeExecutor *ex, int n);
+void emulate_avgub (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_avgub (OrcOpcodeExecutor *ex);
-void emulate_cmpeqb (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpeqb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpeqb (OrcOpcodeExecutor *ex);
-void emulate_cmpgtsb (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpgtsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpgtsb (OrcOpcodeExecutor *ex);
-void emulate_copyb (OrcOpcodeExecutor *ex, int n);
+void emulate_copyb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_copyb (OrcOpcodeExecutor *ex);
-void emulate_maxsb (OrcOpcodeExecutor *ex, int n);
+void emulate_maxsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxsb (OrcOpcodeExecutor *ex);
-void emulate_maxub (OrcOpcodeExecutor *ex, int n);
+void emulate_maxub (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxub (OrcOpcodeExecutor *ex);
-void emulate_minsb (OrcOpcodeExecutor *ex, int n);
+void emulate_minsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minsb (OrcOpcodeExecutor *ex);
-void emulate_minub (OrcOpcodeExecutor *ex, int n);
+void emulate_minub (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minub (OrcOpcodeExecutor *ex);
-void emulate_mullb (OrcOpcodeExecutor *ex, int n);
+void emulate_mullb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mullb (OrcOpcodeExecutor *ex);
-void emulate_mulhsb (OrcOpcodeExecutor *ex, int n);
+void emulate_mulhsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulhsb (OrcOpcodeExecutor *ex);
-void emulate_mulhub (OrcOpcodeExecutor *ex, int n);
+void emulate_mulhub (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulhub (OrcOpcodeExecutor *ex);
-void emulate_orb (OrcOpcodeExecutor *ex, int n);
+void emulate_orb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_orb (OrcOpcodeExecutor *ex);
-void emulate_shlb (OrcOpcodeExecutor *ex, int n);
+void emulate_shlb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shlb (OrcOpcodeExecutor *ex);
-void emulate_shrsb (OrcOpcodeExecutor *ex, int n);
+void emulate_shrsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shrsb (OrcOpcodeExecutor *ex);
-void emulate_shrub (OrcOpcodeExecutor *ex, int n);
+void emulate_shrub (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shrub (OrcOpcodeExecutor *ex);
-void emulate_signb (OrcOpcodeExecutor *ex, int n);
+void emulate_signb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_signb (OrcOpcodeExecutor *ex);
-void emulate_subb (OrcOpcodeExecutor *ex, int n);
+void emulate_subb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subb (OrcOpcodeExecutor *ex);
-void emulate_subssb (OrcOpcodeExecutor *ex, int n);
+void emulate_subssb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subssb (OrcOpcodeExecutor *ex);
-void emulate_subusb (OrcOpcodeExecutor *ex, int n);
+void emulate_subusb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subusb (OrcOpcodeExecutor *ex);
-void emulate_xorb (OrcOpcodeExecutor *ex, int n);
+void emulate_xorb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_xorb (OrcOpcodeExecutor *ex);
-void emulate_absw (OrcOpcodeExecutor *ex, int n);
+void emulate_absw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_absw (OrcOpcodeExecutor *ex);
-void emulate_addw (OrcOpcodeExecutor *ex, int n);
+void emulate_addw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addw (OrcOpcodeExecutor *ex);
-void emulate_addssw (OrcOpcodeExecutor *ex, int n);
+void emulate_addssw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addssw (OrcOpcodeExecutor *ex);
-void emulate_addusw (OrcOpcodeExecutor *ex, int n);
+void emulate_addusw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addusw (OrcOpcodeExecutor *ex);
-void emulate_andw (OrcOpcodeExecutor *ex, int n);
+void emulate_andw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_andw (OrcOpcodeExecutor *ex);
-void emulate_andnw (OrcOpcodeExecutor *ex, int n);
+void emulate_andnw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_andnw (OrcOpcodeExecutor *ex);
-void emulate_avgsw (OrcOpcodeExecutor *ex, int n);
+void emulate_avgsw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_avgsw (OrcOpcodeExecutor *ex);
-void emulate_avguw (OrcOpcodeExecutor *ex, int n);
+void emulate_avguw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_avguw (OrcOpcodeExecutor *ex);
-void emulate_cmpeqw (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpeqw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpeqw (OrcOpcodeExecutor *ex);
-void emulate_cmpgtsw (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpgtsw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpgtsw (OrcOpcodeExecutor *ex);
-void emulate_copyw (OrcOpcodeExecutor *ex, int n);
+void emulate_copyw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_copyw (OrcOpcodeExecutor *ex);
-void emulate_maxsw (OrcOpcodeExecutor *ex, int n);
+void emulate_maxsw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxsw (OrcOpcodeExecutor *ex);
-void emulate_maxuw (OrcOpcodeExecutor *ex, int n);
+void emulate_maxuw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxuw (OrcOpcodeExecutor *ex);
-void emulate_minsw (OrcOpcodeExecutor *ex, int n);
+void emulate_minsw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minsw (OrcOpcodeExecutor *ex);
-void emulate_minuw (OrcOpcodeExecutor *ex, int n);
+void emulate_minuw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minuw (OrcOpcodeExecutor *ex);
-void emulate_mullw (OrcOpcodeExecutor *ex, int n);
+void emulate_mullw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mullw (OrcOpcodeExecutor *ex);
-void emulate_mulhsw (OrcOpcodeExecutor *ex, int n);
+void emulate_mulhsw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulhsw (OrcOpcodeExecutor *ex);
-void emulate_mulhuw (OrcOpcodeExecutor *ex, int n);
+void emulate_mulhuw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulhuw (OrcOpcodeExecutor *ex);
-void emulate_orw (OrcOpcodeExecutor *ex, int n);
+void emulate_orw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_orw (OrcOpcodeExecutor *ex);
-void emulate_shlw (OrcOpcodeExecutor *ex, int n);
+void emulate_shlw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shlw (OrcOpcodeExecutor *ex);
-void emulate_shrsw (OrcOpcodeExecutor *ex, int n);
+void emulate_shrsw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shrsw (OrcOpcodeExecutor *ex);
-void emulate_shruw (OrcOpcodeExecutor *ex, int n);
+void emulate_shruw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shruw (OrcOpcodeExecutor *ex);
-void emulate_signw (OrcOpcodeExecutor *ex, int n);
+void emulate_signw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_signw (OrcOpcodeExecutor *ex);
-void emulate_subw (OrcOpcodeExecutor *ex, int n);
+void emulate_subw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subw (OrcOpcodeExecutor *ex);
-void emulate_subssw (OrcOpcodeExecutor *ex, int n);
+void emulate_subssw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subssw (OrcOpcodeExecutor *ex);
-void emulate_subusw (OrcOpcodeExecutor *ex, int n);
+void emulate_subusw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subusw (OrcOpcodeExecutor *ex);
-void emulate_xorw (OrcOpcodeExecutor *ex, int n);
+void emulate_xorw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_xorw (OrcOpcodeExecutor *ex);
-void emulate_absl (OrcOpcodeExecutor *ex, int n);
+void emulate_absl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_absl (OrcOpcodeExecutor *ex);
-void emulate_addl (OrcOpcodeExecutor *ex, int n);
+void emulate_addl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addl (OrcOpcodeExecutor *ex);
-void emulate_addssl (OrcOpcodeExecutor *ex, int n);
+void emulate_addssl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addssl (OrcOpcodeExecutor *ex);
-void emulate_addusl (OrcOpcodeExecutor *ex, int n);
+void emulate_addusl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addusl (OrcOpcodeExecutor *ex);
-void emulate_andl (OrcOpcodeExecutor *ex, int n);
+void emulate_andl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_andl (OrcOpcodeExecutor *ex);
-void emulate_andnl (OrcOpcodeExecutor *ex, int n);
+void emulate_andnl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_andnl (OrcOpcodeExecutor *ex);
-void emulate_avgsl (OrcOpcodeExecutor *ex, int n);
+void emulate_avgsl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_avgsl (OrcOpcodeExecutor *ex);
-void emulate_avgul (OrcOpcodeExecutor *ex, int n);
+void emulate_avgul (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_avgul (OrcOpcodeExecutor *ex);
-void emulate_cmpeql (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpeql (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpeql (OrcOpcodeExecutor *ex);
-void emulate_cmpgtsl (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpgtsl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpgtsl (OrcOpcodeExecutor *ex);
-void emulate_copyl (OrcOpcodeExecutor *ex, int n);
+void emulate_copyl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_copyl (OrcOpcodeExecutor *ex);
-void emulate_maxsl (OrcOpcodeExecutor *ex, int n);
+void emulate_maxsl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxsl (OrcOpcodeExecutor *ex);
-void emulate_maxul (OrcOpcodeExecutor *ex, int n);
+void emulate_maxul (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxul (OrcOpcodeExecutor *ex);
-void emulate_minsl (OrcOpcodeExecutor *ex, int n);
+void emulate_minsl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minsl (OrcOpcodeExecutor *ex);
-void emulate_minul (OrcOpcodeExecutor *ex, int n);
+void emulate_minul (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minul (OrcOpcodeExecutor *ex);
-void emulate_mulll (OrcOpcodeExecutor *ex, int n);
+void emulate_mulll (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulll (OrcOpcodeExecutor *ex);
-void emulate_mulhsl (OrcOpcodeExecutor *ex, int n);
+void emulate_mulhsl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulhsl (OrcOpcodeExecutor *ex);
-void emulate_mulhul (OrcOpcodeExecutor *ex, int n);
+void emulate_mulhul (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulhul (OrcOpcodeExecutor *ex);
-void emulate_orl (OrcOpcodeExecutor *ex, int n);
+void emulate_orl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_orl (OrcOpcodeExecutor *ex);
-void emulate_shll (OrcOpcodeExecutor *ex, int n);
+void emulate_shll (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shll (OrcOpcodeExecutor *ex);
-void emulate_shrsl (OrcOpcodeExecutor *ex, int n);
+void emulate_shrsl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shrsl (OrcOpcodeExecutor *ex);
-void emulate_shrul (OrcOpcodeExecutor *ex, int n);
+void emulate_shrul (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_shrul (OrcOpcodeExecutor *ex);
-void emulate_signl (OrcOpcodeExecutor *ex, int n);
+void emulate_signl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_signl (OrcOpcodeExecutor *ex);
-void emulate_subl (OrcOpcodeExecutor *ex, int n);
+void emulate_subl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subl (OrcOpcodeExecutor *ex);
-void emulate_subssl (OrcOpcodeExecutor *ex, int n);
+void emulate_subssl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subssl (OrcOpcodeExecutor *ex);
-void emulate_subusl (OrcOpcodeExecutor *ex, int n);
+void emulate_subusl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subusl (OrcOpcodeExecutor *ex);
-void emulate_xorl (OrcOpcodeExecutor *ex, int n);
+void emulate_xorl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_xorl (OrcOpcodeExecutor *ex);
-void emulate_convsbw (OrcOpcodeExecutor *ex, int n);
+void emulate_convsbw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convsbw (OrcOpcodeExecutor *ex);
-void emulate_convubw (OrcOpcodeExecutor *ex, int n);
+void emulate_convubw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convubw (OrcOpcodeExecutor *ex);
-void emulate_convswl (OrcOpcodeExecutor *ex, int n);
+void emulate_convswl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convswl (OrcOpcodeExecutor *ex);
-void emulate_convuwl (OrcOpcodeExecutor *ex, int n);
+void emulate_convuwl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convuwl (OrcOpcodeExecutor *ex);
-void emulate_convwb (OrcOpcodeExecutor *ex, int n);
+void emulate_convwb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convwb (OrcOpcodeExecutor *ex);
-void emulate_convssswb (OrcOpcodeExecutor *ex, int n);
+void emulate_convssswb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convssswb (OrcOpcodeExecutor *ex);
-void emulate_convsuswb (OrcOpcodeExecutor *ex, int n);
+void emulate_convsuswb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convsuswb (OrcOpcodeExecutor *ex);
-void emulate_convusswb (OrcOpcodeExecutor *ex, int n);
+void emulate_convusswb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convusswb (OrcOpcodeExecutor *ex);
-void emulate_convuuswb (OrcOpcodeExecutor *ex, int n);
+void emulate_convuuswb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convuuswb (OrcOpcodeExecutor *ex);
-void emulate_convlw (OrcOpcodeExecutor *ex, int n);
+void emulate_convlw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convlw (OrcOpcodeExecutor *ex);
-void emulate_convssslw (OrcOpcodeExecutor *ex, int n);
+void emulate_convssslw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convssslw (OrcOpcodeExecutor *ex);
-void emulate_convsuslw (OrcOpcodeExecutor *ex, int n);
+void emulate_convsuslw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convsuslw (OrcOpcodeExecutor *ex);
-void emulate_convusslw (OrcOpcodeExecutor *ex, int n);
+void emulate_convusslw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convusslw (OrcOpcodeExecutor *ex);
-void emulate_convuuslw (OrcOpcodeExecutor *ex, int n);
+void emulate_convuuslw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convuuslw (OrcOpcodeExecutor *ex);
-void emulate_mulsbw (OrcOpcodeExecutor *ex, int n);
+void emulate_mulsbw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulsbw (OrcOpcodeExecutor *ex);
-void emulate_mulubw (OrcOpcodeExecutor *ex, int n);
+void emulate_mulubw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulubw (OrcOpcodeExecutor *ex);
-void emulate_mulswl (OrcOpcodeExecutor *ex, int n);
+void emulate_mulswl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulswl (OrcOpcodeExecutor *ex);
-void emulate_muluwl (OrcOpcodeExecutor *ex, int n);
+void emulate_muluwl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_muluwl (OrcOpcodeExecutor *ex);
-void emulate_accw (OrcOpcodeExecutor *ex, int n);
+void emulate_accw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_accw (OrcOpcodeExecutor *ex);
-void emulate_accl (OrcOpcodeExecutor *ex, int n);
+void emulate_accl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_accl (OrcOpcodeExecutor *ex);
-void emulate_accsadubl (OrcOpcodeExecutor *ex, int n);
+void emulate_accsadubl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_accsadubl (OrcOpcodeExecutor *ex);
-void emulate_swapw (OrcOpcodeExecutor *ex, int n);
+void emulate_swapw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_swapw (OrcOpcodeExecutor *ex);
-void emulate_swapl (OrcOpcodeExecutor *ex, int n);
+void emulate_swapl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_swapl (OrcOpcodeExecutor *ex);
-void emulate_select0wb (OrcOpcodeExecutor *ex, int n);
+void emulate_select0wb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_select0wb (OrcOpcodeExecutor *ex);
-void emulate_select1wb (OrcOpcodeExecutor *ex, int n);
+void emulate_select1wb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_select1wb (OrcOpcodeExecutor *ex);
-void emulate_select0lw (OrcOpcodeExecutor *ex, int n);
+void emulate_select0lw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_select0lw (OrcOpcodeExecutor *ex);
-void emulate_select1lw (OrcOpcodeExecutor *ex, int n);
+void emulate_select1lw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_select1lw (OrcOpcodeExecutor *ex);
-void emulate_mergewl (OrcOpcodeExecutor *ex, int n);
+void emulate_mergewl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mergewl (OrcOpcodeExecutor *ex);
-void emulate_mergebw (OrcOpcodeExecutor *ex, int n);
+void emulate_mergebw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mergebw (OrcOpcodeExecutor *ex);
-void emulate_splitlw (OrcOpcodeExecutor *ex, int n);
+void emulate_splitlw (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_splitlw (OrcOpcodeExecutor *ex);
-void emulate_splitwb (OrcOpcodeExecutor *ex, int n);
+void emulate_splitwb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_splitwb (OrcOpcodeExecutor *ex);
-void emulate_addf (OrcOpcodeExecutor *ex, int n);
+void emulate_addf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_addf (OrcOpcodeExecutor *ex);
-void emulate_subf (OrcOpcodeExecutor *ex, int n);
+void emulate_subf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_subf (OrcOpcodeExecutor *ex);
-void emulate_mulf (OrcOpcodeExecutor *ex, int n);
+void emulate_mulf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_mulf (OrcOpcodeExecutor *ex);
-void emulate_divf (OrcOpcodeExecutor *ex, int n);
+void emulate_divf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_divf (OrcOpcodeExecutor *ex);
-void emulate_sqrtf (OrcOpcodeExecutor *ex, int n);
+void emulate_sqrtf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_sqrtf (OrcOpcodeExecutor *ex);
-void emulate_maxf (OrcOpcodeExecutor *ex, int n);
+void emulate_maxf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_maxf (OrcOpcodeExecutor *ex);
-void emulate_minf (OrcOpcodeExecutor *ex, int n);
+void emulate_minf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_minf (OrcOpcodeExecutor *ex);
-void emulate_cmpeqf (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpeqf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpeqf (OrcOpcodeExecutor *ex);
-void emulate_cmpltf (OrcOpcodeExecutor *ex, int n);
+void emulate_cmpltf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmpltf (OrcOpcodeExecutor *ex);
-void emulate_cmplef (OrcOpcodeExecutor *ex, int n);
+void emulate_cmplef (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_cmplef (OrcOpcodeExecutor *ex);
-void emulate_convfl (OrcOpcodeExecutor *ex, int n);
+void emulate_convfl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convfl (OrcOpcodeExecutor *ex);
-void emulate_convlf (OrcOpcodeExecutor *ex, int n);
+void emulate_convlf (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_n16_convlf (OrcOpcodeExecutor *ex);
-void emulate_loadb (OrcOpcodeExecutor *ex, int n);
-void emulate_loadw (OrcOpcodeExecutor *ex, int n);
-void emulate_loadl (OrcOpcodeExecutor *ex, int n);
-void emulate_storeb (OrcOpcodeExecutor *ex, int n);
-void emulate_storew (OrcOpcodeExecutor *ex, int n);
-void emulate_storel (OrcOpcodeExecutor *ex, int n);
+void emulate_loadb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadw (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_loadl (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_storeb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_storew (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_storel (OrcOpcodeExecutor *ex, int i, int n);
index 98c1e14..1719a34 100644 (file)
@@ -163,11 +163,11 @@ orc_executor_emulate (OrcExecutor *ex)
   int j;
   int k;
   int m, m_index;
-  OrcProgram *program = ex->program;
+  OrcCode *code = ex->program->orccode;
   OrcInstruction *insn;
   OrcStaticOpcode *opcode;
   OrcOpcodeExecutor *opcode_ex;
-  void *tmpspace[ORC_VAR_T15+1] = { 0 };
+  void *tmpspace[ORC_N_COMPILER_VARIABLES] = { 0 };
 
   ex->accumulators[0] = 0;
   ex->accumulators[1] = 0;
@@ -178,37 +178,40 @@ orc_executor_emulate (OrcExecutor *ex)
 
   memset (&opcode_ex, 0, sizeof(opcode_ex));
 
-  if (program->is_2d) {
+  if (code->is_2d) {
     m = ORC_EXECUTOR_M(ex);
   } else {
     m = 1;
   }
 
-  for(i=0;i<ORC_VAR_T15+1;i++){
-    OrcVariable *var = program->vars + i;
+  for(i=0;i<ORC_N_COMPILER_VARIABLES;i++){
+    OrcVariable *var = code->vars + i;
 
     if (var->size) {
       tmpspace[i] = malloc(4 * 16);
     }
   }
 
-  opcode_ex = malloc(sizeof(OrcOpcodeExecutor)*program->n_insns);
+  opcode_ex = malloc(sizeof(OrcOpcodeExecutor)*code->n_insns);
 
-  for(j=0;j<program->n_insns;j++){
-    insn = program->insns + j;
+  for(j=0;j<code->n_insns;j++){
+    insn = code->insns + j;
     opcode = insn->opcode;
 
     opcode_ex[j].emulateN = opcode->emulateN;
     for(k=0;k<ORC_STATIC_OPCODE_N_SRC;k++) {
-      OrcVariable *var = program->vars + insn->src_args[k];
+      OrcVariable *var = code->vars + insn->src_args[k];
+      if (opcode->src_size[k] == 0) continue;
 
       if (var->vartype == ORC_VAR_TYPE_CONST) {
         opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]];
-        load_constant (tmpspace[insn->src_args[k]], opcode->src_size[k],
+        /* FIXME hack */
+        load_constant (tmpspace[insn->src_args[k]], 4,
             var->value);
       } else if (var->vartype == ORC_VAR_TYPE_PARAM) {
         opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]];
-        load_constant (tmpspace[insn->src_args[k]], opcode->src_size[k],
+        /* FIXME hack */
+        load_constant (tmpspace[insn->src_args[k]], 4,
             ex->params[insn->src_args[k]]);
       } else if (var->vartype == ORC_VAR_TYPE_TEMP) {
         opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]];
@@ -219,9 +222,11 @@ orc_executor_emulate (OrcExecutor *ex)
       }
     }
     for(k=0;k<ORC_STATIC_OPCODE_N_DEST;k++) {
-      OrcVariable *var = program->vars + insn->dest_args[k];
+      OrcVariable *var = code->vars + insn->dest_args[k];
+      if (opcode->dest_size[k] == 0) continue;
 
       if (var->vartype == ORC_VAR_TYPE_TEMP) {
+        ORC_DEBUG("dest vartype tmp %d", insn->dest_args[k]);
         opcode_ex[j].dest_ptrs[k] = tmpspace[insn->dest_args[k]];
       } else if (var->vartype == ORC_VAR_TYPE_ACCUMULATOR) {
         opcode_ex[j].dest_ptrs[k] =
@@ -230,49 +235,52 @@ orc_executor_emulate (OrcExecutor *ex)
         opcode_ex[j].dest_ptrs[k] = ex->arrays[insn->dest_args[k]];
       }
     }
+    ORC_DEBUG("opcode %s %p %p %p", opcode->name,
+        opcode_ex[j].dest_ptrs[0], opcode_ex[j].src_ptrs[0],
+        opcode_ex[j].src_ptrs[1]);
   }
   
   ORC_DEBUG("src ptr %p stride %d", ex->arrays[ORC_VAR_S1], ex->params[ORC_VAR_S1]);
   for(m_index=0;m_index<m;m_index++){
     ORC_DEBUG("m_index %d m %d", m_index, m);
 
-    for(i=0;i<ex->n;i+=16){
-      for(j=0;j<program->n_insns;j++){
-        insn = program->insns + j;
-        opcode = insn->opcode;
-
-        for(k=0;k<ORC_STATIC_OPCODE_N_SRC;k++) {
-          OrcVariable *var = program->vars + insn->src_args[k];
-
-          if (var->vartype == ORC_VAR_TYPE_SRC) {
-            opcode_ex[j].src_ptrs[k] =
-              ORC_PTR_OFFSET(ex->arrays[insn->src_args[k]],
-                  var->size*i + ex->params[insn->src_args[k]]*m_index);
-          } else if (var->vartype == ORC_VAR_TYPE_DEST) {
-            opcode_ex[j].src_ptrs[k] =
-              ORC_PTR_OFFSET(ex->arrays[insn->src_args[k]],
-                  var->size*i + ex->params[insn->src_args[k]]*m_index);
-          }
+    for(j=0;j<code->n_insns;j++){
+      insn = code->insns + j;
+      opcode = insn->opcode;
+
+      for(k=0;k<ORC_STATIC_OPCODE_N_SRC;k++) {
+        OrcVariable *var = code->vars + insn->src_args[k];
+
+        if (var->vartype == ORC_VAR_TYPE_SRC) {
+          opcode_ex[j].src_ptrs[k] =
+            ORC_PTR_OFFSET(ex->arrays[insn->src_args[k]],
+                ex->params[insn->src_args[k]]*m_index);
+        } else if (var->vartype == ORC_VAR_TYPE_DEST) {
+          opcode_ex[j].src_ptrs[k] =
+            ORC_PTR_OFFSET(ex->arrays[insn->src_args[k]],
+                ex->params[insn->src_args[k]]*m_index);
         }
-        for(k=0;k<ORC_STATIC_OPCODE_N_DEST;k++) {
-          OrcVariable *var = program->vars + insn->dest_args[k];
-
-          if (var->vartype == ORC_VAR_TYPE_DEST) {
-            opcode_ex[j].dest_ptrs[k] =
-              ORC_PTR_OFFSET(ex->arrays[insn->dest_args[k]],
-                  var->size*i + ex->params[insn->dest_args[k]]*m_index);
-          }
+      }
+      for(k=0;k<ORC_STATIC_OPCODE_N_DEST;k++) {
+        OrcVariable *var = code->vars + insn->dest_args[k];
+
+        if (var->vartype == ORC_VAR_TYPE_DEST) {
+          opcode_ex[j].dest_ptrs[k] =
+            ORC_PTR_OFFSET(ex->arrays[insn->dest_args[k]],
+                ex->params[insn->dest_args[k]]*m_index);
         }
       }
+    }
 
-      for(j=0;j<program->n_insns;j++){
-        insn = program->insns + j;
+    for(i=0;i<ex->n;i+=16){
+      for(j=0;j<code->n_insns;j++){
+        insn = code->insns + j;
         opcode = insn->opcode;
 
         if (ex->n - i >= 16) {
-          opcode_ex[j].emulateN (opcode_ex + j, 16);
+          opcode_ex[j].emulateN (opcode_ex + j, i, 16);
         } else {
-          opcode_ex[j].emulateN (opcode_ex + j, ex->n - i);
+          opcode_ex[j].emulateN (opcode_ex + j, i, ex->n - i);
         }
       }
     }
index 4332def..cadb618 100644 (file)
@@ -102,13 +102,11 @@ orc_memcpy (void * d1, const void * s1, int n){
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: copyb */
     var33 = var32;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
@@ -129,13 +127,11 @@ _backup_orc_memcpy (OrcExecutor *ex)
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var32 = *ptr4;
+    var32 = ptr4[i];
     /* 1: copyb */
     var33 = var32;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
-    ptr4++;
+    ptr0[i] = var33;
   }
 
 }
@@ -196,8 +192,7 @@ orc_memset (void * d1, int p1, int n){
     /* 1: copyb */
     var33 = var32;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
+    ptr0[i] = var33;
   }
 
 }
@@ -221,8 +216,7 @@ _backup_orc_memset (OrcExecutor *ex)
     /* 1: copyb */
     var33 = var32;
     /* 2: storeb */
-    *ptr0 = var33;
-    ptr0++;
+    ptr0[i] = var33;
   }
 
 }
index 32577e9..e38b6c9 100644 (file)
@@ -21,7 +21,7 @@ typedef struct _OrcTarget OrcTarget;
 typedef struct _OrcCode OrcCode;
 
 typedef void (*OrcOpcodeEmulateFunc)(OrcOpcodeExecutor *ex, void *user);
-typedef void (*OrcOpcodeEmulateNFunc)(OrcOpcodeExecutor *ex, int n);
+typedef void (*OrcOpcodeEmulateNFunc)(OrcOpcodeExecutor *ex, int index, int n);
 typedef void (*OrcOpcodeEmulate16Func)(OrcOpcodeExecutor *ex);
 typedef void (*OrcRuleEmitFunc)(OrcCompiler *p, void *user, OrcInstruction *insn);
 typedef void (*OrcExecutorFunc)(OrcExecutor *ex);