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

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

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 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
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | runtime/vm/assert_test.cc » ('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_X64) 6 #if defined(TARGET_ARCH_X64)
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
18 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) { 17 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) {
19 __ pushq(CallingConventions::kArg1Reg); 18 __ pushq(CallingConventions::kArg1Reg);
20 __ movq(RAX, Address(RSP, 0)); 19 __ movq(RAX, Address(RSP, 0));
21 __ popq(RDX); 20 __ popq(RDX);
22 __ ret(); 21 __ ret();
23 } 22 }
24 23
25
26 ASSEMBLER_TEST_RUN(ReadArgument, test) { 24 ASSEMBLER_TEST_RUN(ReadArgument, test) {
27 typedef int64_t (*ReadArgumentCode)(int64_t n); 25 typedef int64_t (*ReadArgumentCode)(int64_t n);
28 ReadArgumentCode id = reinterpret_cast<ReadArgumentCode>(test->entry()); 26 ReadArgumentCode id = reinterpret_cast<ReadArgumentCode>(test->entry());
29 EXPECT_EQ(42, id(42)); 27 EXPECT_EQ(42, id(42));
30 EXPECT_EQ(87, id(87)); 28 EXPECT_EQ(87, id(87));
31 static const int64_t kLargeConstant = 0x1234567812345678LL; 29 static const int64_t kLargeConstant = 0x1234567812345678LL;
32 EXPECT_EQ(kLargeConstant, id(kLargeConstant)); 30 EXPECT_EQ(kLargeConstant, id(kLargeConstant));
33 } 31 }
34 32
35
36 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) { 33 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) {
37 __ movq(RAX, Address(RSP, 0)); 34 __ movq(RAX, Address(RSP, 0));
38 __ movq(RAX, Address(RBP, 0)); 35 __ movq(RAX, Address(RBP, 0));
39 __ movq(RAX, Address(RAX, 0)); 36 __ movq(RAX, Address(RAX, 0));
40 __ movq(RAX, Address(R10, 0)); 37 __ movq(RAX, Address(R10, 0));
41 __ movq(RAX, Address(R12, 0)); 38 __ movq(RAX, Address(R12, 0));
42 __ movq(RAX, Address(R13, 0)); 39 __ movq(RAX, Address(R13, 0));
43 __ movq(R10, Address(RAX, 0)); 40 __ movq(R10, Address(RAX, 0));
44 41
45 __ movq(RAX, Address(RSP, kWordSize)); 42 __ movq(RAX, Address(RSP, kWordSize));
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 __ movq(RAX, Address::AddressBaseImm32(R13, kWordSize)); 214 __ movq(RAX, Address::AddressBaseImm32(R13, kWordSize));
218 215
219 __ movq(RAX, Address::AddressBaseImm32(RSP, -kWordSize)); 216 __ movq(RAX, Address::AddressBaseImm32(RSP, -kWordSize));
220 __ movq(RAX, Address::AddressBaseImm32(RBP, -kWordSize)); 217 __ movq(RAX, Address::AddressBaseImm32(RBP, -kWordSize));
221 __ movq(RAX, Address::AddressBaseImm32(RAX, -kWordSize)); 218 __ movq(RAX, Address::AddressBaseImm32(RAX, -kWordSize));
222 __ movq(RAX, Address::AddressBaseImm32(R10, -kWordSize)); 219 __ movq(RAX, Address::AddressBaseImm32(R10, -kWordSize));
223 __ movq(RAX, Address::AddressBaseImm32(R12, -kWordSize)); 220 __ movq(RAX, Address::AddressBaseImm32(R12, -kWordSize));
224 __ movq(RAX, Address::AddressBaseImm32(R13, -kWordSize)); 221 __ movq(RAX, Address::AddressBaseImm32(R13, -kWordSize));
225 } 222 }
226 223
227
228 ASSEMBLER_TEST_RUN(AddressingModes, test) { 224 ASSEMBLER_TEST_RUN(AddressingModes, test) {
229 // Avoid running the code since it is constructed to lead to crashes. 225 // Avoid running the code since it is constructed to lead to crashes.
230 } 226 }
231 227
232
233 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { 228 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) {
234 Label done; 229 Label done;
235 // Make sure all the condition jumps work. 230 // Make sure all the condition jumps work.
236 for (Condition condition = OVERFLOW; condition <= GREATER; 231 for (Condition condition = OVERFLOW; condition <= GREATER;
237 condition = static_cast<Condition>(condition + 1)) { 232 condition = static_cast<Condition>(condition + 1)) {
238 __ j(condition, &done); 233 __ j(condition, &done);
239 } 234 }
240 // This isn't strictly necessary, but we do an unconditional 235 // This isn't strictly necessary, but we do an unconditional
241 // jump around the crashing code anyway. 236 // jump around the crashing code anyway.
242 __ jmp(&done); 237 __ jmp(&done);
243 238
244 // Be sure to skip this crashing code. 239 // Be sure to skip this crashing code.
245 __ movq(RAX, Immediate(0)); 240 __ movq(RAX, Immediate(0));
246 __ movq(Address(RAX, 0), RAX); 241 __ movq(Address(RAX, 0), RAX);
247 242
248 __ Bind(&done); 243 __ Bind(&done);
249 __ ret(); 244 __ ret();
250 } 245 }
251 246
252
253 ASSEMBLER_TEST_RUN(JumpAroundCrash, test) { 247 ASSEMBLER_TEST_RUN(JumpAroundCrash, test) {
254 Instr* instr = Instr::At(test->entry()); 248 Instr* instr = Instr::At(test->entry());
255 EXPECT(!instr->IsBreakPoint()); 249 EXPECT(!instr->IsBreakPoint());
256 typedef void (*JumpAroundCrashCode)(); 250 typedef void (*JumpAroundCrashCode)();
257 reinterpret_cast<JumpAroundCrashCode>(test->entry())(); 251 reinterpret_cast<JumpAroundCrashCode>(test->entry())();
258 } 252 }
259 253
260
261 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) { 254 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) {
262 __ movq(RAX, Immediate(0)); 255 __ movq(RAX, Immediate(0));
263 __ movq(RCX, Immediate(0)); 256 __ movq(RCX, Immediate(0));
264 Label loop; 257 Label loop;
265 __ Bind(&loop); 258 __ Bind(&loop);
266 __ addq(RAX, Immediate(2)); 259 __ addq(RAX, Immediate(2));
267 __ incq(RCX); 260 __ incq(RCX);
268 __ cmpq(RCX, Immediate(87)); 261 __ cmpq(RCX, Immediate(87));
269 __ j(LESS, &loop); 262 __ j(LESS, &loop);
270 __ ret(); 263 __ ret();
271 } 264 }
272 265
273
274 ASSEMBLER_TEST_RUN(SimpleLoop, test) { 266 ASSEMBLER_TEST_RUN(SimpleLoop, test) {
275 typedef int (*SimpleLoopCode)(); 267 typedef int (*SimpleLoopCode)();
276 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(test->entry())()); 268 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(test->entry())());
277 } 269 }
278 270
279
280 ASSEMBLER_TEST_GENERATE(Cmpb, assembler) { 271 ASSEMBLER_TEST_GENERATE(Cmpb, assembler) {
281 Label done; 272 Label done;
282 __ movq(RAX, Immediate(1)); 273 __ movq(RAX, Immediate(1));
283 __ pushq(Immediate(0xffffff11)); 274 __ pushq(Immediate(0xffffff11));
284 __ cmpb(Address(RSP, 0), Immediate(0x11)); 275 __ cmpb(Address(RSP, 0), Immediate(0x11));
285 __ j(EQUAL, &done, Assembler::kNearJump); 276 __ j(EQUAL, &done, Assembler::kNearJump);
286 __ movq(RAX, Immediate(0)); 277 __ movq(RAX, Immediate(0));
287 __ Bind(&done); 278 __ Bind(&done);
288 __ popq(RCX); 279 __ popq(RCX);
289 __ ret(); 280 __ ret();
290 } 281 }
291 282
292
293 ASSEMBLER_TEST_RUN(Cmpb, test) { 283 ASSEMBLER_TEST_RUN(Cmpb, test) {
294 typedef int (*CmpbCode)(); 284 typedef int (*CmpbCode)();
295 EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())()); 285 EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())());
296 } 286 }
297 287
298
299 ASSEMBLER_TEST_GENERATE(Testb, assembler) { 288 ASSEMBLER_TEST_GENERATE(Testb, assembler) {
300 Label done; 289 Label done;
301 __ movq(RAX, Immediate(1)); 290 __ movq(RAX, Immediate(1));
302 __ movq(RCX, Immediate(0)); 291 __ movq(RCX, Immediate(0));
303 __ pushq(Immediate(0xffffff11)); 292 __ pushq(Immediate(0xffffff11));
304 __ testb(Address(RSP, 0), Immediate(0x10)); 293 __ testb(Address(RSP, 0), Immediate(0x10));
305 // Fail if zero flag set. 294 // Fail if zero flag set.
306 __ cmoveq(RAX, RCX); 295 __ cmoveq(RAX, RCX);
307 __ testb(Address(RSP, 0), Immediate(0x20)); 296 __ testb(Address(RSP, 0), Immediate(0x20));
308 // Fail if zero flag not set. 297 // Fail if zero flag not set.
309 __ j(ZERO, &done); 298 __ j(ZERO, &done);
310 __ movq(RAX, Immediate(0)); 299 __ movq(RAX, Immediate(0));
311 __ Bind(&done); 300 __ Bind(&done);
312 __ popq(RCX); 301 __ popq(RCX);
313 __ ret(); 302 __ ret();
314 } 303 }
315 304
316
317 ASSEMBLER_TEST_RUN(Testb, test) { 305 ASSEMBLER_TEST_RUN(Testb, test) {
318 typedef int (*TestbCode)(); 306 typedef int (*TestbCode)();
319 EXPECT_EQ(1, reinterpret_cast<TestbCode>(test->entry())()); 307 EXPECT_EQ(1, reinterpret_cast<TestbCode>(test->entry())());
320 } 308 }
321 309
322
323 ASSEMBLER_TEST_GENERATE(Increment, assembler) { 310 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
324 __ movq(RAX, Immediate(0)); 311 __ movq(RAX, Immediate(0));
325 __ pushq(RAX); 312 __ pushq(RAX);
326 __ incl(Address(RSP, 0)); 313 __ incl(Address(RSP, 0));
327 __ incq(Address(RSP, 0)); 314 __ incq(Address(RSP, 0));
328 __ movq(RCX, Address(RSP, 0)); 315 __ movq(RCX, Address(RSP, 0));
329 __ incq(RCX); 316 __ incq(RCX);
330 __ popq(RAX); 317 __ popq(RAX);
331 __ movq(RAX, RCX); 318 __ movq(RAX, RCX);
332 __ ret(); 319 __ ret();
333 } 320 }
334 321
335
336 ASSEMBLER_TEST_RUN(Increment, test) { 322 ASSEMBLER_TEST_RUN(Increment, test) {
337 typedef int (*IncrementCode)(); 323 typedef int (*IncrementCode)();
338 EXPECT_EQ(3, reinterpret_cast<IncrementCode>(test->entry())()); 324 EXPECT_EQ(3, reinterpret_cast<IncrementCode>(test->entry())());
339 } 325 }
340 326
341
342 ASSEMBLER_TEST_GENERATE(IncrementLong, assembler) { 327 ASSEMBLER_TEST_GENERATE(IncrementLong, assembler) {
343 __ movq(RAX, Immediate(0xffffffff)); 328 __ movq(RAX, Immediate(0xffffffff));
344 __ pushq(RAX); 329 __ pushq(RAX);
345 __ incq(Address(RSP, 0)); 330 __ incq(Address(RSP, 0));
346 __ movq(RCX, Address(RSP, 0)); 331 __ movq(RCX, Address(RSP, 0));
347 __ incq(RCX); 332 __ incq(RCX);
348 __ popq(RAX); 333 __ popq(RAX);
349 __ movq(RAX, RCX); 334 __ movq(RAX, RCX);
350 __ ret(); 335 __ ret();
351 } 336 }
352 337
353
354 ASSEMBLER_TEST_RUN(IncrementLong, test) { 338 ASSEMBLER_TEST_RUN(IncrementLong, test) {
355 typedef int64_t (*IncrementCodeLong)(); 339 typedef int64_t (*IncrementCodeLong)();
356 EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(test->entry())()); 340 EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(test->entry())());
357 } 341 }
358 342
359
360 ASSEMBLER_TEST_GENERATE(Decrement, assembler) { 343 ASSEMBLER_TEST_GENERATE(Decrement, assembler) {
361 __ movq(RAX, Immediate(3)); 344 __ movq(RAX, Immediate(3));
362 __ pushq(RAX); 345 __ pushq(RAX);
363 __ decl(Address(RSP, 0)); 346 __ decl(Address(RSP, 0));
364 __ decq(Address(RSP, 0)); 347 __ decq(Address(RSP, 0));
365 __ movq(RCX, Address(RSP, 0)); 348 __ movq(RCX, Address(RSP, 0));
366 __ decq(RCX); 349 __ decq(RCX);
367 __ popq(RAX); 350 __ popq(RAX);
368 __ movq(RAX, RCX); 351 __ movq(RAX, RCX);
369 __ ret(); 352 __ ret();
370 } 353 }
371 354
372
373 ASSEMBLER_TEST_RUN(Decrement, test) { 355 ASSEMBLER_TEST_RUN(Decrement, test) {
374 typedef int (*DecrementCode)(); 356 typedef int (*DecrementCode)();
375 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(test->entry())()); 357 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(test->entry())());
376 } 358 }
377 359
378
379 ASSEMBLER_TEST_GENERATE(DecrementLong, assembler) { 360 ASSEMBLER_TEST_GENERATE(DecrementLong, assembler) {
380 __ movq(RAX, Immediate(0x100000001)); 361 __ movq(RAX, Immediate(0x100000001));
381 __ pushq(RAX); 362 __ pushq(RAX);
382 __ decq(Address(RSP, 0)); 363 __ decq(Address(RSP, 0));
383 __ movq(RCX, Address(RSP, 0)); 364 __ movq(RCX, Address(RSP, 0));
384 __ decq(RCX); 365 __ decq(RCX);
385 __ popq(RAX); 366 __ popq(RAX);
386 __ movq(RAX, RCX); 367 __ movq(RAX, RCX);
387 __ ret(); 368 __ ret();
388 } 369 }
389 370
390
391 ASSEMBLER_TEST_RUN(DecrementLong, test) { 371 ASSEMBLER_TEST_RUN(DecrementLong, test) {
392 typedef int64_t (*DecrementCodeLong)(); 372 typedef int64_t (*DecrementCodeLong)();
393 EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(test->entry())()); 373 EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(test->entry())());
394 } 374 }
395 375
396
397 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) { 376 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) {
398 __ movl(RAX, Immediate(2)); 377 __ movl(RAX, Immediate(2));
399 __ movl(RCX, Immediate(4)); 378 __ movl(RCX, Immediate(4));
400 __ imull(RAX, RCX); 379 __ imull(RAX, RCX);
401 __ imull(RAX, Immediate(1000)); 380 __ imull(RAX, Immediate(1000));
402 __ ret(); 381 __ ret();
403 } 382 }
404 383
405
406 ASSEMBLER_TEST_RUN(SignedMultiply, test) { 384 ASSEMBLER_TEST_RUN(SignedMultiply, test) {
407 typedef int (*SignedMultiply)(); 385 typedef int (*SignedMultiply)();
408 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(test->entry())()); 386 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(test->entry())());
409 } 387 }
410 388
411
412 ASSEMBLER_TEST_GENERATE(UnsignedMultiply, assembler) { 389 ASSEMBLER_TEST_GENERATE(UnsignedMultiply, assembler) {
413 __ movl(RAX, Immediate(-1)); // RAX = 0xFFFFFFFF 390 __ movl(RAX, Immediate(-1)); // RAX = 0xFFFFFFFF
414 __ movl(RCX, Immediate(16)); // RCX = 0x10 391 __ movl(RCX, Immediate(16)); // RCX = 0x10
415 __ mull(RCX); // RDX:RAX = RAX * RCX = 0x0FFFFFFFF0 392 __ mull(RCX); // RDX:RAX = RAX * RCX = 0x0FFFFFFFF0
416 __ movq(RAX, RDX); // Return high32(0x0FFFFFFFF0) == 0x0F 393 __ movq(RAX, RDX); // Return high32(0x0FFFFFFFF0) == 0x0F
417 __ ret(); 394 __ ret();
418 } 395 }
419 396
420
421 ASSEMBLER_TEST_RUN(UnsignedMultiply, test) { 397 ASSEMBLER_TEST_RUN(UnsignedMultiply, test) {
422 typedef int (*UnsignedMultiply)(); 398 typedef int (*UnsignedMultiply)();
423 EXPECT_EQ(15, reinterpret_cast<UnsignedMultiply>(test->entry())()); 399 EXPECT_EQ(15, reinterpret_cast<UnsignedMultiply>(test->entry())());
424 } 400 }
425 401
426
427 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) { 402 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) {
428 __ pushq(R15); // Callee saved. 403 __ pushq(R15); // Callee saved.
429 __ movq(RAX, Immediate(2)); 404 __ movq(RAX, Immediate(2));
430 __ movq(RCX, Immediate(4)); 405 __ movq(RCX, Immediate(4));
431 __ imulq(RAX, RCX); 406 __ imulq(RAX, RCX);
432 407
433 __ movq(R8, Immediate(2)); 408 __ movq(R8, Immediate(2));
434 __ movq(R9, Immediate(4)); 409 __ movq(R9, Immediate(4));
435 __ pushq(R9); 410 __ pushq(R9);
436 __ imulq(R8, Address(RSP, 0)); 411 __ imulq(R8, Address(RSP, 0));
437 __ popq(R9); 412 __ popq(R9);
438 __ addq(RAX, R8); 413 __ addq(RAX, R8);
439 414
440 __ movq(R10, Immediate(2)); 415 __ movq(R10, Immediate(2));
441 __ movq(R11, Immediate(4)); 416 __ movq(R11, Immediate(4));
442 __ imulq(R10, R11); 417 __ imulq(R10, R11);
443 __ addq(RAX, R10); 418 __ addq(RAX, R10);
444 419
445 __ movq(R15, Immediate(2)); 420 __ movq(R15, Immediate(2));
446 __ imulq(R15, Immediate(4)); 421 __ imulq(R15, Immediate(4));
447 __ addq(RAX, R15); 422 __ addq(RAX, R15);
448 __ popq(R15); 423 __ popq(R15);
449 __ ret(); 424 __ ret();
450 } 425 }
451 426
452
453 ASSEMBLER_TEST_RUN(SignedMultiply64, test) { 427 ASSEMBLER_TEST_RUN(SignedMultiply64, test) {
454 typedef int64_t (*SignedMultiply64)(); 428 typedef int64_t (*SignedMultiply64)();
455 EXPECT_EQ(32, reinterpret_cast<SignedMultiply64>(test->entry())()); 429 EXPECT_EQ(32, reinterpret_cast<SignedMultiply64>(test->entry())());
456 } 430 }
457 431
458
459 static const int64_t kLargeConstant = 0x1234567887654321; 432 static const int64_t kLargeConstant = 0x1234567887654321;
460 static const int64_t kAnotherLargeConstant = 987654321987654321LL; 433 static const int64_t kAnotherLargeConstant = 987654321987654321LL;
461 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1; 434 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1;
462 435
463
464 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) { 436 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) {
465 Label done; 437 Label done;
466 __ movq(RAX, Immediate(kLargeConstant)); 438 __ movq(RAX, Immediate(kLargeConstant));
467 __ movq(RCX, Immediate(kAnotherLargeConstant)); 439 __ movq(RCX, Immediate(kAnotherLargeConstant));
468 __ imulq(RAX, RCX); 440 __ imulq(RAX, RCX);
469 __ imulq(RCX, Immediate(kLargeConstant)); 441 __ imulq(RCX, Immediate(kLargeConstant));
470 __ cmpq(RAX, RCX); 442 __ cmpq(RAX, RCX);
471 __ j(EQUAL, &done); 443 __ j(EQUAL, &done);
472 __ int3(); 444 __ int3();
473 __ Bind(&done); 445 __ Bind(&done);
474 __ ret(); 446 __ ret();
475 } 447 }
476 448
477
478 ASSEMBLER_TEST_RUN(SignedMultiplyLong, test) { 449 ASSEMBLER_TEST_RUN(SignedMultiplyLong, test) {
479 typedef int64_t (*SignedMultiplyLong)(); 450 typedef int64_t (*SignedMultiplyLong)();
480 EXPECT_EQ(kProductLargeConstants, 451 EXPECT_EQ(kProductLargeConstants,
481 reinterpret_cast<SignedMultiplyLong>(test->entry())()); 452 reinterpret_cast<SignedMultiplyLong>(test->entry())());
482 } 453 }
483 454
484
485 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) { 455 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) {
486 __ movl(RDX, Immediate(0)); 456 __ movl(RDX, Immediate(0));
487 __ movl(RAX, Immediate(0x0fffffff)); 457 __ movl(RAX, Immediate(0x0fffffff));
488 __ movl(RCX, Immediate(0x0fffffff)); 458 __ movl(RCX, Immediate(0x0fffffff));
489 __ imull(RAX, RCX); 459 __ imull(RAX, RCX);
490 __ imull(RAX, RDX); 460 __ imull(RAX, RDX);
491 __ ret(); 461 __ ret();
492 } 462 }
493 463
494
495 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, test) { 464 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, test) {
496 typedef int (*OverflowSignedMultiply)(); 465 typedef int (*OverflowSignedMultiply)();
497 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())()); 466 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())());
498 } 467 }
499 468
500
501 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) { 469 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) {
502 __ movl(RDX, Immediate(2)); 470 __ movl(RDX, Immediate(2));
503 __ movl(RCX, Immediate(4)); 471 __ movl(RCX, Immediate(4));
504 __ imull(RDX, RCX); 472 __ imull(RDX, RCX);
505 __ imull(RDX, Immediate(1000)); 473 __ imull(RDX, Immediate(1000));
506 __ movl(RAX, RDX); 474 __ movl(RAX, RDX);
507 __ ret(); 475 __ ret();
508 } 476 }
509 477
510
511 ASSEMBLER_TEST_RUN(SignedMultiply1, test) { 478 ASSEMBLER_TEST_RUN(SignedMultiply1, test) {
512 typedef int (*SignedMultiply1)(); 479 typedef int (*SignedMultiply1)();
513 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(test->entry())()); 480 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(test->entry())());
514 } 481 }
515 482
516
517 ASSEMBLER_TEST_GENERATE(SignedMultiply2, assembler) { 483 ASSEMBLER_TEST_GENERATE(SignedMultiply2, assembler) {
518 __ pushq(R15); // Callee saved. 484 __ pushq(R15); // Callee saved.
519 __ movl(R15, Immediate(2)); 485 __ movl(R15, Immediate(2));
520 __ imull(R15, Immediate(1000)); 486 __ imull(R15, Immediate(1000));
521 __ movl(RAX, R15); 487 __ movl(RAX, R15);
522 __ popq(R15); 488 __ popq(R15);
523 __ ret(); 489 __ ret();
524 } 490 }
525 491
526
527 ASSEMBLER_TEST_RUN(SignedMultiply2, test) { 492 ASSEMBLER_TEST_RUN(SignedMultiply2, test) {
528 typedef int (*SignedMultiply2)(); 493 typedef int (*SignedMultiply2)();
529 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(test->entry())()); 494 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(test->entry())());
530 } 495 }
531 496
532
533 ASSEMBLER_TEST_GENERATE(UnsignedMultiplyLong, assembler) { 497 ASSEMBLER_TEST_GENERATE(UnsignedMultiplyLong, assembler) {
534 __ movq(RAX, Immediate(-1)); // RAX = 0xFFFFFFFFFFFFFFFF 498 __ movq(RAX, Immediate(-1)); // RAX = 0xFFFFFFFFFFFFFFFF
535 __ movq(RCX, Immediate(16)); // RCX = 0x10 499 __ movq(RCX, Immediate(16)); // RCX = 0x10
536 __ mulq(RCX); // RDX:RAX = RAX * RCX = 0x0FFFFFFFFFFFFFFFF0 500 __ mulq(RCX); // RDX:RAX = RAX * RCX = 0x0FFFFFFFFFFFFFFFF0
537 __ movq(RAX, RDX); // Return high64(0x0FFFFFFFFFFFFFFFF0) == 0x0F 501 __ movq(RAX, RDX); // Return high64(0x0FFFFFFFFFFFFFFFF0) == 0x0F
538 __ ret(); 502 __ ret();
539 } 503 }
540 504
541
542 ASSEMBLER_TEST_RUN(UnsignedMultiplyLong, test) { 505 ASSEMBLER_TEST_RUN(UnsignedMultiplyLong, test) {
543 typedef int64_t (*UnsignedMultiplyLong)(); 506 typedef int64_t (*UnsignedMultiplyLong)();
544 EXPECT_EQ(15, reinterpret_cast<UnsignedMultiplyLong>(test->entry())()); 507 EXPECT_EQ(15, reinterpret_cast<UnsignedMultiplyLong>(test->entry())());
545 } 508 }
546 509
547
548 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { 510 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) {
549 __ movl(RAX, Immediate(-87)); 511 __ movl(RAX, Immediate(-87));
550 __ movl(RDX, Immediate(123)); 512 __ movl(RDX, Immediate(123));
551 __ cdq(); 513 __ cdq();
552 __ movl(RCX, Immediate(42)); 514 __ movl(RCX, Immediate(42));
553 __ idivl(RCX); 515 __ idivl(RCX);
554 __ ret(); 516 __ ret();
555 } 517 }
556 518
557
558 ASSEMBLER_TEST_RUN(SignedDivide, test) { 519 ASSEMBLER_TEST_RUN(SignedDivide, test) {
559 typedef int32_t (*SignedDivide)(); 520 typedef int32_t (*SignedDivide)();
560 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())()); 521 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())());
561 } 522 }
562 523
563
564 ASSEMBLER_TEST_GENERATE(UnsignedDivide, assembler) { 524 ASSEMBLER_TEST_GENERATE(UnsignedDivide, assembler) {
565 const int32_t low = 0; 525 const int32_t low = 0;
566 const int32_t high = 0xf0000000; 526 const int32_t high = 0xf0000000;
567 const int32_t divisor = 0xffffffff; 527 const int32_t divisor = 0xffffffff;
568 __ movl(RAX, Immediate(low)); 528 __ movl(RAX, Immediate(low));
569 __ movl(RDX, Immediate(high)); 529 __ movl(RDX, Immediate(high));
570 __ movl(RCX, Immediate(divisor)); 530 __ movl(RCX, Immediate(divisor));
571 __ divl(RCX); // RAX = RDX:RAX / RCX = 531 __ divl(RCX); // RAX = RDX:RAX / RCX =
572 // = 0xf000000000000000 / 0xffffffff = 0xf0000000 532 // = 0xf000000000000000 / 0xffffffff = 0xf0000000
573 __ ret(); 533 __ ret();
574 } 534 }
575 535
576
577 ASSEMBLER_TEST_RUN(UnsignedDivide, test) { 536 ASSEMBLER_TEST_RUN(UnsignedDivide, test) {
578 typedef uint32_t (*UnsignedDivide)(); 537 typedef uint32_t (*UnsignedDivide)();
579 EXPECT_EQ(0xf0000000, reinterpret_cast<UnsignedDivide>(test->entry())()); 538 EXPECT_EQ(0xf0000000, reinterpret_cast<UnsignedDivide>(test->entry())());
580 } 539 }
581 540
582
583 ASSEMBLER_TEST_GENERATE(SignedDivideLong, assembler) { 541 ASSEMBLER_TEST_GENERATE(SignedDivideLong, assembler) {
584 __ movq(RAX, Immediate(kLargeConstant)); 542 __ movq(RAX, Immediate(kLargeConstant));
585 __ movq(RDX, Immediate(123)); 543 __ movq(RDX, Immediate(123));
586 __ cqo(); // Clear RDX. 544 __ cqo(); // Clear RDX.
587 __ movq(RCX, Immediate(42)); 545 __ movq(RCX, Immediate(42));
588 __ idivq(RCX); 546 __ idivq(RCX);
589 __ ret(); 547 __ ret();
590 } 548 }
591 549
592
593 ASSEMBLER_TEST_RUN(SignedDivideLong, test) { 550 ASSEMBLER_TEST_RUN(SignedDivideLong, test) {
594 typedef int64_t (*SignedDivideLong)(); 551 typedef int64_t (*SignedDivideLong)();
595 EXPECT_EQ(kLargeConstant / 42, 552 EXPECT_EQ(kLargeConstant / 42,
596 reinterpret_cast<SignedDivideLong>(test->entry())()); 553 reinterpret_cast<SignedDivideLong>(test->entry())());
597 } 554 }
598 555
599
600 ASSEMBLER_TEST_GENERATE(UnsignedDivideLong, assembler) { 556 ASSEMBLER_TEST_GENERATE(UnsignedDivideLong, assembler) {
601 const int64_t low = 0; 557 const int64_t low = 0;
602 const int64_t high = 0xf000000000000000; 558 const int64_t high = 0xf000000000000000;
603 const int64_t divisor = 0xffffffffffffffff; 559 const int64_t divisor = 0xffffffffffffffff;
604 __ movq(RAX, Immediate(low)); 560 __ movq(RAX, Immediate(low));
605 __ movq(RDX, Immediate(high)); 561 __ movq(RDX, Immediate(high));
606 __ movq(RCX, Immediate(divisor)); 562 __ movq(RCX, Immediate(divisor));
607 __ divq(RCX); // RAX = RDX:RAX / RCX = 563 __ divq(RCX); // RAX = RDX:RAX / RCX =
608 // = 0xf0000000000000000000000000000000 / 564 // = 0xf0000000000000000000000000000000 /
609 // 0xffffffffffffffff = 0xf000000000000000 565 // 0xffffffffffffffff = 0xf000000000000000
610 __ ret(); 566 __ ret();
611 } 567 }
612 568
613
614 ASSEMBLER_TEST_RUN(UnsignedDivideLong, test) { 569 ASSEMBLER_TEST_RUN(UnsignedDivideLong, test) {
615 typedef uint64_t (*UnsignedDivideLong)(); 570 typedef uint64_t (*UnsignedDivideLong)();
616 EXPECT_EQ(0xf000000000000000, 571 EXPECT_EQ(0xf000000000000000,
617 reinterpret_cast<UnsignedDivideLong>(test->entry())()); 572 reinterpret_cast<UnsignedDivideLong>(test->entry())());
618 } 573 }
619 574
620
621 ASSEMBLER_TEST_GENERATE(Negate, assembler) { 575 ASSEMBLER_TEST_GENERATE(Negate, assembler) {
622 __ movq(RCX, Immediate(42)); 576 __ movq(RCX, Immediate(42));
623 __ negq(RCX); 577 __ negq(RCX);
624 __ movq(RAX, RCX); 578 __ movq(RAX, RCX);
625 __ ret(); 579 __ ret();
626 } 580 }
627 581
628
629 ASSEMBLER_TEST_RUN(Negate, test) { 582 ASSEMBLER_TEST_RUN(Negate, test) {
630 typedef int (*Negate)(); 583 typedef int (*Negate)();
631 EXPECT_EQ(-42, reinterpret_cast<Negate>(test->entry())()); 584 EXPECT_EQ(-42, reinterpret_cast<Negate>(test->entry())());
632 } 585 }
633 586
634
635 ASSEMBLER_TEST_GENERATE(BitScanReverse, assembler) { 587 ASSEMBLER_TEST_GENERATE(BitScanReverse, assembler) {
636 __ pushq(CallingConventions::kArg1Reg); 588 __ pushq(CallingConventions::kArg1Reg);
637 __ movq(RCX, Address(RSP, 0)); 589 __ movq(RCX, Address(RSP, 0));
638 __ movq(RAX, Immediate(666)); // Marker for conditional write. 590 __ movq(RAX, Immediate(666)); // Marker for conditional write.
639 __ bsrq(RAX, RCX); 591 __ bsrq(RAX, RCX);
640 __ popq(RCX); 592 __ popq(RCX);
641 __ ret(); 593 __ ret();
642 } 594 }
643 595
644
645 ASSEMBLER_TEST_RUN(BitScanReverse, test) { 596 ASSEMBLER_TEST_RUN(BitScanReverse, test) {
646 typedef int (*Bsr)(int input); 597 typedef int (*Bsr)(int input);
647 Bsr call = reinterpret_cast<Bsr>(test->entry()); 598 Bsr call = reinterpret_cast<Bsr>(test->entry());
648 EXPECT_EQ(666, call(0)); 599 EXPECT_EQ(666, call(0));
649 EXPECT_EQ(0, call(1)); 600 EXPECT_EQ(0, call(1));
650 EXPECT_EQ(1, call(2)); 601 EXPECT_EQ(1, call(2));
651 EXPECT_EQ(1, call(3)); 602 EXPECT_EQ(1, call(3));
652 EXPECT_EQ(2, call(4)); 603 EXPECT_EQ(2, call(4));
653 EXPECT_EQ(5, call(42)); 604 EXPECT_EQ(5, call(42));
654 EXPECT_EQ(31, call(-1)); 605 EXPECT_EQ(31, call(-1));
655 } 606 }
656 607
657
658 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) { 608 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) {
659 __ movq(RDX, Immediate(0xffff)); 609 __ movq(RDX, Immediate(0xffff));
660 __ movzxb(RAX, RDX); // RAX = 0xff 610 __ movzxb(RAX, RDX); // RAX = 0xff
661 __ movsxw(R8, RDX); // R8 = -1 611 __ movsxw(R8, RDX); // R8 = -1
662 __ movzxw(RCX, RDX); // RCX = 0xffff 612 __ movzxw(RCX, RDX); // RCX = 0xffff
663 __ addq(R8, RCX); 613 __ addq(R8, RCX);
664 __ addq(RAX, R8); 614 __ addq(RAX, R8);
665 __ ret(); 615 __ ret();
666 } 616 }
667 617
668
669 ASSEMBLER_TEST_RUN(MoveExtend, test) { 618 ASSEMBLER_TEST_RUN(MoveExtend, test) {
670 typedef int (*MoveExtend)(); 619 typedef int (*MoveExtend)();
671 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())()); 620 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())());
672 } 621 }
673 622
674
675 ASSEMBLER_TEST_GENERATE(MoveExtend32, assembler) { 623 ASSEMBLER_TEST_GENERATE(MoveExtend32, assembler) {
676 __ movq(RDX, Immediate(0xffffffff)); 624 __ movq(RDX, Immediate(0xffffffff));
677 __ movsxd(RDX, RDX); 625 __ movsxd(RDX, RDX);
678 __ movq(RAX, Immediate(0x7fffffff)); 626 __ movq(RAX, Immediate(0x7fffffff));
679 __ movsxd(RAX, RAX); 627 __ movsxd(RAX, RAX);
680 __ addq(RAX, RDX); 628 __ addq(RAX, RDX);
681 __ ret(); 629 __ ret();
682 } 630 }
683 631
684
685 ASSEMBLER_TEST_RUN(MoveExtend32, test) { 632 ASSEMBLER_TEST_RUN(MoveExtend32, test) {
686 typedef intptr_t (*MoveExtend)(); 633 typedef intptr_t (*MoveExtend)();
687 EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())()); 634 EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())());
688 } 635 }
689 636
690
691 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) { 637 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) {
692 __ movq(RDX, Immediate(0x123456781234ffff)); 638 __ movq(RDX, Immediate(0x123456781234ffff));
693 639
694 __ pushq(RDX); 640 __ pushq(RDX);
695 __ movzxb(RAX, Address(RSP, 0)); // RAX = 0xff 641 __ movzxb(RAX, Address(RSP, 0)); // RAX = 0xff
696 __ movsxw(R8, Address(RSP, 0)); // R8 = -1 642 __ movsxw(R8, Address(RSP, 0)); // R8 = -1
697 __ movzxw(RCX, Address(RSP, 0)); // RCX = 0xffff 643 __ movzxw(RCX, Address(RSP, 0)); // RCX = 0xffff
698 __ addq(RSP, Immediate(kWordSize)); 644 __ addq(RSP, Immediate(kWordSize));
699 645
700 __ addq(R8, RCX); 646 __ addq(R8, RCX);
701 __ addq(RAX, R8); 647 __ addq(RAX, R8);
702 __ ret(); 648 __ ret();
703 } 649 }
704 650
705
706 ASSEMBLER_TEST_RUN(MoveExtendMemory, test) { 651 ASSEMBLER_TEST_RUN(MoveExtendMemory, test) {
707 typedef int (*MoveExtendMemory)(); 652 typedef int (*MoveExtendMemory)();
708 EXPECT_EQ(0xff - 1 + 0xffff, 653 EXPECT_EQ(0xff - 1 + 0xffff,
709 reinterpret_cast<MoveExtendMemory>(test->entry())()); 654 reinterpret_cast<MoveExtendMemory>(test->entry())());
710 } 655 }
711 656
712
713 ASSEMBLER_TEST_GENERATE(MoveExtend32Memory, assembler) { 657 ASSEMBLER_TEST_GENERATE(MoveExtend32Memory, assembler) {
714 __ pushq(Immediate(0xffffffff)); 658 __ pushq(Immediate(0xffffffff));
715 __ pushq(Immediate(0x7fffffff)); 659 __ pushq(Immediate(0x7fffffff));
716 __ movsxd(RDX, Address(RSP, kWordSize)); 660 __ movsxd(RDX, Address(RSP, kWordSize));
717 __ movsxd(RAX, Address(RSP, 0)); 661 __ movsxd(RAX, Address(RSP, 0));
718 __ addq(RSP, Immediate(kWordSize * 2)); 662 __ addq(RSP, Immediate(kWordSize * 2));
719 663
720 __ addq(RAX, RDX); 664 __ addq(RAX, RDX);
721 __ ret(); 665 __ ret();
722 } 666 }
723 667
724
725 ASSEMBLER_TEST_RUN(MoveExtend32Memory, test) { 668 ASSEMBLER_TEST_RUN(MoveExtend32Memory, test) {
726 typedef intptr_t (*MoveExtend)(); 669 typedef intptr_t (*MoveExtend)();
727 EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())()); 670 EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())());
728 } 671 }
729 672
730
731 ASSEMBLER_TEST_GENERATE(MoveWord, assembler) { 673 ASSEMBLER_TEST_GENERATE(MoveWord, assembler) {
732 __ xorq(RAX, RAX); 674 __ xorq(RAX, RAX);
733 __ pushq(Immediate(0)); 675 __ pushq(Immediate(0));
734 __ movq(RAX, RSP); 676 __ movq(RAX, RSP);
735 __ movq(RCX, Immediate(-1)); 677 __ movq(RCX, Immediate(-1));
736 __ movw(Address(RAX, 0), RCX); 678 __ movw(Address(RAX, 0), RCX);
737 __ movzxw(RAX, Address(RAX, 0)); // RAX = 0xffff 679 __ movzxw(RAX, Address(RAX, 0)); // RAX = 0xffff
738 __ addq(RSP, Immediate(kWordSize)); 680 __ addq(RSP, Immediate(kWordSize));
739 __ ret(); 681 __ ret();
740 } 682 }
741 683
742
743 ASSEMBLER_TEST_RUN(MoveWord, test) { 684 ASSEMBLER_TEST_RUN(MoveWord, test) {
744 typedef int (*MoveWord)(); 685 typedef int (*MoveWord)();
745 EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(test->entry())()); 686 EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(test->entry())());
746 } 687 }
747 688
748
749 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) { 689 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) {
750 __ pushq(Immediate(0)); 690 __ pushq(Immediate(0));
751 __ movq(R8, RSP); 691 __ movq(R8, RSP);
752 __ movq(R9, Immediate(-1)); 692 __ movq(R9, Immediate(-1));
753 __ movw(Address(R8, 0), R9); 693 __ movw(Address(R8, 0), R9);
754 __ movzxw(R8, Address(R8, 0)); // 0xffff 694 __ movzxw(R8, Address(R8, 0)); // 0xffff
755 __ xorq(RAX, RAX); 695 __ xorq(RAX, RAX);
756 __ addq(RAX, R8); // RAX = 0xffff 696 __ addq(RAX, R8); // RAX = 0xffff
757 __ addq(RSP, Immediate(kWordSize)); 697 __ addq(RSP, Immediate(kWordSize));
758 __ ret(); 698 __ ret();
759 } 699 }
760 700
761
762 ASSEMBLER_TEST_RUN(MoveWordRex, test) { 701 ASSEMBLER_TEST_RUN(MoveWordRex, test) {
763 typedef int (*MoveWordRex)(); 702 typedef int (*MoveWordRex)();
764 EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(test->entry())()); 703 EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(test->entry())());
765 } 704 }
766 705
767
768 ASSEMBLER_TEST_GENERATE(LongAddReg, assembler) { 706 ASSEMBLER_TEST_GENERATE(LongAddReg, assembler) {
769 __ pushq(CallingConventions::kArg2Reg); 707 __ pushq(CallingConventions::kArg2Reg);
770 __ pushq(CallingConventions::kArg1Reg); 708 __ pushq(CallingConventions::kArg1Reg);
771 __ movl(RAX, Address(RSP, 0)); // left low. 709 __ movl(RAX, Address(RSP, 0)); // left low.
772 __ movl(RDX, Address(RSP, 4)); // left high. 710 __ movl(RDX, Address(RSP, 4)); // left high.
773 __ movl(RCX, Address(RSP, 8)); // right low. 711 __ movl(RCX, Address(RSP, 8)); // right low.
774 __ movl(R8, Address(RSP, 12)); // right high 712 __ movl(R8, Address(RSP, 12)); // right high
775 __ addl(RAX, RCX); 713 __ addl(RAX, RCX);
776 __ adcl(RDX, R8); 714 __ adcl(RDX, R8);
777 // Result is in RAX/RDX. 715 // Result is in RAX/RDX.
778 __ movl(Address(RSP, 0), RAX); // result low. 716 __ movl(Address(RSP, 0), RAX); // result low.
779 __ movl(Address(RSP, 4), RDX); // result high. 717 __ movl(Address(RSP, 4), RDX); // result high.
780 __ popq(RAX); 718 __ popq(RAX);
781 __ popq(RDX); 719 __ popq(RDX);
782 __ ret(); 720 __ ret();
783 } 721 }
784 722
785
786 ASSEMBLER_TEST_RUN(LongAddReg, test) { 723 ASSEMBLER_TEST_RUN(LongAddReg, test) {
787 typedef int64_t (*LongAddRegCode)(int64_t a, int64_t b); 724 typedef int64_t (*LongAddRegCode)(int64_t a, int64_t b);
788 int64_t a = 12; 725 int64_t a = 12;
789 int64_t b = 14; 726 int64_t b = 14;
790 int64_t res = reinterpret_cast<LongAddRegCode>(test->entry())(a, b); 727 int64_t res = reinterpret_cast<LongAddRegCode>(test->entry())(a, b);
791 EXPECT_EQ((a + b), res); 728 EXPECT_EQ((a + b), res);
792 a = 2147483647; 729 a = 2147483647;
793 b = 600000; 730 b = 600000;
794 res = reinterpret_cast<LongAddRegCode>(test->entry())(a, b); 731 res = reinterpret_cast<LongAddRegCode>(test->entry())(a, b);
795 EXPECT_EQ((a + b), res); 732 EXPECT_EQ((a + b), res);
796 } 733 }
797 734
798
799 ASSEMBLER_TEST_GENERATE(LongAddImmediate, assembler) { 735 ASSEMBLER_TEST_GENERATE(LongAddImmediate, assembler) {
800 __ pushq(CallingConventions::kArg1Reg); 736 __ pushq(CallingConventions::kArg1Reg);
801 __ movl(RAX, Address(RSP, 0)); // left low. 737 __ movl(RAX, Address(RSP, 0)); // left low.
802 __ movl(RDX, Address(RSP, 4)); // left high. 738 __ movl(RDX, Address(RSP, 4)); // left high.
803 __ addl(RAX, Immediate(12)); // right low immediate. 739 __ addl(RAX, Immediate(12)); // right low immediate.
804 __ adcl(RDX, Immediate(11)); // right high immediate. 740 __ adcl(RDX, Immediate(11)); // right high immediate.
805 // Result is in RAX/RDX. 741 // Result is in RAX/RDX.
806 __ movl(Address(RSP, 0), RAX); // result low. 742 __ movl(Address(RSP, 0), RAX); // result low.
807 __ movl(Address(RSP, 4), RDX); // result high. 743 __ movl(Address(RSP, 4), RDX); // result high.
808 __ popq(RAX); 744 __ popq(RAX);
809 __ ret(); 745 __ ret();
810 } 746 }
811 747
812
813 ASSEMBLER_TEST_RUN(LongAddImmediate, test) { 748 ASSEMBLER_TEST_RUN(LongAddImmediate, test) {
814 typedef int64_t (*LongAddImmediateCode)(int64_t a); 749 typedef int64_t (*LongAddImmediateCode)(int64_t a);
815 int64_t a = (13LL << 32) + 14; 750 int64_t a = (13LL << 32) + 14;
816 int64_t b = (11LL << 32) + 12; 751 int64_t b = (11LL << 32) + 12;
817 int64_t res = reinterpret_cast<LongAddImmediateCode>(test->entry())(a); 752 int64_t res = reinterpret_cast<LongAddImmediateCode>(test->entry())(a);
818 EXPECT_EQ((a + b), res); 753 EXPECT_EQ((a + b), res);
819 a = (13LL << 32) - 1; 754 a = (13LL << 32) - 1;
820 res = reinterpret_cast<LongAddImmediateCode>(test->entry())(a); 755 res = reinterpret_cast<LongAddImmediateCode>(test->entry())(a);
821 EXPECT_EQ((a + b), res); 756 EXPECT_EQ((a + b), res);
822 } 757 }
823 758
824
825 ASSEMBLER_TEST_GENERATE(LongAddAddress, assembler) { 759 ASSEMBLER_TEST_GENERATE(LongAddAddress, assembler) {
826 __ pushq(CallingConventions::kArg2Reg); 760 __ pushq(CallingConventions::kArg2Reg);
827 __ pushq(CallingConventions::kArg1Reg); 761 __ pushq(CallingConventions::kArg1Reg);
828 __ movl(RAX, Address(RSP, 0)); // left low. 762 __ movl(RAX, Address(RSP, 0)); // left low.
829 __ movl(RDX, Address(RSP, 4)); // left high. 763 __ movl(RDX, Address(RSP, 4)); // left high.
830 __ addl(RAX, Address(RSP, 8)); // low. 764 __ addl(RAX, Address(RSP, 8)); // low.
831 __ adcl(RDX, Address(RSP, 12)); // high. 765 __ adcl(RDX, Address(RSP, 12)); // high.
832 // Result is in RAX/RDX. 766 // Result is in RAX/RDX.
833 __ movl(Address(RSP, 0), RAX); // result low. 767 __ movl(Address(RSP, 0), RAX); // result low.
834 __ movl(Address(RSP, 4), RDX); // result high. 768 __ movl(Address(RSP, 4), RDX); // result high.
835 __ popq(RAX); 769 __ popq(RAX);
836 __ popq(RDX); 770 __ popq(RDX);
837 __ ret(); 771 __ ret();
838 } 772 }
839 773
840
841 ASSEMBLER_TEST_RUN(LongAddAddress, test) { 774 ASSEMBLER_TEST_RUN(LongAddAddress, test) {
842 typedef int64_t (*LongAddAddressCode)(int64_t a, int64_t b); 775 typedef int64_t (*LongAddAddressCode)(int64_t a, int64_t b);
843 int64_t a = 12; 776 int64_t a = 12;
844 int64_t b = 14; 777 int64_t b = 14;
845 int64_t res = reinterpret_cast<LongAddAddressCode>(test->entry())(a, b); 778 int64_t res = reinterpret_cast<LongAddAddressCode>(test->entry())(a, b);
846 EXPECT_EQ((a + b), res); 779 EXPECT_EQ((a + b), res);
847 a = 2147483647; 780 a = 2147483647;
848 b = 600000; 781 b = 600000;
849 res = reinterpret_cast<LongAddAddressCode>(test->entry())(a, b); 782 res = reinterpret_cast<LongAddAddressCode>(test->entry())(a, b);
850 EXPECT_EQ((a + b), res); 783 EXPECT_EQ((a + b), res);
851 } 784 }
852 785
853
854 ASSEMBLER_TEST_GENERATE(LongSubReg, assembler) { 786 ASSEMBLER_TEST_GENERATE(LongSubReg, assembler) {
855 __ pushq(CallingConventions::kArg2Reg); 787 __ pushq(CallingConventions::kArg2Reg);
856 __ pushq(CallingConventions::kArg1Reg); 788 __ pushq(CallingConventions::kArg1Reg);
857 __ movl(RAX, Address(RSP, 0)); // left low. 789 __ movl(RAX, Address(RSP, 0)); // left low.
858 __ movl(RDX, Address(RSP, 4)); // left high. 790 __ movl(RDX, Address(RSP, 4)); // left high.
859 __ movl(RCX, Address(RSP, 8)); // right low. 791 __ movl(RCX, Address(RSP, 8)); // right low.
860 __ movl(R8, Address(RSP, 12)); // right high 792 __ movl(R8, Address(RSP, 12)); // right high
861 __ subl(RAX, RCX); 793 __ subl(RAX, RCX);
862 __ sbbl(RDX, R8); 794 __ sbbl(RDX, R8);
863 // Result is in RAX/RDX. 795 // Result is in RAX/RDX.
864 __ movl(Address(RSP, 0), RAX); // result low. 796 __ movl(Address(RSP, 0), RAX); // result low.
865 __ movl(Address(RSP, 4), RDX); // result high. 797 __ movl(Address(RSP, 4), RDX); // result high.
866 __ popq(RAX); 798 __ popq(RAX);
867 __ popq(RDX); 799 __ popq(RDX);
868 __ ret(); 800 __ ret();
869 } 801 }
870 802
871
872 ASSEMBLER_TEST_RUN(LongSubReg, test) { 803 ASSEMBLER_TEST_RUN(LongSubReg, test) {
873 typedef int64_t (*LongSubRegCode)(int64_t a, int64_t b); 804 typedef int64_t (*LongSubRegCode)(int64_t a, int64_t b);
874 int64_t a = 12; 805 int64_t a = 12;
875 int64_t b = 14; 806 int64_t b = 14;
876 int64_t res = reinterpret_cast<LongSubRegCode>(test->entry())(a, b); 807 int64_t res = reinterpret_cast<LongSubRegCode>(test->entry())(a, b);
877 EXPECT_EQ((a - b), res); 808 EXPECT_EQ((a - b), res);
878 a = 600000; 809 a = 600000;
879 b = 2147483647; 810 b = 2147483647;
880 res = reinterpret_cast<LongSubRegCode>(test->entry())(a, b); 811 res = reinterpret_cast<LongSubRegCode>(test->entry())(a, b);
881 EXPECT_EQ((a - b), res); 812 EXPECT_EQ((a - b), res);
882 } 813 }
883 814
884
885 ASSEMBLER_TEST_GENERATE(LongSubImmediate, assembler) { 815 ASSEMBLER_TEST_GENERATE(LongSubImmediate, assembler) {
886 __ pushq(CallingConventions::kArg1Reg); 816 __ pushq(CallingConventions::kArg1Reg);
887 __ movl(RAX, Address(RSP, 0)); // left low. 817 __ movl(RAX, Address(RSP, 0)); // left low.
888 __ movl(RDX, Address(RSP, 4)); // left high. 818 __ movl(RDX, Address(RSP, 4)); // left high.
889 __ subl(RAX, Immediate(12)); // right low immediate. 819 __ subl(RAX, Immediate(12)); // right low immediate.
890 __ sbbl(RDX, Immediate(11)); // right high immediate. 820 __ sbbl(RDX, Immediate(11)); // right high immediate.
891 // Result is in RAX/RDX. 821 // Result is in RAX/RDX.
892 __ movl(Address(RSP, 0), RAX); // result low. 822 __ movl(Address(RSP, 0), RAX); // result low.
893 __ movl(Address(RSP, 4), RDX); // result high. 823 __ movl(Address(RSP, 4), RDX); // result high.
894 __ popq(RAX); 824 __ popq(RAX);
895 __ ret(); 825 __ ret();
896 } 826 }
897 827
898
899 ASSEMBLER_TEST_RUN(LongSubImmediate, test) { 828 ASSEMBLER_TEST_RUN(LongSubImmediate, test) {
900 typedef int64_t (*LongSubImmediateCode)(int64_t a); 829 typedef int64_t (*LongSubImmediateCode)(int64_t a);
901 int64_t a = (13LL << 32) + 14; 830 int64_t a = (13LL << 32) + 14;
902 int64_t b = (11LL << 32) + 12; 831 int64_t b = (11LL << 32) + 12;
903 int64_t res = reinterpret_cast<LongSubImmediateCode>(test->entry())(a); 832 int64_t res = reinterpret_cast<LongSubImmediateCode>(test->entry())(a);
904 EXPECT_EQ((a - b), res); 833 EXPECT_EQ((a - b), res);
905 a = (13LL << 32) + 10; 834 a = (13LL << 32) + 10;
906 res = reinterpret_cast<LongSubImmediateCode>(test->entry())(a); 835 res = reinterpret_cast<LongSubImmediateCode>(test->entry())(a);
907 EXPECT_EQ((a - b), res); 836 EXPECT_EQ((a - b), res);
908 } 837 }
909 838
910
911 ASSEMBLER_TEST_GENERATE(LongSubAddress, assembler) { 839 ASSEMBLER_TEST_GENERATE(LongSubAddress, assembler) {
912 __ pushq(CallingConventions::kArg2Reg); 840 __ pushq(CallingConventions::kArg2Reg);
913 __ pushq(CallingConventions::kArg1Reg); 841 __ pushq(CallingConventions::kArg1Reg);
914 __ movl(RAX, Address(RSP, 0)); // left low. 842 __ movl(RAX, Address(RSP, 0)); // left low.
915 __ movl(RDX, Address(RSP, 4)); // left high. 843 __ movl(RDX, Address(RSP, 4)); // left high.
916 __ subl(RAX, Address(RSP, 8)); // low. 844 __ subl(RAX, Address(RSP, 8)); // low.
917 __ sbbl(RDX, Address(RSP, 12)); // high. 845 __ sbbl(RDX, Address(RSP, 12)); // high.
918 // Result is in RAX/RDX. 846 // Result is in RAX/RDX.
919 __ movl(Address(RSP, 0), RAX); // result low. 847 __ movl(Address(RSP, 0), RAX); // result low.
920 __ movl(Address(RSP, 4), RDX); // result high. 848 __ movl(Address(RSP, 4), RDX); // result high.
921 __ popq(RAX); 849 __ popq(RAX);
922 __ popq(RDX); 850 __ popq(RDX);
923 __ ret(); 851 __ ret();
924 } 852 }
925 853
926
927 ASSEMBLER_TEST_RUN(LongSubAddress, test) { 854 ASSEMBLER_TEST_RUN(LongSubAddress, test) {
928 typedef int64_t (*LongSubAddressCode)(int64_t a, int64_t b); 855 typedef int64_t (*LongSubAddressCode)(int64_t a, int64_t b);
929 int64_t a = 12; 856 int64_t a = 12;
930 int64_t b = 14; 857 int64_t b = 14;
931 int64_t res = reinterpret_cast<LongSubAddressCode>(test->entry())(a, b); 858 int64_t res = reinterpret_cast<LongSubAddressCode>(test->entry())(a, b);
932 EXPECT_EQ((a - b), res); 859 EXPECT_EQ((a - b), res);
933 a = 600000; 860 a = 600000;
934 b = 2147483647; 861 b = 2147483647;
935 res = reinterpret_cast<LongSubAddressCode>(test->entry())(a, b); 862 res = reinterpret_cast<LongSubAddressCode>(test->entry())(a, b);
936 EXPECT_EQ((a - b), res); 863 EXPECT_EQ((a - b), res);
937 } 864 }
938 865
939
940 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { 866 ASSEMBLER_TEST_GENERATE(AddReg, assembler) {
941 __ movq(R10, CallingConventions::kArg1Reg); // al. 867 __ movq(R10, CallingConventions::kArg1Reg); // al.
942 __ addq(R10, CallingConventions::kArg3Reg); // bl. 868 __ addq(R10, CallingConventions::kArg3Reg); // bl.
943 __ movq(RAX, CallingConventions::kArg2Reg); // ah. 869 __ movq(RAX, CallingConventions::kArg2Reg); // ah.
944 __ adcq(RAX, CallingConventions::kArg4Reg); // bh. 870 __ adcq(RAX, CallingConventions::kArg4Reg); // bh.
945 // RAX = high64(ah:al + bh:bl). 871 // RAX = high64(ah:al + bh:bl).
946 __ ret(); 872 __ ret();
947 } 873 }
948 874
949
950 ASSEMBLER_TEST_RUN(AddReg, test) { 875 ASSEMBLER_TEST_RUN(AddReg, test) {
951 typedef int64_t (*AddRegCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh); 876 typedef int64_t (*AddRegCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh);
952 int64_t al = 11; 877 int64_t al = 11;
953 int64_t ah = 12; 878 int64_t ah = 12;
954 int64_t bl = 13; 879 int64_t bl = 13;
955 int64_t bh = 14; 880 int64_t bh = 14;
956 int64_t res = reinterpret_cast<AddRegCode>(test->entry())(al, ah, bl, bh); 881 int64_t res = reinterpret_cast<AddRegCode>(test->entry())(al, ah, bl, bh);
957 EXPECT_EQ((ah + bh), res); 882 EXPECT_EQ((ah + bh), res);
958 al = -1; 883 al = -1;
959 res = reinterpret_cast<AddRegCode>(test->entry())(al, ah, bl, bh); 884 res = reinterpret_cast<AddRegCode>(test->entry())(al, ah, bl, bh);
960 EXPECT_EQ((ah + bh + 1), res); 885 EXPECT_EQ((ah + bh + 1), res);
961 } 886 }
962 887
963
964 ASSEMBLER_TEST_GENERATE(AddImmediate, assembler) { 888 ASSEMBLER_TEST_GENERATE(AddImmediate, assembler) {
965 __ movq(R10, CallingConventions::kArg1Reg); // al. 889 __ movq(R10, CallingConventions::kArg1Reg); // al.
966 __ addq(R10, Immediate(13)); // bl. 890 __ addq(R10, Immediate(13)); // bl.
967 __ movq(RAX, CallingConventions::kArg2Reg); // ah. 891 __ movq(RAX, CallingConventions::kArg2Reg); // ah.
968 __ adcq(RAX, Immediate(14)); // bh. 892 __ adcq(RAX, Immediate(14)); // bh.
969 // RAX = high64(ah:al + bh:bl). 893 // RAX = high64(ah:al + bh:bl).
970 __ ret(); 894 __ ret();
971 } 895 }
972 896
973
974 ASSEMBLER_TEST_RUN(AddImmediate, test) { 897 ASSEMBLER_TEST_RUN(AddImmediate, test) {
975 typedef int64_t (*AddImmediateCode)(int64_t al, int64_t ah); 898 typedef int64_t (*AddImmediateCode)(int64_t al, int64_t ah);
976 int64_t al = 11; 899 int64_t al = 11;
977 int64_t ah = 12; 900 int64_t ah = 12;
978 int64_t bh = 14; 901 int64_t bh = 14;
979 int64_t res = reinterpret_cast<AddImmediateCode>(test->entry())(al, ah); 902 int64_t res = reinterpret_cast<AddImmediateCode>(test->entry())(al, ah);
980 EXPECT_EQ((ah + bh), res); 903 EXPECT_EQ((ah + bh), res);
981 al = -1; 904 al = -1;
982 res = reinterpret_cast<AddImmediateCode>(test->entry())(al, ah); 905 res = reinterpret_cast<AddImmediateCode>(test->entry())(al, ah);
983 EXPECT_EQ((ah + bh + 1), res); 906 EXPECT_EQ((ah + bh + 1), res);
984 } 907 }
985 908
986
987 ASSEMBLER_TEST_GENERATE(AddAddress, assembler) { 909 ASSEMBLER_TEST_GENERATE(AddAddress, assembler) {
988 __ pushq(CallingConventions::kArg4Reg); 910 __ pushq(CallingConventions::kArg4Reg);
989 __ pushq(CallingConventions::kArg3Reg); 911 __ pushq(CallingConventions::kArg3Reg);
990 __ pushq(CallingConventions::kArg2Reg); 912 __ pushq(CallingConventions::kArg2Reg);
991 __ pushq(CallingConventions::kArg1Reg); 913 __ pushq(CallingConventions::kArg1Reg);
992 __ movq(R10, Address(RSP, 0 * kWordSize)); // al. 914 __ movq(R10, Address(RSP, 0 * kWordSize)); // al.
993 __ addq(R10, Address(RSP, 2 * kWordSize)); // bl. 915 __ addq(R10, Address(RSP, 2 * kWordSize)); // bl.
994 __ movq(RAX, Address(RSP, 1 * kWordSize)); // ah. 916 __ movq(RAX, Address(RSP, 1 * kWordSize)); // ah.
995 __ adcq(RAX, Address(RSP, 3 * kWordSize)); // bh. 917 __ adcq(RAX, Address(RSP, 3 * kWordSize)); // bh.
996 // RAX = high64(ah:al + bh:bl). 918 // RAX = high64(ah:al + bh:bl).
997 __ Drop(4); 919 __ Drop(4);
998 __ ret(); 920 __ ret();
999 } 921 }
1000 922
1001
1002 ASSEMBLER_TEST_RUN(AddAddress, test) { 923 ASSEMBLER_TEST_RUN(AddAddress, test) {
1003 typedef int64_t (*AddCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh); 924 typedef int64_t (*AddCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh);
1004 int64_t al = 11; 925 int64_t al = 11;
1005 int64_t ah = 12; 926 int64_t ah = 12;
1006 int64_t bl = 13; 927 int64_t bl = 13;
1007 int64_t bh = 14; 928 int64_t bh = 14;
1008 int64_t res = reinterpret_cast<AddCode>(test->entry())(al, ah, bl, bh); 929 int64_t res = reinterpret_cast<AddCode>(test->entry())(al, ah, bl, bh);
1009 EXPECT_EQ((ah + bh), res); 930 EXPECT_EQ((ah + bh), res);
1010 al = -1; 931 al = -1;
1011 res = reinterpret_cast<AddCode>(test->entry())(al, ah, bl, bh); 932 res = reinterpret_cast<AddCode>(test->entry())(al, ah, bl, bh);
1012 EXPECT_EQ((ah + bh + 1), res); 933 EXPECT_EQ((ah + bh + 1), res);
1013 } 934 }
1014 935
1015
1016 ASSEMBLER_TEST_GENERATE(SubReg, assembler) { 936 ASSEMBLER_TEST_GENERATE(SubReg, assembler) {
1017 __ movq(R10, CallingConventions::kArg1Reg); // al. 937 __ movq(R10, CallingConventions::kArg1Reg); // al.
1018 __ subq(R10, CallingConventions::kArg3Reg); // bl. 938 __ subq(R10, CallingConventions::kArg3Reg); // bl.
1019 __ movq(RAX, CallingConventions::kArg2Reg); // ah. 939 __ movq(RAX, CallingConventions::kArg2Reg); // ah.
1020 __ sbbq(RAX, CallingConventions::kArg4Reg); // bh. 940 __ sbbq(RAX, CallingConventions::kArg4Reg); // bh.
1021 // RAX = high64(ah:al - bh:bl). 941 // RAX = high64(ah:al - bh:bl).
1022 __ ret(); 942 __ ret();
1023 } 943 }
1024 944
1025
1026 ASSEMBLER_TEST_RUN(SubReg, test) { 945 ASSEMBLER_TEST_RUN(SubReg, test) {
1027 typedef int64_t (*SubRegCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh); 946 typedef int64_t (*SubRegCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh);
1028 int64_t al = 14; 947 int64_t al = 14;
1029 int64_t ah = 13; 948 int64_t ah = 13;
1030 int64_t bl = 12; 949 int64_t bl = 12;
1031 int64_t bh = 11; 950 int64_t bh = 11;
1032 int64_t res = reinterpret_cast<SubRegCode>(test->entry())(al, ah, bl, bh); 951 int64_t res = reinterpret_cast<SubRegCode>(test->entry())(al, ah, bl, bh);
1033 EXPECT_EQ((ah - bh), res); 952 EXPECT_EQ((ah - bh), res);
1034 al = 10; 953 al = 10;
1035 res = reinterpret_cast<SubRegCode>(test->entry())(al, ah, bl, bh); 954 res = reinterpret_cast<SubRegCode>(test->entry())(al, ah, bl, bh);
1036 EXPECT_EQ((ah - bh - 1), res); 955 EXPECT_EQ((ah - bh - 1), res);
1037 } 956 }
1038 957
1039
1040 ASSEMBLER_TEST_GENERATE(SubImmediate, assembler) { 958 ASSEMBLER_TEST_GENERATE(SubImmediate, assembler) {
1041 __ movq(R10, CallingConventions::kArg1Reg); // al. 959 __ movq(R10, CallingConventions::kArg1Reg); // al.
1042 __ subq(R10, Immediate(12)); // bl. 960 __ subq(R10, Immediate(12)); // bl.
1043 __ movq(RAX, CallingConventions::kArg2Reg); // ah. 961 __ movq(RAX, CallingConventions::kArg2Reg); // ah.
1044 __ sbbq(RAX, Immediate(11)); // bh. 962 __ sbbq(RAX, Immediate(11)); // bh.
1045 // RAX = high64(ah:al - bh:bl). 963 // RAX = high64(ah:al - bh:bl).
1046 __ ret(); 964 __ ret();
1047 } 965 }
1048 966
1049
1050 ASSEMBLER_TEST_RUN(SubImmediate, test) { 967 ASSEMBLER_TEST_RUN(SubImmediate, test) {
1051 typedef int64_t (*SubImmediateCode)(int64_t al, int64_t ah); 968 typedef int64_t (*SubImmediateCode)(int64_t al, int64_t ah);
1052 int64_t al = 14; 969 int64_t al = 14;
1053 int64_t ah = 13; 970 int64_t ah = 13;
1054 int64_t bh = 11; 971 int64_t bh = 11;
1055 int64_t res = reinterpret_cast<SubImmediateCode>(test->entry())(al, ah); 972 int64_t res = reinterpret_cast<SubImmediateCode>(test->entry())(al, ah);
1056 EXPECT_EQ((ah - bh), res); 973 EXPECT_EQ((ah - bh), res);
1057 al = 10; 974 al = 10;
1058 res = reinterpret_cast<SubImmediateCode>(test->entry())(al, ah); 975 res = reinterpret_cast<SubImmediateCode>(test->entry())(al, ah);
1059 EXPECT_EQ((ah - bh - 1), res); 976 EXPECT_EQ((ah - bh - 1), res);
1060 } 977 }
1061 978
1062
1063 ASSEMBLER_TEST_GENERATE(SubAddress, assembler) { 979 ASSEMBLER_TEST_GENERATE(SubAddress, assembler) {
1064 __ pushq(CallingConventions::kArg4Reg); 980 __ pushq(CallingConventions::kArg4Reg);
1065 __ pushq(CallingConventions::kArg3Reg); 981 __ pushq(CallingConventions::kArg3Reg);
1066 __ pushq(CallingConventions::kArg2Reg); 982 __ pushq(CallingConventions::kArg2Reg);
1067 __ pushq(CallingConventions::kArg1Reg); 983 __ pushq(CallingConventions::kArg1Reg);
1068 __ movq(R10, Address(RSP, 0 * kWordSize)); // al. 984 __ movq(R10, Address(RSP, 0 * kWordSize)); // al.
1069 __ subq(R10, Address(RSP, 2 * kWordSize)); // bl. 985 __ subq(R10, Address(RSP, 2 * kWordSize)); // bl.
1070 __ movq(RAX, Address(RSP, 1 * kWordSize)); // ah. 986 __ movq(RAX, Address(RSP, 1 * kWordSize)); // ah.
1071 __ sbbq(RAX, Address(RSP, 3 * kWordSize)); // bh. 987 __ sbbq(RAX, Address(RSP, 3 * kWordSize)); // bh.
1072 // RAX = high64(ah:al - bh:bl). 988 // RAX = high64(ah:al - bh:bl).
1073 __ Drop(4); 989 __ Drop(4);
1074 __ ret(); 990 __ ret();
1075 } 991 }
1076 992
1077
1078 ASSEMBLER_TEST_RUN(SubAddress, test) { 993 ASSEMBLER_TEST_RUN(SubAddress, test) {
1079 typedef int64_t (*SubCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh); 994 typedef int64_t (*SubCode)(int64_t al, int64_t ah, int64_t bl, int64_t bh);
1080 int64_t al = 14; 995 int64_t al = 14;
1081 int64_t ah = 13; 996 int64_t ah = 13;
1082 int64_t bl = 12; 997 int64_t bl = 12;
1083 int64_t bh = 11; 998 int64_t bh = 11;
1084 int64_t res = reinterpret_cast<SubCode>(test->entry())(al, ah, bl, bh); 999 int64_t res = reinterpret_cast<SubCode>(test->entry())(al, ah, bl, bh);
1085 EXPECT_EQ((ah - bh), res); 1000 EXPECT_EQ((ah - bh), res);
1086 al = 10; 1001 al = 10;
1087 res = reinterpret_cast<SubCode>(test->entry())(al, ah, bl, bh); 1002 res = reinterpret_cast<SubCode>(test->entry())(al, ah, bl, bh);
1088 EXPECT_EQ((ah - bh - 1), res); 1003 EXPECT_EQ((ah - bh - 1), res);
1089 } 1004 }
1090 1005
1091
1092 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) { 1006 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) {
1093 __ movq(R10, Immediate(-1)); 1007 __ movq(R10, Immediate(-1));
1094 __ orl(Address(CallingConventions::kArg1Reg, 0), R10); 1008 __ orl(Address(CallingConventions::kArg1Reg, 0), R10);
1095 __ orl(Address(CallingConventions::kArg2Reg, 0), R10); 1009 __ orl(Address(CallingConventions::kArg2Reg, 0), R10);
1096 __ movl(RCX, Immediate(42)); 1010 __ movl(RCX, Immediate(42));
1097 __ xorl(RCX, RCX); 1011 __ xorl(RCX, RCX);
1098 __ orl(RCX, Immediate(256)); 1012 __ orl(RCX, Immediate(256));
1099 __ movl(RAX, Immediate(4)); 1013 __ movl(RAX, Immediate(4));
1100 __ orl(RCX, RAX); 1014 __ orl(RCX, RAX);
1101 __ movl(RAX, Immediate(0xfff0)); 1015 __ movl(RAX, Immediate(0xfff0));
1102 __ andl(RCX, RAX); 1016 __ andl(RCX, RAX);
1103 __ movl(RAX, Immediate(1)); 1017 __ movl(RAX, Immediate(1));
1104 __ orl(RCX, RAX); 1018 __ orl(RCX, RAX);
1105 __ movl(RAX, RCX); 1019 __ movl(RAX, RCX);
1106 __ ret(); 1020 __ ret();
1107 } 1021 }
1108 1022
1109
1110 ASSEMBLER_TEST_RUN(Bitwise, test) { 1023 ASSEMBLER_TEST_RUN(Bitwise, test) {
1111 uint64_t f1 = 0; 1024 uint64_t f1 = 0;
1112 uint64_t f2 = 0; 1025 uint64_t f2 = 0;
1113 typedef int (*Bitwise)(void*, void*); 1026 typedef int (*Bitwise)(void*, void*);
1114 int result = reinterpret_cast<Bitwise>(test->entry())(&f1, &f2); 1027 int result = reinterpret_cast<Bitwise>(test->entry())(&f1, &f2);
1115 EXPECT_EQ(256 + 1, result); 1028 EXPECT_EQ(256 + 1, result);
1116 EXPECT_EQ(kMaxUint32, f1); 1029 EXPECT_EQ(kMaxUint32, f1);
1117 EXPECT_EQ(kMaxUint32, f2); 1030 EXPECT_EQ(kMaxUint32, f2);
1118 } 1031 }
1119 1032
1120
1121 ASSEMBLER_TEST_GENERATE(Bitwise64, assembler) { 1033 ASSEMBLER_TEST_GENERATE(Bitwise64, assembler) {
1122 Label error; 1034 Label error;
1123 __ movq(RAX, Immediate(42)); 1035 __ movq(RAX, Immediate(42));
1124 __ pushq(RAX); 1036 __ pushq(RAX);
1125 __ xorq(RAX, Address(RSP, 0)); 1037 __ xorq(RAX, Address(RSP, 0));
1126 __ popq(RCX); 1038 __ popq(RCX);
1127 __ cmpq(RAX, Immediate(0)); 1039 __ cmpq(RAX, Immediate(0));
1128 __ j(NOT_EQUAL, &error); 1040 __ j(NOT_EQUAL, &error);
1129 __ movq(RCX, Immediate(0xFF)); 1041 __ movq(RCX, Immediate(0xFF));
1130 __ movq(RAX, Immediate(0x5)); 1042 __ movq(RAX, Immediate(0x5));
(...skipping 17 matching lines...) Expand all
1148 __ orq(RCX, Address(RSP, 0)); 1060 __ orq(RCX, Address(RSP, 0));
1149 __ xorq(RCX, Immediate(0)); 1061 __ xorq(RCX, Immediate(0));
1150 __ popq(RAX); 1062 __ popq(RAX);
1151 __ movq(RAX, RCX); 1063 __ movq(RAX, RCX);
1152 __ ret(); 1064 __ ret();
1153 __ Bind(&error); 1065 __ Bind(&error);
1154 __ movq(RAX, Immediate(-1)); 1066 __ movq(RAX, Immediate(-1));
1155 __ ret(); 1067 __ ret();
1156 } 1068 }
1157 1069
1158
1159 ASSEMBLER_TEST_RUN(Bitwise64, test) { 1070 ASSEMBLER_TEST_RUN(Bitwise64, test) {
1160 typedef int (*Bitwise64)(); 1071 typedef int (*Bitwise64)();
1161 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise64>(test->entry())()); 1072 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise64>(test->entry())());
1162 } 1073 }
1163 1074
1164
1165 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) { 1075 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) {
1166 Label donetest1; 1076 Label donetest1;
1167 __ movl(RAX, Immediate(4)); 1077 __ movl(RAX, Immediate(4));
1168 __ andl(RAX, Immediate(2)); 1078 __ andl(RAX, Immediate(2));
1169 __ cmpl(RAX, Immediate(0)); 1079 __ cmpl(RAX, Immediate(0));
1170 __ j(EQUAL, &donetest1); 1080 __ j(EQUAL, &donetest1);
1171 // Be sure to skip this crashing code. 1081 // Be sure to skip this crashing code.
1172 __ movl(RAX, Immediate(0)); 1082 __ movl(RAX, Immediate(0));
1173 __ movl(Address(RAX, 0), RAX); 1083 __ movl(Address(RAX, 0), RAX);
1174 __ Bind(&donetest1); 1084 __ Bind(&donetest1);
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1421 __ cmpq(RDX, Immediate(shifted)); 1331 __ cmpq(RDX, Immediate(shifted));
1422 __ j(EQUAL, &donetest15d); 1332 __ j(EQUAL, &donetest15d);
1423 __ int3(); 1333 __ int3();
1424 __ Bind(&donetest15d); 1334 __ Bind(&donetest15d);
1425 } 1335 }
1426 1336
1427 __ movl(RAX, Immediate(0)); 1337 __ movl(RAX, Immediate(0));
1428 __ ret(); 1338 __ ret();
1429 } 1339 }
1430 1340
1431
1432 ASSEMBLER_TEST_RUN(LogicalOps, test) { 1341 ASSEMBLER_TEST_RUN(LogicalOps, test) {
1433 typedef int (*LogicalOpsCode)(); 1342 typedef int (*LogicalOpsCode)();
1434 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())()); 1343 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())());
1435 } 1344 }
1436 1345
1437
1438 ASSEMBLER_TEST_GENERATE(LogicalOps64, assembler) { 1346 ASSEMBLER_TEST_GENERATE(LogicalOps64, assembler) {
1439 Label donetest1; 1347 Label donetest1;
1440 __ movq(RAX, Immediate(4)); 1348 __ movq(RAX, Immediate(4));
1441 __ andq(RAX, Immediate(2)); 1349 __ andq(RAX, Immediate(2));
1442 __ cmpq(RAX, Immediate(0)); 1350 __ cmpq(RAX, Immediate(0));
1443 __ j(EQUAL, &donetest1); 1351 __ j(EQUAL, &donetest1);
1444 __ int3(); 1352 __ int3();
1445 __ Bind(&donetest1); 1353 __ Bind(&donetest1);
1446 1354
1447 Label donetest2; 1355 Label donetest2;
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 __ cmpq(R15, Immediate(2)); 1519 __ cmpq(R15, Immediate(2));
1612 __ j(EQUAL, &donetest15); 1520 __ j(EQUAL, &donetest15);
1613 __ int3(); 1521 __ int3();
1614 __ Bind(&donetest15); 1522 __ Bind(&donetest15);
1615 __ popq(R15); // Callee saved. 1523 __ popq(R15); // Callee saved.
1616 1524
1617 __ movq(RAX, Immediate(0)); 1525 __ movq(RAX, Immediate(0));
1618 __ ret(); 1526 __ ret();
1619 } 1527 }
1620 1528
1621
1622 ASSEMBLER_TEST_RUN(LogicalOps64, test) { 1529 ASSEMBLER_TEST_RUN(LogicalOps64, test) {
1623 typedef int (*LogicalOpsCode)(); 1530 typedef int (*LogicalOpsCode)();
1624 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())()); 1531 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())());
1625 } 1532 }
1626 1533
1627
1628 ASSEMBLER_TEST_GENERATE(LogicalTestL, assembler) { 1534 ASSEMBLER_TEST_GENERATE(LogicalTestL, assembler) {
1629 Label donetest1; 1535 Label donetest1;
1630 __ movl(RAX, Immediate(4)); 1536 __ movl(RAX, Immediate(4));
1631 __ movl(RCX, Immediate(2)); 1537 __ movl(RCX, Immediate(2));
1632 __ testl(RAX, RCX); 1538 __ testl(RAX, RCX);
1633 __ j(EQUAL, &donetest1); 1539 __ j(EQUAL, &donetest1);
1634 // Be sure to skip this crashing code. 1540 // Be sure to skip this crashing code.
1635 __ movl(RAX, Immediate(0)); 1541 __ movl(RAX, Immediate(0));
1636 __ movl(Address(RAX, 0), RAX); 1542 __ movl(Address(RAX, 0), RAX);
1637 __ Bind(&donetest1); 1543 __ Bind(&donetest1);
(...skipping 23 matching lines...) Expand all
1661 __ j(NOT_EQUAL, &donetest4); 1567 __ j(NOT_EQUAL, &donetest4);
1662 // Be sure to skip this crashing code. 1568 // Be sure to skip this crashing code.
1663 __ movl(RAX, Immediate(0)); 1569 __ movl(RAX, Immediate(0));
1664 __ movl(Address(RAX, 0), RAX); 1570 __ movl(Address(RAX, 0), RAX);
1665 __ Bind(&donetest4); 1571 __ Bind(&donetest4);
1666 1572
1667 __ movl(RAX, Immediate(0)); 1573 __ movl(RAX, Immediate(0));
1668 __ ret(); 1574 __ ret();
1669 } 1575 }
1670 1576
1671
1672 ASSEMBLER_TEST_RUN(LogicalTestL, test) { 1577 ASSEMBLER_TEST_RUN(LogicalTestL, test) {
1673 typedef int (*LogicalTestCode)(); 1578 typedef int (*LogicalTestCode)();
1674 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())()); 1579 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())());
1675 } 1580 }
1676 1581
1677
1678 ASSEMBLER_TEST_GENERATE(LogicalTestQ, assembler) { 1582 ASSEMBLER_TEST_GENERATE(LogicalTestQ, assembler) {
1679 Label donetest1; 1583 Label donetest1;
1680 __ movq(RAX, Immediate(4)); 1584 __ movq(RAX, Immediate(4));
1681 __ movq(RCX, Immediate(2)); 1585 __ movq(RCX, Immediate(2));
1682 __ testq(RAX, RCX); 1586 __ testq(RAX, RCX);
1683 __ j(EQUAL, &donetest1); 1587 __ j(EQUAL, &donetest1);
1684 // Be sure to skip this crashing code. 1588 // Be sure to skip this crashing code.
1685 __ movq(RAX, Immediate(0)); 1589 __ movq(RAX, Immediate(0));
1686 __ movq(Address(RAX, 0), RAX); 1590 __ movq(Address(RAX, 0), RAX);
1687 __ Bind(&donetest1); 1591 __ Bind(&donetest1);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1729 __ j(NOT_EQUAL, &donetest6); 1633 __ j(NOT_EQUAL, &donetest6);
1730 // Be sure to skip this crashing code. 1634 // Be sure to skip this crashing code.
1731 __ movq(RAX, Immediate(0)); 1635 __ movq(RAX, Immediate(0));
1732 __ movq(Address(RAX, 0), RAX); 1636 __ movq(Address(RAX, 0), RAX);
1733 __ Bind(&donetest6); 1637 __ Bind(&donetest6);
1734 1638
1735 __ movq(RAX, Immediate(0)); 1639 __ movq(RAX, Immediate(0));
1736 __ ret(); 1640 __ ret();
1737 } 1641 }
1738 1642
1739
1740 ASSEMBLER_TEST_RUN(LogicalTestQ, test) { 1643 ASSEMBLER_TEST_RUN(LogicalTestQ, test) {
1741 typedef int (*LogicalTestCode)(); 1644 typedef int (*LogicalTestCode)();
1742 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())()); 1645 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())());
1743 } 1646 }
1744 1647
1745
1746 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) { 1648 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) {
1747 __ movq(RAX, Immediate(0)); 1649 __ movq(RAX, Immediate(0));
1748 __ pushq(RAX); 1650 __ pushq(RAX);
1749 __ movq(RAX, Immediate(4)); 1651 __ movq(RAX, Immediate(4));
1750 __ movq(RCX, Immediate(0)); 1652 __ movq(RCX, Immediate(0));
1751 __ movq(Address(RSP, 0), RAX); 1653 __ movq(Address(RSP, 0), RAX);
1752 __ LockCmpxchgq(Address(RSP, 0), RCX); 1654 __ LockCmpxchgq(Address(RSP, 0), RCX);
1753 __ popq(RAX); 1655 __ popq(RAX);
1754 __ ret(); 1656 __ ret();
1755 } 1657 }
1756 1658
1757
1758 ASSEMBLER_TEST_RUN(CompareSwapEQ, test) { 1659 ASSEMBLER_TEST_RUN(CompareSwapEQ, test) {
1759 typedef int (*CompareSwapEQCode)(); 1660 typedef int (*CompareSwapEQCode)();
1760 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(test->entry())()); 1661 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(test->entry())());
1761 } 1662 }
1762 1663
1763
1764 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) { 1664 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) {
1765 __ movq(RAX, Immediate(0)); 1665 __ movq(RAX, Immediate(0));
1766 __ pushq(RAX); 1666 __ pushq(RAX);
1767 __ movq(RAX, Immediate(2)); 1667 __ movq(RAX, Immediate(2));
1768 __ movq(RCX, Immediate(4)); 1668 __ movq(RCX, Immediate(4));
1769 __ movq(Address(RSP, 0), RCX); 1669 __ movq(Address(RSP, 0), RCX);
1770 __ LockCmpxchgq(Address(RSP, 0), RCX); 1670 __ LockCmpxchgq(Address(RSP, 0), RCX);
1771 __ popq(RAX); 1671 __ popq(RAX);
1772 __ ret(); 1672 __ ret();
1773 } 1673 }
1774 1674
1775
1776 ASSEMBLER_TEST_RUN(CompareSwapNEQ, test) { 1675 ASSEMBLER_TEST_RUN(CompareSwapNEQ, test) {
1777 typedef int (*CompareSwapNEQCode)(); 1676 typedef int (*CompareSwapNEQCode)();
1778 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(test->entry())()); 1677 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(test->entry())());
1779 } 1678 }
1780 1679
1781
1782 ASSEMBLER_TEST_GENERATE(CompareSwapEQ32, assembler) { 1680 ASSEMBLER_TEST_GENERATE(CompareSwapEQ32, assembler) {
1783 __ movq(RAX, Immediate(0x100000000)); 1681 __ movq(RAX, Immediate(0x100000000));
1784 __ pushq(RAX); 1682 __ pushq(RAX);
1785 __ movq(RAX, Immediate(4)); 1683 __ movq(RAX, Immediate(4));
1786 __ movq(RCX, Immediate(0)); 1684 __ movq(RCX, Immediate(0));
1787 // 32 bit store of 4. 1685 // 32 bit store of 4.
1788 __ movl(Address(RSP, 0), RAX); 1686 __ movl(Address(RSP, 0), RAX);
1789 // Compare 32 bit memory location with RAX (4) and write 0. 1687 // Compare 32 bit memory location with RAX (4) and write 0.
1790 __ LockCmpxchgl(Address(RSP, 0), RCX); 1688 __ LockCmpxchgl(Address(RSP, 0), RCX);
1791 // Pop unchanged high word and zeroed out low word. 1689 // Pop unchanged high word and zeroed out low word.
1792 __ popq(RAX); 1690 __ popq(RAX);
1793 __ ret(); 1691 __ ret();
1794 } 1692 }
1795 1693
1796
1797 ASSEMBLER_TEST_RUN(CompareSwapEQ32, test) { 1694 ASSEMBLER_TEST_RUN(CompareSwapEQ32, test) {
1798 typedef intptr_t (*CompareSwapEQ32Code)(); 1695 typedef intptr_t (*CompareSwapEQ32Code)();
1799 EXPECT_EQ(0x100000000, 1696 EXPECT_EQ(0x100000000,
1800 reinterpret_cast<CompareSwapEQ32Code>(test->entry())()); 1697 reinterpret_cast<CompareSwapEQ32Code>(test->entry())());
1801 } 1698 }
1802 1699
1803
1804 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ32, assembler) { 1700 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ32, assembler) {
1805 __ movq(RAX, Immediate(0x100000000)); 1701 __ movq(RAX, Immediate(0x100000000));
1806 __ pushq(RAX); 1702 __ pushq(RAX);
1807 __ movq(RAX, Immediate(2)); 1703 __ movq(RAX, Immediate(2));
1808 __ movq(RCX, Immediate(4)); 1704 __ movq(RCX, Immediate(4));
1809 __ movl(Address(RSP, 0), RCX); 1705 __ movl(Address(RSP, 0), RCX);
1810 __ LockCmpxchgl(Address(RSP, 0), RCX); 1706 __ LockCmpxchgl(Address(RSP, 0), RCX);
1811 __ popq(RAX); 1707 __ popq(RAX);
1812 __ ret(); 1708 __ ret();
1813 } 1709 }
1814 1710
1815
1816 ASSEMBLER_TEST_RUN(CompareSwapNEQ32, test) { 1711 ASSEMBLER_TEST_RUN(CompareSwapNEQ32, test) {
1817 typedef intptr_t (*CompareSwapNEQ32Code)(); 1712 typedef intptr_t (*CompareSwapNEQ32Code)();
1818 EXPECT_EQ(0x100000004l, 1713 EXPECT_EQ(0x100000004l,
1819 reinterpret_cast<CompareSwapNEQ32Code>(test->entry())()); 1714 reinterpret_cast<CompareSwapNEQ32Code>(test->entry())());
1820 } 1715 }
1821 1716
1822
1823 ASSEMBLER_TEST_GENERATE(Exchange, assembler) { 1717 ASSEMBLER_TEST_GENERATE(Exchange, assembler) {
1824 __ movq(RAX, Immediate(kLargeConstant)); 1718 __ movq(RAX, Immediate(kLargeConstant));
1825 __ movq(RDX, Immediate(kAnotherLargeConstant)); 1719 __ movq(RDX, Immediate(kAnotherLargeConstant));
1826 __ xchgq(RAX, RDX); 1720 __ xchgq(RAX, RDX);
1827 __ subq(RAX, RDX); 1721 __ subq(RAX, RDX);
1828 __ ret(); 1722 __ ret();
1829 } 1723 }
1830 1724
1831
1832 ASSEMBLER_TEST_RUN(Exchange, test) { 1725 ASSEMBLER_TEST_RUN(Exchange, test) {
1833 typedef int64_t (*Exchange)(); 1726 typedef int64_t (*Exchange)();
1834 EXPECT_EQ(kAnotherLargeConstant - kLargeConstant, 1727 EXPECT_EQ(kAnotherLargeConstant - kLargeConstant,
1835 reinterpret_cast<Exchange>(test->entry())()); 1728 reinterpret_cast<Exchange>(test->entry())());
1836 } 1729 }
1837 1730
1838
1839 ASSEMBLER_TEST_GENERATE(LargeConstant, assembler) { 1731 ASSEMBLER_TEST_GENERATE(LargeConstant, assembler) {
1840 __ movq(RAX, Immediate(kLargeConstant)); 1732 __ movq(RAX, Immediate(kLargeConstant));
1841 __ ret(); 1733 __ ret();
1842 } 1734 }
1843 1735
1844
1845 ASSEMBLER_TEST_RUN(LargeConstant, test) { 1736 ASSEMBLER_TEST_RUN(LargeConstant, test) {
1846 typedef int64_t (*LargeConstantCode)(); 1737 typedef int64_t (*LargeConstantCode)();
1847 EXPECT_EQ(kLargeConstant, 1738 EXPECT_EQ(kLargeConstant,
1848 reinterpret_cast<LargeConstantCode>(test->entry())()); 1739 reinterpret_cast<LargeConstantCode>(test->entry())());
1849 } 1740 }
1850 1741
1851
1852 static int ComputeStackSpaceReservation(int needed, int fixed) { 1742 static int ComputeStackSpaceReservation(int needed, int fixed) {
1853 return (OS::ActivationFrameAlignment() > 1) 1743 return (OS::ActivationFrameAlignment() > 1)
1854 ? Utils::RoundUp(needed + fixed, OS::ActivationFrameAlignment()) - 1744 ? Utils::RoundUp(needed + fixed, OS::ActivationFrameAlignment()) -
1855 fixed 1745 fixed
1856 : needed; 1746 : needed;
1857 } 1747 }
1858 1748
1859
1860 static int LeafReturn42() { 1749 static int LeafReturn42() {
1861 return 42; 1750 return 42;
1862 } 1751 }
1863 1752
1864
1865 static int LeafReturnArgument(int x) { 1753 static int LeafReturnArgument(int x) {
1866 return x + 87; 1754 return x + 87;
1867 } 1755 }
1868 1756
1869
1870 ASSEMBLER_TEST_GENERATE(CallSimpleLeaf, assembler) { 1757 ASSEMBLER_TEST_GENERATE(CallSimpleLeaf, assembler) {
1871 ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42)); 1758 ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
1872 ExternalLabel call2(reinterpret_cast<uword>(LeafReturnArgument)); 1759 ExternalLabel call2(reinterpret_cast<uword>(LeafReturnArgument));
1873 int space = ComputeStackSpaceReservation(0, 8); 1760 int space = ComputeStackSpaceReservation(0, 8);
1874 __ subq(RSP, Immediate(space)); 1761 __ subq(RSP, Immediate(space));
1875 __ call(&call1); 1762 __ call(&call1);
1876 __ addq(RSP, Immediate(space)); 1763 __ addq(RSP, Immediate(space));
1877 space = ComputeStackSpaceReservation(0, 8); 1764 space = ComputeStackSpaceReservation(0, 8);
1878 __ subq(RSP, Immediate(space)); 1765 __ subq(RSP, Immediate(space));
1879 __ movl(CallingConventions::kArg1Reg, RAX); 1766 __ movl(CallingConventions::kArg1Reg, RAX);
1880 __ call(&call2); 1767 __ call(&call2);
1881 __ addq(RSP, Immediate(space)); 1768 __ addq(RSP, Immediate(space));
1882 __ ret(); 1769 __ ret();
1883 } 1770 }
1884 1771
1885
1886 ASSEMBLER_TEST_RUN(CallSimpleLeaf, test) { 1772 ASSEMBLER_TEST_RUN(CallSimpleLeaf, test) {
1887 typedef int (*CallSimpleLeafCode)(); 1773 typedef int (*CallSimpleLeafCode)();
1888 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(test->entry())()); 1774 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(test->entry())());
1889 } 1775 }
1890 1776
1891
1892 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) { 1777 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) {
1893 ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42)); 1778 ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
1894 Label L; 1779 Label L;
1895 int space = ComputeStackSpaceReservation(0, 8); 1780 int space = ComputeStackSpaceReservation(0, 8);
1896 __ subq(RSP, Immediate(space)); 1781 __ subq(RSP, Immediate(space));
1897 __ call(&L); 1782 __ call(&L);
1898 __ addq(RSP, Immediate(space)); 1783 __ addq(RSP, Immediate(space));
1899 __ ret(); 1784 __ ret();
1900 __ Bind(&L); 1785 __ Bind(&L);
1901 __ jmp(&call1); 1786 __ jmp(&call1);
1902 } 1787 }
1903 1788
1904
1905 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, test) { 1789 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, test) {
1906 typedef int (*JumpSimpleLeafCode)(); 1790 typedef int (*JumpSimpleLeafCode)();
1907 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(test->entry())()); 1791 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(test->entry())());
1908 } 1792 }
1909 1793
1910
1911 ASSEMBLER_TEST_GENERATE(JumpIndirect, assembler) { 1794 ASSEMBLER_TEST_GENERATE(JumpIndirect, assembler) {
1912 ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42)); 1795 ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
1913 __ movq(Address(CallingConventions::kArg1Reg, 0), Immediate(call1.address())); 1796 __ movq(Address(CallingConventions::kArg1Reg, 0), Immediate(call1.address()));
1914 __ jmp(Address(CallingConventions::kArg1Reg, 0)); 1797 __ jmp(Address(CallingConventions::kArg1Reg, 0));
1915 } 1798 }
1916 1799
1917
1918 ASSEMBLER_TEST_RUN(JumpIndirect, test) { 1800 ASSEMBLER_TEST_RUN(JumpIndirect, test) {
1919 uword temp = 0; 1801 uword temp = 0;
1920 typedef int (*JumpIndirect)(uword*); 1802 typedef int (*JumpIndirect)(uword*);
1921 EXPECT_EQ(42, reinterpret_cast<JumpIndirect>(test->entry())(&temp)); 1803 EXPECT_EQ(42, reinterpret_cast<JumpIndirect>(test->entry())(&temp));
1922 } 1804 }
1923 1805
1924
1925 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { 1806 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) {
1926 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); 1807 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
1927 __ movd(XMM0, RAX); 1808 __ movd(XMM0, RAX);
1928 __ movss(XMM1, XMM0); 1809 __ movss(XMM1, XMM0);
1929 __ movss(XMM2, XMM1); 1810 __ movss(XMM2, XMM1);
1930 __ movss(XMM3, XMM2); 1811 __ movss(XMM3, XMM2);
1931 __ movss(XMM4, XMM3); 1812 __ movss(XMM4, XMM3);
1932 __ movss(XMM5, XMM4); 1813 __ movss(XMM5, XMM4);
1933 __ movss(XMM6, XMM5); 1814 __ movss(XMM6, XMM5);
1934 __ movss(XMM7, XMM6); 1815 __ movss(XMM7, XMM6);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 __ movss(XMM4, XMM5); 1850 __ movss(XMM4, XMM5);
1970 __ movss(XMM3, XMM4); 1851 __ movss(XMM3, XMM4);
1971 __ movss(XMM2, XMM3); 1852 __ movss(XMM2, XMM3);
1972 __ movss(XMM1, XMM2); 1853 __ movss(XMM1, XMM2);
1973 __ movss(XMM0, XMM1); 1854 __ movss(XMM0, XMM1);
1974 __ popq(RAX); 1855 __ popq(RAX);
1975 __ popq(R15); // Callee saved. 1856 __ popq(R15); // Callee saved.
1976 __ ret(); 1857 __ ret();
1977 } 1858 }
1978 1859
1979
1980 ASSEMBLER_TEST_RUN(SingleFPMoves, test) { 1860 ASSEMBLER_TEST_RUN(SingleFPMoves, test) {
1981 typedef float (*SingleFPMovesCode)(); 1861 typedef float (*SingleFPMovesCode)();
1982 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(test->entry())()); 1862 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(test->entry())());
1983 } 1863 }
1984 1864
1985
1986 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) { 1865 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) {
1987 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); 1866 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
1988 __ movd(XMM0, RAX); 1867 __ movd(XMM0, RAX);
1989 __ movd(XMM8, RAX); 1868 __ movd(XMM8, RAX);
1990 __ movss(XMM1, XMM8); 1869 __ movss(XMM1, XMM8);
1991 __ pushq(RAX); 1870 __ pushq(RAX);
1992 __ movq(Address(RSP, 0), Immediate(0)); 1871 __ movq(Address(RSP, 0), Immediate(0));
1993 __ movss(XMM0, Address(RSP, 0)); 1872 __ movss(XMM0, Address(RSP, 0));
1994 __ movss(Address(RSP, 0), XMM1); 1873 __ movss(Address(RSP, 0), XMM1);
1995 __ movss(XMM0, Address(RSP, 0)); 1874 __ movss(XMM0, Address(RSP, 0));
1996 __ movq(Address(RSP, 0), Immediate(0)); 1875 __ movq(Address(RSP, 0), Immediate(0));
1997 __ movss(XMM9, XMM8); 1876 __ movss(XMM9, XMM8);
1998 __ movss(Address(RSP, 0), XMM9); 1877 __ movss(Address(RSP, 0), XMM9);
1999 __ movss(XMM8, Address(RSP, 0)); 1878 __ movss(XMM8, Address(RSP, 0));
2000 __ movss(XMM0, XMM8); 1879 __ movss(XMM0, XMM8);
2001 __ popq(RAX); 1880 __ popq(RAX);
2002 __ ret(); 1881 __ ret();
2003 } 1882 }
2004 1883
2005
2006 ASSEMBLER_TEST_RUN(SingleFPMoves2, test) { 1884 ASSEMBLER_TEST_RUN(SingleFPMoves2, test) {
2007 typedef float (*SingleFPMoves2Code)(); 1885 typedef float (*SingleFPMoves2Code)();
2008 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(test->entry())()); 1886 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(test->entry())());
2009 } 1887 }
2010 1888
2011
2012 ASSEMBLER_TEST_GENERATE(PackedDoubleAdd, assembler) { 1889 ASSEMBLER_TEST_GENERATE(PackedDoubleAdd, assembler) {
2013 static const struct ALIGN16 { 1890 static const struct ALIGN16 {
2014 double a; 1891 double a;
2015 double b; 1892 double b;
2016 } constant0 = {1.0, 2.0}; 1893 } constant0 = {1.0, 2.0};
2017 static const struct ALIGN16 { 1894 static const struct ALIGN16 {
2018 double a; 1895 double a;
2019 double b; 1896 double b;
2020 } constant1 = {3.0, 4.0}; 1897 } constant1 = {3.0, 4.0};
2021 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 1898 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2022 __ movups(XMM10, Address(RAX, 0)); 1899 __ movups(XMM10, Address(RAX, 0));
2023 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1))); 1900 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
2024 __ movups(XMM11, Address(RAX, 0)); 1901 __ movups(XMM11, Address(RAX, 0));
2025 __ addpd(XMM10, XMM11); 1902 __ addpd(XMM10, XMM11);
2026 __ movaps(XMM0, XMM10); 1903 __ movaps(XMM0, XMM10);
2027 __ ret(); 1904 __ ret();
2028 } 1905 }
2029 1906
2030
2031 ASSEMBLER_TEST_RUN(PackedDoubleAdd, test) { 1907 ASSEMBLER_TEST_RUN(PackedDoubleAdd, test) {
2032 typedef double (*PackedDoubleAdd)(); 1908 typedef double (*PackedDoubleAdd)();
2033 double res = reinterpret_cast<PackedDoubleAdd>(test->entry())(); 1909 double res = reinterpret_cast<PackedDoubleAdd>(test->entry())();
2034 EXPECT_FLOAT_EQ(4.0, res, 0.000001f); 1910 EXPECT_FLOAT_EQ(4.0, res, 0.000001f);
2035 } 1911 }
2036 1912
2037
2038 ASSEMBLER_TEST_GENERATE(PackedDoubleSub, assembler) { 1913 ASSEMBLER_TEST_GENERATE(PackedDoubleSub, assembler) {
2039 static const struct ALIGN16 { 1914 static const struct ALIGN16 {
2040 double a; 1915 double a;
2041 double b; 1916 double b;
2042 } constant0 = {1.0, 2.0}; 1917 } constant0 = {1.0, 2.0};
2043 static const struct ALIGN16 { 1918 static const struct ALIGN16 {
2044 double a; 1919 double a;
2045 double b; 1920 double b;
2046 } constant1 = {3.0, 4.0}; 1921 } constant1 = {3.0, 4.0};
2047 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 1922 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2048 __ movups(XMM10, Address(RAX, 0)); 1923 __ movups(XMM10, Address(RAX, 0));
2049 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1))); 1924 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
2050 __ movups(XMM11, Address(RAX, 0)); 1925 __ movups(XMM11, Address(RAX, 0));
2051 __ subpd(XMM10, XMM11); 1926 __ subpd(XMM10, XMM11);
2052 __ movaps(XMM0, XMM10); 1927 __ movaps(XMM0, XMM10);
2053 __ ret(); 1928 __ ret();
2054 } 1929 }
2055 1930
2056
2057 ASSEMBLER_TEST_RUN(PackedDoubleSub, test) { 1931 ASSEMBLER_TEST_RUN(PackedDoubleSub, test) {
2058 typedef double (*PackedDoubleSub)(); 1932 typedef double (*PackedDoubleSub)();
2059 double res = reinterpret_cast<PackedDoubleSub>(test->entry())(); 1933 double res = reinterpret_cast<PackedDoubleSub>(test->entry())();
2060 EXPECT_FLOAT_EQ(-2.0, res, 0.000001f); 1934 EXPECT_FLOAT_EQ(-2.0, res, 0.000001f);
2061 } 1935 }
2062 1936
2063
2064 static void EnterTestFrame(Assembler* assembler) { 1937 static void EnterTestFrame(Assembler* assembler) {
2065 COMPILE_ASSERT(THR != CallingConventions::kArg1Reg); 1938 COMPILE_ASSERT(THR != CallingConventions::kArg1Reg);
2066 COMPILE_ASSERT(CODE_REG != CallingConventions::kArg2Reg); 1939 COMPILE_ASSERT(CODE_REG != CallingConventions::kArg2Reg);
2067 __ EnterFrame(0); 1940 __ EnterFrame(0);
2068 __ pushq(CODE_REG); 1941 __ pushq(CODE_REG);
2069 __ pushq(PP); 1942 __ pushq(PP);
2070 __ pushq(THR); 1943 __ pushq(THR);
2071 __ movq(CODE_REG, Address(CallingConventions::kArg1Reg, 1944 __ movq(CODE_REG, Address(CallingConventions::kArg1Reg,
2072 VMHandles::kOffsetOfRawPtrInHandle)); 1945 VMHandles::kOffsetOfRawPtrInHandle));
2073 __ movq(THR, CallingConventions::kArg2Reg); 1946 __ movq(THR, CallingConventions::kArg2Reg);
2074 __ LoadPoolPointer(PP); 1947 __ LoadPoolPointer(PP);
2075 } 1948 }
2076 1949
2077
2078 static void LeaveTestFrame(Assembler* assembler) { 1950 static void LeaveTestFrame(Assembler* assembler) {
2079 __ popq(THR); 1951 __ popq(THR);
2080 __ popq(PP); 1952 __ popq(PP);
2081 __ popq(CODE_REG); 1953 __ popq(CODE_REG);
2082 __ LeaveFrame(); 1954 __ LeaveFrame();
2083 } 1955 }
2084 1956
2085
2086 ASSEMBLER_TEST_GENERATE(PackedDoubleNegate, assembler) { 1957 ASSEMBLER_TEST_GENERATE(PackedDoubleNegate, assembler) {
2087 static const struct ALIGN16 { 1958 static const struct ALIGN16 {
2088 double a; 1959 double a;
2089 double b; 1960 double b;
2090 } constant0 = {1.0, 2.0}; 1961 } constant0 = {1.0, 2.0};
2091 EnterTestFrame(assembler); 1962 EnterTestFrame(assembler);
2092 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 1963 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2093 __ movups(XMM10, Address(RAX, 0)); 1964 __ movups(XMM10, Address(RAX, 0));
2094 __ negatepd(XMM10); 1965 __ negatepd(XMM10);
2095 __ movaps(XMM0, XMM10); 1966 __ movaps(XMM0, XMM10);
2096 LeaveTestFrame(assembler); 1967 LeaveTestFrame(assembler);
2097 __ ret(); 1968 __ ret();
2098 } 1969 }
2099 1970
2100
2101 ASSEMBLER_TEST_RUN(PackedDoubleNegate, test) { 1971 ASSEMBLER_TEST_RUN(PackedDoubleNegate, test) {
2102 double res = test->InvokeWithCodeAndThread<double>(); 1972 double res = test->InvokeWithCodeAndThread<double>();
2103 EXPECT_FLOAT_EQ(-1.0, res, 0.000001f); 1973 EXPECT_FLOAT_EQ(-1.0, res, 0.000001f);
2104 } 1974 }
2105 1975
2106
2107 ASSEMBLER_TEST_GENERATE(PackedDoubleAbsolute, assembler) { 1976 ASSEMBLER_TEST_GENERATE(PackedDoubleAbsolute, assembler) {
2108 static const struct ALIGN16 { 1977 static const struct ALIGN16 {
2109 double a; 1978 double a;
2110 double b; 1979 double b;
2111 } constant0 = {-1.0, 2.0}; 1980 } constant0 = {-1.0, 2.0};
2112 EnterTestFrame(assembler); 1981 EnterTestFrame(assembler);
2113 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 1982 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2114 __ movups(XMM10, Address(RAX, 0)); 1983 __ movups(XMM10, Address(RAX, 0));
2115 __ abspd(XMM10); 1984 __ abspd(XMM10);
2116 __ movaps(XMM0, XMM10); 1985 __ movaps(XMM0, XMM10);
2117 LeaveTestFrame(assembler); 1986 LeaveTestFrame(assembler);
2118 __ ret(); 1987 __ ret();
2119 } 1988 }
2120 1989
2121
2122 ASSEMBLER_TEST_RUN(PackedDoubleAbsolute, test) { 1990 ASSEMBLER_TEST_RUN(PackedDoubleAbsolute, test) {
2123 double res = test->InvokeWithCodeAndThread<double>(); 1991 double res = test->InvokeWithCodeAndThread<double>();
2124 EXPECT_FLOAT_EQ(1.0, res, 0.000001f); 1992 EXPECT_FLOAT_EQ(1.0, res, 0.000001f);
2125 } 1993 }
2126 1994
2127
2128 ASSEMBLER_TEST_GENERATE(PackedDoubleMul, assembler) { 1995 ASSEMBLER_TEST_GENERATE(PackedDoubleMul, assembler) {
2129 static const struct ALIGN16 { 1996 static const struct ALIGN16 {
2130 double a; 1997 double a;
2131 double b; 1998 double b;
2132 } constant0 = {3.0, 2.0}; 1999 } constant0 = {3.0, 2.0};
2133 static const struct ALIGN16 { 2000 static const struct ALIGN16 {
2134 double a; 2001 double a;
2135 double b; 2002 double b;
2136 } constant1 = {3.0, 4.0}; 2003 } constant1 = {3.0, 4.0};
2137 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2004 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2138 __ movups(XMM10, Address(RAX, 0)); 2005 __ movups(XMM10, Address(RAX, 0));
2139 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1))); 2006 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
2140 __ movups(XMM11, Address(RAX, 0)); 2007 __ movups(XMM11, Address(RAX, 0));
2141 __ mulpd(XMM10, XMM11); 2008 __ mulpd(XMM10, XMM11);
2142 __ movaps(XMM0, XMM10); 2009 __ movaps(XMM0, XMM10);
2143 __ ret(); 2010 __ ret();
2144 } 2011 }
2145 2012
2146
2147 ASSEMBLER_TEST_RUN(PackedDoubleMul, test) { 2013 ASSEMBLER_TEST_RUN(PackedDoubleMul, test) {
2148 typedef double (*PackedDoubleMul)(); 2014 typedef double (*PackedDoubleMul)();
2149 double res = reinterpret_cast<PackedDoubleMul>(test->entry())(); 2015 double res = reinterpret_cast<PackedDoubleMul>(test->entry())();
2150 EXPECT_FLOAT_EQ(9.0, res, 0.000001f); 2016 EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
2151 } 2017 }
2152 2018
2153
2154 ASSEMBLER_TEST_GENERATE(PackedDoubleDiv, assembler) { 2019 ASSEMBLER_TEST_GENERATE(PackedDoubleDiv, assembler) {
2155 static const struct ALIGN16 { 2020 static const struct ALIGN16 {
2156 double a; 2021 double a;
2157 double b; 2022 double b;
2158 } constant0 = {9.0, 2.0}; 2023 } constant0 = {9.0, 2.0};
2159 static const struct ALIGN16 { 2024 static const struct ALIGN16 {
2160 double a; 2025 double a;
2161 double b; 2026 double b;
2162 } constant1 = {3.0, 4.0}; 2027 } constant1 = {3.0, 4.0};
2163 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2028 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2164 __ movups(XMM10, Address(RAX, 0)); 2029 __ movups(XMM10, Address(RAX, 0));
2165 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1))); 2030 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
2166 __ movups(XMM11, Address(RAX, 0)); 2031 __ movups(XMM11, Address(RAX, 0));
2167 __ divpd(XMM10, XMM11); 2032 __ divpd(XMM10, XMM11);
2168 __ movaps(XMM0, XMM10); 2033 __ movaps(XMM0, XMM10);
2169 __ ret(); 2034 __ ret();
2170 } 2035 }
2171 2036
2172
2173 ASSEMBLER_TEST_RUN(PackedDoubleDiv, test) { 2037 ASSEMBLER_TEST_RUN(PackedDoubleDiv, test) {
2174 typedef double (*PackedDoubleDiv)(); 2038 typedef double (*PackedDoubleDiv)();
2175 double res = reinterpret_cast<PackedDoubleDiv>(test->entry())(); 2039 double res = reinterpret_cast<PackedDoubleDiv>(test->entry())();
2176 EXPECT_FLOAT_EQ(3.0, res, 0.000001f); 2040 EXPECT_FLOAT_EQ(3.0, res, 0.000001f);
2177 } 2041 }
2178 2042
2179
2180 ASSEMBLER_TEST_GENERATE(PackedDoubleSqrt, assembler) { 2043 ASSEMBLER_TEST_GENERATE(PackedDoubleSqrt, assembler) {
2181 static const struct ALIGN16 { 2044 static const struct ALIGN16 {
2182 double a; 2045 double a;
2183 double b; 2046 double b;
2184 } constant0 = {16.0, 2.0}; 2047 } constant0 = {16.0, 2.0};
2185 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2048 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2186 __ movups(XMM10, Address(RAX, 0)); 2049 __ movups(XMM10, Address(RAX, 0));
2187 __ sqrtpd(XMM10); 2050 __ sqrtpd(XMM10);
2188 __ movaps(XMM0, XMM10); 2051 __ movaps(XMM0, XMM10);
2189 __ ret(); 2052 __ ret();
2190 } 2053 }
2191 2054
2192
2193 ASSEMBLER_TEST_RUN(PackedDoubleSqrt, test) { 2055 ASSEMBLER_TEST_RUN(PackedDoubleSqrt, test) {
2194 typedef double (*PackedDoubleSqrt)(); 2056 typedef double (*PackedDoubleSqrt)();
2195 double res = reinterpret_cast<PackedDoubleSqrt>(test->entry())(); 2057 double res = reinterpret_cast<PackedDoubleSqrt>(test->entry())();
2196 EXPECT_FLOAT_EQ(4.0, res, 0.000001f); 2058 EXPECT_FLOAT_EQ(4.0, res, 0.000001f);
2197 } 2059 }
2198 2060
2199
2200 ASSEMBLER_TEST_GENERATE(PackedDoubleMin, assembler) { 2061 ASSEMBLER_TEST_GENERATE(PackedDoubleMin, assembler) {
2201 static const struct ALIGN16 { 2062 static const struct ALIGN16 {
2202 double a; 2063 double a;
2203 double b; 2064 double b;
2204 } constant0 = {9.0, 2.0}; 2065 } constant0 = {9.0, 2.0};
2205 static const struct ALIGN16 { 2066 static const struct ALIGN16 {
2206 double a; 2067 double a;
2207 double b; 2068 double b;
2208 } constant1 = {3.0, 4.0}; 2069 } constant1 = {3.0, 4.0};
2209 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2070 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2210 __ movups(XMM10, Address(RAX, 0)); 2071 __ movups(XMM10, Address(RAX, 0));
2211 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1))); 2072 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
2212 __ movups(XMM11, Address(RAX, 0)); 2073 __ movups(XMM11, Address(RAX, 0));
2213 __ minpd(XMM10, XMM11); 2074 __ minpd(XMM10, XMM11);
2214 __ movaps(XMM0, XMM10); 2075 __ movaps(XMM0, XMM10);
2215 __ ret(); 2076 __ ret();
2216 } 2077 }
2217 2078
2218
2219 ASSEMBLER_TEST_RUN(PackedDoubleMin, test) { 2079 ASSEMBLER_TEST_RUN(PackedDoubleMin, test) {
2220 typedef double (*PackedDoubleMin)(); 2080 typedef double (*PackedDoubleMin)();
2221 double res = reinterpret_cast<PackedDoubleMin>(test->entry())(); 2081 double res = reinterpret_cast<PackedDoubleMin>(test->entry())();
2222 EXPECT_FLOAT_EQ(3.0, res, 0.000001f); 2082 EXPECT_FLOAT_EQ(3.0, res, 0.000001f);
2223 } 2083 }
2224 2084
2225
2226 ASSEMBLER_TEST_GENERATE(PackedDoubleMax, assembler) { 2085 ASSEMBLER_TEST_GENERATE(PackedDoubleMax, assembler) {
2227 static const struct ALIGN16 { 2086 static const struct ALIGN16 {
2228 double a; 2087 double a;
2229 double b; 2088 double b;
2230 } constant0 = {9.0, 2.0}; 2089 } constant0 = {9.0, 2.0};
2231 static const struct ALIGN16 { 2090 static const struct ALIGN16 {
2232 double a; 2091 double a;
2233 double b; 2092 double b;
2234 } constant1 = {3.0, 4.0}; 2093 } constant1 = {3.0, 4.0};
2235 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2094 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2236 __ movups(XMM10, Address(RAX, 0)); 2095 __ movups(XMM10, Address(RAX, 0));
2237 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1))); 2096 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant1)));
2238 __ movups(XMM11, Address(RAX, 0)); 2097 __ movups(XMM11, Address(RAX, 0));
2239 __ maxpd(XMM10, XMM11); 2098 __ maxpd(XMM10, XMM11);
2240 __ movaps(XMM0, XMM10); 2099 __ movaps(XMM0, XMM10);
2241 __ ret(); 2100 __ ret();
2242 } 2101 }
2243 2102
2244
2245 ASSEMBLER_TEST_RUN(PackedDoubleMax, test) { 2103 ASSEMBLER_TEST_RUN(PackedDoubleMax, test) {
2246 typedef double (*PackedDoubleMax)(); 2104 typedef double (*PackedDoubleMax)();
2247 double res = reinterpret_cast<PackedDoubleMax>(test->entry())(); 2105 double res = reinterpret_cast<PackedDoubleMax>(test->entry())();
2248 EXPECT_FLOAT_EQ(9.0, res, 0.000001f); 2106 EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
2249 } 2107 }
2250 2108
2251
2252 ASSEMBLER_TEST_GENERATE(PackedDoubleShuffle, assembler) { 2109 ASSEMBLER_TEST_GENERATE(PackedDoubleShuffle, assembler) {
2253 static const struct ALIGN16 { 2110 static const struct ALIGN16 {
2254 double a; 2111 double a;
2255 double b; 2112 double b;
2256 } constant0 = {2.0, 9.0}; 2113 } constant0 = {2.0, 9.0};
2257 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2114 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2258 __ movups(XMM10, Address(RAX, 0)); 2115 __ movups(XMM10, Address(RAX, 0));
2259 // Splat Y across all lanes. 2116 // Splat Y across all lanes.
2260 __ shufpd(XMM10, XMM10, Immediate(0x33)); 2117 __ shufpd(XMM10, XMM10, Immediate(0x33));
2261 // Splat X across all lanes. 2118 // Splat X across all lanes.
2262 __ shufpd(XMM10, XMM10, Immediate(0x0)); 2119 __ shufpd(XMM10, XMM10, Immediate(0x0));
2263 // Set return value. 2120 // Set return value.
2264 __ movaps(XMM0, XMM10); 2121 __ movaps(XMM0, XMM10);
2265 __ ret(); 2122 __ ret();
2266 } 2123 }
2267 2124
2268
2269 ASSEMBLER_TEST_RUN(PackedDoubleShuffle, test) { 2125 ASSEMBLER_TEST_RUN(PackedDoubleShuffle, test) {
2270 typedef double (*PackedDoubleShuffle)(); 2126 typedef double (*PackedDoubleShuffle)();
2271 double res = reinterpret_cast<PackedDoubleShuffle>(test->entry())(); 2127 double res = reinterpret_cast<PackedDoubleShuffle>(test->entry())();
2272 EXPECT_FLOAT_EQ(9.0, res, 0.000001f); 2128 EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
2273 } 2129 }
2274 2130
2275
2276 ASSEMBLER_TEST_GENERATE(PackedDoubleToSingle, assembler) { 2131 ASSEMBLER_TEST_GENERATE(PackedDoubleToSingle, assembler) {
2277 static const struct ALIGN16 { 2132 static const struct ALIGN16 {
2278 double a; 2133 double a;
2279 double b; 2134 double b;
2280 } constant0 = {9.0, 2.0}; 2135 } constant0 = {9.0, 2.0};
2281 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2136 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2282 __ movups(XMM11, Address(RAX, 0)); 2137 __ movups(XMM11, Address(RAX, 0));
2283 __ cvtpd2ps(XMM10, XMM11); 2138 __ cvtpd2ps(XMM10, XMM11);
2284 __ movaps(XMM0, XMM10); 2139 __ movaps(XMM0, XMM10);
2285 __ ret(); 2140 __ ret();
2286 } 2141 }
2287 2142
2288
2289 ASSEMBLER_TEST_RUN(PackedDoubleToSingle, test) { 2143 ASSEMBLER_TEST_RUN(PackedDoubleToSingle, test) {
2290 typedef float (*PackedDoubleToSingle)(); 2144 typedef float (*PackedDoubleToSingle)();
2291 float res = reinterpret_cast<PackedDoubleToSingle>(test->entry())(); 2145 float res = reinterpret_cast<PackedDoubleToSingle>(test->entry())();
2292 EXPECT_FLOAT_EQ(9.0f, res, 0.000001f); 2146 EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
2293 } 2147 }
2294 2148
2295
2296 ASSEMBLER_TEST_GENERATE(PackedSingleToDouble, assembler) { 2149 ASSEMBLER_TEST_GENERATE(PackedSingleToDouble, assembler) {
2297 static const struct ALIGN16 { 2150 static const struct ALIGN16 {
2298 float a; 2151 float a;
2299 float b; 2152 float b;
2300 float c; 2153 float c;
2301 float d; 2154 float d;
2302 } constant0 = {9.0f, 2.0f, 3.0f, 4.0f}; 2155 } constant0 = {9.0f, 2.0f, 3.0f, 4.0f};
2303 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0))); 2156 __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
2304 __ movups(XMM11, Address(RAX, 0)); 2157 __ movups(XMM11, Address(RAX, 0));
2305 __ cvtps2pd(XMM10, XMM11); 2158 __ cvtps2pd(XMM10, XMM11);
2306 __ movaps(XMM0, XMM10); 2159 __ movaps(XMM0, XMM10);
2307 __ ret(); 2160 __ ret();
2308 } 2161 }
2309 2162
2310
2311 ASSEMBLER_TEST_RUN(PackedSingleToDouble, test) { 2163 ASSEMBLER_TEST_RUN(PackedSingleToDouble, test) {
2312 typedef double (*PackedSingleToDouble)(); 2164 typedef double (*PackedSingleToDouble)();
2313 double res = reinterpret_cast<PackedSingleToDouble>(test->entry())(); 2165 double res = reinterpret_cast<PackedSingleToDouble>(test->entry())();
2314 EXPECT_FLOAT_EQ(9.0f, res, 0.000001f); 2166 EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
2315 } 2167 }
2316 2168
2317
2318 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { 2169 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
2319 __ pushq(RBX); 2170 __ pushq(RBX);
2320 __ pushq(RCX); 2171 __ pushq(RCX);
2321 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f))); 2172 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f)));
2322 __ movd(XMM0, RBX); 2173 __ movd(XMM0, RBX);
2323 __ movd(XMM8, RBX); 2174 __ movd(XMM8, RBX);
2324 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f))); 2175 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f)));
2325 __ movd(XMM1, RCX); 2176 __ movd(XMM1, RCX);
2326 __ movd(XMM9, RCX); 2177 __ movd(XMM9, RCX);
2327 __ addss(XMM0, XMM1); // 15.7f 2178 __ addss(XMM0, XMM1); // 15.7f
2328 __ mulss(XMM0, XMM1); // 53.38f 2179 __ mulss(XMM0, XMM1); // 53.38f
2329 __ subss(XMM0, XMM1); // 49.98f 2180 __ subss(XMM0, XMM1); // 49.98f
2330 __ divss(XMM0, XMM1); // 14.7f 2181 __ divss(XMM0, XMM1); // 14.7f
2331 __ addss(XMM8, XMM9); // 15.7f 2182 __ addss(XMM8, XMM9); // 15.7f
2332 __ mulss(XMM8, XMM9); // 53.38f 2183 __ mulss(XMM8, XMM9); // 53.38f
2333 __ subss(XMM8, XMM9); // 49.98f 2184 __ subss(XMM8, XMM9); // 49.98f
2334 __ divss(XMM8, XMM9); // 14.7f 2185 __ divss(XMM8, XMM9); // 14.7f
2335 __ subss(XMM0, XMM8); // 0.0f 2186 __ subss(XMM0, XMM8); // 0.0f
2336 __ popq(RCX); 2187 __ popq(RCX);
2337 __ popq(RBX); 2188 __ popq(RBX);
2338 __ ret(); 2189 __ ret();
2339 } 2190 }
2340 2191
2341
2342 ASSEMBLER_TEST_RUN(SingleFPOperations, test) { 2192 ASSEMBLER_TEST_RUN(SingleFPOperations, test) {
2343 typedef float (*SingleFPOperationsCode)(); 2193 typedef float (*SingleFPOperationsCode)();
2344 float res = reinterpret_cast<SingleFPOperationsCode>(test->entry())(); 2194 float res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
2345 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 2195 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
2346 } 2196 }
2347 2197
2348 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) { 2198 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) {
2349 __ movq(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); 2199 __ movq(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
2350 __ movd(XMM10, RAX); 2200 __ movd(XMM10, RAX);
2351 __ shufps(XMM10, XMM10, Immediate(0x0)); 2201 __ shufps(XMM10, XMM10, Immediate(0x0));
2352 __ movq(RAX, Immediate(bit_cast<int32_t, float>(3.4f))); 2202 __ movq(RAX, Immediate(bit_cast<int32_t, float>(3.4f)));
2353 __ movd(XMM9, RAX); 2203 __ movd(XMM9, RAX);
2354 __ shufps(XMM9, XMM9, Immediate(0x0)); 2204 __ shufps(XMM9, XMM9, Immediate(0x0));
2355 __ addps(XMM10, XMM9); // 15.7f 2205 __ addps(XMM10, XMM9); // 15.7f
2356 __ mulps(XMM10, XMM9); // 53.38f 2206 __ mulps(XMM10, XMM9); // 53.38f
2357 __ subps(XMM10, XMM9); // 49.98f 2207 __ subps(XMM10, XMM9); // 49.98f
2358 __ divps(XMM10, XMM9); // 14.7f 2208 __ divps(XMM10, XMM9); // 14.7f
2359 __ movaps(XMM0, XMM10); 2209 __ movaps(XMM0, XMM10);
2360 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes. 2210 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes.
2361 __ ret(); 2211 __ ret();
2362 } 2212 }
2363 2213
2364
2365 ASSEMBLER_TEST_RUN(PackedFPOperations, test) { 2214 ASSEMBLER_TEST_RUN(PackedFPOperations, test) {
2366 typedef float (*PackedFPOperationsCode)(); 2215 typedef float (*PackedFPOperationsCode)();
2367 float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())(); 2216 float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())();
2368 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); 2217 EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
2369 } 2218 }
2370 2219
2371
2372 ASSEMBLER_TEST_GENERATE(PackedIntOperations, assembler) { 2220 ASSEMBLER_TEST_GENERATE(PackedIntOperations, assembler) {
2373 __ movl(RAX, Immediate(0x2)); 2221 __ movl(RAX, Immediate(0x2));
2374 __ movd(XMM0, RAX); 2222 __ movd(XMM0, RAX);
2375 __ shufps(XMM0, XMM0, Immediate(0x0)); 2223 __ shufps(XMM0, XMM0, Immediate(0x0));
2376 __ movl(RAX, Immediate(0x1)); 2224 __ movl(RAX, Immediate(0x1));
2377 __ movd(XMM1, RAX); 2225 __ movd(XMM1, RAX);
2378 __ shufps(XMM1, XMM1, Immediate(0x0)); 2226 __ shufps(XMM1, XMM1, Immediate(0x0));
2379 __ addpl(XMM0, XMM1); // 0x3 2227 __ addpl(XMM0, XMM1); // 0x3
2380 __ addpl(XMM0, XMM0); // 0x6 2228 __ addpl(XMM0, XMM0); // 0x6
2381 __ subpl(XMM0, XMM1); // 0x5 2229 __ subpl(XMM0, XMM1); // 0x5
2382 __ pushq(RAX); 2230 __ pushq(RAX);
2383 __ movss(Address(RSP, 0), XMM0); 2231 __ movss(Address(RSP, 0), XMM0);
2384 __ popq(RAX); 2232 __ popq(RAX);
2385 __ ret(); 2233 __ ret();
2386 } 2234 }
2387 2235
2388
2389 ASSEMBLER_TEST_RUN(PackedIntOperations, test) { 2236 ASSEMBLER_TEST_RUN(PackedIntOperations, test) {
2390 typedef uint32_t (*PackedIntOperationsCode)(); 2237 typedef uint32_t (*PackedIntOperationsCode)();
2391 uint32_t res = reinterpret_cast<PackedIntOperationsCode>(test->entry())(); 2238 uint32_t res = reinterpret_cast<PackedIntOperationsCode>(test->entry())();
2392 EXPECT_EQ(static_cast<uword>(0x5), res); 2239 EXPECT_EQ(static_cast<uword>(0x5), res);
2393 } 2240 }
2394 2241
2395
2396 ASSEMBLER_TEST_GENERATE(PackedIntOperations2, assembler) { 2242 ASSEMBLER_TEST_GENERATE(PackedIntOperations2, assembler) {
2397 // Note: on Windows 64 XMM6-XMM15 are callee save. 2243 // Note: on Windows 64 XMM6-XMM15 are callee save.
2398 const intptr_t cpu_register_set = 0; 2244 const intptr_t cpu_register_set = 0;
2399 const intptr_t fpu_register_set = 2245 const intptr_t fpu_register_set =
2400 ((1 << XMM10) | (1 << XMM11)) & CallingConventions::kVolatileXmmRegisters; 2246 ((1 << XMM10) | (1 << XMM11)) & CallingConventions::kVolatileXmmRegisters;
2401 __ PushRegisters(cpu_register_set, fpu_register_set); 2247 __ PushRegisters(cpu_register_set, fpu_register_set);
2402 __ movl(RAX, Immediate(0x2)); 2248 __ movl(RAX, Immediate(0x2));
2403 __ movd(XMM10, RAX); 2249 __ movd(XMM10, RAX);
2404 __ shufps(XMM10, XMM10, Immediate(0x0)); 2250 __ shufps(XMM10, XMM10, Immediate(0x0));
2405 __ movl(RAX, Immediate(0x1)); 2251 __ movl(RAX, Immediate(0x1));
2406 __ movd(XMM11, RAX); 2252 __ movd(XMM11, RAX);
2407 __ shufps(XMM11, XMM11, Immediate(0x0)); 2253 __ shufps(XMM11, XMM11, Immediate(0x0));
2408 __ addpl(XMM10, XMM11); // 0x3 2254 __ addpl(XMM10, XMM11); // 0x3
2409 __ addpl(XMM10, XMM10); // 0x6 2255 __ addpl(XMM10, XMM10); // 0x6
2410 __ subpl(XMM10, XMM11); // 0x5 2256 __ subpl(XMM10, XMM11); // 0x5
2411 __ pushq(RAX); 2257 __ pushq(RAX);
2412 __ movss(Address(RSP, 0), XMM10); 2258 __ movss(Address(RSP, 0), XMM10);
2413 __ popq(RAX); 2259 __ popq(RAX);
2414 __ PopRegisters(cpu_register_set, fpu_register_set); 2260 __ PopRegisters(cpu_register_set, fpu_register_set);
2415 __ ret(); 2261 __ ret();
2416 } 2262 }
2417 2263
2418
2419 ASSEMBLER_TEST_RUN(PackedIntOperations2, test) { 2264 ASSEMBLER_TEST_RUN(PackedIntOperations2, test) {
2420 typedef uint32_t (*PackedIntOperationsCode)(); 2265 typedef uint32_t (*PackedIntOperationsCode)();
2421 uint32_t res = reinterpret_cast<PackedIntOperationsCode>(test->entry())(); 2266 uint32_t res = reinterpret_cast<PackedIntOperationsCode>(test->entry())();
2422 EXPECT_EQ(static_cast<uword>(0x5), res); 2267 EXPECT_EQ(static_cast<uword>(0x5), res);
2423 } 2268 }
2424 2269
2425
2426 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) { 2270 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) {
2427 __ movq(RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2271 __ movq(RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2428 __ movd(XMM0, RAX); 2272 __ movd(XMM0, RAX);
2429 __ shufps(XMM0, XMM0, Immediate(0x0)); 2273 __ shufps(XMM0, XMM0, Immediate(0x0));
2430 2274
2431 __ movaps(XMM11, XMM0); // Copy XMM0 2275 __ movaps(XMM11, XMM0); // Copy XMM0
2432 __ reciprocalps(XMM11); // 0.25 2276 __ reciprocalps(XMM11); // 0.25
2433 __ sqrtps(XMM11); // 0.5 2277 __ sqrtps(XMM11); // 0.5
2434 __ rsqrtps(XMM0); // ~0.5 2278 __ rsqrtps(XMM0); // ~0.5
2435 __ subps(XMM0, XMM11); // ~0.0 2279 __ subps(XMM0, XMM11); // ~0.0
2436 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes. 2280 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes.
2437 __ ret(); 2281 __ ret();
2438 } 2282 }
2439 2283
2440
2441 ASSEMBLER_TEST_RUN(PackedFPOperations2, test) { 2284 ASSEMBLER_TEST_RUN(PackedFPOperations2, test) {
2442 typedef float (*PackedFPOperations2Code)(); 2285 typedef float (*PackedFPOperations2Code)();
2443 float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())(); 2286 float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())();
2444 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 2287 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
2445 } 2288 }
2446 2289
2447
2448 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) { 2290 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) {
2449 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2291 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2450 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2292 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2451 __ cmppseq(XMM0, XMM1); 2293 __ cmppseq(XMM0, XMM1);
2452 __ pushq(RAX); 2294 __ pushq(RAX);
2453 __ movss(Address(RSP, 0), XMM0); 2295 __ movss(Address(RSP, 0), XMM0);
2454 __ popq(RAX); 2296 __ popq(RAX);
2455 __ ret(); 2297 __ ret();
2456 } 2298 }
2457 2299
2458
2459 ASSEMBLER_TEST_RUN(PackedCompareEQ, test) { 2300 ASSEMBLER_TEST_RUN(PackedCompareEQ, test) {
2460 typedef uint32_t (*PackedCompareEQCode)(); 2301 typedef uint32_t (*PackedCompareEQCode)();
2461 uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())(); 2302 uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())();
2462 EXPECT_EQ(static_cast<uword>(0x0), res); 2303 EXPECT_EQ(static_cast<uword>(0x0), res);
2463 } 2304 }
2464 2305
2465
2466 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) { 2306 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) {
2467 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2307 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2468 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2308 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2469 __ cmppsneq(XMM0, XMM1); 2309 __ cmppsneq(XMM0, XMM1);
2470 __ pushq(RAX); 2310 __ pushq(RAX);
2471 __ movss(Address(RSP, 0), XMM0); 2311 __ movss(Address(RSP, 0), XMM0);
2472 __ popq(RAX); 2312 __ popq(RAX);
2473 __ ret(); 2313 __ ret();
2474 } 2314 }
2475 2315
2476
2477 ASSEMBLER_TEST_RUN(PackedCompareNEQ, test) { 2316 ASSEMBLER_TEST_RUN(PackedCompareNEQ, test) {
2478 typedef uint32_t (*PackedCompareNEQCode)(); 2317 typedef uint32_t (*PackedCompareNEQCode)();
2479 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())(); 2318 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())();
2480 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 2319 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
2481 } 2320 }
2482 2321
2483
2484 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) { 2322 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) {
2485 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2323 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2486 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2324 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2487 __ cmppslt(XMM0, XMM1); 2325 __ cmppslt(XMM0, XMM1);
2488 __ pushq(RAX); 2326 __ pushq(RAX);
2489 __ movss(Address(RSP, 0), XMM0); 2327 __ movss(Address(RSP, 0), XMM0);
2490 __ popq(RAX); 2328 __ popq(RAX);
2491 __ ret(); 2329 __ ret();
2492 } 2330 }
2493 2331
2494
2495 ASSEMBLER_TEST_RUN(PackedCompareLT, test) { 2332 ASSEMBLER_TEST_RUN(PackedCompareLT, test) {
2496 typedef uint32_t (*PackedCompareLTCode)(); 2333 typedef uint32_t (*PackedCompareLTCode)();
2497 uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())(); 2334 uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())();
2498 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 2335 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
2499 } 2336 }
2500 2337
2501
2502 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) { 2338 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) {
2503 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2339 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2504 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2340 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2505 __ cmppsle(XMM0, XMM1); 2341 __ cmppsle(XMM0, XMM1);
2506 __ pushq(RAX); 2342 __ pushq(RAX);
2507 __ movss(Address(RSP, 0), XMM0); 2343 __ movss(Address(RSP, 0), XMM0);
2508 __ popq(RAX); 2344 __ popq(RAX);
2509 __ ret(); 2345 __ ret();
2510 } 2346 }
2511 2347
2512
2513 ASSEMBLER_TEST_RUN(PackedCompareLE, test) { 2348 ASSEMBLER_TEST_RUN(PackedCompareLE, test) {
2514 typedef uint32_t (*PackedCompareLECode)(); 2349 typedef uint32_t (*PackedCompareLECode)();
2515 uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())(); 2350 uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())();
2516 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 2351 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
2517 } 2352 }
2518 2353
2519
2520 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) { 2354 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) {
2521 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2355 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2522 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2356 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2523 __ cmppsnlt(XMM0, XMM1); 2357 __ cmppsnlt(XMM0, XMM1);
2524 __ pushq(RAX); 2358 __ pushq(RAX);
2525 __ movss(Address(RSP, 0), XMM0); 2359 __ movss(Address(RSP, 0), XMM0);
2526 __ popq(RAX); 2360 __ popq(RAX);
2527 __ ret(); 2361 __ ret();
2528 } 2362 }
2529 2363
2530
2531 ASSEMBLER_TEST_RUN(PackedCompareNLT, test) { 2364 ASSEMBLER_TEST_RUN(PackedCompareNLT, test) {
2532 typedef uint32_t (*PackedCompareNLTCode)(); 2365 typedef uint32_t (*PackedCompareNLTCode)();
2533 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())(); 2366 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())();
2534 EXPECT_EQ(static_cast<uword>(0x0), res); 2367 EXPECT_EQ(static_cast<uword>(0x0), res);
2535 } 2368 }
2536 2369
2537
2538 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) { 2370 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) {
2539 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2371 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2540 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2372 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2541 __ cmppsnle(XMM0, XMM1); 2373 __ cmppsnle(XMM0, XMM1);
2542 __ pushq(RAX); 2374 __ pushq(RAX);
2543 __ movss(Address(RSP, 0), XMM0); 2375 __ movss(Address(RSP, 0), XMM0);
2544 __ popq(RAX); 2376 __ popq(RAX);
2545 __ ret(); 2377 __ ret();
2546 } 2378 }
2547 2379
2548
2549 ASSEMBLER_TEST_RUN(PackedCompareNLE, test) { 2380 ASSEMBLER_TEST_RUN(PackedCompareNLE, test) {
2550 typedef uint32_t (*PackedCompareNLECode)(); 2381 typedef uint32_t (*PackedCompareNLECode)();
2551 uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())(); 2382 uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())();
2552 EXPECT_EQ(static_cast<uword>(0x0), res); 2383 EXPECT_EQ(static_cast<uword>(0x0), res);
2553 } 2384 }
2554 2385
2555
2556 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) { 2386 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) {
2557 EnterTestFrame(assembler); 2387 EnterTestFrame(assembler);
2558 __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); 2388 __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
2559 __ movd(XMM0, RAX); 2389 __ movd(XMM0, RAX);
2560 __ shufps(XMM0, XMM0, Immediate(0x0)); 2390 __ shufps(XMM0, XMM0, Immediate(0x0));
2561 __ negateps(XMM0); 2391 __ negateps(XMM0);
2562 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. 2392 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes.
2563 LeaveTestFrame(assembler); 2393 LeaveTestFrame(assembler);
2564 __ ret(); 2394 __ ret();
2565 } 2395 }
2566 2396
2567
2568 ASSEMBLER_TEST_RUN(PackedNegate, test) { 2397 ASSEMBLER_TEST_RUN(PackedNegate, test) {
2569 float res = test->InvokeWithCodeAndThread<float>(); 2398 float res = test->InvokeWithCodeAndThread<float>();
2570 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f); 2399 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f);
2571 } 2400 }
2572 2401
2573
2574 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) { 2402 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) {
2575 EnterTestFrame(assembler); 2403 EnterTestFrame(assembler);
2576 __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f))); 2404 __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f)));
2577 __ movd(XMM0, RAX); 2405 __ movd(XMM0, RAX);
2578 __ shufps(XMM0, XMM0, Immediate(0x0)); 2406 __ shufps(XMM0, XMM0, Immediate(0x0));
2579 __ absps(XMM0); 2407 __ absps(XMM0);
2580 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. 2408 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes.
2581 LeaveTestFrame(assembler); 2409 LeaveTestFrame(assembler);
2582 __ ret(); 2410 __ ret();
2583 } 2411 }
2584 2412
2585
2586 ASSEMBLER_TEST_RUN(PackedAbsolute, test) { 2413 ASSEMBLER_TEST_RUN(PackedAbsolute, test) {
2587 float res = test->InvokeWithCodeAndThread<float>(); 2414 float res = test->InvokeWithCodeAndThread<float>();
2588 EXPECT_FLOAT_EQ(15.3f, res, 0.001f); 2415 EXPECT_FLOAT_EQ(15.3f, res, 0.001f);
2589 } 2416 }
2590 2417
2591
2592 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) { 2418 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) {
2593 EnterTestFrame(assembler); 2419 EnterTestFrame(assembler);
2594 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f))); 2420 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
2595 __ zerowps(XMM0); 2421 __ zerowps(XMM0);
2596 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0. 2422 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0.
2597 LeaveTestFrame(assembler); 2423 LeaveTestFrame(assembler);
2598 __ ret(); 2424 __ ret();
2599 } 2425 }
2600 2426
2601
2602 ASSEMBLER_TEST_RUN(PackedSetWZero, test) { 2427 ASSEMBLER_TEST_RUN(PackedSetWZero, test) {
2603 float res = test->InvokeWithCodeAndThread<float>(); 2428 float res = test->InvokeWithCodeAndThread<float>();
2604 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 2429 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
2605 } 2430 }
2606 2431
2607
2608 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) { 2432 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) {
2609 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2433 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2610 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2434 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2611 __ minps(XMM0, XMM1); 2435 __ minps(XMM0, XMM1);
2612 __ ret(); 2436 __ ret();
2613 } 2437 }
2614 2438
2615
2616 ASSEMBLER_TEST_RUN(PackedMin, test) { 2439 ASSEMBLER_TEST_RUN(PackedMin, test) {
2617 typedef float (*PackedMinCode)(); 2440 typedef float (*PackedMinCode)();
2618 float res = reinterpret_cast<PackedMinCode>(test->entry())(); 2441 float res = reinterpret_cast<PackedMinCode>(test->entry())();
2619 EXPECT_FLOAT_EQ(2.0f, res, 0.001f); 2442 EXPECT_FLOAT_EQ(2.0f, res, 0.001f);
2620 } 2443 }
2621 2444
2622
2623 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) { 2445 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) {
2624 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 2446 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
2625 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 2447 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
2626 __ maxps(XMM0, XMM1); 2448 __ maxps(XMM0, XMM1);
2627 __ ret(); 2449 __ ret();
2628 } 2450 }
2629 2451
2630
2631 ASSEMBLER_TEST_RUN(PackedMax, test) { 2452 ASSEMBLER_TEST_RUN(PackedMax, test) {
2632 typedef float (*PackedMaxCode)(); 2453 typedef float (*PackedMaxCode)();
2633 float res = reinterpret_cast<PackedMaxCode>(test->entry())(); 2454 float res = reinterpret_cast<PackedMaxCode>(test->entry())();
2634 EXPECT_FLOAT_EQ(4.0f, res, 0.001f); 2455 EXPECT_FLOAT_EQ(4.0f, res, 0.001f);
2635 } 2456 }
2636 2457
2637
2638 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) { 2458 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) {
2639 static const struct ALIGN16 { 2459 static const struct ALIGN16 {
2640 uint32_t a; 2460 uint32_t a;
2641 uint32_t b; 2461 uint32_t b;
2642 uint32_t c; 2462 uint32_t c;
2643 uint32_t d; 2463 uint32_t d;
2644 } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0}; 2464 } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0};
2645 static const struct ALIGN16 { 2465 static const struct ALIGN16 {
2646 uint32_t a; 2466 uint32_t a;
2647 uint32_t b; 2467 uint32_t b;
2648 uint32_t c; 2468 uint32_t c;
2649 uint32_t d; 2469 uint32_t d;
2650 } constant2 = {0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F}; 2470 } constant2 = {0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F};
2651 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1))); 2471 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
2652 __ movups(XMM0, Address(RAX, 0)); 2472 __ movups(XMM0, Address(RAX, 0));
2653 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); 2473 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2)));
2654 __ movups(XMM1, Address(RAX, 0)); 2474 __ movups(XMM1, Address(RAX, 0));
2655 __ orps(XMM0, XMM1); 2475 __ orps(XMM0, XMM1);
2656 __ pushq(RAX); 2476 __ pushq(RAX);
2657 __ movss(Address(RSP, 0), XMM0); 2477 __ movss(Address(RSP, 0), XMM0);
2658 __ popq(RAX); 2478 __ popq(RAX);
2659 __ ret(); 2479 __ ret();
2660 } 2480 }
2661 2481
2662
2663 ASSEMBLER_TEST_RUN(PackedLogicalOr, test) { 2482 ASSEMBLER_TEST_RUN(PackedLogicalOr, test) {
2664 typedef uint32_t (*PackedLogicalOrCode)(); 2483 typedef uint32_t (*PackedLogicalOrCode)();
2665 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())(); 2484 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())();
2666 EXPECT_EQ(0xFFFFFFFF, res); 2485 EXPECT_EQ(0xFFFFFFFF, res);
2667 } 2486 }
2668 2487
2669
2670 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) { 2488 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) {
2671 static const struct ALIGN16 { 2489 static const struct ALIGN16 {
2672 uint32_t a; 2490 uint32_t a;
2673 uint32_t b; 2491 uint32_t b;
2674 uint32_t c; 2492 uint32_t c;
2675 uint32_t d; 2493 uint32_t d;
2676 } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0}; 2494 } constant1 = {0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0};
2677 static const struct ALIGN16 { 2495 static const struct ALIGN16 {
2678 uint32_t a; 2496 uint32_t a;
2679 uint32_t b; 2497 uint32_t b;
2680 uint32_t c; 2498 uint32_t c;
2681 uint32_t d; 2499 uint32_t d;
2682 } constant2 = {0x0F0FFF0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F}; 2500 } constant2 = {0x0F0FFF0F, 0x0F0F0F0F, 0x0F0F0F0F, 0x0F0F0F0F};
2683 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1))); 2501 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
2684 __ movups(XMM0, Address(RAX, 0)); 2502 __ movups(XMM0, Address(RAX, 0));
2685 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); 2503 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2)));
2686 __ andps(XMM0, Address(RAX, 0)); 2504 __ andps(XMM0, Address(RAX, 0));
2687 __ pushq(RAX); 2505 __ pushq(RAX);
2688 __ movss(Address(RSP, 0), XMM0); 2506 __ movss(Address(RSP, 0), XMM0);
2689 __ popq(RAX); 2507 __ popq(RAX);
2690 __ ret(); 2508 __ ret();
2691 } 2509 }
2692 2510
2693
2694 ASSEMBLER_TEST_RUN(PackedLogicalAnd, test) { 2511 ASSEMBLER_TEST_RUN(PackedLogicalAnd, test) {
2695 typedef uint32_t (*PackedLogicalAndCode)(); 2512 typedef uint32_t (*PackedLogicalAndCode)();
2696 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())(); 2513 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())();
2697 EXPECT_EQ(static_cast<uword>(0x0000F000), res); 2514 EXPECT_EQ(static_cast<uword>(0x0000F000), res);
2698 } 2515 }
2699 2516
2700
2701 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) { 2517 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) {
2702 static const struct ALIGN16 { 2518 static const struct ALIGN16 {
2703 uint32_t a; 2519 uint32_t a;
2704 uint32_t b; 2520 uint32_t b;
2705 uint32_t c; 2521 uint32_t c;
2706 uint32_t d; 2522 uint32_t d;
2707 } constant1 = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}; 2523 } constant1 = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
2708 EnterTestFrame(assembler); 2524 EnterTestFrame(assembler);
2709 __ LoadImmediate(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1))); 2525 __ LoadImmediate(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
2710 __ movups(XMM9, Address(RAX, 0)); 2526 __ movups(XMM9, Address(RAX, 0));
2711 __ notps(XMM9); 2527 __ notps(XMM9);
2712 __ movaps(XMM0, XMM9); 2528 __ movaps(XMM0, XMM9);
2713 __ pushq(RAX); 2529 __ pushq(RAX);
2714 __ movss(Address(RSP, 0), XMM0); 2530 __ movss(Address(RSP, 0), XMM0);
2715 __ popq(RAX); 2531 __ popq(RAX);
2716 LeaveTestFrame(assembler); 2532 LeaveTestFrame(assembler);
2717 __ ret(); 2533 __ ret();
2718 } 2534 }
2719 2535
2720
2721 ASSEMBLER_TEST_RUN(PackedLogicalNot, test) { 2536 ASSEMBLER_TEST_RUN(PackedLogicalNot, test) {
2722 uint32_t res = test->InvokeWithCodeAndThread<uint32_t>(); 2537 uint32_t res = test->InvokeWithCodeAndThread<uint32_t>();
2723 EXPECT_EQ(static_cast<uword>(0x0), res); 2538 EXPECT_EQ(static_cast<uword>(0x0), res);
2724 } 2539 }
2725 2540
2726
2727 ASSEMBLER_TEST_GENERATE(PackedMoveHighLow, assembler) { 2541 ASSEMBLER_TEST_GENERATE(PackedMoveHighLow, assembler) {
2728 static const struct ALIGN16 { 2542 static const struct ALIGN16 {
2729 float a; 2543 float a;
2730 float b; 2544 float b;
2731 float c; 2545 float c;
2732 float d; 2546 float d;
2733 } constant0 = {1.0, 2.0, 3.0, 4.0}; 2547 } constant0 = {1.0, 2.0, 3.0, 4.0};
2734 static const struct ALIGN16 { 2548 static const struct ALIGN16 {
2735 float a; 2549 float a;
2736 float b; 2550 float b;
(...skipping 11 matching lines...) Expand all
2748 __ xorps(XMM1, XMM1); 2562 __ xorps(XMM1, XMM1);
2749 // XMM1 = 7.0f, 8.0f, 3.0f, 4.0f. 2563 // XMM1 = 7.0f, 8.0f, 3.0f, 4.0f.
2750 __ movaps(XMM1, XMM9); 2564 __ movaps(XMM1, XMM9);
2751 __ shufps(XMM9, XMM9, Immediate(0x00)); // 7.0f. 2565 __ shufps(XMM9, XMM9, Immediate(0x00)); // 7.0f.
2752 __ shufps(XMM1, XMM1, Immediate(0x55)); // 8.0f. 2566 __ shufps(XMM1, XMM1, Immediate(0x55)); // 8.0f.
2753 __ addss(XMM9, XMM1); // 15.0f. 2567 __ addss(XMM9, XMM1); // 15.0f.
2754 __ movaps(XMM0, XMM9); 2568 __ movaps(XMM0, XMM9);
2755 __ ret(); 2569 __ ret();
2756 } 2570 }
2757 2571
2758
2759 ASSEMBLER_TEST_RUN(PackedMoveHighLow, test) { 2572 ASSEMBLER_TEST_RUN(PackedMoveHighLow, test) {
2760 typedef float (*PackedMoveHighLow)(); 2573 typedef float (*PackedMoveHighLow)();
2761 float res = reinterpret_cast<PackedMoveHighLow>(test->entry())(); 2574 float res = reinterpret_cast<PackedMoveHighLow>(test->entry())();
2762 EXPECT_FLOAT_EQ(15.0f, res, 0.001f); 2575 EXPECT_FLOAT_EQ(15.0f, res, 0.001f);
2763 } 2576 }
2764 2577
2765
2766 ASSEMBLER_TEST_GENERATE(PackedMoveLowHigh, assembler) { 2578 ASSEMBLER_TEST_GENERATE(PackedMoveLowHigh, assembler) {
2767 static const struct ALIGN16 { 2579 static const struct ALIGN16 {
2768 float a; 2580 float a;
2769 float b; 2581 float b;
2770 float c; 2582 float c;
2771 float d; 2583 float d;
2772 } constant0 = {1.0, 2.0, 3.0, 4.0}; 2584 } constant0 = {1.0, 2.0, 3.0, 4.0};
2773 static const struct ALIGN16 { 2585 static const struct ALIGN16 {
2774 float a; 2586 float a;
2775 float b; 2587 float b;
(...skipping 11 matching lines...) Expand all
2787 __ xorps(XMM1, XMM1); 2599 __ xorps(XMM1, XMM1);
2788 // XMM1 = 1.0f, 2.0f, 5.0f, 6.0f 2600 // XMM1 = 1.0f, 2.0f, 5.0f, 6.0f
2789 __ movaps(XMM1, XMM9); 2601 __ movaps(XMM1, XMM9);
2790 __ shufps(XMM9, XMM9, Immediate(0xAA)); // 5.0f. 2602 __ shufps(XMM9, XMM9, Immediate(0xAA)); // 5.0f.
2791 __ shufps(XMM1, XMM1, Immediate(0xFF)); // 6.0f. 2603 __ shufps(XMM1, XMM1, Immediate(0xFF)); // 6.0f.
2792 __ addss(XMM9, XMM1); // 11.0f. 2604 __ addss(XMM9, XMM1); // 11.0f.
2793 __ movaps(XMM0, XMM9); 2605 __ movaps(XMM0, XMM9);
2794 __ ret(); 2606 __ ret();
2795 } 2607 }
2796 2608
2797
2798 ASSEMBLER_TEST_RUN(PackedMoveLowHigh, test) { 2609 ASSEMBLER_TEST_RUN(PackedMoveLowHigh, test) {
2799 typedef float (*PackedMoveLowHigh)(); 2610 typedef float (*PackedMoveLowHigh)();
2800 float res = reinterpret_cast<PackedMoveLowHigh>(test->entry())(); 2611 float res = reinterpret_cast<PackedMoveLowHigh>(test->entry())();
2801 EXPECT_FLOAT_EQ(11.0f, res, 0.001f); 2612 EXPECT_FLOAT_EQ(11.0f, res, 0.001f);
2802 } 2613 }
2803 2614
2804
2805 ASSEMBLER_TEST_GENERATE(PackedUnpackLow, assembler) { 2615 ASSEMBLER_TEST_GENERATE(PackedUnpackLow, assembler) {
2806 static const struct ALIGN16 { 2616 static const struct ALIGN16 {
2807 float a; 2617 float a;
2808 float b; 2618 float b;
2809 float c; 2619 float c;
2810 float d; 2620 float d;
2811 } constant0 = {1.0, 2.0, 3.0, 4.0}; 2621 } constant0 = {1.0, 2.0, 3.0, 4.0};
2812 static const struct ALIGN16 { 2622 static const struct ALIGN16 {
2813 float a; 2623 float a;
2814 float b; 2624 float b;
(...skipping 10 matching lines...) Expand all
2825 __ unpcklps(XMM9, XMM1); 2635 __ unpcklps(XMM9, XMM1);
2826 // XMM1 = 1.0f, 5.0f, 2.0f, 6.0f. 2636 // XMM1 = 1.0f, 5.0f, 2.0f, 6.0f.
2827 __ movaps(XMM1, XMM9); 2637 __ movaps(XMM1, XMM9);
2828 __ shufps(XMM9, XMM9, Immediate(0x55)); 2638 __ shufps(XMM9, XMM9, Immediate(0x55));
2829 __ shufps(XMM1, XMM1, Immediate(0xFF)); 2639 __ shufps(XMM1, XMM1, Immediate(0xFF));
2830 __ addss(XMM9, XMM1); // 11.0f. 2640 __ addss(XMM9, XMM1); // 11.0f.
2831 __ movaps(XMM0, XMM9); 2641 __ movaps(XMM0, XMM9);
2832 __ ret(); 2642 __ ret();
2833 } 2643 }
2834 2644
2835
2836 ASSEMBLER_TEST_RUN(PackedUnpackLow, test) { 2645 ASSEMBLER_TEST_RUN(PackedUnpackLow, test) {
2837 typedef float (*PackedUnpackLow)(); 2646 typedef float (*PackedUnpackLow)();
2838 float res = reinterpret_cast<PackedUnpackLow>(test->entry())(); 2647 float res = reinterpret_cast<PackedUnpackLow>(test->entry())();
2839 EXPECT_FLOAT_EQ(11.0f, res, 0.001f); 2648 EXPECT_FLOAT_EQ(11.0f, res, 0.001f);
2840 } 2649 }
2841 2650
2842
2843 ASSEMBLER_TEST_GENERATE(PackedUnpackHigh, assembler) { 2651 ASSEMBLER_TEST_GENERATE(PackedUnpackHigh, assembler) {
2844 static const struct ALIGN16 { 2652 static const struct ALIGN16 {
2845 float a; 2653 float a;
2846 float b; 2654 float b;
2847 float c; 2655 float c;
2848 float d; 2656 float d;
2849 } constant0 = {1.0, 2.0, 3.0, 4.0}; 2657 } constant0 = {1.0, 2.0, 3.0, 4.0};
2850 static const struct ALIGN16 { 2658 static const struct ALIGN16 {
2851 float a; 2659 float a;
2852 float b; 2660 float b;
(...skipping 10 matching lines...) Expand all
2863 __ unpckhps(XMM9, XMM1); 2671 __ unpckhps(XMM9, XMM1);
2864 // XMM1 = 3.0f, 7.0f, 4.0f, 8.0f. 2672 // XMM1 = 3.0f, 7.0f, 4.0f, 8.0f.
2865 __ movaps(XMM1, XMM9); 2673 __ movaps(XMM1, XMM9);
2866 __ shufps(XMM9, XMM9, Immediate(0x00)); 2674 __ shufps(XMM9, XMM9, Immediate(0x00));
2867 __ shufps(XMM1, XMM1, Immediate(0xAA)); 2675 __ shufps(XMM1, XMM1, Immediate(0xAA));
2868 __ addss(XMM9, XMM1); // 7.0f. 2676 __ addss(XMM9, XMM1); // 7.0f.
2869 __ movaps(XMM0, XMM9); 2677 __ movaps(XMM0, XMM9);
2870 __ ret(); 2678 __ ret();
2871 } 2679 }
2872 2680
2873
2874 ASSEMBLER_TEST_RUN(PackedUnpackHigh, test) { 2681 ASSEMBLER_TEST_RUN(PackedUnpackHigh, test) {
2875 typedef float (*PackedUnpackHigh)(); 2682 typedef float (*PackedUnpackHigh)();
2876 float res = reinterpret_cast<PackedUnpackHigh>(test->entry())(); 2683 float res = reinterpret_cast<PackedUnpackHigh>(test->entry())();
2877 EXPECT_FLOAT_EQ(7.0f, res, 0.001f); 2684 EXPECT_FLOAT_EQ(7.0f, res, 0.001f);
2878 } 2685 }
2879 2686
2880
2881 ASSEMBLER_TEST_GENERATE(PackedUnpackLowPair, assembler) { 2687 ASSEMBLER_TEST_GENERATE(PackedUnpackLowPair, assembler) {
2882 static const struct ALIGN16 { 2688 static const struct ALIGN16 {
2883 float a; 2689 float a;
2884 float b; 2690 float b;
2885 float c; 2691 float c;
2886 float d; 2692 float d;
2887 } constant0 = {1.0, 2.0, 3.0, 4.0}; 2693 } constant0 = {1.0, 2.0, 3.0, 4.0};
2888 static const struct ALIGN16 { 2694 static const struct ALIGN16 {
2889 float a; 2695 float a;
2890 float b; 2696 float b;
(...skipping 10 matching lines...) Expand all
2901 __ unpcklpd(XMM9, XMM1); 2707 __ unpcklpd(XMM9, XMM1);
2902 // XMM1 = 1.0f, 2.0f, 5.0f, 6.0f. 2708 // XMM1 = 1.0f, 2.0f, 5.0f, 6.0f.
2903 __ movaps(XMM1, XMM9); 2709 __ movaps(XMM1, XMM9);
2904 __ shufps(XMM9, XMM9, Immediate(0x00)); 2710 __ shufps(XMM9, XMM9, Immediate(0x00));
2905 __ shufps(XMM1, XMM1, Immediate(0xAA)); 2711 __ shufps(XMM1, XMM1, Immediate(0xAA));
2906 __ addss(XMM9, XMM1); // 6.0f. 2712 __ addss(XMM9, XMM1); // 6.0f.
2907 __ movaps(XMM0, XMM9); 2713 __ movaps(XMM0, XMM9);
2908 __ ret(); 2714 __ ret();
2909 } 2715 }
2910 2716
2911
2912 ASSEMBLER_TEST_RUN(PackedUnpackLowPair, test) { 2717 ASSEMBLER_TEST_RUN(PackedUnpackLowPair, test) {
2913 typedef float (*PackedUnpackLowPair)(); 2718 typedef float (*PackedUnpackLowPair)();
2914 float res = reinterpret_cast<PackedUnpackLowPair>(test->entry())(); 2719 float res = reinterpret_cast<PackedUnpackLowPair>(test->entry())();
2915 EXPECT_FLOAT_EQ(6.0f, res, 0.001f); 2720 EXPECT_FLOAT_EQ(6.0f, res, 0.001f);
2916 } 2721 }
2917 2722
2918
2919 ASSEMBLER_TEST_GENERATE(PackedUnpackHighPair, assembler) { 2723 ASSEMBLER_TEST_GENERATE(PackedUnpackHighPair, assembler) {
2920 static const struct ALIGN16 { 2724 static const struct ALIGN16 {
2921 float a; 2725 float a;
2922 float b; 2726 float b;
2923 float c; 2727 float c;
2924 float d; 2728 float d;
2925 } constant0 = {1.0, 2.0, 3.0, 4.0}; 2729 } constant0 = {1.0, 2.0, 3.0, 4.0};
2926 static const struct ALIGN16 { 2730 static const struct ALIGN16 {
2927 float a; 2731 float a;
2928 float b; 2732 float b;
(...skipping 10 matching lines...) Expand all
2939 __ unpckhpd(XMM9, XMM1); 2743 __ unpckhpd(XMM9, XMM1);
2940 // XMM1 = 3.0f, 4.0f, 7.0f, 8.0f. 2744 // XMM1 = 3.0f, 4.0f, 7.0f, 8.0f.
2941 __ movaps(XMM1, XMM9); 2745 __ movaps(XMM1, XMM9);
2942 __ shufps(XMM9, XMM9, Immediate(0x55)); 2746 __ shufps(XMM9, XMM9, Immediate(0x55));
2943 __ shufps(XMM1, XMM1, Immediate(0xFF)); 2747 __ shufps(XMM1, XMM1, Immediate(0xFF));
2944 __ addss(XMM9, XMM1); // 12.0f. 2748 __ addss(XMM9, XMM1); // 12.0f.
2945 __ movaps(XMM0, XMM9); 2749 __ movaps(XMM0, XMM9);
2946 __ ret(); 2750 __ ret();
2947 } 2751 }
2948 2752
2949
2950 ASSEMBLER_TEST_RUN(PackedUnpackHighPair, test) { 2753 ASSEMBLER_TEST_RUN(PackedUnpackHighPair, test) {
2951 typedef float (*PackedUnpackHighPair)(); 2754 typedef float (*PackedUnpackHighPair)();
2952 float res = reinterpret_cast<PackedUnpackHighPair>(test->entry())(); 2755 float res = reinterpret_cast<PackedUnpackHighPair>(test->entry())();
2953 EXPECT_FLOAT_EQ(12.0f, res, 0.001f); 2756 EXPECT_FLOAT_EQ(12.0f, res, 0.001f);
2954 } 2757 }
2955 2758
2956
2957 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) { 2759 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) {
2958 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67))); 2760 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67)));
2959 __ pushq(R15); // Callee saved. 2761 __ pushq(R15); // Callee saved.
2960 __ pushq(RAX); 2762 __ pushq(RAX);
2961 __ movsd(XMM0, Address(RSP, 0)); 2763 __ movsd(XMM0, Address(RSP, 0));
2962 __ movsd(XMM1, XMM0); 2764 __ movsd(XMM1, XMM0);
2963 __ movsd(XMM2, XMM1); 2765 __ movsd(XMM2, XMM1);
2964 __ movsd(XMM3, XMM2); 2766 __ movsd(XMM3, XMM2);
2965 __ movsd(XMM4, XMM3); 2767 __ movsd(XMM4, XMM3);
2966 __ movsd(XMM5, XMM4); 2768 __ movsd(XMM5, XMM4);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3001 __ movaps(XMM4, XMM5); 2803 __ movaps(XMM4, XMM5);
3002 __ movaps(XMM3, XMM4); 2804 __ movaps(XMM3, XMM4);
3003 __ movaps(XMM2, XMM3); 2805 __ movaps(XMM2, XMM3);
3004 __ movaps(XMM1, XMM2); 2806 __ movaps(XMM1, XMM2);
3005 __ movaps(XMM0, XMM1); 2807 __ movaps(XMM0, XMM1);
3006 __ popq(RAX); 2808 __ popq(RAX);
3007 __ popq(R15); // Callee saved. 2809 __ popq(R15); // Callee saved.
3008 __ ret(); 2810 __ ret();
3009 } 2811 }
3010 2812
3011
3012 ASSEMBLER_TEST_RUN(DoubleFPMoves, test) { 2813 ASSEMBLER_TEST_RUN(DoubleFPMoves, test) {
3013 typedef double (*DoubleFPMovesCode)(); 2814 typedef double (*DoubleFPMovesCode)();
3014 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(test->entry())(), 2815 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(test->entry())(),
3015 0.001); 2816 0.001);
3016 } 2817 }
3017 2818
3018
3019 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { 2819 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
3020 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); 2820 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
3021 __ pushq(RAX); 2821 __ pushq(RAX);
3022 __ movsd(XMM0, Address(RSP, 0)); 2822 __ movsd(XMM0, Address(RSP, 0));
3023 __ movsd(XMM8, Address(RSP, 0)); 2823 __ movsd(XMM8, Address(RSP, 0));
3024 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); 2824 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4)));
3025 __ movq(Address(RSP, 0), RAX); 2825 __ movq(Address(RSP, 0), RAX);
3026 __ movsd(XMM12, Address(RSP, 0)); 2826 __ movsd(XMM12, Address(RSP, 0));
3027 __ addsd(XMM8, XMM12); // 15.7 2827 __ addsd(XMM8, XMM12); // 15.7
3028 __ mulsd(XMM8, XMM12); // 53.38 2828 __ mulsd(XMM8, XMM12); // 53.38
3029 __ subsd(XMM8, XMM12); // 49.98 2829 __ subsd(XMM8, XMM12); // 49.98
3030 __ divsd(XMM8, XMM12); // 14.7 2830 __ divsd(XMM8, XMM12); // 14.7
3031 __ sqrtsd(XMM8, XMM8); // 3.834 2831 __ sqrtsd(XMM8, XMM8); // 3.834
3032 __ movsd(XMM1, Address(RSP, 0)); 2832 __ movsd(XMM1, Address(RSP, 0));
3033 __ addsd(XMM0, XMM1); // 15.7 2833 __ addsd(XMM0, XMM1); // 15.7
3034 __ mulsd(XMM0, XMM1); // 53.38 2834 __ mulsd(XMM0, XMM1); // 53.38
3035 __ subsd(XMM0, XMM1); // 49.98 2835 __ subsd(XMM0, XMM1); // 49.98
3036 __ divsd(XMM0, XMM1); // 14.7 2836 __ divsd(XMM0, XMM1); // 14.7
3037 __ sqrtsd(XMM0, XMM0); // 3.834057902 2837 __ sqrtsd(XMM0, XMM0); // 3.834057902
3038 __ addsd(XMM0, XMM8); // 7.6681 2838 __ addsd(XMM0, XMM8); // 7.6681
3039 __ popq(RAX); 2839 __ popq(RAX);
3040 __ ret(); 2840 __ ret();
3041 } 2841 }
3042 2842
3043
3044 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) { 2843 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) {
3045 typedef double (*SingleFPOperationsCode)(); 2844 typedef double (*SingleFPOperationsCode)();
3046 double res = reinterpret_cast<SingleFPOperationsCode>(test->entry())(); 2845 double res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
3047 EXPECT_FLOAT_EQ(7.668, res, 0.001); 2846 EXPECT_FLOAT_EQ(7.668, res, 0.001);
3048 } 2847 }
3049 2848
3050
3051 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { 2849 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) {
3052 // Fill upper bits with garbage. 2850 // Fill upper bits with garbage.
3053 __ movq(R11, Immediate(0x1111111100000006)); 2851 __ movq(R11, Immediate(0x1111111100000006));
3054 __ cvtsi2sdl(XMM0, R11); 2852 __ cvtsi2sdl(XMM0, R11);
3055 // Fill upper bits with garbage. 2853 // Fill upper bits with garbage.
3056 __ movq(R11, Immediate(0x2222222200000008)); 2854 __ movq(R11, Immediate(0x2222222200000008));
3057 __ cvtsi2sdl(XMM8, R11); 2855 __ cvtsi2sdl(XMM8, R11);
3058 __ subsd(XMM0, XMM8); 2856 __ subsd(XMM0, XMM8);
3059 __ ret(); 2857 __ ret();
3060 } 2858 }
3061 2859
3062
3063 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, test) { 2860 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, test) {
3064 typedef double (*Int32ToDoubleConversion)(); 2861 typedef double (*Int32ToDoubleConversion)();
3065 double res = reinterpret_cast<Int32ToDoubleConversion>(test->entry())(); 2862 double res = reinterpret_cast<Int32ToDoubleConversion>(test->entry())();
3066 EXPECT_FLOAT_EQ(-2.0, res, 0.001); 2863 EXPECT_FLOAT_EQ(-2.0, res, 0.001);
3067 } 2864 }
3068 2865
3069
3070 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { 2866 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) {
3071 __ movq(RDX, Immediate(12LL << 32)); 2867 __ movq(RDX, Immediate(12LL << 32));
3072 __ cvtsi2sdq(XMM0, RDX); 2868 __ cvtsi2sdq(XMM0, RDX);
3073 __ movsd(XMM15, XMM0); // Move to high register 2869 __ movsd(XMM15, XMM0); // Move to high register
3074 __ addsd(XMM0, XMM0); // Stomp XMM0 2870 __ addsd(XMM0, XMM0); // Stomp XMM0
3075 __ movsd(XMM0, XMM15); // Move back to XMM0 2871 __ movsd(XMM0, XMM15); // Move back to XMM0
3076 __ ret(); 2872 __ ret();
3077 } 2873 }
3078 2874
3079
3080 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, test) { 2875 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, test) {
3081 typedef double (*Int64ToDoubleConversionCode)(); 2876 typedef double (*Int64ToDoubleConversionCode)();
3082 double res = reinterpret_cast<Int64ToDoubleConversionCode>(test->entry())(); 2877 double res = reinterpret_cast<Int64ToDoubleConversionCode>(test->entry())();
3083 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); 2878 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001);
3084 } 2879 }
3085 2880
3086
3087 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) { 2881 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) {
3088 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); 2882 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
3089 __ pushq(RAX); 2883 __ pushq(RAX);
3090 __ movsd(XMM9, Address(RSP, 0)); 2884 __ movsd(XMM9, Address(RSP, 0));
3091 __ movsd(XMM6, Address(RSP, 0)); 2885 __ movsd(XMM6, Address(RSP, 0));
3092 __ popq(RAX); 2886 __ popq(RAX);
3093 __ cvttsd2siq(R10, XMM6); 2887 __ cvttsd2siq(R10, XMM6);
3094 __ cvttsd2siq(RDX, XMM6); 2888 __ cvttsd2siq(RDX, XMM6);
3095 __ cvttsd2siq(R10, XMM9); 2889 __ cvttsd2siq(R10, XMM9);
3096 __ cvttsd2siq(RDX, XMM9); 2890 __ cvttsd2siq(RDX, XMM9);
3097 __ subq(RDX, R10); 2891 __ subq(RDX, R10);
3098 __ movq(RAX, RDX); 2892 __ movq(RAX, RDX);
3099 __ ret(); 2893 __ ret();
3100 } 2894 }
3101 2895
3102
3103 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, test) { 2896 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, test) {
3104 typedef int64_t (*DoubleToInt64ConversionCode)(); 2897 typedef int64_t (*DoubleToInt64ConversionCode)();
3105 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(test->entry())(); 2898 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(test->entry())();
3106 EXPECT_EQ(0, res); 2899 EXPECT_EQ(0, res);
3107 } 2900 }
3108 2901
3109
3110 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) { 2902 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) {
3111 ObjectStore* object_store = Isolate::Current()->object_store(); 2903 ObjectStore* object_store = Isolate::Current()->object_store();
3112 const Object& obj = Object::ZoneHandle(object_store->smi_class()); 2904 const Object& obj = Object::ZoneHandle(object_store->smi_class());
3113 Label fail; 2905 Label fail;
3114 EnterTestFrame(assembler); 2906 EnterTestFrame(assembler);
3115 __ LoadObject(RAX, obj); 2907 __ LoadObject(RAX, obj);
3116 __ CompareObject(RAX, obj); 2908 __ CompareObject(RAX, obj);
3117 __ j(NOT_EQUAL, &fail); 2909 __ j(NOT_EQUAL, &fail);
3118 __ LoadObject(RCX, obj); 2910 __ LoadObject(RCX, obj);
3119 __ CompareObject(RCX, obj); 2911 __ CompareObject(RCX, obj);
(...skipping 14 matching lines...) Expand all
3134 __ j(NOT_EQUAL, &fail); 2926 __ j(NOT_EQUAL, &fail);
3135 __ movl(RAX, Immediate(1)); // OK 2927 __ movl(RAX, Immediate(1)); // OK
3136 LeaveTestFrame(assembler); 2928 LeaveTestFrame(assembler);
3137 __ ret(); 2929 __ ret();
3138 __ Bind(&fail); 2930 __ Bind(&fail);
3139 __ movl(RAX, Immediate(0)); // Fail. 2931 __ movl(RAX, Immediate(0)); // Fail.
3140 LeaveTestFrame(assembler); 2932 LeaveTestFrame(assembler);
3141 __ ret(); 2933 __ ret();
3142 } 2934 }
3143 2935
3144
3145 ASSEMBLER_TEST_RUN(TestObjectCompare, test) { 2936 ASSEMBLER_TEST_RUN(TestObjectCompare, test) {
3146 bool res = test->InvokeWithCodeAndThread<bool>(); 2937 bool res = test->InvokeWithCodeAndThread<bool>();
3147 EXPECT_EQ(true, res); 2938 EXPECT_EQ(true, res);
3148 } 2939 }
3149 2940
3150
3151 ASSEMBLER_TEST_GENERATE(TestNop, assembler) { 2941 ASSEMBLER_TEST_GENERATE(TestNop, assembler) {
3152 __ nop(1); 2942 __ nop(1);
3153 __ nop(2); 2943 __ nop(2);
3154 __ nop(3); 2944 __ nop(3);
3155 __ nop(4); 2945 __ nop(4);
3156 __ nop(5); 2946 __ nop(5);
3157 __ nop(6); 2947 __ nop(6);
3158 __ nop(7); 2948 __ nop(7);
3159 __ nop(8); 2949 __ nop(8);
3160 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 2950 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
3161 __ ret(); 2951 __ ret();
3162 } 2952 }
3163 2953
3164
3165 ASSEMBLER_TEST_RUN(TestNop, test) { 2954 ASSEMBLER_TEST_RUN(TestNop, test) {
3166 typedef int (*TestNop)(); 2955 typedef int (*TestNop)();
3167 int res = reinterpret_cast<TestNop>(test->payload_start())(); 2956 int res = reinterpret_cast<TestNop>(test->payload_start())();
3168 EXPECT_EQ(36, res); // 36 nop bytes emitted. 2957 EXPECT_EQ(36, res); // 36 nop bytes emitted.
3169 } 2958 }
3170 2959
3171
3172 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) { 2960 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) {
3173 __ Align(4, 0); 2961 __ Align(4, 0);
3174 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 2962 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
3175 __ ret(); 2963 __ ret();
3176 } 2964 }
3177 2965
3178
3179 ASSEMBLER_TEST_RUN(TestAlign0, test) { 2966 ASSEMBLER_TEST_RUN(TestAlign0, test) {
3180 typedef int (*TestAlign0)(); 2967 typedef int (*TestAlign0)();
3181 int res = reinterpret_cast<TestAlign0>(test->payload_start())(); 2968 int res = reinterpret_cast<TestAlign0>(test->payload_start())();
3182 EXPECT_EQ(0, res); // 0 bytes emitted. 2969 EXPECT_EQ(0, res); // 0 bytes emitted.
3183 } 2970 }
3184 2971
3185
3186 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) { 2972 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) {
3187 __ nop(1); 2973 __ nop(1);
3188 __ Align(4, 0); 2974 __ Align(4, 0);
3189 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 2975 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
3190 __ ret(); 2976 __ ret();
3191 } 2977 }
3192 2978
3193
3194 ASSEMBLER_TEST_RUN(TestAlign1, test) { 2979 ASSEMBLER_TEST_RUN(TestAlign1, test) {
3195 typedef int (*TestAlign1)(); 2980 typedef int (*TestAlign1)();
3196 int res = reinterpret_cast<TestAlign1>(test->payload_start())(); 2981 int res = reinterpret_cast<TestAlign1>(test->payload_start())();
3197 EXPECT_EQ(4, res); // 4 bytes emitted. 2982 EXPECT_EQ(4, res); // 4 bytes emitted.
3198 } 2983 }
3199 2984
3200
3201 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) { 2985 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) {
3202 __ nop(1); 2986 __ nop(1);
3203 __ Align(4, 1); 2987 __ Align(4, 1);
3204 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 2988 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
3205 __ ret(); 2989 __ ret();
3206 } 2990 }
3207 2991
3208
3209 ASSEMBLER_TEST_RUN(TestAlign1Offset1, test) { 2992 ASSEMBLER_TEST_RUN(TestAlign1Offset1, test) {
3210 typedef int (*TestAlign1Offset1)(); 2993 typedef int (*TestAlign1Offset1)();
3211 int res = reinterpret_cast<TestAlign1Offset1>(test->payload_start())(); 2994 int res = reinterpret_cast<TestAlign1Offset1>(test->payload_start())();
3212 EXPECT_EQ(3, res); // 3 bytes emitted. 2995 EXPECT_EQ(3, res); // 3 bytes emitted.
3213 } 2996 }
3214 2997
3215
3216 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) { 2998 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) {
3217 __ nop(1); 2999 __ nop(1);
3218 __ Align(16, 0); 3000 __ Align(16, 0);
3219 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 3001 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
3220 __ ret(); 3002 __ ret();
3221 } 3003 }
3222 3004
3223
3224 ASSEMBLER_TEST_RUN(TestAlignLarge, test) { 3005 ASSEMBLER_TEST_RUN(TestAlignLarge, test) {
3225 typedef int (*TestAlignLarge)(); 3006 typedef int (*TestAlignLarge)();
3226 int res = reinterpret_cast<TestAlignLarge>(test->payload_start())(); 3007 int res = reinterpret_cast<TestAlignLarge>(test->payload_start())();
3227 EXPECT_EQ(16, res); // 16 bytes emitted. 3008 EXPECT_EQ(16, res); // 16 bytes emitted.
3228 } 3009 }
3229 3010
3230
3231 ASSEMBLER_TEST_GENERATE(TestAdds, assembler) { 3011 ASSEMBLER_TEST_GENERATE(TestAdds, assembler) {
3232 __ movq(RAX, Immediate(4)); 3012 __ movq(RAX, Immediate(4));
3233 __ pushq(RAX); 3013 __ pushq(RAX);
3234 __ addq(Address(RSP, 0), Immediate(5)); 3014 __ addq(Address(RSP, 0), Immediate(5));
3235 // TOS: 9 3015 // TOS: 9
3236 __ addq(Address(RSP, 0), Immediate(-2)); 3016 __ addq(Address(RSP, 0), Immediate(-2));
3237 // TOS: 7 3017 // TOS: 7
3238 __ movq(RCX, Immediate(3)); 3018 __ movq(RCX, Immediate(3));
3239 __ addq(Address(RSP, 0), RCX); 3019 __ addq(Address(RSP, 0), RCX);
3240 // TOS: 10 3020 // TOS: 10
3241 __ movq(RAX, Immediate(10)); 3021 __ movq(RAX, Immediate(10));
3242 __ addq(RAX, Address(RSP, 0)); 3022 __ addq(RAX, Address(RSP, 0));
3243 // RAX: 20 3023 // RAX: 20
3244 __ popq(RCX); 3024 __ popq(RCX);
3245 __ ret(); 3025 __ ret();
3246 } 3026 }
3247 3027
3248
3249 ASSEMBLER_TEST_RUN(TestAdds, test) { 3028 ASSEMBLER_TEST_RUN(TestAdds, test) {
3250 typedef int (*TestAdds)(); 3029 typedef int (*TestAdds)();
3251 int res = reinterpret_cast<TestAdds>(test->entry())(); 3030 int res = reinterpret_cast<TestAdds>(test->entry())();
3252 EXPECT_EQ(20, res); 3031 EXPECT_EQ(20, res);
3253 } 3032 }
3254 3033
3255
3256 ASSEMBLER_TEST_GENERATE(TestNot, assembler) { 3034 ASSEMBLER_TEST_GENERATE(TestNot, assembler) {
3257 __ movq(RAX, Immediate(0xFFFFFFFF00000000)); 3035 __ movq(RAX, Immediate(0xFFFFFFFF00000000));
3258 __ notq(RAX); 3036 __ notq(RAX);
3259 __ ret(); 3037 __ ret();
3260 } 3038 }
3261 3039
3262
3263 ASSEMBLER_TEST_RUN(TestNot, test) { 3040 ASSEMBLER_TEST_RUN(TestNot, test) {
3264 typedef int (*TestNot)(); 3041 typedef int (*TestNot)();
3265 unsigned int res = reinterpret_cast<TestNot>(test->entry())(); 3042 unsigned int res = reinterpret_cast<TestNot>(test->entry())();
3266 EXPECT_EQ(0xFFFFFFFF, res); 3043 EXPECT_EQ(0xFFFFFFFF, res);
3267 } 3044 }
3268 3045
3269
3270 ASSEMBLER_TEST_GENERATE(TestNotInt32, assembler) { 3046 ASSEMBLER_TEST_GENERATE(TestNotInt32, assembler) {
3271 __ movq(RAX, Immediate(0x0)); 3047 __ movq(RAX, Immediate(0x0));
3272 __ notl(RAX); 3048 __ notl(RAX);
3273 __ ret(); 3049 __ ret();
3274 } 3050 }
3275 3051
3276
3277 ASSEMBLER_TEST_RUN(TestNotInt32, test) { 3052 ASSEMBLER_TEST_RUN(TestNotInt32, test) {
3278 typedef int (*TestNot)(); 3053 typedef int (*TestNot)();
3279 unsigned int res = reinterpret_cast<TestNot>(test->entry())(); 3054 unsigned int res = reinterpret_cast<TestNot>(test->entry())();
3280 EXPECT_EQ(0xFFFFFFFF, res); 3055 EXPECT_EQ(0xFFFFFFFF, res);
3281 } 3056 }
3282 3057
3283
3284 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) { 3058 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) {
3285 __ pushq(RAX); 3059 __ pushq(RAX);
3286 __ movsd(Address(RSP, 0), XMM0); 3060 __ movsd(Address(RSP, 0), XMM0);
3287 __ xorpd(XMM0, Address(RSP, 0)); 3061 __ xorpd(XMM0, Address(RSP, 0));
3288 __ popq(RAX); 3062 __ popq(RAX);
3289 __ ret(); 3063 __ ret();
3290 } 3064 }
3291 3065
3292
3293 ASSEMBLER_TEST_RUN(XorpdZeroing, test) { 3066 ASSEMBLER_TEST_RUN(XorpdZeroing, test) {
3294 typedef double (*XorpdZeroingCode)(double d); 3067 typedef double (*XorpdZeroingCode)(double d);
3295 double res = reinterpret_cast<XorpdZeroingCode>(test->entry())(12.56e3); 3068 double res = reinterpret_cast<XorpdZeroingCode>(test->entry())(12.56e3);
3296 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 3069 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
3297 } 3070 }
3298 3071
3299
3300 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { 3072 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) {
3301 Label done; 3073 Label done;
3302 __ xorpd(XMM15, XMM15); 3074 __ xorpd(XMM15, XMM15);
3303 __ xorpd(XMM0, XMM0); 3075 __ xorpd(XMM0, XMM0);
3304 __ xorpd(XMM0, XMM15); 3076 __ xorpd(XMM0, XMM15);
3305 __ comisd(XMM0, XMM15); 3077 __ comisd(XMM0, XMM15);
3306 __ j(ZERO, &done); 3078 __ j(ZERO, &done);
3307 __ int3(); 3079 __ int3();
3308 __ Bind(&done); 3080 __ Bind(&done);
3309 __ ret(); 3081 __ ret();
3310 } 3082 }
3311 3083
3312
3313 ASSEMBLER_TEST_RUN(XorpdZeroing2, test) { 3084 ASSEMBLER_TEST_RUN(XorpdZeroing2, test) {
3314 typedef double (*XorpdZeroing2Code)(double d); 3085 typedef double (*XorpdZeroing2Code)(double d);
3315 double res = reinterpret_cast<XorpdZeroing2Code>(test->entry())(12.56e3); 3086 double res = reinterpret_cast<XorpdZeroing2Code>(test->entry())(12.56e3);
3316 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 3087 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
3317 } 3088 }
3318 3089
3319
3320 ASSEMBLER_TEST_GENERATE(Pxor, assembler) { 3090 ASSEMBLER_TEST_GENERATE(Pxor, assembler) {
3321 __ pxor(XMM0, XMM0); 3091 __ pxor(XMM0, XMM0);
3322 __ ret(); 3092 __ ret();
3323 } 3093 }
3324 3094
3325
3326 ASSEMBLER_TEST_RUN(Pxor, test) { 3095 ASSEMBLER_TEST_RUN(Pxor, test) {
3327 typedef double (*PxorCode)(double d); 3096 typedef double (*PxorCode)(double d);
3328 double res = reinterpret_cast<PxorCode>(test->entry())(12.3456e3); 3097 double res = reinterpret_cast<PxorCode>(test->entry())(12.3456e3);
3329 EXPECT_FLOAT_EQ(0.0, res, 0.0); 3098 EXPECT_FLOAT_EQ(0.0, res, 0.0);
3330 } 3099 }
3331 3100
3332
3333 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) { 3101 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) {
3334 __ sqrtsd(XMM0, XMM0); 3102 __ sqrtsd(XMM0, XMM0);
3335 __ ret(); 3103 __ ret();
3336 } 3104 }
3337 3105
3338
3339 ASSEMBLER_TEST_RUN(SquareRootDouble, test) { 3106 ASSEMBLER_TEST_RUN(SquareRootDouble, test) {
3340 typedef double (*SquareRootDoubleCode)(double d); 3107 typedef double (*SquareRootDoubleCode)(double d);
3341 const double kDoubleConst = .7; 3108 const double kDoubleConst = .7;
3342 double res = 3109 double res =
3343 reinterpret_cast<SquareRootDoubleCode>(test->entry())(kDoubleConst); 3110 reinterpret_cast<SquareRootDoubleCode>(test->entry())(kDoubleConst);
3344 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001); 3111 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001);
3345 } 3112 }
3346 3113
3347
3348 // Called from assembler_test.cc. 3114 // Called from assembler_test.cc.
3349 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 3115 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
3350 __ pushq(CODE_REG); 3116 __ pushq(CODE_REG);
3351 __ pushq(THR); 3117 __ pushq(THR);
3352 __ movq(THR, CallingConventions::kArg3Reg); 3118 __ movq(THR, CallingConventions::kArg3Reg);
3353 __ StoreIntoObject(CallingConventions::kArg2Reg, 3119 __ StoreIntoObject(CallingConventions::kArg2Reg,
3354 FieldAddress(CallingConventions::kArg2Reg, 3120 FieldAddress(CallingConventions::kArg2Reg,
3355 GrowableObjectArray::data_offset()), 3121 GrowableObjectArray::data_offset()),
3356 CallingConventions::kArg1Reg); 3122 CallingConventions::kArg1Reg);
3357 __ popq(THR); 3123 __ popq(THR);
3358 __ popq(CODE_REG); 3124 __ popq(CODE_REG);
3359 __ ret(); 3125 __ ret();
3360 } 3126 }
3361 3127
3362
3363 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) { 3128 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) {
3364 int64_t l = bit_cast<int64_t, double>(1024.67); 3129 int64_t l = bit_cast<int64_t, double>(1024.67);
3365 __ movq(RAX, Immediate(l)); 3130 __ movq(RAX, Immediate(l));
3366 __ pushq(RAX); 3131 __ pushq(RAX);
3367 __ fldl(Address(RSP, 0)); 3132 __ fldl(Address(RSP, 0));
3368 __ movq(Address(RSP, 0), Immediate(0)); 3133 __ movq(Address(RSP, 0), Immediate(0));
3369 __ fstpl(Address(RSP, 0)); 3134 __ fstpl(Address(RSP, 0));
3370 __ popq(RAX); 3135 __ popq(RAX);
3371 __ ret(); 3136 __ ret();
3372 } 3137 }
3373 3138
3374
3375 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, test) { 3139 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, test) {
3376 typedef int64_t (*DoubleFPUStackMovesCode)(); 3140 typedef int64_t (*DoubleFPUStackMovesCode)();
3377 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())(); 3141 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())();
3378 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001); 3142 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001);
3379 } 3143 }
3380 3144
3381
3382 ASSEMBLER_TEST_GENERATE(Sine, assembler) { 3145 ASSEMBLER_TEST_GENERATE(Sine, assembler) {
3383 __ pushq(RAX); 3146 __ pushq(RAX);
3384 __ movsd(Address(RSP, 0), XMM0); 3147 __ movsd(Address(RSP, 0), XMM0);
3385 __ fldl(Address(RSP, 0)); 3148 __ fldl(Address(RSP, 0));
3386 __ fsin(); 3149 __ fsin();
3387 __ fstpl(Address(RSP, 0)); 3150 __ fstpl(Address(RSP, 0));
3388 __ movsd(XMM0, Address(RSP, 0)); 3151 __ movsd(XMM0, Address(RSP, 0));
3389 __ popq(RAX); 3152 __ popq(RAX);
3390 __ ret(); 3153 __ ret();
3391 } 3154 }
3392 3155
3393
3394 ASSEMBLER_TEST_RUN(Sine, test) { 3156 ASSEMBLER_TEST_RUN(Sine, test) {
3395 typedef double (*SineCode)(double d); 3157 typedef double (*SineCode)(double d);
3396 const double kDoubleConst = 0.7; 3158 const double kDoubleConst = 0.7;
3397 double res = reinterpret_cast<SineCode>(test->entry())(kDoubleConst); 3159 double res = reinterpret_cast<SineCode>(test->entry())(kDoubleConst);
3398 EXPECT_FLOAT_EQ(sin(kDoubleConst), res, 0.0001); 3160 EXPECT_FLOAT_EQ(sin(kDoubleConst), res, 0.0001);
3399 } 3161 }
3400 3162
3401
3402 ASSEMBLER_TEST_GENERATE(Cosine, assembler) { 3163 ASSEMBLER_TEST_GENERATE(Cosine, assembler) {
3403 __ pushq(RAX); 3164 __ pushq(RAX);
3404 __ movsd(Address(RSP, 0), XMM0); 3165 __ movsd(Address(RSP, 0), XMM0);
3405 __ fldl(Address(RSP, 0)); 3166 __ fldl(Address(RSP, 0));
3406 __ fcos(); 3167 __ fcos();
3407 __ fstpl(Address(RSP, 0)); 3168 __ fstpl(Address(RSP, 0));
3408 __ movsd(XMM0, Address(RSP, 0)); 3169 __ movsd(XMM0, Address(RSP, 0));
3409 __ popq(RAX); 3170 __ popq(RAX);
3410 __ ret(); 3171 __ ret();
3411 } 3172 }
3412 3173
3413
3414 ASSEMBLER_TEST_RUN(Cosine, test) { 3174 ASSEMBLER_TEST_RUN(Cosine, test) {
3415 typedef double (*CosineCode)(double f); 3175 typedef double (*CosineCode)(double f);
3416 const double kDoubleConst = 0.7; 3176 const double kDoubleConst = 0.7;
3417 double res = reinterpret_cast<CosineCode>(test->entry())(kDoubleConst); 3177 double res = reinterpret_cast<CosineCode>(test->entry())(kDoubleConst);
3418 EXPECT_FLOAT_EQ(cos(kDoubleConst), res, 0.0001); 3178 EXPECT_FLOAT_EQ(cos(kDoubleConst), res, 0.0001);
3419 } 3179 }
3420 3180
3421
3422 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { 3181 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
3423 __ movq(RDX, Immediate(6)); 3182 __ movq(RDX, Immediate(6));
3424 __ cvtsi2sdq(XMM0, RDX); 3183 __ cvtsi2sdq(XMM0, RDX);
3425 __ ret(); 3184 __ ret();
3426 } 3185 }
3427 3186
3428
3429 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) { 3187 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) {
3430 typedef double (*IntToDoubleConversionCode)(); 3188 typedef double (*IntToDoubleConversionCode)();
3431 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())(); 3189 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())();
3432 EXPECT_FLOAT_EQ(6.0, res, 0.001); 3190 EXPECT_FLOAT_EQ(6.0, res, 0.001);
3433 } 3191 }
3434 3192
3435
3436 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) { 3193 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) {
3437 __ roundsd(XMM0, XMM0, Assembler::kRoundToZero); 3194 __ roundsd(XMM0, XMM0, Assembler::kRoundToZero);
3438 __ ret(); 3195 __ ret();
3439 } 3196 }
3440 3197
3441
3442 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, test) { 3198 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, test) {
3443 typedef double (*DoubleToDoubleTruncCode)(double d); 3199 typedef double (*DoubleToDoubleTruncCode)(double d);
3444 double res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.3); 3200 double res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.3);
3445 EXPECT_EQ(12.0, res); 3201 EXPECT_EQ(12.0, res);
3446 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.8); 3202 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.8);
3447 EXPECT_EQ(12.0, res); 3203 EXPECT_EQ(12.0, res);
3448 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.3); 3204 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.3);
3449 EXPECT_EQ(-12.0, res); 3205 EXPECT_EQ(-12.0, res);
3450 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.8); 3206 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.8);
3451 EXPECT_EQ(-12.0, res); 3207 EXPECT_EQ(-12.0, res);
3452 } 3208 }
3453 3209
3454
3455 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) { 3210 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
3456 EnterTestFrame(assembler); 3211 EnterTestFrame(assembler);
3457 #if defined(HOST_OS_WINDOWS) 3212 #if defined(HOST_OS_WINDOWS)
3458 // First argument is code object, second argument is thread. MSVC passes 3213 // First argument is code object, second argument is thread. MSVC passes
3459 // third argument in XMM2. 3214 // third argument in XMM2.
3460 __ DoubleAbs(XMM2); 3215 __ DoubleAbs(XMM2);
3461 __ movaps(XMM0, XMM2); 3216 __ movaps(XMM0, XMM2);
3462 #else 3217 #else
3463 // SysV ABI allocates integral and double registers for arguments 3218 // SysV ABI allocates integral and double registers for arguments
3464 // independently. 3219 // independently.
3465 __ DoubleAbs(XMM0); 3220 __ DoubleAbs(XMM0);
3466 #endif 3221 #endif
3467 LeaveTestFrame(assembler); 3222 LeaveTestFrame(assembler);
3468 __ ret(); 3223 __ ret();
3469 } 3224 }
3470 3225
3471
3472 ASSEMBLER_TEST_RUN(DoubleAbs, test) { 3226 ASSEMBLER_TEST_RUN(DoubleAbs, test) {
3473 double val = -12.45; 3227 double val = -12.45;
3474 double res = test->InvokeWithCodeAndThread<double, double>(val); 3228 double res = test->InvokeWithCodeAndThread<double, double>(val);
3475 EXPECT_FLOAT_EQ(-val, res, 0.001); 3229 EXPECT_FLOAT_EQ(-val, res, 0.001);
3476 val = 12.45; 3230 val = 12.45;
3477 res = test->InvokeWithCodeAndThread<double, double>(val); 3231 res = test->InvokeWithCodeAndThread<double, double>(val);
3478 EXPECT_FLOAT_EQ(val, res, 0.001); 3232 EXPECT_FLOAT_EQ(val, res, 0.001);
3479 } 3233 }
3480 3234
3481
3482 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) { 3235 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) {
3483 __ movmskpd(RAX, XMM0); 3236 __ movmskpd(RAX, XMM0);
3484 __ andq(RAX, Immediate(0x1)); 3237 __ andq(RAX, Immediate(0x1));
3485 __ ret(); 3238 __ ret();
3486 } 3239 }
3487 3240
3488
3489 ASSEMBLER_TEST_RUN(ExtractSignBits, test) { 3241 ASSEMBLER_TEST_RUN(ExtractSignBits, test) {
3490 typedef int (*ExtractSignBits)(double d); 3242 typedef int (*ExtractSignBits)(double d);
3491 int res = reinterpret_cast<ExtractSignBits>(test->entry())(1.0); 3243 int res = reinterpret_cast<ExtractSignBits>(test->entry())(1.0);
3492 EXPECT_EQ(0, res); 3244 EXPECT_EQ(0, res);
3493 res = reinterpret_cast<ExtractSignBits>(test->entry())(-1.0); 3245 res = reinterpret_cast<ExtractSignBits>(test->entry())(-1.0);
3494 EXPECT_EQ(1, res); 3246 EXPECT_EQ(1, res);
3495 res = reinterpret_cast<ExtractSignBits>(test->entry())(-0.0); 3247 res = reinterpret_cast<ExtractSignBits>(test->entry())(-0.0);
3496 EXPECT_EQ(1, res); 3248 EXPECT_EQ(1, res);
3497 } 3249 }
3498 3250
3499
3500 ASSEMBLER_TEST_GENERATE(TestSetCC, assembler) { 3251 ASSEMBLER_TEST_GENERATE(TestSetCC, assembler) {
3501 __ movq(RAX, Immediate(0xFFFFFFFF)); 3252 __ movq(RAX, Immediate(0xFFFFFFFF));
3502 __ cmpq(RAX, RAX); 3253 __ cmpq(RAX, RAX);
3503 __ setcc(NOT_EQUAL, AL); 3254 __ setcc(NOT_EQUAL, AL);
3504 __ ret(); 3255 __ ret();
3505 } 3256 }
3506 3257
3507
3508 ASSEMBLER_TEST_RUN(TestSetCC, test) { 3258 ASSEMBLER_TEST_RUN(TestSetCC, test) {
3509 typedef uword (*TestSetCC)(); 3259 typedef uword (*TestSetCC)();
3510 uword res = reinterpret_cast<TestSetCC>(test->entry())(); 3260 uword res = reinterpret_cast<TestSetCC>(test->entry())();
3511 EXPECT_EQ(0xFFFFFF00, res); 3261 EXPECT_EQ(0xFFFFFF00, res);
3512 } 3262 }
3513 3263
3514
3515 ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) { 3264 ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
3516 __ pushq(RSI); 3265 __ pushq(RSI);
3517 __ pushq(RDI); 3266 __ pushq(RDI);
3518 __ pushq(CallingConventions::kArg1Reg); // from. 3267 __ pushq(CallingConventions::kArg1Reg); // from.
3519 __ pushq(CallingConventions::kArg2Reg); // to. 3268 __ pushq(CallingConventions::kArg2Reg); // to.
3520 __ pushq(CallingConventions::kArg3Reg); // count. 3269 __ pushq(CallingConventions::kArg3Reg); // count.
3521 __ movq(RSI, Address(RSP, 2 * kWordSize)); // from. 3270 __ movq(RSI, Address(RSP, 2 * kWordSize)); // from.
3522 __ movq(RDI, Address(RSP, 1 * kWordSize)); // to. 3271 __ movq(RDI, Address(RSP, 1 * kWordSize)); // to.
3523 __ movq(RCX, Address(RSP, 0 * kWordSize)); // count. 3272 __ movq(RCX, Address(RSP, 0 * kWordSize)); // count.
3524 __ rep_movsb(); 3273 __ rep_movsb();
3525 // Remove saved arguments. 3274 // Remove saved arguments.
3526 __ popq(RAX); 3275 __ popq(RAX);
3527 __ popq(RAX); 3276 __ popq(RAX);
3528 __ popq(RAX); 3277 __ popq(RAX);
3529 __ popq(RDI); 3278 __ popq(RDI);
3530 __ popq(RSI); 3279 __ popq(RSI);
3531 __ ret(); 3280 __ ret();
3532 } 3281 }
3533 3282
3534
3535 ASSEMBLER_TEST_RUN(TestRepMovsBytes, test) { 3283 ASSEMBLER_TEST_RUN(TestRepMovsBytes, test) {
3536 const char* from = "0123456789"; 3284 const char* from = "0123456789";
3537 const char* to = new char[10]; 3285 const char* to = new char[10];
3538 typedef void (*TestRepMovsBytes)(const char* from, const char* to, int count); 3286 typedef void (*TestRepMovsBytes)(const char* from, const char* to, int count);
3539 reinterpret_cast<TestRepMovsBytes>(test->entry())(from, to, 10); 3287 reinterpret_cast<TestRepMovsBytes>(test->entry())(from, to, 10);
3540 EXPECT_EQ(to[0], '0'); 3288 EXPECT_EQ(to[0], '0');
3541 for (int i = 0; i < 10; i++) { 3289 for (int i = 0; i < 10; i++) {
3542 EXPECT_EQ(from[i], to[i]); 3290 EXPECT_EQ(from[i], to[i]);
3543 } 3291 }
3544 delete[] to; 3292 delete[] to;
3545 } 3293 }
3546 3294
3547
3548 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) { 3295 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
3549 __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg); 3296 __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg);
3550 __ movq(RDX, Immediate(1)); // Greater equal. 3297 __ movq(RDX, Immediate(1)); // Greater equal.
3551 __ movq(RCX, Immediate(-1)); // Less 3298 __ movq(RCX, Immediate(-1)); // Less
3552 __ cmovlessq(RAX, RCX); 3299 __ cmovlessq(RAX, RCX);
3553 __ cmovgeq(RAX, RDX); 3300 __ cmovgeq(RAX, RDX);
3554 __ ret(); 3301 __ ret();
3555 } 3302 }
3556 3303
3557
3558 ASSEMBLER_TEST_RUN(ConditionalMovesCompare, test) { 3304 ASSEMBLER_TEST_RUN(ConditionalMovesCompare, test) {
3559 typedef int (*ConditionalMovesCompareCode)(int i, int j); 3305 typedef int (*ConditionalMovesCompareCode)(int i, int j);
3560 int res = reinterpret_cast<ConditionalMovesCompareCode>(test->entry())(10, 5); 3306 int res = reinterpret_cast<ConditionalMovesCompareCode>(test->entry())(10, 5);
3561 EXPECT_EQ(1, res); // Greater equal. 3307 EXPECT_EQ(1, res); // Greater equal.
3562 res = reinterpret_cast<ConditionalMovesCompareCode>(test->entry())(5, 5); 3308 res = reinterpret_cast<ConditionalMovesCompareCode>(test->entry())(5, 5);
3563 EXPECT_EQ(1, res); // Greater equal. 3309 EXPECT_EQ(1, res); // Greater equal.
3564 res = reinterpret_cast<ConditionalMovesCompareCode>(test->entry())(2, 5); 3310 res = reinterpret_cast<ConditionalMovesCompareCode>(test->entry())(2, 5);
3565 EXPECT_EQ(-1, res); // Less. 3311 EXPECT_EQ(-1, res); // Less.
3566 } 3312 }
3567 3313
3568
3569 ASSEMBLER_TEST_GENERATE(BitTest, assembler) { 3314 ASSEMBLER_TEST_GENERATE(BitTest, assembler) {
3570 __ movq(RAX, Immediate(4)); 3315 __ movq(RAX, Immediate(4));
3571 __ movq(R11, Immediate(2)); 3316 __ movq(R11, Immediate(2));
3572 __ btq(RAX, R11); 3317 __ btq(RAX, R11);
3573 Label ok; 3318 Label ok;
3574 __ j(CARRY, &ok); 3319 __ j(CARRY, &ok);
3575 __ int3(); 3320 __ int3();
3576 __ Bind(&ok); 3321 __ Bind(&ok);
3577 __ movq(RAX, Immediate(1)); 3322 __ movq(RAX, Immediate(1));
3578 __ ret(); 3323 __ ret();
3579 } 3324 }
3580 3325
3581
3582 ASSEMBLER_TEST_RUN(BitTest, test) { 3326 ASSEMBLER_TEST_RUN(BitTest, test) {
3583 typedef int (*BitTest)(); 3327 typedef int (*BitTest)();
3584 EXPECT_EQ(1, reinterpret_cast<BitTest>(test->entry())()); 3328 EXPECT_EQ(1, reinterpret_cast<BitTest>(test->entry())());
3585 } 3329 }
3586 3330
3587
3588 // Return 1 if equal, 0 if not equal. 3331 // Return 1 if equal, 0 if not equal.
3589 ASSEMBLER_TEST_GENERATE(ConditionalMovesEqual, assembler) { 3332 ASSEMBLER_TEST_GENERATE(ConditionalMovesEqual, assembler) {
3590 __ movq(RDX, CallingConventions::kArg1Reg); 3333 __ movq(RDX, CallingConventions::kArg1Reg);
3591 __ xorq(RAX, RAX); 3334 __ xorq(RAX, RAX);
3592 __ movq(RCX, Immediate(1)); 3335 __ movq(RCX, Immediate(1));
3593 __ cmpq(RDX, Immediate(785)); 3336 __ cmpq(RDX, Immediate(785));
3594 __ cmoveq(RAX, RCX); 3337 __ cmoveq(RAX, RCX);
3595 __ ret(); 3338 __ ret();
3596 } 3339 }
3597 3340
3598
3599 ASSEMBLER_TEST_RUN(ConditionalMovesEqual, test) { 3341 ASSEMBLER_TEST_RUN(ConditionalMovesEqual, test) {
3600 typedef int (*ConditionalMovesEqualCode)(int i); 3342 typedef int (*ConditionalMovesEqualCode)(int i);
3601 int res = reinterpret_cast<ConditionalMovesEqualCode>(test->entry())(785); 3343 int res = reinterpret_cast<ConditionalMovesEqualCode>(test->entry())(785);
3602 EXPECT_EQ(1, res); 3344 EXPECT_EQ(1, res);
3603 res = reinterpret_cast<ConditionalMovesEqualCode>(test->entry())(-12); 3345 res = reinterpret_cast<ConditionalMovesEqualCode>(test->entry())(-12);
3604 EXPECT_EQ(0, res); 3346 EXPECT_EQ(0, res);
3605 } 3347 }
3606 3348
3607
3608 // Return 1 if overflow, 0 if no overflow. 3349 // Return 1 if overflow, 0 if no overflow.
3609 ASSEMBLER_TEST_GENERATE(ConditionalMovesNoOverflow, assembler) { 3350 ASSEMBLER_TEST_GENERATE(ConditionalMovesNoOverflow, assembler) {
3610 __ movq(RDX, CallingConventions::kArg1Reg); 3351 __ movq(RDX, CallingConventions::kArg1Reg);
3611 __ addq(RDX, CallingConventions::kArg2Reg); 3352 __ addq(RDX, CallingConventions::kArg2Reg);
3612 __ movq(RAX, Immediate(1)); 3353 __ movq(RAX, Immediate(1));
3613 __ movq(RCX, Immediate(0)); 3354 __ movq(RCX, Immediate(0));
3614 __ cmovnoq(RAX, RCX); 3355 __ cmovnoq(RAX, RCX);
3615 __ ret(); 3356 __ ret();
3616 } 3357 }
3617 3358
3618
3619 ASSEMBLER_TEST_RUN(ConditionalMovesNoOverflow, test) { 3359 ASSEMBLER_TEST_RUN(ConditionalMovesNoOverflow, test) {
3620 typedef int (*ConditionalMovesNoOverflowCode)(int64_t i, int64_t j); 3360 typedef int (*ConditionalMovesNoOverflowCode)(int64_t i, int64_t j);
3621 int res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())( 3361 int res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(
3622 0x7fffffffffffffff, 2); 3362 0x7fffffffffffffff, 2);
3623 EXPECT_EQ(1, res); 3363 EXPECT_EQ(1, res);
3624 res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(1, 1); 3364 res = reinterpret_cast<ConditionalMovesNoOverflowCode>(test->entry())(1, 1);
3625 EXPECT_EQ(0, res); 3365 EXPECT_EQ(0, res);
3626 } 3366 }
3627 3367
3628 } // namespace dart 3368 } // namespace dart
3629 3369
3630 #endif // defined TARGET_ARCH_X64 3370 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | runtime/vm/assert_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698