...
1 package compiler
2
3 import (
4 "testing"
5
6 "github.com/tetratelabs/wazero/internal/asm"
7 "github.com/tetratelabs/wazero/internal/testing/require"
8 "github.com/tetratelabs/wazero/internal/wasm"
9 "github.com/tetratelabs/wazero/internal/wazeroir"
10 )
11
12
13
14 func TestCompiler_conditional_value_saving(t *testing.T) {
15 env := newCompilerEnvironment()
16 compiler := env.requireNewCompiler(t, &wasm.FunctionType{}, newCompiler, nil)
17 err := compiler.compilePreamble()
18 require.NoError(t, err)
19
20
21 err = compiler.compileConstF32(operationPtr(wazeroir.NewOperationConstF32(1.0)))
22 require.NoError(t, err)
23
24
25 for i := 0; i < len(unreservedGeneralPurposeRegisters); i++ {
26 err = compiler.compileConstI32(operationPtr(wazeroir.NewOperationConstI32(100)))
27 require.NoError(t, err)
28 }
29
30
31
32 err = compiler.compilePick(operationPtr(wazeroir.NewOperationPick(int(compiler.runtimeValueLocationStack().sp-1-callFrameDataSizeInUint64), false)))
33
34 require.NoError(t, err)
35 err = compiler.compilePick(operationPtr(wazeroir.NewOperationPick(int(compiler.runtimeValueLocationStack().sp-1-callFrameDataSizeInUint64), false)))
36
37 require.NoError(t, err)
38
39 err = compiler.compileLe(operationPtr(wazeroir.NewOperationLe(wazeroir.SignedTypeFloat32)))
40 require.NoError(t, err)
41
42
43 l := compiler.runtimeValueLocationStack().peek()
44 require.True(t, l.onConditionalRegister())
45
46
47 _, ok := compiler.runtimeValueLocationStack().takeFreeRegister(registerTypeGeneralPurpose)
48 require.False(t, ok)
49
50
51 err = compiler.compileAdd(operationPtr(wazeroir.NewOperationAdd(wazeroir.UnsignedTypeI32)))
52 require.NoError(t, err)
53
54 err = compiler.compileReturnFunction()
55 require.NoError(t, err)
56
57 code := asm.CodeSegment{}
58 defer func() { require.NoError(t, code.Unmap()) }()
59
60
61 _, err = compiler.compile(code.NextCodeSection())
62 require.NoError(t, err)
63 env.exec(code.Bytes())
64
65
66 require.Equal(t, uint32(101), env.stackTopAsUint32())
67 }
68
View as plain text