summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp59
1 files changed, 27 insertions, 32 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 71ae50a5..401b9e8d 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -196,10 +196,29 @@ namespace {
<< "extern void _Unwind_Resume(void) __attribute__((noreturn));\n"
<< "#define ALIGNOF(t) __alignof__(t)\n"
;
+ break;
case Compiler::Msvc:
- m_of << "__declspec(noreturn) extern void _Unwind_Resume(void);\n";
- m_of << "#define ALIGNOF(t) __alignof(t)\n";
+ m_of
+ << "__declspec(noreturn) extern void _Unwind_Resume(void);\n"
+ << "#define ALIGNOF(t) __alignof(t)\n"
+ ;
+ break;
//case Compilter::Std11:
+ // break;
+ }
+ switch (m_compiler)
+ {
+ case Compiler::Gcc:
+ // 64-bit bit ops (gcc intrinsics)
+ m_of
+ << "static inline uint64_t __builtin_clz64(uint64_t v) {\n"
+ << "\treturn (v >> 32 != 0 ? __builtin_clz(v>>32) : 32 + __builtin_clz(v));\n"
+ << "}\n"
+ << "static inline uint64_t __builtin_ctz64(uint64_t v) {\n"
+ << "\treturn ((v&0xFFFFFFFF) == 0 ? __builtin_ctz(v>>32) + 32 : __builtin_ctz(v));\n"
+ << "}\n"
+ ;
+ case Compiler::Msvc:
break;
}
@@ -244,7 +263,13 @@ namespace {
}
else
{
+ // GCC-only
m_of
+ << "static inline uint128_t __builtin_bswap128(uint128_t v) {\n"
+ << "\tuint64_t lo = __builtin_bswap64((uint64_t)v);\n"
+ << "\tuint64_t hi = __builtin_bswap64((uint64_t)(v>>64));\n"
+ << "\treturn ((uint128_t)lo << 64) | (uint128_t)hi;\n"
+ << "}\n"
<< "static inline uint128_t intrinsic_ctlz_u128(uint128_t v) {\n"
<< "\treturn (v == 0 ? 128 : (v >> 64 != 0 ? __builtin_clz64(v>>64) : 64 + __builtin_clz64(v)));\n"
<< "}\n"
@@ -271,36 +296,6 @@ namespace {
<< "static inline void noop_drop(void *p) {}\n"
<< "\n"
;
- switch (m_compiler)
- {
- case Compiler::Gcc:
- // 64-bit bit ops (gcc intrinsics)
- m_of
- << "static inline uint64_t __builtin_clz64(uint64_t v) {\n"
- << "\treturn (v >> 32 != 0 ? __builtin_clz(v>>32) : 32 + __builtin_clz(v));\n"
- << "}\n"
- << "static inline uint64_t __builtin_ctz64(uint64_t v) {\n"
- << "\treturn ((v&0xFFFFFFFF) == 0 ? __builtin_ctz(v>>32) + 32 : __builtin_ctz(v));\n"
- << "}\n"
- ;
- // u128/i128 ops (gcc intrinsics)
- m_of
- << "static inline uint128_t __builtin_bswap128(uint128_t v) {\n"
- << "\tuint64_t lo = __builtin_bswap64((uint64_t)v);\n"
- << "\tuint64_t hi = __builtin_bswap64((uint64_t)(v>>64));\n"
- << "\treturn ((uint128_t)lo << 64) | (uint128_t)hi;\n"
- << "}\n"
- << "static inline uint128_t __builtin_clz128(uint128_t v) {\n"
- << "\treturn (v >> 64 != 0 ? __builtin_clz64(v>>64) : 64 + __builtin_clz64(v));\n"
- << "}\n"
- << "static inline uint128_t __builtin_ctz128(uint128_t v) {\n"
- << "\treturn ((v&0xFFFFFFFFFFFFFFFF) == 0 ? __builtin_ctz64(v>>64) + 64 : __builtin_ctz64(v));\n"
- << "}\n"
- << "\n"
- ;
- case Compiler::Msvc:
- break;
- }
}
~CodeGenerator_C() {}