| ... | ... | @@ -342,13 +342,23 @@ |
| 342 | 342 | #define zig_weak_linkage_fn zig_weak_linkage_unavailable |
| 343 | 343 | #endif |
| 344 | 344 | |
| 345 | #if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 346 | #define zig_gnuc_asm |
| 347 | #endif |
| 348 | |
| 345 | 349 | #if zig_has_builtin(trap) |
| 346 | 350 | #define zig_trap() __builtin_trap() |
| 347 | | #elif defined(zig_msvc) && defined(zig_x86) |
| 348 | | #define zig_trap() __ud2() |
| 349 | 351 | #elif defined(zig_msvc) |
| 352 | |
| 353 | #if defined(zig_x86) |
| 354 | #define zig_trap() __ud2() |
| 355 | #else |
| 350 | 356 | #define zig_trap() __fastfail(7) |
| 351 | | #elif defined(zig_thumb) |
| 357 | #endif |
| 358 | |
| 359 | #elif defined(zig_gnuc_asm) |
| 360 | |
| 361 | #if defined(zig_thumb) |
| 352 | 362 | #define zig_trap() __asm__ volatile("udf #0xfe") |
| 353 | 363 | #elif defined(zig_arm) || defined(zig_aarch64) |
| 354 | 364 | #define zig_trap() __asm__ volatile("udf #0xfdee") |
| ... | ... | @@ -370,11 +380,17 @@ |
| 370 | 380 | #define zig_trap() zig_trap_unavailable |
| 371 | 381 | #endif |
| 372 | 382 | |
| 383 | #else |
| 384 | #define zig_trap() zig_trap_unavailable |
| 385 | #endif |
| 386 | |
| 373 | 387 | #if zig_has_builtin(debugtrap) |
| 374 | 388 | #define zig_breakpoint() __builtin_debugtrap() |
| 375 | 389 | #elif defined(zig_msvc) |
| 376 | 390 | #define zig_breakpoint() __debugbreak() |
| 377 | | #elif defined(zig_arm) |
| 391 | #elif defined(zig_gnuc_asm) |
| 392 | |
| 393 | #if defined(zig_arm) |
| 378 | 394 | #define zig_breakpoint() __asm__ volatile("bkpt #0x0") |
| 379 | 395 | #elif defined(zig_aarch64) |
| 380 | 396 | #define zig_breakpoint() __asm__ volatile("brk #0xf000") |
| ... | ... | @@ -398,6 +414,10 @@ |
| 398 | 414 | #define zig_breakpoint() zig_breakpoint_unavailable |
| 399 | 415 | #endif |
| 400 | 416 | |
| 417 | #else |
| 418 | #define zig_breakpoint() zig_breakpoint_unavailable |
| 419 | #endif |
| 420 | |
| 401 | 421 | #if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc) |
| 402 | 422 | #define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0)) |
| 403 | 423 | #elif defined(zig_msvc) |
| ... | ... | @@ -4063,7 +4083,7 @@ static inline void* zig_thumb_windows_teb(void) { |
| 4063 | 4083 | void* teb = 0; |
| 4064 | 4084 | #if defined(zig_msvc) |
| 4065 | 4085 | teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2); |
| 4066 | | #elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 4086 | #elif defined(zig_gnuc_asm) |
| 4067 | 4087 | __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb)); |
| 4068 | 4088 | #endif |
| 4069 | 4089 | return teb; |
| ... | ... | @@ -4075,7 +4095,7 @@ static inline void* zig_aarch64_windows_teb(void) { |
| 4075 | 4095 | void* teb = 0; |
| 4076 | 4096 | #if defined(zig_msvc) |
| 4077 | 4097 | teb = (void*)__readx18qword(0x0); |
| 4078 | | #elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 4098 | #elif defined(zig_gnuc_asm) |
| 4079 | 4099 | __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb)); |
| 4080 | 4100 | #endif |
| 4081 | 4101 | return teb; |
| ... | ... | @@ -4087,7 +4107,7 @@ static inline void* zig_x86_windows_teb(void) { |
| 4087 | 4107 | void* teb = 0; |
| 4088 | 4108 | #if defined(zig_msvc) |
| 4089 | 4109 | teb = (void*)__readfsdword(0x18); |
| 4090 | | #elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 4110 | #elif defined(zig_gnuc_asm) |
| 4091 | 4111 | __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb)); |
| 4092 | 4112 | #endif |
| 4093 | 4113 | return teb; |
| ... | ... | @@ -4099,7 +4119,7 @@ static inline void* zig_x86_64_windows_teb(void) { |
| 4099 | 4119 | void* teb = 0; |
| 4100 | 4120 | #if defined(zig_msvc) |
| 4101 | 4121 | teb = (void*)__readgsqword(0x30); |
| 4102 | | #elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 4122 | #elif defined(zig_gnuc_asm) |
| 4103 | 4123 | __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb)); |
| 4104 | 4124 | #endif |
| 4105 | 4125 | return teb; |
| ... | ... | @@ -4117,7 +4137,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax |
| 4117 | 4137 | *ebx = (uint32_t)cpu_info[1]; |
| 4118 | 4138 | *ecx = (uint32_t)cpu_info[2]; |
| 4119 | 4139 | *edx = (uint32_t)cpu_info[3]; |
| 4120 | | #elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 4140 | #elif defined(zig_gnuc_asm) |
| 4121 | 4141 | __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid)); |
| 4122 | 4142 | #else |
| 4123 | 4143 | *eax = 0; |
| ... | ... | @@ -4130,7 +4150,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax |
| 4130 | 4150 | static inline uint32_t zig_x86_get_xcr0(void) { |
| 4131 | 4151 | #if defined(zig_msvc) |
| 4132 | 4152 | return (uint32_t)_xgetbv(0); |
| 4133 | | #elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 4153 | #elif defined(zig_gnuc_asm) |
| 4134 | 4154 | uint32_t eax; |
| 4135 | 4155 | uint32_t edx; |
| 4136 | 4156 | __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0)); |