3
# DP: Support mixed-endian IEEE floating point, as found in the ARM old-ABI.
6
if [ $# -eq 3 -a "$2" = '-d' ]; then
9
elif [ $# -ne 1 ]; then
10
echo >&2 "usage: `basename $0`: -patch|-unpatch [-d <srcdir>]"
15
patch $pdir -f --no-backup-if-mismatch -p0 < $0
18
patch $pdir -f --no-backup-if-mismatch -R -p0 < $0
21
echo >&2 "usage: `basename $0`: -patch|-unpatch [-d <srcdir>]"
26
--- Objects/floatobject.c.orig 2006-05-25 10:53:30.000000000 -0500
27
+++ Objects/floatobject.c 2007-07-27 06:43:15.000000000 -0500
29
/* this is for the benefit of the pack/unpack routines below */
32
- unknown_format, ieee_big_endian_format, ieee_little_endian_format
33
+ unknown_format, ieee_big_endian_format, ieee_little_endian_format, ieee_mixed_endian_format
36
static float_format_type double_format, float_format;
38
return PyString_FromString("IEEE, little-endian");
39
case ieee_big_endian_format:
40
return PyString_FromString("IEEE, big-endian");
41
+ case ieee_mixed_endian_format:
42
+ return PyString_FromString("IEEE, mixed-endian");
44
Py_FatalError("insane float_format or double_format");
46
@@ -1073,11 +1075,14 @@
47
else if (strcmp(format, "IEEE, big-endian") == 0) {
48
f = ieee_big_endian_format;
50
+ else if (strcmp(format, "IEEE, mixed-endian") == 0) {
51
+ f = ieee_mixed_endian_format;
54
PyErr_SetString(PyExc_ValueError,
55
"__setformat__() argument 2 must be "
56
- "'unknown', 'IEEE, little-endian' or "
57
- "'IEEE, big-endian'");
58
+ "'unknown', 'IEEE, little-endian', "
59
+ "'IEEE, big-endian' or 'IEEE, mixed-endian'");
64
detected_double_format = ieee_big_endian_format;
65
else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
66
detected_double_format = ieee_little_endian_format;
67
+ else if (memcmp(&x, "\x01\xff\x3f\x43\x05\x04\x03\x02", 8) == 0)
68
+ detected_double_format = ieee_mixed_endian_format;
70
detected_double_format = unknown_format;
72
@@ -1565,8 +1572,19 @@
76
+ else if (double_format == ieee_mixed_endian_format) {
85
for (i = 0; i < 8; i++) {
86
+ if (double_format == ieee_mixed_endian_format && i == 4)
92
@@ -1739,6 +1757,27 @@
96
+ else if (double_format == ieee_mixed_endian_format) {
106
+ for (i = 0; i < 4; i++) {
111
+ for (i = 0; i < 4; i++) {
115
+ memcpy(&x, buf, 8);