On Thu, 10 Feb 2005 10:08:20 -0000, Charles Dobson <[EMAIL PROTECTED]> wrote:
> I am not sure if I should post this here or on bugzilla.

post your patch in bugzilla.

Thanks,

Alex

> 
> While trying to get a Silicon Motion SM722 video controller
> working with Solaris, I have discovered a problem with the
> emulation of the SHLD and SHRD (double precision shift)
> instructions of the x86 emulator.
> According to the Intel Pentium User Guide Vol 3, these
> instructions can shift upto 31 bits with both 16 and 32
> bit operands. The emulator code will only work with shifts
> of upto 15 bits for 16 bit operands.
> 
> The file is
> xc/extras/x86emu/src/x86emu/prim_ops.c
> 
> I have modified the two functions as below.
> I am not positive the flags are set correctly so
> would appreciated someone else to check these.
> 
> u16 shld_word (u16 d, u16 fill, u8 s)
> {
>     unsigned int cnt, res, cf;
> 
>     if (s < 32) {
>         cnt = s % 32;
>         if (cnt > 0) {
>             if (cnt > 15) {
>                 res = (unsigned int)fill << (cnt - 16);
>                 if (cnt == 16)
>                     cf = d & 0x1;
>                 else
>                     cf = res & 0x10000;
>             }
>             else {
>                 res = (d << cnt) | (fill >> (16-cnt));
>                 cf = d & (1 << (16 - cnt));
>             }
>             CONDITIONAL_SET_FLAG(cf, F_CF);
>             CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
>             CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
>             CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
>         } else {
>             res = d;
>         }
>         if (cnt == 1) {
>             CONDITIONAL_SET_FLAG((((res & 0x8000) == 0x8000) ^
>                                   (ACCESS_FLAG(F_CF) != 0)), F_OF);
>         } else {
>             CLEAR_FLAG(F_OF);
>         }
>     } else {
>         res = 0;
>         CONDITIONAL_SET_FLAG((d << (s-1)) & 0x8000, F_CF);
>         CLEAR_FLAG(F_OF);
>         CLEAR_FLAG(F_SF);
>         SET_FLAG(F_PF);
>         SET_FLAG(F_ZF);
>     }
>     return (u16)res;
> }
> 
> u16 shrd_word (u16 d, u16 fill, u8 s)
> {
>     unsigned int cnt, res, cf;
> 
>     if (s < 32) {
>         cnt = s % 32;
>         if (cnt > 0) {
>             if (cnt > 15) {
>                 if (cnt == 16)
>                     cf = d & 0x8000;
>                 else
>                     cf = fill & (1 << (cnt - 17));
>                 res = fill >> (cnt - 16);
>             } else {
>                 cf = d & (1 << (cnt - 1));
>                 res = (d >> cnt) | (fill << (16 - cnt));
>             }
>             CONDITIONAL_SET_FLAG(cf, F_CF);
>             CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
>             CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
>             CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
>         } else {
>             res = d;
>         }
> 
>         if (cnt == 1) {
>             CONDITIONAL_SET_FLAG(XOR2(res >> 14), F_OF);
>         } else {
>             CLEAR_FLAG(F_OF);
>         }
>     } else {
>         res = 0;
>         CLEAR_FLAG(F_CF);
>         CLEAR_FLAG(F_OF);
>         SET_FLAG(F_ZF);
>         CLEAR_FLAG(F_SF);
>         CLEAR_FLAG(F_PF);
>     }
>     return (u16)res;
> }
> 
> Charles Dobson.
> Concurrent Technologies Plc.
> 
> _______________________________________________
> Devel mailing list
> [email protected]
> http://XFree86.Org/mailman/listinfo/devel
>
_______________________________________________
Devel mailing list
[email protected]
http://XFree86.Org/mailman/listinfo/devel

Reply via email to