使用mov(%rip),%eax等指令时使用哪个缓存?

时间:2013-01-22 09:18:22

标签: caching assembly x86

我查看了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

无论如何都是不可能的。

1 个答案:

答案 0 :(得分:3)

据我所知,英特尔手册中所说和所描述的内容,指令缓存本身用于指令(当它们从更远的缓存(L2和L3)取出并最终从主存储器中取出时)和指令内部编码的数据

指令高速缓存可能会吸入代码中嵌入的一些数据,因为高速缓存行的粒度为32/64字节。但这可能会毫无用处,因为你的mov指令访问的数据将来自数据缓存中的不同路由。

总结一下:

  • L1缓存包含两个独立的部分:L1指令缓存和L1数据缓存。
  • L2缓存是代码和数据的统一缓存。
  • L3也统一为L2。

如果L1 IC和L1 DC都从L2中的同一位置拉出东西,那么你可能能够在L2中的一些表中产生更长的寿命,但这就是它。您将无法将数据实际移动到L1指令缓存中。