aarch64 improvements

* support C ABI for all return types
 * don't include __aeabi_uldivmod & co on aarch64 since
   it's 64 bit
This commit is contained in:
Andrew Kelley 2018-11-17 11:19:46 -05:00
parent 2a580278c4
commit 085d049a08
No known key found for this signature in database
GPG Key ID: 4E7CD66038A4D47C
4 changed files with 144 additions and 64 deletions

View File

@ -1059,7 +1059,7 @@ bool want_first_arg_sret(CodeGen *g, FnTypeId *fn_type_id) {
} }
zig_panic("TODO implement C ABI for x86_64 return types. type '%s'\nSee https://github.com/ziglang/zig/issues/1481", zig_panic("TODO implement C ABI for x86_64 return types. type '%s'\nSee https://github.com/ziglang/zig/issues/1481",
buf_ptr(&fn_type_id->return_type->name)); buf_ptr(&fn_type_id->return_type->name));
} else if (g->zig_target.arch.arch == ZigLLVM_arm || g->zig_target.arch.arch == ZigLLVM_armeb) { } else if (target_is_arm(&g->zig_target)) {
return type_size(g, fn_type_id->return_type) > 16; return type_size(g, fn_type_id->return_type) > 16;
} }
zig_panic("TODO implement C ABI for this architecture. See https://github.com/ziglang/zig/issues/1481"); zig_panic("TODO implement C ABI for this architecture. See https://github.com/ziglang/zig/issues/1481");

View File

@ -1011,3 +1011,64 @@ const char *arch_stack_pointer_register_name(const ArchType *arch) {
} }
zig_unreachable(); zig_unreachable();
} }
bool target_is_arm(const ZigTarget *target) {
switch (target->arch.arch) {
case ZigLLVM_UnknownArch:
zig_unreachable();
case ZigLLVM_aarch64:
case ZigLLVM_arm:
case ZigLLVM_thumb:
case ZigLLVM_aarch64_be:
case ZigLLVM_armeb:
case ZigLLVM_thumbeb:
return true;
case ZigLLVM_x86:
case ZigLLVM_x86_64:
case ZigLLVM_amdgcn:
case ZigLLVM_amdil:
case ZigLLVM_amdil64:
case ZigLLVM_arc:
case ZigLLVM_avr:
case ZigLLVM_bpfeb:
case ZigLLVM_bpfel:
case ZigLLVM_hexagon:
case ZigLLVM_lanai:
case ZigLLVM_hsail:
case ZigLLVM_hsail64:
case ZigLLVM_kalimba:
case ZigLLVM_le32:
case ZigLLVM_le64:
case ZigLLVM_mips:
case ZigLLVM_mips64:
case ZigLLVM_mips64el:
case ZigLLVM_mipsel:
case ZigLLVM_msp430:
case ZigLLVM_nios2:
case ZigLLVM_nvptx:
case ZigLLVM_nvptx64:
case ZigLLVM_ppc64le:
case ZigLLVM_r600:
case ZigLLVM_renderscript32:
case ZigLLVM_renderscript64:
case ZigLLVM_riscv32:
case ZigLLVM_riscv64:
case ZigLLVM_shave:
case ZigLLVM_sparc:
case ZigLLVM_sparcel:
case ZigLLVM_sparcv9:
case ZigLLVM_spir:
case ZigLLVM_spir64:
case ZigLLVM_systemz:
case ZigLLVM_tce:
case ZigLLVM_tcele:
case ZigLLVM_wasm32:
case ZigLLVM_wasm64:
case ZigLLVM_xcore:
case ZigLLVM_ppc:
case ZigLLVM_ppc64:
return false;
}
zig_unreachable();
}

View File

@ -121,4 +121,6 @@ Buf *target_dynamic_linker(ZigTarget *target);
bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target); bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target);
ZigLLVM_OSType get_llvm_os_type(Os os_type); ZigLLVM_OSType get_llvm_os_type(Os os_type);
bool target_is_arm(const ZigTarget *target);
#endif #endif

View File

