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; }
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); }