Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Side by Side Diff: runtime/vm/assembler_ia32_test.cc

Issue 12260026: Add support for object pool (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/assembler_ia32.h ('k') | runtime/vm/assembler_mips.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_IA32) 6 #if defined(TARGET_ARCH_IA32)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/os.h" 9 #include "vm/os.h"
10 #include "vm/unit_test.h" 10 #include "vm/unit_test.h"
11 #include "vm/virtual_memory.h" 11 #include "vm/virtual_memory.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 #define __ assembler-> 15 #define __ assembler->
16 16
17 17
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
19 __ movl(EAX, Immediate(42)); 19 __ movl(EAX, Immediate(42));
20 __ ret(); 20 __ ret();
21 } 21 }
22 22
23 23
24 ASSEMBLER_TEST_RUN(Simple, entry) { 24 ASSEMBLER_TEST_RUN(Simple, test) {
25 typedef int (*SimpleCode)(); 25 typedef int (*SimpleCode)();
26 EXPECT_EQ(42, reinterpret_cast<SimpleCode>(entry)()); 26 EXPECT_EQ(42, reinterpret_cast<SimpleCode>(test->entry())());
27 } 27 }
28 28
29 29
30 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) { 30 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) {
31 __ movl(EAX, Address(ESP, kWordSize)); 31 __ movl(EAX, Address(ESP, kWordSize));
32 __ ret(); 32 __ ret();
33 } 33 }
34 34
35 35
36 ASSEMBLER_TEST_RUN(ReadArgument, entry) { 36 ASSEMBLER_TEST_RUN(ReadArgument, test) {
37 typedef int (*ReadArgumentCode)(int n); 37 typedef int (*ReadArgumentCode)(int n);
38 EXPECT_EQ(42, reinterpret_cast<ReadArgumentCode>(entry)(42)); 38 EXPECT_EQ(42, reinterpret_cast<ReadArgumentCode>(test->entry())(42));
39 EXPECT_EQ(87, reinterpret_cast<ReadArgumentCode>(entry)(87)); 39 EXPECT_EQ(87, reinterpret_cast<ReadArgumentCode>(test->entry())(87));
40 } 40 }
41 41
42 42
43 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) { 43 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) {
44 __ movl(EAX, Address(ESP, 0)); 44 __ movl(EAX, Address(ESP, 0));
45 __ movl(EAX, Address(EBP, 0)); 45 __ movl(EAX, Address(EBP, 0));
46 __ movl(EAX, Address(EAX, 0)); 46 __ movl(EAX, Address(EAX, 0));
47 47
48 __ movl(EAX, Address(ESP, kWordSize)); 48 __ movl(EAX, Address(ESP, kWordSize));
49 __ movl(EAX, Address(EBP, kWordSize)); 49 __ movl(EAX, Address(EBP, kWordSize));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 91
92 __ movl(EAX, Address(EAX, EBP, TIMES_2, 256 * kWordSize)); 92 __ movl(EAX, Address(EAX, EBP, TIMES_2, 256 * kWordSize));
93 __ movl(EAX, Address(EAX, EAX, TIMES_2, 256 * kWordSize)); 93 __ movl(EAX, Address(EAX, EAX, TIMES_2, 256 * kWordSize));
94 __ movl(EAX, Address(EBP, EBP, TIMES_2, 256 * kWordSize)); 94 __ movl(EAX, Address(EBP, EBP, TIMES_2, 256 * kWordSize));
95 __ movl(EAX, Address(EBP, EAX, TIMES_2, 256 * kWordSize)); 95 __ movl(EAX, Address(EBP, EAX, TIMES_2, 256 * kWordSize));
96 __ movl(EAX, Address(ESP, EBP, TIMES_2, 256 * kWordSize)); 96 __ movl(EAX, Address(ESP, EBP, TIMES_2, 256 * kWordSize));
97 __ movl(EAX, Address(ESP, EAX, TIMES_2, 256 * kWordSize)); 97 __ movl(EAX, Address(ESP, EAX, TIMES_2, 256 * kWordSize));
98 } 98 }
99 99
100 100
101 ASSEMBLER_TEST_RUN(AddressingModes, entry) { 101 ASSEMBLER_TEST_RUN(AddressingModes, test) {
102 // Avoid running the code since it is constructed to lead to crashes. 102 // Avoid running the code since it is constructed to lead to crashes.
103 } 103 }
104 104
105 105
106 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { 106 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) {
107 Label done; 107 Label done;
108 // Make sure all the condition jumps work. 108 // Make sure all the condition jumps work.
109 for (Condition condition = OVERFLOW; 109 for (Condition condition = OVERFLOW;
110 condition <= GREATER; 110 condition <= GREATER;
111 condition = static_cast<Condition>(condition + 1)) { 111 condition = static_cast<Condition>(condition + 1)) {
112 __ j(condition, &done); 112 __ j(condition, &done);
113 } 113 }
114 // This isn't strictly necessary, but we do an unconditional 114 // This isn't strictly necessary, but we do an unconditional
115 // jump around the crashing code anyway. 115 // jump around the crashing code anyway.
116 __ jmp(&done); 116 __ jmp(&done);
117 117
118 // Be sure to skip this crashing code. 118 // Be sure to skip this crashing code.
119 __ movl(EAX, Immediate(0)); 119 __ movl(EAX, Immediate(0));
120 __ movl(Address(EAX, 0), EAX); 120 __ movl(Address(EAX, 0), EAX);
121 121
122 __ Bind(&done); 122 __ Bind(&done);
123 __ ret(); 123 __ ret();
124 } 124 }
125 125
126 126
127 ASSEMBLER_TEST_RUN(JumpAroundCrash, entry) { 127 ASSEMBLER_TEST_RUN(JumpAroundCrash, test) {
128 Instr* instr = Instr::At(entry); 128 Instr* instr = Instr::At(test->entry());
129 EXPECT(!instr->IsBreakPoint()); 129 EXPECT(!instr->IsBreakPoint());
130 typedef void (*JumpAroundCrashCode)(); 130 typedef void (*JumpAroundCrashCode)();
131 reinterpret_cast<JumpAroundCrashCode>(entry)(); 131 reinterpret_cast<JumpAroundCrashCode>(test->entry())();
132 } 132 }
133 133
134 134
135 ASSEMBLER_TEST_GENERATE(NearJumpAroundCrash, assembler) { 135 ASSEMBLER_TEST_GENERATE(NearJumpAroundCrash, assembler) {
136 Label done; 136 Label done;
137 // Make sure all the condition jumps work. 137 // Make sure all the condition jumps work.
138 for (Condition condition = OVERFLOW; 138 for (Condition condition = OVERFLOW;
139 condition <= GREATER; 139 condition <= GREATER;
140 condition = static_cast<Condition>(condition + 1)) { 140 condition = static_cast<Condition>(condition + 1)) {
141 __ j(condition, &done, Assembler::kNearJump); 141 __ j(condition, &done, Assembler::kNearJump);
142 } 142 }
143 // This isn't strictly necessary, but we do an unconditional 143 // This isn't strictly necessary, but we do an unconditional
144 // jump around the crashing code anyway. 144 // jump around the crashing code anyway.
145 __ jmp(&done, Assembler::kNearJump); 145 __ jmp(&done, Assembler::kNearJump);
146 146
147 // Be sure to skip this crashing code. 147 // Be sure to skip this crashing code.
148 __ movl(EAX, Immediate(0)); 148 __ movl(EAX, Immediate(0));
149 __ movl(Address(EAX, 0), EAX); 149 __ movl(Address(EAX, 0), EAX);
150 150
151 __ Bind(&done); 151 __ Bind(&done);
152 __ ret(); 152 __ ret();
153 } 153 }
154 154
155 155
156 ASSEMBLER_TEST_RUN(NearJumpAroundCrash, entry) { 156 ASSEMBLER_TEST_RUN(NearJumpAroundCrash, test) {
157 typedef void (*NearJumpAroundCrashCode)(); 157 typedef void (*NearJumpAroundCrashCode)();
158 reinterpret_cast<NearJumpAroundCrashCode>(entry)(); 158 reinterpret_cast<NearJumpAroundCrashCode>(test->entry())();
159 } 159 }
160 160
161 161
162 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) { 162 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) {
163 __ movl(EAX, Immediate(0)); 163 __ movl(EAX, Immediate(0));
164 __ movl(ECX, Immediate(0)); 164 __ movl(ECX, Immediate(0));
165 Label loop; 165 Label loop;
166 __ Bind(&loop); 166 __ Bind(&loop);
167 __ addl(EAX, Immediate(2)); 167 __ addl(EAX, Immediate(2));
168 __ incl(ECX); 168 __ incl(ECX);
169 __ cmpl(ECX, Immediate(87)); 169 __ cmpl(ECX, Immediate(87));
170 __ j(LESS, &loop); 170 __ j(LESS, &loop);
171 __ ret(); 171 __ ret();
172 } 172 }
173 173
174 174
175 ASSEMBLER_TEST_RUN(SimpleLoop, entry) { 175 ASSEMBLER_TEST_RUN(SimpleLoop, test) {
176 typedef int (*SimpleLoopCode)(); 176 typedef int (*SimpleLoopCode)();
177 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(entry)()); 177 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(test->entry())());
178 } 178 }
179 179
180 180
181 ASSEMBLER_TEST_GENERATE(Increment, assembler) { 181 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
182 __ movl(EAX, Immediate(0)); 182 __ movl(EAX, Immediate(0));
183 __ pushl(EAX); 183 __ pushl(EAX);
184 __ incl(Address(ESP, 0)); 184 __ incl(Address(ESP, 0));
185 __ movl(ECX, Address(ESP, 0)); 185 __ movl(ECX, Address(ESP, 0));
186 __ incl(ECX); 186 __ incl(ECX);
187 __ popl(EAX); 187 __ popl(EAX);
188 __ movl(EAX, ECX); 188 __ movl(EAX, ECX);
189 __ ret(); 189 __ ret();
190 } 190 }
191 191
192 192
193 ASSEMBLER_TEST_RUN(Increment, entry) { 193 ASSEMBLER_TEST_RUN(Increment, test) {
194 typedef int (*IncrementCode)(); 194 typedef int (*IncrementCode)();
195 EXPECT_EQ(2, reinterpret_cast<IncrementCode>(entry)()); 195 EXPECT_EQ(2, reinterpret_cast<IncrementCode>(test->entry())());
196 } 196 }
197 197
198 198
199 ASSEMBLER_TEST_GENERATE(Decrement, assembler) { 199 ASSEMBLER_TEST_GENERATE(Decrement, assembler) {
200 __ movl(EAX, Immediate(2)); 200 __ movl(EAX, Immediate(2));
201 __ pushl(EAX); 201 __ pushl(EAX);
202 __ decl(Address(ESP, 0)); 202 __ decl(Address(ESP, 0));
203 __ movl(ECX, Address(ESP, 0)); 203 __ movl(ECX, Address(ESP, 0));
204 __ decl(ECX); 204 __ decl(ECX);
205 __ popl(EAX); 205 __ popl(EAX);
206 __ movl(EAX, ECX); 206 __ movl(EAX, ECX);
207 __ ret(); 207 __ ret();
208 } 208 }
209 209
210 210
211 ASSEMBLER_TEST_RUN(Decrement, entry) { 211 ASSEMBLER_TEST_RUN(Decrement, test) {
212 typedef int (*DecrementCode)(); 212 typedef int (*DecrementCode)();
213 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(entry)()); 213 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(test->entry())());
214 } 214 }
215 215
216 216
217 ASSEMBLER_TEST_GENERATE(AddressBinOp, assembler) { 217 ASSEMBLER_TEST_GENERATE(AddressBinOp, assembler) {
218 __ movl(EAX, Address(ESP, kWordSize)); 218 __ movl(EAX, Address(ESP, kWordSize));
219 __ addl(EAX, Address(ESP, kWordSize)); 219 __ addl(EAX, Address(ESP, kWordSize));
220 __ incl(EAX); 220 __ incl(EAX);
221 __ subl(EAX, Address(ESP, kWordSize)); 221 __ subl(EAX, Address(ESP, kWordSize));
222 __ imull(EAX, Address(ESP, kWordSize)); 222 __ imull(EAX, Address(ESP, kWordSize));
223 __ ret(); 223 __ ret();
224 } 224 }
225 225
226 226
227 ASSEMBLER_TEST_RUN(AddressBinOp, entry) { 227 ASSEMBLER_TEST_RUN(AddressBinOp, test) {
228 typedef int (*AddressBinOpCode)(int a); 228 typedef int (*AddressBinOpCode)(int a);
229 EXPECT_EQ((2 + 2 + 1 - 2) * 2, reinterpret_cast<AddressBinOpCode>(entry)(2)); 229 EXPECT_EQ((2 + 2 + 1 - 2) * 2,
230 reinterpret_cast<AddressBinOpCode>(test->entry())(2));
230 } 231 }
231 232
232 233
233 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) { 234 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) {
234 __ movl(EAX, Immediate(2)); 235 __ movl(EAX, Immediate(2));
235 __ movl(ECX, Immediate(4)); 236 __ movl(ECX, Immediate(4));
236 __ imull(EAX, ECX); 237 __ imull(EAX, ECX);
237 __ imull(EAX, Immediate(1000)); 238 __ imull(EAX, Immediate(1000));
238 __ ret(); 239 __ ret();
239 } 240 }
240 241
241 242
242 ASSEMBLER_TEST_RUN(SignedMultiply, entry) { 243 ASSEMBLER_TEST_RUN(SignedMultiply, test) {
243 typedef int (*SignedMultiply)(); 244 typedef int (*SignedMultiply)();
244 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(entry)()); 245 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(test->entry())());
245 } 246 }
246 247
247 248
248 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) { 249 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) {
249 __ movl(EDX, Immediate(0)); 250 __ movl(EDX, Immediate(0));
250 __ movl(EAX, Immediate(0x0fffffff)); 251 __ movl(EAX, Immediate(0x0fffffff));
251 __ movl(ECX, Immediate(0x0fffffff)); 252 __ movl(ECX, Immediate(0x0fffffff));
252 __ imull(EAX, ECX); 253 __ imull(EAX, ECX);
253 __ imull(EAX, EDX); 254 __ imull(EAX, EDX);
254 __ ret(); 255 __ ret();
255 } 256 }
256 257
257 258
258 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, entry) { 259 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, test) {
259 typedef int (*OverflowSignedMultiply)(); 260 typedef int (*OverflowSignedMultiply)();
260 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(entry)()); 261 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())());
261 } 262 }
262 263
263 264
264 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) { 265 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) {
265 __ pushl(EBX); // preserve EBX. 266 __ pushl(EBX); // preserve EBX.
266 __ movl(EBX, Immediate(2)); 267 __ movl(EBX, Immediate(2));
267 __ movl(ECX, Immediate(4)); 268 __ movl(ECX, Immediate(4));
268 __ imull(EBX, ECX); 269 __ imull(EBX, ECX);
269 __ imull(EBX, Immediate(1000)); 270 __ imull(EBX, Immediate(1000));
270 __ movl(EAX, EBX); 271 __ movl(EAX, EBX);
271 __ popl(EBX); // restore EBX. 272 __ popl(EBX); // restore EBX.
272 __ ret(); 273 __ ret();
273 } 274 }
274 275
275 276
276 ASSEMBLER_TEST_RUN(SignedMultiply1, entry) { 277 ASSEMBLER_TEST_RUN(SignedMultiply1, test) {
277 typedef int (*SignedMultiply1)(); 278 typedef int (*SignedMultiply1)();
278 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(entry)()); 279 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(test->entry())());
279 } 280 }
280 281
281 282
282 ASSEMBLER_TEST_GENERATE(Negate, assembler) { 283 ASSEMBLER_TEST_GENERATE(Negate, assembler) {
283 __ movl(ECX, Immediate(42)); 284 __ movl(ECX, Immediate(42));
284 __ negl(ECX); 285 __ negl(ECX);
285 __ movl(EAX, ECX); 286 __ movl(EAX, ECX);
286 __ ret(); 287 __ ret();
287 } 288 }
288 289
289 290
290 ASSEMBLER_TEST_RUN(Negate, entry) { 291 ASSEMBLER_TEST_RUN(Negate, test) {
291 typedef int (*Negate)(); 292 typedef int (*Negate)();
292 EXPECT_EQ(-42, reinterpret_cast<Negate>(entry)()); 293 EXPECT_EQ(-42, reinterpret_cast<Negate>(test->entry())());
293 } 294 }
294 295
295 296
296 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) { 297 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) {
297 __ pushl(EBX); // preserve EBX. 298 __ pushl(EBX); // preserve EBX.
298 __ movl(EDX, Immediate(0x1234ffff)); 299 __ movl(EDX, Immediate(0x1234ffff));
299 __ movzxb(EAX, DL); // EAX = 0xff 300 __ movzxb(EAX, DL); // EAX = 0xff
300 __ movsxw(EBX, EDX); // EBX = -1 301 __ movsxw(EBX, EDX); // EBX = -1
301 __ movzxw(ECX, EDX); // ECX = 0xffff 302 __ movzxw(ECX, EDX); // ECX = 0xffff
302 __ addl(EBX, ECX); 303 __ addl(EBX, ECX);
303 __ addl(EAX, EBX); 304 __ addl(EAX, EBX);
304 __ popl(EBX); // restore EBX. 305 __ popl(EBX); // restore EBX.
305 __ ret(); 306 __ ret();
306 } 307 }
307 308
308 309
309 ASSEMBLER_TEST_RUN(MoveExtend, entry) { 310 ASSEMBLER_TEST_RUN(MoveExtend, test) {
310 typedef int (*MoveExtend)(); 311 typedef int (*MoveExtend)();
311 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(entry)()); 312 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())());
312 } 313 }
313 314
314 315
315 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) { 316 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) {
316 __ pushl(EBX); // preserve EBX. 317 __ pushl(EBX); // preserve EBX.
317 __ movl(EDX, Immediate(0x1234ffff)); 318 __ movl(EDX, Immediate(0x1234ffff));
318 319
319 __ pushl(EDX); 320 __ pushl(EDX);
320 __ movzxb(EAX, Address(ESP, 0)); // EAX = 0xff 321 __ movzxb(EAX, Address(ESP, 0)); // EAX = 0xff
321 __ movsxw(EBX, Address(ESP, 0)); // EBX = -1 322 __ movsxw(EBX, Address(ESP, 0)); // EBX = -1
322 __ movzxw(ECX, Address(ESP, 0)); // ECX = 0xffff 323 __ movzxw(ECX, Address(ESP, 0)); // ECX = 0xffff
323 __ addl(ESP, Immediate(kWordSize)); 324 __ addl(ESP, Immediate(kWordSize));
324 325
325 __ addl(EBX, ECX); 326 __ addl(EBX, ECX);
326 __ addl(EAX, EBX); 327 __ addl(EAX, EBX);
327 __ popl(EBX); // restore EBX. 328 __ popl(EBX); // restore EBX.
328 __ ret(); 329 __ ret();
329 } 330 }
330 331
331 332
332 ASSEMBLER_TEST_RUN(MoveExtendMemory, entry) { 333 ASSEMBLER_TEST_RUN(MoveExtendMemory, test) {
333 typedef int (*MoveExtendMemory)(); 334 typedef int (*MoveExtendMemory)();
334 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtendMemory>(entry)()); 335 EXPECT_EQ(0xff - 1 + 0xffff,
336 reinterpret_cast<MoveExtendMemory>(test->entry())());
335 } 337 }
336 338
337 339
338 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) { 340 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) {
339 __ movl(ECX, Immediate(42)); 341 __ movl(ECX, Immediate(42));
340 __ xorl(ECX, ECX); 342 __ xorl(ECX, ECX);
341 __ orl(ECX, Immediate(256)); 343 __ orl(ECX, Immediate(256));
342 __ movl(EAX, Immediate(4)); 344 __ movl(EAX, Immediate(4));
343 __ orl(ECX, EAX); 345 __ orl(ECX, EAX);
344 __ movl(EAX, Immediate(0xfff0)); 346 __ movl(EAX, Immediate(0xfff0));
345 __ andl(ECX, EAX); 347 __ andl(ECX, EAX);
346 __ movl(EAX, Immediate(1)); 348 __ movl(EAX, Immediate(1));
347 __ orl(ECX, EAX); 349 __ orl(ECX, EAX);
348 __ xorl(ECX, Immediate(0)); 350 __ xorl(ECX, Immediate(0));
349 __ movl(EAX, ECX); 351 __ movl(EAX, ECX);
350 __ ret(); 352 __ ret();
351 } 353 }
352 354
353 355
354 ASSEMBLER_TEST_RUN(Bitwise, entry) { 356 ASSEMBLER_TEST_RUN(Bitwise, test) {
355 typedef int (*Bitwise)(); 357 typedef int (*Bitwise)();
356 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise>(entry)()); 358 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise>(test->entry())());
357 } 359 }
358 360
359 361
360 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) { 362 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) {
361 Label donetest1; 363 Label donetest1;
362 __ movl(EAX, Immediate(4)); 364 __ movl(EAX, Immediate(4));
363 __ andl(EAX, Immediate(2)); 365 __ andl(EAX, Immediate(2));
364 __ cmpl(EAX, Immediate(0)); 366 __ cmpl(EAX, Immediate(0));
365 __ j(EQUAL, &donetest1); 367 __ j(EQUAL, &donetest1);
366 // Be sure to skip this crashing code. 368 // Be sure to skip this crashing code.
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 __ j(EQUAL, &donetest15); 520 __ j(EQUAL, &donetest15);
519 __ int3(); 521 __ int3();
520 __ Bind(&donetest15); 522 __ Bind(&donetest15);
521 __ addl(ESP, Immediate(kWordSize)); 523 __ addl(ESP, Immediate(kWordSize));
522 524
523 __ movl(EAX, Immediate(0)); 525 __ movl(EAX, Immediate(0));
524 __ ret(); 526 __ ret();
525 } 527 }
526 528
527 529
528 ASSEMBLER_TEST_RUN(LogicalOps, entry) { 530 ASSEMBLER_TEST_RUN(LogicalOps, test) {
529 typedef int (*LogicalOpsCode)(); 531 typedef int (*LogicalOpsCode)();
530 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(entry)()); 532 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())());
531 } 533 }
532 534
533 535
534 ASSEMBLER_TEST_GENERATE(LogicalTest, assembler) { 536 ASSEMBLER_TEST_GENERATE(LogicalTest, assembler) {
535 __ pushl(EBX); // save EBX. 537 __ pushl(EBX); // save EBX.
536 Label donetest1; 538 Label donetest1;
537 __ movl(EAX, Immediate(4)); 539 __ movl(EAX, Immediate(4));
538 __ movl(ECX, Immediate(2)); 540 __ movl(ECX, Immediate(2));
539 __ testl(EAX, ECX); 541 __ testl(EAX, ECX);
540 __ j(EQUAL, &donetest1); 542 __ j(EQUAL, &donetest1);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 __ movl(EAX, Immediate(0)); 581 __ movl(EAX, Immediate(0));
580 __ movl(Address(EAX, 0), EAX); 582 __ movl(Address(EAX, 0), EAX);
581 __ Bind(&donetest5); 583 __ Bind(&donetest5);
582 584
583 __ movl(EAX, Immediate(0)); 585 __ movl(EAX, Immediate(0));
584 __ popl(EBX); // restore EBX. 586 __ popl(EBX); // restore EBX.
585 __ ret(); 587 __ ret();
586 } 588 }
587 589
588 590
589 ASSEMBLER_TEST_RUN(LogicalTest, entry) { 591 ASSEMBLER_TEST_RUN(LogicalTest, test) {
590 typedef int (*LogicalTestCode)(); 592 typedef int (*LogicalTestCode)();
591 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(entry)()); 593 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())());
592 } 594 }
593 595
594 596
595 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) { 597 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) {
596 __ movl(EAX, Immediate(0)); 598 __ movl(EAX, Immediate(0));
597 __ pushl(EAX); 599 __ pushl(EAX);
598 __ movl(EAX, Immediate(4)); 600 __ movl(EAX, Immediate(4));
599 __ movl(ECX, Immediate(0)); 601 __ movl(ECX, Immediate(0));
600 __ movl(Address(ESP, 0), EAX); 602 __ movl(Address(ESP, 0), EAX);
601 __ LockCmpxchgl(Address(ESP, 0), ECX); 603 __ LockCmpxchgl(Address(ESP, 0), ECX);
602 __ popl(EAX); 604 __ popl(EAX);
603 __ ret(); 605 __ ret();
604 } 606 }
605 607
606 608
607 ASSEMBLER_TEST_RUN(CompareSwapEQ, entry) { 609 ASSEMBLER_TEST_RUN(CompareSwapEQ, test) {
608 typedef int (*CompareSwapEQCode)(); 610 typedef int (*CompareSwapEQCode)();
609 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(entry)()); 611 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(test->entry())());
610 } 612 }
611 613
612 614
613 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) { 615 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) {
614 __ movl(EAX, Immediate(0)); 616 __ movl(EAX, Immediate(0));
615 __ pushl(EAX); 617 __ pushl(EAX);
616 __ movl(EAX, Immediate(2)); 618 __ movl(EAX, Immediate(2));
617 __ movl(ECX, Immediate(4)); 619 __ movl(ECX, Immediate(4));
618 __ movl(Address(ESP, 0), ECX); 620 __ movl(Address(ESP, 0), ECX);
619 __ LockCmpxchgl(Address(ESP, 0), ECX); 621 __ LockCmpxchgl(Address(ESP, 0), ECX);
620 __ popl(EAX); 622 __ popl(EAX);
621 __ ret(); 623 __ ret();
622 } 624 }
623 625
624 626
625 ASSEMBLER_TEST_RUN(CompareSwapNEQ, entry) { 627 ASSEMBLER_TEST_RUN(CompareSwapNEQ, test) {
626 typedef int (*CompareSwapNEQCode)(); 628 typedef int (*CompareSwapNEQCode)();
627 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(entry)()); 629 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(test->entry())());
628 } 630 }
629 631
630 632
631 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { 633 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) {
632 __ movl(EAX, Immediate(-87)); 634 __ movl(EAX, Immediate(-87));
633 __ movl(EDX, Immediate(123)); 635 __ movl(EDX, Immediate(123));
634 __ cdq(); 636 __ cdq();
635 __ movl(ECX, Immediate(42)); 637 __ movl(ECX, Immediate(42));
636 __ idivl(ECX); 638 __ idivl(ECX);
637 __ ret(); 639 __ ret();
638 } 640 }
639 641
640 642
641 ASSEMBLER_TEST_RUN(SignedDivide, entry) { 643 ASSEMBLER_TEST_RUN(SignedDivide, test) {
642 typedef int (*SignedDivide)(); 644 typedef int (*SignedDivide)();
643 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(entry)()); 645 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())());
644 } 646 }
645 647
646 648
647 ASSEMBLER_TEST_GENERATE(Exchange, assembler) { 649 ASSEMBLER_TEST_GENERATE(Exchange, assembler) {
648 __ movl(EAX, Immediate(123456789)); 650 __ movl(EAX, Immediate(123456789));
649 __ movl(EDX, Immediate(987654321)); 651 __ movl(EDX, Immediate(987654321));
650 __ xchgl(EAX, EDX); 652 __ xchgl(EAX, EDX);
651 __ subl(EAX, EDX); 653 __ subl(EAX, EDX);
652 __ ret(); 654 __ ret();
653 } 655 }
654 656
655 657
656 ASSEMBLER_TEST_RUN(Exchange, entry) { 658 ASSEMBLER_TEST_RUN(Exchange, test) {
657 typedef int (*Exchange)(); 659 typedef int (*Exchange)();
658 EXPECT_EQ(987654321 - 123456789, reinterpret_cast<Exchange>(entry)()); 660 EXPECT_EQ(987654321 - 123456789, reinterpret_cast<Exchange>(test->entry())());
659 } 661 }
660 662
661 663
662 static int ComputeStackSpaceReservation(int needed, int fixed) { 664 static int ComputeStackSpaceReservation(int needed, int fixed) {
663 static const int kFrameAlignment = OS::ActivationFrameAlignment(); 665 static const int kFrameAlignment = OS::ActivationFrameAlignment();
664 return (kFrameAlignment > 0) 666 return (kFrameAlignment > 0)
665 ? Utils::RoundUp(needed + fixed, kFrameAlignment) - fixed 667 ? Utils::RoundUp(needed + fixed, kFrameAlignment) - fixed
666 : needed; 668 : needed;
667 } 669 }
668 670
(...skipping 18 matching lines...) Expand all
687 __ AddImmediate(ESP, Immediate(space)); 689 __ AddImmediate(ESP, Immediate(space));
688 space = ComputeStackSpaceReservation(4, 4); 690 space = ComputeStackSpaceReservation(4, 4);
689 __ AddImmediate(ESP, Immediate(-space)); 691 __ AddImmediate(ESP, Immediate(-space));
690 __ movl(Address(ESP, 0), EAX); 692 __ movl(Address(ESP, 0), EAX);
691 __ call(&call2); 693 __ call(&call2);
692 __ AddImmediate(ESP, Immediate(space)); 694 __ AddImmediate(ESP, Immediate(space));
693 __ ret(); 695 __ ret();
694 } 696 }
695 697
696 698
697 ASSEMBLER_TEST_RUN(CallSimpleLeaf, entry) { 699 ASSEMBLER_TEST_RUN(CallSimpleLeaf, test) {
698 typedef int (*CallSimpleLeafCode)(); 700 typedef int (*CallSimpleLeafCode)();
699 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(entry)()); 701 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(test->entry())());
700 } 702 }
701 703
702 704
703 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) { 705 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) {
704 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42)); 706 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
705 Label L; 707 Label L;
706 int space = ComputeStackSpaceReservation(0, 4); 708 int space = ComputeStackSpaceReservation(0, 4);
707 __ AddImmediate(ESP, Immediate(-space)); 709 __ AddImmediate(ESP, Immediate(-space));
708 __ call(&L); 710 __ call(&L);
709 __ AddImmediate(ESP, Immediate(space)); 711 __ AddImmediate(ESP, Immediate(space));
710 __ ret(); 712 __ ret();
711 __ Bind(&L); 713 __ Bind(&L);
712 __ jmp(&call1); 714 __ jmp(&call1);
713 } 715 }
714 716
715 717
716 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, entry) { 718 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, test) {
717 typedef int (*JumpSimpleLeafCode)(); 719 typedef int (*JumpSimpleLeafCode)();
718 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(entry)()); 720 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(test->entry())());
719 } 721 }
720 722
721 723
722 ASSEMBLER_TEST_GENERATE(JumpConditionalSimpleLeaf, assembler) { 724 ASSEMBLER_TEST_GENERATE(JumpConditionalSimpleLeaf, assembler) {
723 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42)); 725 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
724 Label L; 726 Label L;
725 int space = ComputeStackSpaceReservation(0, 4); 727 int space = ComputeStackSpaceReservation(0, 4);
726 __ AddImmediate(ESP, Immediate(-space)); 728 __ AddImmediate(ESP, Immediate(-space));
727 __ call(&L); 729 __ call(&L);
728 __ AddImmediate(ESP, Immediate(space)); 730 __ AddImmediate(ESP, Immediate(space));
729 __ ret(); 731 __ ret();
730 __ Bind(&L); 732 __ Bind(&L);
731 __ cmpl(EAX, EAX); 733 __ cmpl(EAX, EAX);
732 __ j(EQUAL, &call1); 734 __ j(EQUAL, &call1);
733 __ int3(); 735 __ int3();
734 } 736 }
735 737
736 738
737 ASSEMBLER_TEST_RUN(JumpConditionalSimpleLeaf, entry) { 739 ASSEMBLER_TEST_RUN(JumpConditionalSimpleLeaf, test) {
738 typedef int (*JumpConditionalSimpleLeafCode)(); 740 typedef int (*JumpConditionalSimpleLeafCode)();
739 EXPECT_EQ(42, reinterpret_cast<JumpConditionalSimpleLeafCode>(entry)()); 741 EXPECT_EQ(42,
742 reinterpret_cast<JumpConditionalSimpleLeafCode>(test->entry())());
740 } 743 }
741 744
742 745
743 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { 746 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) {
744 __ movl(EAX, Immediate(bit_cast<int32_t, float>(234.0f))); 747 __ movl(EAX, Immediate(bit_cast<int32_t, float>(234.0f)));
745 __ movd(XMM0, EAX); 748 __ movd(XMM0, EAX);
746 __ movss(XMM1, XMM0); 749 __ movss(XMM1, XMM0);
747 __ movss(XMM2, XMM1); 750 __ movss(XMM2, XMM1);
748 __ movss(XMM3, XMM2); 751 __ movss(XMM3, XMM2);
749 __ movss(XMM4, XMM3); 752 __ movss(XMM4, XMM3);
750 __ movss(XMM5, XMM4); 753 __ movss(XMM5, XMM4);
751 __ movss(XMM6, XMM5); 754 __ movss(XMM6, XMM5);
752 __ movss(XMM7, XMM6); 755 __ movss(XMM7, XMM6);
753 __ pushl(EAX); 756 __ pushl(EAX);
754 __ movl(Address(ESP, 0), Immediate(0)); 757 __ movl(Address(ESP, 0), Immediate(0));
755 __ movss(Address(ESP, 0), XMM7); 758 __ movss(Address(ESP, 0), XMM7);
756 __ flds(Address(ESP, 0)); 759 __ flds(Address(ESP, 0));
757 __ popl(EAX); 760 __ popl(EAX);
758 __ ret(); 761 __ ret();
759 } 762 }
760 763
761 764
762 ASSEMBLER_TEST_RUN(SingleFPMoves, entry) { 765 ASSEMBLER_TEST_RUN(SingleFPMoves, test) {
763 typedef float (*SingleFPMovesCode)(); 766 typedef float (*SingleFPMovesCode)();
764 float res = reinterpret_cast<SingleFPMovesCode>(entry)(); 767 float res = reinterpret_cast<SingleFPMovesCode>(test->entry())();
765 EXPECT_EQ(234.0f, res); 768 EXPECT_EQ(234.0f, res);
766 } 769 }
767 770
768 771
769 772
770 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) { 773 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) {
771 __ pushl(EBX); // preserve EBX. 774 __ pushl(EBX); // preserve EBX.
772 __ pushl(ECX); // preserve ECX. 775 __ pushl(ECX); // preserve ECX.
773 __ movl(EBX, Immediate(bit_cast<int32_t, float>(234.0f))); 776 __ movl(EBX, Immediate(bit_cast<int32_t, float>(234.0f)));
774 __ movd(XMM0, EBX); 777 __ movd(XMM0, EBX);
775 __ movss(XMM1, XMM0); 778 __ movss(XMM1, XMM0);
776 __ movd(ECX, XMM1); 779 __ movd(ECX, XMM1);
777 __ pushl(ECX); 780 __ pushl(ECX);
778 __ flds(Address(ESP, 0)); 781 __ flds(Address(ESP, 0));
779 __ popl(EAX); 782 __ popl(EAX);
780 __ popl(ECX); 783 __ popl(ECX);
781 __ popl(EBX); 784 __ popl(EBX);
782 __ ret(); 785 __ ret();
783 } 786 }
784 787
785 788
786 ASSEMBLER_TEST_RUN(SingleFPMoves2, entry) { 789 ASSEMBLER_TEST_RUN(SingleFPMoves2, test) {
787 typedef float (*SingleFPMoves2Code)(); 790 typedef float (*SingleFPMoves2Code)();
788 float res = reinterpret_cast<SingleFPMoves2Code>(entry)(); 791 float res = reinterpret_cast<SingleFPMoves2Code>(test->entry())();
789 EXPECT_EQ(234.0f, res); 792 EXPECT_EQ(234.0f, res);
790 } 793 }
791 794
792 795
793 ASSEMBLER_TEST_GENERATE(SingleFPUStackMoves, assembler) { 796 ASSEMBLER_TEST_GENERATE(SingleFPUStackMoves, assembler) {
794 __ movl(EAX, Immediate(1131020288)); // 234.0f 797 __ movl(EAX, Immediate(1131020288)); // 234.0f
795 __ pushl(EAX); 798 __ pushl(EAX);
796 __ flds(Address(ESP, 0)); 799 __ flds(Address(ESP, 0));
797 __ xorl(ECX, ECX); 800 __ xorl(ECX, ECX);
798 __ pushl(ECX); 801 __ pushl(ECX);
799 __ fstps(Address(ESP, 0)); 802 __ fstps(Address(ESP, 0));
800 __ popl(EAX); 803 __ popl(EAX);
801 __ popl(ECX); 804 __ popl(ECX);
802 __ ret(); 805 __ ret();
803 } 806 }
804 807
805 808
806 ASSEMBLER_TEST_RUN(SingleFPUStackMoves, entry) { 809 ASSEMBLER_TEST_RUN(SingleFPUStackMoves, test) {
807 typedef int (*SingleFPUStackMovesCode)(); 810 typedef int (*SingleFPUStackMovesCode)();
808 int res = reinterpret_cast<SingleFPUStackMovesCode>(entry)(); 811 int res = reinterpret_cast<SingleFPUStackMovesCode>(test->entry())();
809 EXPECT_EQ(234.0f, (bit_cast<float, int>(res))); 812 EXPECT_EQ(234.0f, (bit_cast<float, int>(res)));
810 } 813 }
811 814
812 815
813 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { 816 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
814 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f))); 817 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f)));
815 __ movd(XMM0, EAX); 818 __ movd(XMM0, EAX);
816 __ movl(EAX, Immediate(bit_cast<int32_t, float>(3.4f))); 819 __ movl(EAX, Immediate(bit_cast<int32_t, float>(3.4f)));
817 __ movd(XMM1, EAX); 820 __ movd(XMM1, EAX);
818 __ addss(XMM0, XMM1); // 15.7f 821 __ addss(XMM0, XMM1); // 15.7f
819 __ mulss(XMM0, XMM1); // 53.38f 822 __ mulss(XMM0, XMM1); // 53.38f
820 __ subss(XMM0, XMM1); // 49.98f 823 __ subss(XMM0, XMM1); // 49.98f
821 __ divss(XMM0, XMM1); // 14.7f 824 __ divss(XMM0, XMM1); // 14.7f
822 __ pushl(EAX); 825 __ pushl(EAX);
823 __ movss(Address(ESP, 0), XMM0); 826 __ movss(Address(ESP, 0), XMM0);
824 __ flds(Address(ESP, 0)); 827 __ flds(Address(ESP, 0));
825 __ popl(EAX); 828 __ popl(EAX);
826 __ ret(); 829 __ ret();
827 } 830 }
828 831
829 832
830 ASSEMBLER_TEST_RUN(SingleFPOperations, entry) { 833 ASSEMBLER_TEST_RUN(SingleFPOperations, test) {
831 typedef float (*SingleFPOperationsCode)(); 834 typedef float (*SingleFPOperationsCode)();
832 float res = reinterpret_cast<SingleFPOperationsCode>(entry)(); 835 float res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
833 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); 836 EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
834 } 837 }
835 838
836 839
837 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) { 840 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) {
838 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f))); 841 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f)));
839 __ movd(XMM0, EAX); 842 __ movd(XMM0, EAX);
840 __ shufps(XMM0, XMM0, Immediate(0x0)); 843 __ shufps(XMM0, XMM0, Immediate(0x0));
841 __ movl(EAX, Immediate(bit_cast<int32_t, float>(3.4f))); 844 __ movl(EAX, Immediate(bit_cast<int32_t, float>(3.4f)));
842 __ movd(XMM1, EAX); 845 __ movd(XMM1, EAX);
843 __ shufps(XMM1, XMM1, Immediate(0x0)); 846 __ shufps(XMM1, XMM1, Immediate(0x0));
844 __ addps(XMM0, XMM1); // 15.7f 847 __ addps(XMM0, XMM1); // 15.7f
845 __ mulps(XMM0, XMM1); // 53.38f 848 __ mulps(XMM0, XMM1); // 53.38f
846 __ subps(XMM0, XMM1); // 49.98f 849 __ subps(XMM0, XMM1); // 49.98f
847 __ divps(XMM0, XMM1); // 14.7f 850 __ divps(XMM0, XMM1); // 14.7f
848 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes. 851 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes.
849 __ pushl(EAX); 852 __ pushl(EAX);
850 // Copy the low lane at ESP. 853 // Copy the low lane at ESP.
851 __ movss(Address(ESP, 0), XMM0); 854 __ movss(Address(ESP, 0), XMM0);
852 __ flds(Address(ESP, 0)); 855 __ flds(Address(ESP, 0));
853 __ popl(EAX); 856 __ popl(EAX);
854 __ ret(); 857 __ ret();
855 } 858 }
856 859
857 860
858 ASSEMBLER_TEST_RUN(PackedFPOperations, entry) { 861 ASSEMBLER_TEST_RUN(PackedFPOperations, test) {
859 typedef float (*PackedFPOperationsCode)(); 862 typedef float (*PackedFPOperationsCode)();
860 float res = reinterpret_cast<PackedFPOperationsCode>(entry)(); 863 float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())();
861 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); 864 EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
862 } 865 }
863 866
864 867
865 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) { 868 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) {
866 __ movl(EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 869 __ movl(EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
867 __ movd(XMM0, EAX); 870 __ movd(XMM0, EAX);
868 __ shufps(XMM0, XMM0, Immediate(0x0)); 871 __ shufps(XMM0, XMM0, Immediate(0x0));
869 872
870 __ movaps(XMM1, XMM0); // Copy XMM0 873 __ movaps(XMM1, XMM0); // Copy XMM0
871 __ reciprocalps(XMM1); // 0.25 874 __ reciprocalps(XMM1); // 0.25
872 __ sqrtps(XMM1); // 0.5 875 __ sqrtps(XMM1); // 0.5
873 __ rsqrtps(XMM0); // ~0.5 876 __ rsqrtps(XMM0); // ~0.5
874 __ subps(XMM0, XMM1); // ~0.0 877 __ subps(XMM0, XMM1); // ~0.0
875 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes. 878 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes.
876 __ pushl(EAX); 879 __ pushl(EAX);
877 // Copy the low lane at ESP. 880 // Copy the low lane at ESP.
878 __ movss(Address(ESP, 0), XMM0); 881 __ movss(Address(ESP, 0), XMM0);
879 __ flds(Address(ESP, 0)); 882 __ flds(Address(ESP, 0));
880 __ popl(EAX); 883 __ popl(EAX);
881 __ ret(); 884 __ ret();
882 } 885 }
883 886
884 887
885 ASSEMBLER_TEST_RUN(PackedFPOperations2, entry) { 888 ASSEMBLER_TEST_RUN(PackedFPOperations2, test) {
886 typedef float (*PackedFPOperations2Code)(); 889 typedef float (*PackedFPOperations2Code)();
887 float res = reinterpret_cast<PackedFPOperations2Code>(entry)(); 890 float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())();
888 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 891 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
889 } 892 }
890 893
891 894
892 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) { 895 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) {
893 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 896 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
894 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 897 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
895 __ cmppseq(XMM0, XMM1); 898 __ cmppseq(XMM0, XMM1);
896 // Copy the low lane at ESP. 899 // Copy the low lane at ESP.
897 __ pushl(EAX); 900 __ pushl(EAX);
898 __ movss(Address(ESP, 0), XMM0); 901 __ movss(Address(ESP, 0), XMM0);
899 __ flds(Address(ESP, 0)); 902 __ flds(Address(ESP, 0));
900 __ popl(EAX); 903 __ popl(EAX);
901 __ ret(); 904 __ ret();
902 } 905 }
903 906
904 907
905 ASSEMBLER_TEST_RUN(PackedCompareEQ, entry) { 908 ASSEMBLER_TEST_RUN(PackedCompareEQ, test) {
906 typedef uint32_t (*PackedCompareEQCode)(); 909 typedef uint32_t (*PackedCompareEQCode)();
907 uint32_t res = reinterpret_cast<PackedCompareEQCode>(entry)(); 910 uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())();
908 EXPECT_EQ(static_cast<uword>(0x0), res); 911 EXPECT_EQ(static_cast<uword>(0x0), res);
909 } 912 }
910 913
911 914
912 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) { 915 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) {
913 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 916 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
914 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 917 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
915 __ cmppsneq(XMM0, XMM1); 918 __ cmppsneq(XMM0, XMM1);
916 // Copy the low lane at ESP. 919 // Copy the low lane at ESP.
917 __ pushl(EAX); 920 __ pushl(EAX);
918 __ movss(Address(ESP, 0), XMM0); 921 __ movss(Address(ESP, 0), XMM0);
919 __ flds(Address(ESP, 0)); 922 __ flds(Address(ESP, 0));
920 __ popl(EAX); 923 __ popl(EAX);
921 __ ret(); 924 __ ret();
922 } 925 }
923 926
924 927
925 ASSEMBLER_TEST_RUN(PackedCompareNEQ, entry) { 928 ASSEMBLER_TEST_RUN(PackedCompareNEQ, test) {
926 typedef uint32_t (*PackedCompareNEQCode)(); 929 typedef uint32_t (*PackedCompareNEQCode)();
927 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(entry)(); 930 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())();
928 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 931 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
929 } 932 }
930 933
931 934
932 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) { 935 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) {
933 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 936 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
934 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 937 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
935 __ cmppslt(XMM0, XMM1); 938 __ cmppslt(XMM0, XMM1);
936 // Copy the low lane at ESP. 939 // Copy the low lane at ESP.
937 __ pushl(EAX); 940 __ pushl(EAX);
938 __ movss(Address(ESP, 0), XMM0); 941 __ movss(Address(ESP, 0), XMM0);
939 __ flds(Address(ESP, 0)); 942 __ flds(Address(ESP, 0));
940 __ popl(EAX); 943 __ popl(EAX);
941 __ ret(); 944 __ ret();
942 } 945 }
943 946
944 947
945 ASSEMBLER_TEST_RUN(PackedCompareLT, entry) { 948 ASSEMBLER_TEST_RUN(PackedCompareLT, test) {
946 typedef uint32_t (*PackedCompareLTCode)(); 949 typedef uint32_t (*PackedCompareLTCode)();
947 uint32_t res = reinterpret_cast<PackedCompareLTCode>(entry)(); 950 uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())();
948 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 951 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
949 } 952 }
950 953
951 954
952 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) { 955 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) {
953 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 956 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
954 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 957 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
955 __ cmppsle(XMM0, XMM1); 958 __ cmppsle(XMM0, XMM1);
956 // Copy the low lane at ESP. 959 // Copy the low lane at ESP.
957 __ pushl(EAX); 960 __ pushl(EAX);
958 __ movss(Address(ESP, 0), XMM0); 961 __ movss(Address(ESP, 0), XMM0);
959 __ flds(Address(ESP, 0)); 962 __ flds(Address(ESP, 0));
960 __ popl(EAX); 963 __ popl(EAX);
961 __ ret(); 964 __ ret();
962 } 965 }
963 966
964 967
965 ASSEMBLER_TEST_RUN(PackedCompareLE, entry) { 968 ASSEMBLER_TEST_RUN(PackedCompareLE, test) {
966 typedef uint32_t (*PackedCompareLECode)(); 969 typedef uint32_t (*PackedCompareLECode)();
967 uint32_t res = reinterpret_cast<PackedCompareLECode>(entry)(); 970 uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())();
968 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 971 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
969 } 972 }
970 973
971 974
972 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) { 975 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) {
973 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 976 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
974 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 977 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
975 __ cmppsnlt(XMM0, XMM1); 978 __ cmppsnlt(XMM0, XMM1);
976 // Copy the low lane at ESP. 979 // Copy the low lane at ESP.
977 __ pushl(EAX); 980 __ pushl(EAX);
978 __ movss(Address(ESP, 0), XMM0); 981 __ movss(Address(ESP, 0), XMM0);
979 __ flds(Address(ESP, 0)); 982 __ flds(Address(ESP, 0));
980 __ popl(EAX); 983 __ popl(EAX);
981 __ ret(); 984 __ ret();
982 } 985 }
983 986
984 987
985 ASSEMBLER_TEST_RUN(PackedCompareNLT, entry) { 988 ASSEMBLER_TEST_RUN(PackedCompareNLT, test) {
986 typedef uint32_t (*PackedCompareNLTCode)(); 989 typedef uint32_t (*PackedCompareNLTCode)();
987 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(entry)(); 990 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())();
988 EXPECT_EQ(static_cast<uword>(0x0), res); 991 EXPECT_EQ(static_cast<uword>(0x0), res);
989 } 992 }
990 993
991 994
992 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) { 995 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) {
993 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 996 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
994 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 997 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
995 __ cmppsnle(XMM0, XMM1); 998 __ cmppsnle(XMM0, XMM1);
996 // Copy the low lane at ESP. 999 // Copy the low lane at ESP.
997 __ pushl(EAX); 1000 __ pushl(EAX);
998 __ movss(Address(ESP, 0), XMM0); 1001 __ movss(Address(ESP, 0), XMM0);
999 __ flds(Address(ESP, 0)); 1002 __ flds(Address(ESP, 0));
1000 __ popl(EAX); 1003 __ popl(EAX);
1001 __ ret(); 1004 __ ret();
1002 } 1005 }
1003 1006
1004 1007
1005 ASSEMBLER_TEST_RUN(PackedCompareNLE, entry) { 1008 ASSEMBLER_TEST_RUN(PackedCompareNLE, test) {
1006 typedef uint32_t (*PackedCompareNLECode)(); 1009 typedef uint32_t (*PackedCompareNLECode)();
1007 uint32_t res = reinterpret_cast<PackedCompareNLECode>(entry)(); 1010 uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())();
1008 EXPECT_EQ(static_cast<uword>(0x0), res); 1011 EXPECT_EQ(static_cast<uword>(0x0), res);
1009 } 1012 }
1010 1013
1011 1014
1012 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) { 1015 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) {
1013 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1016 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1014 __ movd(XMM0, EAX); 1017 __ movd(XMM0, EAX);
1015 __ shufps(XMM0, XMM0, Immediate(0x0)); 1018 __ shufps(XMM0, XMM0, Immediate(0x0));
1016 __ negateps(XMM0); 1019 __ negateps(XMM0);
1017 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. 1020 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes.
1018 __ pushl(EAX); 1021 __ pushl(EAX);
1019 // Copy the low lane at ESP. 1022 // Copy the low lane at ESP.
1020 __ movss(Address(ESP, 0), XMM0); 1023 __ movss(Address(ESP, 0), XMM0);
1021 __ flds(Address(ESP, 0)); 1024 __ flds(Address(ESP, 0));
1022 __ popl(EAX); 1025 __ popl(EAX);
1023 __ ret(); 1026 __ ret();
1024 } 1027 }
1025 1028
1026 1029
1027 ASSEMBLER_TEST_RUN(PackedNegate, entry) { 1030 ASSEMBLER_TEST_RUN(PackedNegate, test) {
1028 typedef float (*PackedNegateCode)(); 1031 typedef float (*PackedNegateCode)();
1029 float res = reinterpret_cast<PackedNegateCode>(entry)(); 1032 float res = reinterpret_cast<PackedNegateCode>(test->entry())();
1030 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f); 1033 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f);
1031 } 1034 }
1032 1035
1033 1036
1034 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) { 1037 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) {
1035 __ movl(EAX, Immediate(bit_cast<int32_t, float>(-15.3f))); 1038 __ movl(EAX, Immediate(bit_cast<int32_t, float>(-15.3f)));
1036 __ movd(XMM0, EAX); 1039 __ movd(XMM0, EAX);
1037 __ shufps(XMM0, XMM0, Immediate(0x0)); 1040 __ shufps(XMM0, XMM0, Immediate(0x0));
1038 __ absps(XMM0); 1041 __ absps(XMM0);
1039 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. 1042 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes.
1040 // Copy the low lane at ESP. 1043 // Copy the low lane at ESP.
1041 __ pushl(EAX); 1044 __ pushl(EAX);
1042 __ movss(Address(ESP, 0), XMM0); 1045 __ movss(Address(ESP, 0), XMM0);
1043 __ flds(Address(ESP, 0)); 1046 __ flds(Address(ESP, 0));
1044 __ popl(EAX); 1047 __ popl(EAX);
1045 __ ret(); 1048 __ ret();
1046 } 1049 }
1047 1050
1048 1051
1049 ASSEMBLER_TEST_RUN(PackedAbsolute, entry) { 1052 ASSEMBLER_TEST_RUN(PackedAbsolute, test) {
1050 typedef float (*PackedAbsoluteCode)(); 1053 typedef float (*PackedAbsoluteCode)();
1051 float res = reinterpret_cast<PackedAbsoluteCode>(entry)(); 1054 float res = reinterpret_cast<PackedAbsoluteCode>(test->entry())();
1052 EXPECT_FLOAT_EQ(15.3f, res, 0.001f); 1055 EXPECT_FLOAT_EQ(15.3f, res, 0.001f);
1053 } 1056 }
1054 1057
1055 1058
1056 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) { 1059 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) {
1057 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1060 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1058 __ zerowps(XMM0); 1061 __ zerowps(XMM0);
1059 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0. 1062 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0.
1060 // Copy the low lane at ESP. 1063 // Copy the low lane at ESP.
1061 __ pushl(EAX); 1064 __ pushl(EAX);
1062 __ movss(Address(ESP, 0), XMM0); 1065 __ movss(Address(ESP, 0), XMM0);
1063 __ flds(Address(ESP, 0)); 1066 __ flds(Address(ESP, 0));
1064 __ popl(EAX); 1067 __ popl(EAX);
1065 __ ret(); 1068 __ ret();
1066 } 1069 }
1067 1070
1068 1071
1069 ASSEMBLER_TEST_RUN(PackedSetWZero, entry) { 1072 ASSEMBLER_TEST_RUN(PackedSetWZero, test) {
1070 typedef float (*PackedSetWZeroCode)(); 1073 typedef float (*PackedSetWZeroCode)();
1071 float res = reinterpret_cast<PackedSetWZeroCode>(entry)(); 1074 float res = reinterpret_cast<PackedSetWZeroCode>(test->entry())();
1072 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 1075 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
1073 } 1076 }
1074 1077
1075 1078
1076 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) { 1079 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) {
1077 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1080 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1078 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1081 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1079 __ minps(XMM0, XMM1); 1082 __ minps(XMM0, XMM1);
1080 // Copy the low lane at ESP. 1083 // Copy the low lane at ESP.
1081 __ pushl(EAX); 1084 __ pushl(EAX);
1082 __ movss(Address(ESP, 0), XMM0); 1085 __ movss(Address(ESP, 0), XMM0);
1083 __ flds(Address(ESP, 0)); 1086 __ flds(Address(ESP, 0));
1084 __ popl(EAX); 1087 __ popl(EAX);
1085 __ ret(); 1088 __ ret();
1086 } 1089 }
1087 1090
1088 1091
1089 ASSEMBLER_TEST_RUN(PackedMin, entry) { 1092 ASSEMBLER_TEST_RUN(PackedMin, test) {
1090 typedef float (*PackedMinCode)(); 1093 typedef float (*PackedMinCode)();
1091 float res = reinterpret_cast<PackedMinCode>(entry)(); 1094 float res = reinterpret_cast<PackedMinCode>(test->entry())();
1092 EXPECT_FLOAT_EQ(2.0f, res, 0.001f); 1095 EXPECT_FLOAT_EQ(2.0f, res, 0.001f);
1093 } 1096 }
1094 1097
1095 1098
1096 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) { 1099 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) {
1097 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1100 __ set1ps(XMM0, EAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1098 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1101 __ set1ps(XMM1, EAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1099 __ maxps(XMM0, XMM1); 1102 __ maxps(XMM0, XMM1);
1100 // Copy the low lane at ESP. 1103 // Copy the low lane at ESP.
1101 __ pushl(EAX); 1104 __ pushl(EAX);
1102 __ movss(Address(ESP, 0), XMM0); 1105 __ movss(Address(ESP, 0), XMM0);
1103 __ flds(Address(ESP, 0)); 1106 __ flds(Address(ESP, 0));
1104 __ popl(EAX); 1107 __ popl(EAX);
1105 __ ret(); 1108 __ ret();
1106 } 1109 }
1107 1110
1108 1111
1109 ASSEMBLER_TEST_RUN(PackedMax, entry) { 1112 ASSEMBLER_TEST_RUN(PackedMax, test) {
1110 typedef float (*PackedMaxCode)(); 1113 typedef float (*PackedMaxCode)();
1111 float res = reinterpret_cast<PackedMaxCode>(entry)(); 1114 float res = reinterpret_cast<PackedMaxCode>(test->entry())();
1112 EXPECT_FLOAT_EQ(4.0f, res, 0.001f); 1115 EXPECT_FLOAT_EQ(4.0f, res, 0.001f);
1113 } 1116 }
1114 1117
1115 1118
1116 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) { 1119 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) {
1117 static const struct ALIGN16 { 1120 static const struct ALIGN16 {
1118 uint32_t a; 1121 uint32_t a;
1119 uint32_t b; 1122 uint32_t b;
1120 uint32_t c; 1123 uint32_t c;
1121 uint32_t d; 1124 uint32_t d;
(...skipping 11 matching lines...) Expand all
1133 __ orps(XMM0, XMM1); 1136 __ orps(XMM0, XMM1);
1134 // Copy the low lane at ESP. 1137 // Copy the low lane at ESP.
1135 __ pushl(EAX); 1138 __ pushl(EAX);
1136 __ movss(Address(ESP, 0), XMM0); 1139 __ movss(Address(ESP, 0), XMM0);
1137 __ flds(Address(ESP, 0)); 1140 __ flds(Address(ESP, 0));
1138 __ popl(EAX); 1141 __ popl(EAX);
1139 __ ret(); 1142 __ ret();
1140 } 1143 }
1141 1144
1142 1145
1143 ASSEMBLER_TEST_RUN(PackedLogicalOr, entry) { 1146 ASSEMBLER_TEST_RUN(PackedLogicalOr, test) {
1144 typedef uint32_t (*PackedLogicalOrCode)(); 1147 typedef uint32_t (*PackedLogicalOrCode)();
1145 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(entry)(); 1148 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())();
1146 EXPECT_EQ(0xFFFFFFFF, res); 1149 EXPECT_EQ(0xFFFFFFFF, res);
1147 } 1150 }
1148 1151
1149 1152
1150 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) { 1153 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) {
1151 static const struct ALIGN16 { 1154 static const struct ALIGN16 {
1152 uint32_t a; 1155 uint32_t a;
1153 uint32_t b; 1156 uint32_t b;
1154 uint32_t c; 1157 uint32_t c;
1155 uint32_t d; 1158 uint32_t d;
(...skipping 10 matching lines...) Expand all
1166 __ andps(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant2))); 1169 __ andps(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant2)));
1167 // Copy the low lane at ESP. 1170 // Copy the low lane at ESP.
1168 __ pushl(EAX); 1171 __ pushl(EAX);
1169 __ movss(Address(ESP, 0), XMM0); 1172 __ movss(Address(ESP, 0), XMM0);
1170 __ flds(Address(ESP, 0)); 1173 __ flds(Address(ESP, 0));
1171 __ popl(EAX); 1174 __ popl(EAX);
1172 __ ret(); 1175 __ ret();
1173 } 1176 }
1174 1177
1175 1178
1176 ASSEMBLER_TEST_RUN(PackedLogicalAnd, entry) { 1179 ASSEMBLER_TEST_RUN(PackedLogicalAnd, test) {
1177 typedef uint32_t (*PackedLogicalAndCode)(); 1180 typedef uint32_t (*PackedLogicalAndCode)();
1178 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(entry)(); 1181 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())();
1179 EXPECT_EQ(static_cast<uword>(0x0000F000), res); 1182 EXPECT_EQ(static_cast<uword>(0x0000F000), res);
1180 } 1183 }
1181 1184
1182 1185
1183 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) { 1186 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) {
1184 static const struct ALIGN16 { 1187 static const struct ALIGN16 {
1185 uint32_t a; 1188 uint32_t a;
1186 uint32_t b; 1189 uint32_t b;
1187 uint32_t c; 1190 uint32_t c;
1188 uint32_t d; 1191 uint32_t d;
1189 } constant1 = 1192 } constant1 =
1190 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 1193 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
1191 __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant1))); 1194 __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant1)));
1192 __ notps(XMM0); 1195 __ notps(XMM0);
1193 // Copy the low lane at ESP. 1196 // Copy the low lane at ESP.
1194 __ pushl(EAX); 1197 __ pushl(EAX);
1195 __ movss(Address(ESP, 0), XMM0); 1198 __ movss(Address(ESP, 0), XMM0);
1196 __ flds(Address(ESP, 0)); 1199 __ flds(Address(ESP, 0));
1197 __ popl(EAX); 1200 __ popl(EAX);
1198 __ ret(); 1201 __ ret();
1199 } 1202 }
1200 1203
1201 1204
1202 ASSEMBLER_TEST_RUN(PackedLogicalNot, entry) { 1205 ASSEMBLER_TEST_RUN(PackedLogicalNot, test) {
1203 typedef uint32_t (*PackedLogicalNotCode)(); 1206 typedef uint32_t (*PackedLogicalNotCode)();
1204 uint32_t res = reinterpret_cast<PackedLogicalNotCode>(entry)(); 1207 uint32_t res = reinterpret_cast<PackedLogicalNotCode>(test->entry())();
1205 EXPECT_EQ(static_cast<uword>(0x0), res); 1208 EXPECT_EQ(static_cast<uword>(0x0), res);
1206 } 1209 }
1207 1210
1208 1211
1209 ASSEMBLER_TEST_GENERATE(SingleFPOperationsStack, assembler) { 1212 ASSEMBLER_TEST_GENERATE(SingleFPOperationsStack, assembler) {
1210 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1213 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1211 __ movd(XMM0, EAX); 1214 __ movd(XMM0, EAX);
1212 __ addss(XMM0, Address(ESP, kWordSize)); // 15.7f 1215 __ addss(XMM0, Address(ESP, kWordSize)); // 15.7f
1213 __ mulss(XMM0, Address(ESP, kWordSize)); // 53.38f 1216 __ mulss(XMM0, Address(ESP, kWordSize)); // 53.38f
1214 __ subss(XMM0, Address(ESP, kWordSize)); // 49.98f 1217 __ subss(XMM0, Address(ESP, kWordSize)); // 49.98f
1215 __ divss(XMM0, Address(ESP, kWordSize)); // 14.7f 1218 __ divss(XMM0, Address(ESP, kWordSize)); // 14.7f
1216 __ pushl(EAX); 1219 __ pushl(EAX);
1217 __ movss(Address(ESP, 0), XMM0); 1220 __ movss(Address(ESP, 0), XMM0);
1218 __ flds(Address(ESP, 0)); 1221 __ flds(Address(ESP, 0));
1219 __ popl(EAX); 1222 __ popl(EAX);
1220 __ ret(); 1223 __ ret();
1221 } 1224 }
1222 1225
1223 1226
1224 ASSEMBLER_TEST_RUN(SingleFPOperationsStack, entry) { 1227 ASSEMBLER_TEST_RUN(SingleFPOperationsStack, test) {
1225 typedef float (*SingleFPOperationsStackCode)(float f); 1228 typedef float (*SingleFPOperationsStackCode)(float f);
1226 float res = reinterpret_cast<SingleFPOperationsStackCode>(entry)(3.4); 1229 float res = reinterpret_cast<SingleFPOperationsStackCode>(test->entry())(3.4);
1227 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); 1230 EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
1228 } 1231 }
1229 1232
1230 1233
1231 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) { 1234 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) {
1232 int64_t l = bit_cast<int64_t, double>(1024.67); 1235 int64_t l = bit_cast<int64_t, double>(1024.67);
1233 __ movl(EAX, Immediate(Utils::High32Bits(l))); 1236 __ movl(EAX, Immediate(Utils::High32Bits(l)));
1234 __ pushl(EAX); 1237 __ pushl(EAX);
1235 __ movl(EAX, Immediate(Utils::Low32Bits(l))); 1238 __ movl(EAX, Immediate(Utils::Low32Bits(l)));
1236 __ pushl(EAX); 1239 __ pushl(EAX);
(...skipping 20 matching lines...) Expand all
1257 __ movl(Address(ESP, 0), Immediate(0)); 1260 __ movl(Address(ESP, 0), Immediate(0));
1258 __ movl(Address(ESP, kWordSize), Immediate(0)); 1261 __ movl(Address(ESP, kWordSize), Immediate(0));
1259 __ movsd(Address(ESP, 0), XMM0); 1262 __ movsd(Address(ESP, 0), XMM0);
1260 __ fldl(Address(ESP, 0)); 1263 __ fldl(Address(ESP, 0));
1261 __ popl(EAX); 1264 __ popl(EAX);
1262 __ popl(EAX); 1265 __ popl(EAX);
1263 __ ret(); 1266 __ ret();
1264 } 1267 }
1265 1268
1266 1269
1267 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) { 1270 ASSEMBLER_TEST_RUN(DoubleFPMoves, test) {
1268 typedef double (*DoubleFPMovesCode)(); 1271 typedef double (*DoubleFPMovesCode)();
1269 double res = reinterpret_cast<DoubleFPMovesCode>(entry)(); 1272 double res = reinterpret_cast<DoubleFPMovesCode>(test->entry())();
1270 EXPECT_FLOAT_EQ(1024.67, res, 0.0001); 1273 EXPECT_FLOAT_EQ(1024.67, res, 0.0001);
1271 } 1274 }
1272 1275
1273 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) { 1276 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) {
1274 int64_t l = bit_cast<int64_t, double>(1024.67); 1277 int64_t l = bit_cast<int64_t, double>(1024.67);
1275 __ movl(EAX, Immediate(Utils::High32Bits(l))); 1278 __ movl(EAX, Immediate(Utils::High32Bits(l)));
1276 __ pushl(EAX); 1279 __ pushl(EAX);
1277 __ movl(EAX, Immediate(Utils::Low32Bits(l))); 1280 __ movl(EAX, Immediate(Utils::Low32Bits(l)));
1278 __ pushl(EAX); 1281 __ pushl(EAX);
1279 __ fldl(Address(ESP, 0)); 1282 __ fldl(Address(ESP, 0));
1280 __ movl(Address(ESP, 0), Immediate(0)); 1283 __ movl(Address(ESP, 0), Immediate(0));
1281 __ movl(Address(ESP, kWordSize), Immediate(0)); 1284 __ movl(Address(ESP, kWordSize), Immediate(0));
1282 __ fstpl(Address(ESP, 0)); 1285 __ fstpl(Address(ESP, 0));
1283 __ popl(EAX); 1286 __ popl(EAX);
1284 __ popl(EDX); 1287 __ popl(EDX);
1285 __ ret(); 1288 __ ret();
1286 } 1289 }
1287 1290
1288 1291
1289 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, entry) { 1292 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, test) {
1290 typedef int64_t (*DoubleFPUStackMovesCode)(); 1293 typedef int64_t (*DoubleFPUStackMovesCode)();
1291 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(entry)(); 1294 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())();
1292 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001); 1295 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001);
1293 } 1296 }
1294 1297
1295 1298
1296 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { 1299 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
1297 int64_t l = bit_cast<int64_t, double>(12.3); 1300 int64_t l = bit_cast<int64_t, double>(12.3);
1298 __ movl(EAX, Immediate(Utils::High32Bits(l))); 1301 __ movl(EAX, Immediate(Utils::High32Bits(l)));
1299 __ pushl(EAX); 1302 __ pushl(EAX);
1300 __ movl(EAX, Immediate(Utils::Low32Bits(l))); 1303 __ movl(EAX, Immediate(Utils::Low32Bits(l)));
1301 __ pushl(EAX); 1304 __ pushl(EAX);
(...skipping 11 matching lines...) Expand all
1313 __ subsd(XMM0, XMM1); // 49.98 1316 __ subsd(XMM0, XMM1); // 49.98
1314 __ divsd(XMM0, XMM1); // 14.7 1317 __ divsd(XMM0, XMM1); // 14.7
1315 __ movsd(Address(ESP, 0), XMM0); 1318 __ movsd(Address(ESP, 0), XMM0);
1316 __ fldl(Address(ESP, 0)); 1319 __ fldl(Address(ESP, 0));
1317 __ popl(EAX); 1320 __ popl(EAX);
1318 __ popl(EAX); 1321 __ popl(EAX);
1319 __ ret(); 1322 __ ret();
1320 } 1323 }
1321 1324
1322 1325
1323 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) { 1326 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) {
1324 typedef double (*DoubleFPOperationsCode)(); 1327 typedef double (*DoubleFPOperationsCode)();
1325 double res = reinterpret_cast<DoubleFPOperationsCode>(entry)(); 1328 double res = reinterpret_cast<DoubleFPOperationsCode>(test->entry())();
1326 EXPECT_FLOAT_EQ(14.7, res, 0.001); 1329 EXPECT_FLOAT_EQ(14.7, res, 0.001);
1327 } 1330 }
1328 1331
1329 1332
1330 ASSEMBLER_TEST_GENERATE(DoubleFPOperationsStack, assembler) { 1333 ASSEMBLER_TEST_GENERATE(DoubleFPOperationsStack, assembler) {
1331 int64_t l = bit_cast<int64_t, double>(12.3); 1334 int64_t l = bit_cast<int64_t, double>(12.3);
1332 __ movl(EAX, Immediate(Utils::High32Bits(l))); 1335 __ movl(EAX, Immediate(Utils::High32Bits(l)));
1333 __ pushl(EAX); 1336 __ pushl(EAX);
1334 __ movl(EAX, Immediate(Utils::Low32Bits(l))); 1337 __ movl(EAX, Immediate(Utils::Low32Bits(l)));
1335 __ pushl(EAX); 1338 __ pushl(EAX);
1336 __ movsd(XMM0, Address(ESP, 0)); 1339 __ movsd(XMM0, Address(ESP, 0));
1337 __ popl(EAX); 1340 __ popl(EAX);
1338 __ popl(EAX); 1341 __ popl(EAX);
1339 1342
1340 __ addsd(XMM0, Address(ESP, kWordSize)); // 15.7 1343 __ addsd(XMM0, Address(ESP, kWordSize)); // 15.7
1341 __ mulsd(XMM0, Address(ESP, kWordSize)); // 53.38 1344 __ mulsd(XMM0, Address(ESP, kWordSize)); // 53.38
1342 __ subsd(XMM0, Address(ESP, kWordSize)); // 49.98 1345 __ subsd(XMM0, Address(ESP, kWordSize)); // 49.98
1343 __ divsd(XMM0, Address(ESP, kWordSize)); // 14.7 1346 __ divsd(XMM0, Address(ESP, kWordSize)); // 14.7
1344 1347
1345 __ pushl(EAX); 1348 __ pushl(EAX);
1346 __ pushl(EAX); 1349 __ pushl(EAX);
1347 __ movsd(Address(ESP, 0), XMM0); 1350 __ movsd(Address(ESP, 0), XMM0);
1348 __ fldl(Address(ESP, 0)); 1351 __ fldl(Address(ESP, 0));
1349 __ popl(EAX); 1352 __ popl(EAX);
1350 __ popl(EAX); 1353 __ popl(EAX);
1351 __ ret(); 1354 __ ret();
1352 } 1355 }
1353 1356
1354 1357
1355 ASSEMBLER_TEST_RUN(DoubleFPOperationsStack, entry) { 1358 ASSEMBLER_TEST_RUN(DoubleFPOperationsStack, test) {
1356 typedef double (*DoubleFPOperationsStackCode)(double d); 1359 typedef double (*DoubleFPOperationsStackCode)(double d);
1357 double res = reinterpret_cast<DoubleFPOperationsStackCode>(entry)(3.4); 1360 double res =
1361 reinterpret_cast<DoubleFPOperationsStackCode>(test->entry())(3.4);
1358 EXPECT_FLOAT_EQ(14.7, res, 0.001); 1362 EXPECT_FLOAT_EQ(14.7, res, 0.001);
1359 } 1363 }
1360 1364
1361 1365
1362 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { 1366 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
1363 __ movl(EDX, Immediate(6)); 1367 __ movl(EDX, Immediate(6));
1364 __ cvtsi2sd(XMM1, EDX); 1368 __ cvtsi2sd(XMM1, EDX);
1365 __ pushl(EAX); 1369 __ pushl(EAX);
1366 __ pushl(EAX); 1370 __ pushl(EAX);
1367 __ movsd(Address(ESP, 0), XMM1); 1371 __ movsd(Address(ESP, 0), XMM1);
1368 __ fldl(Address(ESP, 0)); 1372 __ fldl(Address(ESP, 0));
1369 __ popl(EAX); 1373 __ popl(EAX);
1370 __ popl(EAX); 1374 __ popl(EAX);
1371 __ ret(); 1375 __ ret();
1372 } 1376 }
1373 1377
1374 1378
1375 ASSEMBLER_TEST_RUN(IntToDoubleConversion, entry) { 1379 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) {
1376 typedef double (*IntToDoubleConversionCode)(); 1380 typedef double (*IntToDoubleConversionCode)();
1377 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); 1381 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())();
1378 EXPECT_FLOAT_EQ(6.0, res, 0.001); 1382 EXPECT_FLOAT_EQ(6.0, res, 0.001);
1379 } 1383 }
1380 1384
1381 1385
1382 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) { 1386 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) {
1383 __ filds(Address(ESP, kWordSize)); 1387 __ filds(Address(ESP, kWordSize));
1384 __ ret(); 1388 __ ret();
1385 } 1389 }
1386 1390
1387 1391
1388 ASSEMBLER_TEST_RUN(IntToDoubleConversion2, entry) { 1392 ASSEMBLER_TEST_RUN(IntToDoubleConversion2, test) {
1389 typedef double (*IntToDoubleConversion2Code)(int i); 1393 typedef double (*IntToDoubleConversion2Code)(int i);
1390 double res = reinterpret_cast<IntToDoubleConversion2Code>(entry)(3); 1394 double res = reinterpret_cast<IntToDoubleConversion2Code>(test->entry())(3);
1391 EXPECT_FLOAT_EQ(3.0, res, 0.001); 1395 EXPECT_FLOAT_EQ(3.0, res, 0.001);
1392 } 1396 }
1393 1397
1394 1398
1395 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) { 1399 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) {
1396 __ movl(EDX, Immediate(6)); 1400 __ movl(EDX, Immediate(6));
1397 __ cvtsi2ss(XMM1, EDX); 1401 __ cvtsi2ss(XMM1, EDX);
1398 __ pushl(EAX); 1402 __ pushl(EAX);
1399 __ movss(Address(ESP, 0), XMM1); 1403 __ movss(Address(ESP, 0), XMM1);
1400 __ flds(Address(ESP, 0)); 1404 __ flds(Address(ESP, 0));
1401 __ popl(EAX); 1405 __ popl(EAX);
1402 __ ret(); 1406 __ ret();
1403 } 1407 }
1404 1408
1405 1409
1406 ASSEMBLER_TEST_RUN(IntToFloatConversion, entry) { 1410 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) {
1407 typedef float (*IntToFloatConversionCode)(); 1411 typedef float (*IntToFloatConversionCode)();
1408 float res = reinterpret_cast<IntToFloatConversionCode>(entry)(); 1412 float res = reinterpret_cast<IntToFloatConversionCode>(test->entry())();
1409 EXPECT_FLOAT_EQ(6.0, res, 0.001); 1413 EXPECT_FLOAT_EQ(6.0, res, 0.001);
1410 } 1414 }
1411 1415
1412 1416
1413 ASSEMBLER_TEST_GENERATE(FloatToIntConversionRound, assembler) { 1417 ASSEMBLER_TEST_GENERATE(FloatToIntConversionRound, assembler) {
1414 __ movsd(XMM1, Address(ESP, kWordSize)); 1418 __ movsd(XMM1, Address(ESP, kWordSize));
1415 __ cvtss2si(EDX, XMM1); 1419 __ cvtss2si(EDX, XMM1);
1416 __ movl(EAX, EDX); 1420 __ movl(EAX, EDX);
1417 __ ret(); 1421 __ ret();
1418 } 1422 }
1419 1423
1420 1424
1421 ASSEMBLER_TEST_RUN(FloatToIntConversionRound, entry) { 1425 ASSEMBLER_TEST_RUN(FloatToIntConversionRound, test) {
1422 typedef int (*FloatToIntConversionRoundCode)(float f); 1426 typedef int (*FloatToIntConversionRoundCode)(float f);
1423 int res = reinterpret_cast<FloatToIntConversionRoundCode>(entry)(12.3); 1427 int res =
1428 reinterpret_cast<FloatToIntConversionRoundCode>(test->entry())(12.3);
1424 EXPECT_EQ(12, res); 1429 EXPECT_EQ(12, res);
1425 res = reinterpret_cast<FloatToIntConversionRoundCode>(entry)(12.8); 1430 res = reinterpret_cast<FloatToIntConversionRoundCode>(test->entry())(12.8);
1426 EXPECT_EQ(13, res); 1431 EXPECT_EQ(13, res);
1427 } 1432 }
1428 1433
1429 1434
1430 ASSEMBLER_TEST_GENERATE(FloatToIntConversionTrunc, assembler) { 1435 ASSEMBLER_TEST_GENERATE(FloatToIntConversionTrunc, assembler) {
1431 __ movsd(XMM1, Address(ESP, kWordSize)); 1436 __ movsd(XMM1, Address(ESP, kWordSize));
1432 __ cvttss2si(EDX, XMM1); 1437 __ cvttss2si(EDX, XMM1);
1433 __ movl(EAX, EDX); 1438 __ movl(EAX, EDX);
1434 __ ret(); 1439 __ ret();
1435 } 1440 }
1436 1441
1437 1442
1438 ASSEMBLER_TEST_RUN(FloatToIntConversionTrunc, entry) { 1443 ASSEMBLER_TEST_RUN(FloatToIntConversionTrunc, test) {
1439 typedef int (*FloatToIntConversionTruncCode)(float f); 1444 typedef int (*FloatToIntConversionTruncCode)(float f);
1440 int res = reinterpret_cast<FloatToIntConversionTruncCode>(entry)(12.3); 1445 int res =
1446 reinterpret_cast<FloatToIntConversionTruncCode>(test->entry())(12.3);
1441 EXPECT_EQ(12, res); 1447 EXPECT_EQ(12, res);
1442 res = reinterpret_cast<FloatToIntConversionTruncCode>(entry)(12.8); 1448 res = reinterpret_cast<FloatToIntConversionTruncCode>(test->entry())(12.8);
1443 EXPECT_EQ(12, res); 1449 EXPECT_EQ(12, res);
1444 } 1450 }
1445 1451
1446 1452
1447 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) { 1453 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) {
1448 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1454 __ movl(EAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1449 __ movd(XMM1, EAX); 1455 __ movd(XMM1, EAX);
1450 __ xorl(EAX, EAX); 1456 __ xorl(EAX, EAX);
1451 __ cvtss2sd(XMM2, XMM1); 1457 __ cvtss2sd(XMM2, XMM1);
1452 __ pushl(EAX); 1458 __ pushl(EAX);
1453 __ pushl(EAX); 1459 __ pushl(EAX);
1454 __ movsd(Address(ESP, 0), XMM2); 1460 __ movsd(Address(ESP, 0), XMM2);
1455 __ fldl(Address(ESP, 0)); 1461 __ fldl(Address(ESP, 0));
1456 __ popl(EAX); 1462 __ popl(EAX);
1457 __ popl(EAX); 1463 __ popl(EAX);
1458 __ ret(); 1464 __ ret();
1459 } 1465 }
1460 1466
1461 1467
1462 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, entry) { 1468 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) {
1463 typedef double (*FloatToDoubleConversionCode)(); 1469 typedef double (*FloatToDoubleConversionCode)();
1464 double res = reinterpret_cast<FloatToDoubleConversionCode>(entry)(); 1470 double res = reinterpret_cast<FloatToDoubleConversionCode>(test->entry())();
1465 EXPECT_FLOAT_EQ(12.3, res, 0.001); 1471 EXPECT_FLOAT_EQ(12.3, res, 0.001);
1466 } 1472 }
1467 1473
1468 1474
1469 ASSEMBLER_TEST_GENERATE(FloatCompare, assembler) { 1475 ASSEMBLER_TEST_GENERATE(FloatCompare, assembler) {
1470 // Count errors in EAX. EAX is zero if no errors found. 1476 // Count errors in EAX. EAX is zero if no errors found.
1471 Label is_nan, is_above, is_ok, cont_1, cont_2; 1477 Label is_nan, is_above, is_ok, cont_1, cont_2;
1472 // Test 12.3f vs 12.5f. 1478 // Test 12.3f vs 12.5f.
1473 __ xorl(EAX, EAX); 1479 __ xorl(EAX, EAX);
1474 __ movl(EDX, Immediate(bit_cast<int32_t, float>(12.3f))); 1480 __ movl(EDX, Immediate(bit_cast<int32_t, float>(12.3f)));
(...skipping 26 matching lines...) Expand all
1501 __ Bind(&is_nan); 1507 __ Bind(&is_nan);
1502 __ incl(EAX); 1508 __ incl(EAX);
1503 __ jmp(&cont_1); 1509 __ jmp(&cont_1);
1504 1510
1505 __ Bind(&is_above); 1511 __ Bind(&is_above);
1506 __ incl(EAX); 1512 __ incl(EAX);
1507 __ jmp(&cont_2); 1513 __ jmp(&cont_2);
1508 } 1514 }
1509 1515
1510 1516
1511 ASSEMBLER_TEST_RUN(FloatCompare, entry) { 1517 ASSEMBLER_TEST_RUN(FloatCompare, test) {
1512 typedef int (*FloatCompareCode)(); 1518 typedef int (*FloatCompareCode)();
1513 int res = reinterpret_cast<FloatCompareCode>(entry)(); 1519 int res = reinterpret_cast<FloatCompareCode>(test->entry())();
1514 EXPECT_EQ(0, res); 1520 EXPECT_EQ(0, res);
1515 } 1521 }
1516 1522
1517 1523
1518 ASSEMBLER_TEST_GENERATE(DoubleCompare, assembler) { 1524 ASSEMBLER_TEST_GENERATE(DoubleCompare, assembler) {
1519 int64_t a = bit_cast<int64_t, double>(12.3); 1525 int64_t a = bit_cast<int64_t, double>(12.3);
1520 int64_t b = bit_cast<int64_t, double>(12.5); 1526 int64_t b = bit_cast<int64_t, double>(12.5);
1521 1527
1522 __ movl(EDX, Immediate(Utils::High32Bits(a))); 1528 __ movl(EDX, Immediate(Utils::High32Bits(a)));
1523 __ pushl(EDX); 1529 __ pushl(EDX);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 __ Bind(&is_nan); 1578 __ Bind(&is_nan);
1573 __ incl(EAX); 1579 __ incl(EAX);
1574 __ jmp(&cont_1); 1580 __ jmp(&cont_1);
1575 1581
1576 __ Bind(&is_above); 1582 __ Bind(&is_above);
1577 __ incl(EAX); 1583 __ incl(EAX);
1578 __ jmp(&cont_2); 1584 __ jmp(&cont_2);
1579 } 1585 }
1580 1586
1581 1587
1582 ASSEMBLER_TEST_RUN(DoubleCompare, entry) { 1588 ASSEMBLER_TEST_RUN(DoubleCompare, test) {
1583 typedef int (*DoubleCompareCode)(); 1589 typedef int (*DoubleCompareCode)();
1584 int res = reinterpret_cast<DoubleCompareCode>(entry)(); 1590 int res = reinterpret_cast<DoubleCompareCode>(test->entry())();
1585 EXPECT_EQ(0, res); 1591 EXPECT_EQ(0, res);
1586 } 1592 }
1587 1593
1588 1594
1589 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) { 1595 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) {
1590 int64_t l = bit_cast<int64_t, double>(12.3); 1596 int64_t l = bit_cast<int64_t, double>(12.3);
1591 __ movl(EAX, Immediate(Utils::High32Bits(l))); 1597 __ movl(EAX, Immediate(Utils::High32Bits(l)));
1592 __ pushl(EAX); 1598 __ pushl(EAX);
1593 __ movl(EAX, Immediate(Utils::Low32Bits(l))); 1599 __ movl(EAX, Immediate(Utils::Low32Bits(l)));
1594 __ pushl(EAX); 1600 __ pushl(EAX);
1595 __ movsd(XMM0, Address(ESP, 0)); 1601 __ movsd(XMM0, Address(ESP, 0));
1596 __ cvtsd2ss(XMM1, XMM0); 1602 __ cvtsd2ss(XMM1, XMM0);
1597 __ movss(Address(ESP, 0), XMM1); 1603 __ movss(Address(ESP, 0), XMM1);
1598 __ flds(Address(ESP, 0)); 1604 __ flds(Address(ESP, 0));
1599 __ popl(EAX); 1605 __ popl(EAX);
1600 __ popl(EAX); 1606 __ popl(EAX);
1601 __ ret(); 1607 __ ret();
1602 } 1608 }
1603 1609
1604 1610
1605 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, entry) { 1611 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) {
1606 typedef float (*DoubleToFloatConversionCode)(); 1612 typedef float (*DoubleToFloatConversionCode)();
1607 float res = reinterpret_cast<DoubleToFloatConversionCode>(entry)(); 1613 float res = reinterpret_cast<DoubleToFloatConversionCode>(test->entry())();
1608 EXPECT_FLOAT_EQ(12.3f, res, 0.001); 1614 EXPECT_FLOAT_EQ(12.3f, res, 0.001);
1609 } 1615 }
1610 1616
1611 1617
1612 ASSEMBLER_TEST_GENERATE(DoubleToIntConversionRound, assembler) { 1618 ASSEMBLER_TEST_GENERATE(DoubleToIntConversionRound, assembler) {
1613 __ movsd(XMM3, Address(ESP, kWordSize)); 1619 __ movsd(XMM3, Address(ESP, kWordSize));
1614 __ cvtsd2si(EAX, XMM3); 1620 __ cvtsd2si(EAX, XMM3);
1615 __ ret(); 1621 __ ret();
1616 } 1622 }
1617 1623
1618 1624
1619 ASSEMBLER_TEST_RUN(DoubleToIntConversionRound, entry) { 1625 ASSEMBLER_TEST_RUN(DoubleToIntConversionRound, test) {
1620 typedef int (*DoubleToIntConversionRoundCode)(double d); 1626 typedef int (*DoubleToIntConversionRoundCode)(double d);
1621 int res = reinterpret_cast<DoubleToIntConversionRoundCode>(entry)(12.3); 1627 int res =
1628 reinterpret_cast<DoubleToIntConversionRoundCode>(test->entry())(12.3);
1622 EXPECT_EQ(12, res); 1629 EXPECT_EQ(12, res);
1623 res = reinterpret_cast<DoubleToIntConversionRoundCode>(entry)(12.8); 1630 res = reinterpret_cast<DoubleToIntConversionRoundCode>(test->entry())(12.8);
1624 EXPECT_EQ(13, res); 1631 EXPECT_EQ(13, res);
1625 } 1632 }
1626 1633
1627 1634
1628 ASSEMBLER_TEST_GENERATE(DoubleToIntConversionTrunc, assembler) { 1635 ASSEMBLER_TEST_GENERATE(DoubleToIntConversionTrunc, assembler) {
1629 __ movsd(XMM3, Address(ESP, kWordSize)); 1636 __ movsd(XMM3, Address(ESP, kWordSize));
1630 __ cvttsd2si(EAX, XMM3); 1637 __ cvttsd2si(EAX, XMM3);
1631 __ ret(); 1638 __ ret();
1632 } 1639 }
1633 1640
1634 1641
1635 ASSEMBLER_TEST_RUN(DoubleToIntConversionTrunc, entry) { 1642 ASSEMBLER_TEST_RUN(DoubleToIntConversionTrunc, test) {
1636 typedef int (*DoubleToIntConversionTruncCode)(double d); 1643 typedef int (*DoubleToIntConversionTruncCode)(double d);
1637 int res = reinterpret_cast<DoubleToIntConversionTruncCode>(entry)(12.3); 1644 int res =
1645 reinterpret_cast<DoubleToIntConversionTruncCode>(test->entry())(12.3);
1638 EXPECT_EQ(12, res); 1646 EXPECT_EQ(12, res);
1639 res = reinterpret_cast<DoubleToIntConversionTruncCode>(entry)(12.8); 1647 res = reinterpret_cast<DoubleToIntConversionTruncCode>(test->entry())(12.8);
1640 EXPECT_EQ(12, res); 1648 EXPECT_EQ(12, res);
1641 } 1649 }
1642 1650
1643 1651
1644 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) { 1652 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) {
1645 __ movsd(XMM3, Address(ESP, kWordSize)); 1653 __ movsd(XMM3, Address(ESP, kWordSize));
1646 __ roundsd(XMM2, XMM3, Assembler::kRoundToZero); 1654 __ roundsd(XMM2, XMM3, Assembler::kRoundToZero);
1647 __ pushl(EAX); 1655 __ pushl(EAX);
1648 __ pushl(EAX); 1656 __ pushl(EAX);
1649 __ movsd(Address(ESP, 0), XMM2); 1657 __ movsd(Address(ESP, 0), XMM2);
1650 __ fldl(Address(ESP, 0)); 1658 __ fldl(Address(ESP, 0));
1651 __ popl(EAX); 1659 __ popl(EAX);
1652 __ popl(EAX); 1660 __ popl(EAX);
1653 __ ret(); 1661 __ ret();
1654 } 1662 }
1655 1663
1656 1664
1657 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, entry) { 1665 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, test) {
1658 typedef double (*DoubleToDoubleTruncCode)(double d); 1666 typedef double (*DoubleToDoubleTruncCode)(double d);
1659 double res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(12.3); 1667 double res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.3);
1660 EXPECT_EQ(12.0, res); 1668 EXPECT_EQ(12.0, res);
1661 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(12.8); 1669 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.8);
1662 EXPECT_EQ(12.0, res); 1670 EXPECT_EQ(12.0, res);
1663 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(-12.3); 1671 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.3);
1664 EXPECT_EQ(-12.0, res); 1672 EXPECT_EQ(-12.0, res);
1665 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(-12.8); 1673 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.8);
1666 EXPECT_EQ(-12.0, res); 1674 EXPECT_EQ(-12.0, res);
1667 } 1675 }
1668 1676
1669 1677
1670 ASSEMBLER_TEST_GENERATE(DoubleToDoubleRound, assembler) { 1678 ASSEMBLER_TEST_GENERATE(DoubleToDoubleRound, assembler) {
1671 __ movsd(XMM3, Address(ESP, kWordSize)); 1679 __ movsd(XMM3, Address(ESP, kWordSize));
1672 __ DoubleRound(XMM2, XMM3, XMM0); 1680 __ DoubleRound(XMM2, XMM3, XMM0);
1673 __ pushl(EAX); 1681 __ pushl(EAX);
1674 __ pushl(EAX); 1682 __ pushl(EAX);
1675 __ movsd(Address(ESP, 0), XMM2); 1683 __ movsd(Address(ESP, 0), XMM2);
1676 __ fldl(Address(ESP, 0)); 1684 __ fldl(Address(ESP, 0));
1677 __ popl(EAX); 1685 __ popl(EAX);
1678 __ popl(EAX); 1686 __ popl(EAX);
1679 __ ret(); 1687 __ ret();
1680 } 1688 }
1681 1689
1682 1690
1683 ASSEMBLER_TEST_RUN(DoubleToDoubleRound, entry) { 1691 ASSEMBLER_TEST_RUN(DoubleToDoubleRound, test) {
1684 typedef double (*DoubleToDoubleRoundCode)(double d); 1692 typedef double (*DoubleToDoubleRoundCode)(double d);
1685 double res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(12.3); 1693 double res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(12.3);
1686 EXPECT_EQ(12.0, res); 1694 EXPECT_EQ(12.0, res);
1687 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(12.8); 1695 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(12.8);
1688 EXPECT_EQ(13.0, res); 1696 EXPECT_EQ(13.0, res);
1689 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(0.5); 1697 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(0.5);
1690 EXPECT_EQ(1.0, res); 1698 EXPECT_EQ(1.0, res);
1691 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-12.3); 1699 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-12.3);
1692 EXPECT_EQ(-12.0, res); 1700 EXPECT_EQ(-12.0, res);
1693 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-12.8); 1701 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-12.8);
1694 EXPECT_EQ(-13.0, res); 1702 EXPECT_EQ(-13.0, res);
1695 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-0.5); 1703 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-0.5);
1696 EXPECT_EQ(-1.0, res); 1704 EXPECT_EQ(-1.0, res);
1697 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(0.49999999999999994); 1705 res = reinterpret_cast<DoubleToDoubleRoundCode>(
1706 test->entry())(0.49999999999999994);
1698 EXPECT_EQ(0.0, res); 1707 EXPECT_EQ(0.0, res);
1699 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-0.49999999999999994); 1708 res = reinterpret_cast<DoubleToDoubleRoundCode>(
1709 test->entry())(-0.49999999999999994);
1700 EXPECT_EQ(-0.0, res); 1710 EXPECT_EQ(-0.0, res);
1701 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(9007199254740991.0); 1711 res = reinterpret_cast<DoubleToDoubleRoundCode>(
1712 test->entry())(9007199254740991.0);
1702 EXPECT_EQ(9007199254740991.0, res); 1713 EXPECT_EQ(9007199254740991.0, res);
1703 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-9007199254740991.0); 1714 res = reinterpret_cast<DoubleToDoubleRoundCode>(
1715 test->entry())(-9007199254740991.0);
1704 EXPECT_EQ(-9007199254740991.0, res); 1716 EXPECT_EQ(-9007199254740991.0, res);
1705 } 1717 }
1706 1718
1707 1719
1708 static const double kDoubleConst = 3.226; 1720 static const double kDoubleConst = 3.226;
1709 1721
1710 ASSEMBLER_TEST_GENERATE(GlobalAddress, assembler) { 1722 ASSEMBLER_TEST_GENERATE(GlobalAddress, assembler) {
1711 __ movsd(XMM0, Address::Absolute(reinterpret_cast<uword>(&kDoubleConst))); 1723 __ movsd(XMM0, Address::Absolute(reinterpret_cast<uword>(&kDoubleConst)));
1712 __ pushl(EAX); 1724 __ pushl(EAX);
1713 __ pushl(EAX); 1725 __ pushl(EAX);
1714 __ movsd(Address(ESP, 0), XMM0); 1726 __ movsd(Address(ESP, 0), XMM0);
1715 __ fldl(Address(ESP, 0)); 1727 __ fldl(Address(ESP, 0));
1716 __ popl(EAX); 1728 __ popl(EAX);
1717 __ popl(EAX); 1729 __ popl(EAX);
1718 __ ret(); 1730 __ ret();
1719 } 1731 }
1720 1732
1721 1733
1722 ASSEMBLER_TEST_RUN(GlobalAddress, entry) { 1734 ASSEMBLER_TEST_RUN(GlobalAddress, test) {
1723 typedef double (*GlobalAddressCode)(); 1735 typedef double (*GlobalAddressCode)();
1724 double res = reinterpret_cast<GlobalAddressCode>(entry)(); 1736 double res = reinterpret_cast<GlobalAddressCode>(test->entry())();
1725 EXPECT_FLOAT_EQ(kDoubleConst, res, 0.000001); 1737 EXPECT_FLOAT_EQ(kDoubleConst, res, 0.000001);
1726 } 1738 }
1727 1739
1728 1740
1729 ASSEMBLER_TEST_GENERATE(Sine, assembler) { 1741 ASSEMBLER_TEST_GENERATE(Sine, assembler) {
1730 __ flds(Address(ESP, kWordSize)); 1742 __ flds(Address(ESP, kWordSize));
1731 __ fsin(); 1743 __ fsin();
1732 __ ret(); 1744 __ ret();
1733 } 1745 }
1734 1746
1735 1747
1736 ASSEMBLER_TEST_RUN(Sine, entry) { 1748 ASSEMBLER_TEST_RUN(Sine, test) {
1737 typedef float (*SineCode)(float f); 1749 typedef float (*SineCode)(float f);
1738 const float kFloatConst = 0.7; 1750 const float kFloatConst = 0.7;
1739 float res = reinterpret_cast<SineCode>(entry)(kFloatConst); 1751 float res = reinterpret_cast<SineCode>(test->entry())(kFloatConst);
1740 EXPECT_FLOAT_EQ(sin(kFloatConst), res, 0.0001); 1752 EXPECT_FLOAT_EQ(sin(kFloatConst), res, 0.0001);
1741 } 1753 }
1742 1754
1743 1755
1744 ASSEMBLER_TEST_GENERATE(Cosine, assembler) { 1756 ASSEMBLER_TEST_GENERATE(Cosine, assembler) {
1745 __ flds(Address(ESP, kWordSize)); 1757 __ flds(Address(ESP, kWordSize));
1746 __ fcos(); 1758 __ fcos();
1747 __ ret(); 1759 __ ret();
1748 } 1760 }
1749 1761
1750 1762
1751 ASSEMBLER_TEST_RUN(Cosine, entry) { 1763 ASSEMBLER_TEST_RUN(Cosine, test) {
1752 typedef float (*CosineCode)(float f); 1764 typedef float (*CosineCode)(float f);
1753 const float kFloatConst = 0.7; 1765 const float kFloatConst = 0.7;
1754 float res = reinterpret_cast<CosineCode>(entry)(kFloatConst); 1766 float res = reinterpret_cast<CosineCode>(test->entry())(kFloatConst);
1755 EXPECT_FLOAT_EQ(cos(kFloatConst), res, 0.0001); 1767 EXPECT_FLOAT_EQ(cos(kFloatConst), res, 0.0001);
1756 } 1768 }
1757 1769
1758 1770
1759 ASSEMBLER_TEST_GENERATE(Tangent, assembler) { 1771 ASSEMBLER_TEST_GENERATE(Tangent, assembler) {
1760 __ fldl(Address(ESP, kWordSize)); 1772 __ fldl(Address(ESP, kWordSize));
1761 __ fptan(); 1773 __ fptan();
1762 __ ffree(0); 1774 __ ffree(0);
1763 __ fincstp(); 1775 __ fincstp();
1764 __ ret(); 1776 __ ret();
1765 } 1777 }
1766 1778
1767 1779
1768 ASSEMBLER_TEST_RUN(Tangent, entry) { 1780 ASSEMBLER_TEST_RUN(Tangent, test) {
1769 typedef double (*TangentCode)(double d); 1781 typedef double (*TangentCode)(double d);
1770 const double kDoubleConst = 0.6108652375000001; 1782 const double kDoubleConst = 0.6108652375000001;
1771 double res = reinterpret_cast<TangentCode>(entry)(kDoubleConst); 1783 double res = reinterpret_cast<TangentCode>(test->entry())(kDoubleConst);
1772 EXPECT_FLOAT_EQ(tan(kDoubleConst), res, 0.0001); 1784 EXPECT_FLOAT_EQ(tan(kDoubleConst), res, 0.0001);
1773 } 1785 }
1774 1786
1775 1787
1776 ASSEMBLER_TEST_GENERATE(SquareRootFloat, assembler) { 1788 ASSEMBLER_TEST_GENERATE(SquareRootFloat, assembler) {
1777 __ movss(XMM0, Address(ESP, kWordSize)); 1789 __ movss(XMM0, Address(ESP, kWordSize));
1778 __ sqrtss(XMM1, XMM0); 1790 __ sqrtss(XMM1, XMM0);
1779 __ pushl(EAX); 1791 __ pushl(EAX);
1780 __ movss(Address(ESP, 0), XMM1); 1792 __ movss(Address(ESP, 0), XMM1);
1781 __ flds(Address(ESP, 0)); 1793 __ flds(Address(ESP, 0));
1782 __ popl(EAX); 1794 __ popl(EAX);
1783 __ ret(); 1795 __ ret();
1784 } 1796 }
1785 1797
1786 1798
1787 ASSEMBLER_TEST_RUN(SquareRootFloat, entry) { 1799 ASSEMBLER_TEST_RUN(SquareRootFloat, test) {
1788 typedef float (*SquareRootFloatCode)(float f); 1800 typedef float (*SquareRootFloatCode)(float f);
1789 const float kFloatConst = 0.7; 1801 const float kFloatConst = 0.7;
1790 float res = reinterpret_cast<SquareRootFloatCode>(entry)(kFloatConst); 1802 float res = reinterpret_cast<SquareRootFloatCode>(test->entry())(kFloatConst);
1791 EXPECT_FLOAT_EQ(sqrt(kFloatConst), res, 0.0001); 1803 EXPECT_FLOAT_EQ(sqrt(kFloatConst), res, 0.0001);
1792 } 1804 }
1793 1805
1794 1806
1795 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) { 1807 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) {
1796 __ movsd(XMM0, Address(ESP, kWordSize)); 1808 __ movsd(XMM0, Address(ESP, kWordSize));
1797 __ sqrtsd(XMM1, XMM0); 1809 __ sqrtsd(XMM1, XMM0);
1798 __ pushl(EAX); 1810 __ pushl(EAX);
1799 __ pushl(EAX); 1811 __ pushl(EAX);
1800 __ movsd(Address(ESP, 0), XMM1); 1812 __ movsd(Address(ESP, 0), XMM1);
1801 __ fldl(Address(ESP, 0)); 1813 __ fldl(Address(ESP, 0));
1802 __ popl(EAX); 1814 __ popl(EAX);
1803 __ popl(EAX); 1815 __ popl(EAX);
1804 __ ret(); 1816 __ ret();
1805 } 1817 }
1806 1818
1807 1819
1808 ASSEMBLER_TEST_RUN(SquareRootDouble, entry) { 1820 ASSEMBLER_TEST_RUN(SquareRootDouble, test) {
1809 typedef double (*SquareRootDoubleCode)(double d); 1821 typedef double (*SquareRootDoubleCode)(double d);
1810 const double kDoubleConst = .7; 1822 const double kDoubleConst = .7;
1811 double res = reinterpret_cast<SquareRootDoubleCode>(entry)(kDoubleConst); 1823 double res =
1824 reinterpret_cast<SquareRootDoubleCode>(test->entry())(kDoubleConst);
1812 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001); 1825 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001);
1813 } 1826 }
1814 1827
1815 1828
1816 ASSEMBLER_TEST_GENERATE(FloatNegate, assembler) { 1829 ASSEMBLER_TEST_GENERATE(FloatNegate, assembler) {
1817 __ movss(XMM0, Address(ESP, kWordSize)); 1830 __ movss(XMM0, Address(ESP, kWordSize));
1818 __ FloatNegate(XMM0); 1831 __ FloatNegate(XMM0);
1819 __ pushl(EAX); 1832 __ pushl(EAX);
1820 __ movss(Address(ESP, 0), XMM0); 1833 __ movss(Address(ESP, 0), XMM0);
1821 __ flds(Address(ESP, 0)); 1834 __ flds(Address(ESP, 0));
1822 __ popl(EAX); 1835 __ popl(EAX);
1823 __ ret(); 1836 __ ret();
1824 } 1837 }
1825 1838
1826 1839
1827 ASSEMBLER_TEST_RUN(FloatNegate, entry) { 1840 ASSEMBLER_TEST_RUN(FloatNegate, test) {
1828 typedef float (*FloatNegateCode)(float f); 1841 typedef float (*FloatNegateCode)(float f);
1829 const float kFloatConst = 12.345; 1842 const float kFloatConst = 12.345;
1830 float res = reinterpret_cast<FloatNegateCode>(entry)(kFloatConst); 1843 float res = reinterpret_cast<FloatNegateCode>(test->entry())(kFloatConst);
1831 EXPECT_FLOAT_EQ(-kFloatConst, res, 0.0001); 1844 EXPECT_FLOAT_EQ(-kFloatConst, res, 0.0001);
1832 } 1845 }
1833 1846
1834 1847
1835 ASSEMBLER_TEST_GENERATE(DoubleNegate, assembler) { 1848 ASSEMBLER_TEST_GENERATE(DoubleNegate, assembler) {
1836 __ movsd(XMM0, Address(ESP, kWordSize)); 1849 __ movsd(XMM0, Address(ESP, kWordSize));
1837 __ DoubleNegate(XMM0); 1850 __ DoubleNegate(XMM0);
1838 __ pushl(EAX); 1851 __ pushl(EAX);
1839 __ pushl(EAX); 1852 __ pushl(EAX);
1840 __ movsd(Address(ESP, 0), XMM0); 1853 __ movsd(Address(ESP, 0), XMM0);
1841 __ fldl(Address(ESP, 0)); 1854 __ fldl(Address(ESP, 0));
1842 __ popl(EAX); 1855 __ popl(EAX);
1843 __ popl(EAX); 1856 __ popl(EAX);
1844 __ ret(); 1857 __ ret();
1845 } 1858 }
1846 1859
1847 1860
1848 ASSEMBLER_TEST_RUN(DoubleNegate, entry) { 1861 ASSEMBLER_TEST_RUN(DoubleNegate, test) {
1849 typedef double (*DoubleNegateCode)(double f); 1862 typedef double (*DoubleNegateCode)(double f);
1850 const double kDoubleConst = 12.345; 1863 const double kDoubleConst = 12.345;
1851 double res = reinterpret_cast<DoubleNegateCode>(entry)(kDoubleConst); 1864 double res = reinterpret_cast<DoubleNegateCode>(test->entry())(kDoubleConst);
1852 EXPECT_FLOAT_EQ(-kDoubleConst, res, 0.0001); 1865 EXPECT_FLOAT_EQ(-kDoubleConst, res, 0.0001);
1853 } 1866 }
1854 1867
1855 1868
1856 ASSEMBLER_TEST_GENERATE(LongMulReg, assembler) { 1869 ASSEMBLER_TEST_GENERATE(LongMulReg, assembler) {
1857 __ movl(ECX, Address(ESP, kWordSize)); 1870 __ movl(ECX, Address(ESP, kWordSize));
1858 __ movl(EAX, Address(ESP, 2 * kWordSize)); 1871 __ movl(EAX, Address(ESP, 2 * kWordSize));
1859 __ imull(ECX); 1872 __ imull(ECX);
1860 __ ret(); 1873 __ ret();
1861 } 1874 }
1862 1875
1863 1876
1864 ASSEMBLER_TEST_RUN(LongMulReg, entry) { 1877 ASSEMBLER_TEST_RUN(LongMulReg, test) {
1865 typedef int64_t (*LongMulRegCode)(int a, int b); 1878 typedef int64_t (*LongMulRegCode)(int a, int b);
1866 const int a = -12; 1879 const int a = -12;
1867 const int b = 13; 1880 const int b = 13;
1868 const int64_t mul_res = a * b; 1881 const int64_t mul_res = a * b;
1869 int64_t res = reinterpret_cast<LongMulRegCode>(entry)(a, b); 1882 int64_t res = reinterpret_cast<LongMulRegCode>(test->entry())(a, b);
1870 EXPECT_EQ(mul_res, res); 1883 EXPECT_EQ(mul_res, res);
1871 } 1884 }
1872 1885
1873 1886
1874 ASSEMBLER_TEST_GENERATE(LongMulAddress, assembler) { 1887 ASSEMBLER_TEST_GENERATE(LongMulAddress, assembler) {
1875 __ movl(EAX, Address(ESP, 2 * kWordSize)); 1888 __ movl(EAX, Address(ESP, 2 * kWordSize));
1876 __ imull(Address(ESP, kWordSize)); 1889 __ imull(Address(ESP, kWordSize));
1877 __ ret(); 1890 __ ret();
1878 } 1891 }
1879 1892
1880 1893
1881 ASSEMBLER_TEST_RUN(LongMulAddress, entry) { 1894 ASSEMBLER_TEST_RUN(LongMulAddress, test) {
1882 typedef int64_t (*LongMulAddressCode)(int a, int b); 1895 typedef int64_t (*LongMulAddressCode)(int a, int b);
1883 const int a = -12; 1896 const int a = -12;
1884 const int b = 13; 1897 const int b = 13;
1885 const int64_t mul_res = a * b; 1898 const int64_t mul_res = a * b;
1886 int64_t res = reinterpret_cast<LongMulAddressCode>(entry)(a, b); 1899 int64_t res = reinterpret_cast<LongMulAddressCode>(test->entry())(a, b);
1887 EXPECT_EQ(mul_res, res); 1900 EXPECT_EQ(mul_res, res);
1888 } 1901 }
1889 1902
1890 1903
1891 ASSEMBLER_TEST_GENERATE(LongUnsignedMulReg, assembler) { 1904 ASSEMBLER_TEST_GENERATE(LongUnsignedMulReg, assembler) {
1892 __ movl(ECX, Address(ESP, kWordSize)); 1905 __ movl(ECX, Address(ESP, kWordSize));
1893 __ movl(EAX, Address(ESP, 2 * kWordSize)); 1906 __ movl(EAX, Address(ESP, 2 * kWordSize));
1894 __ mull(ECX); 1907 __ mull(ECX);
1895 __ ret(); 1908 __ ret();
1896 } 1909 }
1897 1910
1898 1911
1899 ASSEMBLER_TEST_RUN(LongUnsignedMulReg, entry) { 1912 ASSEMBLER_TEST_RUN(LongUnsignedMulReg, test) {
1900 typedef uint64_t (*LongUnsignedMulRegCode)(uint32_t a, uint32_t b); 1913 typedef uint64_t (*LongUnsignedMulRegCode)(uint32_t a, uint32_t b);
1901 uint32_t a = 3; 1914 uint32_t a = 3;
1902 uint32_t b = 13; 1915 uint32_t b = 13;
1903 uint64_t mul_res = a * b; 1916 uint64_t mul_res = a * b;
1904 uint64_t res = reinterpret_cast<LongUnsignedMulRegCode>(entry)(a, b); 1917 uint64_t res = reinterpret_cast<LongUnsignedMulRegCode>(test->entry())(a, b);
1905 EXPECT_EQ(mul_res, res); 1918 EXPECT_EQ(mul_res, res);
1906 a = 4021288948u; 1919 a = 4021288948u;
1907 b = 13; 1920 b = 13;
1908 res = reinterpret_cast<LongUnsignedMulRegCode>(entry)(a, b); 1921 res = reinterpret_cast<LongUnsignedMulRegCode>(test->entry())(a, b);
1909 mul_res = static_cast<uint64_t>(a) * static_cast<uint64_t>(b); 1922 mul_res = static_cast<uint64_t>(a) * static_cast<uint64_t>(b);
1910 EXPECT_EQ(mul_res, res); 1923 EXPECT_EQ(mul_res, res);
1911 } 1924 }
1912 1925
1913 1926
1914 ASSEMBLER_TEST_GENERATE(LongUnsignedMulAddress, assembler) { 1927 ASSEMBLER_TEST_GENERATE(LongUnsignedMulAddress, assembler) {
1915 __ movl(EAX, Address(ESP, 2 * kWordSize)); 1928 __ movl(EAX, Address(ESP, 2 * kWordSize));
1916 __ mull(Address(ESP, kWordSize)); 1929 __ mull(Address(ESP, kWordSize));
1917 __ ret(); 1930 __ ret();
1918 } 1931 }
1919 1932
1920 1933
1921 ASSEMBLER_TEST_RUN(LongUnsignedMulAddress, entry) { 1934 ASSEMBLER_TEST_RUN(LongUnsignedMulAddress, test) {
1922 typedef uint64_t (*LongUnsignedMulAddressCode)(uint32_t a, uint32_t b); 1935 typedef uint64_t (*LongUnsignedMulAddressCode)(uint32_t a, uint32_t b);
1923 uint32_t a = 12; 1936 uint32_t a = 12;
1924 uint32_t b = 13; 1937 uint32_t b = 13;
1925 uint64_t mul_res = a * b; 1938 uint64_t mul_res = a * b;
1926 uint64_t res = reinterpret_cast<LongUnsignedMulAddressCode>(entry)(a, b); 1939 uint64_t res =
1940 reinterpret_cast<LongUnsignedMulAddressCode>(test->entry())(a, b);
1927 EXPECT_EQ(mul_res, res); 1941 EXPECT_EQ(mul_res, res);
1928 a = 4294967284u; 1942 a = 4294967284u;
1929 b = 13; 1943 b = 13;
1930 res = reinterpret_cast<LongUnsignedMulAddressCode>(entry)(a, b); 1944 res = reinterpret_cast<LongUnsignedMulAddressCode>(test->entry())(a, b);
1931 mul_res = static_cast<uint64_t>(a) * static_cast<uint64_t>(b); 1945 mul_res = static_cast<uint64_t>(a) * static_cast<uint64_t>(b);
1932 EXPECT_EQ(mul_res, res); 1946 EXPECT_EQ(mul_res, res);
1933 } 1947 }
1934 1948
1935 1949
1936 ASSEMBLER_TEST_GENERATE(LongAddReg, assembler) { 1950 ASSEMBLER_TEST_GENERATE(LongAddReg, assembler) {
1937 // Preserve clobbered callee-saved register (EBX). 1951 // Preserve clobbered callee-saved register (EBX).
1938 __ pushl(EBX); 1952 __ pushl(EBX);
1939 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low. 1953 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low.
1940 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high. 1954 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high.
1941 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low. 1955 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low.
1942 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high 1956 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high
1943 __ addl(EAX, ECX); 1957 __ addl(EAX, ECX);
1944 __ adcl(EDX, EBX); 1958 __ adcl(EDX, EBX);
1945 __ popl(EBX); 1959 __ popl(EBX);
1946 // Result is in EAX/EDX. 1960 // Result is in EAX/EDX.
1947 __ ret(); 1961 __ ret();
1948 } 1962 }
1949 1963
1950 1964
1951 ASSEMBLER_TEST_RUN(LongAddReg, entry) { 1965 ASSEMBLER_TEST_RUN(LongAddReg, test) {
1952 typedef int64_t (*LongAddRegCode)(int64_t a, int64_t b); 1966 typedef int64_t (*LongAddRegCode)(int64_t a, int64_t b);
1953 int64_t a = 12; 1967 int64_t a = 12;
1954 int64_t b = 14; 1968 int64_t b = 14;
1955 int64_t res = reinterpret_cast<LongAddRegCode>(entry)(a, b); 1969 int64_t res = reinterpret_cast<LongAddRegCode>(test->entry())(a, b);
1956 EXPECT_EQ((a + b), res); 1970 EXPECT_EQ((a + b), res);
1957 a = 2147483647; 1971 a = 2147483647;
1958 b = 600000; 1972 b = 600000;
1959 res = reinterpret_cast<LongAddRegCode>(entry)(a, b); 1973 res = reinterpret_cast<LongAddRegCode>(test->entry())(a, b);
1960 EXPECT_EQ((a + b), res); 1974 EXPECT_EQ((a + b), res);
1961 } 1975 }
1962 1976
1963 1977
1964 ASSEMBLER_TEST_GENERATE(LongAddAddress, assembler) { 1978 ASSEMBLER_TEST_GENERATE(LongAddAddress, assembler) {
1965 __ movl(EAX, Address(ESP, 1 * kWordSize)); // left low. 1979 __ movl(EAX, Address(ESP, 1 * kWordSize)); // left low.
1966 __ movl(EDX, Address(ESP, 2 * kWordSize)); // left high. 1980 __ movl(EDX, Address(ESP, 2 * kWordSize)); // left high.
1967 __ addl(EAX, Address(ESP, 3 * kWordSize)); // low. 1981 __ addl(EAX, Address(ESP, 3 * kWordSize)); // low.
1968 __ adcl(EDX, Address(ESP, 4 * kWordSize)); // high. 1982 __ adcl(EDX, Address(ESP, 4 * kWordSize)); // high.
1969 // Result is in EAX/EDX. 1983 // Result is in EAX/EDX.
1970 __ ret(); 1984 __ ret();
1971 } 1985 }
1972 1986
1973 1987
1974 ASSEMBLER_TEST_RUN(LongAddAddress, entry) { 1988 ASSEMBLER_TEST_RUN(LongAddAddress, test) {
1975 typedef int64_t (*LongAddAddressCode)(int64_t a, int64_t b); 1989 typedef int64_t (*LongAddAddressCode)(int64_t a, int64_t b);
1976 int64_t a = 12; 1990 int64_t a = 12;
1977 int64_t b = 14; 1991 int64_t b = 14;
1978 int64_t res = reinterpret_cast<LongAddAddressCode>(entry)(a, b); 1992 int64_t res = reinterpret_cast<LongAddAddressCode>(test->entry())(a, b);
1979 EXPECT_EQ((a + b), res); 1993 EXPECT_EQ((a + b), res);
1980 a = 2147483647; 1994 a = 2147483647;
1981 b = 600000; 1995 b = 600000;
1982 res = reinterpret_cast<LongAddAddressCode>(entry)(a, b); 1996 res = reinterpret_cast<LongAddAddressCode>(test->entry())(a, b);
1983 EXPECT_EQ((a + b), res); 1997 EXPECT_EQ((a + b), res);
1984 } 1998 }
1985 1999
1986 2000
1987 ASSEMBLER_TEST_GENERATE(LongSubReg, assembler) { 2001 ASSEMBLER_TEST_GENERATE(LongSubReg, assembler) {
1988 // Preserve clobbered callee-saved register (EBX). 2002 // Preserve clobbered callee-saved register (EBX).
1989 __ pushl(EBX); 2003 __ pushl(EBX);
1990 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low. 2004 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low.
1991 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high. 2005 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high.
1992 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low. 2006 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low.
1993 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high 2007 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high
1994 __ subl(EAX, ECX); 2008 __ subl(EAX, ECX);
1995 __ sbbl(EDX, EBX); 2009 __ sbbl(EDX, EBX);
1996 __ popl(EBX); 2010 __ popl(EBX);
1997 // Result is in EAX/EDX. 2011 // Result is in EAX/EDX.
1998 __ ret(); 2012 __ ret();
1999 } 2013 }
2000 2014
2001 2015
2002 ASSEMBLER_TEST_RUN(LongSubReg, entry) { 2016 ASSEMBLER_TEST_RUN(LongSubReg, test) {
2003 typedef int64_t (*LongSubRegCode)(int64_t a, int64_t b); 2017 typedef int64_t (*LongSubRegCode)(int64_t a, int64_t b);
2004 int64_t a = 12; 2018 int64_t a = 12;
2005 int64_t b = 14; 2019 int64_t b = 14;
2006 int64_t res = reinterpret_cast<LongSubRegCode>(entry)(a, b); 2020 int64_t res = reinterpret_cast<LongSubRegCode>(test->entry())(a, b);
2007 EXPECT_EQ((a - b), res); 2021 EXPECT_EQ((a - b), res);
2008 a = 600000; 2022 a = 600000;
2009 b = 2147483647; 2023 b = 2147483647;
2010 res = reinterpret_cast<LongSubRegCode>(entry)(a, b); 2024 res = reinterpret_cast<LongSubRegCode>(test->entry())(a, b);
2011 EXPECT_EQ((a - b), res); 2025 EXPECT_EQ((a - b), res);
2012 } 2026 }
2013 2027
2014 2028
2015 ASSEMBLER_TEST_GENERATE(LongSubAddress, assembler) { 2029 ASSEMBLER_TEST_GENERATE(LongSubAddress, assembler) {
2016 __ movl(EAX, Address(ESP, 1 * kWordSize)); // left low. 2030 __ movl(EAX, Address(ESP, 1 * kWordSize)); // left low.
2017 __ movl(EDX, Address(ESP, 2 * kWordSize)); // left high. 2031 __ movl(EDX, Address(ESP, 2 * kWordSize)); // left high.
2018 __ subl(EAX, Address(ESP, 3 * kWordSize)); // low. 2032 __ subl(EAX, Address(ESP, 3 * kWordSize)); // low.
2019 __ sbbl(EDX, Address(ESP, 4 * kWordSize)); // high. 2033 __ sbbl(EDX, Address(ESP, 4 * kWordSize)); // high.
2020 // Result is in EAX/EDX. 2034 // Result is in EAX/EDX.
2021 __ ret(); 2035 __ ret();
2022 } 2036 }
2023 2037
2024 2038
2025 ASSEMBLER_TEST_RUN(LongSubAddress, entry) { 2039 ASSEMBLER_TEST_RUN(LongSubAddress, test) {
2026 typedef int64_t (*LongSubAddressCode)(int64_t a, int64_t b); 2040 typedef int64_t (*LongSubAddressCode)(int64_t a, int64_t b);
2027 int64_t a = 12; 2041 int64_t a = 12;
2028 int64_t b = 14; 2042 int64_t b = 14;
2029 int64_t res = reinterpret_cast<LongSubAddressCode>(entry)(a, b); 2043 int64_t res = reinterpret_cast<LongSubAddressCode>(test->entry())(a, b);
2030 EXPECT_EQ((a - b), res); 2044 EXPECT_EQ((a - b), res);
2031 a = 600000; 2045 a = 600000;
2032 b = 2147483647; 2046 b = 2147483647;
2033 res = reinterpret_cast<LongSubAddressCode>(entry)(a, b); 2047 res = reinterpret_cast<LongSubAddressCode>(test->entry())(a, b);
2034 EXPECT_EQ((a - b), res); 2048 EXPECT_EQ((a - b), res);
2035 } 2049 }
2036 2050
2037 2051
2038 ASSEMBLER_TEST_GENERATE(LongSubAddress2, assembler) { 2052 ASSEMBLER_TEST_GENERATE(LongSubAddress2, assembler) {
2039 // Preserve clobbered callee-saved register (EBX). 2053 // Preserve clobbered callee-saved register (EBX).
2040 __ pushl(EBX); 2054 __ pushl(EBX);
2041 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low. 2055 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low.
2042 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high. 2056 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high.
2043 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low. 2057 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low.
2044 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high 2058 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high
2045 __ subl(ESP, Immediate(2 * kWordSize)); 2059 __ subl(ESP, Immediate(2 * kWordSize));
2046 __ movl(Address(ESP, 0 * kWordSize), EAX); // left low. 2060 __ movl(Address(ESP, 0 * kWordSize), EAX); // left low.
2047 __ movl(Address(ESP, 1 * kWordSize), EDX); // left high. 2061 __ movl(Address(ESP, 1 * kWordSize), EDX); // left high.
2048 __ subl(Address(ESP, 0 * kWordSize), ECX); 2062 __ subl(Address(ESP, 0 * kWordSize), ECX);
2049 __ sbbl(Address(ESP, 1 * kWordSize), EBX); 2063 __ sbbl(Address(ESP, 1 * kWordSize), EBX);
2050 __ movl(EAX, Address(ESP, 0 * kWordSize)); 2064 __ movl(EAX, Address(ESP, 0 * kWordSize));
2051 __ movl(EDX, Address(ESP, 1 * kWordSize)); 2065 __ movl(EDX, Address(ESP, 1 * kWordSize));
2052 __ addl(ESP, Immediate(2 * kWordSize)); 2066 __ addl(ESP, Immediate(2 * kWordSize));
2053 __ popl(EBX); 2067 __ popl(EBX);
2054 // Result is in EAX/EDX. 2068 // Result is in EAX/EDX.
2055 __ ret(); 2069 __ ret();
2056 } 2070 }
2057 2071
2058 2072
2059 ASSEMBLER_TEST_RUN(LongSubAddress2, entry) { 2073 ASSEMBLER_TEST_RUN(LongSubAddress2, test) {
2060 typedef int64_t (*LongSubAddress2Code)(int64_t a, int64_t b); 2074 typedef int64_t (*LongSubAddress2Code)(int64_t a, int64_t b);
2061 int64_t a = 12; 2075 int64_t a = 12;
2062 int64_t b = 14; 2076 int64_t b = 14;
2063 int64_t res = reinterpret_cast<LongSubAddress2Code>(entry)(a, b); 2077 int64_t res = reinterpret_cast<LongSubAddress2Code>(test->entry())(a, b);
2064 EXPECT_EQ((a - b), res); 2078 EXPECT_EQ((a - b), res);
2065 a = 600000; 2079 a = 600000;
2066 b = 2147483647; 2080 b = 2147483647;
2067 res = reinterpret_cast<LongSubAddress2Code>(entry)(a, b); 2081 res = reinterpret_cast<LongSubAddress2Code>(test->entry())(a, b);
2068 EXPECT_EQ((a - b), res); 2082 EXPECT_EQ((a - b), res);
2069 } 2083 }
2070 2084
2071 2085
2072 ASSEMBLER_TEST_GENERATE(LongAddAddress2, assembler) { 2086 ASSEMBLER_TEST_GENERATE(LongAddAddress2, assembler) {
2073 // Preserve clobbered callee-saved register (EBX). 2087 // Preserve clobbered callee-saved register (EBX).
2074 __ pushl(EBX); 2088 __ pushl(EBX);
2075 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low. 2089 __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low.
2076 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high. 2090 __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high.
2077 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low. 2091 __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low.
2078 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high 2092 __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high
2079 __ subl(ESP, Immediate(2 * kWordSize)); 2093 __ subl(ESP, Immediate(2 * kWordSize));
2080 __ movl(Address(ESP, 0 * kWordSize), EAX); // left low. 2094 __ movl(Address(ESP, 0 * kWordSize), EAX); // left low.
2081 __ movl(Address(ESP, 1 * kWordSize), EDX); // left high. 2095 __ movl(Address(ESP, 1 * kWordSize), EDX); // left high.
2082 __ addl(Address(ESP, 0 * kWordSize), ECX); 2096 __ addl(Address(ESP, 0 * kWordSize), ECX);
2083 __ adcl(Address(ESP, 1 * kWordSize), EBX); 2097 __ adcl(Address(ESP, 1 * kWordSize), EBX);
2084 __ movl(EAX, Address(ESP, 0 * kWordSize)); 2098 __ movl(EAX, Address(ESP, 0 * kWordSize));
2085 __ movl(EDX, Address(ESP, 1 * kWordSize)); 2099 __ movl(EDX, Address(ESP, 1 * kWordSize));
2086 __ addl(ESP, Immediate(2 * kWordSize)); 2100 __ addl(ESP, Immediate(2 * kWordSize));
2087 __ popl(EBX); 2101 __ popl(EBX);
2088 // Result is in EAX/EDX. 2102 // Result is in EAX/EDX.
2089 __ ret(); 2103 __ ret();
2090 } 2104 }
2091 2105
2092 2106
2093 ASSEMBLER_TEST_RUN(LongAddAddress2, entry) { 2107 ASSEMBLER_TEST_RUN(LongAddAddress2, test) {
2094 typedef int64_t (*LongAddAddress2Code)(int64_t a, int64_t b); 2108 typedef int64_t (*LongAddAddress2Code)(int64_t a, int64_t b);
2095 int64_t a = 12; 2109 int64_t a = 12;
2096 int64_t b = 14; 2110 int64_t b = 14;
2097 int64_t res = reinterpret_cast<LongAddAddress2Code>(entry)(a, b); 2111 int64_t res = reinterpret_cast<LongAddAddress2Code>(test->entry())(a, b);
2098 EXPECT_EQ((a + b), res); 2112 EXPECT_EQ((a + b), res);
2099 a = 600000; 2113 a = 600000;
2100 b = 2147483647; 2114 b = 2147483647;
2101 res = reinterpret_cast<LongAddAddress2Code>(entry)(a, b); 2115 res = reinterpret_cast<LongAddAddress2Code>(test->entry())(a, b);
2102 EXPECT_EQ((a + b), res); 2116 EXPECT_EQ((a + b), res);
2103 } 2117 }
2104 2118
2105 2119
2106 // Testing only the lower 64-bit value of 'cvtdq2pd'. 2120 // Testing only the lower 64-bit value of 'cvtdq2pd'.
2107 ASSEMBLER_TEST_GENERATE(IntegerToDoubleConversion, assembler) { 2121 ASSEMBLER_TEST_GENERATE(IntegerToDoubleConversion, assembler) {
2108 __ movsd(XMM1, Address(ESP, kWordSize)); 2122 __ movsd(XMM1, Address(ESP, kWordSize));
2109 __ cvtdq2pd(XMM2, XMM1); 2123 __ cvtdq2pd(XMM2, XMM1);
2110 __ pushl(EAX); 2124 __ pushl(EAX);
2111 __ pushl(EAX); 2125 __ pushl(EAX);
2112 __ movsd(Address(ESP, 0), XMM2); 2126 __ movsd(Address(ESP, 0), XMM2);
2113 __ fldl(Address(ESP, 0)); 2127 __ fldl(Address(ESP, 0));
2114 __ popl(EAX); 2128 __ popl(EAX);
2115 __ popl(EAX); 2129 __ popl(EAX);
2116 __ ret(); 2130 __ ret();
2117 } 2131 }
2118 2132
2119 2133
2120 ASSEMBLER_TEST_RUN(IntegerToDoubleConversion, entry) { 2134 ASSEMBLER_TEST_RUN(IntegerToDoubleConversion, test) {
2121 typedef double (*IntegerToDoubleConversionCode)(int32_t); 2135 typedef double (*IntegerToDoubleConversionCode)(int32_t);
2122 const int32_t val = -12; 2136 const int32_t val = -12;
2123 double res = reinterpret_cast<IntegerToDoubleConversionCode>(entry)(val); 2137 double res =
2138 reinterpret_cast<IntegerToDoubleConversionCode>(test->entry())(val);
2124 EXPECT_FLOAT_EQ(static_cast<double>(val), res, 0.001); 2139 EXPECT_FLOAT_EQ(static_cast<double>(val), res, 0.001);
2125 } 2140 }
2126 2141
2127 2142
2128 // Implement with truncation. 2143 // Implement with truncation.
2129 ASSEMBLER_TEST_GENERATE(FPUStoreLong, assembler) { 2144 ASSEMBLER_TEST_GENERATE(FPUStoreLong, assembler) {
2130 __ fldl(Address(ESP, kWordSize)); 2145 __ fldl(Address(ESP, kWordSize));
2131 __ pushl(EAX); 2146 __ pushl(EAX);
2132 __ pushl(EAX); 2147 __ pushl(EAX);
2133 __ fnstcw(Address(ESP, 0)); 2148 __ fnstcw(Address(ESP, 0));
2134 __ movzxw(EAX, Address(ESP, 0)); 2149 __ movzxw(EAX, Address(ESP, 0));
2135 __ orl(EAX, Immediate(0x0c00)); 2150 __ orl(EAX, Immediate(0x0c00));
2136 __ movw(Address(ESP, kWordSize), EAX); 2151 __ movw(Address(ESP, kWordSize), EAX);
2137 __ fldcw(Address(ESP, kWordSize)); 2152 __ fldcw(Address(ESP, kWordSize));
2138 __ pushl(EAX); 2153 __ pushl(EAX);
2139 __ pushl(EAX); 2154 __ pushl(EAX);
2140 __ fistpl(Address(ESP, 0)); 2155 __ fistpl(Address(ESP, 0));
2141 __ popl(EAX); 2156 __ popl(EAX);
2142 __ popl(EDX); 2157 __ popl(EDX);
2143 __ fldcw(Address(ESP, 0)); 2158 __ fldcw(Address(ESP, 0));
2144 __ addl(ESP, Immediate(kWordSize * 2)); 2159 __ addl(ESP, Immediate(kWordSize * 2));
2145 __ ret(); 2160 __ ret();
2146 } 2161 }
2147 2162
2148 2163
2149 ASSEMBLER_TEST_RUN(FPUStoreLong, entry) { 2164 ASSEMBLER_TEST_RUN(FPUStoreLong, test) {
2150 typedef int64_t (*FPUStoreLongCode)(double d); 2165 typedef int64_t (*FPUStoreLongCode)(double d);
2151 double val = 12.2; 2166 double val = 12.2;
2152 int64_t res = reinterpret_cast<FPUStoreLongCode>(entry)(val); 2167 int64_t res = reinterpret_cast<FPUStoreLongCode>(test->entry())(val);
2153 EXPECT_EQ(static_cast<int64_t>(val), res); 2168 EXPECT_EQ(static_cast<int64_t>(val), res);
2154 val = -12.2; 2169 val = -12.2;
2155 res = reinterpret_cast<FPUStoreLongCode>(entry)(val); 2170 res = reinterpret_cast<FPUStoreLongCode>(test->entry())(val);
2156 EXPECT_EQ(static_cast<int64_t>(val), res); 2171 EXPECT_EQ(static_cast<int64_t>(val), res);
2157 val = 12.8; 2172 val = 12.8;
2158 res = reinterpret_cast<FPUStoreLongCode>(entry)(val); 2173 res = reinterpret_cast<FPUStoreLongCode>(test->entry())(val);
2159 EXPECT_EQ(static_cast<int64_t>(val), res); 2174 EXPECT_EQ(static_cast<int64_t>(val), res);
2160 val = -12.8; 2175 val = -12.8;
2161 res = reinterpret_cast<FPUStoreLongCode>(entry)(val); 2176 res = reinterpret_cast<FPUStoreLongCode>(test->entry())(val);
2162 EXPECT_EQ(static_cast<int64_t>(val), res); 2177 EXPECT_EQ(static_cast<int64_t>(val), res);
2163 } 2178 }
2164 2179
2165 2180
2166 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) { 2181 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) {
2167 __ movsd(XMM0, Address(ESP, kWordSize)); 2182 __ movsd(XMM0, Address(ESP, kWordSize));
2168 __ xorpd(XMM0, XMM0); 2183 __ xorpd(XMM0, XMM0);
2169 __ pushl(EAX); 2184 __ pushl(EAX);
2170 __ pushl(EAX); 2185 __ pushl(EAX);
2171 __ movsd(Address(ESP, 0), XMM0); 2186 __ movsd(Address(ESP, 0), XMM0);
2172 __ fldl(Address(ESP, 0)); 2187 __ fldl(Address(ESP, 0));
2173 __ popl(EAX); 2188 __ popl(EAX);
2174 __ popl(EAX); 2189 __ popl(EAX);
2175 __ ret(); 2190 __ ret();
2176 } 2191 }
2177 2192
2178 2193
2179 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) { 2194 ASSEMBLER_TEST_RUN(XorpdZeroing, test) {
2180 typedef double (*XorpdZeroingCode)(double d); 2195 typedef double (*XorpdZeroingCode)(double d);
2181 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3); 2196 double res = reinterpret_cast<XorpdZeroingCode>(test->entry())(12.56e3);
2182 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 2197 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
2183 } 2198 }
2184 2199
2185 2200
2186 ASSEMBLER_TEST_GENERATE(Pxor, assembler) { 2201 ASSEMBLER_TEST_GENERATE(Pxor, assembler) {
2187 __ movsd(XMM0, Address(ESP, kWordSize)); 2202 __ movsd(XMM0, Address(ESP, kWordSize));
2188 __ pxor(XMM0, XMM0); 2203 __ pxor(XMM0, XMM0);
2189 __ pushl(EAX); 2204 __ pushl(EAX);
2190 __ pushl(EAX); 2205 __ pushl(EAX);
2191 __ movsd(Address(ESP, 0), XMM0); 2206 __ movsd(Address(ESP, 0), XMM0);
2192 __ fldl(Address(ESP, 0)); 2207 __ fldl(Address(ESP, 0));
2193 __ popl(EAX); 2208 __ popl(EAX);
2194 __ popl(EAX); 2209 __ popl(EAX);
2195 __ ret(); 2210 __ ret();
2196 } 2211 }
2197 2212
2198 2213
2199 ASSEMBLER_TEST_RUN(Pxor, entry) { 2214 ASSEMBLER_TEST_RUN(Pxor, test) {
2200 typedef double (*PxorCode)(double d); 2215 typedef double (*PxorCode)(double d);
2201 double res = reinterpret_cast<PxorCode>(entry)(12.3456e3); 2216 double res = reinterpret_cast<PxorCode>(test->entry())(12.3456e3);
2202 EXPECT_FLOAT_EQ(0.0, res, 0.0); 2217 EXPECT_FLOAT_EQ(0.0, res, 0.0);
2203 } 2218 }
2204 2219
2205 2220
2206 ASSEMBLER_TEST_GENERATE(Orpd, assembler) { 2221 ASSEMBLER_TEST_GENERATE(Orpd, assembler) {
2207 __ movsd(XMM0, Address(ESP, kWordSize)); 2222 __ movsd(XMM0, Address(ESP, kWordSize));
2208 __ xorpd(XMM1, XMM1); 2223 __ xorpd(XMM1, XMM1);
2209 __ DoubleNegate(XMM1); 2224 __ DoubleNegate(XMM1);
2210 __ orpd(XMM0, XMM1); 2225 __ orpd(XMM0, XMM1);
2211 __ pushl(EAX); 2226 __ pushl(EAX);
2212 __ pushl(EAX); 2227 __ pushl(EAX);
2213 __ movsd(Address(ESP, 0), XMM0); 2228 __ movsd(Address(ESP, 0), XMM0);
2214 __ fldl(Address(ESP, 0)); 2229 __ fldl(Address(ESP, 0));
2215 __ popl(EAX); 2230 __ popl(EAX);
2216 __ popl(EAX); 2231 __ popl(EAX);
2217 __ ret(); 2232 __ ret();
2218 } 2233 }
2219 2234
2220 2235
2221 ASSEMBLER_TEST_RUN(Orpd, entry) { 2236 ASSEMBLER_TEST_RUN(Orpd, test) {
2222 typedef double (*OrpdCode)(double d); 2237 typedef double (*OrpdCode)(double d);
2223 double res = reinterpret_cast<OrpdCode>(entry)(12.56e3); 2238 double res = reinterpret_cast<OrpdCode>(test->entry())(12.56e3);
2224 EXPECT_FLOAT_EQ(-12.56e3, res, 0.0); 2239 EXPECT_FLOAT_EQ(-12.56e3, res, 0.0);
2225 } 2240 }
2226 2241
2227 2242
2228 ASSEMBLER_TEST_GENERATE(Pextrd0, assembler) { 2243 ASSEMBLER_TEST_GENERATE(Pextrd0, assembler) {
2229 if (CPUFeatures::sse4_1_supported()) { 2244 if (CPUFeatures::sse4_1_supported()) {
2230 __ movsd(XMM0, Address(ESP, kWordSize)); 2245 __ movsd(XMM0, Address(ESP, kWordSize));
2231 __ pextrd(EAX, XMM0, Immediate(0)); 2246 __ pextrd(EAX, XMM0, Immediate(0));
2232 } 2247 }
2233 __ ret(); 2248 __ ret();
2234 } 2249 }
2235 2250
2236 2251
2237 ASSEMBLER_TEST_RUN(Pextrd0, entry) { 2252 ASSEMBLER_TEST_RUN(Pextrd0, test) {
2238 if (CPUFeatures::sse4_1_supported()) { 2253 if (CPUFeatures::sse4_1_supported()) {
2239 typedef int32_t (*PextrdCode0)(double d); 2254 typedef int32_t (*PextrdCode0)(double d);
2240 int32_t res = reinterpret_cast<PextrdCode0>(entry)(123456789); 2255 int32_t res = reinterpret_cast<PextrdCode0>(test->entry())(123456789);
2241 EXPECT_EQ(0x54000000, res); 2256 EXPECT_EQ(0x54000000, res);
2242 } 2257 }
2243 } 2258 }
2244 2259
2245 2260
2246 ASSEMBLER_TEST_GENERATE(Pextrd1, assembler) { 2261 ASSEMBLER_TEST_GENERATE(Pextrd1, assembler) {
2247 if (CPUFeatures::sse4_1_supported()) { 2262 if (CPUFeatures::sse4_1_supported()) {
2248 __ movsd(XMM0, Address(ESP, kWordSize)); 2263 __ movsd(XMM0, Address(ESP, kWordSize));
2249 __ pextrd(EAX, XMM0, Immediate(1)); 2264 __ pextrd(EAX, XMM0, Immediate(1));
2250 } 2265 }
2251 __ ret(); 2266 __ ret();
2252 } 2267 }
2253 2268
2254 2269
2255 ASSEMBLER_TEST_RUN(Pextrd1, entry) { 2270 ASSEMBLER_TEST_RUN(Pextrd1, test) {
2256 if (CPUFeatures::sse4_1_supported()) { 2271 if (CPUFeatures::sse4_1_supported()) {
2257 typedef int32_t (*PextrdCode1)(double d); 2272 typedef int32_t (*PextrdCode1)(double d);
2258 int32_t res = reinterpret_cast<PextrdCode1>(entry)(123456789); 2273 int32_t res = reinterpret_cast<PextrdCode1>(test->entry())(123456789);
2259 EXPECT_EQ(0x419d6f34, res); 2274 EXPECT_EQ(0x419d6f34, res);
2260 } 2275 }
2261 } 2276 }
2262 2277
2263 2278
2264 ASSEMBLER_TEST_GENERATE(Pmovsxdq, assembler) { 2279 ASSEMBLER_TEST_GENERATE(Pmovsxdq, assembler) {
2265 if (CPUFeatures::sse4_1_supported()) { 2280 if (CPUFeatures::sse4_1_supported()) {
2266 __ movsd(XMM0, Address(ESP, kWordSize)); 2281 __ movsd(XMM0, Address(ESP, kWordSize));
2267 __ pmovsxdq(XMM0, XMM0); 2282 __ pmovsxdq(XMM0, XMM0);
2268 __ pextrd(EAX, XMM0, Immediate(1)); 2283 __ pextrd(EAX, XMM0, Immediate(1));
2269 } 2284 }
2270 __ ret(); 2285 __ ret();
2271 } 2286 }
2272 2287
2273 2288
2274 ASSEMBLER_TEST_RUN(Pmovsxdq, entry) { 2289 ASSEMBLER_TEST_RUN(Pmovsxdq, test) {
2275 if (CPUFeatures::sse4_1_supported()) { 2290 if (CPUFeatures::sse4_1_supported()) {
2276 typedef int32_t (*PmovsxdqCode)(double d); 2291 typedef int32_t (*PmovsxdqCode)(double d);
2277 int32_t res = reinterpret_cast<PmovsxdqCode>(entry)(123456789); 2292 int32_t res = reinterpret_cast<PmovsxdqCode>(test->entry())(123456789);
2278 EXPECT_EQ(0, res); 2293 EXPECT_EQ(0, res);
2279 } 2294 }
2280 } 2295 }
2281 2296
2282 2297
2283 ASSEMBLER_TEST_GENERATE(Pcmpeqq, assembler) { 2298 ASSEMBLER_TEST_GENERATE(Pcmpeqq, assembler) {
2284 if (CPUFeatures::sse4_1_supported()) { 2299 if (CPUFeatures::sse4_1_supported()) {
2285 __ movsd(XMM0, Address(ESP, kWordSize)); 2300 __ movsd(XMM0, Address(ESP, kWordSize));
2286 __ xorpd(XMM1, XMM1); 2301 __ xorpd(XMM1, XMM1);
2287 __ pcmpeqq(XMM0, XMM1); 2302 __ pcmpeqq(XMM0, XMM1);
2288 __ movd(EAX, XMM0); 2303 __ movd(EAX, XMM0);
2289 } 2304 }
2290 __ ret(); 2305 __ ret();
2291 } 2306 }
2292 2307
2293 2308
2294 ASSEMBLER_TEST_RUN(Pcmpeqq, entry) { 2309 ASSEMBLER_TEST_RUN(Pcmpeqq, test) {
2295 if (CPUFeatures::sse4_1_supported()) { 2310 if (CPUFeatures::sse4_1_supported()) {
2296 typedef int32_t (*PcmpeqqCode)(double d); 2311 typedef int32_t (*PcmpeqqCode)(double d);
2297 int32_t res = reinterpret_cast<PcmpeqqCode>(entry)(0); 2312 int32_t res = reinterpret_cast<PcmpeqqCode>(test->entry())(0);
2298 EXPECT_EQ(-1, res); 2313 EXPECT_EQ(-1, res);
2299 } 2314 }
2300 } 2315 }
2301 2316
2302 2317
2303 ASSEMBLER_TEST_GENERATE(AndPd, assembler) { 2318 ASSEMBLER_TEST_GENERATE(AndPd, assembler) {
2304 __ movsd(XMM0, Address(ESP, kWordSize)); 2319 __ movsd(XMM0, Address(ESP, kWordSize));
2305 __ andpd(XMM0, XMM0); 2320 __ andpd(XMM0, XMM0);
2306 __ pushl(EAX); 2321 __ pushl(EAX);
2307 __ pushl(EAX); 2322 __ pushl(EAX);
2308 __ movsd(Address(ESP, 0), XMM0); 2323 __ movsd(Address(ESP, 0), XMM0);
2309 __ fldl(Address(ESP, 0)); 2324 __ fldl(Address(ESP, 0));
2310 __ popl(EAX); 2325 __ popl(EAX);
2311 __ popl(EAX); 2326 __ popl(EAX);
2312 __ ret(); 2327 __ ret();
2313 } 2328 }
2314 2329
2315 2330
2316 ASSEMBLER_TEST_RUN(AndPd, entry) { 2331 ASSEMBLER_TEST_RUN(AndPd, test) {
2317 typedef double (*AndpdCode)(double d); 2332 typedef double (*AndpdCode)(double d);
2318 double res = reinterpret_cast<AndpdCode>(entry)(12.56e3); 2333 double res = reinterpret_cast<AndpdCode>(test->entry())(12.56e3);
2319 EXPECT_FLOAT_EQ(12.56e3, res, 0.0); 2334 EXPECT_FLOAT_EQ(12.56e3, res, 0.0);
2320 } 2335 }
2321 2336
2322 2337
2323 ASSEMBLER_TEST_GENERATE(Movq, assembler) { 2338 ASSEMBLER_TEST_GENERATE(Movq, assembler) {
2324 __ movq(XMM0, Address(ESP, kWordSize)); 2339 __ movq(XMM0, Address(ESP, kWordSize));
2325 __ subl(ESP, Immediate(kDoubleSize)); 2340 __ subl(ESP, Immediate(kDoubleSize));
2326 __ movq(Address(ESP, 0), XMM0); 2341 __ movq(Address(ESP, 0), XMM0);
2327 __ fldl(Address(ESP, 0)); 2342 __ fldl(Address(ESP, 0));
2328 __ addl(ESP, Immediate(kDoubleSize)); 2343 __ addl(ESP, Immediate(kDoubleSize));
2329 __ ret(); 2344 __ ret();
2330 } 2345 }
2331 2346
2332 2347
2333 ASSEMBLER_TEST_RUN(Movq, entry) { 2348 ASSEMBLER_TEST_RUN(Movq, test) {
2334 typedef double (*MovqCode)(double d); 2349 typedef double (*MovqCode)(double d);
2335 double res = reinterpret_cast<MovqCode>(entry)(12.34e5); 2350 double res = reinterpret_cast<MovqCode>(test->entry())(12.34e5);
2336 EXPECT_FLOAT_EQ(12.34e5, res, 0.0); 2351 EXPECT_FLOAT_EQ(12.34e5, res, 0.0);
2337 } 2352 }
2338 2353
2339 2354
2340 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) { 2355 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
2341 __ movsd(XMM0, Address(ESP, kWordSize)); 2356 __ movsd(XMM0, Address(ESP, kWordSize));
2342 __ DoubleAbs(XMM0); 2357 __ DoubleAbs(XMM0);
2343 __ pushl(EAX); 2358 __ pushl(EAX);
2344 __ pushl(EAX); 2359 __ pushl(EAX);
2345 __ movsd(Address(ESP, 0), XMM0); 2360 __ movsd(Address(ESP, 0), XMM0);
2346 __ fldl(Address(ESP, 0)); 2361 __ fldl(Address(ESP, 0));
2347 __ popl(EAX); 2362 __ popl(EAX);
2348 __ popl(EAX); 2363 __ popl(EAX);
2349 __ ret(); 2364 __ ret();
2350 } 2365 }
2351 2366
2352 2367
2353 ASSEMBLER_TEST_RUN(DoubleAbs, entry) { 2368 ASSEMBLER_TEST_RUN(DoubleAbs, test) {
2354 typedef double (*DoubleAbsCode)(double d); 2369 typedef double (*DoubleAbsCode)(double d);
2355 double val = -12.45; 2370 double val = -12.45;
2356 double res = reinterpret_cast<DoubleAbsCode>(entry)(val); 2371 double res = reinterpret_cast<DoubleAbsCode>(test->entry())(val);
2357 EXPECT_FLOAT_EQ(-val, res, 0.001); 2372 EXPECT_FLOAT_EQ(-val, res, 0.001);
2358 val = 12.45; 2373 val = 12.45;
2359 res = reinterpret_cast<DoubleAbsCode>(entry)(val); 2374 res = reinterpret_cast<DoubleAbsCode>(test->entry())(val);
2360 EXPECT_FLOAT_EQ(val, res, 0.001); 2375 EXPECT_FLOAT_EQ(val, res, 0.001);
2361 } 2376 }
2362 2377
2363 2378
2364 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) { 2379 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) {
2365 __ movsd(XMM0, Address(ESP, kWordSize)); 2380 __ movsd(XMM0, Address(ESP, kWordSize));
2366 __ movmskpd(EAX, XMM0); 2381 __ movmskpd(EAX, XMM0);
2367 __ andl(EAX, Immediate(0x1)); 2382 __ andl(EAX, Immediate(0x1));
2368 __ ret(); 2383 __ ret();
2369 } 2384 }
2370 2385
2371 2386
2372 ASSEMBLER_TEST_RUN(ExtractSignBits, entry) { 2387 ASSEMBLER_TEST_RUN(ExtractSignBits, test) {
2373 typedef int (*ExtractSignBits)(double d); 2388 typedef int (*ExtractSignBits)(double d);
2374 int res = reinterpret_cast<ExtractSignBits>(entry)(1.0); 2389 int res = reinterpret_cast<ExtractSignBits>(test->entry())(1.0);
2375 EXPECT_EQ(0, res); 2390 EXPECT_EQ(0, res);
2376 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0); 2391 res = reinterpret_cast<ExtractSignBits>(test->entry())(-1.0);
2377 EXPECT_EQ(1, res); 2392 EXPECT_EQ(1, res);
2378 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0); 2393 res = reinterpret_cast<ExtractSignBits>(test->entry())(-0.0);
2379 EXPECT_EQ(1, res); 2394 EXPECT_EQ(1, res);
2380 } 2395 }
2381 2396
2382 2397
2383 // Return -1 if signed, 1 if not signed and 0 otherwise. 2398 // Return -1 if signed, 1 if not signed and 0 otherwise.
2384 ASSEMBLER_TEST_GENERATE(ConditionalMovesSign, assembler) { 2399 ASSEMBLER_TEST_GENERATE(ConditionalMovesSign, assembler) {
2385 // Preserve clobbered callee-saved register (EBX). 2400 // Preserve clobbered callee-saved register (EBX).
2386 __ pushl(EBX); 2401 __ pushl(EBX);
2387 2402
2388 __ movl(EDX, Address(ESP, 2 * kWordSize)); 2403 __ movl(EDX, Address(ESP, 2 * kWordSize));
2389 __ xorl(EAX, EAX); 2404 __ xorl(EAX, EAX);
2390 __ movl(EBX, Immediate(1)); 2405 __ movl(EBX, Immediate(1));
2391 __ movl(ECX, Immediate(-1)); 2406 __ movl(ECX, Immediate(-1));
2392 __ testl(EDX, EDX); 2407 __ testl(EDX, EDX);
2393 __ cmovs(EAX, ECX); // return -1. 2408 __ cmovs(EAX, ECX); // return -1.
2394 __ testl(EDX, EDX); 2409 __ testl(EDX, EDX);
2395 __ cmovns(EAX, EBX); // return 1. 2410 __ cmovns(EAX, EBX); // return 1.
2396 2411
2397 // Restore callee-saved register (EBX) and return. 2412 // Restore callee-saved register (EBX) and return.
2398 __ popl(EBX); 2413 __ popl(EBX);
2399 __ ret(); 2414 __ ret();
2400 } 2415 }
2401 2416
2402 2417
2403 ASSEMBLER_TEST_RUN(ConditionalMovesSign, entry) { 2418 ASSEMBLER_TEST_RUN(ConditionalMovesSign, test) {
2404 typedef int (*ConditionalMovesSignCode)(int i); 2419 typedef int (*ConditionalMovesSignCode)(int i);
2405 int res = reinterpret_cast<ConditionalMovesSignCode>(entry)(785); 2420 int res = reinterpret_cast<ConditionalMovesSignCode>(test->entry())(785);
2406 EXPECT_EQ(1, res); 2421 EXPECT_EQ(1, res);
2407 res = reinterpret_cast<ConditionalMovesSignCode>(entry)(-12); 2422 res = reinterpret_cast<ConditionalMovesSignCode>(test->entry())(-12);
2408 EXPECT_EQ(-1, res); 2423 EXPECT_EQ(-1, res);
2409 } 2424 }
2410 2425
2411 2426
2412 ASSEMBLER_TEST_GENERATE(TestLoadDoubleConstant, assembler) { 2427 ASSEMBLER_TEST_GENERATE(TestLoadDoubleConstant, assembler) {
2413 __ LoadDoubleConstant(XMM3, -12.34); 2428 __ LoadDoubleConstant(XMM3, -12.34);
2414 __ pushl(EAX); 2429 __ pushl(EAX);
2415 __ pushl(EAX); 2430 __ pushl(EAX);
2416 __ movsd(Address(ESP, 0), XMM3); 2431 __ movsd(Address(ESP, 0), XMM3);
2417 __ fldl(Address(ESP, 0)); 2432 __ fldl(Address(ESP, 0));
2418 __ popl(EAX); 2433 __ popl(EAX);
2419 __ popl(EAX); 2434 __ popl(EAX);
2420 __ ret(); 2435 __ ret();
2421 } 2436 }
2422 2437
2423 2438
2424 ASSEMBLER_TEST_RUN(TestLoadDoubleConstant, entry) { 2439 ASSEMBLER_TEST_RUN(TestLoadDoubleConstant, test) {
2425 typedef double (*TestLoadDoubleConstantCode)(); 2440 typedef double (*TestLoadDoubleConstantCode)();
2426 double res = reinterpret_cast<TestLoadDoubleConstantCode>(entry)(); 2441 double res = reinterpret_cast<TestLoadDoubleConstantCode>(test->entry())();
2427 EXPECT_FLOAT_EQ(-12.34, res, 0.0001); 2442 EXPECT_FLOAT_EQ(-12.34, res, 0.0001);
2428 } 2443 }
2429 2444
2430 2445
2431 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) { 2446 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) {
2432 ObjectStore* object_store = Isolate::Current()->object_store(); 2447 ObjectStore* object_store = Isolate::Current()->object_store();
2433 const Object& obj = Object::ZoneHandle(object_store->smi_class()); 2448 const Object& obj = Object::ZoneHandle(object_store->smi_class());
2434 Label fail; 2449 Label fail;
2435 __ LoadObject(EAX, obj); 2450 __ LoadObject(EAX, obj);
2436 __ CompareObject(EAX, obj); 2451 __ CompareObject(EAX, obj);
2437 __ j(NOT_EQUAL, &fail); 2452 __ j(NOT_EQUAL, &fail);
2438 __ LoadObject(ECX, obj); 2453 __ LoadObject(ECX, obj);
2439 __ CompareObject(ECX, obj); 2454 __ CompareObject(ECX, obj);
2440 __ j(NOT_EQUAL, &fail); 2455 __ j(NOT_EQUAL, &fail);
2441 __ movl(EAX, Immediate(1)); // OK 2456 __ movl(EAX, Immediate(1)); // OK
2442 __ ret(); 2457 __ ret();
2443 __ Bind(&fail); 2458 __ Bind(&fail);
2444 __ movl(EAX, Immediate(0)); // Fail. 2459 __ movl(EAX, Immediate(0)); // Fail.
2445 __ ret(); 2460 __ ret();
2446 } 2461 }
2447 2462
2448 2463
2449 ASSEMBLER_TEST_RUN(TestObjectCompare, entry) { 2464 ASSEMBLER_TEST_RUN(TestObjectCompare, test) {
2450 typedef bool (*TestObjectCompare)(); 2465 typedef bool (*TestObjectCompare)();
2451 bool res = reinterpret_cast<TestObjectCompare>(entry)(); 2466 bool res = reinterpret_cast<TestObjectCompare>(test->entry())();
2452 EXPECT_EQ(true, res); 2467 EXPECT_EQ(true, res);
2453 } 2468 }
2454 2469
2455 2470
2456 ASSEMBLER_TEST_GENERATE(TestNop, assembler) { 2471 ASSEMBLER_TEST_GENERATE(TestNop, assembler) {
2457 __ nop(1); 2472 __ nop(1);
2458 __ nop(2); 2473 __ nop(2);
2459 __ nop(3); 2474 __ nop(3);
2460 __ nop(4); 2475 __ nop(4);
2461 __ nop(5); 2476 __ nop(5);
2462 __ nop(6); 2477 __ nop(6);
2463 __ nop(7); 2478 __ nop(7);
2464 __ nop(8); 2479 __ nop(8);
2465 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size. 2480 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size.
2466 __ ret(); 2481 __ ret();
2467 } 2482 }
2468 2483
2469 2484
2470 ASSEMBLER_TEST_RUN(TestNop, entry) { 2485 ASSEMBLER_TEST_RUN(TestNop, test) {
2471 typedef int (*TestNop)(); 2486 typedef int (*TestNop)();
2472 int res = reinterpret_cast<TestNop>(entry)(); 2487 int res = reinterpret_cast<TestNop>(test->entry())();
2473 EXPECT_EQ(36, res); // 36 nop bytes emitted. 2488 EXPECT_EQ(36, res); // 36 nop bytes emitted.
2474 } 2489 }
2475 2490
2476 2491
2477 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) { 2492 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) {
2478 __ Align(4, 0); 2493 __ Align(4, 0);
2479 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size. 2494 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size.
2480 __ ret(); 2495 __ ret();
2481 } 2496 }
2482 2497
2483 2498
2484 ASSEMBLER_TEST_RUN(TestAlign0, entry) { 2499 ASSEMBLER_TEST_RUN(TestAlign0, test) {
2485 typedef int (*TestAlign0)(); 2500 typedef int (*TestAlign0)();
2486 int res = reinterpret_cast<TestAlign0>(entry)(); 2501 int res = reinterpret_cast<TestAlign0>(test->entry())();
2487 EXPECT_EQ(0, res); // 0 bytes emitted. 2502 EXPECT_EQ(0, res); // 0 bytes emitted.
2488 } 2503 }
2489 2504
2490 2505
2491 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) { 2506 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) {
2492 __ nop(1); 2507 __ nop(1);
2493 __ Align(4, 0); 2508 __ Align(4, 0);
2494 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size. 2509 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size.
2495 __ ret(); 2510 __ ret();
2496 } 2511 }
2497 2512
2498 2513
2499 ASSEMBLER_TEST_RUN(TestAlign1, entry) { 2514 ASSEMBLER_TEST_RUN(TestAlign1, test) {
2500 typedef int (*TestAlign1)(); 2515 typedef int (*TestAlign1)();
2501 int res = reinterpret_cast<TestAlign1>(entry)(); 2516 int res = reinterpret_cast<TestAlign1>(test->entry())();
2502 EXPECT_EQ(4, res); // 4 bytes emitted. 2517 EXPECT_EQ(4, res); // 4 bytes emitted.
2503 } 2518 }
2504 2519
2505 2520
2506 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) { 2521 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) {
2507 __ nop(1); 2522 __ nop(1);
2508 __ Align(4, 1); 2523 __ Align(4, 1);
2509 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size. 2524 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size.
2510 __ ret(); 2525 __ ret();
2511 } 2526 }
2512 2527
2513 2528
2514 ASSEMBLER_TEST_RUN(TestAlign1Offset1, entry) { 2529 ASSEMBLER_TEST_RUN(TestAlign1Offset1, test) {
2515 typedef int (*TestAlign1Offset1)(); 2530 typedef int (*TestAlign1Offset1)();
2516 int res = reinterpret_cast<TestAlign1Offset1>(entry)(); 2531 int res = reinterpret_cast<TestAlign1Offset1>(test->entry())();
2517 EXPECT_EQ(3, res); // 3 bytes emitted. 2532 EXPECT_EQ(3, res); // 3 bytes emitted.
2518 } 2533 }
2519 2534
2520 2535
2521 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) { 2536 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) {
2522 __ nop(1); 2537 __ nop(1);
2523 __ Align(16, 0); 2538 __ Align(16, 0);
2524 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size. 2539 __ movl(EAX, Immediate(assembler->CodeSize())); // Return code size.
2525 __ ret(); 2540 __ ret();
2526 } 2541 }
2527 2542
2528 2543
2529 ASSEMBLER_TEST_RUN(TestAlignLarge, entry) { 2544 ASSEMBLER_TEST_RUN(TestAlignLarge, test) {
2530 typedef int (*TestAlignLarge)(); 2545 typedef int (*TestAlignLarge)();
2531 int res = reinterpret_cast<TestAlignLarge>(entry)(); 2546 int res = reinterpret_cast<TestAlignLarge>(test->entry())();
2532 EXPECT_EQ(16, res); // 16 bytes emitted. 2547 EXPECT_EQ(16, res); // 16 bytes emitted.
2533 } 2548 }
2534 2549
2535 2550
2536 // Called from assembler_test.cc. 2551 // Called from assembler_test.cc.
2537 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 2552 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
2538 __ pushl(CTX); 2553 __ pushl(CTX);
2539 __ movl(CTX, Address(ESP, 2 * kWordSize)); 2554 __ movl(CTX, Address(ESP, 2 * kWordSize));
2540 __ movl(EAX, Address(ESP, 3 * kWordSize)); 2555 __ movl(EAX, Address(ESP, 3 * kWordSize));
2541 __ movl(ECX, Address(ESP, 4 * kWordSize)); 2556 __ movl(ECX, Address(ESP, 4 * kWordSize));
2542 __ pushl(EAX); 2557 __ pushl(EAX);
2543 __ StoreIntoObject(ECX, 2558 __ StoreIntoObject(ECX,
2544 FieldAddress(ECX, GrowableObjectArray::data_offset()), 2559 FieldAddress(ECX, GrowableObjectArray::data_offset()),
2545 EAX); 2560 EAX);
2546 __ popl(EAX); 2561 __ popl(EAX);
2547 __ popl(CTX); 2562 __ popl(CTX);
2548 __ ret(); 2563 __ ret();
2549 } 2564 }
2550 2565
2551 2566
2552 } // namespace dart 2567 } // namespace dart
2553 2568
2554 #endif // defined TARGET_ARCH_IA32 2569 #endif // defined TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « runtime/vm/assembler_ia32.h ('k') | runtime/vm/assembler_mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698