forked from skristiansson/uClibc-or1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
libm: Add support for the Meta architecture
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
- Loading branch information
Showing
18 changed files
with
718 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
/* Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#ifndef _FENV_H | ||
# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." | ||
#endif | ||
|
||
|
||
/* Define bits representing the exception. We use the bit positions | ||
of the appropriate bits in TXDEFR. */ | ||
enum | ||
{ | ||
FE_INEXACT = 0x1, | ||
#define FE_INEXACT FE_INEXACT | ||
FE_UNDERFLOW = 0x2, | ||
#define FE_UNDERFLOW FE_UNDERFLOW | ||
FE_OVERFLOW = 0x4, | ||
#define FE_OVERFLOW FE_OVERFLOW | ||
FE_DIVBYZERO = 0x8, | ||
#define FE_DIVBYZERO FE_DIVBYZERO | ||
FE_INVALID = 0x10, | ||
#define FE_INVALID FE_INVALID | ||
}; | ||
|
||
#define FE_ALL_EXCEPT \ | ||
(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) | ||
|
||
/* The Meta FPU supports all of the four defined rounding modes. We | ||
use the values of the rounding mode bits in TXMODE as the values | ||
for the appropriate macros. */ | ||
enum | ||
{ | ||
FE_TONEAREST = 0x0, | ||
#define FE_TONEAREST FE_TONEAREST | ||
FE_TOWARDZERO = 0x1, | ||
#define FE_TOWARDZERO FE_TOWARDZERO | ||
FE_UPWARD = 0x2, | ||
#define FE_UPWARD FE_UPWARD | ||
FE_DOWNWARD = 0x3 | ||
#define FE_DOWNWARD FE_DOWNWARD | ||
}; | ||
|
||
|
||
/* Type representing exception flags. */ | ||
typedef unsigned int fexcept_t; | ||
|
||
|
||
/* Type representing floating-point environment. */ | ||
typedef struct | ||
{ | ||
unsigned int txdefr; | ||
unsigned int txmode; | ||
} | ||
fenv_t; | ||
|
||
/* If the default argument is used we use this value. */ | ||
#define FE_DFL_ENV ((__const fenv_t *) -1) | ||
|
||
#ifdef __USE_GNU | ||
/* Floating-point environment where none of the exception is masked. */ | ||
# define FE_NOMASK_ENV ((__const fenv_t *) -2) | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# Makefile for uClibc | ||
# | ||
# Copyright (c) 2013 Imagination Technologies Ltd. | ||
# | ||
# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. | ||
# | ||
|
||
ifeq ($(UCLIBC_HAS_FENV),y) | ||
ifeq ($(CONFIG_META_2_1),y) | ||
libm_ARCH_SRC:=$(wildcard $(libm_ARCH_DIR)/*.c) | ||
libm_ARCH_OBJ:=$(patsubst $(libm_ARCH_DIR)/%.c,$(libm_ARCH_OUT)/%.o,$(libm_ARCH_SRC)) | ||
CFLAGS-libm += -Wa,-mfpu=metac21 | ||
endif | ||
endif | ||
|
||
libm_ARCH_OBJS:=$(libm_ARCH_OBJ) | ||
|
||
ifeq ($(DOPIC),y) | ||
libm-a-y+=$(libm_ARCH_OBJS:.o=.os) | ||
else | ||
libm-a-y+=$(libm_ARCH_OBJS) | ||
endif | ||
libm-so-y+=$(libm_ARCH_OBJS:.o=.os) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/* Clear given exceptions in current floating-point environment. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
#include <unistd.h> | ||
|
||
#include "internal.h" | ||
|
||
int | ||
feclearexcept (int excepts) | ||
{ | ||
unsigned int temp; | ||
|
||
/* Get the current exceptions. */ | ||
__asm__ ("MOV %0,TXDEFR" : "=r" (temp)); | ||
|
||
/* Mask out unsupported bits/exceptions. */ | ||
excepts &= FE_ALL_EXCEPT; | ||
|
||
excepts <<= 16; | ||
|
||
temp &= ~excepts; | ||
|
||
metag_set_fpu_flags(temp); | ||
|
||
/* Success. */ | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* Disable floating-point exceptions. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
#include <unistd.h> | ||
|
||
#include "internal.h" | ||
|
||
int | ||
fedisableexcept (int excepts) | ||
{ | ||
unsigned int old_exc; | ||
|
||
/* Get the current control word. */ | ||
__asm__ ("MOV %0,TXDEFR" : "=r" (old_exc)); | ||
|
||
old_exc &= FE_ALL_EXCEPT; | ||
|
||
excepts = old_exc & ~excepts; | ||
|
||
metag_set_fpu_flags(excepts); | ||
|
||
return old_exc; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* Enable floating-point exceptions. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
#include <unistd.h> | ||
|
||
#include "internal.h" | ||
|
||
int | ||
feenableexcept (int excepts) | ||
{ | ||
unsigned int old_exc; | ||
|
||
/* Get the current control word. */ | ||
__asm__ ("MOV %0,TXDEFR" : "=r" (old_exc)); | ||
|
||
old_exc &= FE_ALL_EXCEPT; | ||
|
||
excepts |= old_exc; | ||
|
||
metag_set_fpu_flags(excepts); | ||
|
||
return old_exc; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* Store current floating-point environment. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
|
||
int | ||
fegetenv (fenv_t *envp) | ||
{ | ||
unsigned int txdefr; | ||
unsigned int txmode; | ||
|
||
__asm__ ("MOV %0,TXDEFR" : "=r" (txdefr)); | ||
__asm__ ("MOV %0,TXMODE" : "=r" (txmode)); | ||
|
||
envp->txdefr = txdefr; | ||
envp->txmode = txmode; | ||
|
||
/* Success. */ | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* Get enabled floating-point exceptions. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
|
||
int | ||
fegetexcept (void) | ||
{ | ||
unsigned int exc; | ||
|
||
/* Get the current control word. */ | ||
__asm__ ("MOV %0,TXDEFR" : "=r" (exc)); | ||
|
||
return exc & FE_ALL_EXCEPT; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* Return current rounding direction. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
|
||
int | ||
fegetround (void) | ||
{ | ||
unsigned int txmode; | ||
|
||
__asm__ ("MOV %0,TXMODE" : "=r" (txmode)); | ||
|
||
return (txmode >> 16) & 0x3; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* Store current floating-point environment and clear exceptions. | ||
Copyright (C) 2013 Imagination Technologies Ltd. | ||
Free Software Foundation, Inc. | ||
This file is part of the GNU C Library. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <fenv.h> | ||
#include <unistd.h> | ||
|
||
#include "internal.h" | ||
|
||
int | ||
feholdexcept (fenv_t *envp) | ||
{ | ||
unsigned int txdefr; | ||
unsigned int txmode; | ||
|
||
__asm__ ("MOV %0,TXDEFR" : "=r" (txdefr)); | ||
__asm__ ("MOV %0,TXMODE" : "=r" (txmode)); | ||
|
||
envp->txdefr = txdefr; | ||
envp->txmode = txmode; | ||
|
||
metag_set_fpu_flags(0); | ||
|
||
return 0; | ||
} |
Oops, something went wrong.