summaryrefslogtreecommitdiff
path: root/soft-fp
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-05-21 02:15:01 +0000
committerUlrich Drepper <drepper@redhat.com>2002-05-21 02:15:01 +0000
commitcf29934141e8e27bd66c9a7fe4f4c217878365a7 (patch)
treeb1c57ba760d4820a1e1d9c76c3e9b48f627d60a3 /soft-fp
parent509bd8e35ad842944074e43cd2cc22381ee13f5b (diff)
Update.
2002-05-17 David S. Miller <davem@redhat.com> * sysdeps/unix/sysv/linux/sparc/fork.S: Define _internal aliases. 2002-05-16 David S. Miller <davem@redhat.com> * sysdeps/sparc/sparc32/dl-machine.h (LOAD_PIC_REG): Define. (elf_machine_dynamic): Use it to force PIC register to be loaded. (elf_machine_load_address): Likewise. * sysdeps/sparc/sparc64/dl-machine.h: Mirror sparc32 changes. * sysdeps/sparc/sparc64/strncmp.S: When second argument pointer is unaligned, do not forget to fully initialize %g1 magic value. * sysdeps/unix/sysv/linux/sparc/sys/procfs.h: Fix 64-bit elf register definitions and provide 32-bit variants of structures during 64-bit builds. * soft-fp/op-1.h (_FP_FRAC_CLEAR_OVERP_1): Define. * soft-fp/op-2.h (_FP_FRAC_CLEAR_OVERP_2): Define. * soft-fp/op-4.h (_FP_FRAC_CLEAR_OVERP_4): Define. * soft-fp/op-common.h (_FP_PACK_CANONICAL): After rounding, if _FP_FRAC_OVERP_X is set, use _FP_FRAC_CLEAR_OVERP_X to clear it. (_FP_FROM_INT): Perform right shifts on unsigned integer type. Do not clear implicit one bit here, it must be done post-rounding. Only pad to the left using left shift if value uses less than the available fractional bits.
Diffstat (limited to 'soft-fp')
-rw-r--r--soft-fp/op-1.h1
-rw-r--r--soft-fp/op-2.h1
-rw-r--r--soft-fp/op-4.h1
-rw-r--r--soft-fp/op-common.h21
4 files changed, 14 insertions, 10 deletions
diff --git a/soft-fp/op-1.h b/soft-fp/op-1.h
index f732143052..367ff2274b 100644
--- a/soft-fp/op-1.h
+++ b/soft-fp/op-1.h
@@ -55,6 +55,7 @@
#define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE)X##_f < 0)
#define _FP_FRAC_ZEROP_1(X) (X##_f == 0)
#define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_1(fs,X) (X##_f &= ~_FP_OVERFLOW_##fs)
#define _FP_FRAC_EQ_1(X, Y) (X##_f == Y##_f)
#define _FP_FRAC_GE_1(X, Y) (X##_f >= Y##_f)
#define _FP_FRAC_GT_1(X, Y) (X##_f > Y##_f)
diff --git a/soft-fp/op-2.h b/soft-fp/op-2.h
index 4a5add55cb..89da27fa4f 100644
--- a/soft-fp/op-2.h
+++ b/soft-fp/op-2.h
@@ -112,6 +112,7 @@
#define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE)X##_f1 < 0)
#define _FP_FRAC_ZEROP_2(X) ((X##_f1 | X##_f0) == 0)
#define _FP_FRAC_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
#define _FP_FRAC_EQ_2(X, Y) (X##_f1 == Y##_f1 && X##_f0 == Y##_f0)
#define _FP_FRAC_GT_2(X, Y) \
(X##_f1 > Y##_f1 || X##_f1 == Y##_f1 && X##_f0 > Y##_f0)
diff --git a/soft-fp/op-4.h b/soft-fp/op-4.h
index 82009000ec..5e3032e44a 100644
--- a/soft-fp/op-4.h
+++ b/soft-fp/op-4.h
@@ -129,6 +129,7 @@
#define _FP_FRAC_ZEROP_4(X) ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
#define _FP_FRAC_NEGP_4(X) ((_FP_WS_TYPE)X##_f[3] < 0)
#define _FP_FRAC_OVERP_4(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_4(fs,X) (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
#define _FP_FRAC_EQ_4(X,Y) \
(X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1] \
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index 012e76f0b7..232604e74a 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -89,11 +89,10 @@ do { \
_FP_ROUND(wc, X); \
if (_FP_FRAC_OVERP_##wc(fs, X)) \
{ \
- _FP_FRAC_SRL_##wc(X, (_FP_WORKBITS+1)); \
+ _FP_FRAC_CLEAR_OVERP_##wc(fs, X); \
X##_e++; \
} \
- else \
- _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
+ _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
if (X##_e >= _FP_EXPMAX_##fs) \
{ \
/* overflow */ \
@@ -682,25 +681,27 @@ do { \
do { \
if (r) \
{ \
+ unsigned rtype ur_; \
X##_c = FP_CLS_NORMAL; \
\
if ((X##_s = (r < 0))) \
r = -r; \
\
+ ur_ = (unsigned rtype) r; \
if (rsize <= _FP_W_TYPE_SIZE) \
- __FP_CLZ(X##_e, r); \
+ __FP_CLZ(X##_e, ur_); \
else \
- __FP_CLZ_2(X##_e, (_FP_W_TYPE)(r >> _FP_W_TYPE_SIZE), \
- (_FP_W_TYPE)r); \
+ __FP_CLZ_2(X##_e, (_FP_W_TYPE)(ur_ >> _FP_W_TYPE_SIZE), \
+ (_FP_W_TYPE)ur_); \
if (rsize < _FP_W_TYPE_SIZE) \
X##_e -= (_FP_W_TYPE_SIZE - rsize); \
X##_e = rsize - X##_e - 1; \
\
if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e) \
- __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs), rsize); \
- r &= ~((rtype)1 << X##_e); \
- _FP_FRAC_DISASSEMBLE_##wc(X, ((unsigned rtype)r), rsize); \
- _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1)); \
+ __FP_FRAC_SRS_1(ur_, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);\
+ _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize); \
+ if ((_FP_WFRACBITS_##fs - X##_e - 1) > 0) \
+ _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1)); \
} \
else \
{ \