Пример #1
0
void ia32_cconv_init(void)
{
	be_cconv_add_regs(default_caller_saves, caller_saves_gp, ARRAY_SIZE(caller_saves_gp));
	be_cconv_add_regs(default_callee_saves, callee_saves, ARRAY_SIZE(callee_saves));
	if (!ia32_cg_config.use_softfloat) {
		be_cconv_add_regs(default_caller_saves, caller_saves_fp, ARRAY_SIZE(caller_saves_fp));
		rbitset_set(default_callee_saves, REG_FPCW);
	}
}
Пример #2
0
void sparc_cconv_init(void)
{
	be_cconv_add_regs(default_caller_saves, caller_saves, ARRAY_SIZE(caller_saves));

	rbitset_set_all(default_returns_twice_saves, N_SPARC_REGISTERS);
	be_cconv_rem_regs(default_returns_twice_saves, returns_twice_saved, ARRAY_SIZE(returns_twice_saved));
	be_cconv_rem_regs(default_returns_twice_saves, ignore_regs,         ARRAY_SIZE(ignore_regs));

	for (size_t i = 0; i < ARRAY_SIZE(float_result_reqs_double); i += 2) {
		arch_register_req_t *req = &float_result_reqs_double[i];
		*req = *float_result_regs[i]->single_req;
		req->width = 2;
	}
	for (size_t i = 0; i < ARRAY_SIZE(float_result_reqs_quad); i += 4) {
		arch_register_req_t *req = &float_result_reqs_quad[i];
		*req = *float_result_regs[i]->single_req;
		req->width = 4;
	}
}
Пример #3
0
void amd64_cconv_init(void)
{
	static const unsigned common_caller_saves[] = {
		REG_RAX,
		REG_RCX,
		REG_RDX,
		REG_R8,
		REG_R9,
		REG_R10,
		REG_R11,
		REG_XMM0,
		REG_XMM1,
		REG_XMM2,
		REG_XMM3,
		REG_XMM4,
		REG_XMM5,
		REG_XMM6,
		REG_XMM7,
		REG_XMM8,
		REG_XMM9,
		REG_XMM10,
		REG_XMM11,
		REG_XMM12,
		REG_XMM13,
		REG_XMM14,
		REG_XMM15,
		REG_ST0,
		REG_ST1,
		REG_ST2,
		REG_ST3,
		REG_ST4,
		REG_ST5,
		REG_ST6,
		REG_ST7,
	};
	static unsigned const x64_callee_saves[] = { REG_RSI, REG_RDI };

	be_cconv_add_regs(default_caller_saves, common_caller_saves, ARRAY_SIZE(common_caller_saves));
	if (!amd64_use_x64_abi)
		be_cconv_add_regs(default_caller_saves, x64_callee_saves, ARRAY_SIZE(x64_callee_saves));

	static const unsigned common_callee_saves[] = {
		REG_RBX,
		REG_RBP,
		REG_R12,
		REG_R13,
		REG_R14,
		REG_R15,
	};
	be_cconv_add_regs(default_callee_saves, common_callee_saves, ARRAY_SIZE(common_callee_saves));
	if (amd64_use_x64_abi)
		be_cconv_add_regs(default_callee_saves, x64_callee_saves, ARRAY_SIZE(x64_callee_saves));

	static const arch_register_t* const param_regs_list[] = {
		&amd64_registers[REG_RDI],
		&amd64_registers[REG_RSI],
		&amd64_registers[REG_RDX],
		&amd64_registers[REG_RCX],
		&amd64_registers[REG_R8],
		&amd64_registers[REG_R9],
	};
	param_regs   = amd64_use_x64_abi ? &param_regs_list[2] : param_regs_list;
	n_param_regs = ARRAY_SIZE(param_regs_list) - (amd64_use_x64_abi ? 2 : 0);

	n_float_param_regs = amd64_use_x64_abi ? 4 : ARRAY_SIZE(float_param_regs);
}