128-bit float support for user mode

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3740 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
blueswir1 2007-11-25 18:40:20 +00:00
parent 5cc9878d3d
commit 1f58732916
11 changed files with 676 additions and 17 deletions

View file

@ -97,6 +97,13 @@ void do_fabsd(void)
{
DT0 = float64_abs(DT1);
}
#if defined(CONFIG_USER_ONLY)
void do_fabsq(void)
{
QT0 = float128_abs(QT1);
}
#endif
#endif
void do_fsqrts(void)
@ -113,6 +120,15 @@ void do_fsqrtd(void)
check_ieee_exceptions();
}
#if defined(CONFIG_USER_ONLY)
void do_fsqrtq(void)
{
set_float_exception_flags(0, &env->fp_status);
QT0 = float128_sqrt(QT1, &env->fp_status);
check_ieee_exceptions();
}
#endif
#define GEN_FCMP(name, size, reg1, reg2, FS, TRAP) \
void glue(do_, name) (void) \
{ \
@ -148,6 +164,11 @@ GEN_FCMP(fcmpd, float64, DT0, DT1, 0, 0);
GEN_FCMP(fcmpes, float32, FT0, FT1, 0, 1);
GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1);
#ifdef CONFIG_USER_ONLY
GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0);
GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1);
#endif
#ifdef TARGET_SPARC64
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0);
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0);
@ -166,6 +187,14 @@ GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1);
GEN_FCMP(fcmpes_fcc3, float32, FT0, FT1, 26, 1);
GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1);
#ifdef CONFIG_USER_ONLY
GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0);
GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0);
GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0);
GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1);
GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1);
GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1);
#endif
#endif
#ifndef TARGET_SPARC64
@ -1374,6 +1403,11 @@ void helper_ldf_asi(int asi, int size, int rd)
case 8:
*((int64_t *)&DT0) = T1;
break;
#if defined(CONFIG_USER_ONLY)
case 16:
// XXX
break;
#endif
}
T1 = tmp_T1;
}
@ -1417,6 +1451,11 @@ void helper_stf_asi(int asi, int size, int rd)
case 8:
T1 = *((int64_t *)&DT0);
break;
#if defined(CONFIG_USER_ONLY)
case 16:
// XXX
break;
#endif
}
helper_st_asi(asi, size);
T1 = tmp_T1;