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

Side by Side Diff: test/cctest/test-assembler-a64.cc

Issue 160423002: A64 support for DoubleToIStub (truncating). (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add test cases Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/cctest.gyp ('k') | test/cctest/test-code-stubs.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 9328 matching lines...) Expand 10 before | Expand all | Expand 10 after
9339 // non-relocatable sequences, so we check it here to make sure it works. 9339 // non-relocatable sequences, so we check it here to make sure it works.
9340 // TODO(jbramley): Once Crankshaft is complete, decide if we need to support 9340 // TODO(jbramley): Once Crankshaft is complete, decide if we need to support
9341 // non-relocatable calls at all. 9341 // non-relocatable calls at all.
9342 CHECK(return_address == 9342 CHECK(return_address ==
9343 Assembler::return_address_from_call_start(call_start)); 9343 Assembler::return_address_from_call_start(call_start));
9344 9344
9345 TEARDOWN(); 9345 TEARDOWN();
9346 } 9346 }
9347 9347
9348 9348
9349 static void ECMA262ToInt32Helper(int32_t expected, double input) {
9350 SETUP();
9351 START();
9352
9353 __ Fmov(d0, input);
9354
9355 __ ECMA262ToInt32(x0, d0, x10, x11, MacroAssembler::INT32_IN_W);
9356 __ ECMA262ToInt32(x1, d0, x10, x11, MacroAssembler::INT32_IN_X);
9357 __ ECMA262ToInt32(x2, d0, x10, x11, MacroAssembler::SMI);
9358
9359 // The upper bits of INT32_IN_W are undefined, so make sure we don't try to
9360 // test them.
9361 __ Mov(w0, w0);
9362
9363 END();
9364
9365 RUN();
9366
9367 int64_t expected64 = expected;
9368
9369 ASSERT_EQUAL_32(expected, w0);
9370 ASSERT_EQUAL_64(expected64, x1);
9371 ASSERT_EQUAL_64(expected64 << kSmiShift | kSmiTag, x2);
9372
9373 TEARDOWN();
9374 }
9375
9376
9377 TEST(ecma_262_to_int32) {
9378 INIT_V8();
9379 // ==== exponent < 64 ====
9380
9381 ECMA262ToInt32Helper(0, 0.0);
9382 ECMA262ToInt32Helper(0, -0.0);
9383 ECMA262ToInt32Helper(1, 1.0);
9384 ECMA262ToInt32Helper(-1, -1.0);
9385
9386 // The largest representable value that is less than 1.
9387 ECMA262ToInt32Helper(0, 0x001fffffffffffff * pow(2.0, -53));
9388 ECMA262ToInt32Helper(0, 0x001fffffffffffff * -pow(2.0, -53));
9389 ECMA262ToInt32Helper(0, std::numeric_limits<double>::denorm_min());
9390 ECMA262ToInt32Helper(0, -std::numeric_limits<double>::denorm_min());
9391
9392 // The largest conversion which doesn't require the integer modulo-2^32 step.
9393 ECMA262ToInt32Helper(0x7fffffff, 0x7fffffff);
9394 ECMA262ToInt32Helper(-0x80000000, -0x80000000);
9395
9396 // The largest simple conversion, requiring module-2^32, but where the fcvt
9397 // does not saturate when converting to int64_t.
9398 ECMA262ToInt32Helper(0xfffffc00, 0x7ffffffffffffc00);
9399 ECMA262ToInt32Helper(-0xfffffc00, 0x7ffffffffffffc00 * -1.0);
9400
9401 // ==== 64 <= exponent < 84 ====
9402
9403 // The smallest conversion where the fcvt saturates.
9404 ECMA262ToInt32Helper(0, 0x8000000000000000);
9405 ECMA262ToInt32Helper(0, 0x8000000000000000 * -1.0);
9406
9407 // The smallest conversion where the fcvt saturates, and where all the
9408 // mantissa bits are '1' (to check the shift logic).
9409 ECMA262ToInt32Helper(0xfffff800, 0xfffffffffffff800);
9410 ECMA262ToInt32Helper(-0xfffff800, 0xfffffffffffff800 * -1.0);
9411
9412 // The largest conversion which doesn't produce a zero result.
9413 ECMA262ToInt32Helper(0x80000000, 0x001fffffffffffff * pow(2.0, 31));
9414 ECMA262ToInt32Helper(-0x80000000, 0x001fffffffffffff * -pow(2.0, 31));
9415
9416 // Some large conversions to check the shifting function.
9417 ECMA262ToInt32Helper(0x6789abcd, 0x001123456789abcd);
9418 ECMA262ToInt32Helper(0x12345678, 0x001123456789abcd * pow(2.0, -20));
9419 ECMA262ToInt32Helper(0x891a2b3c, 0x001123456789abcd * pow(2.0, -21));
9420 ECMA262ToInt32Helper(0x11234567, 0x001123456789abcd * pow(2.0, -24));
9421 ECMA262ToInt32Helper(-0x6789abcd, 0x001123456789abcd * -1.0);
9422 ECMA262ToInt32Helper(-0x12345678, 0x001123456789abcd * -pow(2.0, -20));
9423 ECMA262ToInt32Helper(-0x891a2b3c, 0x001123456789abcd * -pow(2.0, -21));
9424 ECMA262ToInt32Helper(-0x11234567, 0x001123456789abcd * -pow(2.0, -24));
9425
9426 // ==== 84 <= exponent ====
9427
9428 // The smallest conversion which produces a zero result by shifting the
9429 // mantissa out of the int32_t range.
9430 ECMA262ToInt32Helper(0, pow(2.0, 32));
9431 ECMA262ToInt32Helper(0, -pow(2.0, 32));
9432
9433 // Some very large conversions.
9434 ECMA262ToInt32Helper(0, 0x001fffffffffffff * pow(2.0, 32));
9435 ECMA262ToInt32Helper(0, 0x001fffffffffffff * -pow(2.0, 32));
9436 ECMA262ToInt32Helper(0, DBL_MAX);
9437 ECMA262ToInt32Helper(0, -DBL_MAX);
9438
9439 // ==== Special values. ====
9440
9441 ECMA262ToInt32Helper(0, std::numeric_limits<double>::infinity());
9442 ECMA262ToInt32Helper(0, -std::numeric_limits<double>::infinity());
9443 ECMA262ToInt32Helper(0, std::numeric_limits<double>::quiet_NaN());
9444 ECMA262ToInt32Helper(0, -std::numeric_limits<double>::quiet_NaN());
9445 ECMA262ToInt32Helper(0, std::numeric_limits<double>::signaling_NaN());
9446 ECMA262ToInt32Helper(0, -std::numeric_limits<double>::signaling_NaN());
9447 }
9448
9449
9450 static void AbsHelperX(int64_t value) { 9349 static void AbsHelperX(int64_t value) {
9451 int64_t expected; 9350 int64_t expected;
9452 9351
9453 SETUP(); 9352 SETUP();
9454 START(); 9353 START();
9455 9354
9456 Label fail; 9355 Label fail;
9457 Label done; 9356 Label done;
9458 9357
9459 __ Mov(x0, 0); 9358 __ Mov(x0, 0);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
9566 AbsHelperX(-42); 9465 AbsHelperX(-42);
9567 AbsHelperX(kXMinInt); 9466 AbsHelperX(kXMinInt);
9568 AbsHelperX(kXMaxInt); 9467 AbsHelperX(kXMaxInt);
9569 9468
9570 AbsHelperW(0); 9469 AbsHelperW(0);
9571 AbsHelperW(42); 9470 AbsHelperW(42);
9572 AbsHelperW(-42); 9471 AbsHelperW(-42);
9573 AbsHelperW(kWMinInt); 9472 AbsHelperW(kWMinInt);
9574 AbsHelperW(kWMaxInt); 9473 AbsHelperW(kWMaxInt);
9575 } 9474 }
OLDNEW
« no previous file with comments | « test/cctest/cctest.gyp ('k') | test/cctest/test-code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698