@ -59,7 +59,7 @@ comptime {
@export("__umoddi3", __umoddi3, linkage); @export("__umoddi3", __umoddi3, linkage);
@export("__udivmodsi4", __udivmodsi4, linkage); @export("__udivmodsi4", __udivmodsi4, linkage);
if (isArmArch()) { if (is_arm_arch and !is_arm_64) {
@export("__aeabi_uldivmod", __aeabi_uldivmod, linkage); @export("__aeabi_uldivmod", __aeabi_uldivmod, linkage);
@export("__aeabi_uidivmod", __aeabi_uidivmod, linkage); @export("__aeabi_uidivmod", __aeabi_uidivmod, linkage);
@export("__aeabi_uidiv", __udivsi3, linkage); @export("__aeabi_uidiv", __udivsi3, linkage);
@ -149,68 +149,85 @@ extern fn __aeabi_uldivmod(numerator: u64, denominator: u64) AeabiUlDivModResult
return result; return result;
} }
fn isArmArch() bool { const is_arm_64 = switch (builtin.arch) {
return switch (builtin.arch) { builtin.Arch.aarch64v8_3a,
builtin.Arch.armv8_3a, builtin.Arch.aarch64v8_2a,
builtin.Arch.armv8_2a, builtin.Arch.aarch64v8_1a,
builtin.Arch.armv8_1a, builtin.Arch.aarch64v8,
builtin.Arch.armv8, builtin.Arch.aarch64v8r,
builtin.Arch.armv8r, builtin.Arch.aarch64v8m_baseline,
builtin.Arch.armv8m_baseline, builtin.Arch.aarch64v8m_mainline,
builtin.Arch.armv8m_mainline, builtin.Arch.aarch64_bev8_3a,
builtin.Arch.armv7, builtin.Arch.aarch64_bev8_2a,
builtin.Arch.armv7em, builtin.Arch.aarch64_bev8_1a,
builtin.Arch.armv7m, builtin.Arch.aarch64_bev8,
builtin.Arch.armv7s, builtin.Arch.aarch64_bev8r,
builtin.Arch.armv7k, builtin.Arch.aarch64_bev8m_baseline,
builtin.Arch.armv7ve, builtin.Arch.aarch64_bev8m_mainline,
builtin.Arch.armv6, => true,
builtin.Arch.armv6m, else => false,
builtin.Arch.armv6k, };
builtin.Arch.armv6t2,
builtin.Arch.armv5, const is_arm_arch = switch (builtin.arch) {
builtin.Arch.armv5te, builtin.Arch.armv8_3a,
builtin.Arch.armv4t, builtin.Arch.armv8_2a,
builtin.Arch.armebv8_3a, builtin.Arch.armv8_1a,
builtin.Arch.armebv8_2a, builtin.Arch.armv8,
builtin.Arch.armebv8_1a, builtin.Arch.armv8r,
builtin.Arch.armebv8, builtin.Arch.armv8m_baseline,
builtin.Arch.armebv8r, builtin.Arch.armv8m_mainline,
builtin.Arch.armebv8m_baseline, builtin.Arch.armv7,
builtin.Arch.armebv8m_mainline, builtin.Arch.armv7em,
builtin.Arch.armebv7, builtin.Arch.armv7m,
builtin.Arch.armebv7em, builtin.Arch.armv7s,
builtin.Arch.armebv7m, builtin.Arch.armv7k,
builtin.Arch.armebv7s, builtin.Arch.armv7ve,
builtin.Arch.armebv7k, builtin.Arch.armv6,
builtin.Arch.armebv7ve, builtin.Arch.armv6m,
builtin.Arch.armebv6, builtin.Arch.armv6k,
builtin.Arch.armebv6m, builtin.Arch.armv6t2,
builtin.Arch.armebv6k, builtin.Arch.armv5,
builtin.Arch.armebv6t2, builtin.Arch.armv5te,
builtin.Arch.armebv5, builtin.Arch.armv4t,
builtin.Arch.armebv5te, builtin.Arch.armebv8_3a,
builtin.Arch.armebv4t, builtin.Arch.armebv8_2a,
builtin.Arch.aarch64v8_3a, builtin.Arch.armebv8_1a,
builtin.Arch.aarch64v8_2a, builtin.Arch.armebv8,
builtin.Arch.aarch64v8_1a, builtin.Arch.armebv8r,
builtin.Arch.aarch64v8, builtin.Arch.armebv8m_baseline,
builtin.Arch.aarch64v8r, builtin.Arch.armebv8m_mainline,
builtin.Arch.aarch64v8m_baseline, builtin.Arch.armebv7,
builtin.Arch.aarch64v8m_mainline, builtin.Arch.armebv7em,
builtin.Arch.aarch64_bev8_3a, builtin.Arch.armebv7m,
builtin.Arch.aarch64_bev8_2a, builtin.Arch.armebv7s,
builtin.Arch.aarch64_bev8_1a, builtin.Arch.armebv7k,
builtin.Arch.aarch64_bev8, builtin.Arch.armebv7ve,
builtin.Arch.aarch64_bev8r, builtin.Arch.armebv6,
builtin.Arch.aarch64_bev8m_baseline, builtin.Arch.armebv6m,
builtin.Arch.aarch64_bev8m_mainline, builtin.Arch.armebv6k,
builtin.Arch.thumb, builtin.Arch.armebv6t2,
builtin.Arch.thumbeb, builtin.Arch.armebv5,
=> true, builtin.Arch.armebv5te,
else => false, builtin.Arch.armebv4t,
}; builtin.Arch.aarch64v8_3a,
} builtin.Arch.aarch64v8_2a,
builtin.Arch.aarch64v8_1a,
builtin.Arch.aarch64v8,
builtin.Arch.aarch64v8r,
builtin.Arch.aarch64v8m_baseline,
builtin.Arch.aarch64v8m_mainline,
builtin.Arch.aarch64_bev8_3a,
builtin.Arch.aarch64_bev8_2a,
builtin.Arch.aarch64_bev8_1a,
builtin.Arch.aarch64_bev8,
builtin.Arch.aarch64_bev8r,
builtin.Arch.aarch64_bev8m_baseline,
builtin.Arch.aarch64_bev8m_mainline,
builtin.Arch.thumb,
builtin.Arch.thumbeb,
=> true,
else => false,
};
nakedcc fn __aeabi_uidivmod() void { nakedcc fn __aeabi_uidivmod() void {
@setRuntimeSafety(false); @setRuntimeSafety(false);