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

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

Issue 1506753002: [test] Test expectations in cctest should use CHECK and not DCHECK. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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 | « test/cctest/test-assembler-arm.cc ('k') | test/cctest/test-assembler-mips.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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 113
114 #define INIT_V8() \ 114 #define INIT_V8() \
115 CcTest::InitializeVM(); \ 115 CcTest::InitializeVM(); \
116 116
117 #ifdef USE_SIMULATOR 117 #ifdef USE_SIMULATOR
118 118
119 // Run tests with the simulator. 119 // Run tests with the simulator.
120 #define SETUP_SIZE(buf_size) \ 120 #define SETUP_SIZE(buf_size) \
121 Isolate* isolate = CcTest::i_isolate(); \ 121 Isolate* isolate = CcTest::i_isolate(); \
122 HandleScope scope(isolate); \ 122 HandleScope scope(isolate); \
123 DCHECK(isolate != NULL); \ 123 CHECK(isolate != NULL); \
124 byte* buf = new byte[buf_size]; \ 124 byte* buf = new byte[buf_size]; \
125 MacroAssembler masm(isolate, buf, buf_size, \ 125 MacroAssembler masm(isolate, buf, buf_size, \
126 v8::internal::CodeObjectRequired::kYes); \ 126 v8::internal::CodeObjectRequired::kYes); \
127 Decoder<DispatchingDecoderVisitor>* decoder = \ 127 Decoder<DispatchingDecoderVisitor>* decoder = \
128 new Decoder<DispatchingDecoderVisitor>(); \ 128 new Decoder<DispatchingDecoderVisitor>(); \
129 Simulator simulator(decoder); \ 129 Simulator simulator(decoder); \
130 PrintDisassembler* pdis = NULL; \ 130 PrintDisassembler* pdis = NULL; \
131 RegisterDump core; 131 RegisterDump core;
132 132
133 /* if (Cctest::trace_sim()) { \ 133 /* if (Cctest::trace_sim()) { \
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 168
169 #define TEARDOWN() \ 169 #define TEARDOWN() \
170 delete pdis; \ 170 delete pdis; \
171 delete[] buf; 171 delete[] buf;
172 172
173 #else // ifdef USE_SIMULATOR. 173 #else // ifdef USE_SIMULATOR.
174 // Run the test on real hardware or models. 174 // Run the test on real hardware or models.
175 #define SETUP_SIZE(buf_size) \ 175 #define SETUP_SIZE(buf_size) \
176 Isolate* isolate = CcTest::i_isolate(); \ 176 Isolate* isolate = CcTest::i_isolate(); \
177 HandleScope scope(isolate); \ 177 HandleScope scope(isolate); \
178 DCHECK(isolate != NULL); \ 178 CHECK(isolate != NULL); \
179 byte* buf = new byte[buf_size]; \ 179 byte* buf = new byte[buf_size]; \
180 MacroAssembler masm(isolate, buf, buf_size, \ 180 MacroAssembler masm(isolate, buf, buf_size, \
181 v8::internal::CodeObjectRequired::kYes); \ 181 v8::internal::CodeObjectRequired::kYes); \
182 RegisterDump core; 182 RegisterDump core;
183 183
184 #define RESET() \ 184 #define RESET() \
185 __ Reset(); \ 185 __ Reset(); \
186 /* Reset the machine state (like simulator.ResetState()). */ \ 186 /* Reset the machine state (like simulator.ResetState()). */ \
187 __ Msr(NZCV, xzr); \ 187 __ Msr(NZCV, xzr); \
188 __ Msr(FPCR, xzr); 188 __ Msr(FPCR, xzr);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 #define CHECK_EQUAL_FP32(expected, result) \ 227 #define CHECK_EQUAL_FP32(expected, result) \
228 CHECK(EqualFP32(expected, &core, result)) 228 CHECK(EqualFP32(expected, &core, result))
229 229
230 #define CHECK_EQUAL_64(expected, result) \ 230 #define CHECK_EQUAL_64(expected, result) \
231 CHECK(Equal64(expected, &core, result)) 231 CHECK(Equal64(expected, &core, result))
232 232
233 #define CHECK_EQUAL_FP64(expected, result) \ 233 #define CHECK_EQUAL_FP64(expected, result) \
234 CHECK(EqualFP64(expected, &core, result)) 234 CHECK(EqualFP64(expected, &core, result))
235 235
236 #ifdef DEBUG 236 #ifdef DEBUG
237 #define DCHECK_LITERAL_POOL_SIZE(expected) \ 237 #define CHECK_LITERAL_POOL_SIZE(expected) \
238 CHECK((expected) == (__ LiteralPoolSize())) 238 CHECK((expected) == (__ LiteralPoolSize()))
239 #else 239 #else
240 #define DCHECK_LITERAL_POOL_SIZE(expected) \ 240 #define CHECK_LITERAL_POOL_SIZE(expected) ((void)0)
241 ((void) 0)
242 #endif 241 #endif
243 242
244 243
245 TEST(stack_ops) { 244 TEST(stack_ops) {
246 INIT_V8(); 245 INIT_V8();
247 SETUP(); 246 SETUP();
248 247
249 START(); 248 START();
250 // save csp. 249 // save csp.
251 __ Mov(x29, csp); 250 __ Mov(x29, csp);
(...skipping 3045 matching lines...) Expand 10 before | Expand all | Expand 10 after
3297 CHECK_EQUAL_FP64(1.234, d13); 3296 CHECK_EQUAL_FP64(1.234, d13);
3298 CHECK_EQUAL_FP32(2.5, s25); 3297 CHECK_EQUAL_FP32(2.5, s25);
3299 3298
3300 TEARDOWN(); 3299 TEARDOWN();
3301 } 3300 }
3302 3301
3303 3302
3304 static void LdrLiteralRangeHelper(ptrdiff_t range_, 3303 static void LdrLiteralRangeHelper(ptrdiff_t range_,
3305 LiteralPoolEmitOption option, 3304 LiteralPoolEmitOption option,
3306 bool expect_dump) { 3305 bool expect_dump) {
3307 DCHECK(range_ > 0); 3306 CHECK(range_ > 0);
3308 SETUP_SIZE(range_ + 1024); 3307 SETUP_SIZE(range_ + 1024);
3309 3308
3310 Label label_1, label_2; 3309 Label label_1, label_2;
3311 3310
3312 size_t range = static_cast<size_t>(range_); 3311 size_t range = static_cast<size_t>(range_);
3313 size_t code_size = 0; 3312 size_t code_size = 0;
3314 size_t pool_guard_size; 3313 size_t pool_guard_size;
3315 3314
3316 if (option == NoJumpRequired) { 3315 if (option == NoJumpRequired) {
3317 // Space for an explicit branch. 3316 // Space for an explicit branch.
3318 pool_guard_size = sizeof(Instr); 3317 pool_guard_size = sizeof(Instr);
3319 } else { 3318 } else {
3320 pool_guard_size = 0; 3319 pool_guard_size = 0;
3321 } 3320 }
3322 3321
3323 START(); 3322 START();
3324 // Force a pool dump so the pool starts off empty. 3323 // Force a pool dump so the pool starts off empty.
3325 __ EmitLiteralPool(JumpRequired); 3324 __ EmitLiteralPool(JumpRequired);
3326 DCHECK_LITERAL_POOL_SIZE(0); 3325 CHECK_LITERAL_POOL_SIZE(0);
3327 3326
3328 __ Ldr(x0, 0x1234567890abcdefUL); 3327 __ Ldr(x0, 0x1234567890abcdefUL);
3329 __ Ldr(w1, 0xfedcba09); 3328 __ Ldr(w1, 0xfedcba09);
3330 __ Ldr(d0, 1.234); 3329 __ Ldr(d0, 1.234);
3331 __ Ldr(s1, 2.5); 3330 __ Ldr(s1, 2.5);
3332 DCHECK_LITERAL_POOL_SIZE(4); 3331 CHECK_LITERAL_POOL_SIZE(4);
3333 3332
3334 code_size += 4 * sizeof(Instr); 3333 code_size += 4 * sizeof(Instr);
3335 3334
3336 // Check that the requested range (allowing space for a branch over the pool) 3335 // Check that the requested range (allowing space for a branch over the pool)
3337 // can be handled by this test. 3336 // can be handled by this test.
3338 DCHECK((code_size + pool_guard_size) <= range); 3337 CHECK((code_size + pool_guard_size) <= range);
3339 3338
3340 // Emit NOPs up to 'range', leaving space for the pool guard. 3339 // Emit NOPs up to 'range', leaving space for the pool guard.
3341 while ((code_size + pool_guard_size) < range) { 3340 while ((code_size + pool_guard_size) < range) {
3342 __ Nop(); 3341 __ Nop();
3343 code_size += sizeof(Instr); 3342 code_size += sizeof(Instr);
3344 } 3343 }
3345 3344
3346 // Emit the guard sequence before the literal pool. 3345 // Emit the guard sequence before the literal pool.
3347 if (option == NoJumpRequired) { 3346 if (option == NoJumpRequired) {
3348 __ B(&label_1); 3347 __ B(&label_1);
3349 code_size += sizeof(Instr); 3348 code_size += sizeof(Instr);
3350 } 3349 }
3351 3350
3352 DCHECK(code_size == range); 3351 CHECK(code_size == range);
3353 DCHECK_LITERAL_POOL_SIZE(4); 3352 CHECK_LITERAL_POOL_SIZE(4);
3354 3353
3355 // Possibly generate a literal pool. 3354 // Possibly generate a literal pool.
3356 __ CheckLiteralPool(option); 3355 __ CheckLiteralPool(option);
3357 __ Bind(&label_1); 3356 __ Bind(&label_1);
3358 if (expect_dump) { 3357 if (expect_dump) {
3359 DCHECK_LITERAL_POOL_SIZE(0); 3358 CHECK_LITERAL_POOL_SIZE(0);
3360 } else { 3359 } else {
3361 DCHECK_LITERAL_POOL_SIZE(4); 3360 CHECK_LITERAL_POOL_SIZE(4);
3362 } 3361 }
3363 3362
3364 // Force a pool flush to check that a second pool functions correctly. 3363 // Force a pool flush to check that a second pool functions correctly.
3365 __ EmitLiteralPool(JumpRequired); 3364 __ EmitLiteralPool(JumpRequired);
3366 DCHECK_LITERAL_POOL_SIZE(0); 3365 CHECK_LITERAL_POOL_SIZE(0);
3367 3366
3368 // These loads should be after the pool (and will require a new one). 3367 // These loads should be after the pool (and will require a new one).
3369 __ Ldr(x4, 0x34567890abcdef12UL); 3368 __ Ldr(x4, 0x34567890abcdef12UL);
3370 __ Ldr(w5, 0xdcba09fe); 3369 __ Ldr(w5, 0xdcba09fe);
3371 __ Ldr(d4, 123.4); 3370 __ Ldr(d4, 123.4);
3372 __ Ldr(s5, 250.0); 3371 __ Ldr(s5, 250.0);
3373 DCHECK_LITERAL_POOL_SIZE(4); 3372 CHECK_LITERAL_POOL_SIZE(4);
3374 END(); 3373 END();
3375 3374
3376 RUN(); 3375 RUN();
3377 3376
3378 // Check that the literals loaded correctly. 3377 // Check that the literals loaded correctly.
3379 CHECK_EQUAL_64(0x1234567890abcdefUL, x0); 3378 CHECK_EQUAL_64(0x1234567890abcdefUL, x0);
3380 CHECK_EQUAL_64(0xfedcba09, x1); 3379 CHECK_EQUAL_64(0xfedcba09, x1);
3381 CHECK_EQUAL_FP64(1.234, d0); 3380 CHECK_EQUAL_FP64(1.234, d0);
3382 CHECK_EQUAL_FP32(2.5, s1); 3381 CHECK_EQUAL_FP32(2.5, s1);
3383 CHECK_EQUAL_64(0x34567890abcdef12UL, x4); 3382 CHECK_EQUAL_64(0x34567890abcdef12UL, x4);
(...skipping 2057 matching lines...) Expand 10 before | Expand all | Expand 10 after
5441 5440
5442 TEST(fmadd_fmsub_double_nans) { 5441 TEST(fmadd_fmsub_double_nans) {
5443 INIT_V8(); 5442 INIT_V8();
5444 // Make sure that NaN propagation works correctly. 5443 // Make sure that NaN propagation works correctly.
5445 double s1 = rawbits_to_double(0x7ff5555511111111); 5444 double s1 = rawbits_to_double(0x7ff5555511111111);
5446 double s2 = rawbits_to_double(0x7ff5555522222222); 5445 double s2 = rawbits_to_double(0x7ff5555522222222);
5447 double sa = rawbits_to_double(0x7ff55555aaaaaaaa); 5446 double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
5448 double q1 = rawbits_to_double(0x7ffaaaaa11111111); 5447 double q1 = rawbits_to_double(0x7ffaaaaa11111111);
5449 double q2 = rawbits_to_double(0x7ffaaaaa22222222); 5448 double q2 = rawbits_to_double(0x7ffaaaaa22222222);
5450 double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa); 5449 double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
5451 DCHECK(IsSignallingNaN(s1)); 5450 CHECK(IsSignallingNaN(s1));
5452 DCHECK(IsSignallingNaN(s2)); 5451 CHECK(IsSignallingNaN(s2));
5453 DCHECK(IsSignallingNaN(sa)); 5452 CHECK(IsSignallingNaN(sa));
5454 DCHECK(IsQuietNaN(q1)); 5453 CHECK(IsQuietNaN(q1));
5455 DCHECK(IsQuietNaN(q2)); 5454 CHECK(IsQuietNaN(q2));
5456 DCHECK(IsQuietNaN(qa)); 5455 CHECK(IsQuietNaN(qa));
5457 5456
5458 // The input NaNs after passing through ProcessNaN. 5457 // The input NaNs after passing through ProcessNaN.
5459 double s1_proc = rawbits_to_double(0x7ffd555511111111); 5458 double s1_proc = rawbits_to_double(0x7ffd555511111111);
5460 double s2_proc = rawbits_to_double(0x7ffd555522222222); 5459 double s2_proc = rawbits_to_double(0x7ffd555522222222);
5461 double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa); 5460 double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa);
5462 double q1_proc = q1; 5461 double q1_proc = q1;
5463 double q2_proc = q2; 5462 double q2_proc = q2;
5464 double qa_proc = qa; 5463 double qa_proc = qa;
5465 DCHECK(IsQuietNaN(s1_proc)); 5464 CHECK(IsQuietNaN(s1_proc));
5466 DCHECK(IsQuietNaN(s2_proc)); 5465 CHECK(IsQuietNaN(s2_proc));
5467 DCHECK(IsQuietNaN(sa_proc)); 5466 CHECK(IsQuietNaN(sa_proc));
5468 DCHECK(IsQuietNaN(q1_proc)); 5467 CHECK(IsQuietNaN(q1_proc));
5469 DCHECK(IsQuietNaN(q2_proc)); 5468 CHECK(IsQuietNaN(q2_proc));
5470 DCHECK(IsQuietNaN(qa_proc)); 5469 CHECK(IsQuietNaN(qa_proc));
5471 5470
5472 // Negated NaNs as it would be done on ARMv8 hardware. 5471 // Negated NaNs as it would be done on ARMv8 hardware.
5473 double s1_proc_neg = rawbits_to_double(0xfffd555511111111); 5472 double s1_proc_neg = rawbits_to_double(0xfffd555511111111);
5474 double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa); 5473 double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa);
5475 double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111); 5474 double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111);
5476 double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa); 5475 double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa);
5477 DCHECK(IsQuietNaN(s1_proc_neg)); 5476 CHECK(IsQuietNaN(s1_proc_neg));
5478 DCHECK(IsQuietNaN(sa_proc_neg)); 5477 CHECK(IsQuietNaN(sa_proc_neg));
5479 DCHECK(IsQuietNaN(q1_proc_neg)); 5478 CHECK(IsQuietNaN(q1_proc_neg));
5480 DCHECK(IsQuietNaN(qa_proc_neg)); 5479 CHECK(IsQuietNaN(qa_proc_neg));
5481 5480
5482 // Quiet NaNs are propagated. 5481 // Quiet NaNs are propagated.
5483 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5482 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
5484 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); 5483 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc);
5485 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5484 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5486 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5485 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
5487 FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5486 FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5488 FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5487 FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5489 FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5488 FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5490 5489
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5524 5523
5525 TEST(fmadd_fmsub_float_nans) { 5524 TEST(fmadd_fmsub_float_nans) {
5526 INIT_V8(); 5525 INIT_V8();
5527 // Make sure that NaN propagation works correctly. 5526 // Make sure that NaN propagation works correctly.
5528 float s1 = rawbits_to_float(0x7f951111); 5527 float s1 = rawbits_to_float(0x7f951111);
5529 float s2 = rawbits_to_float(0x7f952222); 5528 float s2 = rawbits_to_float(0x7f952222);
5530 float sa = rawbits_to_float(0x7f95aaaa); 5529 float sa = rawbits_to_float(0x7f95aaaa);
5531 float q1 = rawbits_to_float(0x7fea1111); 5530 float q1 = rawbits_to_float(0x7fea1111);
5532 float q2 = rawbits_to_float(0x7fea2222); 5531 float q2 = rawbits_to_float(0x7fea2222);
5533 float qa = rawbits_to_float(0x7feaaaaa); 5532 float qa = rawbits_to_float(0x7feaaaaa);
5534 DCHECK(IsSignallingNaN(s1)); 5533 CHECK(IsSignallingNaN(s1));
5535 DCHECK(IsSignallingNaN(s2)); 5534 CHECK(IsSignallingNaN(s2));
5536 DCHECK(IsSignallingNaN(sa)); 5535 CHECK(IsSignallingNaN(sa));
5537 DCHECK(IsQuietNaN(q1)); 5536 CHECK(IsQuietNaN(q1));
5538 DCHECK(IsQuietNaN(q2)); 5537 CHECK(IsQuietNaN(q2));
5539 DCHECK(IsQuietNaN(qa)); 5538 CHECK(IsQuietNaN(qa));
5540 5539
5541 // The input NaNs after passing through ProcessNaN. 5540 // The input NaNs after passing through ProcessNaN.
5542 float s1_proc = rawbits_to_float(0x7fd51111); 5541 float s1_proc = rawbits_to_float(0x7fd51111);
5543 float s2_proc = rawbits_to_float(0x7fd52222); 5542 float s2_proc = rawbits_to_float(0x7fd52222);
5544 float sa_proc = rawbits_to_float(0x7fd5aaaa); 5543 float sa_proc = rawbits_to_float(0x7fd5aaaa);
5545 float q1_proc = q1; 5544 float q1_proc = q1;
5546 float q2_proc = q2; 5545 float q2_proc = q2;
5547 float qa_proc = qa; 5546 float qa_proc = qa;
5548 DCHECK(IsQuietNaN(s1_proc)); 5547 CHECK(IsQuietNaN(s1_proc));
5549 DCHECK(IsQuietNaN(s2_proc)); 5548 CHECK(IsQuietNaN(s2_proc));
5550 DCHECK(IsQuietNaN(sa_proc)); 5549 CHECK(IsQuietNaN(sa_proc));
5551 DCHECK(IsQuietNaN(q1_proc)); 5550 CHECK(IsQuietNaN(q1_proc));
5552 DCHECK(IsQuietNaN(q2_proc)); 5551 CHECK(IsQuietNaN(q2_proc));
5553 DCHECK(IsQuietNaN(qa_proc)); 5552 CHECK(IsQuietNaN(qa_proc));
5554 5553
5555 // Negated NaNs as it would be done on ARMv8 hardware. 5554 // Negated NaNs as it would be done on ARMv8 hardware.
5556 float s1_proc_neg = rawbits_to_float(0xffd51111); 5555 float s1_proc_neg = rawbits_to_float(0xffd51111);
5557 float sa_proc_neg = rawbits_to_float(0xffd5aaaa); 5556 float sa_proc_neg = rawbits_to_float(0xffd5aaaa);
5558 float q1_proc_neg = rawbits_to_float(0xffea1111); 5557 float q1_proc_neg = rawbits_to_float(0xffea1111);
5559 float qa_proc_neg = rawbits_to_float(0xffeaaaaa); 5558 float qa_proc_neg = rawbits_to_float(0xffeaaaaa);
5560 DCHECK(IsQuietNaN(s1_proc_neg)); 5559 CHECK(IsQuietNaN(s1_proc_neg));
5561 DCHECK(IsQuietNaN(sa_proc_neg)); 5560 CHECK(IsQuietNaN(sa_proc_neg));
5562 DCHECK(IsQuietNaN(q1_proc_neg)); 5561 CHECK(IsQuietNaN(q1_proc_neg));
5563 DCHECK(IsQuietNaN(qa_proc_neg)); 5562 CHECK(IsQuietNaN(qa_proc_neg));
5564 5563
5565 // Quiet NaNs are propagated. 5564 // Quiet NaNs are propagated.
5566 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5565 FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
5567 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc); 5566 FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc);
5568 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5567 FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5569 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc); 5568 FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
5570 FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5569 FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5571 FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5570 FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5572 FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg); 5571 FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
5573 5572
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
5771 5770
5772 TEST(fmax_fmin_d) { 5771 TEST(fmax_fmin_d) {
5773 INIT_V8(); 5772 INIT_V8();
5774 // Use non-standard NaNs to check that the payload bits are preserved. 5773 // Use non-standard NaNs to check that the payload bits are preserved.
5775 double snan = rawbits_to_double(0x7ff5555512345678); 5774 double snan = rawbits_to_double(0x7ff5555512345678);
5776 double qnan = rawbits_to_double(0x7ffaaaaa87654321); 5775 double qnan = rawbits_to_double(0x7ffaaaaa87654321);
5777 5776
5778 double snan_processed = rawbits_to_double(0x7ffd555512345678); 5777 double snan_processed = rawbits_to_double(0x7ffd555512345678);
5779 double qnan_processed = qnan; 5778 double qnan_processed = qnan;
5780 5779
5781 DCHECK(IsSignallingNaN(snan)); 5780 CHECK(IsSignallingNaN(snan));
5782 DCHECK(IsQuietNaN(qnan)); 5781 CHECK(IsQuietNaN(qnan));
5783 DCHECK(IsQuietNaN(snan_processed)); 5782 CHECK(IsQuietNaN(snan_processed));
5784 DCHECK(IsQuietNaN(qnan_processed)); 5783 CHECK(IsQuietNaN(qnan_processed));
5785 5784
5786 // Bootstrap tests. 5785 // Bootstrap tests.
5787 FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0); 5786 FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0);
5788 FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1); 5787 FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1);
5789 FminFmaxDoubleHelper(kFP64PositiveInfinity, kFP64NegativeInfinity, 5788 FminFmaxDoubleHelper(kFP64PositiveInfinity, kFP64NegativeInfinity,
5790 kFP64NegativeInfinity, kFP64PositiveInfinity, 5789 kFP64NegativeInfinity, kFP64PositiveInfinity,
5791 kFP64NegativeInfinity, kFP64PositiveInfinity); 5790 kFP64NegativeInfinity, kFP64PositiveInfinity);
5792 FminFmaxDoubleHelper(snan, 0, 5791 FminFmaxDoubleHelper(snan, 0,
5793 snan_processed, snan_processed, 5792 snan_processed, snan_processed,
5794 snan_processed, snan_processed); 5793 snan_processed, snan_processed);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
5856 5855
5857 TEST(fmax_fmin_s) { 5856 TEST(fmax_fmin_s) {
5858 INIT_V8(); 5857 INIT_V8();
5859 // Use non-standard NaNs to check that the payload bits are preserved. 5858 // Use non-standard NaNs to check that the payload bits are preserved.
5860 float snan = rawbits_to_float(0x7f951234); 5859 float snan = rawbits_to_float(0x7f951234);
5861 float qnan = rawbits_to_float(0x7fea8765); 5860 float qnan = rawbits_to_float(0x7fea8765);
5862 5861
5863 float snan_processed = rawbits_to_float(0x7fd51234); 5862 float snan_processed = rawbits_to_float(0x7fd51234);
5864 float qnan_processed = qnan; 5863 float qnan_processed = qnan;
5865 5864
5866 DCHECK(IsSignallingNaN(snan)); 5865 CHECK(IsSignallingNaN(snan));
5867 DCHECK(IsQuietNaN(qnan)); 5866 CHECK(IsQuietNaN(qnan));
5868 DCHECK(IsQuietNaN(snan_processed)); 5867 CHECK(IsQuietNaN(snan_processed));
5869 DCHECK(IsQuietNaN(qnan_processed)); 5868 CHECK(IsQuietNaN(qnan_processed));
5870 5869
5871 // Bootstrap tests. 5870 // Bootstrap tests.
5872 FminFmaxFloatHelper(0, 0, 0, 0, 0, 0); 5871 FminFmaxFloatHelper(0, 0, 0, 0, 0, 0);
5873 FminFmaxFloatHelper(0, 1, 0, 1, 0, 1); 5872 FminFmaxFloatHelper(0, 1, 0, 1, 0, 1);
5874 FminFmaxFloatHelper(kFP32PositiveInfinity, kFP32NegativeInfinity, 5873 FminFmaxFloatHelper(kFP32PositiveInfinity, kFP32NegativeInfinity,
5875 kFP32NegativeInfinity, kFP32PositiveInfinity, 5874 kFP32NegativeInfinity, kFP32PositiveInfinity,
5876 kFP32NegativeInfinity, kFP32PositiveInfinity); 5875 kFP32NegativeInfinity, kFP32PositiveInfinity);
5877 FminFmaxFloatHelper(snan, 0, 5876 FminFmaxFloatHelper(snan, 0,
5878 snan_processed, snan_processed, 5877 snan_processed, snan_processed,
5879 snan_processed, snan_processed); 5878 snan_processed, snan_processed);
(...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after
6831 {rawbits_to_double(0x7ff02468bfffffff), rawbits_to_float(0x7fc12345)}, 6830 {rawbits_to_double(0x7ff02468bfffffff), rawbits_to_float(0x7fc12345)},
6832 {rawbits_to_double(0x7ff000001fffffff), rawbits_to_float(0x7fc00000)}, 6831 {rawbits_to_double(0x7ff000001fffffff), rawbits_to_float(0x7fc00000)},
6833 }; 6832 };
6834 int count = sizeof(test) / sizeof(test[0]); 6833 int count = sizeof(test) / sizeof(test[0]);
6835 6834
6836 for (int i = 0; i < count; i++) { 6835 for (int i = 0; i < count; i++) {
6837 double in = test[i].in; 6836 double in = test[i].in;
6838 float expected = test[i].expected; 6837 float expected = test[i].expected;
6839 6838
6840 // We only expect positive input. 6839 // We only expect positive input.
6841 DCHECK(std::signbit(in) == 0); 6840 CHECK(std::signbit(in) == 0);
6842 DCHECK(std::signbit(expected) == 0); 6841 CHECK(std::signbit(expected) == 0);
6843 6842
6844 SETUP(); 6843 SETUP();
6845 START(); 6844 START();
6846 6845
6847 __ Fmov(d10, in); 6846 __ Fmov(d10, in);
6848 __ Fcvt(s20, d10); 6847 __ Fcvt(s20, d10);
6849 6848
6850 __ Fmov(d11, -in); 6849 __ Fmov(d11, -in);
6851 __ Fcvt(s21, d11); 6850 __ Fcvt(s21, d11);
6852 6851
(...skipping 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after
8543 __ Claim(4); 8542 __ Claim(4);
8544 8543
8545 // Mix with other stack operations. 8544 // Mix with other stack operations.
8546 // After this section: 8545 // After this section:
8547 // x0-x3 should be unchanged. 8546 // x0-x3 should be unchanged.
8548 // x6 should match x1[31:0]:x0[63:32] 8547 // x6 should match x1[31:0]:x0[63:32]
8549 // w7 should match x1[15:0]:x0[63:48] 8548 // w7 should match x1[15:0]:x0[63:48]
8550 __ Poke(x1, 8); 8549 __ Poke(x1, 8);
8551 __ Poke(x0, 0); 8550 __ Poke(x0, 0);
8552 { 8551 {
8553 DCHECK(__ StackPointer().Is(csp)); 8552 CHECK(__ StackPointer().Is(csp));
8554 __ Mov(x4, __ StackPointer()); 8553 __ Mov(x4, __ StackPointer());
8555 __ SetStackPointer(x4); 8554 __ SetStackPointer(x4);
8556 8555
8557 __ Poke(wzr, 0); // Clobber the space we're about to drop. 8556 __ Poke(wzr, 0); // Clobber the space we're about to drop.
8558 __ Drop(1, kWRegSize); 8557 __ Drop(1, kWRegSize);
8559 __ Peek(x6, 0); 8558 __ Peek(x6, 0);
8560 __ Claim(1); 8559 __ Claim(1);
8561 __ Peek(w7, 10); 8560 __ Peek(w7, 10);
8562 __ Poke(x3, 28); 8561 __ Poke(x3, 28);
8563 __ Poke(xzr, 0); // Clobber the space we're about to drop. 8562 __ Poke(xzr, 0); // Clobber the space we're about to drop.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
8640 allowed); 8639 allowed);
8641 8640
8642 // The literal base is chosen to have two useful properties: 8641 // The literal base is chosen to have two useful properties:
8643 // * When multiplied by small values (such as a register index), this value 8642 // * When multiplied by small values (such as a register index), this value
8644 // is clearly readable in the result. 8643 // is clearly readable in the result.
8645 // * The value is not formed from repeating fixed-size smaller values, so it 8644 // * The value is not formed from repeating fixed-size smaller values, so it
8646 // can be used to detect endianness-related errors. 8645 // can be used to detect endianness-related errors.
8647 uint64_t literal_base = 0x0100001000100101UL; 8646 uint64_t literal_base = 0x0100001000100101UL;
8648 8647
8649 { 8648 {
8650 DCHECK(__ StackPointer().Is(csp)); 8649 CHECK(__ StackPointer().Is(csp));
8651 __ Mov(jssp, __ StackPointer()); 8650 __ Mov(jssp, __ StackPointer());
8652 __ SetStackPointer(jssp); 8651 __ SetStackPointer(jssp);
8653 8652
8654 int i; 8653 int i;
8655 8654
8656 // Initialize the registers. 8655 // Initialize the registers.
8657 for (i = 0; i < reg_count; i++) { 8656 for (i = 0; i < reg_count; i++) {
8658 // Always write into the X register, to ensure that the upper word is 8657 // Always write into the X register, to ensure that the upper word is
8659 // properly ignored by Push when testing W registers. 8658 // properly ignored by Push when testing W registers.
8660 if (!x[i].IsZero()) { 8659 if (!x[i].IsZero()) {
8661 __ Mov(x[i], literal_base * i); 8660 __ Mov(x[i], literal_base * i);
8662 } 8661 }
8663 } 8662 }
8664 8663
8665 // Claim memory first, as requested. 8664 // Claim memory first, as requested.
8666 __ Claim(claim, kByteSizeInBytes); 8665 __ Claim(claim, kByteSizeInBytes);
8667 8666
8668 switch (push_method) { 8667 switch (push_method) {
8669 case PushPopByFour: 8668 case PushPopByFour:
8670 // Push high-numbered registers first (to the highest addresses). 8669 // Push high-numbered registers first (to the highest addresses).
8671 for (i = reg_count; i >= 4; i -= 4) { 8670 for (i = reg_count; i >= 4; i -= 4) {
8672 __ Push(r[i-1], r[i-2], r[i-3], r[i-4]); 8671 __ Push(r[i-1], r[i-2], r[i-3], r[i-4]);
8673 } 8672 }
8674 // Finish off the leftovers. 8673 // Finish off the leftovers.
8675 switch (i) { 8674 switch (i) {
8676 case 3: __ Push(r[2], r[1], r[0]); break; 8675 case 3: __ Push(r[2], r[1], r[0]); break;
8677 case 2: __ Push(r[1], r[0]); break; 8676 case 2: __ Push(r[1], r[0]); break;
8678 case 1: __ Push(r[0]); break; 8677 case 1: __ Push(r[0]); break;
8679 default: DCHECK(i == 0); break; 8678 default:
8679 CHECK(i == 0);
8680 break;
8680 } 8681 }
8681 break; 8682 break;
8682 case PushPopRegList: 8683 case PushPopRegList:
8683 __ PushSizeRegList(list, reg_size); 8684 __ PushSizeRegList(list, reg_size);
8684 break; 8685 break;
8685 } 8686 }
8686 8687
8687 // Clobber all the registers, to ensure that they get repopulated by Pop. 8688 // Clobber all the registers, to ensure that they get repopulated by Pop.
8688 Clobber(&masm, list); 8689 Clobber(&masm, list);
8689 8690
8690 switch (pop_method) { 8691 switch (pop_method) {
8691 case PushPopByFour: 8692 case PushPopByFour:
8692 // Pop low-numbered registers first (from the lowest addresses). 8693 // Pop low-numbered registers first (from the lowest addresses).
8693 for (i = 0; i <= (reg_count-4); i += 4) { 8694 for (i = 0; i <= (reg_count-4); i += 4) {
8694 __ Pop(r[i], r[i+1], r[i+2], r[i+3]); 8695 __ Pop(r[i], r[i+1], r[i+2], r[i+3]);
8695 } 8696 }
8696 // Finish off the leftovers. 8697 // Finish off the leftovers.
8697 switch (reg_count - i) { 8698 switch (reg_count - i) {
8698 case 3: __ Pop(r[i], r[i+1], r[i+2]); break; 8699 case 3: __ Pop(r[i], r[i+1], r[i+2]); break;
8699 case 2: __ Pop(r[i], r[i+1]); break; 8700 case 2: __ Pop(r[i], r[i+1]); break;
8700 case 1: __ Pop(r[i]); break; 8701 case 1: __ Pop(r[i]); break;
8701 default: DCHECK(i == reg_count); break; 8702 default:
8703 CHECK(i == reg_count);
8704 break;
8702 } 8705 }
8703 break; 8706 break;
8704 case PushPopRegList: 8707 case PushPopRegList:
8705 __ PopSizeRegList(list, reg_size); 8708 __ PopSizeRegList(list, reg_size);
8706 break; 8709 break;
8707 } 8710 }
8708 8711
8709 // Drop memory to restore jssp. 8712 // Drop memory to restore jssp.
8710 __ Drop(claim, kByteSizeInBytes); 8713 __ Drop(claim, kByteSizeInBytes);
8711 8714
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
8822 // The literal base is chosen to have two useful properties: 8825 // The literal base is chosen to have two useful properties:
8823 // * When multiplied (using an integer) by small values (such as a register 8826 // * When multiplied (using an integer) by small values (such as a register
8824 // index), this value is clearly readable in the result. 8827 // index), this value is clearly readable in the result.
8825 // * The value is not formed from repeating fixed-size smaller values, so it 8828 // * The value is not formed from repeating fixed-size smaller values, so it
8826 // can be used to detect endianness-related errors. 8829 // can be used to detect endianness-related errors.
8827 // * It is never a floating-point NaN, and will therefore always compare 8830 // * It is never a floating-point NaN, and will therefore always compare
8828 // equal to itself. 8831 // equal to itself.
8829 uint64_t literal_base = 0x0100001000100101UL; 8832 uint64_t literal_base = 0x0100001000100101UL;
8830 8833
8831 { 8834 {
8832 DCHECK(__ StackPointer().Is(csp)); 8835 CHECK(__ StackPointer().Is(csp));
8833 __ Mov(jssp, __ StackPointer()); 8836 __ Mov(jssp, __ StackPointer());
8834 __ SetStackPointer(jssp); 8837 __ SetStackPointer(jssp);
8835 8838
8836 int i; 8839 int i;
8837 8840
8838 // Initialize the registers, using X registers to load the literal. 8841 // Initialize the registers, using X registers to load the literal.
8839 __ Mov(x0, 0); 8842 __ Mov(x0, 0);
8840 __ Mov(x1, literal_base); 8843 __ Mov(x1, literal_base);
8841 for (i = 0; i < reg_count; i++) { 8844 for (i = 0; i < reg_count; i++) {
8842 // Always write into the D register, to ensure that the upper word is 8845 // Always write into the D register, to ensure that the upper word is
(...skipping 10 matching lines...) Expand all
8853 case PushPopByFour: 8856 case PushPopByFour:
8854 // Push high-numbered registers first (to the highest addresses). 8857 // Push high-numbered registers first (to the highest addresses).
8855 for (i = reg_count; i >= 4; i -= 4) { 8858 for (i = reg_count; i >= 4; i -= 4) {
8856 __ Push(v[i-1], v[i-2], v[i-3], v[i-4]); 8859 __ Push(v[i-1], v[i-2], v[i-3], v[i-4]);
8857 } 8860 }
8858 // Finish off the leftovers. 8861 // Finish off the leftovers.
8859 switch (i) { 8862 switch (i) {
8860 case 3: __ Push(v[2], v[1], v[0]); break; 8863 case 3: __ Push(v[2], v[1], v[0]); break;
8861 case 2: __ Push(v[1], v[0]); break; 8864 case 2: __ Push(v[1], v[0]); break;
8862 case 1: __ Push(v[0]); break; 8865 case 1: __ Push(v[0]); break;
8863 default: DCHECK(i == 0); break; 8866 default:
8867 CHECK(i == 0);
8868 break;
8864 } 8869 }
8865 break; 8870 break;
8866 case PushPopRegList: 8871 case PushPopRegList:
8867 __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister); 8872 __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister);
8868 break; 8873 break;
8869 } 8874 }
8870 8875
8871 // Clobber all the registers, to ensure that they get repopulated by Pop. 8876 // Clobber all the registers, to ensure that they get repopulated by Pop.
8872 ClobberFP(&masm, list); 8877 ClobberFP(&masm, list);
8873 8878
8874 switch (pop_method) { 8879 switch (pop_method) {
8875 case PushPopByFour: 8880 case PushPopByFour:
8876 // Pop low-numbered registers first (from the lowest addresses). 8881 // Pop low-numbered registers first (from the lowest addresses).
8877 for (i = 0; i <= (reg_count-4); i += 4) { 8882 for (i = 0; i <= (reg_count-4); i += 4) {
8878 __ Pop(v[i], v[i+1], v[i+2], v[i+3]); 8883 __ Pop(v[i], v[i+1], v[i+2], v[i+3]);
8879 } 8884 }
8880 // Finish off the leftovers. 8885 // Finish off the leftovers.
8881 switch (reg_count - i) { 8886 switch (reg_count - i) {
8882 case 3: __ Pop(v[i], v[i+1], v[i+2]); break; 8887 case 3: __ Pop(v[i], v[i+1], v[i+2]); break;
8883 case 2: __ Pop(v[i], v[i+1]); break; 8888 case 2: __ Pop(v[i], v[i+1]); break;
8884 case 1: __ Pop(v[i]); break; 8889 case 1: __ Pop(v[i]); break;
8885 default: DCHECK(i == reg_count); break; 8890 default:
8891 CHECK(i == reg_count);
8892 break;
8886 } 8893 }
8887 break; 8894 break;
8888 case PushPopRegList: 8895 case PushPopRegList:
8889 __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister); 8896 __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister);
8890 break; 8897 break;
8891 } 8898 }
8892 8899
8893 // Drop memory to restore jssp. 8900 // Drop memory to restore jssp.
8894 __ Drop(claim, kByteSizeInBytes); 8901 __ Drop(claim, kByteSizeInBytes);
8895 8902
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
8999 9006
9000 // The literal base is chosen to have two useful properties: 9007 // The literal base is chosen to have two useful properties:
9001 // * When multiplied by small values (such as a register index), this value 9008 // * When multiplied by small values (such as a register index), this value
9002 // is clearly readable in the result. 9009 // is clearly readable in the result.
9003 // * The value is not formed from repeating fixed-size smaller values, so it 9010 // * The value is not formed from repeating fixed-size smaller values, so it
9004 // can be used to detect endianness-related errors. 9011 // can be used to detect endianness-related errors.
9005 uint64_t literal_base = 0x0100001000100101UL; 9012 uint64_t literal_base = 0x0100001000100101UL;
9006 9013
9007 START(); 9014 START();
9008 { 9015 {
9009 DCHECK(__ StackPointer().Is(csp)); 9016 CHECK(__ StackPointer().Is(csp));
9010 __ Mov(jssp, __ StackPointer()); 9017 __ Mov(jssp, __ StackPointer());
9011 __ SetStackPointer(jssp); 9018 __ SetStackPointer(jssp);
9012 9019
9013 // Claim memory first, as requested. 9020 // Claim memory first, as requested.
9014 __ Claim(claim, kByteSizeInBytes); 9021 __ Claim(claim, kByteSizeInBytes);
9015 9022
9016 __ Mov(x[3], literal_base * 3); 9023 __ Mov(x[3], literal_base * 3);
9017 __ Mov(x[2], literal_base * 2); 9024 __ Mov(x[2], literal_base * 2);
9018 __ Mov(x[1], literal_base * 1); 9025 __ Mov(x[1], literal_base * 1);
9019 __ Mov(x[0], literal_base * 0); 9026 __ Mov(x[0], literal_base * 0);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
9104 // is clearly readable in the result. 9111 // is clearly readable in the result.
9105 // * The value is not formed from repeating fixed-size smaller values, so it 9112 // * The value is not formed from repeating fixed-size smaller values, so it
9106 // can be used to detect endianness-related errors. 9113 // can be used to detect endianness-related errors.
9107 static uint64_t const literal_base = 0x0100001000100101UL; 9114 static uint64_t const literal_base = 0x0100001000100101UL;
9108 static uint64_t const literal_base_hi = literal_base >> 32; 9115 static uint64_t const literal_base_hi = literal_base >> 32;
9109 static uint64_t const literal_base_lo = literal_base & 0xffffffff; 9116 static uint64_t const literal_base_lo = literal_base & 0xffffffff;
9110 static uint64_t const literal_base_w = literal_base & 0xffffffff; 9117 static uint64_t const literal_base_w = literal_base & 0xffffffff;
9111 9118
9112 START(); 9119 START();
9113 { 9120 {
9114 DCHECK(__ StackPointer().Is(csp)); 9121 CHECK(__ StackPointer().Is(csp));
9115 __ Mov(jssp, __ StackPointer()); 9122 __ Mov(jssp, __ StackPointer());
9116 __ SetStackPointer(jssp); 9123 __ SetStackPointer(jssp);
9117 9124
9118 // Initialize the registers. 9125 // Initialize the registers.
9119 for (int i = 0; i < reg_count; i++) { 9126 for (int i = 0; i < reg_count; i++) {
9120 // Always write into the X register, to ensure that the upper word is 9127 // Always write into the X register, to ensure that the upper word is
9121 // properly ignored by Push when testing W registers. 9128 // properly ignored by Push when testing W registers.
9122 if (!x[i].IsZero()) { 9129 if (!x[i].IsZero()) {
9123 __ Mov(x[i], literal_base * i); 9130 __ Mov(x[i], literal_base * i);
9124 } 9131 }
(...skipping 27 matching lines...) Expand all
9152 // where i is the register number. 9159 // where i is the register number.
9153 // Registers are popped starting with the higher numbers one-by-one, 9160 // Registers are popped starting with the higher numbers one-by-one,
9154 // alternating between x and w registers, but only popping one at a time. 9161 // alternating between x and w registers, but only popping one at a time.
9155 // 9162 //
9156 // This pattern provides a wide variety of alignment effects and overlaps. 9163 // This pattern provides a wide variety of alignment effects and overlaps.
9157 9164
9158 // ---- Push ---- 9165 // ---- Push ----
9159 9166
9160 int active_w_slots = 0; 9167 int active_w_slots = 0;
9161 for (int i = 0; active_w_slots < requested_w_slots; i++) { 9168 for (int i = 0; active_w_slots < requested_w_slots; i++) {
9162 DCHECK(i < reg_count); 9169 CHECK(i < reg_count);
9163 // In order to test various arguments to PushMultipleTimes, and to try to 9170 // In order to test various arguments to PushMultipleTimes, and to try to
9164 // exercise different alignment and overlap effects, we push each 9171 // exercise different alignment and overlap effects, we push each
9165 // register a different number of times. 9172 // register a different number of times.
9166 int times = i % 4 + 1; 9173 int times = i % 4 + 1;
9167 if (i & 1) { 9174 if (i & 1) {
9168 // Push odd-numbered registers as W registers. 9175 // Push odd-numbered registers as W registers.
9169 if (i & 2) { 9176 if (i & 2) {
9170 __ PushMultipleTimes(w[i], times); 9177 __ PushMultipleTimes(w[i], times);
9171 } else { 9178 } else {
9172 // Use a register to specify the count. 9179 // Use a register to specify the count.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
9225 for (int i = reg_count-1; i >= 0; i--) { 9232 for (int i = reg_count-1; i >= 0; i--) {
9226 if (next_is_64) { 9233 if (next_is_64) {
9227 __ Pop(x[i]); 9234 __ Pop(x[i]);
9228 active_w_slots -= 2; 9235 active_w_slots -= 2;
9229 } else { 9236 } else {
9230 __ Pop(w[i]); 9237 __ Pop(w[i]);
9231 active_w_slots -= 1; 9238 active_w_slots -= 1;
9232 } 9239 }
9233 next_is_64 = !next_is_64; 9240 next_is_64 = !next_is_64;
9234 } 9241 }
9235 DCHECK(active_w_slots == 0); 9242 CHECK(active_w_slots == 0);
9236 9243
9237 // Drop memory to restore jssp. 9244 // Drop memory to restore jssp.
9238 __ Drop(claim, kByteSizeInBytes); 9245 __ Drop(claim, kByteSizeInBytes);
9239 9246
9240 __ Mov(csp, __ StackPointer()); 9247 __ Mov(csp, __ StackPointer());
9241 __ SetStackPointer(csp); 9248 __ SetStackPointer(csp);
9242 } 9249 }
9243 9250
9244 END(); 9251 END();
9245 9252
(...skipping 15 matching lines...) Expand all
9261 } 9268 }
9262 9269
9263 // Always use CHECK_EQUAL_64, even when testing W registers, so we can 9270 // Always use CHECK_EQUAL_64, even when testing W registers, so we can
9264 // test that the upper word was properly cleared by Pop. 9271 // test that the upper word was properly cleared by Pop.
9265 if (x[i].IsZero()) { 9272 if (x[i].IsZero()) {
9266 CHECK_EQUAL_64(0, x[i]); 9273 CHECK_EQUAL_64(0, x[i]);
9267 } else { 9274 } else {
9268 CHECK_EQUAL_64(expected, x[i]); 9275 CHECK_EQUAL_64(expected, x[i]);
9269 } 9276 }
9270 } 9277 }
9271 DCHECK(slot == requested_w_slots); 9278 CHECK(slot == requested_w_slots);
9272 9279
9273 TEARDOWN(); 9280 TEARDOWN();
9274 } 9281 }
9275 9282
9276 9283
9277 TEST(push_pop_jssp_wx_overlap) { 9284 TEST(push_pop_jssp_wx_overlap) {
9278 INIT_V8(); 9285 INIT_V8();
9279 for (int claim = 0; claim <= 8; claim++) { 9286 for (int claim = 0; claim <= 8; claim++) {
9280 for (int count = 1; count <= 8; count++) { 9287 for (int count = 1; count <= 8; count++) {
9281 PushPopJsspWXOverlapHelper(count, claim); 9288 PushPopJsspWXOverlapHelper(count, claim);
9282 PushPopJsspWXOverlapHelper(count, claim); 9289 PushPopJsspWXOverlapHelper(count, claim);
9283 PushPopJsspWXOverlapHelper(count, claim); 9290 PushPopJsspWXOverlapHelper(count, claim);
9284 PushPopJsspWXOverlapHelper(count, claim); 9291 PushPopJsspWXOverlapHelper(count, claim);
9285 } 9292 }
9286 // Test with the maximum number of registers. 9293 // Test with the maximum number of registers.
9287 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9294 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim);
9288 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9295 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim);
9289 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9296 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim);
9290 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim); 9297 PushPopJsspWXOverlapHelper(kPushPopJsspMaxRegCount, claim);
9291 } 9298 }
9292 } 9299 }
9293 9300
9294 9301
9295 TEST(push_pop_csp) { 9302 TEST(push_pop_csp) {
9296 INIT_V8(); 9303 INIT_V8();
9297 SETUP(); 9304 SETUP();
9298 9305
9299 START(); 9306 START();
9300 9307
9301 DCHECK(csp.Is(__ StackPointer())); 9308 CHECK(csp.Is(__ StackPointer()));
9302 9309
9303 __ Mov(x3, 0x3333333333333333UL); 9310 __ Mov(x3, 0x3333333333333333UL);
9304 __ Mov(x2, 0x2222222222222222UL); 9311 __ Mov(x2, 0x2222222222222222UL);
9305 __ Mov(x1, 0x1111111111111111UL); 9312 __ Mov(x1, 0x1111111111111111UL);
9306 __ Mov(x0, 0x0000000000000000UL); 9313 __ Mov(x0, 0x0000000000000000UL);
9307 __ Claim(2); 9314 __ Claim(2);
9308 __ PushXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit()); 9315 __ PushXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
9309 __ Push(x3, x2); 9316 __ Push(x3, x2);
9310 __ PopXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit()); 9317 __ PopXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
9311 __ Push(x2, x1, x3, x0); 9318 __ Push(x2, x1, x3, x0);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
9380 TEARDOWN(); 9387 TEARDOWN();
9381 } 9388 }
9382 9389
9383 9390
9384 TEST(push_queued) { 9391 TEST(push_queued) {
9385 INIT_V8(); 9392 INIT_V8();
9386 SETUP(); 9393 SETUP();
9387 9394
9388 START(); 9395 START();
9389 9396
9390 DCHECK(__ StackPointer().Is(csp)); 9397 CHECK(__ StackPointer().Is(csp));
9391 __ Mov(jssp, __ StackPointer()); 9398 __ Mov(jssp, __ StackPointer());
9392 __ SetStackPointer(jssp); 9399 __ SetStackPointer(jssp);
9393 9400
9394 MacroAssembler::PushPopQueue queue(&masm); 9401 MacroAssembler::PushPopQueue queue(&masm);
9395 9402
9396 // Queue up registers. 9403 // Queue up registers.
9397 queue.Queue(x0); 9404 queue.Queue(x0);
9398 queue.Queue(x1); 9405 queue.Queue(x1);
9399 queue.Queue(x2); 9406 queue.Queue(x2);
9400 queue.Queue(x3); 9407 queue.Queue(x3);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
9455 TEARDOWN(); 9462 TEARDOWN();
9456 } 9463 }
9457 9464
9458 9465
9459 TEST(pop_queued) { 9466 TEST(pop_queued) {
9460 INIT_V8(); 9467 INIT_V8();
9461 SETUP(); 9468 SETUP();
9462 9469
9463 START(); 9470 START();
9464 9471
9465 DCHECK(__ StackPointer().Is(csp)); 9472 CHECK(__ StackPointer().Is(csp));
9466 __ Mov(jssp, __ StackPointer()); 9473 __ Mov(jssp, __ StackPointer());
9467 __ SetStackPointer(jssp); 9474 __ SetStackPointer(jssp);
9468 9475
9469 MacroAssembler::PushPopQueue queue(&masm); 9476 MacroAssembler::PushPopQueue queue(&masm);
9470 9477
9471 __ Mov(x0, 0x1234000000000000); 9478 __ Mov(x0, 0x1234000000000000);
9472 __ Mov(x1, 0x1234000100010001); 9479 __ Mov(x1, 0x1234000100010001);
9473 __ Mov(x2, 0x1234000200020002); 9480 __ Mov(x2, 0x1234000200020002);
9474 __ Mov(x3, 0x1234000300030003); 9481 __ Mov(x3, 0x1234000300030003);
9475 __ Mov(w4, 0x12340004); 9482 __ Mov(w4, 0x12340004);
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
10076 __ Printf("Test %%s: %s\n", x2); 10083 __ Printf("Test %%s: %s\n", x2);
10077 __ Printf("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n" 10084 __ Printf("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
10078 "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n", 10085 "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
10079 w3, w4, x5, x6); 10086 w3, w4, x5, x6);
10080 __ Printf("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4); 10087 __ Printf("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
10081 __ Printf("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28); 10088 __ Printf("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28);
10082 __ Printf("%g\n", d10); 10089 __ Printf("%g\n", d10);
10083 __ Printf("%%%%%s%%%c%%\n", x2, w13); 10090 __ Printf("%%%%%s%%%c%%\n", x2, w13);
10084 10091
10085 // Print the stack pointer (csp). 10092 // Print the stack pointer (csp).
10086 DCHECK(csp.Is(__ StackPointer())); 10093 CHECK(csp.Is(__ StackPointer()));
10087 __ Printf("StackPointer(csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n", 10094 __ Printf("StackPointer(csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
10088 __ StackPointer(), __ StackPointer().W()); 10095 __ StackPointer(), __ StackPointer().W());
10089 10096
10090 // Test with a different stack pointer. 10097 // Test with a different stack pointer.
10091 const Register old_stack_pointer = __ StackPointer(); 10098 const Register old_stack_pointer = __ StackPointer();
10092 __ Mov(x29, old_stack_pointer); 10099 __ Mov(x29, old_stack_pointer);
10093 __ SetStackPointer(x29); 10100 __ SetStackPointer(x29);
10094 // Print the stack pointer (not csp). 10101 // Print the stack pointer (not csp).
10095 __ Printf("StackPointer(not csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n", 10102 __ Printf("StackPointer(not csp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
10096 __ StackPointer(), __ StackPointer().W()); 10103 __ StackPointer(), __ StackPointer().W());
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
10329 10336
10330 TEARDOWN(); 10337 TEARDOWN();
10331 } 10338 }
10332 10339
10333 10340
10334 TEST(process_nan_double) { 10341 TEST(process_nan_double) {
10335 INIT_V8(); 10342 INIT_V8();
10336 // Make sure that NaN propagation works correctly. 10343 // Make sure that NaN propagation works correctly.
10337 double sn = rawbits_to_double(0x7ff5555511111111); 10344 double sn = rawbits_to_double(0x7ff5555511111111);
10338 double qn = rawbits_to_double(0x7ffaaaaa11111111); 10345 double qn = rawbits_to_double(0x7ffaaaaa11111111);
10339 DCHECK(IsSignallingNaN(sn)); 10346 CHECK(IsSignallingNaN(sn));
10340 DCHECK(IsQuietNaN(qn)); 10347 CHECK(IsQuietNaN(qn));
10341 10348
10342 // The input NaNs after passing through ProcessNaN. 10349 // The input NaNs after passing through ProcessNaN.
10343 double sn_proc = rawbits_to_double(0x7ffd555511111111); 10350 double sn_proc = rawbits_to_double(0x7ffd555511111111);
10344 double qn_proc = qn; 10351 double qn_proc = qn;
10345 DCHECK(IsQuietNaN(sn_proc)); 10352 CHECK(IsQuietNaN(sn_proc));
10346 DCHECK(IsQuietNaN(qn_proc)); 10353 CHECK(IsQuietNaN(qn_proc));
10347 10354
10348 SETUP(); 10355 SETUP();
10349 START(); 10356 START();
10350 10357
10351 // Execute a number of instructions which all use ProcessNaN, and check that 10358 // Execute a number of instructions which all use ProcessNaN, and check that
10352 // they all handle the NaN correctly. 10359 // they all handle the NaN correctly.
10353 __ Fmov(d0, sn); 10360 __ Fmov(d0, sn);
10354 __ Fmov(d10, qn); 10361 __ Fmov(d10, qn);
10355 10362
10356 // Operations that always propagate NaNs unchanged, even signalling NaNs. 10363 // Operations that always propagate NaNs unchanged, even signalling NaNs.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
10405 10412
10406 TEARDOWN(); 10413 TEARDOWN();
10407 } 10414 }
10408 10415
10409 10416
10410 TEST(process_nan_float) { 10417 TEST(process_nan_float) {
10411 INIT_V8(); 10418 INIT_V8();
10412 // Make sure that NaN propagation works correctly. 10419 // Make sure that NaN propagation works correctly.
10413 float sn = rawbits_to_float(0x7f951111); 10420 float sn = rawbits_to_float(0x7f951111);
10414 float qn = rawbits_to_float(0x7fea1111); 10421 float qn = rawbits_to_float(0x7fea1111);
10415 DCHECK(IsSignallingNaN(sn)); 10422 CHECK(IsSignallingNaN(sn));
10416 DCHECK(IsQuietNaN(qn)); 10423 CHECK(IsQuietNaN(qn));
10417 10424
10418 // The input NaNs after passing through ProcessNaN. 10425 // The input NaNs after passing through ProcessNaN.
10419 float sn_proc = rawbits_to_float(0x7fd51111); 10426 float sn_proc = rawbits_to_float(0x7fd51111);
10420 float qn_proc = qn; 10427 float qn_proc = qn;
10421 DCHECK(IsQuietNaN(sn_proc)); 10428 CHECK(IsQuietNaN(sn_proc));
10422 DCHECK(IsQuietNaN(qn_proc)); 10429 CHECK(IsQuietNaN(qn_proc));
10423 10430
10424 SETUP(); 10431 SETUP();
10425 START(); 10432 START();
10426 10433
10427 // Execute a number of instructions which all use ProcessNaN, and check that 10434 // Execute a number of instructions which all use ProcessNaN, and check that
10428 // they all handle the NaN correctly. 10435 // they all handle the NaN correctly.
10429 __ Fmov(s0, sn); 10436 __ Fmov(s0, sn);
10430 __ Fmov(s10, qn); 10437 __ Fmov(s10, qn);
10431 10438
10432 // Operations that always propagate NaNs unchanged, even signalling NaNs. 10439 // Operations that always propagate NaNs unchanged, even signalling NaNs.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
10477 CHECK_EQUAL_FP32(qn_proc, s14); 10484 CHECK_EQUAL_FP32(qn_proc, s14);
10478 CHECK_EQUAL_FP32(qn_proc, s15); 10485 CHECK_EQUAL_FP32(qn_proc, s15);
10479 CHECK_EQUAL_FP32(qn_proc, s16); 10486 CHECK_EQUAL_FP32(qn_proc, s16);
10480 CHECK_EQUAL_FP32(qn_proc, s17); 10487 CHECK_EQUAL_FP32(qn_proc, s17);
10481 10488
10482 TEARDOWN(); 10489 TEARDOWN();
10483 } 10490 }
10484 10491
10485 10492
10486 static void ProcessNaNsHelper(double n, double m, double expected) { 10493 static void ProcessNaNsHelper(double n, double m, double expected) {
10487 DCHECK(std::isnan(n) || std::isnan(m)); 10494 CHECK(std::isnan(n) || std::isnan(m));
10488 DCHECK(std::isnan(expected)); 10495 CHECK(std::isnan(expected));
10489 10496
10490 SETUP(); 10497 SETUP();
10491 START(); 10498 START();
10492 10499
10493 // Execute a number of instructions which all use ProcessNaNs, and check that 10500 // Execute a number of instructions which all use ProcessNaNs, and check that
10494 // they all propagate NaNs correctly. 10501 // they all propagate NaNs correctly.
10495 __ Fmov(d0, n); 10502 __ Fmov(d0, n);
10496 __ Fmov(d1, m); 10503 __ Fmov(d1, m);
10497 10504
10498 __ Fadd(d2, d0, d1); 10505 __ Fadd(d2, d0, d1);
(...skipping 17 matching lines...) Expand all
10516 } 10523 }
10517 10524
10518 10525
10519 TEST(process_nans_double) { 10526 TEST(process_nans_double) {
10520 INIT_V8(); 10527 INIT_V8();
10521 // Make sure that NaN propagation works correctly. 10528 // Make sure that NaN propagation works correctly.
10522 double sn = rawbits_to_double(0x7ff5555511111111); 10529 double sn = rawbits_to_double(0x7ff5555511111111);
10523 double sm = rawbits_to_double(0x7ff5555522222222); 10530 double sm = rawbits_to_double(0x7ff5555522222222);
10524 double qn = rawbits_to_double(0x7ffaaaaa11111111); 10531 double qn = rawbits_to_double(0x7ffaaaaa11111111);
10525 double qm = rawbits_to_double(0x7ffaaaaa22222222); 10532 double qm = rawbits_to_double(0x7ffaaaaa22222222);
10526 DCHECK(IsSignallingNaN(sn)); 10533 CHECK(IsSignallingNaN(sn));
10527 DCHECK(IsSignallingNaN(sm)); 10534 CHECK(IsSignallingNaN(sm));
10528 DCHECK(IsQuietNaN(qn)); 10535 CHECK(IsQuietNaN(qn));
10529 DCHECK(IsQuietNaN(qm)); 10536 CHECK(IsQuietNaN(qm));
10530 10537
10531 // The input NaNs after passing through ProcessNaN. 10538 // The input NaNs after passing through ProcessNaN.
10532 double sn_proc = rawbits_to_double(0x7ffd555511111111); 10539 double sn_proc = rawbits_to_double(0x7ffd555511111111);
10533 double sm_proc = rawbits_to_double(0x7ffd555522222222); 10540 double sm_proc = rawbits_to_double(0x7ffd555522222222);
10534 double qn_proc = qn; 10541 double qn_proc = qn;
10535 double qm_proc = qm; 10542 double qm_proc = qm;
10536 DCHECK(IsQuietNaN(sn_proc)); 10543 CHECK(IsQuietNaN(sn_proc));
10537 DCHECK(IsQuietNaN(sm_proc)); 10544 CHECK(IsQuietNaN(sm_proc));
10538 DCHECK(IsQuietNaN(qn_proc)); 10545 CHECK(IsQuietNaN(qn_proc));
10539 DCHECK(IsQuietNaN(qm_proc)); 10546 CHECK(IsQuietNaN(qm_proc));
10540 10547
10541 // Quiet NaNs are propagated. 10548 // Quiet NaNs are propagated.
10542 ProcessNaNsHelper(qn, 0, qn_proc); 10549 ProcessNaNsHelper(qn, 0, qn_proc);
10543 ProcessNaNsHelper(0, qm, qm_proc); 10550 ProcessNaNsHelper(0, qm, qm_proc);
10544 ProcessNaNsHelper(qn, qm, qn_proc); 10551 ProcessNaNsHelper(qn, qm, qn_proc);
10545 10552
10546 // Signalling NaNs are propagated, and made quiet. 10553 // Signalling NaNs are propagated, and made quiet.
10547 ProcessNaNsHelper(sn, 0, sn_proc); 10554 ProcessNaNsHelper(sn, 0, sn_proc);
10548 ProcessNaNsHelper(0, sm, sm_proc); 10555 ProcessNaNsHelper(0, sm, sm_proc);
10549 ProcessNaNsHelper(sn, sm, sn_proc); 10556 ProcessNaNsHelper(sn, sm, sn_proc);
10550 10557
10551 // Signalling NaNs take precedence over quiet NaNs. 10558 // Signalling NaNs take precedence over quiet NaNs.
10552 ProcessNaNsHelper(sn, qm, sn_proc); 10559 ProcessNaNsHelper(sn, qm, sn_proc);
10553 ProcessNaNsHelper(qn, sm, sm_proc); 10560 ProcessNaNsHelper(qn, sm, sm_proc);
10554 ProcessNaNsHelper(sn, sm, sn_proc); 10561 ProcessNaNsHelper(sn, sm, sn_proc);
10555 } 10562 }
10556 10563
10557 10564
10558 static void ProcessNaNsHelper(float n, float m, float expected) { 10565 static void ProcessNaNsHelper(float n, float m, float expected) {
10559 DCHECK(std::isnan(n) || std::isnan(m)); 10566 CHECK(std::isnan(n) || std::isnan(m));
10560 DCHECK(std::isnan(expected)); 10567 CHECK(std::isnan(expected));
10561 10568
10562 SETUP(); 10569 SETUP();
10563 START(); 10570 START();
10564 10571
10565 // Execute a number of instructions which all use ProcessNaNs, and check that 10572 // Execute a number of instructions which all use ProcessNaNs, and check that
10566 // they all propagate NaNs correctly. 10573 // they all propagate NaNs correctly.
10567 __ Fmov(s0, n); 10574 __ Fmov(s0, n);
10568 __ Fmov(s1, m); 10575 __ Fmov(s1, m);
10569 10576
10570 __ Fadd(s2, s0, s1); 10577 __ Fadd(s2, s0, s1);
(...skipping 17 matching lines...) Expand all
10588 } 10595 }
10589 10596
10590 10597
10591 TEST(process_nans_float) { 10598 TEST(process_nans_float) {
10592 INIT_V8(); 10599 INIT_V8();
10593 // Make sure that NaN propagation works correctly. 10600 // Make sure that NaN propagation works correctly.
10594 float sn = rawbits_to_float(0x7f951111); 10601 float sn = rawbits_to_float(0x7f951111);
10595 float sm = rawbits_to_float(0x7f952222); 10602 float sm = rawbits_to_float(0x7f952222);
10596 float qn = rawbits_to_float(0x7fea1111); 10603 float qn = rawbits_to_float(0x7fea1111);
10597 float qm = rawbits_to_float(0x7fea2222); 10604 float qm = rawbits_to_float(0x7fea2222);
10598 DCHECK(IsSignallingNaN(sn)); 10605 CHECK(IsSignallingNaN(sn));
10599 DCHECK(IsSignallingNaN(sm)); 10606 CHECK(IsSignallingNaN(sm));
10600 DCHECK(IsQuietNaN(qn)); 10607 CHECK(IsQuietNaN(qn));
10601 DCHECK(IsQuietNaN(qm)); 10608 CHECK(IsQuietNaN(qm));
10602 10609
10603 // The input NaNs after passing through ProcessNaN. 10610 // The input NaNs after passing through ProcessNaN.
10604 float sn_proc = rawbits_to_float(0x7fd51111); 10611 float sn_proc = rawbits_to_float(0x7fd51111);
10605 float sm_proc = rawbits_to_float(0x7fd52222); 10612 float sm_proc = rawbits_to_float(0x7fd52222);
10606 float qn_proc = qn; 10613 float qn_proc = qn;
10607 float qm_proc = qm; 10614 float qm_proc = qm;
10608 DCHECK(IsQuietNaN(sn_proc)); 10615 CHECK(IsQuietNaN(sn_proc));
10609 DCHECK(IsQuietNaN(sm_proc)); 10616 CHECK(IsQuietNaN(sm_proc));
10610 DCHECK(IsQuietNaN(qn_proc)); 10617 CHECK(IsQuietNaN(qn_proc));
10611 DCHECK(IsQuietNaN(qm_proc)); 10618 CHECK(IsQuietNaN(qm_proc));
10612 10619
10613 // Quiet NaNs are propagated. 10620 // Quiet NaNs are propagated.
10614 ProcessNaNsHelper(qn, 0, qn_proc); 10621 ProcessNaNsHelper(qn, 0, qn_proc);
10615 ProcessNaNsHelper(0, qm, qm_proc); 10622 ProcessNaNsHelper(0, qm, qm_proc);
10616 ProcessNaNsHelper(qn, qm, qn_proc); 10623 ProcessNaNsHelper(qn, qm, qn_proc);
10617 10624
10618 // Signalling NaNs are propagated, and made quiet. 10625 // Signalling NaNs are propagated, and made quiet.
10619 ProcessNaNsHelper(sn, 0, sn_proc); 10626 ProcessNaNsHelper(sn, 0, sn_proc);
10620 ProcessNaNsHelper(0, sm, sm_proc); 10627 ProcessNaNsHelper(0, sm, sm_proc);
10621 ProcessNaNsHelper(sn, sm, sn_proc); 10628 ProcessNaNsHelper(sn, sm, sn_proc);
10622 10629
10623 // Signalling NaNs take precedence over quiet NaNs. 10630 // Signalling NaNs take precedence over quiet NaNs.
10624 ProcessNaNsHelper(sn, qm, sn_proc); 10631 ProcessNaNsHelper(sn, qm, sn_proc);
10625 ProcessNaNsHelper(qn, sm, sm_proc); 10632 ProcessNaNsHelper(qn, sm, sm_proc);
10626 ProcessNaNsHelper(sn, sm, sn_proc); 10633 ProcessNaNsHelper(sn, sm, sn_proc);
10627 } 10634 }
10628 10635
10629 10636
10630 static void DefaultNaNHelper(float n, float m, float a) { 10637 static void DefaultNaNHelper(float n, float m, float a) {
10631 DCHECK(std::isnan(n) || std::isnan(m) || std::isnan(a)); 10638 CHECK(std::isnan(n) || std::isnan(m) || std::isnan(a));
10632 10639
10633 bool test_1op = std::isnan(n); 10640 bool test_1op = std::isnan(n);
10634 bool test_2op = std::isnan(n) || std::isnan(m); 10641 bool test_2op = std::isnan(n) || std::isnan(m);
10635 10642
10636 SETUP(); 10643 SETUP();
10637 START(); 10644 START();
10638 10645
10639 // Enable Default-NaN mode in the FPCR. 10646 // Enable Default-NaN mode in the FPCR.
10640 __ Mrs(x0, FPCR); 10647 __ Mrs(x0, FPCR);
10641 __ Orr(x1, x0, DN_mask); 10648 __ Orr(x1, x0, DN_mask);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
10714 10721
10715 10722
10716 TEST(default_nan_float) { 10723 TEST(default_nan_float) {
10717 INIT_V8(); 10724 INIT_V8();
10718 float sn = rawbits_to_float(0x7f951111); 10725 float sn = rawbits_to_float(0x7f951111);
10719 float sm = rawbits_to_float(0x7f952222); 10726 float sm = rawbits_to_float(0x7f952222);
10720 float sa = rawbits_to_float(0x7f95aaaa); 10727 float sa = rawbits_to_float(0x7f95aaaa);
10721 float qn = rawbits_to_float(0x7fea1111); 10728 float qn = rawbits_to_float(0x7fea1111);
10722 float qm = rawbits_to_float(0x7fea2222); 10729 float qm = rawbits_to_float(0x7fea2222);
10723 float qa = rawbits_to_float(0x7feaaaaa); 10730 float qa = rawbits_to_float(0x7feaaaaa);
10724 DCHECK(IsSignallingNaN(sn)); 10731 CHECK(IsSignallingNaN(sn));
10725 DCHECK(IsSignallingNaN(sm)); 10732 CHECK(IsSignallingNaN(sm));
10726 DCHECK(IsSignallingNaN(sa)); 10733 CHECK(IsSignallingNaN(sa));
10727 DCHECK(IsQuietNaN(qn)); 10734 CHECK(IsQuietNaN(qn));
10728 DCHECK(IsQuietNaN(qm)); 10735 CHECK(IsQuietNaN(qm));
10729 DCHECK(IsQuietNaN(qa)); 10736 CHECK(IsQuietNaN(qa));
10730 10737
10731 // - Signalling NaNs 10738 // - Signalling NaNs
10732 DefaultNaNHelper(sn, 0.0f, 0.0f); 10739 DefaultNaNHelper(sn, 0.0f, 0.0f);
10733 DefaultNaNHelper(0.0f, sm, 0.0f); 10740 DefaultNaNHelper(0.0f, sm, 0.0f);
10734 DefaultNaNHelper(0.0f, 0.0f, sa); 10741 DefaultNaNHelper(0.0f, 0.0f, sa);
10735 DefaultNaNHelper(sn, sm, 0.0f); 10742 DefaultNaNHelper(sn, sm, 0.0f);
10736 DefaultNaNHelper(0.0f, sm, sa); 10743 DefaultNaNHelper(0.0f, sm, sa);
10737 DefaultNaNHelper(sn, 0.0f, sa); 10744 DefaultNaNHelper(sn, 0.0f, sa);
10738 DefaultNaNHelper(sn, sm, sa); 10745 DefaultNaNHelper(sn, sm, sa);
10739 // - Quiet NaNs 10746 // - Quiet NaNs
10740 DefaultNaNHelper(qn, 0.0f, 0.0f); 10747 DefaultNaNHelper(qn, 0.0f, 0.0f);
10741 DefaultNaNHelper(0.0f, qm, 0.0f); 10748 DefaultNaNHelper(0.0f, qm, 0.0f);
10742 DefaultNaNHelper(0.0f, 0.0f, qa); 10749 DefaultNaNHelper(0.0f, 0.0f, qa);
10743 DefaultNaNHelper(qn, qm, 0.0f); 10750 DefaultNaNHelper(qn, qm, 0.0f);
10744 DefaultNaNHelper(0.0f, qm, qa); 10751 DefaultNaNHelper(0.0f, qm, qa);
10745 DefaultNaNHelper(qn, 0.0f, qa); 10752 DefaultNaNHelper(qn, 0.0f, qa);
10746 DefaultNaNHelper(qn, qm, qa); 10753 DefaultNaNHelper(qn, qm, qa);
10747 // - Mixed NaNs 10754 // - Mixed NaNs
10748 DefaultNaNHelper(qn, sm, sa); 10755 DefaultNaNHelper(qn, sm, sa);
10749 DefaultNaNHelper(sn, qm, sa); 10756 DefaultNaNHelper(sn, qm, sa);
10750 DefaultNaNHelper(sn, sm, qa); 10757 DefaultNaNHelper(sn, sm, qa);
10751 DefaultNaNHelper(qn, qm, sa); 10758 DefaultNaNHelper(qn, qm, sa);
10752 DefaultNaNHelper(sn, qm, qa); 10759 DefaultNaNHelper(sn, qm, qa);
10753 DefaultNaNHelper(qn, sm, qa); 10760 DefaultNaNHelper(qn, sm, qa);
10754 DefaultNaNHelper(qn, qm, qa); 10761 DefaultNaNHelper(qn, qm, qa);
10755 } 10762 }
10756 10763
10757 10764
10758 static void DefaultNaNHelper(double n, double m, double a) { 10765 static void DefaultNaNHelper(double n, double m, double a) {
10759 DCHECK(std::isnan(n) || std::isnan(m) || std::isnan(a)); 10766 CHECK(std::isnan(n) || std::isnan(m) || std::isnan(a));
10760 10767
10761 bool test_1op = std::isnan(n); 10768 bool test_1op = std::isnan(n);
10762 bool test_2op = std::isnan(n) || std::isnan(m); 10769 bool test_2op = std::isnan(n) || std::isnan(m);
10763 10770
10764 SETUP(); 10771 SETUP();
10765 START(); 10772 START();
10766 10773
10767 // Enable Default-NaN mode in the FPCR. 10774 // Enable Default-NaN mode in the FPCR.
10768 __ Mrs(x0, FPCR); 10775 __ Mrs(x0, FPCR);
10769 __ Orr(x1, x0, DN_mask); 10776 __ Orr(x1, x0, DN_mask);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
10842 10849
10843 10850
10844 TEST(default_nan_double) { 10851 TEST(default_nan_double) {
10845 INIT_V8(); 10852 INIT_V8();
10846 double sn = rawbits_to_double(0x7ff5555511111111); 10853 double sn = rawbits_to_double(0x7ff5555511111111);
10847 double sm = rawbits_to_double(0x7ff5555522222222); 10854 double sm = rawbits_to_double(0x7ff5555522222222);
10848 double sa = rawbits_to_double(0x7ff55555aaaaaaaa); 10855 double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
10849 double qn = rawbits_to_double(0x7ffaaaaa11111111); 10856 double qn = rawbits_to_double(0x7ffaaaaa11111111);
10850 double qm = rawbits_to_double(0x7ffaaaaa22222222); 10857 double qm = rawbits_to_double(0x7ffaaaaa22222222);
10851 double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa); 10858 double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
10852 DCHECK(IsSignallingNaN(sn)); 10859 CHECK(IsSignallingNaN(sn));
10853 DCHECK(IsSignallingNaN(sm)); 10860 CHECK(IsSignallingNaN(sm));
10854 DCHECK(IsSignallingNaN(sa)); 10861 CHECK(IsSignallingNaN(sa));
10855 DCHECK(IsQuietNaN(qn)); 10862 CHECK(IsQuietNaN(qn));
10856 DCHECK(IsQuietNaN(qm)); 10863 CHECK(IsQuietNaN(qm));
10857 DCHECK(IsQuietNaN(qa)); 10864 CHECK(IsQuietNaN(qa));
10858 10865
10859 // - Signalling NaNs 10866 // - Signalling NaNs
10860 DefaultNaNHelper(sn, 0.0, 0.0); 10867 DefaultNaNHelper(sn, 0.0, 0.0);
10861 DefaultNaNHelper(0.0, sm, 0.0); 10868 DefaultNaNHelper(0.0, sm, 0.0);
10862 DefaultNaNHelper(0.0, 0.0, sa); 10869 DefaultNaNHelper(0.0, 0.0, sa);
10863 DefaultNaNHelper(sn, sm, 0.0); 10870 DefaultNaNHelper(sn, sm, 0.0);
10864 DefaultNaNHelper(0.0, sm, sa); 10871 DefaultNaNHelper(0.0, sm, sa);
10865 DefaultNaNHelper(sn, 0.0, sa); 10872 DefaultNaNHelper(sn, 0.0, sa);
10866 DefaultNaNHelper(sn, sm, sa); 10873 DefaultNaNHelper(sn, sm, sa);
10867 // - Quiet NaNs 10874 // - Quiet NaNs
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
11085 CodeDesc desc; 11092 CodeDesc desc;
11086 masm.GetCode(&desc); 11093 masm.GetCode(&desc);
11087 Handle<Code> code = isolate->factory()->NewCode(desc, 0, masm.CodeObject()); 11094 Handle<Code> code = isolate->factory()->NewCode(desc, 0, masm.CodeObject());
11088 11095
11089 unsigned pool_count = 0; 11096 unsigned pool_count = 0;
11090 int pool_mask = RelocInfo::ModeMask(RelocInfo::CONST_POOL) | 11097 int pool_mask = RelocInfo::ModeMask(RelocInfo::CONST_POOL) |
11091 RelocInfo::ModeMask(RelocInfo::VENEER_POOL); 11098 RelocInfo::ModeMask(RelocInfo::VENEER_POOL);
11092 for (RelocIterator it(*code, pool_mask); !it.done(); it.next()) { 11099 for (RelocIterator it(*code, pool_mask); !it.done(); it.next()) {
11093 RelocInfo* info = it.rinfo(); 11100 RelocInfo* info = it.rinfo();
11094 if (RelocInfo::IsConstPool(info->rmode())) { 11101 if (RelocInfo::IsConstPool(info->rmode())) {
11095 DCHECK(info->data() == constant_pool_size); 11102 CHECK(info->data() == constant_pool_size);
11096 ++pool_count; 11103 ++pool_count;
11097 } 11104 }
11098 if (RelocInfo::IsVeneerPool(info->rmode())) { 11105 if (RelocInfo::IsVeneerPool(info->rmode())) {
11099 DCHECK(info->data() == veneer_pool_size); 11106 CHECK(info->data() == veneer_pool_size);
11100 ++pool_count; 11107 ++pool_count;
11101 } 11108 }
11102 } 11109 }
11103 11110
11104 DCHECK(pool_count == 2); 11111 CHECK(pool_count == 2);
11105 11112
11106 TEARDOWN(); 11113 TEARDOWN();
11107 } 11114 }
11108 11115
11109 11116
11110 TEST(jump_tables_forward) { 11117 TEST(jump_tables_forward) {
11111 // Test jump tables with forward jumps. 11118 // Test jump tables with forward jumps.
11112 const int kNumCases = 512; 11119 const int kNumCases = 512;
11113 11120
11114 INIT_V8(); 11121 INIT_V8();
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
11268 __ Mov(x0, 1); 11275 __ Mov(x0, 1);
11269 11276
11270 END(); 11277 END();
11271 11278
11272 RUN(); 11279 RUN();
11273 11280
11274 CHECK_EQUAL_64(0x1, x0); 11281 CHECK_EQUAL_64(0x1, x0);
11275 11282
11276 TEARDOWN(); 11283 TEARDOWN();
11277 } 11284 }
OLDNEW
« no previous file with comments | « test/cctest/test-assembler-arm.cc ('k') | test/cctest/test-assembler-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698