Add ldresnear[bl] and ldreslin[bl] opcodes
authorDavid Schleef <ds@schleef.org>
Fri, 13 Aug 2010 18:52:35 +0000 (11:52 -0700)
committerDavid Schleef <ds@schleef.org>
Fri, 13 Aug 2010 18:52:35 +0000 (11:52 -0700)
orc/orcemulateopcodes.c
orc/orcemulateopcodes.h
orc/orcfunctions.c
orc/orcopcodes.c
orc/orcprogram-c.c

index f8ad367..3663e1b 100644 (file)
@@ -438,6 +438,97 @@ emulate_loadpb (OrcOpcodeExecutor *ex, int offset, int n)
 }
 
 void
+emulate_ldresnearb (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: ldresnearb */
+    var32 = ptr4[(((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i)*((orc_union32 *)(ex->src_ptrs[2]))->i)>>16];
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_ldresnearl (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_union32 * ptr0;
+  const orc_union32 * ptr4;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *)ex->dest_ptrs[0];
+  ptr4 = (orc_union32 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldresnearl */
+    var32 = ptr4[(((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i)*((orc_union32 *)(ex->src_ptrs[2]))->i)>>16];
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_ldreslinb (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: ldreslinb */
+    {
+    int tmp = ((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i) * ((orc_union32 *)(ex->src_ptrs[2]))->i;
+    var32 = ((orc_uint8)ptr4[tmp>>16] * (256-((tmp>>8)&0xff)) + (orc_uint8)ptr4[(tmp>>16)+1] * ((tmp>>8)&0xff))>>8;
+    }
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
+emulate_ldreslinl (OrcOpcodeExecutor *ex, int offset, int n)
+{
+  int i;
+  orc_union32 * ptr0;
+  const orc_union32 * ptr4;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *)ex->dest_ptrs[0];
+  ptr4 = (orc_union32 *)ex->src_ptrs[0];
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinl */
+    {
+    int tmp = ((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i) * ((orc_union32 *)(ex->src_ptrs[2]))->i;
+    orc_union32 a = ptr4[tmp>>16];
+    orc_union32 b = ptr4[(tmp>>16)+1];
+    var32.x4[0] = a.x4[0] * (256-((tmp>>8)&0xff)) + b.x4[0] * ((tmp>>8)&0xff);
+    var32.x4[1] = a.x4[1] * (256-((tmp>>8)&0xff)) + b.x4[1] * ((tmp>>8)&0xff);
+    var32.x4[2] = a.x4[2] * (256-((tmp>>8)&0xff)) + b.x4[2] * ((tmp>>8)&0xff);
+    var32.x4[3] = a.x4[3] * (256-((tmp>>8)&0xff)) + b.x4[3] * ((tmp>>8)&0xff);
+    }
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+void
 emulate_maxsb (OrcOpcodeExecutor *ex, int offset, int n)
 {
   int i;
index b6546bf..5ea3a79 100644 (file)
@@ -20,6 +20,10 @@ void emulate_loadoffb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_loadupdb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_loadupib (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_loadpb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldresnearb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldresnearl (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldreslinb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldreslinl (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_maxsb (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_maxub (OrcOpcodeExecutor *ex, int i, int n);
 void emulate_minsb (OrcOpcodeExecutor *ex, int i, int n);
index fb77204..d388689 100644 (file)
@@ -156,7 +156,7 @@ orc_memcpy (void * d1, const void * s1, int n)
       orc_program_add_destination (p, 1, "d1");
       orc_program_add_source (p, 1, "s1");
 
-      orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, -1);
+      orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1);
 
       result = orc_program_compile (p);
     }
@@ -239,7 +239,7 @@ orc_memset (void * d1, int p1, int n)
       orc_program_add_destination (p, 1, "d1");
       orc_program_add_parameter (p, 1, "p1");
 
-      orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, -1);
+      orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, ORC_VAR_D1);
 
       result = orc_program_compile (p);
     }
index 31731eb..390d844 100644 (file)
@@ -301,6 +301,10 @@ static OrcStaticOpcode opcodes[] = {
   { "loadupdb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_ITERATOR, { 1 }, { 1 }, emulate_loadupdb },
   { "loadupib", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_ITERATOR, { 1 }, { 1 }, emulate_loadupib },
   { "loadpb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR|ORC_STATIC_OPCODE_INVARIANT, { 1 }, { 1 }, emulate_loadpb },
+  { "ldresnearb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 1 }, { 1, 4, 4 }, emulate_null },
+  { "ldresnearl", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 4 }, { 4, 4, 4 }, emulate_null },
+  { "ldreslinb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 1 }, { 1, 4, 4 }, emulate_null },
+  { "ldreslinl", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 4 }, { 4, 4, 4 }, emulate_null },
   { "maxsb", 0, { 1 }, { 1, 1 }, emulate_maxsb },
   { "maxub", 0, { 1 }, { 1, 1 }, emulate_maxub },
   { "minsb", 0, { 1 }, { 1, 1 }, emulate_minsb },
index 88725fc..cf92cc8 100644 (file)
@@ -725,6 +725,73 @@ c_rule_loadupib (OrcCompiler *p, void *user, OrcInstruction *insn)
 }
 
 static void
+c_rule_ldresnearX (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char src1[40];
+  char src2[40];
+
+  c_get_name_int (src1, p, insn, insn->src_args[1]);
+  c_get_name_int (src2, p, insn, insn->src_args[2]);
+
+  if (p->target_flags & ORC_TARGET_C_OPCODE &&
+      !(insn->flags & ORC_INSN_FLAG_ADDED)) {
+    ORC_ASM_CODE(p,"    var%d = ptr%d[(%s + (offset + i)*%s)>>16];\n",
+        insn->dest_args[0], insn->src_args[0], src1, src2);
+  } else {
+    ORC_ASM_CODE(p,"    var%d = ptr%d[(%s + i*%s)>>16];\n",
+        insn->dest_args[0], insn->src_args[0], src1, src2);
+  }
+}
+
+static void
+c_rule_ldreslinb (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char src1[40];
+  char src2[40];
+
+  c_get_name_int (src1, p, insn, insn->src_args[1]);
+  c_get_name_int (src2, p, insn, insn->src_args[2]);
+
+  ORC_ASM_CODE(p,"    {\n");
+  if (p->target_flags & ORC_TARGET_C_OPCODE &&
+      !(insn->flags & ORC_INSN_FLAG_ADDED)) {
+    ORC_ASM_CODE(p,"    int tmp = %s + (offset + i) * %s;\n", src1, src2);
+  } else {
+    ORC_ASM_CODE(p,"    int tmp = %s + i * %s;\n", src1, src2);
+  }
+  ORC_ASM_CODE(p,"    var%d = ((orc_uint8)ptr%d[tmp>>16] * (256-((tmp>>8)&0xff)) + (orc_uint8)ptr%d[(tmp>>16)+1] * ((tmp>>8)&0xff))>>8;\n",
+      insn->dest_args[0], insn->src_args[0], insn->src_args[0]);
+  ORC_ASM_CODE(p,"    }\n");
+}
+
+static void
+c_rule_ldreslinl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  int i;
+  char src1[40];
+  char src2[40];
+
+  c_get_name_int (src1, p, insn, insn->src_args[1]);
+  c_get_name_int (src2, p, insn, insn->src_args[2]);
+
+
+  ORC_ASM_CODE(p,"    {\n");
+  if (p->target_flags & ORC_TARGET_C_OPCODE &&
+      !(insn->flags & ORC_INSN_FLAG_ADDED)) {
+    ORC_ASM_CODE(p,"    int tmp = %s + (offset + i) * %s;\n", src1, src2);
+  } else {
+    ORC_ASM_CODE(p,"    int tmp = %s + i * %s;\n", src1, src2);
+  }
+  ORC_ASM_CODE(p,"    orc_union32 a = ptr%d[tmp>>16];\n", insn->src_args[0]);
+  ORC_ASM_CODE(p,"    orc_union32 b = ptr%d[(tmp>>16)+1];\n", insn->src_args[0]);
+  for (i=0;i<4;i++){
+    ORC_ASM_CODE(p,"    var%d.x4[%d] = a.x4[%d] * (256-((tmp>>8)&0xff)) + b.x4[%d] * ((tmp>>8)&0xff);\n",
+        insn->dest_args[0], i, i, i);
+  }
+  ORC_ASM_CODE(p,"    }\n");
+}
+
+static void
 c_rule_storeX (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
   if (p->target_flags & ORC_TARGET_C_OPCODE &&
@@ -936,6 +1003,10 @@ orc_c_init (void)
   orc_rule_register (rule_set, "loadoffl", c_rule_loadoffX, NULL);
   orc_rule_register (rule_set, "loadupdb", c_rule_loadupdb, NULL);
   orc_rule_register (rule_set, "loadupib", c_rule_loadupib, NULL);
+  orc_rule_register (rule_set, "ldresnearb", c_rule_ldresnearX, NULL);
+  orc_rule_register (rule_set, "ldresnearl", c_rule_ldresnearX, NULL);
+  orc_rule_register (rule_set, "ldreslinb", c_rule_ldreslinb, NULL);
+  orc_rule_register (rule_set, "ldreslinl", c_rule_ldreslinl, NULL);
   orc_rule_register (rule_set, "storeb", c_rule_storeX, NULL);
   orc_rule_register (rule_set, "storew", c_rule_storeX, NULL);
   orc_rule_register (rule_set, "storel", c_rule_storeX, NULL);