我查看了x86 / i64文档,找不到他们提到的地方(%rip)使用指令缓存。因此,我并非100%确定是这种情况。
我想知道我是否正确。如果是这样,我想要做的是使用RIP访问4KB缓冲区,因为访问它的代码非常小(嗯,小到足以容纳额外的4000字节。)我知道如何使用g ++,但我没有看到用cl做的方法。这是我非常欣赏的另一件事!
使用g ++我可以这样写:
__asm__ __volatile__ (".align 4 \n\r"
".big_num: \n\r"
".long 0x01020304 \n\r"
".long 0x05060708 \n\r"
".long 0x01020304 \n\r"
".long 0x05060708 \n\r"
"movdqa .big_num(%rip), xmm0 \n\r");
Microsoft程序中的等效内容是什么?
__asm {
mov big_number(%rip), xmm7
jmp loop
big_number:
???
loop:
}
-----更新(2013年1月24日)
实际上,RIP寻址模式仅限于偏移:
mov offset(%rip), reg
所以它对我没用,因为我需要一个索引,如:
mov offset(%rip, %eax, 4), reg
无论如何都是不可能的。
答案 0 :(得分:3)
据我所知,英特尔手册中所说和所描述的内容,指令缓存本身用于指令(当它们从更远的缓存(L2和L3)取出并最终从主存储器中取出时)和指令内部编码的数据
指令高速缓存可能会吸入代码中嵌入的一些数据,因为高速缓存行的粒度为32/64字节。但这可能会毫无用处,因为你的mov指令访问的数据将来自数据缓存中的不同路由。
总结一下:
如果L1 IC和L1 DC都从L2中的同一位置拉出东西,那么你可能能够在L2中的一些表中产生更长的寿命,但这就是它。您将无法将数据实际移动到L1指令缓存中。