c: Fix problems related to 64-bit constants
authorDavid Schleef <ds@schleef.org>
Thu, 16 Sep 2010 00:51:35 +0000 (17:51 -0700)
committerDavid Schleef <ds@schleef.org>
Thu, 16 Sep 2010 00:51:35 +0000 (17:51 -0700)
orc/orcexecutor.c
orc/orcprogram-c.c
testsuite/test.orc
tools/orcc.c

index e67dd3b..3773575 100644 (file)
@@ -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) {
index 7dfe6e4..855fa2f 100644 (file)
@@ -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);
index 57664f3..01d854d 100644 (file)
@@ -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
+
+
index 4600f34..84a44fa 100644 (file)
@@ -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]);
       }
     }
   }