mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
79 lines
1.8 KiB
C
79 lines
1.8 KiB
C
#include <stdbool.h>
|
|
|
|
#if defined(__i386__) && VEC_SIZE == 16
|
|
# define ENTRY(name) \
|
|
asm ( "\t.text\n" \
|
|
"\t.globl _start\n" \
|
|
"_start:\n" \
|
|
"\tpush %ebp\n" \
|
|
"\tmov %esp,%ebp\n" \
|
|
"\tand $~0xf,%esp\n" \
|
|
"\tcall " #name "\n" \
|
|
"\tleave\n" \
|
|
"\tret" )
|
|
#else
|
|
# define ENTRY(name) \
|
|
asm ( "\t.text\n" \
|
|
"\t.globl _start\n" \
|
|
"_start:\n" \
|
|
"\tjmp " #name )
|
|
#endif
|
|
|
|
typedef
|
|
#if defined(INT_SIZE)
|
|
# define ELEM_SIZE INT_SIZE
|
|
signed int
|
|
# if INT_SIZE == 1
|
|
# define MODE QI
|
|
# elif INT_SIZE == 2
|
|
# define MODE HI
|
|
# elif INT_SIZE == 4
|
|
# define MODE SI
|
|
# elif INT_SIZE == 8
|
|
# define MODE DI
|
|
# endif
|
|
#elif defined(UINT_SIZE)
|
|
# define ELEM_SIZE UINT_SIZE
|
|
unsigned int
|
|
# if UINT_SIZE == 1
|
|
# define MODE QI
|
|
# elif UINT_SIZE == 2
|
|
# define MODE HI
|
|
# elif UINT_SIZE == 4
|
|
# define MODE SI
|
|
# elif UINT_SIZE == 8
|
|
# define MODE DI
|
|
# endif
|
|
#elif defined(FLOAT_SIZE)
|
|
float
|
|
# define ELEM_SIZE FLOAT_SIZE
|
|
# if FLOAT_SIZE == 4
|
|
# define MODE SF
|
|
# elif FLOAT_SIZE == 8
|
|
# define MODE DF
|
|
# endif
|
|
#endif
|
|
#ifndef VEC_SIZE
|
|
# define VEC_SIZE ELEM_SIZE
|
|
#endif
|
|
__attribute__((mode(MODE), vector_size(VEC_SIZE))) vec_t;
|
|
|
|
#define ELEM_COUNT (VEC_SIZE / ELEM_SIZE)
|
|
|
|
typedef unsigned int __attribute__((mode(QI), vector_size(VEC_SIZE))) byte_vec_t;
|
|
|
|
/* Various builtins want plain char / int / long long vector types ... */
|
|
typedef char __attribute__((vector_size(VEC_SIZE))) vqi_t;
|
|
typedef short __attribute__((vector_size(VEC_SIZE))) vhi_t;
|
|
typedef int __attribute__((vector_size(VEC_SIZE))) vsi_t;
|
|
#if VEC_SIZE >= 8
|
|
typedef long long __attribute__((vector_size(VEC_SIZE))) vdi_t;
|
|
#endif
|
|
|
|
/*
|
|
* Suppress value propagation by the compiler, preventing unwanted
|
|
* optimization. This at once makes the compiler use memory operands
|
|
* more often, which for our purposes is the more interesting case.
|
|
*/
|
|
#define touch(var) asm volatile ( "" : "+m" (var) )
|