Lines Matching full:cb
100 static float_struct_info struct_passed_as_elements(call_builder *cb, ffi_type *top) { in struct_passed_as_elements() argument
116 if (cb->used_float + num_floats > NARGREG || cb->used_integer + (2 - num_floats) > NARGREG) in struct_passed_as_elements()
132 static void marshal_atom(call_builder *cb, int type, void *data) { in marshal_atom() argument
153 asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(float *)data)); in marshal_atom()
158 asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(double *)data)); in marshal_atom()
164 if (cb->used_integer == NARGREG) { in marshal_atom()
165 *cb->used_stack++ = value; in marshal_atom()
167 cb->aregs->a[cb->used_integer++] = value; in marshal_atom()
171 static void unmarshal_atom(call_builder *cb, int type, void *data) { in unmarshal_atom() argument
176 asm("" : "=f"(*(float *)data) : "0"(cb->aregs->fa[cb->used_float++])); in unmarshal_atom()
181 asm("" : "=f"(*(double *)data) : "0"(cb->aregs->fa[cb->used_float++])); in unmarshal_atom()
186 if (cb->used_integer == NARGREG) { in unmarshal_atom()
187 value = *cb->used_stack++; in unmarshal_atom()
189 value = cb->aregs->a[cb->used_integer++]; in unmarshal_atom()
209 static void marshal(call_builder *cb, ffi_type *type, int var, void *data) { in marshal() argument
214 float_struct_info fsi = struct_passed_as_elements(cb, type); in marshal()
216 marshal_atom(cb, fsi.type1, data); in marshal()
218 marshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); in marshal()
223 if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { in marshal()
224 marshal_atom(cb, type->type, data); in marshal()
231 marshal_atom(cb, FFI_TYPE_POINTER, &data); in marshal()
233 marshal_atom(cb, type->type, data); in marshal()
241 cb->used_integer = FFI_ALIGN(cb->used_integer, 2); in marshal()
242 cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); in marshal()
247 marshal_atom(cb, FFI_TYPE_POINTER, realign); in marshal()
249 marshal_atom(cb, FFI_TYPE_POINTER, realign + 1); in marshal()
254 static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) { in unmarshal() argument
260 float_struct_info fsi = struct_passed_as_elements(cb, type); in unmarshal()
262 unmarshal_atom(cb, fsi.type1, data); in unmarshal()
264 unmarshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); in unmarshal()
269 if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { in unmarshal()
270 unmarshal_atom(cb, type->type, data); in unmarshal()
277 unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer); in unmarshal()
280 unmarshal_atom(cb, type->type, data); in unmarshal()
289 cb->used_integer = FFI_ALIGN(cb->used_integer, 2); in unmarshal()
290 cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); in unmarshal()
294 unmarshal_atom(cb, FFI_TYPE_POINTER, realign); in unmarshal()
296 unmarshal_atom(cb, FFI_TYPE_POINTER, realign + 1); in unmarshal()
302 static int passed_by_ref(call_builder *cb, ffi_type *type, int var) { in passed_by_ref() argument
305 float_struct_info fsi = struct_passed_as_elements(cb, type); in passed_by_ref()
359 call_builder cb; in ffi_call_int() local
360 cb.used_float = cb.used_integer = 0; in ffi_call_int()
361 cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes); in ffi_call_int()
362 cb.used_stack = (void*)alloc_base; in ffi_call_int()
364 int return_by_ref = passed_by_ref(&cb, cif->rtype, 0); in ffi_call_int()
366 marshal(&cb, &ffi_type_pointer, 0, &rvalue); in ffi_call_int()
370 marshal(&cb, cif->arg_types[i], i >= cif->riscv_nfixedargs, avalue[i]); in ffi_call_int()
372 ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure); in ffi_call_int()
374 cb.used_float = cb.used_integer = 0; in ffi_call_int()
376 unmarshal(&cb, cif->rtype, 0, rvalue); in ffi_call_int()
457 call_builder cb; in ffi_closure_inner() local
461 cb.aregs = aregs; in ffi_closure_inner()
462 cb.used_integer = cb.used_float = 0; in ffi_closure_inner()
463 cb.used_stack = stack; in ffi_closure_inner()
465 return_by_ref = passed_by_ref(&cb, cif->rtype, 0); in ffi_closure_inner()
467 unmarshal(&cb, &ffi_type_pointer, 0, &rvalue); in ffi_closure_inner()
472 avalue[i] = unmarshal(&cb, cif->arg_types[i], in ffi_closure_inner()
478 cb.used_integer = cb.used_float = 0; in ffi_closure_inner()
479 marshal(&cb, cif->rtype, 0, rvalue); in ffi_closure_inner()