diff options
author | David Schleef <ds@schleef.org> | 2010-09-15 17:51:35 -0700 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2010-09-15 17:51:35 -0700 |
commit | 6fe216c6ab84e949e4910c1c09b2f59d6f2c610a (patch) | |
tree | 394bd5ba8a24f342697d9d8fea8667cd950ced5c | |
parent | d7ce7adbd21c84d8a4d233d3e6010bffe2f6efa3 (diff) |
c: Fix problems related to 64-bit constants
-rw-r--r-- | orc/orcexecutor.c | 10 | ||||
-rw-r--r-- | orc/orcprogram-c.c | 4 | ||||
-rw-r--r-- | testsuite/test.orc | 16 | ||||
-rw-r--r-- | tools/orcc.c | 19 |
4 files changed, 36 insertions, 13 deletions
diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c index e67dd3b..3773575 100644 --- a/orc/orcexecutor.c +++ b/orc/orcexecutor.c @@ -161,7 +161,7 @@ orc_executor_set_m (OrcExecutor *ex, int m) } static void -load_constant (void *data, int size, int value) +load_constant (void *data, int size, orc_uint64 value) { switch (size) { case 1: @@ -264,13 +264,15 @@ orc_executor_emulate (OrcExecutor *ex) if (var->vartype == ORC_VAR_TYPE_CONST) { opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]]; /* FIXME hack */ - load_constant (tmpspace[insn->src_args[k]], 4, + load_constant (tmpspace[insn->src_args[k]], 8, var->value.i); } else if (var->vartype == ORC_VAR_TYPE_PARAM) { opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]]; /* FIXME hack */ - load_constant (tmpspace[insn->src_args[k]], 4, - ex->params[insn->src_args[k]]); + load_constant (tmpspace[insn->src_args[k]], 8, + (orc_uint64)ex->params[insn->src_args[k]] | + (((orc_uint64)ex->params[insn->src_args[k] + + (ORC_VAR_T1 - ORC_VAR_P1)])<<32)); } else if (var->vartype == ORC_VAR_TYPE_TEMP) { opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]]; } else if (var->vartype == ORC_VAR_TYPE_SRC) { diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index 7dfe6e4..855fa2f 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -785,7 +785,7 @@ c_rule_loadpX (OrcCompiler *p, void *user, OrcInstruction *insn) } } else { if (size == 8) { - ORC_ASM_CODE(p," %s = (ex->params[%d] & 0xffffffff) | (((orc_uint64)(ex->params[%d + (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);\n", + ORC_ASM_CODE(p," %s = (ex->params[%d] & 0xffffffff) | ((orc_uint64)(ex->params[%d + (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);\n", dest, insn->src_args[0], insn->src_args[0]); } else { ORC_ASM_CODE(p," %s = ex->params[%d];\n", dest, @@ -799,7 +799,7 @@ c_rule_loadpX (OrcCompiler *p, void *user, OrcInstruction *insn) (int)p->vars[insn->src_args[0]].value.i, p->vars[insn->src_args[0]].value.f); } else { - ORC_ASM_CODE(p," %s = 0x%08x%08x; /* %gf */\n", dest, + ORC_ASM_CODE(p," %s = 0x%08x%08xULL; /* %gf */\n", dest, (orc_uint32)(((orc_uint64)p->vars[insn->src_args[0]].value.i)>>32), ((orc_uint32)p->vars[insn->src_args[0]].value.i), p->vars[insn->src_args[0]].value.f); diff --git a/testsuite/test.orc b/testsuite/test.orc index 57664f3..01d854d 100644 --- a/testsuite/test.orc +++ b/testsuite/test.orc @@ -2241,7 +2241,7 @@ copyl d1, c1 copyl d1, 2.0 -.init convert_fc32_to_int32_init + .function convert_fc32_to_int32 .source 8 src #one complex float .dest 4 dst #one complex short @@ -2252,3 +2252,17 @@ x2 convfl lscaled, scaled x2 convlw dst, lscaled +.function param64 +.dest 8 d +.param 8 s + +copyq d, s + + +.function const64 +.dest 8 d +.const 8 s 0x0123456789abcdef + +copyq d, s + + diff --git a/tools/orcc.c b/tools/orcc.c index 4600f34..84a44fa 100644 --- a/tools/orcc.c +++ b/tools/orcc.c @@ -843,7 +843,7 @@ output_program_generation (OrcProgram *p, FILE *output, int is_inline) var->size, (int)var->value.i, varnames[ORC_VAR_C1 + i]); } else if (var->size > 4) { REQUIRE(0,4,8,1); - fprintf(output, " orc_program_add_constant_int64 (p, %d, 0x%08x%08x, \"%s\");\n", + fprintf(output, " orc_program_add_constant_int64 (p, %d, 0x%08x%08xULL, \"%s\");\n", var->size, (orc_uint32)(((orc_uint64)var->value.i)>>32), (orc_uint32)(var->value.i), varnames[ORC_VAR_C1 + i]); } @@ -1008,12 +1008,19 @@ output_code_test (OrcProgram *p, FILE *output) for(i=0;i<8;i++){ var = &p->vars[ORC_VAR_C1 + i]; if (var->size) { - if (var->value.i != 0x80000000) { - fprintf(output, " orc_program_add_constant (p, %d, %u, \"%s\");\n", - var->size, (int)var->value.i, varnames[ORC_VAR_C1 + i]); + if (var->size < 8) { + if (var->value.i != 0x80000000) { + fprintf(output, " orc_program_add_constant (p, %d, 0x%08x, \"%s\");\n", + var->size, (int)var->value.i, varnames[ORC_VAR_C1 + i]); + } else { + fprintf(output, " orc_program_add_constant (p, %d, 0x%08x, \"%s\");\n", + var->size, (int)var->value.i, varnames[ORC_VAR_C1 + i]); + } } else { - fprintf(output, " orc_program_add_constant (p, %d, 0x%08x, \"%s\");\n", - var->size, (int)var->value.i, varnames[ORC_VAR_C1 + i]); + fprintf(output, " orc_program_add_constant_int64 (p, %d, " + "0x%08x%08xULL, \"%s\");\n", + var->size, (orc_uint32)(((orc_uint64)var->value.i)>>32), + (orc_uint32)(var->value.i), varnames[ORC_VAR_C1 + i]); } } } |