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