]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
extend small int values returned from native calls
authorAleksey Demakov <ademakov@gmail.com>
Wed, 10 Dec 2008 20:44:24 +0000 (20:44 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Wed, 10 Dec 2008 20:44:24 +0000 (20:44 +0000)
ChangeLog
jit/jit-insn.c

index 3698984c278fa7696202949e4c2366b111789dca..ca51844ff79a0c6e0de10e48763f0842a7efb65a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-11  Juan Jesus Garcia de Soria  <juanj.g_soria@grupobbva.com>
+
+       * jit/jit-insn.c (jit_insn_call_native): extend small int return
+       values to full ints as native calls sometimes return garbage in MSB
+       of the return rigister.
+
 2008-12-11  Aleksey Demakov  <ademakov@gmail.com>
 
        * configure.ac: bump version to 0.1.3
index 4bdc43496755a2a30c59e7616e0a2ac9de58e550..40c7df0bb743a8d22d460df78a4657e280093406 100644 (file)
@@ -5898,6 +5898,7 @@ jit_value_t jit_insn_call_native
        jit_value_t *new_args;
        jit_value_t return_value;
        jit_insn_t insn;
+       jit_type_t return_type;
 
        /* Bail out if there is something wrong with the parameters */
        if(!_jit_function_ensure_builder(func) || !native_func || !signature)
@@ -6014,6 +6015,32 @@ jit_value_t jit_insn_call_native
                }
        }
 
+       /* Make sure that returned byte / short values get zero / sign extended */
+       return_type = jit_type_normalize(return_value->type);
+       switch(return_type->kind)
+       {
+       case JIT_TYPE_SBYTE:
+               /* Force sbyte sign extension to int */
+               return_value = apply_unary_conversion(func, JIT_OP_TRUNC_SBYTE,
+                                                     return_value, return_type);
+               break;
+       case JIT_TYPE_UBYTE:
+               /* Force ubyte zero extension to uint */
+               return_value = apply_unary_conversion(func, JIT_OP_TRUNC_UBYTE,
+                                                     return_value, return_type);
+               break;
+       case JIT_TYPE_SHORT:
+               /* Force short sign extension to int */
+               return_value = apply_unary_conversion(func, JIT_OP_TRUNC_SHORT,
+                                                     return_value, return_type);
+               break;
+       case JIT_TYPE_USHORT:
+               /* Force ushort zero extension to uint */
+               return_value = apply_unary_conversion(func, JIT_OP_TRUNC_USHORT,
+                                                     return_value, return_type);
+               break;
+       }
+
        /* Restore exception frame information after the call */
        if(!restore_eh_frame_after_call(func, flags))
        {