mirror of https://github.com/ipxe/ipxe.git
[libgcc] Make __libgcc architecture-specific
parent
dc60c24146
commit
849e4b12d6
|
@ -6,6 +6,20 @@
|
||||||
/** Declare a function with standard calling conventions */
|
/** Declare a function with standard calling conventions */
|
||||||
#define __asmcall __attribute__ (( cdecl, regparm(0) ))
|
#define __asmcall __attribute__ (( cdecl, regparm(0) ))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a function with libgcc implicit linkage
|
||||||
|
*
|
||||||
|
* It seems as though gcc expects its implicit arithmetic functions to
|
||||||
|
* be cdecl, even if -mrtd is specified. This is somewhat
|
||||||
|
* inconsistent; for example, if -mregparm=3 is used then the implicit
|
||||||
|
* functions do become regparm(3).
|
||||||
|
*
|
||||||
|
* The implicit calls to memcpy() and memset() which gcc can generate
|
||||||
|
* do not seem to have this inconsistency; -mregparm and -mrtd affect
|
||||||
|
* them in the same way as any other function.
|
||||||
|
*/
|
||||||
|
#define __libgcc __attribute__ (( cdecl ))
|
||||||
|
|
||||||
#endif /* ASSEMBLY */
|
#endif /* ASSEMBLY */
|
||||||
|
|
||||||
#endif /* _BITS_COMPILER_H */
|
#endif /* _BITS_COMPILER_H */
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "libgcc.h"
|
#include "libgcc.h"
|
||||||
|
|
||||||
LIBGCC int64_t __divdi3(int64_t num, int64_t den)
|
__libgcc int64_t __divdi3(int64_t num, int64_t den)
|
||||||
{
|
{
|
||||||
int minus = 0;
|
int minus = 0;
|
||||||
int64_t v;
|
int64_t v;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "libgcc.h"
|
#include "libgcc.h"
|
||||||
|
|
||||||
LIBGCC int64_t __moddi3(int64_t num, int64_t den)
|
__libgcc int64_t __moddi3(int64_t num, int64_t den)
|
||||||
{
|
{
|
||||||
int minus = 0;
|
int minus = 0;
|
||||||
int64_t v;
|
int64_t v;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "libgcc.h"
|
#include "libgcc.h"
|
||||||
|
|
||||||
LIBGCC uint64_t __udivdi3(uint64_t num, uint64_t den)
|
__libgcc uint64_t __udivdi3(uint64_t num, uint64_t den)
|
||||||
{
|
{
|
||||||
return __udivmoddi4(num, den, NULL);
|
return __udivmoddi4(num, den, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "libgcc.h"
|
#include "libgcc.h"
|
||||||
|
|
||||||
LIBGCC uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p)
|
__libgcc uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p)
|
||||||
{
|
{
|
||||||
uint64_t quot = 0, qbit = 1;
|
uint64_t quot = 0, qbit = 1;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "libgcc.h"
|
#include "libgcc.h"
|
||||||
|
|
||||||
LIBGCC uint64_t __umoddi3(uint64_t num, uint64_t den)
|
__libgcc uint64_t __umoddi3(uint64_t num, uint64_t den)
|
||||||
{
|
{
|
||||||
uint64_t v;
|
uint64_t v;
|
||||||
|
|
||||||
|
|
|
@ -4,23 +4,11 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
/*
|
extern __libgcc uint64_t __udivmoddi4 ( uint64_t num, uint64_t den,
|
||||||
* It seems as though gcc expects its implicit arithmetic functions to
|
uint64_t *rem );
|
||||||
* be cdecl, even if -mrtd is specified. This is somewhat
|
extern __libgcc uint64_t __udivdi3 (uint64_t num, uint64_t den );
|
||||||
* inconsistent; for example, if -mregparm=3 is used then the implicit
|
extern __libgcc uint64_t __umoddi3 ( uint64_t num, uint64_t den );
|
||||||
* functions do become regparm(3).
|
extern __libgcc int64_t __divdi3 ( int64_t num, int64_t den );
|
||||||
*
|
extern __libgcc int64_t __moddi3 ( int64_t num, int64_t den );
|
||||||
* The implicit calls to memcpy() and memset() which gcc can generate
|
|
||||||
* do not seem to have this inconsistency; -mregparm and -mrtd affect
|
|
||||||
* them in the same way as any other function.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define LIBGCC __attribute__ (( cdecl ))
|
|
||||||
|
|
||||||
extern LIBGCC uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem);
|
|
||||||
extern LIBGCC uint64_t __udivdi3(uint64_t num, uint64_t den);
|
|
||||||
extern LIBGCC uint64_t __umoddi3(uint64_t num, uint64_t den);
|
|
||||||
extern LIBGCC int64_t __divdi3(int64_t num, int64_t den);
|
|
||||||
extern LIBGCC int64_t __moddi3(int64_t num, int64_t den);
|
|
||||||
|
|
||||||
#endif /* _LIBGCC_H */
|
#endif /* _LIBGCC_H */
|
||||||
|
|
Loading…
Reference in New Issue