From: David Schleef Date: Wed, 27 Apr 2011 00:35:45 +0000 (-0700) Subject: c: Fix endianness issues with select opcodes X-Git-Tag: orc-0.4.14~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6ccb5fefd7f208b8ca0405d7820d3d14507bc02a;p=platform%2Fupstream%2Forc.git c: Fix endianness issues with select opcodes --- diff --git a/orc/opcodes.h b/orc/opcodes.h index 0a9cd67..df428a9 100644 --- a/orc/opcodes.h +++ b/orc/opcodes.h @@ -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)") diff --git a/orc/orcemulateopcodes.c b/orc/orcemulateopcodes.c index d9ffb5e..c467aa0 100644 --- a/orc/orcemulateopcodes.c +++ b/orc/orcemulateopcodes.c @@ -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; } diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index cabd536..dac0fe6 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -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);