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); } }
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; } }
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 ? ¶m_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); }