X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibjit.c;h=eaf3b164e4bff18c762d799df84919416aabbb0d;hp=52562affe239d8b79dd3201e5883700b61426079;hb=10e51aad0515e80adeb96a47776a2d80e62a98bc;hpb=53495ef4bd0321f7f92dd05eef8e01b90d7b415a diff --git a/src/libjit.c b/src/libjit.c index 52562af..eaf3b16 100644 --- a/src/libjit.c +++ b/src/libjit.c @@ -32,6 +32,11 @@ #include +#if HAVE_INT128 +static jit_type_t jit_type_llong; +static jit_type_t jit_type_ullong; +#endif + static inline jit_type_t psi_jit_decl_arg_type(struct psi_decl_arg *darg); static inline jit_type_t psi_jit_token_type(token_t t) @@ -58,13 +63,16 @@ static inline jit_type_t psi_jit_token_type(token_t t) return jit_type_long; case PSI_T_UINT64: return jit_type_ulong; +#if HAVE_INT128 + case PSI_T_INT128: + return jit_type_llong; + case PSI_T_UINT128: + return jit_type_ullong; +#endif case PSI_T_BOOL: return jit_type_sys_bool; - case PSI_T_INT: case PSI_T_ENUM: return jit_type_sys_int; - case PSI_T_LONG: - return jit_type_sys_long; case PSI_T_FLOAT: return jit_type_sys_float; case PSI_T_DOUBLE: @@ -151,7 +159,7 @@ static unsigned psi_jit_struct_type_elements(struct psi_decl_struct *strct, maxalign = alignment; } - assert(jit_type_get_size(type) == darg->layout->len); + assert(jit_type_get_size(type) <= darg->layout->len); if ((padding = psi_offset_padding(darg->layout->pos - offset, alignment))) { if (nels + padding > argc) { argc += padding; @@ -646,7 +654,31 @@ static void *psi_jit_query(struct psi_context *C, enum psi_context_query q, return NULL; } +static ZEND_RESULT_CODE psi_jit_load(void) +{ +#if HAVE_INT128 + jit_type_t ll_fields[2], ull_fields[2]; + + ll_fields[0] = ll_fields[1] = jit_type_long; + jit_type_llong = jit_type_create_struct(ll_fields, 2, 1); + + ull_fields[0] = ull_fields[1] = jit_type_ulong; + jit_type_ullong = jit_type_create_struct(ull_fields, 2, 1); +#endif + return SUCCESS; +} + +static void psi_jit_free(void) +{ +#if HAVE_INT128 + jit_type_free(jit_type_llong); + jit_type_free(jit_type_ullong); +#endif +} + static struct psi_context_ops ops = { + psi_jit_load, + psi_jit_free, psi_jit_init, psi_jit_dtor, psi_jit_compile,