Exemple #1
0
static void
ec_code_x64_prolog(ec_code_builder_t *builder)
{
    uint32_t i;

    ec_code_intel_op_push_r(builder, REG_BP);
    if (!builder->linear) {
        ec_code_intel_op_push_r(builder, REG_BX);
    }
    if (builder->regs > 11) {
        ec_code_error(builder, EINVAL);
        return;
    }
    for (i = 7; i < builder->regs; i++) {
        ec_code_intel_op_push_r(builder, ec_code_x64_regmap[i]);
    }

    builder->loop = builder->address;
}
Exemple #2
0
static void
ec_code_x64_epilog(ec_code_builder_t *builder)
{
    uint32_t i;

    ec_code_intel_op_add_i2r(builder, 8, REG_DX);
    ec_code_intel_op_add_i2r(builder, 8, REG_DI);
    ec_code_intel_op_test_i2r(builder, builder->width - 1, REG_DX);
    ec_code_intel_op_jne(builder, builder->loop);

    if (builder->regs > 11) {
        ec_code_error(builder, EINVAL);
    }
    for (i = builder->regs; i > 7; i--) {
        ec_code_intel_op_pop_r(builder, ec_code_x64_regmap[i - 1]);
    }
    if (!builder->linear) {
        ec_code_intel_op_pop_r(builder, REG_BX);
    }
    ec_code_intel_op_pop_r(builder, REG_BP);
    ec_code_intel_op_ret(builder, 0);
}