c: Fix endianness issues with c backend
authorDavid Schleef <ds@schleef.org>
Tue, 26 Apr 2011 04:56:33 +0000 (21:56 -0700)
committerDavid Schleef <ds@schleef.org>
Tue, 26 Apr 2011 04:56:33 +0000 (21:56 -0700)
orc/opcodes.h
orc/orcemulateopcodes.c
orc/orcprogram-c.c

index b05cc6e..0a9cd67 100644 (file)
@@ -128,9 +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))")
 
-BINARY_LQ(mergelq, "((orc_uint64)%s & ORC_UINT64_C(0xffffffff)) | ((orc_uint64)%s << 32)")
-BINARY_WL(mergewl, "((orc_uint16)%s & 0x0000ffff) | ((orc_uint16)%s << 16)")
-BINARY_BW(mergebw, "((orc_uint8)%s & 0x00ff) | ((orc_uint8)%s << 8)")
 UNARY_WB(select0wb, "(orc_uint16)%s & 0xff")
 UNARY_WB(select1wb, "((orc_uint16)%s >> 8)&0xff")
 UNARY_LW(select0lw, "(orc_uint32)%s & 0xffff")
index d384f32..d9ffb5e 100644 (file)
@@ -4287,7 +4287,12 @@ emulate_mergelq (OrcOpcodeExecutor *ex, int offset, int n)
     /* 1: loadl */
     var33 = ptr5[i];
     /* 2: mergelq */
-    var34.i = ((orc_uint64)var32.i & ORC_UINT64_C(0xffffffff)) | ((orc_uint64)var33.i << 32);
+    {
+       orc_union64 _dest;
+       _dest.x2[0] = var32.i;
+       _dest.x2[1] = var33.i;
+       var34.i = _dest.i;
+    }
     /* 3: storeq */
     ptr0[i] = var34;
   }
@@ -4316,7 +4321,12 @@ emulate_mergewl (OrcOpcodeExecutor *ex, int offset, int n)
     /* 1: loadw */
     var33 = ptr5[i];
     /* 2: mergewl */
-    var34.i = ((orc_uint16)var32.i & 0x0000ffff) | ((orc_uint16)var33.i << 16);
+    {
+       orc_union32 _dest;
+       _dest.x2[0] = var32.i;
+       _dest.x2[1] = var33.i;
+       var34.i = _dest.i;
+    }
     /* 3: storel */
     ptr0[i] = var34;
   }
@@ -4345,7 +4355,12 @@ emulate_mergebw (OrcOpcodeExecutor *ex, int offset, int n)
     /* 1: loadb */
     var33 = ptr5[i];
     /* 2: mergebw */
-    var34.i = ((orc_uint8)var32 & 0x00ff) | ((orc_uint8)var33 << 8);
+    {
+       orc_union16 _dest;
+       _dest.x2[0] = var32;
+       _dest.x2[1] = var33;
+       var34.i = _dest.i;
+    }
     /* 3: storew */
     ptr0[i] = var34;
   }
@@ -4372,8 +4387,12 @@ emulate_splitql (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadq */
     var32 = ptr4[i];
     /* 1: splitql */
-    var33.i = (var32.i >> 32) & 0xffffffff;
-    var34.i = var32.i & 0xffffffff;
+    {
+       orc_union64 _src;
+       _src.i = var32.i;
+       var33.i = _src.x2[1];
+       var34.i = _src.x2[0];
+    }
     /* 2: storel */
     ptr0[i] = var33;
     /* 3: storel */
@@ -4402,8 +4421,12 @@ emulate_splitlw (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadl */
     var32 = ptr4[i];
     /* 1: splitlw */
-    var33.i = (var32.i >> 16) & 0xffff;
-    var34.i = var32.i & 0xffff;
+    {
+       orc_union32 _src;
+       _src.i = var32.i;
+       var33.i = _src.x2[1];
+       var34.i = _src.x2[0];
+    }
     /* 2: storew */
     ptr0[i] = var33;
     /* 3: storew */
@@ -4432,8 +4455,12 @@ emulate_splitwb (OrcOpcodeExecutor *ex, int offset, int n)
     /* 0: loadw */
     var32 = ptr4[i];
     /* 1: splitwb */
-    var33 = (var32.i >> 8) & 0xff;
-    var34 = var32.i & 0xff;
+    {
+       orc_union16 _src;
+       _src.i = var32.i;
+       var33 = _src.x2[1];
+       var34 = _src.x2[0];
+    }
     /* 2: storeb */
     ptr0[i] = var33;
     /* 3: storeb */
index 86b2775..cabd536 100644 (file)
@@ -1011,8 +1011,12 @@ c_rule_splitql (OrcCompiler *p, void *user, OrcInstruction *insn)
   c_get_name_int (dest2, p, insn, insn->dest_args[1]);
   c_get_name_int (src, p, insn, insn->src_args[0]);
 
-  ORC_ASM_CODE(p,"    %s = (%s >> 32) & 0xffffffff;\n", dest1, src);
-  ORC_ASM_CODE(p,"    %s = %s & 0xffffffff;\n", dest2, src);
+  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", dest1);
+  ORC_ASM_CODE(p,"       %s = _src.x2[0];\n", dest2);
+  ORC_ASM_CODE(p, "    }\n");
 }
 
 static void
@@ -1024,8 +1028,12 @@ c_rule_splitlw (OrcCompiler *p, void *user, OrcInstruction *insn)
   c_get_name_int (dest2, p, insn, insn->dest_args[1]);
   c_get_name_int (src, p, insn, insn->src_args[0]);
 
-  ORC_ASM_CODE(p,"    %s = (%s >> 16) & 0xffff;\n", dest1, src);
-  ORC_ASM_CODE(p,"    %s = %s & 0xffff;\n", dest2, src);
+  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", dest1);
+  ORC_ASM_CODE(p,"       %s = _src.x2[0];\n", dest2);
+  ORC_ASM_CODE(p, "    }\n");
 }
 
 static void
