c: Fix endianness issues with select opcodes
authorDavid Schleef <ds@schleef.org>
Wed, 27 Apr 2011 00:35:45 +0000 (17:35 -0700)
committerDavid Schleef <ds@schleef.org>
Wed, 27 Apr 2011 00:35:45 +0000 (17:35 -0700)
orc/opcodes.h
orc/orcemulateopcodes.c
orc/orcprogram-c.c

index 0a9cd67..df428a9 100644 (file)
@@ -128,12 +128,6 @@ BINARY_WL(muluwl, "((orc_uint16)%s) * ((orc_uint16)%s)")
 BINARY_LQ(mulslq, "((orc_int64)%s) * ((orc_int64)%s)")
 BINARY_LQ(mululq, "((orc_uint64)((orc_uint32)%s)) * ((orc_uint64)((orc_uint32)%s))")
 
-UNARY_WB(select0wb, "(orc_uint16)%s & 0xff")
-UNARY_WB(select1wb, "((orc_uint16)%s >> 8)&0xff")
-UNARY_LW(select0lw, "(orc_uint32)%s & 0xffff")
-UNARY_LW(select1lw, "((orc_uint32)%s >> 16)&0xffff")
-UNARY_QL(select0ql, "(orc_uint64)%s & 0xffffffff")
-UNARY_QL(select1ql, "((orc_uint64)%s >> 32)&0xffffffff")
 UNARY_UW(swapw, "ORC_SWAP_W(%s)")
 UNARY_UL(swapl, "ORC_SWAP_L(%s)")
 UNARY_UQ(swapq, "ORC_SWAP_Q(%s)")
index d9ffb5e..c467aa0 100644 (file)
@@ -4138,7 +4138,11 @@ emulate_select0wb (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadw */
     var32 = ptr4[i];
     /* 1: select0wb */
-    var33 = (orc_uint16)var32.i & 0xff;
+    {
+       orc_union16 _src;
+       _src.i = var32.i;
+       var33 = _src.x2[0];
+    }
     /* 2: storeb */
     ptr0[i] = var33;
   }
@@ -4162,7 +4166,11 @@ emulate_select1wb (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadw */
     var32 = ptr4[i];
     /* 1: select1wb */
-    var33 = ((orc_uint16)var32.i >> 8)&0xff;
+    {
+       orc_union16 _src;
+       _src.i = var32.i;
+       var33 = _src.x2[1];
+    }
     /* 2: storeb */
     ptr0[i] = var33;
   }
@@ -4186,7 +4194,11 @@ emulate_select0lw (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadl */
     var32 = ptr4[i];
     /* 1: select0lw */
-    var33.i = (orc_uint32)var32.i & 0xffff;
+    {
+       orc_union32 _src;
+       _src.i = var32.i;
+       var33.i = _src.x2[0];
+    }
     /* 2: storew */
     ptr0[i] = var33;
   }
@@ -4210,7 +4222,11 @@ emulate_select1lw (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadl */
     var32 = ptr4[i];
     /* 1: select1lw */
-    var33.i = ((orc_uint32)var32.i >> 16)&0xffff;
+    {
+       orc_union32 _src;
+       _src.i = var32.i;
+       var33.i = _src.x2[1];
+    }
     /* 2: storew */
     ptr0[i] = var33;
   }
@@ -4234,7 +4250,11 @@ emulate_select0ql (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadq */
     var32 = ptr4[i];
     /* 1: select0ql */
-    var33.i = (orc_uint64)var32.i & 0xffffffff;
+    {
+       orc_union64 _src;
+       _src.i = var32.i;
+       var33.i = _src.x2[0];
+    }
     /* 2: storel */
     ptr0[i] = var33;
   }
@@ -4258,7 +4278,11 @@ emulate_select1ql (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadq */
     var32 = ptr4[i];
     /* 1: select1ql */
-    var33.i = ((orc_uint64)var32.i >> 32)&0xffffffff;
+    {
+       orc_union64 _src;
+       _src.i = var32.i;
+       var33.i = _src.x2[1];
+    }
     /* 2: storel */
     ptr0[i] = var33;
   }
index cabd536..dac0fe6 100644 (file)
@@ -1054,6 +1054,96 @@ c_rule_splitwb (OrcCompiler *p, void *user, OrcInstruction *insn)
 }
 
 static void
+c_rule_select0ql (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src, p, insn, insn->src_args[0]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union64 _src;\n");
+  ORC_ASM_CODE(p,"       _src.i = %s;\n", src);
+  ORC_ASM_CODE(p,"       %s = _src.x2[0];\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_select1ql (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src, p, insn, insn->src_args[0]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union64 _src;\n");
+  ORC_ASM_CODE(p,"       _src.i = %s;\n", src);
+  ORC_ASM_CODE(p,"       %s = _src.x2[1];\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_select0lw (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src, p, insn, insn->src_args[0]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union32 _src;\n");
+  ORC_ASM_CODE(p,"       _src.i = %s;\n", src);
+  ORC_ASM_CODE(p,"       %s = _src.x2[0];\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_select1lw (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src, p, insn, insn->src_args[0]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union32 _src;\n");
+  ORC_ASM_CODE(p,"       _src.i = %s;\n", src);
+  ORC_ASM_CODE(p,"       %s = _src.x2[1];\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_select0wb (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src, p, insn, insn->src_args[0]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union16 _src;\n");
+  ORC_ASM_CODE(p,"       _src.i = %s;\n", src);
+  ORC_ASM_CODE(p,"       %s = _src.x2[0];\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_select1wb (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src, p, insn, insn->src_args[0]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union16 _src;\n");
+  ORC_ASM_CODE(p,"       _src.i = %s;\n", src);
+  ORC_ASM_CODE(p,"       %s = _src.x2[1];\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
 c_rule_splatbw (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
   char dest[40], src[40];
@@ -1458,6 +1548,12 @@ orc_c_init (void)
   orc_rule_register (rule_set, "splitql", c_rule_splitql, NULL);
   orc_rule_register (rule_set, "splitlw", c_rule_splitlw, NULL);
   orc_rule_register (rule_set, "splitwb", c_rule_splitwb, NULL);
+  orc_rule_register (rule_set, "select0ql", c_rule_select0ql, NULL);
+  orc_rule_register (rule_set, "select1ql", c_rule_select1ql, NULL);
+  orc_rule_register (rule_set, "select0lw", c_rule_select0lw, NULL);
+  orc_rule_register (rule_set, "select1lw", c_rule_select1lw, NULL);
+  orc_rule_register (rule_set, "select0wb", c_rule_select0wb, NULL);
+  orc_rule_register (rule_set, "select1wb", c_rule_select1wb, NULL);
   orc_rule_register (rule_set, "splatbw", c_rule_splatbw, NULL);
   orc_rule_register (rule_set, "splatbl", c_rule_splatbl, NULL);
   orc_rule_register (rule_set, "splatw3q", c_rule_splatw3q, NULL);