ckb-vm
ckb-vm copied to clipboard
feat: mop twins ld/sd
trafficstars
Twins LD/Twins SD
Since gcc often generates 4 or 8 consecutive ld/sd codes, doing mop on them can reduce the overhead of boundary check on AsmMachine.
some codes from secp256k1
10a1c: 00053803 ld a6,0(a0)
10a20: 650c ld a1,8(a0)
10a22: 6914 ld a3,16(a0)
10a24: 6d1c ld a5,24(a0)
Pattern
Combine two consecutive ld/sd into one mop twins_ld/twins_sd.
Twins SD
sd a1, imm(a0)
sd a2, imm±8(a0)
- -128 <= min(imm, imm±8) <= 127
Twins LD
ld a1, imm(a0)
ld a2, imm±8(a0)
- -128 <= min(imm, imm±8) <= 127
- when imm±8 > imm:
- a0 != a1
- when imm±8 < imm
- a0 != a2
- a1 != a2