@@ -1037,8 +1045,12 @@ c_rule_splitwb (OrcCompiler *p, void *user, OrcInstruction *insn)
   c_get_name_int (dest2, p, insn, insn->dest_args[1]);
   c_get_name_int (src, p, insn, insn->src_args[0]);
 
-  ORC_ASM_CODE(p,"    %s = (%s >> 8) & 0xff;\n", dest1, src);
-  ORC_ASM_CODE(p,"    %s = %s & 0xff;\n", dest2, src);
+  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", dest1);
+  ORC_ASM_CODE(p,"       %s = _src.x2[0];\n", dest2);
+  ORC_ASM_CODE(p, "    }\n");
 }
 
 static void
@@ -1300,6 +1312,58 @@ c_rule_swaplq (OrcCompiler *p, void *user, OrcInstruction *insn)
       dest, src, src);
 }
 
+static void
+c_rule_mergelq (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src1[40], src2[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src1, p, insn, insn->src_args[0]);
+  c_get_name_int (src2, p, insn, insn->src_args[1]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union64 _dest;\n");
+  ORC_ASM_CODE(p,"       _dest.x2[0] = %s;\n", src1);
+  ORC_ASM_CODE(p,"       _dest.x2[1] = %s;\n", src2);
+  ORC_ASM_CODE(p,"       %s = _dest.i;\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_mergewl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src1[40], src2[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src1, p, insn, insn->src_args[0]);
+  c_get_name_int (src2, p, insn, insn->src_args[1]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union32 _dest;\n");
+  ORC_ASM_CODE(p,"       _dest.x2[0] = %s;\n", src1);
+  ORC_ASM_CODE(p,"       _dest.x2[1] = %s;\n", src2);
+  ORC_ASM_CODE(p,"       %s = _dest.i;\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+static void
+c_rule_mergebw (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  char dest[40], src1[40], src2[40];
+
+  c_get_name_int (dest, p, insn, insn->dest_args[0]);
+  c_get_name_int (src1, p, insn, insn->src_args[0]);
+  c_get_name_int (src2, p, insn, insn->src_args[1]);
+
+  ORC_ASM_CODE(p, "    {\n");
+  ORC_ASM_CODE(p,"       orc_union16 _dest;\n");
+  ORC_ASM_CODE(p,"       _dest.x2[0] = %s;\n", src1);
+  ORC_ASM_CODE(p,"       _dest.x2[1] = %s;\n", src2);
+  ORC_ASM_CODE(p,"       %s = _dest.i;\n", dest);
+  ORC_ASM_CODE(p, "    }\n");
+}
+
+
 static OrcTarget c_target = {
   "c",
   FALSE,
@@ -1411,5 +1475,8 @@ orc_c_init (void)
   orc_rule_register (rule_set, "maxd", c_rule_maxd, NULL);
   orc_rule_register (rule_set, "swapwl", c_rule_swapwl, NULL);
   orc_rule_register (rule_set, "swaplq", c_rule_swaplq, NULL);
+  orc_rule_register (rule_set, "mergebw", c_rule_mergebw, NULL);
+  orc_rule_register (rule_set, "mergewl", c_rule_mergewl, NULL);
+  orc_rule_register (rule_set, "mergelq", c_rule_mergelq, NULL);
 }