Revision 417454b0 target-sparc/op_helper.c

b/target-sparc/op_helper.c
9 9
    cpu_loop_exit();
10 10
}   
11 11

  
12
void check_ieee_exceptions()
13
{
14
     T0 = get_float_exception_flags(&env->fp_status);
15
     if (T0)
16
     {
17
	/* Copy IEEE 754 flags into FSR */
18
	if (T0 & float_flag_invalid)
19
	    env->fsr |= FSR_NVC;
20
	if (T0 & float_flag_overflow)
21
	    env->fsr |= FSR_OFC;
22
	if (T0 & float_flag_underflow)
23
	    env->fsr |= FSR_UFC;
24
	if (T0 & float_flag_divbyzero)
25
	    env->fsr |= FSR_DZC;
26
	if (T0 & float_flag_inexact)
27
	    env->fsr |= FSR_NXC;
28

  
29
	if ((env->fsr & FSR_CEXC_MASK) & ((env->fsr & FSR_TEM_MASK) >> 23))
30
	{
31
	    /* Unmasked exception, generate a trap */
32
	    env->fsr |= FSR_FTT_IEEE_EXCP;
33
	    raise_exception(TT_FP_EXCP);
34
	}
35
	else
36
	{
37
	    /* Accumulate exceptions */
38
	    env->fsr |= (env->fsr & FSR_CEXC_MASK) << 5;
39
	}
40
     }
41
}
42

  
12 43
#ifdef USE_INT_TO_FLOAT_HELPERS
13 44
void do_fitos(void)
14 45
{
46
    set_float_exception_flags(0, &env->fp_status);
15 47
    FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status);
48
    check_ieee_exceptions();
16 49
}
17 50

  
18 51
void do_fitod(void)
......
35 68

  
36 69
void do_fsqrts(void)
37 70
{
71
    set_float_exception_flags(0, &env->fp_status);
38 72
    FT0 = float32_sqrt(FT1, &env->fp_status);
73
    check_ieee_exceptions();
39 74
}
40 75

  
41 76
void do_fsqrtd(void)
42 77
{
78
    set_float_exception_flags(0, &env->fp_status);
43 79
    DT0 = float64_sqrt(DT1, &env->fp_status);
80
    check_ieee_exceptions();
44 81
}
45 82

  
46
#define GEN_FCMP(name, size, reg1, reg2, FS)                            \
83
#define GEN_FCMP(name, size, reg1, reg2, FS, TRAP)                      \
47 84
    void glue(do_, name) (void)                                         \
48 85
    {                                                                   \
49 86
        env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);                     \
50 87
        switch (glue(size, _compare) (reg1, reg2, &env->fp_status)) {   \
51 88
        case float_relation_unordered:                                  \
52 89
            T0 = (FSR_FCC1 | FSR_FCC0) << FS;                           \
53
            if (env->fsr & FSR_NVM) {                                   \
90
            if ((env->fsr & FSR_NVM) || TRAP) {                         \
54 91
                env->fsr |= T0;                                         \
92
                env->fsr |= FSR_NVC;                                    \
93
                env->fsr |= FSR_FTT_IEEE_EXCP;                          \
55 94
                raise_exception(TT_FP_EXCP);                            \
56 95
            } else {                                                    \
57 96
                env->fsr |= FSR_NVA;                                    \
......
70 109
        env->fsr |= T0;                                                 \
71 110
    }
72 111

  
73
GEN_FCMP(fcmps, float32, FT0, FT1, 0);
74
GEN_FCMP(fcmpd, float64, DT0, DT1, 0);
112
GEN_FCMP(fcmps, float32, FT0, FT1, 0, 0);
113
GEN_FCMP(fcmpd, float64, DT0, DT1, 0, 0);
114

  
115
GEN_FCMP(fcmpes, float32, FT0, FT1, 0, 1);
116
GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1);
75 117

  
76 118
#ifdef TARGET_SPARC64
77
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22);
78
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22);
119
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0);
120
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0);
121

  
122
GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24, 0);
123
GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24, 0);
124

  
125
GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26, 0);
126
GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26, 0);
127

  
128
GEN_FCMP(fcmpes_fcc1, float32, FT0, FT1, 22, 1);
129
GEN_FCMP(fcmped_fcc1, float64, DT0, DT1, 22, 1);
79 130

  
80
GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24);
81
GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24);
131
GEN_FCMP(fcmpes_fcc2, float32, FT0, FT1, 24, 1);
132
GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1);
82 133

  
83
GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26);
84
GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26);
134
GEN_FCMP(fcmpes_fcc3, float32, FT0, FT1, 26, 1);
135
GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1);
85 136
#endif
86 137

  
87 138
#if defined(CONFIG_USER_ONLY) 

Also available in: Unified diff