前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GCC 为龙芯 CPU的预定义宏

GCC 为龙芯 CPU的预定义宏

作者头像
mazhen
发布2023-11-24 16:16:01
2550
发布2023-11-24 16:16:01
举报
文章被收录于专栏:mazhen.techmazhen.tech

GCC 会为不同 CPU 架构预定义宏,如 __x86_64__ 代表Intel 64位CPU, __aarch64__代表 ARM64。 网上已经有文档对 GCC 为 CPU 的预定义宏进行了总结

这些预定义的宏有什么用呢?我们在代码中可以判断出当前的 CPU 架构,那么可以针对 不同CPU的特性,进行优化实现。例如RocksDB 对于获取当前时间,在 x86 平台上,会用到 Time Stamp Counter (TSC) 寄存器,使用 RDTSC 指令提取 TSC 中值。对于 ARM 64 也有类似的实现:

代码语言:javascript
复制
// Get the value of tokutime for right now.  We want this to be fast, so we
// expose the implementation as RDTSC.
static inline tokutime_t toku_time_now(void) {
#if defined(__x86_64__) || defined(__i386__)
  uint32_t lo, hi;
  __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi));
  return (uint64_t)hi << 32 | lo;
#elif defined(__aarch64__)
  uint64_t result;
  __asm __volatile__("mrs %[rt], cntvct_el0" : [ rt ] "=r"(result));
  return result;
#elif defined(__powerpc__)
  return __ppc_get_timebase();
#elif defined(__s390x__)
  uint64_t result;
  asm volatile("stckf %0" : "=Q"(result) : : "cc");
  return result;
#else
#error No timer implementation for this platform
#endif
}

而在将 RocksDB 移植到龙芯的过程中,需要修改上面的代码,判断出当前是龙芯 loongarch64 架构。

网上没有搜到 GCC 对龙芯 CPU 的预定宏的文档说明,只能从源码中找答案:

代码语言:javascript
复制
void
loongarch_cpu_cpp_builtins (cpp_reader *pfile)
{
  ...
  builtin_define ("__loongarch__");
  ...
}

可以看到,__loongarch__代表龙芯CPU。 在暂时不知道龙芯是否支持RDTSC的情况下,只能给出通用的实现,以后再查龙芯的CPU手册进行优化。

代码语言:javascript
复制
#if defined(__x86_64__) || defined(__i386__)
  ...
#elif defined(__aarch64__)
  ...
#elif defined(__powerpc__)
  ...
#elif defined(__loongarch__)
  struct timeval tv;
  gettimeofday(&tv,NULL);
  return tv.tv_sec*(uint64_t)1000000+tv.tv_usec;
#else
  #error No implementation for this platform
#endif
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档