- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很好奇是否有人可以为我阐明这一点。我正在研究一些数字数据转换的东西,我有几个进行数据转换的函数,我使用两个宏定义它们:
#define CONV_VIA_CAST(name, dtype, vtype) \
static inline void name(void *data, void *view, size_t len) { \
vtype *vptr = (vtype*)view; \
dtype *dptr = (dtype*)data; \
for (size_t ii=0; ii < len/sizeof(vtype); ii++) { \
*vptr++ = (vtype)*dptr++; \
} \
}
#define CONV_VIA_FUNC(name, dtype, vtype, via) \
static inline void name(void *data, void *view, size_t len) { \
vtype *vptr = (vtype*)view; \
dtype *dptr = (dtype*)data; \
for (size_t ii=0; ii < len/sizeof(vtype); ii++) { \
*vptr++ = (vtype)via(*dptr++); \
} \
}
当我定义一个 float 到 int 的转换时:
CONV_VIA_FUNC(f_to_i, float, int16_t, lrintf);
我用 -O3 得到了一个漂亮简洁的小片段:
0x0000000000401fb0 <+0>: shr %rdx
0x0000000000401fb3 <+3>: je 0x401fd3 <f_to_i+35>
0x0000000000401fb5 <+5>: xor %eax,%eax
0x0000000000401fb7 <+7>: nopw 0x0(%rax,%rax,1)
0x0000000000401fc0 <+16>: cvtss2si (%rdi,%rax,4),%rcx
0x0000000000401fc6 <+22>: mov %cx,(%rsi,%rax,2)
0x0000000000401fca <+26>: add $0x1,%rax
0x0000000000401fce <+30>: cmp %rdx,%rax
0x0000000000401fd1 <+33>: jne 0x401fc0 <f_to_i+16>
0x0000000000401fd3 <+35>: repz retq
但是,当我定义一个 float->double(或 double->float)函数时:
CONV_VIA_CAST(f_to_d, float, double);
我得到了这个怪物:
0x0000000000402040 <+0>: mov %rdx,%r8
0x0000000000402043 <+3>: shr $0x3,%r8
0x0000000000402047 <+7>: test %r8,%r8
0x000000000040204a <+10>: je 0x402106 <f_to_d+198>
0x0000000000402050 <+16>: shr $0x5,%rdx
0x0000000000402054 <+20>: lea 0x0(,%rdx,4),%r9
0x000000000040205c <+28>: test %r9,%r9
0x000000000040205f <+31>: je 0x402108 <f_to_d+200>
0x0000000000402065 <+37>: lea (%rdi,%r8,4),%rax
0x0000000000402069 <+41>: cmp $0xb,%r8
0x000000000040206d <+45>: lea (%rsi,%r8,8),%r10
0x0000000000402071 <+49>: seta %cl
0x0000000000402074 <+52>: cmp %rax,%rsi
0x0000000000402077 <+55>: seta %al
0x000000000040207a <+58>: cmp %r10,%rdi
0x000000000040207d <+61>: seta %r10b
0x0000000000402081 <+65>: or %r10d,%eax
0x0000000000402084 <+68>: test %al,%cl
0x0000000000402086 <+70>: je 0x402108 <f_to_d+200>
0x000000000040208c <+76>: xorps %xmm3,%xmm3
0x000000000040208f <+79>: xor %eax,%eax
0x0000000000402091 <+81>: xor %ecx,%ecx
0x0000000000402093 <+83>: nopl 0x0(%rax,%rax,1)
0x0000000000402098 <+88>: movaps %xmm3,%xmm0
0x000000000040209b <+91>: add $0x1,%rcx
0x000000000040209f <+95>: movlps (%rdi,%rax,1),%xmm0
0x00000000004020a3 <+99>: movhps 0x8(%rdi,%rax,1),%xmm0
0x00000000004020a8 <+104>: movhlps %xmm0,%xmm1
0x00000000004020ab <+107>: cvtps2pd %xmm0,%xmm2
0x00000000004020ae <+110>: cvtps2pd %xmm1,%xmm0
0x00000000004020b1 <+113>: movlpd %xmm2,(%rsi,%rax,2)
0x00000000004020b6 <+118>: movhpd %xmm2,0x8(%rsi,%rax,2)
0x00000000004020bc <+124>: movlpd %xmm0,0x10(%rsi,%rax,2)
0x00000000004020c2 <+130>: movhpd %xmm0,0x18(%rsi,%rax,2)
0x00000000004020c8 <+136>: add $0x10,%rax
0x00000000004020cc <+140>: cmp %rcx,%rdx
0x00000000004020cf <+143>: ja 0x402098 <f_to_d+88>
0x00000000004020d1 <+145>: cmp %r9,%r8
0x00000000004020d4 <+148>: lea (%rsi,%r9,8),%rsi
0x00000000004020d8 <+152>: lea (%rdi,%r9,4),%rdi
0x00000000004020dc <+156>: je 0x40210d <f_to_d+205>
0x00000000004020de <+158>: mov %r9,%rdx
0x00000000004020e1 <+161>: mov %r9,%rax
0x00000000004020e4 <+164>: neg %rdx
0x00000000004020e7 <+167>: lea (%rsi,%rdx,8),%rcx
0x00000000004020eb <+171>: lea (%rdi,%rdx,4),%rdx
0x00000000004020ef <+175>: nop
0x00000000004020f0 <+176>: movss (%rdx,%rax,4),%xmm0
0x00000000004020f5 <+181>: cvtps2pd %xmm0,%xmm0
0x00000000004020f8 <+184>: movsd %xmm0,(%rcx,%rax,8)
0x00000000004020fd <+189>: add $0x1,%rax
0x0000000000402101 <+193>: cmp %rax,%r8
0x0000000000402104 <+196>: ja 0x4020f0 <f_to_d+176>
0x0000000000402106 <+198>: repz retq
0x0000000000402108 <+200>: xor %r9d,%r9d
0x000000000040210b <+203>: jmp 0x4020de <f_to_d+158>
0x000000000040210d <+205>: nopl (%rax)
0x0000000000402110 <+208>: retq
任何人都可以阐明 float->double 转换的幕后情况吗?也许如何编写才能更有效地组装出来?如果重要的话,我正在使用 gcc 4.6.3。
最佳答案
你所谓的“怪物”实际上看起来像automatically vectorized code .在这种技术开始发挥良好作用并在通用编译器中发挥作用之前,已经进行了大约 20 年的研究。
它可能不漂亮,但 GCC 实现者认为它对于长数组会更快。如果您的数组实际上并不长,或者如果您无法忍受这样的编译代码,请禁用该特定优化。用 -O2
编译应该可以(未尝试)。
关于c - 浮点到双转换 : why so many instructions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12134606/
是否有任何文档或 cecil 源代码的一部分可供我引用以全面了解 cecil 将针对给定的代码 使用哪些Operand 类型> 值(value)?例如:我可以从 MethodBodyRocks 中了解
在 Destroy 之后,我打印了一条 Log 语句,Log 是否会显示为应用程序已经被销毁并且在应用程序被销毁后无法执行任何指令。 @Override protected void onDe
我注意到,在某些情况下(我仍然是 R 的初学者!),多行指令不能“按原样”合并到简单的行指令中。让我们举个例子,这是我最近在网上的一个类: > make.power cube square ma
我做网站已经有一段时间了,我的网站设计不太好?我的老板正在推荐我去上一些课。 但我真的想坚持开发而不是设计吗? 最佳答案 您无需成为设计师。但我强烈建议您了解该过程和使用的一些技术。拥有这些知识将有助
指令微调 是一种技术,它能让大语言模型 (LLMs) 更好地理解和遵循人类的指令。但是,在编程任务中,大多数模型的微调都是基于人类编写的指令 (这需要很高的成本) 或者是由大型专有 LLMs 生成
我开始探索计算机体系结构领域。有两个关于 ISA 的问题让我困惑。 据我所知,ISA有多种,如ARM、MIPS、80x86等。我想知道CPU是否只能专门读取一种ISA。例如,处理器可以同时读取 80x
这只是一个简单的代码,用于检查一个数字是否是质数,我不知道这是编译器还是代码的问题。如果您能提供一些帮助,我们将不胜感激。 这是代码: #include "stdio.h" int main() {
我有以下一段 x86 汇编代码: 1 2 .text 3 4 .data 5 6 # define an array of 3 dwords 7
我理解计算机是图灵完备的概念(具有 MOV 或命令或 SUBNEG 命令,因此能够“合成”其他指令,例如 )。如果这是真的,那么像 x86 这样的 100 条指令的目的是什么?是为了提高效率? 最佳答
我刚刚开始使用Jenkinsfiles和Docker,所以很抱歉,这很明显。 我有一个包含Dockerfile和Jenkins文件的仓库。 Dockerfile通过添加几个依赖项和构建工具,简单地扩展
当指令 LOAD 800 被输入时,我了解其他值如何加载到累加器中,但我不知道如何获得索引和间接寻址的结果。 最佳答案 不确定您正在讨论哪种架构,因此我将尽我所能进行一般性解释(基于更具体架构的经验,
我正在使用反汇编程序(SmartDec:http://decompilation.info/)并且生成的反汇编中的许多指令看起来类似于: mov rax, [rip + 0x32b5]:64 我不熟悉
我的计算机上有一个 python3 脚本,我可以使用 python3motion_detection.py 运行它,并且该脚本有效,我尝试在我的 Raspberry 上使用它,但失败并显示消息非法指令
我遇到了这个错误 /tmp/ccK86fyk.s: Assembler messages: /tmp/ccK86fyk.s:69: Error: bad instruction `sw $3,0(r3
我正在尝试将一些 C/C++ 代码转换为 UNIX shell。我进行了一些转换,但有时,我发现 C/C++ 中的代码很奇怪,可能是因为我在上下文中不理解它。更重要的是,客户端没有给我输入/输出文件或
我已经尝试过 AVX 内在函数。但它导致“test.exe 中 0x00E01555 处出现未处理的异常:0xC000001D:非法指令。” 我使用的是 Visual Studio 2015。异常错误
这个问题在这里已经有了答案: Is the CSS :not() selector supposed to work with distant descendants? (2 个答案) 关闭 7
在Centos 6.2中,我使用gcc 4.8.0编译DPDK代码(dpdk-stable-17.05.2),遇到编译错误。编译命令:make install T=x86_64-native-linu
我正在浏览一些随机的 Java 代码并遇到了这段代码,我试图理解流程并且很难理解类的实际实现,类的实际操作,所以我的基本问题是WhatDoIDo 类实际上做了什么?任何指导将不胜感激。 问:解释由于在
我在 http://www.problemio.com/problems/problem.php 有一个页面,你在右下角看到我有一张蓝绿色的图像。它确实是一个链接,在该链接中我似乎无法让文本颜色显示为
我是一名优秀的程序员,十分优秀!