Skip to content

Commit

Permalink
wazevo(amd64): support for memory fence (#2111)
Browse files Browse the repository at this point in the history
Signed-off-by: Takeshi Yoneda <[email protected]>
  • Loading branch information
mathetake authored Mar 4, 2024
1 parent e0c7037 commit 272596c
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 4 deletions.
14 changes: 14 additions & 0 deletions internal/engine/wazevo/backend/isa/amd64/instr.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,8 @@ func (i *instruction) String() string {
return fmt.Sprintf("xmmcmov%s %s, %s", cond(i.u1), i.op1.format(true), i.op2.format(true))
case blendvpd:
return fmt.Sprintf("blendvpd %s, %s, %%xmm0", i.op1.format(false), i.op2.format(false))
case mfence:
return "mfence"
default:
panic(fmt.Sprintf("BUG: %d", int(i.kind)))
}
Expand Down Expand Up @@ -754,9 +756,17 @@ const (
// blendvpd is https://www.felixcloutier.com/x86/blendvpd.
blendvpd

// mfence is https://www.felixcloutier.com/x86/mfence
mfence

instrMax
)

func (i *instruction) asMFence() *instruction {
i.kind = mfence
return i
}

func (i *instruction) asIdivRemSequence(execCtx, divisor, tmpGp regalloc.VReg, isDiv, signed, _64 bool) *instruction {
i.kind = idivRemSequence
i.op1 = newOperandReg(execCtx)
Expand Down Expand Up @@ -978,6 +988,8 @@ func (k instructionKind) String() string {
return "xmmCMov"
case idivRemSequence:
return "idivRemSequence"
case mfence:
return "mfence"
default:
panic("BUG")
}
Expand Down Expand Up @@ -2218,6 +2230,7 @@ var defKinds = [instrMax]defKind{
xmmCMov: defKindOp2,
idivRemSequence: defKindDivRem,
blendvpd: defKindNone,
mfence: defKindNone,
}

// String implements fmt.Stringer.
Expand Down Expand Up @@ -2293,6 +2306,7 @@ var useKinds = [instrMax]useKind{
xmmCMov: useKindOp1,
idivRemSequence: useKindDivRem,
blendvpd: useKindBlendvpd,
mfence: useKindNone,
}

func (u useKind) String() string {
Expand Down
6 changes: 6 additions & 0 deletions internal/engine/wazevo/backend/isa/amd64/instr_encoding.go
Original file line number Diff line number Diff line change
Expand Up @@ -1259,6 +1259,12 @@ func (i *instruction) encode(c backend.Compiler) (needsLabelResolution bool) {
}
i.encode(c)

case mfence:
// https://www.felixcloutier.com/x86/mfence
c.EmitByte(0x0f)
c.EmitByte(0xae)
c.EmitByte(0xf0)

default:
panic(fmt.Sprintf("TODO: %v", i.kind))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4046,6 +4046,11 @@ func TestInstruction_format_encode(t *testing.T) {
want: "66440f3815f9",
wantFormat: "blendvpd %xmm1, %xmm15, %xmm0",
},
{
setup: func(i *instruction) { i.asMFence() },
want: "0faef0",
wantFormat: "mfence",
},
} {
tc := tc
t.Run(tc.wantFormat, func(t *testing.T) {
Expand Down
3 changes: 3 additions & 0 deletions internal/engine/wazevo/backend/isa/amd64/machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,9 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) {
}
m.insert(load)

case ssa.OpcodeFence:
m.insert(m.allocateInstr().asMFence())

default:
panic("TODO: lowering " + op.String())
}
Expand Down
7 changes: 3 additions & 4 deletions internal/engine/wazevo/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -842,10 +842,9 @@ func TestE2E(t *testing.T) {
},
},
{
name: "atomic_fence",
m: testcases.AtomicFence.Module,
features: api.CoreFeaturesV2 | experimental.CoreFeaturesThreads,
skipAMD64: true,
name: "atomic_fence",
m: testcases.AtomicFence.Module,
features: api.CoreFeaturesV2 | experimental.CoreFeaturesThreads,
calls: []callCase{
{params: []uint64{}, expResults: []uint64{}},
},
Expand Down

0 comments on commit 272596c

Please sign in to comment.