【问题标题】:Understanding Luajit SNAP IR instruction了解 Luajit SNAP IR 指令
【发布时间】:2018-03-05 13:37:09
【问题描述】:

我正在尝试在我的 luajit 代码中跟踪一些 寄存器合并太复杂 NYI。从 IR 中可以看出,NYI 发生时的快照非常完整。我的尝试是追溯并找出导致快照被填满的原因。

首先,我希望了解 SNAP 行给出了哪些信息。例如在下面的 SNAP 行中:

> local x = 1.2 for i=1,1e3 do x = x * -3 end
---- TRACE 1 start stdin:1
0006  MULVN    0   0   1  ; -3
0007  FORL     1 => 0006
---- TRACE 1 IR
....              SNAP   #0   [ ---- ]
0001 rbp      int SLOAD  #2    CI
0002 xmm7  >  num SLOAD  #1    T
0003 xmm7   + num MUL    0002  -3  
0004 rbp    + int ADD    0001  +1  
....              SNAP   #1   [ ---- 0003 ]
0005       >  int LE     0004  +1000
....              SNAP   #2   [ ---- 0003 0004 ---- ---- 0004 ]
0006 ------------ LOOP ------------
0007 xmm7   + num MUL    0003  -3  
0008 rbp    + int ADD    0004  +1  
....              SNAP   #3   [ ---- 0007 ]
0009       >  int LE     0008  +1000
0010 rbp      int PHI    0004  0008
0011 xmm7     num PHI    0003  0007

如果我的理解是正确的,在第一个快照中,第二个位置由 IR 在0003 写入。根据0003 的IR 参数,我猜0002 (这是一个内存位置吗?)x

我不明白的是,在第二个快照行中(在 IR 0005 之后)第 3 和第 6 位由 IR 在0004 修改。怎么样?

现在,我如何追踪 IR 上方快照位置中存在哪些变量?例如:SNAP #7 [ ---- 0007 ].

SLOAD(标志)的第二个参数又是什么意思? [I, CI, CRI, T, PI, PRI, R, RI] 等...我还看到 SLOAD 第二个参数为空。

【问题讨论】:

    标签: lua luajit


    【解决方案1】:

    Peter Cawley 在以下线程中的 luajit 邮件列表中对此进行了广泛回答

    https://www.freelists.org/post/luajit/Understanding-SNAP

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多