X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibjit.c;h=22266ba8290f1ddc268177dfe9deb5da3f607bd6;hp=52562affe239d8b79dd3201e5883700b61426079;hb=c0873cbbe9e5a83305adbc2bbd94aede5437f33d;hpb=53495ef4bd0321f7f92dd05eef8e01b90d7b415a diff --git a/src/libjit.c b/src/libjit.c index 52562af..22266ba 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; @@ -223,12 +231,12 @@ static inline jit_type_t psi_jit_decl_arg_type(struct psi_decl_arg *darg) } } -static inline jit_abi_t psi_jit_abi(const char *convention) +static inline jit_abi_t psi_jit_abi(zend_string *convention) { - if (!strcasecmp(convention, "stdcall")) { + if (zend_string_equals_literal(convention, "stdcall")) { return jit_abi_stdcall; } - if (!strcasecmp(convention, "fastcall")) { + if (zend_string_equals_literal(convention, "fastcall")) { return jit_abi_fastcall; } return jit_abi_cdecl; @@ -542,7 +550,7 @@ static zend_function_entry *psi_jit_compile(struct psi_context *C) continue; } - zf->fname = impl->func->name + (impl->func->name[0] == '\\'); + zf->fname = impl->func->name->val + (impl->func->name->val[0] == '\\'); zf->handler = ((struct psi_jit_impl_info *) impl->info)->closure; zf->num_args = psi_plist_count(impl->func->args); zf->arg_info = psi_internal_arginfo(impl); @@ -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,