Skip to content

Instantly share code, notes, and snippets.

@rjnw
Created October 17, 2016 04:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rjnw/104dd6f5feb7b99bbff744dc5fa707bb to your computer and use it in GitHub Desktop.
Save rjnw/104dd6f5feb7b99bbff744dc5fa707bb to your computer and use it in GitHub Desktop.
libjit generated jit-apply-rules
/* This file was auto-generated by "gen-apply" - DO NOT EDIT */
#ifndef _JIT_APPLY_RULES_H
#define _JIT_APPLY_RULES_H
#define JIT_APPLY_NUM_WORD_REGS 6
#define JIT_APPLY_NUM_FLOAT_REGS 0
#define JIT_APPLY_NUM_DOUBLE_REGS 0
#define JIT_APPLY_NUM_NFLOAT_REGS 0
#define JIT_APPLY_PASS_STACK_FLOAT_AS_DOUBLE 0
#define JIT_APPLY_PASS_STACK_FLOAT_AS_NFLOAT 1
#define JIT_APPLY_PASS_STACK_DOUBLE_AS_NFLOAT 1
#define JIT_APPLY_PASS_STACK_NFLOAT_AS_DOUBLE 0
#define JIT_APPLY_PASS_REG_FLOAT_AS_DOUBLE 0
#define JIT_APPLY_PASS_REG_FLOAT_AS_NFLOAT 0
#define JIT_APPLY_PASS_REG_DOUBLE_AS_NFLOAT 0
#define JIT_APPLY_PASS_REG_NFLOAT_AS_DOUBLE 0
#define JIT_APPLY_RETURN_FLOAT_AS_DOUBLE 0
#define JIT_APPLY_RETURN_FLOAT_AS_NFLOAT 0
#define JIT_APPLY_RETURN_DOUBLE_AS_NFLOAT 0
#define JIT_APPLY_RETURN_NFLOAT_AS_DOUBLE 0
#define JIT_APPLY_FLOATS_IN_WORD_REGS 0
#define JIT_APPLY_DOUBLES_IN_WORD_REGS 0
#define JIT_APPLY_NFLOATS_IN_WORD_REGS 0
#define JIT_APPLY_RETURN_FLOATS_AFTER 16
#define JIT_APPLY_RETURN_DOUBLES_AFTER 16
#define JIT_APPLY_RETURN_NFLOATS_AFTER 32
#define JIT_APPLY_VARARGS_ON_STACK 0
#define JIT_APPLY_STRUCT_RETURN_SPECIAL_REG 0
#define JIT_APPLY_STRUCT_REG_OVERLAPS_WORD_REG 0
#define JIT_APPLY_ALIGN_LONG_REGS 0
#define JIT_APPLY_ALIGN_LONG_STACK 0
#define JIT_APPLY_CAN_SPLIT_LONG 0
#define JIT_APPLY_STRUCT_RETURN_IN_REG_INIT \
{0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
#define JIT_APPLY_MAX_STRUCT_IN_REG 16
#define JIT_APPLY_MAX_APPLY_SIZE 56
#define JIT_APPLY_X86_FASTCALL 0
#define JIT_APPLY_PARENT_FRAME_OFFSET 0
#define JIT_APPLY_RETURN_ADDRESS_OFFSET 0
#define JIT_APPLY_BROKEN_FRAME_BUILTINS 1
#define JIT_APPLY_X86_POP_STRUCT_RETURN 0
#define JIT_APPLY_PAD_FLOAT_REGS 0
typedef union
{
jit_nint int_value;
jit_nuint uint_value;
jit_long long_value;
jit_ulong ulong_value;
struct { jit_ubyte pad[16]; float f_value; } float_value;
struct { jit_ubyte pad[16]; double f_value; } double_value;
struct { jit_ubyte pad[32]; jit_nfloat f_value; } nfloat_value;
jit_ubyte small_struct_value[16];
} jit_apply_return;
#define jit_apply_return_get_sbyte(result) \
((jit_sbyte)((result)->int_value))
#define jit_apply_return_get_ubyte(result) \
((jit_ubyte)((result)->int_value))
#define jit_apply_return_get_short(result) \
((jit_short)((result)->int_value))
#define jit_apply_return_get_ushort(result) \
((jit_ushort)((result)->int_value))
#define jit_apply_return_get_int(result) \
((jit_int)((result)->int_value))
#define jit_apply_return_get_uint(result) \
((jit_uint)((result)->uint_value))
#define jit_apply_return_get_nint(result) \
((jit_nint)((result)->int_value))
#define jit_apply_return_get_nuint(result) \
((jit_nuint)((result)->uint_value))
#define jit_apply_return_get_long(result) \
((jit_long)((result)->long_value))
#define jit_apply_return_get_ulong(result) \
((jit_ulong)((result)->ulong_value))
#define jit_apply_return_get_float32(result) \
((jit_float32)((result)->float_value.f_value))
#define jit_apply_return_get_float64(result) \
((jit_float64)((result)->double_value.f_value))
#define jit_apply_return_get_nfloat(result) \
((jit_nfloat)((result)->nfloat_value.f_value))
#define jit_apply_return_set_sbyte(result,value) \
(((result)->int_value) = ((jit_nint)(value)))
#define jit_apply_return_set_ubyte(result,value) \
(((result)->int_value) = ((jit_nint)(value)))
#define jit_apply_return_set_short(result,value) \
(((result)->int_value) = ((jit_nint)(value)))
#define jit_apply_return_set_ushort(result,value) \
(((result)->int_value) = ((jit_nint)(value)))
#define jit_apply_return_set_int(result,value) \
(((result)->int_value) = ((jit_nint)(value)))
#define jit_apply_return_set_uint(result,value) \
(((result)->uint_value) = ((jit_nuint)(value)))
#define jit_apply_return_set_nint(result,value) \
(((result)->int_value) = ((jit_nint)(value)))
#define jit_apply_return_set_nuint(result,value) \
(((result)->uint_value) = ((jit_nuint)(value)))
#define jit_apply_return_set_long(result,value) \
(((result)->long_value) = ((jit_long)(value)))
#define jit_apply_return_set_ulong(result,value) \
(((result)->ulong_value) = ((jit_ulong)(value)))
#define jit_apply_return_set_float32(result,value) \
(((result)->float_value.f_value) = ((float)(value)))
#define jit_apply_return_set_float64(result,value) \
(((result)->double_value.f_value) = ((double)(value)))
#define jit_apply_return_set_nfloat(result,value) \
(((result)->nfloat_value.f_value) = ((jit_nfloat)(value)))
typedef struct
{
unsigned char *stack_args;
jit_nint word_regs[6];
} jit_apply_struct;
typedef struct
{
jit_apply_struct *apply_args;
unsigned int stack_used;
unsigned int word_used;
void *struct_return;
} jit_apply_builder;
#include "jit-apply-func.h"
void
_jit_builtin_apply_add_struct(jit_apply_builder *builder, void *value, jit_type_t struct_type);
void
_jit_builtin_apply_get_struct(jit_apply_builder *builder, void *value, jit_type_t struct_type);
void
_jit_builtin_apply_get_struct_return(jit_apply_builder *builder, void *return_value, jit_apply_return *apply_return, jit_type_t struct_type);
#define jit_apply_builder_init(builder,type) \
do { \
(builder)->apply_args = (jit_apply_struct *)alloca(sizeof(jit_apply_struct)); \
jit_memset((builder)->apply_args, 0, 56); \
(builder)->apply_args->stack_args = (unsigned char *)alloca(jit_type_get_max_arg_size((type))); \
(builder)->stack_used = 0; \
(builder)->word_used = 0; \
(builder)->struct_return = 0; \
} while (0)
#define jit_apply_parser_init(builder,type,args) \
do { \
(builder)->apply_args = (jit_apply_struct *)(args); \
(builder)->stack_used = 0; \
(builder)->word_used = 0; \
(builder)->struct_return = 0; \
} while (0)
#define jit_apply_builder_add_word(builder,value) \
do { \
if((builder)->word_used < 6) \
{ \
(builder)->apply_args->word_regs[(builder)->word_used] = (jit_nint)(value); \
++((builder)->word_used); \
} \
else \
{ \
*((jit_nint*)((builder)->apply_args->stack_args + (builder)->stack_used)) = (jit_nint)(value); \
(builder)->stack_used += sizeof(jit_nint); \
} \
} while (0)
#define jit_apply_parser_get_word(builder,type,value) \
do { \
if((builder)->word_used < 6) \
{ \
(value) = (type)((builder)->apply_args->word_regs[(builder)->word_used]); \
++((builder)->word_used); \
} \
else \
{ \
(value) = (type)(*((jit_nint*)((builder)->apply_args->stack_args + (builder)->stack_used))); \
(builder)->stack_used += sizeof(jit_nint); \
} \
} while (0)
#define jit_apply_builder_align_regs(builder,num_words,align) \
do { \
if((align) > sizeof(jit_nint) && (num_words) > 1) \
{ \
if((6 - (builder)->word_used) < (num_words)) \
{ \
(builder)->word_used = 6; \
} \
} \
} while (0)
#define jit_apply_builder_align_stack(builder,num_words,align) \
do { ; } while (0)
#define jit_apply_builder_add_large_inner(builder,ptr,size,align) \
do { \
unsigned int __num_words = ((size) + sizeof(jit_nint) - 1) / sizeof(jit_nint); \
jit_apply_builder_align_regs((builder), __num_words, (align)); \
if((6 - (builder)->word_used) >= __num_words) \
{ \
jit_memcpy((builder)->apply_args->word_regs + (builder)->word_used, (ptr), (size)); \
(builder)->word_used += __num_words; \
} \
else if((builder)->word_used < 6) \
{ \
unsigned int __split = (6 - (builder)->word_used); \
jit_memcpy((builder)->apply_args->word_regs + (builder)->word_used, (ptr), __split * sizeof(jit_nint)); \
jit_memcpy((builder)->apply_args->stack_args, ((jit_nint *)(ptr)) + __split, (size) - __split * sizeof(jit_nint)); \
(builder)->word_used = 6; \
(builder)->stack_used = __num_words - __split; \
} \
else \
{ \
jit_apply_builder_align_stack((builder), __num_words, (align)); \
jit_memcpy((builder)->apply_args->stack_args + (builder)->stack_used, (ptr), (size)); \
(builder)->stack_used += __num_words * sizeof(jit_nint); \
(builder)->word_used = 6; \
} \
} while (0)
#define jit_apply_builder_add_large(builder,type,value) \
do { \
type __temp = (type)(value); \
jit_apply_builder_add_large_inner((builder), &__temp, sizeof(__temp), sizeof(jit_nint)); \
} while (0)
#define jit_apply_parser_get_large(builder,type,finaltype,value) \
do { \
type __temp; \
unsigned int __num_words = (sizeof(__temp) + sizeof(jit_nint) - 1) / sizeof(jit_nint); \
jit_apply_builder_align_regs((builder), __num_words, sizeof(type)); \
if((6 - (builder)->word_used) >= __num_words) \
{ \
jit_memcpy(&__temp, (builder)->apply_args->word_regs + (builder)->word_used, sizeof(__temp)); \
(builder)->word_used += __num_words; \
} \
else if((builder)->word_used < 6) \
{ \
unsigned int __split = (6 - (builder)->word_used); \
jit_memcpy(&__temp, (builder)->apply_args->word_regs + (builder)->word_used, __split * sizeof(jit_nint)); \
jit_memcpy(((jit_nint *)&__temp) + __split, (builder)->apply_args->stack_args, (__num_words - __split) * sizeof(jit_nint)); \
(builder)->word_used = 6; \
(builder)->stack_used = __num_words - __split; \
} \
else \
{ \
jit_apply_builder_align_stack((builder), __num_words, sizeof(type)); \
jit_memcpy(&__temp, (builder)->apply_args->stack_args + (builder)->stack_used, sizeof(__temp)); \
(builder)->stack_used += __num_words * sizeof(jit_nint); \
(builder)->word_used = 6; \
} \
(value) = (finaltype)(__temp); \
} while (0)
#define jit_apply_builder_add_large_stack(builder,type,value) \
do { \
type __temp = (type)(value); \
unsigned int __num_words = (sizeof(__temp) + sizeof(jit_nint) - 1) / sizeof(jit_nint); \
jit_apply_builder_align_stack((builder), __num_words, sizeof(type)); \
jit_memcpy((builder)->apply_args->stack_args + (builder)->stack_used, &__temp, sizeof(__temp)); \
(builder)->stack_used += __num_words * sizeof(jit_nint); \
} while (0)
#define jit_apply_parser_get_large_stack(builder,type,finaltype,value) \
do { \
type __temp; \
unsigned int __num_words = (sizeof(__temp) + sizeof(jit_nint) - 1) / sizeof(jit_nint); \
jit_apply_builder_align_stack((builder), __num_words, sizeof(type)); \
jit_memcpy(&__temp, (builder)->apply_args->stack_args + (builder)->stack_used, sizeof(__temp)); \
(builder)->stack_used += __num_words * sizeof(jit_nint); \
(value) = (finaltype)(__temp); \
} while (0)
#define jit_apply_builder_add_struct_return(builder,size,return_buf) \
do { \
unsigned int __struct_size = (unsigned int)(size); \
if(__struct_size >= 1 && __struct_size <= 64 && \
(_jit_apply_return_in_reg[(__struct_size - 1) / 8] \
& (1 << ((__struct_size - 1) % 8))) != 0) \
{ \
(builder)->struct_return = 0; \
} \
else \
{ \
if((return_buf) != 0) \
(builder)->struct_return = (void *)(return_buf); \
else \
(builder)->struct_return = alloca(__struct_size); \
jit_apply_builder_add_word((builder), (builder)->struct_return); \
} \
} while (0)
#define jit_apply_builder_get_struct_return(builder,size,return_buf,apply_return) \
do { \
if(!((builder)->struct_return)) \
{ \
jit_memcpy((return_buf), (apply_return), (size)); \
} \
else if((builder)->struct_return != (void *)(return_buf)) \
{ \
jit_memcpy((return_buf), (builder)->struct_return, (size)); \
} \
} while (0)
#define jit_apply_builder_start_varargs(builder) \
do { \
} while (0)
#define jit_apply_parser_start_varargs(builder) \
do { \
} while (0)
#define jit_apply_builder_add_sbyte(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_ubyte(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_short(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_ushort(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_int(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_uint(builder,value) \
jit_apply_builder_add_word((builder), (jit_nuint)(value));
#define jit_apply_builder_add_nint(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_nuint(builder,value) \
jit_apply_builder_add_word((builder), (jit_nuint)(value));
#define jit_apply_builder_add_long(builder,value) \
jit_apply_builder_add_word((builder), (value));
#define jit_apply_builder_add_ulong(builder,value) \
jit_apply_builder_add_word((builder), (jit_nuint)(value));
#define jit_apply_builder_add_float32(builder,value) \
jit_apply_builder_add_large_stack((builder), jit_nfloat, (value));
#define jit_apply_builder_add_float64(builder,value) \
jit_apply_builder_add_large_stack((builder), jit_nfloat, (value));
#define jit_apply_builder_add_nfloat(builder,value) \
jit_apply_builder_add_large_stack((builder), jit_nfloat, (value));
#define jit_apply_builder_add_struct(builder,value,size,align) \
do { \
unsigned int __size = (size); \
unsigned int __align; __align = (align); \
jit_apply_builder_add_large_inner((builder), (value), __size, __align); \
} while (0)
#define jit_apply_parser_get_sbyte(builder,value) \
jit_apply_parser_get_word((builder), jit_sbyte, (value));
#define jit_apply_parser_get_ubyte(builder,value) \
jit_apply_parser_get_word((builder), jit_ubyte, (value));
#define jit_apply_parser_get_short(builder,value) \
jit_apply_parser_get_word((builder), jit_short, (value));
#define jit_apply_parser_get_ushort(builder,value) \
jit_apply_parser_get_word((builder), jit_ushort, (value));
#define jit_apply_parser_get_int(builder,value) \
jit_apply_parser_get_word((builder), jit_int, (value));
#define jit_apply_parser_get_uint(builder,value) \
jit_apply_parser_get_word((builder), jit_uint, (value));
#define jit_apply_parser_get_nint(builder,value) \
jit_apply_parser_get_word((builder), jit_nint, (value));
#define jit_apply_parser_get_nuint(builder,value) \
jit_apply_parser_get_word((builder), jit_nuint, (value));
#define jit_apply_parser_get_long(builder,value) \
jit_apply_parser_get_word((builder), jit_long, (value));
#define jit_apply_parser_get_ulong(builder,value) \
jit_apply_parser_get_word((builder), jit_ulong, (value));
#define jit_apply_parser_get_float32(builder,value) \
jit_apply_parser_get_large_stack((builder), jit_nfloat, jit_float32, (value));
#define jit_apply_parser_get_float64(builder,value) \
jit_apply_parser_get_large_stack((builder), jit_nfloat, jit_float64, (value));
#define jit_apply_parser_get_nfloat(builder,value) \
jit_apply_parser_get_large_stack((builder), jit_nfloat, jit_nfloat, (value));
#define jit_apply_parser_get_struct_return(builder,value) \
jit_apply_parser_get_word((builder), void *, (value));
#define jit_apply_parser_get_struct(builder,size,align,value) \
do { \
unsigned int __size = (size); \
unsigned int __num_words = (__size + sizeof(jit_nint) - 1) / sizeof(jit_nint); \
if((6 - (builder)->word_used) >= __num_words) \
{ \
jit_memcpy((value), (builder)->apply_args->word_regs + (builder)->word_used, __size); \
(builder)->word_used += __num_words; \
} \
else \
{ \
jit_memcpy((value), (builder)->apply_args->stack_args + (builder)->stack_used, __size); \
(builder)->stack_used += __num_words * sizeof(jit_nint); \
(builder)->word_used = 6; \
} \
} while (0)
#endif /* _JIT_APPLY_RULES_H */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment