executor: fix load of parameters smaller than 64 bits
authorWim Taymans <wtaymans@redhat.com>
Mon, 7 Sep 2015 13:30:36 +0000 (15:30 +0200)
committerWim Taymans <wtaymans@redhat.com>
Mon, 7 Sep 2015 13:33:17 +0000 (15:33 +0200)
Parameters less than 64 bits are passed in just one param register.
Fixes crashes on ldresnearb and friends in emulated code.

orc/orcexecutor.c

index 6fe296d..6306d34 100644 (file)
@@ -295,10 +295,15 @@ orc_executor_emulate (OrcExecutor *ex)
       } 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]], 8,
-            (orc_uint64)(orc_uint32)ex->params[insn->src_args[k]] |
-            (((orc_uint64)(orc_uint32)ex->params[insn->src_args[k] +
-             (ORC_VAR_T1 - ORC_VAR_P1)])<<32));
+        if (var->size == 8) {
+          load_constant (tmpspace[insn->src_args[k]], 8,
+              (orc_uint64)(orc_uint32)ex->params[insn->src_args[k]] |
+              (((orc_uint64)(orc_uint32)ex->params[insn->src_args[k] +
+               (ORC_VAR_T1 - ORC_VAR_P1)])<<32));
+        } else {
+          load_constant (tmpspace[insn->src_args[k]], 8,
+              ex->params[insn->src_args[k]]);
+        }
       } 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) {