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

Side by Side Diff: src/x64/macro-assembler-x64.cc

Issue 90643003: Experimental implementation: Exposing SIMD instructions into JavaScript Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | src/x64/stub-cache-x64.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 883 matching lines...) Expand 10 before | Expand all | Expand 10 after
894 // store the registers in any particular way, but we do have to store and 894 // store the registers in any particular way, but we do have to store and
895 // restore them. 895 // restore them.
896 for (int i = 0; i < kNumberOfSavedRegs; i++) { 896 for (int i = 0; i < kNumberOfSavedRegs; i++) {
897 Register reg = saved_regs[i]; 897 Register reg = saved_regs[i];
898 if (!reg.is(exclusion1) && !reg.is(exclusion2) && !reg.is(exclusion3)) { 898 if (!reg.is(exclusion1) && !reg.is(exclusion2) && !reg.is(exclusion3)) {
899 push(reg); 899 push(reg);
900 } 900 }
901 } 901 }
902 // R12 to r15 are callee save on all platforms. 902 // R12 to r15 are callee save on all platforms.
903 if (fp_mode == kSaveFPRegs) { 903 if (fp_mode == kSaveFPRegs) {
904 subq(rsp, Immediate(kDoubleSize * XMMRegister::kMaxNumRegisters)); 904 subq(rsp, Immediate(kFloat32x4Size * XMMRegister::kMaxNumRegisters));
905 for (int i = 0; i < XMMRegister::kMaxNumRegisters; i++) { 905 for (int i = 0; i < XMMRegister::kMaxNumRegisters; i++) {
906 XMMRegister reg = XMMRegister::from_code(i); 906 XMMRegister reg = XMMRegister::from_code(i);
907 movsd(Operand(rsp, i * kDoubleSize), reg); 907 movups(Operand(rsp, i * kFloat32x4Size), reg);
908 } 908 }
909 } 909 }
910 } 910 }
911 911
912 912
913 void MacroAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, 913 void MacroAssembler::PopCallerSaved(SaveFPRegsMode fp_mode,
914 Register exclusion1, 914 Register exclusion1,
915 Register exclusion2, 915 Register exclusion2,
916 Register exclusion3) { 916 Register exclusion3) {
917 if (fp_mode == kSaveFPRegs) { 917 if (fp_mode == kSaveFPRegs) {
918 for (int i = 0; i < XMMRegister::kMaxNumRegisters; i++) { 918 for (int i = 0; i < XMMRegister::kMaxNumRegisters; i++) {
919 XMMRegister reg = XMMRegister::from_code(i); 919 XMMRegister reg = XMMRegister::from_code(i);
920 movsd(reg, Operand(rsp, i * kDoubleSize)); 920 movups(reg, Operand(rsp, i * kFloat32x4Size));
921 } 921 }
922 addq(rsp, Immediate(kDoubleSize * XMMRegister::kMaxNumRegisters)); 922 addq(rsp, Immediate(kFloat32x4Size * XMMRegister::kMaxNumRegisters));
923 } 923 }
924 for (int i = kNumberOfSavedRegs - 1; i >= 0; i--) { 924 for (int i = kNumberOfSavedRegs - 1; i >= 0; i--) {
925 Register reg = saved_regs[i]; 925 Register reg = saved_regs[i];
926 if (!reg.is(exclusion1) && !reg.is(exclusion2) && !reg.is(exclusion3)) { 926 if (!reg.is(exclusion1) && !reg.is(exclusion2) && !reg.is(exclusion3)) {
927 pop(reg); 927 pop(reg);
928 } 928 }
929 } 929 }
930 } 930 }
931 931
932 932
(...skipping 1437 matching lines...) Expand 10 before | Expand all | Expand 10 after
2370 bind(&load_result_from_cache); 2370 bind(&load_result_from_cache);
2371 movq(result, 2371 movq(result,
2372 FieldOperand(number_string_cache, 2372 FieldOperand(number_string_cache,
2373 index, 2373 index,
2374 times_1, 2374 times_1,
2375 FixedArray::kHeaderSize + kPointerSize)); 2375 FixedArray::kHeaderSize + kPointerSize));
2376 IncrementCounter(isolate()->counters()->number_to_string_native(), 1); 2376 IncrementCounter(isolate()->counters()->number_to_string_native(), 1);
2377 } 2377 }
2378 2378
2379 2379
2380 void MacroAssembler::absps(XMMRegister dst) {
2381 static const struct V8_ALIGNED(16) {
2382 uint32_t a;
2383 uint32_t b;
2384 uint32_t c;
2385 uint32_t d;
2386 } float_absolute_constant =
2387 { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
2388 Set(kScratchRegister, reinterpret_cast<intptr_t>(&float_absolute_constant));
2389 andps(dst, Operand(kScratchRegister, 0));
2390 }
2391
2392
2393 void MacroAssembler::negateps(XMMRegister dst) {
2394 static const struct V8_ALIGNED(16) {
2395 uint32_t a;
2396 uint32_t b;
2397 uint32_t c;
2398 uint32_t d;
2399 } float_negate_constant =
2400 { 0x80000000, 0x80000000, 0x80000000, 0x80000000 };
2401 Set(kScratchRegister, reinterpret_cast<intptr_t>(&float_negate_constant));
2402 xorps(dst, Operand(kScratchRegister, 0));
2403 }
2404
2405
2406 void MacroAssembler::notps(XMMRegister dst) {
2407 static const struct V8_ALIGNED(16) {
2408 uint32_t a;
2409 uint32_t b;
2410 uint32_t c;
2411 uint32_t d;
2412 } float_not_constant =
2413 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
2414 Set(kScratchRegister, reinterpret_cast<intptr_t>(&float_not_constant));
2415 xorps(dst, Operand(kScratchRegister, 0));
2416 }
2417
2418
2419 void MacroAssembler::pnegd(XMMRegister dst) {
2420 static const struct V8_ALIGNED(16) {
2421 uint32_t a;
2422 uint32_t b;
2423 uint32_t c;
2424 uint32_t d;
2425 } int32_one_constant = { 0x1, 0x1, 0x1, 0x1 };
2426 notps(dst);
2427 Set(kScratchRegister, reinterpret_cast<intptr_t>(&int32_one_constant));
2428 paddd(dst, Operand(kScratchRegister, 0));
2429 }
2430
2431
2432
2380 void MacroAssembler::JumpIfNotString(Register object, 2433 void MacroAssembler::JumpIfNotString(Register object,
2381 Register object_map, 2434 Register object_map,
2382 Label* not_string, 2435 Label* not_string,
2383 Label::Distance near_jump) { 2436 Label::Distance near_jump) {
2384 Condition is_smi = CheckSmi(object); 2437 Condition is_smi = CheckSmi(object);
2385 j(is_smi, not_string, near_jump); 2438 j(is_smi, not_string, near_jump);
2386 CmpObjectType(object, FIRST_NONSTRING_TYPE, object_map); 2439 CmpObjectType(object, FIRST_NONSTRING_TYPE, object_map);
2387 j(above_equal, not_string, near_jump); 2440 j(above_equal, not_string, near_jump);
2388 } 2441 }
2389 2442
(...skipping 1387 matching lines...) Expand 10 before | Expand all | Expand 10 after
3777 3830
3778 3831
3779 void MacroAssembler::EnterExitFrameEpilogue(int arg_stack_space, 3832 void MacroAssembler::EnterExitFrameEpilogue(int arg_stack_space,
3780 bool save_doubles) { 3833 bool save_doubles) {
3781 #ifdef _WIN64 3834 #ifdef _WIN64
3782 const int kShadowSpace = 4; 3835 const int kShadowSpace = 4;
3783 arg_stack_space += kShadowSpace; 3836 arg_stack_space += kShadowSpace;
3784 #endif 3837 #endif
3785 // Optionally save all XMM registers. 3838 // Optionally save all XMM registers.
3786 if (save_doubles) { 3839 if (save_doubles) {
3787 int space = XMMRegister::kMaxNumAllocatableRegisters * kDoubleSize + 3840 int space = XMMRegister::kMaxNumRegisters * kFloat32x4Size +
3788 arg_stack_space * kPointerSize; 3841 arg_stack_space * kPointerSize;
3789 subq(rsp, Immediate(space)); 3842 subq(rsp, Immediate(space));
3790 int offset = -2 * kPointerSize; 3843 int offset = -2 * kPointerSize;
3791 for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) { 3844 for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) {
3792 XMMRegister reg = XMMRegister::FromAllocationIndex(i); 3845 XMMRegister reg = XMMRegister::FromAllocationIndex(i);
3793 movsd(Operand(rbp, offset - ((i + 1) * kDoubleSize)), reg); 3846 movups(Operand(rbp, offset - ((i + 1) * kFloat32x4Size)), reg);
3794 } 3847 }
3795 } else if (arg_stack_space > 0) { 3848 } else if (arg_stack_space > 0) {
3796 subq(rsp, Immediate(arg_stack_space * kPointerSize)); 3849 subq(rsp, Immediate(arg_stack_space * kPointerSize));
3797 } 3850 }
3798 3851
3799 // Get the required frame alignment for the OS. 3852 // Get the required frame alignment for the OS.
3800 const int kFrameAlignment = OS::ActivationFrameAlignment(); 3853 const int kFrameAlignment = OS::ActivationFrameAlignment();
3801 if (kFrameAlignment > 0) { 3854 if (kFrameAlignment > 0) {
3802 ASSERT(IsPowerOf2(kFrameAlignment)); 3855 ASSERT(IsPowerOf2(kFrameAlignment));
3803 ASSERT(is_int8(kFrameAlignment)); 3856 ASSERT(is_int8(kFrameAlignment));
(...skipping 23 matching lines...) Expand all
3827 } 3880 }
3828 3881
3829 3882
3830 void MacroAssembler::LeaveExitFrame(bool save_doubles) { 3883 void MacroAssembler::LeaveExitFrame(bool save_doubles) {
3831 // Registers: 3884 // Registers:
3832 // r15 : argv 3885 // r15 : argv
3833 if (save_doubles) { 3886 if (save_doubles) {
3834 int offset = -2 * kPointerSize; 3887 int offset = -2 * kPointerSize;
3835 for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) { 3888 for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) {
3836 XMMRegister reg = XMMRegister::FromAllocationIndex(i); 3889 XMMRegister reg = XMMRegister::FromAllocationIndex(i);
3837 movsd(reg, Operand(rbp, offset - ((i + 1) * kDoubleSize))); 3890 movups(reg, Operand(rbp, offset - ((i + 1) * kFloat32x4Size)));
3838 } 3891 }
3839 } 3892 }
3840 // Get the return address from the stack and restore the frame pointer. 3893 // Get the return address from the stack and restore the frame pointer.
3841 movq(rcx, Operand(rbp, 1 * kPointerSize)); 3894 movq(rcx, Operand(rbp, 1 * kPointerSize));
3842 movq(rbp, Operand(rbp, 0 * kPointerSize)); 3895 movq(rbp, Operand(rbp, 0 * kPointerSize));
3843 3896
3844 // Drop everything up to and including the arguments and the receiver 3897 // Drop everything up to and including the arguments and the receiver
3845 // from the caller stack. 3898 // from the caller stack.
3846 lea(rsp, Operand(r15, 1 * kPointerSize)); 3899 lea(rsp, Operand(r15, 1 * kPointerSize));
3847 3900
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
4267 Label* gc_required) { 4320 Label* gc_required) {
4268 // Allocate heap number in new space. 4321 // Allocate heap number in new space.
4269 Allocate(HeapNumber::kSize, result, scratch, no_reg, gc_required, TAG_OBJECT); 4322 Allocate(HeapNumber::kSize, result, scratch, no_reg, gc_required, TAG_OBJECT);
4270 4323
4271 // Set the map. 4324 // Set the map.
4272 LoadRoot(kScratchRegister, Heap::kHeapNumberMapRootIndex); 4325 LoadRoot(kScratchRegister, Heap::kHeapNumberMapRootIndex);
4273 movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister); 4326 movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
4274 } 4327 }
4275 4328
4276 4329
4330 void MacroAssembler::AllocateFloat32x4(Register result,
4331 Register scratch,
4332 Label* gc_required) {
4333 // Allocate heap number in new space.
4334 Allocate(Float32x4::kSize, result, scratch, no_reg, gc_required, TAG_OBJECT);
4335
4336 // Set the map.
4337 LoadRoot(kScratchRegister, Heap::kFloat32x4MapRootIndex);
4338 movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
4339 }
4340
4341
4342 void MacroAssembler::AllocateInt32x4(Register result,
4343 Register scratch,
4344 Label* gc_required) {
4345 // Allocate heap number in new space.
4346 Allocate(Int32x4::kSize, result, scratch, no_reg, gc_required, TAG_OBJECT);
4347
4348 // Set the map.
4349 LoadRoot(kScratchRegister, Heap::kInt32x4MapRootIndex);
4350 movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
4351 }
4352
4353
4277 void MacroAssembler::AllocateTwoByteString(Register result, 4354 void MacroAssembler::AllocateTwoByteString(Register result,
4278 Register length, 4355 Register length,
4279 Register scratch1, 4356 Register scratch1,
4280 Register scratch2, 4357 Register scratch2,
4281 Register scratch3, 4358 Register scratch3,
4282 Label* gc_required) { 4359 Label* gc_required) {
4283 // Calculate the number of bytes needed for the characters in the string while 4360 // Calculate the number of bytes needed for the characters in the string while
4284 // observing object alignment. 4361 // observing object alignment.
4285 const int kHeaderAlignment = SeqTwoByteString::kHeaderSize & 4362 const int kHeaderAlignment = SeqTwoByteString::kHeaderSize &
4286 kObjectAlignmentMask; 4363 kObjectAlignmentMask;
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
5055 j(equal, found); 5132 j(equal, found);
5056 movq(current, FieldOperand(current, Map::kPrototypeOffset)); 5133 movq(current, FieldOperand(current, Map::kPrototypeOffset));
5057 CompareRoot(current, Heap::kNullValueRootIndex); 5134 CompareRoot(current, Heap::kNullValueRootIndex);
5058 j(not_equal, &loop_again); 5135 j(not_equal, &loop_again);
5059 } 5136 }
5060 5137
5061 5138
5062 } } // namespace v8::internal 5139 } } // namespace v8::internal
5063 5140
5064 #endif // V8_TARGET_ARCH_X64 5141 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | src/x64/stub-cache-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698