Revision 8422b113 target-i386/op.c

b/target-i386/op.c
1952 1952

  
1953 1953
/* FPU operations */
1954 1954

  
1955
/* XXX: handle nans */
1956 1955
void OPPROTO op_fcom_ST0_FT0(void)
1957 1956
{
1958
    env->fpus &= (~0x4500);	/* (C3,C2,C0) <-- 000 */
1959
    if (ST0 < FT0)
1960
        env->fpus |= 0x100;	/* (C3,C2,C0) <-- 001 */
1961
    else if (ST0 == FT0)
1962
        env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */
1957
    int cc;
1958
    switch(floatx_compare(ST0, FT0, &env->fp_status)) {
1959
    case -1:
1960
        cc = 0x0100;
1961
        break;
1962
    case 0:
1963
        cc = 0x4000;
1964
        break;
1965
    case 1:
1966
        cc = 0x0000;
1967
        break;
1968
    case 2:
1969
    default:
1970
        cc = 0x4500;
1971
        break;
1972
    }
1973
    env->fpus = (env->fpus & ~0x4500) | cc;
1963 1974
    FORCE_RET();
1964 1975
}
1965 1976

  
1966
/* XXX: handle nans */
1967 1977
void OPPROTO op_fucom_ST0_FT0(void)
1968 1978
{
1969
    env->fpus &= (~0x4500);	/* (C3,C2,C0) <-- 000 */
1970
    if (ST0 < FT0)
1971
        env->fpus |= 0x100;	/* (C3,C2,C0) <-- 001 */
1972
    else if (ST0 == FT0)
1973
        env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */
1979
    int cc;
1980
    switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) {
1981
    case -1:
1982
        cc = 0x0100;
1983
        break;
1984
    case 0:
1985
        cc = 0x4000;
1986
        break;
1987
    case 1:
1988
        cc = 0x0000;
1989
        break;
1990
    case 2:
1991
    default:
1992
        cc = 0x4500;
1993
        break;
1994
    }
1995
    env->fpus = (env->fpus & ~0x4500) | cc;
1974 1996
    FORCE_RET();
1975 1997
}
1976 1998

  
1977
/* XXX: handle nans */
1978 1999
void OPPROTO op_fcomi_ST0_FT0(void)
1979 2000
{
1980
    int eflags;
2001
    int eflags, cc;
2002
    switch(floatx_compare(ST0, FT0, &env->fp_status)) {
2003
    case -1:
2004
        cc = CC_C;
2005
        break;
2006
    case 0:
2007
        cc = CC_Z;
2008
        break;
2009
    case 1:
2010
        cc = 0;
2011
        break;
2012
    case 2:
2013
    default:
2014
        cc = CC_Z | CC_P | CC_C;
2015
        break;
2016
    }
1981 2017
    eflags = cc_table[CC_OP].compute_all();
1982
    eflags &= ~(CC_Z | CC_P | CC_C);
1983
    if (ST0 < FT0)
1984
        eflags |= CC_C;
1985
    else if (ST0 == FT0)
1986
        eflags |= CC_Z;
2018
    eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc;
1987 2019
    CC_SRC = eflags;
1988 2020
    FORCE_RET();
1989 2021
}
1990 2022

  
1991
/* XXX: handle nans */
1992 2023
void OPPROTO op_fucomi_ST0_FT0(void)
1993 2024
{
1994
    int eflags;
2025
    int eflags, cc;
2026
    switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) {
2027
    case -1:
2028
        cc = CC_C;
2029
        break;
2030
    case 0:
2031
        cc = CC_Z;
2032
        break;
2033
    case 1:
2034
        cc = 0;
2035
        break;
2036
    case 2:
2037
    default:
2038
        cc = CC_Z | CC_P | CC_C;
2039
        break;
2040
    }
1995 2041
    eflags = cc_table[CC_OP].compute_all();
1996
    eflags &= ~(CC_Z | CC_P | CC_C);
1997
    if (ST0 < FT0)
1998
        eflags |= CC_C;
1999
    else if (ST0 == FT0)
2000
        eflags |= CC_Z;
2042
    eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc;
2001 2043
    CC_SRC = eflags;
2002 2044
    FORCE_RET();
2003 2045
}

Also available in: Unified diff