Skip to content

x64 load-op-store imm folding #4284

@pepyakin

Description

@pepyakin

Right now the given CLIF

v1 = load.i32 v0+32
v2 = iconst.i32 2
v3 = iadd v1, v2
store v3, v0+32

generates the following assembly

movl    $2, %eax
addl    %eax, 32(%rdi)

However, x64 allows the following encoding

addl    $2, 32(%rdi)

I tried to fix that, by:

  1. Change the src2 of AluRM from Gpr to GprMemImm,
  2. Add the corresponding encoding.
  3. Change the alu_rm constructor to take GprMemImm
  4. Change the x64_add_mem&co constructors to take GprMemImm.

This is a bit stupid since AluRM already takes a memory operand, so there is no way to encode the Mem part of GprMemImm. I guess maybe we could introduce RegImm and GprImm types. But that feels wrong and redundant.

Related issue where this first was brought up #1925

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions