authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-17 11:19:46-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-17 11:21:00-05:00
log085d049a088af20c1eeeab2b8ebeb7dc6af7b07d
tree9b3b796804f18f49be4783fb036e452d54bfd293
parent2a580278c4db3a60766bb904f42486f0f1872c72
signature Commit is signed but in an unrecognized format.

aarch64 improvements

* support C ABI for all return types * don't include __aeabi_uldivmod & co on aarch64 since it's 64 bit

4 files changed, 144 insertions(+), 64 deletions(-)

src/analyze.cpp+1-1
......@@ -1059,7 +1059,7 @@ bool want_first_arg_sret(CodeGen *g, FnTypeId *fn_type_id) {
10591059 }
10601060 zig_panic("TODO implement C ABI for x86_64 return types. type '%s'\nSee https://github.com/ziglang/zig/issues/1481",
10611061 buf_ptr(&fn_type_id->return_type->name));
1062 } else if (g->zig_target.arch.arch == ZigLLVM_arm || g->zig_target.arch.arch == ZigLLVM_armeb) {
1062 } else if (target_is_arm(&g->zig_target)) {
10631063 return type_size(g, fn_type_id->return_type) > 16;
10641064 }
10651065 zig_panic("TODO implement C ABI for this architecture. See https://github.com/ziglang/zig/issues/1481");
src/target.cpp+61
......@@ -1011,3 +1011,64 @@ const char *arch_stack_pointer_register_name(const ArchType *arch) {
10111011 }
10121012 zig_unreachable();
10131013}
1014
1015bool target_is_arm(const ZigTarget *target) {
1016 switch (target->arch.arch) {
1017 case ZigLLVM_UnknownArch:
1018 zig_unreachable();
1019 case ZigLLVM_aarch64:
1020 case ZigLLVM_arm:
1021 case ZigLLVM_thumb:
1022 case ZigLLVM_aarch64_be:
1023 case ZigLLVM_armeb:
1024 case ZigLLVM_thumbeb:
1025 return true;
1026
1027 case ZigLLVM_x86:
1028 case ZigLLVM_x86_64:
1029 case ZigLLVM_amdgcn:
1030 case ZigLLVM_amdil:
1031 case ZigLLVM_amdil64:
1032 case ZigLLVM_arc:
1033 case ZigLLVM_avr:
1034 case ZigLLVM_bpfeb:
1035 case ZigLLVM_bpfel:
1036 case ZigLLVM_hexagon:
1037 case ZigLLVM_lanai:
1038 case ZigLLVM_hsail:
1039 case ZigLLVM_hsail64:
1040 case ZigLLVM_kalimba:
1041 case ZigLLVM_le32:
1042 case ZigLLVM_le64:
1043 case ZigLLVM_mips:
1044 case ZigLLVM_mips64:
1045 case ZigLLVM_mips64el:
1046 case ZigLLVM_mipsel:
1047 case ZigLLVM_msp430:
1048 case ZigLLVM_nios2:
1049 case ZigLLVM_nvptx:
1050 case ZigLLVM_nvptx64:
1051 case ZigLLVM_ppc64le:
1052 case ZigLLVM_r600:
1053 case ZigLLVM_renderscript32:
1054 case ZigLLVM_renderscript64:
1055 case ZigLLVM_riscv32:
1056 case ZigLLVM_riscv64:
1057 case ZigLLVM_shave:
1058 case ZigLLVM_sparc:
1059 case ZigLLVM_sparcel:
1060 case ZigLLVM_sparcv9:
1061 case ZigLLVM_spir:
1062 case ZigLLVM_spir64:
1063 case ZigLLVM_systemz:
1064 case ZigLLVM_tce:
1065 case ZigLLVM_tcele:
1066 case ZigLLVM_wasm32:
1067 case ZigLLVM_wasm64:
1068 case ZigLLVM_xcore:
1069 case ZigLLVM_ppc:
1070 case ZigLLVM_ppc64:
1071 return false;
1072 }
1073 zig_unreachable();
1074}
src/target.hpp+2
......@@ -121,4 +121,6 @@ Buf *target_dynamic_linker(ZigTarget *target);
121121bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target);
122122ZigLLVM_OSType get_llvm_os_type(Os os_type);
123123
124bool target_is_arm(const ZigTarget *target);
125
124126#endif
std/special/compiler_rt/index.zig+80-63
......@@ -59,7 +59,7 @@ comptime {
5959 @export("__umoddi3", __umoddi3, linkage);
6060 @export("__udivmodsi4", __udivmodsi4, linkage);
6161
62 if (isArmArch()) {
62 if (is_arm_arch and !is_arm_64) {
6363 @export("__aeabi_uldivmod", __aeabi_uldivmod, linkage);
6464 @export("__aeabi_uidivmod", __aeabi_uidivmod, linkage);
6565 @export("__aeabi_uidiv", __udivsi3, linkage);
......@@ -149,68 +149,85 @@ extern fn __aeabi_uldivmod(numerator: u64, denominator: u64) AeabiUlDivModResult
149149 return result;
150150}
151151
152fn isArmArch() bool {
153 return switch (builtin.arch) {
154 builtin.Arch.armv8_3a,
155 builtin.Arch.armv8_2a,
156 builtin.Arch.armv8_1a,
157 builtin.Arch.armv8,
158 builtin.Arch.armv8r,
159 builtin.Arch.armv8m_baseline,
160 builtin.Arch.armv8m_mainline,
161 builtin.Arch.armv7,
162 builtin.Arch.armv7em,
163 builtin.Arch.armv7m,
164 builtin.Arch.armv7s,
165 builtin.Arch.armv7k,
166 builtin.Arch.armv7ve,
167 builtin.Arch.armv6,
168 builtin.Arch.armv6m,
169 builtin.Arch.armv6k,
170 builtin.Arch.armv6t2,
171 builtin.Arch.armv5,
172 builtin.Arch.armv5te,
173 builtin.Arch.armv4t,
174 builtin.Arch.armebv8_3a,
175 builtin.Arch.armebv8_2a,
176 builtin.Arch.armebv8_1a,
177 builtin.Arch.armebv8,
178 builtin.Arch.armebv8r,
179 builtin.Arch.armebv8m_baseline,
180 builtin.Arch.armebv8m_mainline,
181 builtin.Arch.armebv7,
182 builtin.Arch.armebv7em,
183 builtin.Arch.armebv7m,
184 builtin.Arch.armebv7s,
185 builtin.Arch.armebv7k,
186 builtin.Arch.armebv7ve,
187 builtin.Arch.armebv6,
188 builtin.Arch.armebv6m,
189 builtin.Arch.armebv6k,
190 builtin.Arch.armebv6t2,
191 builtin.Arch.armebv5,
192 builtin.Arch.armebv5te,
193 builtin.Arch.armebv4t,
194 builtin.Arch.aarch64v8_3a,
195 builtin.Arch.aarch64v8_2a,
196 builtin.Arch.aarch64v8_1a,
197 builtin.Arch.aarch64v8,
198 builtin.Arch.aarch64v8r,
199 builtin.Arch.aarch64v8m_baseline,
200 builtin.Arch.aarch64v8m_mainline,
201 builtin.Arch.aarch64_bev8_3a,
202 builtin.Arch.aarch64_bev8_2a,
203 builtin.Arch.aarch64_bev8_1a,
204 builtin.Arch.aarch64_bev8,
205 builtin.Arch.aarch64_bev8r,
206 builtin.Arch.aarch64_bev8m_baseline,
207 builtin.Arch.aarch64_bev8m_mainline,
208 builtin.Arch.thumb,
209 builtin.Arch.thumbeb,
210 => true,
211 else => false,
212 };
213}
152const is_arm_64 = switch (builtin.arch) {
153 builtin.Arch.aarch64v8_3a,
154 builtin.Arch.aarch64v8_2a,
155 builtin.Arch.aarch64v8_1a,
156 builtin.Arch.aarch64v8,
157 builtin.Arch.aarch64v8r,
158 builtin.Arch.aarch64v8m_baseline,
159 builtin.Arch.aarch64v8m_mainline,
160 builtin.Arch.aarch64_bev8_3a,
161 builtin.Arch.aarch64_bev8_2a,
162 builtin.Arch.aarch64_bev8_1a,
163 builtin.Arch.aarch64_bev8,
164 builtin.Arch.aarch64_bev8r,
165 builtin.Arch.aarch64_bev8m_baseline,
166 builtin.Arch.aarch64_bev8m_mainline,
167 => true,
168 else => false,
169};
170
171const is_arm_arch = switch (builtin.arch) {
172 builtin.Arch.armv8_3a,
173 builtin.Arch.armv8_2a,
174 builtin.Arch.armv8_1a,
175 builtin.Arch.armv8,
176 builtin.Arch.armv8r,
177 builtin.Arch.armv8m_baseline,
178 builtin.Arch.armv8m_mainline,
179 builtin.Arch.armv7,
180 builtin.Arch.armv7em,
181 builtin.Arch.armv7m,
182 builtin.Arch.armv7s,
183 builtin.Arch.armv7k,
184 builtin.Arch.armv7ve,
185 builtin.Arch.armv6,
186 builtin.Arch.armv6m,
187 builtin.Arch.armv6k,
188 builtin.Arch.armv6t2,
189 builtin.Arch.armv5,
190 builtin.Arch.armv5te,
191 builtin.Arch.armv4t,
192 builtin.Arch.armebv8_3a,
193 builtin.Arch.armebv8_2a,
194 builtin.Arch.armebv8_1a,
195 builtin.Arch.armebv8,
196 builtin.Arch.armebv8r,
197 builtin.Arch.armebv8m_baseline,
198 builtin.Arch.armebv8m_mainline,
199 builtin.Arch.armebv7,
200 builtin.Arch.armebv7em,
201 builtin.Arch.armebv7m,
202 builtin.Arch.armebv7s,
203 builtin.Arch.armebv7k,
204 builtin.Arch.armebv7ve,
205 builtin.Arch.armebv6,
206 builtin.Arch.armebv6m,
207 builtin.Arch.armebv6k,
208 builtin.Arch.armebv6t2,
209 builtin.Arch.armebv5,
210 builtin.Arch.armebv5te,
211 builtin.Arch.armebv4t,
212 builtin.Arch.aarch64v8_3a,
213 builtin.Arch.aarch64v8_2a,
214 builtin.Arch.aarch64v8_1a,
215 builtin.Arch.aarch64v8,
216 builtin.Arch.aarch64v8r,
217 builtin.Arch.aarch64v8m_baseline,
218 builtin.Arch.aarch64v8m_mainline,
219 builtin.Arch.aarch64_bev8_3a,
220 builtin.Arch.aarch64_bev8_2a,
221 builtin.Arch.aarch64_bev8_1a,
222 builtin.Arch.aarch64_bev8,
223 builtin.Arch.aarch64_bev8r,
224 builtin.Arch.aarch64_bev8m_baseline,
225 builtin.Arch.aarch64_bev8m_mainline,
226 builtin.Arch.thumb,
227 builtin.Arch.thumbeb,
228 => true,
229 else => false,
230};
214231
215232nakedcc fn __aeabi_uidivmod() void {
216233 @setRuntimeSafety(false);