* src/vm/jit/alpha/linux/md-os.c (md_replace_executionstate_read):
authorEdwin Steiner <edwin.steiner@gmx.net>
Wed, 20 Feb 2008 20:38:41 +0000 (21:38 +0100)
committerEdwin Steiner <edwin.steiner@gmx.net>
Wed, 20 Feb 2008 20:38:41 +0000 (21:38 +0100)
Do not use the assignment operator for the float registers, as the type
conversion messes up their values (they are not 'double' in the
context).
(md_replace_executionstate_write): Likewise.

src/vm/jit/alpha/linux/md-os.c

index 006c7009d8d645edc259905c3b1870bc1ee16ea1..b6c9cd8cb8f0282093ce14ebfb19131d8f0bc7de 100644 (file)
@@ -234,8 +234,11 @@ void md_replace_executionstate_read(executionstate_t *es, void *context)
                es->intregs[i] = _mc->sc_regs[i];
 
        /* read float registers */
-       for (i = 0; i < FLT_REG_CNT; i++)
-               es->fltregs[i] = _mc->sc_fpregs[i];
+       /* Do not use the assignment operator '=', as the type of
+        * the _mc->sc_fpregs[i] can cause invalid conversions. */
+
+       assert(sizeof(_mc->sc_fpregs) == sizeof(es->fltregs));
+       memcpy(&es->fltregs, &_mc->sc_fpregs, sizeof(_mc->sc_fpregs));
 }
 #endif
 
@@ -261,8 +264,11 @@ void md_replace_executionstate_write(executionstate_t *es, void *context)
                _mc->sc_regs[i] = es->intregs[i];
 
        /* write float registers */
-       for (i = 0; i < FLT_REG_CNT; i++)
-               _mc->sc_fpregs[i] = es->fltregs[i];
+       /* Do not use the assignment operator '=', as the type of
+        * the _mc->sc_fpregs[i] can cause invalid conversions. */
+
+       assert(sizeof(_mc->sc_fpregs) == sizeof(es->fltregs));
+       memcpy(&_mc->sc_fpregs, &es->fltregs, sizeof(_mc->sc_fpregs));
 
        /* write special registers */
        _mc->sc_pc           = (ptrint) es->pc;