Skip to content

Commit

Permalink
libm: Add support for the Meta architecture
Browse files Browse the repository at this point in the history
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
  • Loading branch information
Markos Chandras authored and aldot committed Mar 14, 2013
1 parent 22686a1 commit cf349fc
Show file tree
Hide file tree
Showing 18 changed files with 718 additions and 0 deletions.
77 changes: 77 additions & 0 deletions libc/sysdeps/linux/metag/bits/fenv.h
@@ -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
1 change: 1 addition & 0 deletions libc/sysdeps/linux/metag/metag.c
Expand Up @@ -8,3 +8,4 @@
#include <sys/syscall.h>

_syscall2(int,metag_setglobalbit,char *,addr,int,mask)
_syscall1(void,metag_set_fpu_flags,unsigned int,flags)
23 changes: 23 additions & 0 deletions libm/metag/Makefile.arch
@@ -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)
44 changes: 44 additions & 0 deletions libm/metag/fclrexcpt.c
@@ -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;
}
40 changes: 40 additions & 0 deletions libm/metag/fedisblxcpt.c
@@ -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;
}
40 changes: 40 additions & 0 deletions libm/metag/feenablxcpt.c
@@ -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;
}
36 changes: 36 additions & 0 deletions libm/metag/fegetenv.c
@@ -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;
}
31 changes: 31 additions & 0 deletions libm/metag/fegetexcept.c
@@ -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;
}
30 changes: 30 additions & 0 deletions libm/metag/fegetround.c
@@ -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;
}
41 changes: 41 additions & 0 deletions libm/metag/feholdexcpt.c
@@ -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;
}

0 comments on commit cf349fc

Please sign in to comment.