Пример #1
0
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
    sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
    sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
{
    sljit_si saved_register_size;

    CHECK_ERROR();
    CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
    set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);

    /* Including the return address saved by the call instruction. */
    saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
    compiler->local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size;
    return SLJIT_SUCCESS;
}
Пример #2
0
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
    sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
    sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
{
    CHECK_ERROR();
    CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
    set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);

    compiler->args = args;

#if defined(__APPLE__)
    saveds = (2 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);
    compiler->local_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;
#else
    if (options & SLJIT_DOUBLE_ALIGNMENT)
        compiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + 7) & ~7);
    else
        compiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + 3) & ~3);
#endif
    return SLJIT_SUCCESS;
}
Пример #3
0
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
	sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{
	sljit_s32 saved_register_size;

	CHECK_ERROR();
	CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
	set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);

#ifdef _WIN64
	/* Two/four register slots for parameters plus space for xmm6 register if needed. */
	if (fscratches >= 6 || fsaveds >= 1)
		compiler->locals_offset = 6 * sizeof(sljit_sw);
	else
		compiler->locals_offset = ((scratches > 2) ? 4 : 2) * sizeof(sljit_sw);
#endif

	/* Including the return address saved by the call instruction. */
	saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
	compiler->local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size;
	return SLJIT_SUCCESS;
}