blob: 430e23814d4ef956b141431b3ac9c3fca5c220fb [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// Copyright 2014 the V8 project authors. All rights reserved. Use of this
2// source code is governed by a BSD-style license that can be found in the
3// LICENSE file.
4
Ben Murdochc5610432016-08-08 18:44:38 +01005#include "src/wasm/wasm-external-refs.h"
Ben Murdochda12d292016-06-02 14:46:10 +01006#include "test/cctest/cctest.h"
7#include "test/cctest/compiler/codegen-tester.h"
8#include "test/cctest/compiler/value-helper.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
Ben Murdochc5610432016-08-08 18:44:38 +010014template <typename P>
15void TestExternalReference(BufferedRawMachineAssemblerTester<int32_t>* m,
16 ExternalReference ref, void (*comparison)(P*),
17 P param) {
18 P comparison_param = param;
Ben Murdochda12d292016-06-02 14:46:10 +010019
20 Node* function = m->ExternalConstant(ref);
21 m->CallCFunction1(MachineType::Pointer(), MachineType::Pointer(), function,
Ben Murdochc5610432016-08-08 18:44:38 +010022 m->PointerConstant(&param));
Ben Murdochda12d292016-06-02 14:46:10 +010023 m->Return(m->Int32Constant(4356));
Ben Murdochc5610432016-08-08 18:44:38 +010024
25 m->Call();
26 comparison(&comparison_param);
27
28 CHECK_EQ(comparison_param, param);
29}
30
31template <typename P1, typename P2>
32void TestExternalReference(BufferedRawMachineAssemblerTester<int32_t>* m,
33 ExternalReference ref, void (*comparison)(P1*, P2*),
34 P1 param1, P2 param2) {
35 P1 comparison_param1 = param1;
36 P2 comparison_param2 = param2;
37
38 Node* function = m->ExternalConstant(ref);
39 m->CallCFunction2(MachineType::Pointer(), MachineType::Pointer(),
40 MachineType::Pointer(), function,
41 m->PointerConstant(&param1), m->PointerConstant(&param2));
42 m->Return(m->Int32Constant(4356));
43
44 m->Call();
45 comparison(&comparison_param1, &comparison_param2);
46
47 CHECK_EQ(comparison_param1, param1);
48 CHECK_EQ(comparison_param2, param2);
49}
50
51template <typename R, typename P>
52void TestExternalReference(BufferedRawMachineAssemblerTester<R>* m,
53 ExternalReference ref, R (*comparison)(P*),
54 P param) {
55 P comparison_param = param;
56
57 Node* function = m->ExternalConstant(ref);
58 m->Return(m->CallCFunction1(MachineType::Pointer(), MachineType::Pointer(),
59 function, m->PointerConstant(&param)));
60
61 CHECK_EQ(comparison(&comparison_param), m->Call());
62
63 CHECK_EQ(comparison_param, param);
64}
65
66template <typename R, typename P1, typename P2>
67void TestExternalReference(BufferedRawMachineAssemblerTester<R>* m,
68 ExternalReference ref, R (*comparison)(P1*, P2*),
69 P1 param1, P2 param2) {
70 P1 comparison_param1 = param1;
71 P2 comparison_param2 = param2;
72
73 Node* function = m->ExternalConstant(ref);
74 m->Return(m->CallCFunction2(
75 MachineType::Pointer(), MachineType::Pointer(), MachineType::Pointer(),
76 function, m->PointerConstant(&param1), m->PointerConstant(&param2)));
77
78 CHECK_EQ(comparison(&comparison_param1, &comparison_param2), m->Call());
79
80 CHECK_EQ(comparison_param1, param1);
81 CHECK_EQ(comparison_param2, param2);
Ben Murdochda12d292016-06-02 14:46:10 +010082}
83
84TEST(RunCallF32Trunc) {
85 BufferedRawMachineAssemblerTester<int32_t> m;
86 ExternalReference ref = ExternalReference::wasm_f32_trunc(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +010087 TestExternalReference(&m, ref, wasm::f32_trunc_wrapper, 1.25f);
Ben Murdochda12d292016-06-02 14:46:10 +010088}
89
90TEST(RunCallF32Floor) {
91 BufferedRawMachineAssemblerTester<int32_t> m;
92 ExternalReference ref = ExternalReference::wasm_f32_floor(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +010093 TestExternalReference(&m, ref, wasm::f32_floor_wrapper, 1.25f);
Ben Murdochda12d292016-06-02 14:46:10 +010094}
95
96TEST(RunCallF32Ceil) {
97 BufferedRawMachineAssemblerTester<int32_t> m;
98 ExternalReference ref = ExternalReference::wasm_f32_ceil(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +010099 TestExternalReference(&m, ref, wasm::f32_ceil_wrapper, 1.25f);
Ben Murdochda12d292016-06-02 14:46:10 +0100100}
101
102TEST(RunCallF32RoundTiesEven) {
103 BufferedRawMachineAssemblerTester<int32_t> m;
104 ExternalReference ref = ExternalReference::wasm_f32_nearest_int(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100105 TestExternalReference(&m, ref, wasm::f32_nearest_int_wrapper, 1.25f);
Ben Murdochda12d292016-06-02 14:46:10 +0100106}
107
108TEST(RunCallF64Trunc) {
109 BufferedRawMachineAssemblerTester<int32_t> m;
110 ExternalReference ref = ExternalReference::wasm_f64_trunc(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100111 TestExternalReference(&m, ref, wasm::f64_trunc_wrapper, 1.25);
Ben Murdochda12d292016-06-02 14:46:10 +0100112}
113
114TEST(RunCallF64Floor) {
115 BufferedRawMachineAssemblerTester<int32_t> m;
116 ExternalReference ref = ExternalReference::wasm_f64_floor(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100117 TestExternalReference(&m, ref, wasm::f64_floor_wrapper, 1.25);
Ben Murdochda12d292016-06-02 14:46:10 +0100118}
119
120TEST(RunCallF64Ceil) {
121 BufferedRawMachineAssemblerTester<int32_t> m;
122 ExternalReference ref = ExternalReference::wasm_f64_ceil(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100123 TestExternalReference(&m, ref, wasm::f64_ceil_wrapper, 1.25);
Ben Murdochda12d292016-06-02 14:46:10 +0100124}
125
126TEST(RunCallF64RoundTiesEven) {
127 BufferedRawMachineAssemblerTester<int32_t> m;
128 ExternalReference ref = ExternalReference::wasm_f64_nearest_int(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100129 TestExternalReference(&m, ref, wasm::f64_nearest_int_wrapper, 1.25);
Ben Murdochda12d292016-06-02 14:46:10 +0100130}
131
132TEST(RunCallInt64ToFloat32) {
133 BufferedRawMachineAssemblerTester<int32_t> m;
134 ExternalReference ref = ExternalReference::wasm_int64_to_float32(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100135 TestExternalReference(&m, ref, wasm::int64_to_float32_wrapper, int64_t(-2124),
136 1.25f);
Ben Murdochda12d292016-06-02 14:46:10 +0100137}
138
139TEST(RunCallUint64ToFloat32) {
Ben Murdochda12d292016-06-02 14:46:10 +0100140 BufferedRawMachineAssemblerTester<int32_t> m;
141 ExternalReference ref =
142 ExternalReference::wasm_uint64_to_float32(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100143 TestExternalReference(&m, ref, wasm::uint64_to_float32_wrapper,
144 uint64_t(2124), 1.25f);
Ben Murdochda12d292016-06-02 14:46:10 +0100145}
146
147TEST(RunCallInt64ToFloat64) {
148 BufferedRawMachineAssemblerTester<int32_t> m;
149 ExternalReference ref = ExternalReference::wasm_int64_to_float64(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100150 TestExternalReference(&m, ref, wasm::int64_to_float64_wrapper, int64_t(2124),
151 1.25);
Ben Murdochda12d292016-06-02 14:46:10 +0100152}
153
154TEST(RunCallUint64ToFloat64) {
Ben Murdochda12d292016-06-02 14:46:10 +0100155 BufferedRawMachineAssemblerTester<int32_t> m;
156 ExternalReference ref =
157 ExternalReference::wasm_uint64_to_float64(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100158 TestExternalReference(&m, ref, wasm::uint64_to_float64_wrapper,
159 uint64_t(2124), 1.25);
Ben Murdochda12d292016-06-02 14:46:10 +0100160}
161
162TEST(RunCallFloat32ToInt64) {
163 BufferedRawMachineAssemblerTester<int32_t> m;
164 ExternalReference ref = ExternalReference::wasm_float32_to_int64(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100165 TestExternalReference(&m, ref, wasm::float32_to_int64_wrapper, 1.25f,
166 int64_t(2124));
Ben Murdochda12d292016-06-02 14:46:10 +0100167}
168
169TEST(RunCallFloat32ToUint64) {
170 BufferedRawMachineAssemblerTester<int32_t> m;
171 ExternalReference ref =
172 ExternalReference::wasm_float32_to_uint64(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100173 TestExternalReference(&m, ref, wasm::float32_to_uint64_wrapper, 1.25f,
174 uint64_t(2124));
Ben Murdochda12d292016-06-02 14:46:10 +0100175}
176
177TEST(RunCallFloat64ToInt64) {
178 BufferedRawMachineAssemblerTester<int32_t> m;
179 ExternalReference ref = ExternalReference::wasm_float64_to_int64(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100180 TestExternalReference(&m, ref, wasm::float64_to_int64_wrapper, 1.25,
181 int64_t(2124));
Ben Murdochda12d292016-06-02 14:46:10 +0100182}
183
184TEST(RunCallFloat64ToUint64) {
185 BufferedRawMachineAssemblerTester<int32_t> m;
186 ExternalReference ref =
187 ExternalReference::wasm_float64_to_uint64(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100188 TestExternalReference(&m, ref, wasm::float64_to_uint64_wrapper, 1.25,
189 uint64_t(2124));
Ben Murdochda12d292016-06-02 14:46:10 +0100190}
191
192TEST(RunCallInt64Div) {
193 BufferedRawMachineAssemblerTester<int32_t> m;
194 ExternalReference ref = ExternalReference::wasm_int64_div(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100195 TestExternalReference(&m, ref, wasm::int64_div_wrapper, int64_t(1774),
196 int64_t(21));
Ben Murdochda12d292016-06-02 14:46:10 +0100197}
198
199TEST(RunCallInt64Mod) {
200 BufferedRawMachineAssemblerTester<int32_t> m;
201 ExternalReference ref = ExternalReference::wasm_int64_mod(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100202 TestExternalReference(&m, ref, wasm::int64_mod_wrapper, int64_t(1774),
203 int64_t(21));
Ben Murdochda12d292016-06-02 14:46:10 +0100204}
205
206TEST(RunCallUint64Div) {
207 BufferedRawMachineAssemblerTester<int32_t> m;
208 ExternalReference ref = ExternalReference::wasm_uint64_div(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100209 TestExternalReference(&m, ref, wasm::uint64_div_wrapper, uint64_t(1774),
210 uint64_t(21));
Ben Murdochda12d292016-06-02 14:46:10 +0100211}
212
213TEST(RunCallUint64Mod) {
214 BufferedRawMachineAssemblerTester<int32_t> m;
215 ExternalReference ref = ExternalReference::wasm_uint64_mod(m.isolate());
Ben Murdochc5610432016-08-08 18:44:38 +0100216 TestExternalReference(&m, ref, wasm::uint64_mod_wrapper, uint64_t(1774),
217 uint64_t(21));
218}
Ben Murdochda12d292016-06-02 14:46:10 +0100219
Ben Murdochc5610432016-08-08 18:44:38 +0100220TEST(RunCallWord32Ctz) {
221 BufferedRawMachineAssemblerTester<uint32_t> m;
222 ExternalReference ref = ExternalReference::wasm_word32_ctz(m.isolate());
223 TestExternalReference(&m, ref, wasm::word32_ctz_wrapper, uint32_t(1774));
224}
Ben Murdochda12d292016-06-02 14:46:10 +0100225
Ben Murdochc5610432016-08-08 18:44:38 +0100226TEST(RunCallWord64Ctz) {
227 BufferedRawMachineAssemblerTester<uint32_t> m;
228 ExternalReference ref = ExternalReference::wasm_word64_ctz(m.isolate());
229 TestExternalReference(&m, ref, wasm::word64_ctz_wrapper, uint64_t(1774));
230}
231
232TEST(RunCallWord32Popcnt) {
233 BufferedRawMachineAssemblerTester<uint32_t> m;
234 ExternalReference ref = ExternalReference::wasm_word32_popcnt(m.isolate());
235 TestExternalReference(&m, ref, wasm::word32_popcnt_wrapper, uint32_t(1774));
236}
237
238TEST(RunCallWord64Popcnt) {
239 BufferedRawMachineAssemblerTester<uint32_t> m;
240 ExternalReference ref = ExternalReference::wasm_word64_popcnt(m.isolate());
241 TestExternalReference(&m, ref, wasm::word64_popcnt_wrapper, uint64_t(1774));
Ben Murdochda12d292016-06-02 14:46:10 +0100242}
243} // namespace compiler
244} // namespace internal
245} // namespace v8