summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2010-09-15 17:51:35 -0700
committerDavid Schleef <ds@schleef.org>2010-09-15 17:51:35 -0700
commit6fe216c6ab84e949e4910c1c09b2f59d6f2c610a (patch)
tree394bd5ba8a24f342697d9d8fea8667cd950ced5c
parentd7ce7adbd21c84d8a4d233d3e6010bffe2f6efa3 (diff)
c: Fix problems related to 64-bit constants
-rw-r--r--orc/orcexecutor.c10
-rw-r--r--orc/orcprogram-c.c4
-rw-r--r--testsuite/test.orc16
-rw-r--r--tools/orcc.c19
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]);
}
}
}