Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LRH.2.02.2001261416150.4450@key0.esi.com.au>
Date: Sun, 26 Jan 2020 14:28:37 +1100 (AEDT)
From: Damian McGuckin <damianm@....com.au>
To: musl@...ts.openwall.com
Subject: Re: Considering x86-64 fenv.s to C


M68K is below:

I looked inside 'fenv.c' inside the .../fenv/arm directory and noticed
it pulled in a default trivial 'fenv.c' from the directory above it.

In the absence of an alternative, I might exploit that but say

 	#include	"../fenv-trivial.c"

for that trivial case and

 	#include	"../fenv-generic.c"

for the new generic architecture.

Apologizing in advance for insuficient comments, but the hardware specific 
fenv.c for (say) the m68k is

/*
  * 68k ARCHITECTURE
  *
  * this CPU has distinct control and status registers
  */
#include	<fenv.h>

#if __HAVE_68881 || __mcffpu__

static inline unsigned int fe_get_sr_arch()
{
 	unsigned int v;

 	__asm__ __volatile__ ("fmove.l %%fpsr,%0" : "=dm"(v));
 	return v;
}

static inline void fe_set_sr_arch(unsigned v)
{
 	__asm__ __volatile__ ("fmove.l %0,%%fpsr" : : "dm"(v));
}

static inline unsigned int fe_get_cr_arch()
{
 	unsigned int v;

 	__asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm"(v));
 	return v;
}

static inline void fe_set_cr_arch(unsigned v)
{
 	__asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm"(v));
}

static inline unsigned int fe_get_ia_arch()
{
 	unsigned int address;

 	__asm__ __volatile__ ("fmove.l %%fpiar,%0" : "=dm"(address));
 	return address;
}

static inline void fe_set_ia_arch(unsigned int address)
{
 	__asm__ __volatile__ ("fmove.l %0,%%fpiar" : : "dm"(address));
}

/*
  * Expose the above generically
  */
#define	fe_get_sr	fe_get_sr_arch
#define	fe_set_sr	fe_set_sr_arch
#define	fe_get_cr	fe_get_cr_arch
#define	fe_set_cr	fe_set_cr_arch

/*
  * Handle the environment (which is a struct)
  */
#define	fe_get_e(e)\
 		((e)->__control_register = fe_get_cr_arch(),\
 		(e)->__status_register = fe_get_sr_arch(),\
 		(e)->__archnstruction_address = fe_get_ia_arch())
#define	fe_set_e(e)\
 		(fe_set_cr_arch((e)->__control_register),\
 		fe_set_sr_arch((e)->__status_register),\
 		fe_set_ia_arch((e)->__instruction_address))

/* the contents of the default fenv_t  */

#define	FE_DFL_ENV_DATA	{ 0, 0, 0 }

#include	"../fenv-generic.c"

#else

#include	"../fenv-trivial.c"

#endif


Regards - Damian

Pacific Engineering Systems International, 277-279 Broadway, Glebe NSW 2037
Ph:+61-2-8571-0847 .. Fx:+61-2-9692-9623 | unsolicited email not wanted here
Views & opinions here are mine and not those of any past or present employer

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.