在汇编代码中交错数据与指令是否会影响性能?
解释型函数转C函数指针的存根布局与CPU流水线优化问题
我要把解释型语言中的函数以一等C函数指针的形式暴露,为此编写了生成**存根(stub)的代码。这些存根运行时会定位解释型函数所在的模块,再调用一个C实现的转移(transfer)**函数来触发解释器执行。
模块地址与转移函数的入口点以双字数据形式,和CPU指令交错存放,以便通过PC/IP相对寻址获取其值。
由于多数架构都具备**流水线(pipelining)机制,我担心这种存根布局可能会干扰CPU微码,引发诸如指令调度(instruction scheduling)**层面的次优表现。我对该领域并不熟悉,希望得到相关解答。
ARM64汇编示例
static uint32_t CallStub[] = { // 重定位至转移函数的入口点地址 0x00000000, 0x00000000, // 重定位至代码模块的地址 0x00000000, 0x00000000, // callxfer: // nop // nop // tumodule: // nop // nop // CallStub: // SUB SP, SP, 16 // STR X30, SP // BL +0 // MOV X2, X30 // LDR X3, tumodule // LDR X4, callxfer // BLR X4 // LDR X30, SP // ADD SP, SP, 16 // RET 0xd1000000 | (16 << 10) | (31 << 5) | 31, // SUB (immediate), 0xf9000000 | (31 << 5) | 30, // STR (immediate, unsigned offset), 0x94000000 | 1, // BL, 0xaa0003e0 | (30 << 16) | 2, // MOV (register), 0x58000000 | (0x7fffa << 5) | 3, // LDR (literal), 0x58000000 | (0x7fff7 << 5) | 4, // LDR (literal), 0xd63f0000 | (4 << 5), // BLR, 0xf8400400 | (31 << 5) | 30, // LDR (immediate), 0x91000000 | (16 << 10) | (31 << 5) | 31, // ADD (immediate), 0xd65f0000 | (30 << 5), };
内容的提问来源于stack exchange,提问作者DannyNiu
相关产品推荐
相关产品推荐

