yann@2437: http://yann.poupet.free.fr/ep93xx/ yann@2437: Add support for the Maverick Crunch FPU on Cirrus EP93XX processor series yann@2437: yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/bits/endian.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/bits/endian.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/bits/endian.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/bits/endian.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -12,7 +12,7 @@ yann@2437: /* FPA floating point units are always big-endian, irrespective of the yann@2437: CPU endianness. VFP floating point units use the same endianness yann@2437: as the rest of the system. */ yann@2437: -#ifdef __VFP_FP__ yann@2437: +#if defined __VFP_FP__ || defined __MAVERICK__ yann@2437: #define __FLOAT_WORD_ORDER __BYTE_ORDER yann@2437: #else yann@2437: #define __FLOAT_WORD_ORDER __BIG_ENDIAN yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/__longjmp.S glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/__longjmp.S yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/__longjmp.S 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/__longjmp.S 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -30,7 +30,33 @@ yann@2437: movs r0, r1 /* get the return value in place */ yann@2437: moveq r0, #1 /* can't let setjmp() return zero! */ yann@2437: yann@2437: +#ifdef __MAVERICK__ yann@2437: + cfldrd mvd4, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd5, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd6, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd7, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd8, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd9, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd10, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd11, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd12, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd13, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd14, [ip], #8 yann@2437: + nop yann@2437: + cfldrd mvd15, [ip], #8 yann@2437: +#else yann@2437: lfmfd f4, 4, [ip] ! /* load the floating point regs */ yann@2437: +#endif yann@2437: yann@2437: LOADREGS(ia, ip, {v1-v6, sl, fp, sp, pc}) yann@2437: END (__longjmp) yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/fenv.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/fenv.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/fenv.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/fenv.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -20,6 +20,45 @@ yann@2437: # error "Never use directly; include instead." yann@2437: #endif yann@2437: yann@2437: +#if defined(__MAVERICK__) yann@2437: + yann@2437: +/* Define bits representing exceptions in the FPU status word. */ yann@2437: +enum yann@2437: + { yann@2437: + FE_INVALID = 1, yann@2437: +#define FE_INVALID FE_INVALID yann@2437: + FE_OVERFLOW = 4, yann@2437: +#define FE_OVERFLOW FE_OVERFLOW yann@2437: + FE_UNDERFLOW = 8, yann@2437: +#define FE_UNDERFLOW FE_UNDERFLOW yann@2437: + FE_INEXACT = 16, yann@2437: +#define FE_INEXACT FE_INEXACT yann@2437: + }; yann@2437: + yann@2437: +/* Amount to shift by to convert an exception to a mask bit. */ yann@2437: +#define FE_EXCEPT_SHIFT 5 yann@2437: + yann@2437: +/* All supported exceptions. */ yann@2437: +#define FE_ALL_EXCEPT \ yann@2437: + (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) yann@2437: + yann@2437: +/* IEEE rounding modes. */ yann@2437: +enum yann@2437: + { yann@2437: + FE_TONEAREST = 0, yann@2437: +#define FE_TONEAREST FE_TONEAREST yann@2437: + FE_TOWARDZERO = 0x400, yann@2437: +#define FE_TOWARDZERO FE_TOWARDZERO yann@2437: + FE_DOWNWARD = 0x800, yann@2437: +#define FE_DOWNWARD FE_DOWNWARD yann@2437: + FE_UPWARD = 0xc00, yann@2437: +#define FE_UPWARD FE_UPWARD yann@2437: + }; yann@2437: + yann@2437: +#define FE_ROUND_MASK (FE_UPWARD) yann@2437: + yann@2437: +#else /* FPA */ yann@2437: + yann@2437: /* Define bits representing exceptions in the FPU status word. */ yann@2437: enum yann@2437: { yann@2437: @@ -44,6 +83,8 @@ yann@2437: modes exist, but you have to encode them in the actual instruction. */ yann@2437: #define FE_TONEAREST 0 yann@2437: yann@2437: +#endif yann@2437: + yann@2437: /* Type representing exception flags. */ yann@2437: typedef unsigned long int fexcept_t; yann@2437: yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/setjmp.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/setjmp.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/setjmp.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/bits/setjmp.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -28,7 +28,11 @@ yann@2437: #ifndef _ASM yann@2437: /* Jump buffer contains v1-v6, sl, fp, sp and pc. Other registers are not yann@2437: saved. */ yann@2437: +#ifdef __MAVERICK__ yann@2437: +typedef int __jmp_buf[34]; yann@2437: +#else yann@2437: typedef int __jmp_buf[22]; yann@2437: #endif yann@2437: +#endif yann@2437: yann@2437: #endif yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/fegetround.c glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/fegetround.c yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/fegetround.c 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/fegetround.c 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -18,9 +18,21 @@ yann@2437: 02111-1307 USA. */ yann@2437: yann@2437: #include yann@2437: +#include yann@2437: yann@2437: int yann@2437: fegetround (void) yann@2437: { yann@2437: +#if defined(__MAVERICK__) yann@2437: + yann@2437: + unsigned long temp; yann@2437: + yann@2437: + _FPU_GETCW (temp); yann@2437: + return temp & FE_ROUND_MASK; yann@2437: + yann@2437: +#else /* FPA */ yann@2437: + yann@2437: return FE_TONEAREST; /* Easy. :-) */ yann@2437: + yann@2437: +#endif yann@2437: } yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/fesetround.c glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/fesetround.c yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/fesetround.c 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/fesetround.c 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -18,12 +18,28 @@ yann@2437: 02111-1307 USA. */ yann@2437: yann@2437: #include yann@2437: +#include yann@2437: yann@2437: int yann@2437: fesetround (int round) yann@2437: { yann@2437: +#if defined(__MAVERICK__) yann@2437: + unsigned long temp; yann@2437: + yann@2437: + if (round & ~FE_ROUND_MASK) yann@2437: + return 1; yann@2437: + yann@2437: + _FPU_GETCW (temp); yann@2437: + temp = (temp & ~FE_ROUND_MASK) | round; yann@2437: + _FPU_SETCW (temp); yann@2437: + return 0; yann@2437: + yann@2437: +#else /* FPA */ yann@2437: + yann@2437: /* We only support FE_TONEAREST, so there is no need for any work. */ yann@2437: return (round == FE_TONEAREST)?0:1; yann@2437: + yann@2437: +#endif yann@2437: } yann@2437: yann@2437: libm_hidden_def (fesetround) yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/fpu_control.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/fpu_control.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/fpu_control.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/fpu_control.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -1,5 +1,6 @@ yann@2437: /* FPU control word definitions. ARM version. yann@2437: - Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc. yann@2437: + Copyright (C) 1996, 1997, 1998, 2000, 2005 yann@2437: + Free Software Foundation, Inc. yann@2437: This file is part of the GNU C Library. yann@2437: yann@2437: The GNU C Library is free software; you can redistribute it and/or yann@2437: @@ -20,6 +21,79 @@ yann@2437: #ifndef _FPU_CONTROL_H yann@2437: #define _FPU_CONTROL_H yann@2437: yann@2437: +#if defined(__MAVERICK__) yann@2437: + yann@2437: +/* DSPSC register: (from EP9312 User's Guide) yann@2437: + * yann@2437: + * bits 31..29 - DAID yann@2437: + * bits 28..26 - HVID yann@2437: + * bits 25..24 - RSVD yann@2437: + * bit 23 - ISAT yann@2437: + * bit 22 - UI yann@2437: + * bit 21 - INT yann@2437: + * bit 20 - AEXC yann@2437: + * bits 19..18 - SAT yann@2437: + * bits 17..16 - FCC yann@2437: + * bit 15 - V yann@2437: + * bit 14 - FWDEN yann@2437: + * bit 13 - Invalid yann@2437: + * bit 12 - Denorm yann@2437: + * bits 11..10 - RM yann@2437: + * bits 9..5 - IXE, UFE, OFE, RSVD, IOE yann@2437: + * bits 4..0 - IX, UF, OF, RSVD, IO yann@2437: + */ yann@2437: + yann@2437: +/* masking of interrupts */ yann@2437: +#define _FPU_MASK_IM (1 << 5) /* invalid operation */ yann@2437: +#define _FPU_MASK_ZM 0 /* divide by zero */ yann@2437: +#define _FPU_MASK_OM (1 << 7) /* overflow */ yann@2437: +#define _FPU_MASK_UM (1 << 8) /* underflow */ yann@2437: +#define _FPU_MASK_PM (1 << 9) /* inexact */ yann@2437: +#define _FPU_MASK_DM 0 /* denormalized operation */ yann@2437: + yann@2437: +#define _FPU_RESERVED 0xfffff000 /* These bits are reserved. */ yann@2437: + yann@2437: +#define _FPU_DEFAULT 0x00b00000 /* Default value. */ yann@2437: +#define _FPU_IEEE 0x00b003a0 /* Default + exceptions enabled. */ yann@2437: + yann@2437: +/* Type of the control word. */ yann@2437: +typedef unsigned int fpu_control_t; yann@2437: + yann@2437: +/* Macros for accessing the hardware control word. */ yann@2437: +#define _FPU_GETCW(cw) ({ \ yann@2437: + register int __t1, __t2; \ yann@2437: + \ yann@2437: + __asm__ volatile ( \ yann@2437: + "cfmvr64l %1, mvdx0\n\t" \ yann@2437: + "cfmvr64h %2, mvdx0\n\t" \ yann@2437: + "cfmv32sc mvdx0, dspsc\n\t" \ yann@2437: + "cfmvr64l %0, mvdx0\n\t" \ yann@2437: + "cfmv64lr mvdx0, %1\n\t" \ yann@2437: + "cfmv64hr mvdx0, %2" \ yann@2437: + : "=r" (cw), "=r" (__t1), "=r" (__t2) \ yann@2437: + ); \ yann@2437: +}) yann@2437: + yann@2437: +#define _FPU_SETCW(cw) ({ \ yann@2437: + register int __t0, __t1, __t2; \ yann@2437: + \ yann@2437: + __asm__ volatile ( \ yann@2437: + "cfmvr64l %1, mvdx0\n\t" \ yann@2437: + "cfmvr64h %2, mvdx0\n\t" \ yann@2437: + "cfmv64lr mvdx0, %0\n\t" \ yann@2437: + "cfmvsc32 dspsc, mvdx0\n\t" \ yann@2437: + "cfmv64lr mvdx0, %1\n\t" \ yann@2437: + "cfmv64hr mvdx0, %2" \ yann@2437: + : "=r" (__t0), "=r" (__t1), "=r" (__t2) \ yann@2437: + : "0" (cw) \ yann@2437: + ); \ yann@2437: +}) yann@2437: + yann@2437: +/* Default control word set at startup. */ yann@2437: +extern fpu_control_t __fpu_control; yann@2437: + yann@2437: +#else /* FPA */ yann@2437: + yann@2437: /* We have a slight terminology confusion here. On the ARM, the register yann@2437: * we're interested in is actually the FPU status word - the FPU control yann@2437: * word is something different (which is implementation-defined and only yann@2437: @@ -99,4 +173,6 @@ yann@2437: /* Default control word set at startup. */ yann@2437: extern fpu_control_t __fpu_control; yann@2437: yann@2437: +#endif yann@2437: + yann@2437: #endif /* _FPU_CONTROL_H */ yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/jmpbuf-offsets.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/jmpbuf-offsets.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/jmpbuf-offsets.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/jmpbuf-offsets.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -17,4 +17,8 @@ yann@2437: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA yann@2437: 02111-1307 USA. */ yann@2437: yann@2437: +#ifdef __MAVERICK__ yann@2437: +#define __JMP_BUF_SP 32 yann@2437: +#else yann@2437: #define __JMP_BUF_SP 20 yann@2437: +#endif yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/setjmp.S glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/setjmp.S yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/fpu/setjmp.S 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/fpu/setjmp.S 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -24,11 +24,41 @@ yann@2437: yann@2437: ENTRY (__sigsetjmp) yann@2437: /* Save registers */ yann@2437: +#ifdef __MAVERICK__ yann@2437: + cfstrd mvd4, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd5, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd6, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd7, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd8, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd9, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd10, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd11, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd12, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd13, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd14, [r0], #8 yann@2437: + nop yann@2437: + cfstrd mvd15, [r0], #8 yann@2437: +#else yann@2437: sfmea f4, 4, [r0]! yann@2437: +#endif yann@2437: stmia r0, {v1-v6, sl, fp, sp, lr} yann@2437: yann@2437: /* Restore pointer to jmp_buf */ yann@2437: +#ifdef __MAVERICK__ yann@2437: + sub r0, r0, #96 yann@2437: +#else yann@2437: sub r0, r0, #48 yann@2437: +#endif yann@2437: yann@2437: /* Make a tail call to __sigjmp_save; it takes the same args. */ yann@2437: B PLTJMP(C_SYMBOL_NAME(__sigjmp_save)) yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/gccframe.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/gccframe.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/gccframe.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/gccframe.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -17,6 +17,10 @@ yann@2437: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA yann@2437: 02111-1307 USA. */ yann@2437: yann@2437: +#ifdef __MAVERICK__ yann@2437: +#define FIRST_PSEUDO_REGISTER 43 yann@2437: +#else yann@2437: #define FIRST_PSEUDO_REGISTER 27 yann@2437: +#endif yann@2437: yann@2437: #include yann@2437: diff -durN glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/gmp-mparam.h glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/gmp-mparam.h yann@2437: --- glibc-2.12.1.orig/glibc-ports-2.12.1/sysdeps/arm/gmp-mparam.h 2009-05-16 10:36:20.000000000 +0200 yann@2437: +++ glibc-2.12.1/glibc-ports-2.12.1/sysdeps/arm/gmp-mparam.h 2009-11-13 00:51:22.000000000 +0100 yann@2437: @@ -29,7 +29,7 @@ yann@2437: #if defined(__ARMEB__) yann@2437: # define IEEE_DOUBLE_MIXED_ENDIAN 0 yann@2437: # define IEEE_DOUBLE_BIG_ENDIAN 1 yann@2437: -#elif defined(__VFP_FP__) yann@2437: +#elif defined(__VFP_FP__) || defined(__MAVERICK__) yann@2437: # define IEEE_DOUBLE_MIXED_ENDIAN 0 yann@2437: # define IEEE_DOUBLE_BIG_ENDIAN 0 yann@2437: #else yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/bits/endian.h glibc-2.12.1/ports/sysdeps/arm/bits/endian.h yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/__longjmp.S glibc-2.12.1/ports/sysdeps/arm/fpu/__longjmp.S yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/bits/fenv.h glibc-2.12.1/ports/sysdeps/arm/fpu/bits/fenv.h yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/bits/setjmp.h glibc-2.12.1/ports/sysdeps/arm/fpu/bits/setjmp.h yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/fegetround.c glibc-2.12.1/ports/sysdeps/arm/fpu/fegetround.c yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/fesetround.c glibc-2.12.1/ports/sysdeps/arm/fpu/fesetround.c yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/fpu_control.h glibc-2.12.1/ports/sysdeps/arm/fpu/fpu_control.h yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/jmpbuf-offsets.h glibc-2.12.1/ports/sysdeps/arm/fpu/jmpbuf-offsets.h yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/fpu/setjmp.S glibc-2.12.1/ports/sysdeps/arm/fpu/setjmp.S yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/gccframe.h glibc-2.12.1/ports/sysdeps/arm/gccframe.h yann@2437: diff -durN glibc-2.12.1.orig/ports/sysdeps/arm/gmp-mparam.h glibc-2.12.1/ports/sysdeps/arm/gmp-mparam.h