OLD | NEW |
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 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 } | 398 } |
399 for (int i = 0; i < 8; i++) { | 399 for (int i = 0; i < 8; i++) { |
400 CHECK_EQ(-i, t.i16x8_high[i]); | 400 CHECK_EQ(-i, t.i16x8_high[i]); |
401 } | 401 } |
402 for (int i = 0; i < 16; i++) { | 402 for (int i = 0; i < 16; i++) { |
403 CHECK_EQ(-i, t.i8x16_high[i]); | 403 CHECK_EQ(-i, t.i8x16_high[i]); |
404 } | 404 } |
405 } | 405 } |
406 } | 406 } |
407 | 407 |
408 #define CHECK_EQ_32X4(field, v0, v1, v2, v3) \ | |
409 CHECK_EQ(v0, t.field[0]); \ | |
410 CHECK_EQ(v1, t.field[1]); \ | |
411 CHECK_EQ(v2, t.field[2]); \ | |
412 CHECK_EQ(v3, t.field[3]); | |
413 | |
414 TEST(Swizzle) { | |
415 if (!CpuFeatures::IsSupported(NEON)) return; | |
416 | |
417 // Allocate an executable page of memory. | |
418 size_t actual_size; | |
419 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | |
420 Assembler::kMinimalBufferSize, &actual_size, true)); | |
421 CHECK(buffer); | |
422 Isolate* isolate = CcTest::i_isolate(); | |
423 HandleScope handles(isolate); | |
424 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size), | |
425 v8::internal::CodeObjectRequired::kYes); | |
426 MacroAssembler* masm = &assembler; // Create a pointer for the __ macro. | |
427 | |
428 typedef struct { | |
429 int32_t _32x4_3210[4]; // identity | |
430 int32_t _32x4_1032[4]; // high / low swap | |
431 int32_t _32x4_0000[4]; // vdup's | |
432 int32_t _32x4_1111[4]; | |
433 int32_t _32x4_2222[4]; | |
434 int32_t _32x4_3333[4]; | |
435 int32_t _32x4_2103[4]; // rotate left | |
436 int32_t _32x4_0321[4]; // rotate right | |
437 int32_t _32x4_1132[4]; // irregular | |
438 int32_t _32x4_1132_in_place[4]; // irregular, in-place | |
439 } T; | |
440 T t; | |
441 | |
442 __ stm(db_w, sp, r4.bit() | r5.bit() | r6.bit() | r7.bit() | lr.bit()); | |
443 | |
444 const Register kScratch = r5; | |
445 | |
446 // Make test vector [0, 1, 2, 3] | |
447 __ veor(q1, q1, q1); // Zero | |
448 for (int i = 0; i < 4; i++) { | |
449 __ mov(r4, Operand(i)); | |
450 __ ReplaceLane(q1, q1, r4, NeonS32, i); | |
451 } | |
452 __ Swizzle(q0, q1, kScratch, Neon32, 0x3210); | |
453 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_3210)))); | |
454 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
455 | |
456 __ Swizzle(q0, q1, kScratch, Neon32, 0x1032); | |
457 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_1032)))); | |
458 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
459 | |
460 __ Swizzle(q0, q1, kScratch, Neon32, 0x0000); | |
461 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_0000)))); | |
462 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
463 | |
464 __ Swizzle(q0, q1, kScratch, Neon32, 0x1111); | |
465 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_1111)))); | |
466 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
467 | |
468 __ Swizzle(q0, q1, kScratch, Neon32, 0x2222); | |
469 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_2222)))); | |
470 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
471 | |
472 __ Swizzle(q0, q1, kScratch, Neon32, 0x3333); | |
473 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_3333)))); | |
474 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
475 | |
476 __ Swizzle(q0, q1, kScratch, Neon32, 0x2103); | |
477 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_2103)))); | |
478 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
479 | |
480 __ Swizzle(q0, q1, kScratch, Neon32, 0x0321); | |
481 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_0321)))); | |
482 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
483 | |
484 __ Swizzle(q0, q1, kScratch, Neon32, 0x1132); | |
485 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, _32x4_1132)))); | |
486 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
487 | |
488 __ vmov(q0, q1); | |
489 __ Swizzle(q0, q0, kScratch, Neon32, 0x1132); | |
490 __ add(r4, r0, | |
491 Operand(static_cast<int32_t>(offsetof(T, _32x4_1132_in_place)))); | |
492 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); | |
493 | |
494 __ ldm(ia_w, sp, r4.bit() | r5.bit() | r6.bit() | r7.bit() | pc.bit()); | |
495 | |
496 CodeDesc desc; | |
497 masm->GetCode(&desc); | |
498 Handle<Code> code = isolate->factory()->NewCode( | |
499 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | |
500 #ifdef DEBUG | |
501 OFStream os(stdout); | |
502 code->Print(os); | |
503 #endif | |
504 F3 f = FUNCTION_CAST<F3>(code->entry()); | |
505 Object* dummy = CALL_GENERATED_CODE(isolate, f, &t, 0, 0, 0, 0); | |
506 USE(dummy); | |
507 CHECK_EQ_32X4(_32x4_3210, 0, 1, 2, 3); | |
508 CHECK_EQ_32X4(_32x4_1032, 2, 3, 0, 1); | |
509 CHECK_EQ_32X4(_32x4_0000, 0, 0, 0, 0); | |
510 CHECK_EQ_32X4(_32x4_1111, 1, 1, 1, 1); | |
511 CHECK_EQ_32X4(_32x4_2222, 2, 2, 2, 2); | |
512 CHECK_EQ_32X4(_32x4_3333, 3, 3, 3, 3); | |
513 CHECK_EQ_32X4(_32x4_2103, 3, 0, 1, 2); | |
514 CHECK_EQ_32X4(_32x4_0321, 1, 2, 3, 0); | |
515 CHECK_EQ_32X4(_32x4_1132, 2, 3, 1, 1); | |
516 CHECK_EQ_32X4(_32x4_1132_in_place, 2, 3, 1, 1); | |
517 } | |
518 | |
519 #undef __ | 408 #undef __ |
OLD | NEW |