| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 Assembler::kMinimalBufferSize, &actual_size, true)); | 77 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 78 CHECK(buffer); | 78 CHECK(buffer); |
| 79 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 79 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 80 | 80 |
| 81 // Assemble a simple function that copies argument 2 and returns it. | 81 // Assemble a simple function that copies argument 2 and returns it. |
| 82 __ movq(rax, arg2); | 82 __ movq(rax, arg2); |
| 83 __ nop(); | 83 __ nop(); |
| 84 __ ret(0); | 84 __ ret(0); |
| 85 | 85 |
| 86 CodeDesc desc; | 86 CodeDesc desc; |
| 87 assm.GetCode(&desc); | 87 assm.GetCode(CcTest::i_isolate(), &desc); |
| 88 // Call the function from C++. | 88 // Call the function from C++. |
| 89 int result = FUNCTION_CAST<F2>(buffer)(3, 2); | 89 int result = FUNCTION_CAST<F2>(buffer)(3, 2); |
| 90 CHECK_EQ(2, result); | 90 CHECK_EQ(2, result); |
| 91 } | 91 } |
| 92 | 92 |
| 93 | 93 |
| 94 TEST(AssemblerX64StackOperations) { | 94 TEST(AssemblerX64StackOperations) { |
| 95 CcTest::InitializeVM(); | 95 CcTest::InitializeVM(); |
| 96 // Allocate an executable page of memory. | 96 // Allocate an executable page of memory. |
| 97 size_t actual_size; | 97 size_t actual_size; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 109 __ pushq(arg2); // Value at (rbp - 16) | 109 __ pushq(arg2); // Value at (rbp - 16) |
| 110 __ pushq(arg1); // Value at (rbp - 24) | 110 __ pushq(arg1); // Value at (rbp - 24) |
| 111 __ popq(rax); | 111 __ popq(rax); |
| 112 __ popq(rax); | 112 __ popq(rax); |
| 113 __ popq(rax); | 113 __ popq(rax); |
| 114 __ popq(rbp); | 114 __ popq(rbp); |
| 115 __ nop(); | 115 __ nop(); |
| 116 __ ret(0); | 116 __ ret(0); |
| 117 | 117 |
| 118 CodeDesc desc; | 118 CodeDesc desc; |
| 119 assm.GetCode(&desc); | 119 assm.GetCode(CcTest::i_isolate(), &desc); |
| 120 // Call the function from C++. | 120 // Call the function from C++. |
| 121 int result = FUNCTION_CAST<F2>(buffer)(3, 2); | 121 int result = FUNCTION_CAST<F2>(buffer)(3, 2); |
| 122 CHECK_EQ(2, result); | 122 CHECK_EQ(2, result); |
| 123 } | 123 } |
| 124 | 124 |
| 125 | 125 |
| 126 TEST(AssemblerX64ArithmeticOperations) { | 126 TEST(AssemblerX64ArithmeticOperations) { |
| 127 CcTest::InitializeVM(); | 127 CcTest::InitializeVM(); |
| 128 // Allocate an executable page of memory. | 128 // Allocate an executable page of memory. |
| 129 size_t actual_size; | 129 size_t actual_size; |
| 130 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 130 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 131 Assembler::kMinimalBufferSize, &actual_size, true)); | 131 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 132 CHECK(buffer); | 132 CHECK(buffer); |
| 133 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 133 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 134 | 134 |
| 135 // Assemble a simple function that adds arguments returning the sum. | 135 // Assemble a simple function that adds arguments returning the sum. |
| 136 __ movq(rax, arg2); | 136 __ movq(rax, arg2); |
| 137 __ addq(rax, arg1); | 137 __ addq(rax, arg1); |
| 138 __ ret(0); | 138 __ ret(0); |
| 139 | 139 |
| 140 CodeDesc desc; | 140 CodeDesc desc; |
| 141 assm.GetCode(&desc); | 141 assm.GetCode(CcTest::i_isolate(), &desc); |
| 142 // Call the function from C++. | 142 // Call the function from C++. |
| 143 int result = FUNCTION_CAST<F2>(buffer)(3, 2); | 143 int result = FUNCTION_CAST<F2>(buffer)(3, 2); |
| 144 CHECK_EQ(5, result); | 144 CHECK_EQ(5, result); |
| 145 } | 145 } |
| 146 | 146 |
| 147 | 147 |
| 148 TEST(AssemblerX64CmpbOperation) { | 148 TEST(AssemblerX64CmpbOperation) { |
| 149 CcTest::InitializeVM(); | 149 CcTest::InitializeVM(); |
| 150 // Allocate an executable page of memory. | 150 // Allocate an executable page of memory. |
| 151 size_t actual_size; | 151 size_t actual_size; |
| 152 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 152 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 153 Assembler::kMinimalBufferSize, &actual_size, true)); | 153 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 154 CHECK(buffer); | 154 CHECK(buffer); |
| 155 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 155 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 156 | 156 |
| 157 // Assemble a function that compare argument byte returing 1 if equal else 0. | 157 // Assemble a function that compare argument byte returing 1 if equal else 0. |
| 158 // On Windows, it compares rcx with rdx which does not require REX prefix; | 158 // On Windows, it compares rcx with rdx which does not require REX prefix; |
| 159 // on Linux, it compares rdi with rsi which requires REX prefix. | 159 // on Linux, it compares rdi with rsi which requires REX prefix. |
| 160 | 160 |
| 161 Label done; | 161 Label done; |
| 162 __ movq(rax, Immediate(1)); | 162 __ movq(rax, Immediate(1)); |
| 163 __ cmpb(arg1, arg2); | 163 __ cmpb(arg1, arg2); |
| 164 __ j(equal, &done); | 164 __ j(equal, &done); |
| 165 __ movq(rax, Immediate(0)); | 165 __ movq(rax, Immediate(0)); |
| 166 __ bind(&done); | 166 __ bind(&done); |
| 167 __ ret(0); | 167 __ ret(0); |
| 168 | 168 |
| 169 CodeDesc desc; | 169 CodeDesc desc; |
| 170 assm.GetCode(&desc); | 170 assm.GetCode(CcTest::i_isolate(), &desc); |
| 171 // Call the function from C++. | 171 // Call the function from C++. |
| 172 int result = FUNCTION_CAST<F2>(buffer)(0x1002, 0x2002); | 172 int result = FUNCTION_CAST<F2>(buffer)(0x1002, 0x2002); |
| 173 CHECK_EQ(1, result); | 173 CHECK_EQ(1, result); |
| 174 result = FUNCTION_CAST<F2>(buffer)(0x1002, 0x2003); | 174 result = FUNCTION_CAST<F2>(buffer)(0x1002, 0x2003); |
| 175 CHECK_EQ(0, result); | 175 CHECK_EQ(0, result); |
| 176 } | 176 } |
| 177 | 177 |
| 178 TEST(Regression684407) { | 178 TEST(Regression684407) { |
| 179 CcTest::InitializeVM(); | 179 CcTest::InitializeVM(); |
| 180 // Allocate an executable page of memory. | 180 // Allocate an executable page of memory. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 202 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 202 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 203 | 203 |
| 204 // Assemble a simple function that multiplies arguments returning the high | 204 // Assemble a simple function that multiplies arguments returning the high |
| 205 // word. | 205 // word. |
| 206 __ movq(rax, arg2); | 206 __ movq(rax, arg2); |
| 207 __ imulq(arg1); | 207 __ imulq(arg1); |
| 208 __ movq(rax, rdx); | 208 __ movq(rax, rdx); |
| 209 __ ret(0); | 209 __ ret(0); |
| 210 | 210 |
| 211 CodeDesc desc; | 211 CodeDesc desc; |
| 212 assm.GetCode(&desc); | 212 assm.GetCode(CcTest::i_isolate(), &desc); |
| 213 // Call the function from C++. | 213 // Call the function from C++. |
| 214 int result = FUNCTION_CAST<F2>(buffer)(3, 2); | 214 int result = FUNCTION_CAST<F2>(buffer)(3, 2); |
| 215 CHECK_EQ(0, result); | 215 CHECK_EQ(0, result); |
| 216 result = FUNCTION_CAST<F2>(buffer)(0x100000000l, 0x100000000l); | 216 result = FUNCTION_CAST<F2>(buffer)(0x100000000l, 0x100000000l); |
| 217 CHECK_EQ(1, result); | 217 CHECK_EQ(1, result); |
| 218 result = FUNCTION_CAST<F2>(buffer)(-0x100000000l, 0x100000000l); | 218 result = FUNCTION_CAST<F2>(buffer)(-0x100000000l, 0x100000000l); |
| 219 CHECK_EQ(-1, result); | 219 CHECK_EQ(-1, result); |
| 220 } | 220 } |
| 221 | 221 |
| 222 TEST(AssemblerX64testbwqOperation) { | 222 TEST(AssemblerX64testbwqOperation) { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 __ popq(r14); | 374 __ popq(r14); |
| 375 __ popq(r13); | 375 __ popq(r13); |
| 376 __ popq(r12); | 376 __ popq(r12); |
| 377 __ popq(rsi); | 377 __ popq(rsi); |
| 378 __ popq(rdi); | 378 __ popq(rdi); |
| 379 __ popq(rbx); | 379 __ popq(rbx); |
| 380 | 380 |
| 381 __ ret(0); | 381 __ ret(0); |
| 382 | 382 |
| 383 CodeDesc desc; | 383 CodeDesc desc; |
| 384 assm.GetCode(&desc); | 384 assm.GetCode(CcTest::i_isolate(), &desc); |
| 385 // Call the function from C++. | 385 // Call the function from C++. |
| 386 int result = FUNCTION_CAST<F2>(buffer)(0, 0); | 386 int result = FUNCTION_CAST<F2>(buffer)(0, 0); |
| 387 CHECK_EQ(1, result); | 387 CHECK_EQ(1, result); |
| 388 } | 388 } |
| 389 | 389 |
| 390 TEST(AssemblerX64XchglOperations) { | 390 TEST(AssemblerX64XchglOperations) { |
| 391 CcTest::InitializeVM(); | 391 CcTest::InitializeVM(); |
| 392 // Allocate an executable page of memory. | 392 // Allocate an executable page of memory. |
| 393 size_t actual_size; | 393 size_t actual_size; |
| 394 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 394 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 395 Assembler::kMinimalBufferSize, &actual_size, true)); | 395 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 396 CHECK(buffer); | 396 CHECK(buffer); |
| 397 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 397 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 398 | 398 |
| 399 __ movq(rax, Operand(arg1, 0)); | 399 __ movq(rax, Operand(arg1, 0)); |
| 400 __ movq(r11, Operand(arg2, 0)); | 400 __ movq(r11, Operand(arg2, 0)); |
| 401 __ xchgl(rax, r11); | 401 __ xchgl(rax, r11); |
| 402 __ movq(Operand(arg1, 0), rax); | 402 __ movq(Operand(arg1, 0), rax); |
| 403 __ movq(Operand(arg2, 0), r11); | 403 __ movq(Operand(arg2, 0), r11); |
| 404 __ ret(0); | 404 __ ret(0); |
| 405 | 405 |
| 406 CodeDesc desc; | 406 CodeDesc desc; |
| 407 assm.GetCode(&desc); | 407 assm.GetCode(CcTest::i_isolate(), &desc); |
| 408 // Call the function from C++. | 408 // Call the function from C++. |
| 409 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); | 409 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); |
| 410 uint64_t right = V8_2PART_UINT64_C(0x30000000, 40000000); | 410 uint64_t right = V8_2PART_UINT64_C(0x30000000, 40000000); |
| 411 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); | 411 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); |
| 412 CHECK_EQ(V8_2PART_UINT64_C(0x00000000, 40000000), left); | 412 CHECK_EQ(V8_2PART_UINT64_C(0x00000000, 40000000), left); |
| 413 CHECK_EQ(V8_2PART_UINT64_C(0x00000000, 20000000), right); | 413 CHECK_EQ(V8_2PART_UINT64_C(0x00000000, 20000000), right); |
| 414 USE(result); | 414 USE(result); |
| 415 } | 415 } |
| 416 | 416 |
| 417 | 417 |
| 418 TEST(AssemblerX64OrlOperations) { | 418 TEST(AssemblerX64OrlOperations) { |
| 419 CcTest::InitializeVM(); | 419 CcTest::InitializeVM(); |
| 420 // Allocate an executable page of memory. | 420 // Allocate an executable page of memory. |
| 421 size_t actual_size; | 421 size_t actual_size; |
| 422 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 422 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 423 Assembler::kMinimalBufferSize, &actual_size, true)); | 423 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 424 CHECK(buffer); | 424 CHECK(buffer); |
| 425 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 425 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 426 | 426 |
| 427 __ movq(rax, Operand(arg2, 0)); | 427 __ movq(rax, Operand(arg2, 0)); |
| 428 __ orl(Operand(arg1, 0), rax); | 428 __ orl(Operand(arg1, 0), rax); |
| 429 __ ret(0); | 429 __ ret(0); |
| 430 | 430 |
| 431 CodeDesc desc; | 431 CodeDesc desc; |
| 432 assm.GetCode(&desc); | 432 assm.GetCode(CcTest::i_isolate(), &desc); |
| 433 // Call the function from C++. | 433 // Call the function from C++. |
| 434 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); | 434 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); |
| 435 uint64_t right = V8_2PART_UINT64_C(0x30000000, 40000000); | 435 uint64_t right = V8_2PART_UINT64_C(0x30000000, 40000000); |
| 436 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); | 436 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); |
| 437 CHECK_EQ(V8_2PART_UINT64_C(0x10000000, 60000000), left); | 437 CHECK_EQ(V8_2PART_UINT64_C(0x10000000, 60000000), left); |
| 438 USE(result); | 438 USE(result); |
| 439 } | 439 } |
| 440 | 440 |
| 441 | 441 |
| 442 TEST(AssemblerX64RollOperations) { | 442 TEST(AssemblerX64RollOperations) { |
| 443 CcTest::InitializeVM(); | 443 CcTest::InitializeVM(); |
| 444 // Allocate an executable page of memory. | 444 // Allocate an executable page of memory. |
| 445 size_t actual_size; | 445 size_t actual_size; |
| 446 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 446 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 447 Assembler::kMinimalBufferSize, &actual_size, true)); | 447 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 448 CHECK(buffer); | 448 CHECK(buffer); |
| 449 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 449 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 450 | 450 |
| 451 __ movq(rax, arg1); | 451 __ movq(rax, arg1); |
| 452 __ roll(rax, Immediate(1)); | 452 __ roll(rax, Immediate(1)); |
| 453 __ ret(0); | 453 __ ret(0); |
| 454 | 454 |
| 455 CodeDesc desc; | 455 CodeDesc desc; |
| 456 assm.GetCode(&desc); | 456 assm.GetCode(CcTest::i_isolate(), &desc); |
| 457 // Call the function from C++. | 457 // Call the function from C++. |
| 458 uint64_t src = V8_2PART_UINT64_C(0x10000000, C0000000); | 458 uint64_t src = V8_2PART_UINT64_C(0x10000000, C0000000); |
| 459 uint64_t result = FUNCTION_CAST<F5>(buffer)(src); | 459 uint64_t result = FUNCTION_CAST<F5>(buffer)(src); |
| 460 CHECK_EQ(V8_2PART_UINT64_C(0x00000000, 80000001), result); | 460 CHECK_EQ(V8_2PART_UINT64_C(0x00000000, 80000001), result); |
| 461 } | 461 } |
| 462 | 462 |
| 463 | 463 |
| 464 TEST(AssemblerX64SublOperations) { | 464 TEST(AssemblerX64SublOperations) { |
| 465 CcTest::InitializeVM(); | 465 CcTest::InitializeVM(); |
| 466 // Allocate an executable page of memory. | 466 // Allocate an executable page of memory. |
| 467 size_t actual_size; | 467 size_t actual_size; |
| 468 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 468 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 469 Assembler::kMinimalBufferSize, &actual_size, true)); | 469 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 470 CHECK(buffer); | 470 CHECK(buffer); |
| 471 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 471 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 472 | 472 |
| 473 __ movq(rax, Operand(arg2, 0)); | 473 __ movq(rax, Operand(arg2, 0)); |
| 474 __ subl(Operand(arg1, 0), rax); | 474 __ subl(Operand(arg1, 0), rax); |
| 475 __ ret(0); | 475 __ ret(0); |
| 476 | 476 |
| 477 CodeDesc desc; | 477 CodeDesc desc; |
| 478 assm.GetCode(&desc); | 478 assm.GetCode(CcTest::i_isolate(), &desc); |
| 479 // Call the function from C++. | 479 // Call the function from C++. |
| 480 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); | 480 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); |
| 481 uint64_t right = V8_2PART_UINT64_C(0x30000000, 40000000); | 481 uint64_t right = V8_2PART_UINT64_C(0x30000000, 40000000); |
| 482 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); | 482 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); |
| 483 CHECK_EQ(V8_2PART_UINT64_C(0x10000000, e0000000), left); | 483 CHECK_EQ(V8_2PART_UINT64_C(0x10000000, e0000000), left); |
| 484 USE(result); | 484 USE(result); |
| 485 } | 485 } |
| 486 | 486 |
| 487 | 487 |
| 488 TEST(AssemblerX64TestlOperations) { | 488 TEST(AssemblerX64TestlOperations) { |
| 489 CcTest::InitializeVM(); | 489 CcTest::InitializeVM(); |
| 490 // Allocate an executable page of memory. | 490 // Allocate an executable page of memory. |
| 491 size_t actual_size; | 491 size_t actual_size; |
| 492 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 492 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 493 Assembler::kMinimalBufferSize, &actual_size, true)); | 493 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 494 CHECK(buffer); | 494 CHECK(buffer); |
| 495 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 495 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 496 | 496 |
| 497 // Set rax with the ZF flag of the testl instruction. | 497 // Set rax with the ZF flag of the testl instruction. |
| 498 Label done; | 498 Label done; |
| 499 __ movq(rax, Immediate(1)); | 499 __ movq(rax, Immediate(1)); |
| 500 __ movq(r11, Operand(arg2, 0)); | 500 __ movq(r11, Operand(arg2, 0)); |
| 501 __ testl(Operand(arg1, 0), r11); | 501 __ testl(Operand(arg1, 0), r11); |
| 502 __ j(zero, &done, Label::kNear); | 502 __ j(zero, &done, Label::kNear); |
| 503 __ movq(rax, Immediate(0)); | 503 __ movq(rax, Immediate(0)); |
| 504 __ bind(&done); | 504 __ bind(&done); |
| 505 __ ret(0); | 505 __ ret(0); |
| 506 | 506 |
| 507 CodeDesc desc; | 507 CodeDesc desc; |
| 508 assm.GetCode(&desc); | 508 assm.GetCode(CcTest::i_isolate(), &desc); |
| 509 // Call the function from C++. | 509 // Call the function from C++. |
| 510 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); | 510 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); |
| 511 uint64_t right = V8_2PART_UINT64_C(0x30000000, 00000000); | 511 uint64_t right = V8_2PART_UINT64_C(0x30000000, 00000000); |
| 512 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); | 512 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); |
| 513 CHECK_EQ(1u, result); | 513 CHECK_EQ(1u, result); |
| 514 } | 514 } |
| 515 | 515 |
| 516 TEST(AssemblerX64TestwOperations) { | 516 TEST(AssemblerX64TestwOperations) { |
| 517 typedef uint16_t (*F)(uint16_t * x); | 517 typedef uint16_t (*F)(uint16_t * x); |
| 518 CcTest::InitializeVM(); | 518 CcTest::InitializeVM(); |
| 519 // Allocate an executable page of memory. | 519 // Allocate an executable page of memory. |
| 520 size_t actual_size; | 520 size_t actual_size; |
| 521 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 521 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 522 Assembler::kMinimalBufferSize, &actual_size, true)); | 522 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 523 CHECK(buffer); | 523 CHECK(buffer); |
| 524 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 524 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 525 | 525 |
| 526 // Set rax with the ZF flag of the testl instruction. | 526 // Set rax with the ZF flag of the testl instruction. |
| 527 Label done; | 527 Label done; |
| 528 __ movq(rax, Immediate(1)); | 528 __ movq(rax, Immediate(1)); |
| 529 __ testw(Operand(arg1, 0), Immediate(0xf0f0)); | 529 __ testw(Operand(arg1, 0), Immediate(0xf0f0)); |
| 530 __ j(not_zero, &done, Label::kNear); | 530 __ j(not_zero, &done, Label::kNear); |
| 531 __ movq(rax, Immediate(0)); | 531 __ movq(rax, Immediate(0)); |
| 532 __ bind(&done); | 532 __ bind(&done); |
| 533 __ ret(0); | 533 __ ret(0); |
| 534 | 534 |
| 535 CodeDesc desc; | 535 CodeDesc desc; |
| 536 assm.GetCode(&desc); | 536 assm.GetCode(CcTest::i_isolate(), &desc); |
| 537 // Call the function from C++. | 537 // Call the function from C++. |
| 538 uint16_t operand = 0x8000; | 538 uint16_t operand = 0x8000; |
| 539 uint16_t result = FUNCTION_CAST<F>(buffer)(&operand); | 539 uint16_t result = FUNCTION_CAST<F>(buffer)(&operand); |
| 540 CHECK_EQ(1u, result); | 540 CHECK_EQ(1u, result); |
| 541 } | 541 } |
| 542 | 542 |
| 543 TEST(AssemblerX64XorlOperations) { | 543 TEST(AssemblerX64XorlOperations) { |
| 544 CcTest::InitializeVM(); | 544 CcTest::InitializeVM(); |
| 545 // Allocate an executable page of memory. | 545 // Allocate an executable page of memory. |
| 546 size_t actual_size; | 546 size_t actual_size; |
| 547 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 547 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 548 Assembler::kMinimalBufferSize, &actual_size, true)); | 548 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 549 CHECK(buffer); | 549 CHECK(buffer); |
| 550 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 550 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 551 | 551 |
| 552 __ movq(rax, Operand(arg2, 0)); | 552 __ movq(rax, Operand(arg2, 0)); |
| 553 __ xorl(Operand(arg1, 0), rax); | 553 __ xorl(Operand(arg1, 0), rax); |
| 554 __ ret(0); | 554 __ ret(0); |
| 555 | 555 |
| 556 CodeDesc desc; | 556 CodeDesc desc; |
| 557 assm.GetCode(&desc); | 557 assm.GetCode(CcTest::i_isolate(), &desc); |
| 558 // Call the function from C++. | 558 // Call the function from C++. |
| 559 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); | 559 uint64_t left = V8_2PART_UINT64_C(0x10000000, 20000000); |
| 560 uint64_t right = V8_2PART_UINT64_C(0x30000000, 60000000); | 560 uint64_t right = V8_2PART_UINT64_C(0x30000000, 60000000); |
| 561 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); | 561 uint64_t result = FUNCTION_CAST<F4>(buffer)(&left, &right); |
| 562 CHECK_EQ(V8_2PART_UINT64_C(0x10000000, 40000000), left); | 562 CHECK_EQ(V8_2PART_UINT64_C(0x10000000, 40000000), left); |
| 563 USE(result); | 563 USE(result); |
| 564 } | 564 } |
| 565 | 565 |
| 566 | 566 |
| 567 TEST(AssemblerX64MemoryOperands) { | 567 TEST(AssemblerX64MemoryOperands) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 584 const int kStackElementSize = 8; | 584 const int kStackElementSize = 8; |
| 585 __ movq(rax, Operand(rbp, -3 * kStackElementSize)); | 585 __ movq(rax, Operand(rbp, -3 * kStackElementSize)); |
| 586 __ popq(arg2); | 586 __ popq(arg2); |
| 587 __ popq(arg2); | 587 __ popq(arg2); |
| 588 __ popq(arg2); | 588 __ popq(arg2); |
| 589 __ popq(rbp); | 589 __ popq(rbp); |
| 590 __ nop(); | 590 __ nop(); |
| 591 __ ret(0); | 591 __ ret(0); |
| 592 | 592 |
| 593 CodeDesc desc; | 593 CodeDesc desc; |
| 594 assm.GetCode(&desc); | 594 assm.GetCode(CcTest::i_isolate(), &desc); |
| 595 // Call the function from C++. | 595 // Call the function from C++. |
| 596 int result = FUNCTION_CAST<F2>(buffer)(3, 2); | 596 int result = FUNCTION_CAST<F2>(buffer)(3, 2); |
| 597 CHECK_EQ(3, result); | 597 CHECK_EQ(3, result); |
| 598 } | 598 } |
| 599 | 599 |
| 600 | 600 |
| 601 TEST(AssemblerX64ControlFlow) { | 601 TEST(AssemblerX64ControlFlow) { |
| 602 CcTest::InitializeVM(); | 602 CcTest::InitializeVM(); |
| 603 // Allocate an executable page of memory. | 603 // Allocate an executable page of memory. |
| 604 size_t actual_size; | 604 size_t actual_size; |
| 605 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 605 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 606 Assembler::kMinimalBufferSize, &actual_size, true)); | 606 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 607 CHECK(buffer); | 607 CHECK(buffer); |
| 608 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 608 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 609 | 609 |
| 610 // Assemble a simple function that copies argument 1 and returns it. | 610 // Assemble a simple function that copies argument 1 and returns it. |
| 611 __ pushq(rbp); | 611 __ pushq(rbp); |
| 612 | 612 |
| 613 __ movq(rbp, rsp); | 613 __ movq(rbp, rsp); |
| 614 __ movq(rax, arg1); | 614 __ movq(rax, arg1); |
| 615 Label target; | 615 Label target; |
| 616 __ jmp(&target); | 616 __ jmp(&target); |
| 617 __ movq(rax, arg2); | 617 __ movq(rax, arg2); |
| 618 __ bind(&target); | 618 __ bind(&target); |
| 619 __ popq(rbp); | 619 __ popq(rbp); |
| 620 __ ret(0); | 620 __ ret(0); |
| 621 | 621 |
| 622 CodeDesc desc; | 622 CodeDesc desc; |
| 623 assm.GetCode(&desc); | 623 assm.GetCode(CcTest::i_isolate(), &desc); |
| 624 // Call the function from C++. | 624 // Call the function from C++. |
| 625 int result = FUNCTION_CAST<F2>(buffer)(3, 2); | 625 int result = FUNCTION_CAST<F2>(buffer)(3, 2); |
| 626 CHECK_EQ(3, result); | 626 CHECK_EQ(3, result); |
| 627 } | 627 } |
| 628 | 628 |
| 629 | 629 |
| 630 TEST(AssemblerX64LoopImmediates) { | 630 TEST(AssemblerX64LoopImmediates) { |
| 631 CcTest::InitializeVM(); | 631 CcTest::InitializeVM(); |
| 632 // Allocate an executable page of memory. | 632 // Allocate an executable page of memory. |
| 633 size_t actual_size; | 633 size_t actual_size; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 663 __ cmpq(rax, Immediate(0x11FE7600)); | 663 __ cmpq(rax, Immediate(0x11FE7600)); |
| 664 __ j(not_equal, &Fail); | 664 __ j(not_equal, &Fail); |
| 665 | 665 |
| 666 __ movq(rax, Immediate(1)); | 666 __ movq(rax, Immediate(1)); |
| 667 __ ret(0); | 667 __ ret(0); |
| 668 __ bind(&Fail); | 668 __ bind(&Fail); |
| 669 __ movq(rax, Immediate(0)); | 669 __ movq(rax, Immediate(0)); |
| 670 __ ret(0); | 670 __ ret(0); |
| 671 | 671 |
| 672 CodeDesc desc; | 672 CodeDesc desc; |
| 673 assm.GetCode(&desc); | 673 assm.GetCode(CcTest::i_isolate(), &desc); |
| 674 // Call the function from C++. | 674 // Call the function from C++. |
| 675 int result = FUNCTION_CAST<F0>(buffer)(); | 675 int result = FUNCTION_CAST<F0>(buffer)(); |
| 676 CHECK_EQ(1, result); | 676 CHECK_EQ(1, result); |
| 677 } | 677 } |
| 678 | 678 |
| 679 | 679 |
| 680 TEST(OperandRegisterDependency) { | 680 TEST(OperandRegisterDependency) { |
| 681 int offsets[4] = {0, 1, 0xfed, 0xbeefcad}; | 681 int offsets[4] = {0, 1, 0xfed, 0xbeefcad}; |
| 682 for (int i = 0; i < 4; i++) { | 682 for (int i = 0; i < 4; i++) { |
| 683 int offset = offsets[i]; | 683 int offset = offsets[i]; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 __ bind(&fail); | 780 __ bind(&fail); |
| 781 __ movq(rax, Immediate(13)); | 781 __ movq(rax, Immediate(13)); |
| 782 __ popq(rsi); | 782 __ popq(rsi); |
| 783 __ popq(rdi); | 783 __ popq(rdi); |
| 784 __ popq(rdx); | 784 __ popq(rdx); |
| 785 __ popq(rcx); | 785 __ popq(rcx); |
| 786 __ popq(rbx); | 786 __ popq(rbx); |
| 787 __ ret(0); | 787 __ ret(0); |
| 788 | 788 |
| 789 CodeDesc desc; | 789 CodeDesc desc; |
| 790 assm.GetCode(&desc); | 790 assm.GetCode(isolate, &desc); |
| 791 Handle<Code> code = isolate->factory()->NewCode( | 791 Handle<Code> code = isolate->factory()->NewCode( |
| 792 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 792 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 793 | 793 |
| 794 F0 f = FUNCTION_CAST<F0>(code->entry()); | 794 F0 f = FUNCTION_CAST<F0>(code->entry()); |
| 795 int res = f(); | 795 int res = f(); |
| 796 CHECK_EQ(42, res); | 796 CHECK_EQ(42, res); |
| 797 } | 797 } |
| 798 | 798 |
| 799 | 799 |
| 800 #ifdef __GNUC__ | 800 #ifdef __GNUC__ |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 __ movmskps(rax, xmm0); | 836 __ movmskps(rax, xmm0); |
| 837 | 837 |
| 838 // Remove unused data from the stack. | 838 // Remove unused data from the stack. |
| 839 __ addq(rsp, Immediate(ELEMENT_COUNT * sizeof(int32_t))); | 839 __ addq(rsp, Immediate(ELEMENT_COUNT * sizeof(int32_t))); |
| 840 // Restore return address. | 840 // Restore return address. |
| 841 __ pushq(rcx); | 841 __ pushq(rcx); |
| 842 | 842 |
| 843 __ ret(0); | 843 __ ret(0); |
| 844 | 844 |
| 845 CodeDesc desc; | 845 CodeDesc desc; |
| 846 assm.GetCode(&desc); | 846 assm.GetCode(isolate, &desc); |
| 847 Handle<Code> code = isolate->factory()->NewCode( | 847 Handle<Code> code = isolate->factory()->NewCode( |
| 848 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 848 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 849 | 849 |
| 850 F0 f = FUNCTION_CAST<F0>(code->entry()); | 850 F0 f = FUNCTION_CAST<F0>(code->entry()); |
| 851 int res = f(); | 851 int res = f(); |
| 852 args.GetReturnValue().Set(v8::Integer::New(CcTest::isolate(), res)); | 852 args.GetReturnValue().Set(v8::Integer::New(CcTest::isolate(), res)); |
| 853 } | 853 } |
| 854 | 854 |
| 855 | 855 |
| 856 TEST(StackAlignmentForSSE2) { | 856 TEST(StackAlignmentForSSE2) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 v8::HandleScope scope(CcTest::isolate()); | 899 v8::HandleScope scope(CcTest::isolate()); |
| 900 byte buffer[256]; | 900 byte buffer[256]; |
| 901 Isolate* isolate = CcTest::i_isolate(); | 901 Isolate* isolate = CcTest::i_isolate(); |
| 902 Assembler assm(isolate, buffer, sizeof(buffer)); | 902 Assembler assm(isolate, buffer, sizeof(buffer)); |
| 903 { CpuFeatureScope fscope2(&assm, SSE4_1); | 903 { CpuFeatureScope fscope2(&assm, SSE4_1); |
| 904 __ extractps(rax, xmm0, 0x1); | 904 __ extractps(rax, xmm0, 0x1); |
| 905 __ ret(0); | 905 __ ret(0); |
| 906 } | 906 } |
| 907 | 907 |
| 908 CodeDesc desc; | 908 CodeDesc desc; |
| 909 assm.GetCode(&desc); | 909 assm.GetCode(isolate, &desc); |
| 910 Handle<Code> code = isolate->factory()->NewCode( | 910 Handle<Code> code = isolate->factory()->NewCode( |
| 911 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 911 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 912 #ifdef OBJECT_PRINT | 912 #ifdef OBJECT_PRINT |
| 913 OFStream os(stdout); | 913 OFStream os(stdout); |
| 914 code->Print(os); | 914 code->Print(os); |
| 915 #endif | 915 #endif |
| 916 | 916 |
| 917 F3 f = FUNCTION_CAST<F3>(code->entry()); | 917 F3 f = FUNCTION_CAST<F3>(code->entry()); |
| 918 uint64_t value1 = V8_2PART_UINT64_C(0x12345678, 87654321); | 918 uint64_t value1 = V8_2PART_UINT64_C(0x12345678, 87654321); |
| 919 CHECK_EQ(0x12345678u, f(uint64_to_double(value1))); | 919 CHECK_EQ(0x12345678u, f(uint64_to_double(value1))); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 937 __ movaps(xmm2, xmm1); | 937 __ movaps(xmm2, xmm1); |
| 938 __ addps(xmm2, xmm0); | 938 __ addps(xmm2, xmm0); |
| 939 __ mulps(xmm2, xmm1); | 939 __ mulps(xmm2, xmm1); |
| 940 __ subps(xmm2, xmm0); | 940 __ subps(xmm2, xmm0); |
| 941 __ divps(xmm2, xmm1); | 941 __ divps(xmm2, xmm1); |
| 942 __ cvttss2si(rax, xmm2); | 942 __ cvttss2si(rax, xmm2); |
| 943 __ ret(0); | 943 __ ret(0); |
| 944 } | 944 } |
| 945 | 945 |
| 946 CodeDesc desc; | 946 CodeDesc desc; |
| 947 assm.GetCode(&desc); | 947 assm.GetCode(isolate, &desc); |
| 948 Handle<Code> code = isolate->factory()->NewCode( | 948 Handle<Code> code = isolate->factory()->NewCode( |
| 949 desc, | 949 desc, |
| 950 Code::ComputeFlags(Code::STUB), | 950 Code::ComputeFlags(Code::STUB), |
| 951 Handle<Code>()); | 951 Handle<Code>()); |
| 952 #ifdef OBJECT_PRINT | 952 #ifdef OBJECT_PRINT |
| 953 OFStream os(stdout); | 953 OFStream os(stdout); |
| 954 code->Print(os); | 954 code->Print(os); |
| 955 #endif | 955 #endif |
| 956 | 956 |
| 957 F6 f = FUNCTION_CAST<F6>(code->entry()); | 957 F6 f = FUNCTION_CAST<F6>(code->entry()); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1165 __ j(not_equal, &exit); | 1165 __ j(not_equal, &exit); |
| 1166 | 1166 |
| 1167 | 1167 |
| 1168 __ xorl(rax, rax); | 1168 __ xorl(rax, rax); |
| 1169 __ bind(&exit); | 1169 __ bind(&exit); |
| 1170 __ addq(rsp, Immediate(kDoubleSize)); | 1170 __ addq(rsp, Immediate(kDoubleSize)); |
| 1171 __ ret(0); | 1171 __ ret(0); |
| 1172 } | 1172 } |
| 1173 | 1173 |
| 1174 CodeDesc desc; | 1174 CodeDesc desc; |
| 1175 assm.GetCode(&desc); | 1175 assm.GetCode(isolate, &desc); |
| 1176 Handle<Code> code = isolate->factory()->NewCode( | 1176 Handle<Code> code = isolate->factory()->NewCode( |
| 1177 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1177 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 1178 #ifdef OBJECT_PRINT | 1178 #ifdef OBJECT_PRINT |
| 1179 OFStream os(stdout); | 1179 OFStream os(stdout); |
| 1180 code->Print(os); | 1180 code->Print(os); |
| 1181 #endif | 1181 #endif |
| 1182 | 1182 |
| 1183 F7 f = FUNCTION_CAST<F7>(code->entry()); | 1183 F7 f = FUNCTION_CAST<F7>(code->entry()); |
| 1184 CHECK_EQ(0, f(0.000092662107262076, -2.460774966188315, -1.0958787393627414)); | 1184 CHECK_EQ(0, f(0.000092662107262076, -2.460774966188315, -1.0958787393627414)); |
| 1185 } | 1185 } |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1391 __ j(not_equal, &exit); | 1391 __ j(not_equal, &exit); |
| 1392 | 1392 |
| 1393 | 1393 |
| 1394 __ xorl(rax, rax); | 1394 __ xorl(rax, rax); |
| 1395 __ bind(&exit); | 1395 __ bind(&exit); |
| 1396 __ addq(rsp, Immediate(kDoubleSize)); | 1396 __ addq(rsp, Immediate(kDoubleSize)); |
| 1397 __ ret(0); | 1397 __ ret(0); |
| 1398 } | 1398 } |
| 1399 | 1399 |
| 1400 CodeDesc desc; | 1400 CodeDesc desc; |
| 1401 assm.GetCode(&desc); | 1401 assm.GetCode(isolate, &desc); |
| 1402 Handle<Code> code = isolate->factory()->NewCode( | 1402 Handle<Code> code = isolate->factory()->NewCode( |
| 1403 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1403 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 1404 #ifdef OBJECT_PRINT | 1404 #ifdef OBJECT_PRINT |
| 1405 OFStream os(stdout); | 1405 OFStream os(stdout); |
| 1406 code->Print(os); | 1406 code->Print(os); |
| 1407 #endif | 1407 #endif |
| 1408 | 1408 |
| 1409 F8 f = FUNCTION_CAST<F8>(code->entry()); | 1409 F8 f = FUNCTION_CAST<F8>(code->entry()); |
| 1410 CHECK_EQ(0, f(9.26621069e-05f, -2.4607749f, -1.09587872f)); | 1410 CHECK_EQ(0, f(9.26621069e-05f, -2.4607749f, -1.09587872f)); |
| 1411 } | 1411 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1466 __ j(parity_even, &exit); | 1466 __ j(parity_even, &exit); |
| 1467 __ j(not_equal, &exit); | 1467 __ j(not_equal, &exit); |
| 1468 __ movl(rax, Immediate(6)); | 1468 __ movl(rax, Immediate(6)); |
| 1469 | 1469 |
| 1470 // result in eax | 1470 // result in eax |
| 1471 __ bind(&exit); | 1471 __ bind(&exit); |
| 1472 __ ret(0); | 1472 __ ret(0); |
| 1473 } | 1473 } |
| 1474 | 1474 |
| 1475 CodeDesc desc; | 1475 CodeDesc desc; |
| 1476 assm.GetCode(&desc); | 1476 assm.GetCode(isolate, &desc); |
| 1477 Handle<Code> code = isolate->factory()->NewCode( | 1477 Handle<Code> code = isolate->factory()->NewCode( |
| 1478 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1478 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 1479 #ifdef OBJECT_PRINT | 1479 #ifdef OBJECT_PRINT |
| 1480 OFStream os(stdout); | 1480 OFStream os(stdout); |
| 1481 code->Print(os); | 1481 code->Print(os); |
| 1482 #endif | 1482 #endif |
| 1483 | 1483 |
| 1484 F8 f = FUNCTION_CAST<F8>(code->entry()); | 1484 F8 f = FUNCTION_CAST<F8>(code->entry()); |
| 1485 int res = f(1.0f, 2.0f, 3.0f); | 1485 int res = f(1.0f, 2.0f, 3.0f); |
| 1486 PrintF("f(1,2,3) = %d\n", res); | 1486 PrintF("f(1,2,3) = %d\n", res); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1551 __ j(not_equal, &exit); | 1551 __ j(not_equal, &exit); |
| 1552 __ movl(rax, Immediate(6)); | 1552 __ movl(rax, Immediate(6)); |
| 1553 | 1553 |
| 1554 // result in eax | 1554 // result in eax |
| 1555 __ bind(&exit); | 1555 __ bind(&exit); |
| 1556 __ addq(rsp, Immediate(kDoubleSize * 2)); | 1556 __ addq(rsp, Immediate(kDoubleSize * 2)); |
| 1557 __ ret(0); | 1557 __ ret(0); |
| 1558 } | 1558 } |
| 1559 | 1559 |
| 1560 CodeDesc desc; | 1560 CodeDesc desc; |
| 1561 assm.GetCode(&desc); | 1561 assm.GetCode(isolate, &desc); |
| 1562 Handle<Code> code = isolate->factory()->NewCode( | 1562 Handle<Code> code = isolate->factory()->NewCode( |
| 1563 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1563 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 1564 #ifdef OBJECT_PRINT | 1564 #ifdef OBJECT_PRINT |
| 1565 OFStream os(stdout); | 1565 OFStream os(stdout); |
| 1566 code->Print(os); | 1566 code->Print(os); |
| 1567 #endif | 1567 #endif |
| 1568 | 1568 |
| 1569 F8 f = FUNCTION_CAST<F8>(code->entry()); | 1569 F8 f = FUNCTION_CAST<F8>(code->entry()); |
| 1570 int res = f(1.0f, 2.0f, 3.0f); | 1570 int res = f(1.0f, 2.0f, 3.0f); |
| 1571 PrintF("f(1,2,3) = %d\n", res); | 1571 PrintF("f(1,2,3) = %d\n", res); |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1790 __ j(not_equal, &exit); | 1790 __ j(not_equal, &exit); |
| 1791 __ movl(rax, Immediate(6)); | 1791 __ movl(rax, Immediate(6)); |
| 1792 | 1792 |
| 1793 // result in eax | 1793 // result in eax |
| 1794 __ bind(&exit); | 1794 __ bind(&exit); |
| 1795 __ addq(rsp, Immediate(kDoubleSize * 2)); | 1795 __ addq(rsp, Immediate(kDoubleSize * 2)); |
| 1796 __ ret(0); | 1796 __ ret(0); |
| 1797 } | 1797 } |
| 1798 | 1798 |
| 1799 CodeDesc desc; | 1799 CodeDesc desc; |
| 1800 assm.GetCode(&desc); | 1800 assm.GetCode(isolate, &desc); |
| 1801 Handle<Code> code = isolate->factory()->NewCode( | 1801 Handle<Code> code = isolate->factory()->NewCode( |
| 1802 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1802 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 1803 #ifdef OBJECT_PRINT | 1803 #ifdef OBJECT_PRINT |
| 1804 OFStream os(stdout); | 1804 OFStream os(stdout); |
| 1805 code->Print(os); | 1805 code->Print(os); |
| 1806 #endif | 1806 #endif |
| 1807 | 1807 |
| 1808 F7 f = FUNCTION_CAST<F7>(code->entry()); | 1808 F7 f = FUNCTION_CAST<F7>(code->entry()); |
| 1809 int res = f(1.0, 2.0, 3.0); | 1809 int res = f(1.0, 2.0, 3.0); |
| 1810 PrintF("f(1,2,3) = %d\n", res); | 1810 PrintF("f(1,2,3) = %d\n", res); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1982 __ cmpq(r8, r9); | 1982 __ cmpq(r8, r9); |
| 1983 __ j(not_equal, &exit); | 1983 __ j(not_equal, &exit); |
| 1984 | 1984 |
| 1985 __ xorl(rax, rax); | 1985 __ xorl(rax, rax); |
| 1986 __ bind(&exit); | 1986 __ bind(&exit); |
| 1987 __ popq(rcx); | 1987 __ popq(rcx); |
| 1988 __ ret(0); | 1988 __ ret(0); |
| 1989 } | 1989 } |
| 1990 | 1990 |
| 1991 CodeDesc desc; | 1991 CodeDesc desc; |
| 1992 assm.GetCode(&desc); | 1992 assm.GetCode(isolate, &desc); |
| 1993 Handle<Code> code = isolate->factory()->NewCode( | 1993 Handle<Code> code = isolate->factory()->NewCode( |
| 1994 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1994 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 1995 #ifdef OBJECT_PRINT | 1995 #ifdef OBJECT_PRINT |
| 1996 OFStream os(stdout); | 1996 OFStream os(stdout); |
| 1997 code->Print(os); | 1997 code->Print(os); |
| 1998 #endif | 1998 #endif |
| 1999 | 1999 |
| 2000 F0 f = FUNCTION_CAST<F0>(code->entry()); | 2000 F0 f = FUNCTION_CAST<F0>(code->entry()); |
| 2001 CHECK_EQ(0, f()); | 2001 CHECK_EQ(0, f()); |
| 2002 } | 2002 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2042 __ cmpq(r8, r9); | 2042 __ cmpq(r8, r9); |
| 2043 __ j(not_equal, &exit); | 2043 __ j(not_equal, &exit); |
| 2044 | 2044 |
| 2045 __ xorl(rax, rax); | 2045 __ xorl(rax, rax); |
| 2046 __ bind(&exit); | 2046 __ bind(&exit); |
| 2047 __ popq(rcx); | 2047 __ popq(rcx); |
| 2048 __ ret(0); | 2048 __ ret(0); |
| 2049 } | 2049 } |
| 2050 | 2050 |
| 2051 CodeDesc desc; | 2051 CodeDesc desc; |
| 2052 assm.GetCode(&desc); | 2052 assm.GetCode(isolate, &desc); |
| 2053 Handle<Code> code = isolate->factory()->NewCode( | 2053 Handle<Code> code = isolate->factory()->NewCode( |
| 2054 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 2054 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 2055 #ifdef OBJECT_PRINT | 2055 #ifdef OBJECT_PRINT |
| 2056 OFStream os(stdout); | 2056 OFStream os(stdout); |
| 2057 code->Print(os); | 2057 code->Print(os); |
| 2058 #endif | 2058 #endif |
| 2059 | 2059 |
| 2060 F0 f = FUNCTION_CAST<F0>(code->entry()); | 2060 F0 f = FUNCTION_CAST<F0>(code->entry()); |
| 2061 CHECK_EQ(0, f()); | 2061 CHECK_EQ(0, f()); |
| 2062 } | 2062 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2102 __ cmpq(r8, r9); | 2102 __ cmpq(r8, r9); |
| 2103 __ j(not_equal, &exit); | 2103 __ j(not_equal, &exit); |
| 2104 | 2104 |
| 2105 __ xorl(rax, rax); | 2105 __ xorl(rax, rax); |
| 2106 __ bind(&exit); | 2106 __ bind(&exit); |
| 2107 __ popq(rcx); | 2107 __ popq(rcx); |
| 2108 __ ret(0); | 2108 __ ret(0); |
| 2109 } | 2109 } |
| 2110 | 2110 |
| 2111 CodeDesc desc; | 2111 CodeDesc desc; |
| 2112 assm.GetCode(&desc); | 2112 assm.GetCode(isolate, &desc); |
| 2113 Handle<Code> code = isolate->factory()->NewCode( | 2113 Handle<Code> code = isolate->factory()->NewCode( |
| 2114 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 2114 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 2115 #ifdef OBJECT_PRINT | 2115 #ifdef OBJECT_PRINT |
| 2116 OFStream os(stdout); | 2116 OFStream os(stdout); |
| 2117 code->Print(os); | 2117 code->Print(os); |
| 2118 #endif | 2118 #endif |
| 2119 | 2119 |
| 2120 F0 f = FUNCTION_CAST<F0>(code->entry()); | 2120 F0 f = FUNCTION_CAST<F0>(code->entry()); |
| 2121 CHECK_EQ(0, f()); | 2121 CHECK_EQ(0, f()); |
| 2122 } | 2122 } |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2365 __ j(not_equal, &exit); | 2365 __ j(not_equal, &exit); |
| 2366 | 2366 |
| 2367 __ xorl(rax, rax); | 2367 __ xorl(rax, rax); |
| 2368 __ bind(&exit); | 2368 __ bind(&exit); |
| 2369 __ popq(rcx); | 2369 __ popq(rcx); |
| 2370 __ popq(rbx); | 2370 __ popq(rbx); |
| 2371 __ ret(0); | 2371 __ ret(0); |
| 2372 } | 2372 } |
| 2373 | 2373 |
| 2374 CodeDesc desc; | 2374 CodeDesc desc; |
| 2375 assm.GetCode(&desc); | 2375 assm.GetCode(isolate, &desc); |
| 2376 Handle<Code> code = isolate->factory()->NewCode( | 2376 Handle<Code> code = isolate->factory()->NewCode( |
| 2377 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 2377 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 2378 #ifdef OBJECT_PRINT | 2378 #ifdef OBJECT_PRINT |
| 2379 OFStream os(stdout); | 2379 OFStream os(stdout); |
| 2380 code->Print(os); | 2380 code->Print(os); |
| 2381 #endif | 2381 #endif |
| 2382 | 2382 |
| 2383 F0 f = FUNCTION_CAST<F0>(code->entry()); | 2383 F0 f = FUNCTION_CAST<F0>(code->entry()); |
| 2384 CHECK_EQ(0, f()); | 2384 CHECK_EQ(0, f()); |
| 2385 } | 2385 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2410 for (int i = 0; i < kNumCases; ++i) { | 2410 for (int i = 0; i < kNumCases; ++i) { |
| 2411 __ bind(&labels[i]); | 2411 __ bind(&labels[i]); |
| 2412 __ movq(rax, Immediate(values[i])); | 2412 __ movq(rax, Immediate(values[i])); |
| 2413 __ jmp(&done); | 2413 __ jmp(&done); |
| 2414 } | 2414 } |
| 2415 | 2415 |
| 2416 __ bind(&done); | 2416 __ bind(&done); |
| 2417 __ ret(0); | 2417 __ ret(0); |
| 2418 | 2418 |
| 2419 CodeDesc desc; | 2419 CodeDesc desc; |
| 2420 assm.GetCode(&desc); | 2420 assm.GetCode(isolate, &desc); |
| 2421 Handle<Code> code = isolate->factory()->NewCode( | 2421 Handle<Code> code = isolate->factory()->NewCode( |
| 2422 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 2422 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 2423 #ifdef OBJECT_PRINT | 2423 #ifdef OBJECT_PRINT |
| 2424 code->Print(std::cout); | 2424 code->Print(std::cout); |
| 2425 #endif | 2425 #endif |
| 2426 | 2426 |
| 2427 F1 f = FUNCTION_CAST<F1>(code->entry()); | 2427 F1 f = FUNCTION_CAST<F1>(code->entry()); |
| 2428 for (int i = 0; i < kNumCases; ++i) { | 2428 for (int i = 0; i < kNumCases; ++i) { |
| 2429 int res = f(i); | 2429 int res = f(i); |
| 2430 PrintF("f(%d) = %d\n", i, res); | 2430 PrintF("f(%d) = %d\n", i, res); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2459 | 2459 |
| 2460 __ bind(&done); | 2460 __ bind(&done); |
| 2461 __ ret(0); | 2461 __ ret(0); |
| 2462 | 2462 |
| 2463 __ bind(&table); | 2463 __ bind(&table); |
| 2464 for (int i = 0; i < kNumCases; ++i) { | 2464 for (int i = 0; i < kNumCases; ++i) { |
| 2465 __ dq(&labels[i]); | 2465 __ dq(&labels[i]); |
| 2466 } | 2466 } |
| 2467 | 2467 |
| 2468 CodeDesc desc; | 2468 CodeDesc desc; |
| 2469 assm.GetCode(&desc); | 2469 assm.GetCode(isolate, &desc); |
| 2470 Handle<Code> code = isolate->factory()->NewCode( | 2470 Handle<Code> code = isolate->factory()->NewCode( |
| 2471 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 2471 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 2472 #ifdef OBJECT_PRINT | 2472 #ifdef OBJECT_PRINT |
| 2473 code->Print(std::cout); | 2473 code->Print(std::cout); |
| 2474 #endif | 2474 #endif |
| 2475 | 2475 |
| 2476 F1 f = FUNCTION_CAST<F1>(code->entry()); | 2476 F1 f = FUNCTION_CAST<F1>(code->entry()); |
| 2477 for (int i = 0; i < kNumCases; ++i) { | 2477 for (int i = 0; i < kNumCases; ++i) { |
| 2478 int res = f(i); | 2478 int res = f(i); |
| 2479 PrintF("f(%d) = %d\n", i, res); | 2479 PrintF("f(%d) = %d\n", i, res); |
| 2480 CHECK_EQ(values[i], res); | 2480 CHECK_EQ(values[i], res); |
| 2481 } | 2481 } |
| 2482 } | 2482 } |
| 2483 | 2483 |
| 2484 TEST(AssemblerX64PslldWithXmm15) { | 2484 TEST(AssemblerX64PslldWithXmm15) { |
| 2485 CcTest::InitializeVM(); | 2485 CcTest::InitializeVM(); |
| 2486 // Allocate an executable page of memory. | 2486 // Allocate an executable page of memory. |
| 2487 size_t actual_size; | 2487 size_t actual_size; |
| 2488 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 2488 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
| 2489 Assembler::kMinimalBufferSize, &actual_size, true)); | 2489 Assembler::kMinimalBufferSize, &actual_size, true)); |
| 2490 CHECK(buffer); | 2490 CHECK(buffer); |
| 2491 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); | 2491 Assembler assm(CcTest::i_isolate(), buffer, static_cast<int>(actual_size)); |
| 2492 | 2492 |
| 2493 __ movq(xmm15, arg1); | 2493 __ movq(xmm15, arg1); |
| 2494 __ pslld(xmm15, 1); | 2494 __ pslld(xmm15, 1); |
| 2495 __ movq(rax, xmm15); | 2495 __ movq(rax, xmm15); |
| 2496 __ ret(0); | 2496 __ ret(0); |
| 2497 | 2497 |
| 2498 CodeDesc desc; | 2498 CodeDesc desc; |
| 2499 assm.GetCode(&desc); | 2499 assm.GetCode(CcTest::i_isolate(), &desc); |
| 2500 uint64_t result = FUNCTION_CAST<F5>(buffer)(V8_UINT64_C(0x1122334455667788)); | 2500 uint64_t result = FUNCTION_CAST<F5>(buffer)(V8_UINT64_C(0x1122334455667788)); |
| 2501 CHECK_EQ(V8_UINT64_C(0x22446688aaccef10), result); | 2501 CHECK_EQ(V8_UINT64_C(0x22446688aaccef10), result); |
| 2502 } | 2502 } |
| 2503 | 2503 |
| 2504 typedef float (*F9)(float x, float y); | 2504 typedef float (*F9)(float x, float y); |
| 2505 TEST(AssemblerX64vmovups) { | 2505 TEST(AssemblerX64vmovups) { |
| 2506 CcTest::InitializeVM(); | 2506 CcTest::InitializeVM(); |
| 2507 if (!CpuFeatures::IsSupported(AVX)) return; | 2507 if (!CpuFeatures::IsSupported(AVX)) return; |
| 2508 | 2508 |
| 2509 Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); | 2509 Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); |
| 2510 HandleScope scope(isolate); | 2510 HandleScope scope(isolate); |
| 2511 v8::internal::byte buffer[256]; | 2511 v8::internal::byte buffer[256]; |
| 2512 MacroAssembler assm(isolate, buffer, sizeof(buffer), | 2512 MacroAssembler assm(isolate, buffer, sizeof(buffer), |
| 2513 v8::internal::CodeObjectRequired::kYes); | 2513 v8::internal::CodeObjectRequired::kYes); |
| 2514 { | 2514 { |
| 2515 CpuFeatureScope avx_scope(&assm, AVX); | 2515 CpuFeatureScope avx_scope(&assm, AVX); |
| 2516 __ shufps(xmm0, xmm0, 0x0); // brocast first argument | 2516 __ shufps(xmm0, xmm0, 0x0); // brocast first argument |
| 2517 __ shufps(xmm1, xmm1, 0x0); // brocast second argument | 2517 __ shufps(xmm1, xmm1, 0x0); // brocast second argument |
| 2518 // copy xmm1 to xmm0 through the stack to test the "vmovups reg, mem". | 2518 // copy xmm1 to xmm0 through the stack to test the "vmovups reg, mem". |
| 2519 __ subq(rsp, Immediate(kSimd128Size)); | 2519 __ subq(rsp, Immediate(kSimd128Size)); |
| 2520 __ vmovups(Operand(rsp, 0), xmm1); | 2520 __ vmovups(Operand(rsp, 0), xmm1); |
| 2521 __ vmovups(xmm0, Operand(rsp, 0)); | 2521 __ vmovups(xmm0, Operand(rsp, 0)); |
| 2522 __ addq(rsp, Immediate(kSimd128Size)); | 2522 __ addq(rsp, Immediate(kSimd128Size)); |
| 2523 | 2523 |
| 2524 __ ret(0); | 2524 __ ret(0); |
| 2525 } | 2525 } |
| 2526 | 2526 |
| 2527 CodeDesc desc; | 2527 CodeDesc desc; |
| 2528 assm.GetCode(&desc); | 2528 assm.GetCode(isolate, &desc); |
| 2529 Handle<Code> code = isolate->factory()->NewCode( | 2529 Handle<Code> code = isolate->factory()->NewCode( |
| 2530 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 2530 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 2531 #ifdef OBJECT_PRINT | 2531 #ifdef OBJECT_PRINT |
| 2532 OFStream os(stdout); | 2532 OFStream os(stdout); |
| 2533 code->Print(os); | 2533 code->Print(os); |
| 2534 #endif | 2534 #endif |
| 2535 | 2535 |
| 2536 F9 f = FUNCTION_CAST<F9>(code->entry()); | 2536 F9 f = FUNCTION_CAST<F9>(code->entry()); |
| 2537 CHECK_EQ(-1.5, f(1.5, -1.5)); | 2537 CHECK_EQ(-1.5, f(1.5, -1.5)); |
| 2538 } | 2538 } |
| 2539 | 2539 |
| 2540 #undef __ | 2540 #undef __ |
| OLD | NEW |