From 840a8def4f7ba28a9c13f1585eefa0f218bc1677 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 25 Apr 2011 21:56:33 -0700 Subject: [PATCH] c: Fix endianness issues with c backend --- orc/opcodes.h | 3 -- orc/orcemulateopcodes.c | 45 ++++++++++++++++++++++------ orc/orcprogram-c.c | 79 +++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 109 insertions(+), 18 deletions(-) diff --git a/orc/opcodes.h b/orc/opcodes.h index b05cc6e..0a9cd67 100644 --- a/orc/opcodes.h +++ b/orc/opcodes.h @@ -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") diff --git a/orc/orcemulateopcodes.c b/orc/orcemulateopcodes.c index d384f32..d9ffb5e 100644 --- a/orc/orcemulateopcodes.c +++ b/orc/orcemulateopcodes.c @@ -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 */ diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index 86b2775..cabd536 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -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); } -- 2.7.4