内部 __lzcnt64 使用不同的编译选项返回不同的值

2024-02-27

我有以下代码:

#include <stdint.h>
#include <stdio.h>
#include <x86intrin.h>

long long lzcnt(long long l)
{
    return __lzcnt64(l);
}

int main(int argc, char** argv)
{
    printf("%lld\n", lzcnt(atoll(argv[1])));
    return 0;
}

使用不同的编译器和选项运行我得到的(显示程序集):

Clang

$ clang -Wall src/test.c -D__LZCNT__ && ./a.out 2047
53

0000000000400560 <lzcnt>:
400560:   55                      push   %rbp
400561:   48 89 e5                mov    %rsp,%rbp
400564:   48 89 7d f0             mov    %rdi,-0x10(%rbp)
400568:   48 8b 7d f0             mov    -0x10(%rbp),%rdi
40056c:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
400570:   48 8b 7d f8             mov    -0x8(%rbp),%rdi
400574:   48 0f bd ff             bsr    %rdi,%rdi
400578:   48 83 f7 3f             xor    $0x3f,%rdi
40057c:   89 f8                   mov    %edi,%eax
40057e:   48 63 c0                movslq %eax,%rax
400581:   5d                      pop    %rbp
400582:   c3                      retq   
400583:   66 66 66 66 2e 0f 1f    data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
40058a:   84 00 00 00 00 00 

不带 -mlzcnt 的 GCC

$ gcc -Wall src/test.c -D__LZCNT__ && ./a.out 2047
53

0000000000400580 <lzcnt>:
400580: 55                    push   %rbp
400581: 48 89 e5              mov    %rsp,%rbp
400584: 48 89 7d e8           mov    %rdi,-0x18(%rbp)
400588: 48 8b 45 e8           mov    -0x18(%rbp),%rax
40058c: 48 89 45 f8           mov    %rax,-0x8(%rbp)
400590: 48 0f bd 45 f8        bsr    -0x8(%rbp),%rax
400595: 48 83 f0 3f           xor    $0x3f,%rax
400599: 48 98                 cltq   
40059b: 5d                    pop    %rbp
40059c: c3                    retq   

GCC 与 -mlzcnt

$ gcc -Wall src/test.c -D__LZCNT__ -mlzcnt && ./a.out 2047
10

0000000000400580 <lzcnt>:
400580: 55                    push   %rbp
400581: 48 89 e5              mov    %rsp,%rbp
400584: 48 89 7d e8           mov    %rdi,-0x18(%rbp)
400588: 48 8b 45 e8           mov    -0x18(%rbp),%rax
40058c: 48 89 45 f8           mov    %rax,-0x8(%rbp)
400590: f3 48 0f bd 45 f8     lzcnt  -0x8(%rbp),%rax
400596: 48 98                 cltq   
400598: 5d                    pop    %rbp
400599: c3                    retq   

不带 -mlzcnt 的 G++

$ g++ -Wall src/test.c -D__LZCNT__ && ./a.out 2047
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/immintrin.h:64:0,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/x86intrin.h:62,
                 from src/test.c:3:
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/lzcntintrin.h: In function ‘short unsigned int __lzcnt16(short unsigned int)’:
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/lzcntintrin.h:38:29: error: ‘__builtin_clzs’ was not declared in this scope
return __builtin_clzs (__X);

G++ 与 -mlzcnt

$ g++ -Wall src/test.c -D__LZCNT__ -mlzcnt  && ./a.out 2047
10

0000000000400640 <_Z5lzcntx>:
400640: 55                    push   %rbp
400641: 48 89 e5              mov    %rsp,%rbp
400644: 48 89 7d e8           mov    %rdi,-0x18(%rbp)
400648: 48 8b 45 e8           mov    -0x18(%rbp),%rax
40064c: 48 89 45 f8           mov    %rax,-0x8(%rbp)
400650: f3 48 0f bd 45 f8     lzcnt  -0x8(%rbp),%rax
400656: 48 98                 cltq   
400658: 5d                    pop    %rbp
400659: c3                    retq   

区别很明显是 -mlzcnt 的使用,但是我实际上是在 C++ 中工作,如果没有这个选项,它就无法在 g++ 上编译(clang++ 很好)。看起来使用 -mlzcnt 时结果是 63-(没有 -mlzct 的结果)。是否有关于 gcc 的 -mlzcnt 选项的任何文档(我查看了信息文件,但找不到任何内容)?除了选择 lzcnt 指令之外,它还执行其他操作吗?


首先,我能够使用 clang 3.3 和 gcc 4.8.1 完美地复制您的问题。

这是我的想法...我对此的看法只有 50% 左右。

  • LZCNT 是您的计算机可能不支持的指令。
  • 维基百科 https://en.wikipedia.org/wiki/SSE4表明LZCNT需要Haswell支持
  • 我们可以尝试使用Linux应用程序来验证此信息cpuid http://www.ka9q.net/code/cpuid。 (包含在 Debian、RHEL 等中)。
  • 维基百科再次建议“通过 CPUID.80000001H:ECX.ABM[Bit 5] 标志指示支持”。

让我们看看我的系统(Xeon X3430、Lynnfield、Nehalem)。

[4:48pm][wlynch@apple /tmp] sudo cpuid -1ir | grep 80000001
   0x80000001 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000001 edx=0x28100800

因此,ECX 的第 23 位不正确。所以我的系统不支持LZCNT。

