Revision 4d40895f

b/helper-i386.c
981 981
#ifndef USE_X86LDOUBLE
982 982
void helper_fldt_ST0_A0(void)
983 983
{
984
    ST0 = helper_fldt((uint8_t *)A0);
984
    int new_fpstt;
985
    new_fpstt = (env->fpstt - 1) & 7;
986
    env->fpregs[new_fpstt] = helper_fldt((uint8_t *)A0);
987
    env->fpstt = new_fpstt;
988
    env->fptags[new_fpstt] = 0; /* validate stack entry */
985 989
}
986 990

  
987 991
void helper_fstt_ST0_A0(void)
......
996 1000

  
997 1001
void helper_fbld_ST0_A0(void)
998 1002
{
999
    uint8_t *seg;
1000
    CPU86_LDouble fpsrcop;
1001
    int m32i;
1003
    CPU86_LDouble tmp;
1004
    uint64_t val;
1002 1005
    unsigned int v;
1006
    int i;
1003 1007

  
1004
    /* in this code, seg/m32i will be used as temporary ptr/int */
1005
    seg = (uint8_t *)A0 + 8;
1006
    v = ldub(seg--);
1007
    /* XXX: raise exception */
1008
    if (v != 0)
1009
        return;
1010
    v = ldub(seg--);
1011
    /* XXX: raise exception */
1012
    if ((v & 0xf0) != 0)
1013
        return;
1014
    m32i = v;  /* <-- d14 */
1015
    v = ldub(seg--);
1016
    m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d13 */
1017
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d12 */
1018
    v = ldub(seg--);
1019
    m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d11 */
1020
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d10 */
1021
    v = ldub(seg--);
1022
    m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d9 */
1023
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d8 */
1024
    fpsrcop = ((CPU86_LDouble)m32i) * 100000000.0;
1025

  
1026
    v = ldub(seg--);
1027
    m32i = (v >> 4);  /* <-- d7 */
1028
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d6 */
1029
    v = ldub(seg--);
1030
    m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d5 */
1031
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d4 */
1032
    v = ldub(seg--);
1033
    m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d3 */
1034
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d2 */
1035
    v = ldub(seg);
1036
    m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d1 */
1037
    m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d0 */
1038
    fpsrcop += ((CPU86_LDouble)m32i);
1039
    if ( ldub(seg+9) & 0x80 )
1040
        fpsrcop = -fpsrcop;
1041
    ST0 = fpsrcop;
1008
    val = 0;
1009
    for(i = 8; i >= 0; i--) {
1010
        v = ldub((uint8_t *)A0 + i);
1011
        val = (val * 100) + ((v >> 4) * 10) + (v & 0xf);
1012
    }
1013
    tmp = val;
1014
    if (ldub((uint8_t *)A0 + 9) & 0x80)
1015
        tmp = -tmp;
1016
    fpush();
1017
    ST0 = tmp;
1042 1018
}
1043 1019

  
1044 1020
void helper_fbst_ST0_A0(void)
1045 1021
{
1046
    CPU86_LDouble fptemp;
1047
    CPU86_LDouble fpsrcop;
1022
    CPU86_LDouble tmp;
1048 1023
    int v;
1049 1024
    uint8_t *mem_ref, *mem_end;
1025
    int64_t val;
1050 1026

  
1051
    fpsrcop = rint(ST0);
1027
    tmp = rint(ST0);
1028
    val = (int64_t)tmp;
1052 1029
    mem_ref = (uint8_t *)A0;
1053
    mem_end = mem_ref + 8;
1054
    if ( fpsrcop < 0.0 ) {
1055
        stw(mem_end, 0x8000);
1056
        fpsrcop = -fpsrcop;
1030
    mem_end = mem_ref + 9;
1031
    if (val < 0) {
1032
        stb(mem_end, 0x80);
1033
        val = -val;
1057 1034
    } else {
1058
        stw(mem_end, 0x0000);
1035
        stb(mem_end, 0x00);
1059 1036
    }
1060 1037
    while (mem_ref < mem_end) {
1061
        if (fpsrcop == 0.0)
1038
        if (val == 0)
1062 1039
            break;
1063
        fptemp = floor(fpsrcop/10.0);
1064
        v = ((int)(fpsrcop - fptemp*10.0));
1065
        if  (fptemp == 0.0)  { 
1066
            stb(mem_ref++, v); 
1067
            break; 
1068
        }
1069
        fpsrcop = fptemp;
1070
        fptemp = floor(fpsrcop/10.0);
1071
        v |= (((int)(fpsrcop - fptemp*10.0)) << 4);
1040
        v = val % 100;
1041
        val = val / 100;
1042
        v = ((v / 10) << 4) | (v % 10);
1072 1043
        stb(mem_ref++, v);
1073
        fpsrcop = fptemp;
1074 1044
    }
1075 1045
    while (mem_ref < mem_end) {
1076 1046
        stb(mem_ref++, 0);

Also available in: Unified diff