| ... | @@ -253,14 +253,75 @@ const is_arm_arch = switch (builtin.arch) { | ... | @@ -253,14 +253,75 @@ const is_arm_arch = switch (builtin.arch) { |
| 253 | | 253 | |
| 254 | const is_arm_32 = is_arm_arch and !is_arm_64; | 254 | const is_arm_32 = is_arm_arch and !is_arm_64; |
| 255 | | 255 | |
| 256 | const use_thumb_1 = is_arm_32 and switch (builtin.arch.arm) { | 256 | const use_thumb_1 = usesThumb1(builtin.arch); |
| 257 | builtin.Arch.Arm32.v6, | 257 | |
| 258 | builtin.Arch.Arm32.v6m, | 258 | fn usesThumb1(arch: builtin.Arch) bool { |
| 259 | builtin.Arch.Arm32.v6k, | 259 | return switch (arch) { |
| 260 | builtin.Arch.Arm32.v6t2, | 260 | .arm => switch (arch.arm) { |
| 261 | => true, | 261 | .v6m => true, |
| 262 | else => false, | 262 | else => false, |
| 263 | }; | 263 | }, |
| | 264 | .armeb => switch (arch.armeb) { |
| | 265 | .v6m => true, |
| | 266 | else => false, |
| | 267 | }, |
| | 268 | .thumb => switch (arch.thumb) { |
| | 269 | .v5, |
| | 270 | .v5te, |
| | 271 | .v4t, |
| | 272 | .v6, |
| | 273 | .v6m, |
| | 274 | .v6k, |
| | 275 | => true, |
| | 276 | else => false, |
| | 277 | }, |
| | 278 | .thumbeb => switch (arch.thumbeb) { |
| | 279 | .v5, |
| | 280 | .v5te, |
| | 281 | .v4t, |
| | 282 | .v6, |
| | 283 | .v6m, |
| | 284 | .v6k, |
| | 285 | => true, |
| | 286 | else => false, |
| | 287 | }, |
| | 288 | else => false, |
| | 289 | }; |
| | 290 | } |
| | 291 | |
| | 292 | test "usesThumb1" { |
| | 293 | testing.expect(usesThumb1(builtin.Arch{ .arm = .v6m })); |
| | 294 | testing.expect(!usesThumb1(builtin.Arch{ .arm = .v5 })); |
| | 295 | //etc. |
| | 296 | |
| | 297 | testing.expect(usesThumb1(builtin.Arch{ .armeb = .v6m })); |
| | 298 | testing.expect(!usesThumb1(builtin.Arch{ .armeb = .v5 })); |
| | 299 | //etc. |
| | 300 | |
| | 301 | testing.expect(usesThumb1(builtin.Arch{ .thumb = .v5 })); |
| | 302 | testing.expect(usesThumb1(builtin.Arch{ .thumb = .v5te })); |
| | 303 | testing.expect(usesThumb1(builtin.Arch{ .thumb = .v4t })); |
| | 304 | testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6 })); |
| | 305 | testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6k })); |
| | 306 | testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6m })); |
| | 307 | testing.expect(!usesThumb1(builtin.Arch{ .thumb = .v6t2 })); |
| | 308 | //etc. |
| | 309 | |
| | 310 | testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v5 })); |
| | 311 | testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v5te })); |
| | 312 | testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v4t })); |
| | 313 | testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6 })); |
| | 314 | testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6k })); |
| | 315 | testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6m })); |
| | 316 | testing.expect(!usesThumb1(builtin.Arch{ .thumbeb = .v6t2 })); |
| | 317 | //etc. |
| | 318 | |
| | 319 | testing.expect(!usesThumb1(builtin.Arch{ .aarch64 = .v8 })); |
| | 320 | testing.expect(!usesThumb1(builtin.Arch{ .aarch64_be = .v8 })); |
| | 321 | testing.expect(!usesThumb1(builtin.Arch.x86_64)); |
| | 322 | testing.expect(!usesThumb1(builtin.Arch.riscv32)); |
| | 323 | //etc. |
| | 324 | } |
| 264 | | 325 | |
| 265 | nakedcc fn __aeabi_uidivmod() void { | 326 | nakedcc fn __aeabi_uidivmod() void { |
| 266 | @setRuntimeSafety(false); | 327 | @setRuntimeSafety(false); |