看起来我的机器恰好将不受支持的 LZCNT 解释为 BSR。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内部 __lzcnt64 使用不同的编译选项返回不同的值 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 是否可以对用笔尖初始化的 WindowController 进行单元测试?

    我有一个简单的 Mac OS 应用程序 默认情况下MainMenu xib 在那里我有第二个窗口用于偏好设置和PreferencesWindowController 我想让以下测试工作 implementation TestPreferen
  • 带有两个参数包的函数模板重载解析

    考虑以下代码 include
  • Prop 和 Type 的不同归纳原理

    我注意到 Coq 综合了关于 Prop 和 Type 等式的不同归纳原理 有人对此有解释吗 平等定义为 Inductive eq A Type x A A gt Prop eq refl x x 与之相关的归纳原理有以下类型 eq ind
  • JTextArea 更新为 DocumentListener

    JTextArea area1 new JTextArea JTextArea area2 new JTextArea DocumentListener documentListener new DocumentListener publi
  • 使用模块中的方法模拟类

    我正在使用 PowerShell 2 0 无法升级 并且正在编写一系列使用 Active Directory 中的一些信息的脚本 来自 C 等 OOP 语言 我想在 PowerShell 2 0 中模拟一个类 但我知道它们只有class5
  • 程序卡住,管道文件描述符何时不应该打开?

    我正在创建一个可以读取命令的小 shell 当我运行我的程序并输入 cat file txt gt file2 txt 它创建了文件 然后卡在了这一行 if execvp structVariables gt argv 0 argv lt
  • 矩阵的滑动窗口求和

    我有一个 50x50 矩阵 我想对每个 10x10 或另一个设定大小值 始终是正方形 重叠网格中的值求和 即 为了清楚起见 重叠的窗口仅以对角线显示 我尝试做的第一个任务是定义每个窗口的坐标 win 10 start 1 10 1 10 f
  • PHP cURL,使用 CURLOPT_RETURNTRANSFER 时出现内存泄漏

    下面的代码是在一个循环中 每个循环都会将 URI 更改为新地址 我的问题是每次传递都会占用越来越多的内存 ch curl init curl setopt ch CURLOPT URL URI curl setopt ch CURLOPT
  • MySQL 与 Sequelize:ER_BAD_DB_ERROR:未知数据库

    我正在遵循教程 下面是代码 var Sequelize require sequelize var sequelize new Sequelize basic mysql database mysql root password diale
  • 如何在 Ruby 中执行相当于 's3cmd ls s3://some_bucket/foo/bar' 的操作?

    如何在 Ruby 中执行相当于 s3cmd ls s3 some bucket foo bar 的操作 我找到了适用于 Ruby 的 Amazon S3 gem 以及正确的 AWS S3 库 但不知何故 如何在 S3 文件夹 之类的位置上执
  • MessageKit 不显示消息输入栏 Swift 5

    这是控制器层次结构 tabBarController gt 一些控制器和聊天频道控制器 并且这个聊天频道控制器也是一个导航控制器 当我选择行时 它会推送到 MessageViewController 类的聊天控制器 我这里有两个问题 一是小
  • 为什么使用 Tiled 的 libgdx 游戏中出现线条?

    我正在使用 LibGdx 和 Tiled 当在屏幕上移动时 游戏上会出现水平线和垂直线 如果需要的话 我可以发布您需要的任何代码 我怎样才能让这些线路停止 这是一个 gfycat gif 的线条 http gfycat com FastUn
  • QML - MouseArea/MouseEvent 问题

    下面的代码生成一个白色矩形 其中包含一个红色矩形和一个灰色矩形 每个矩形都有一个关联的 MouseArea 当鼠标在灰色矩形内单击时 灰色矩形会变成蓝色 当鼠标光标进入红色矩形内部时 红色矩形会打印一条控制台消息 当发出释放信号时 会打印另
  • 我如何比较“Bcrypt”Gem 解密的密码和加密的密码

    我正在尝试对某些帖子的评论使用简单的身份验证 用户使用即时 ID 和密码输入评论 我使用 bcrypt gem 将密码存储在数据库中 就像comments controller rb中这样 comment Comment new comme
  • Django 中子查询的查询

    我正在尝试从另一个查询执行查询 但 Django 说 渲染时捕获数据库错误 子查询返回超过 1 行 我正在使用 PostGis my model class Place models Model coordinate models Poin
  • 通过 .htaccess 文件为所有 PHP 脚本设置 HTTP 标头

    我在我的一个项目中对所有 PHP 程序编写了相同的代码行 是否可以在目录的 htaccess 中执行此操作 如何 PHP 代码 Header Content Type application xhtml xml charset utf 8
  • 混淆矩阵和列联表有什么区别?

    我正在编写一段代码来评估我的聚类算法 我发现每种评估方法都需要来自m n类似矩阵A aij where aij是属于类成员的数据点的数量ci和簇的元素kj 但似乎有两个这种类型的矩阵数据挖掘简介 Pang Ning Tan 等 一个是混淆矩
  • iOS:无法启动 .app 文件

    我不知道为什么它在我的 app 文件中寻找目录 每次我运行应用程序时 它都会在 iPhone 上安装应用程序 但不会运行并给出以下错误 谁能告诉我这个设置存储在哪里 谢谢 error failed to launch Users xxx L
  • 更新/替换 Google 文档上的内嵌图像

    我正在尝试设置一个功能来更新 Google 文档上的图像 就像 Lucidchart Add on 对其 更新插入图表 功能所做的那样 为此 我目前正在执行以下操作 创建命名范围并将其 id 与生成图像的数据一起存储在文档属性中 以供以后检
  • 内部 __lzcnt64 使用不同的编译选项返回不同的值

    我有以下代码 include