OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/base/macros.h" | 8 #include "src/base/macros.h" |
9 #include "src/conversions.h" | 9 #include "src/conversions.h" |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 inline T AddSaturate(T a, T b) { | 103 inline T AddSaturate(T a, T b) { |
104 const T max = std::numeric_limits<T>::max(); | 104 const T max = std::numeric_limits<T>::max(); |
105 const T min = std::numeric_limits<T>::min(); | 105 const T min = std::numeric_limits<T>::min(); |
106 int32_t result = a + b; | 106 int32_t result = a + b; |
107 if (result > max) return max; | 107 if (result > max) return max; |
108 if (result < min) return min; | 108 if (result < min) return min; |
109 return result; | 109 return result; |
110 } | 110 } |
111 | 111 |
112 | 112 |
113 // Widening absolute difference for uint16_t and uint8_t. | |
114 template <typename T> | |
115 inline uint32_t AbsoluteDifference(T a, T b) { | |
116 uint32_t result = std::abs(a - b); | |
117 return result; | |
118 } | |
119 | |
120 | |
121 // Saturating subtraction for int16_t and int8_t. | 113 // Saturating subtraction for int16_t and int8_t. |
122 template <typename T> | 114 template <typename T> |
123 inline T SubSaturate(T a, T b) { | 115 inline T SubSaturate(T a, T b) { |
124 const T max = std::numeric_limits<T>::max(); | 116 const T max = std::numeric_limits<T>::max(); |
125 const T min = std::numeric_limits<T>::min(); | 117 const T min = std::numeric_limits<T>::min(); |
126 int32_t result = a - b; | 118 int32_t result = a - b; |
127 if (result > max) return max; | 119 if (result > max) return max; |
128 if (result < min) return min; | 120 if (result < min) return min; |
129 return result; | 121 return result; |
130 } | 122 } |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 if (shift >= lane_bits) shift = lane_bits - 1; \ | 477 if (shift >= lane_bits) shift = lane_bits - 1; \ |
486 lane_type lanes[kLaneCount]; \ | 478 lane_type lanes[kLaneCount]; \ |
487 for (int i = 0; i < kLaneCount; i++) { \ | 479 for (int i = 0; i < kLaneCount; i++) { \ |
488 int64_t shifted = static_cast<int64_t>(a->get_lane(i)) >> shift; \ | 480 int64_t shifted = static_cast<int64_t>(a->get_lane(i)) >> shift; \ |
489 lanes[i] = static_cast<lane_type>(shifted); \ | 481 lanes[i] = static_cast<lane_type>(shifted); \ |
490 } \ | 482 } \ |
491 Handle<type> result = isolate->factory()->New##type(lanes); \ | 483 Handle<type> result = isolate->factory()->New##type(lanes); \ |
492 return *result; \ | 484 return *result; \ |
493 } | 485 } |
494 | 486 |
495 #define SIMD_HORIZONTAL_SUM_FUNCTION(type, lane_type, lane_bits, lane_count) \ | |
496 RUNTIME_FUNCTION(Runtime_##type##HorizontalSum) { \ | |
497 HandleScope scope(isolate); \ | |
498 DCHECK(args.length() == 1); \ | |
499 CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ | |
500 double sum = 0; \ | |
501 for (int i = 0; i < lane_count; i++) { \ | |
502 sum += a->get_lane(i); \ | |
503 } \ | |
504 return *isolate->factory()->NewNumber(sum); \ | |
505 } | |
506 | |
507 SIMD_INT_TYPES(SIMD_LSL_FUNCTION) | 487 SIMD_INT_TYPES(SIMD_LSL_FUNCTION) |
508 SIMD_UINT_TYPES(SIMD_LSL_FUNCTION) | 488 SIMD_UINT_TYPES(SIMD_LSL_FUNCTION) |
509 SIMD_INT_TYPES(SIMD_ASR_FUNCTION) | 489 SIMD_INT_TYPES(SIMD_ASR_FUNCTION) |
510 SIMD_UINT_TYPES(SIMD_LSR_FUNCTION) | 490 SIMD_UINT_TYPES(SIMD_LSR_FUNCTION) |
511 SIMD_UINT_TYPES(SIMD_HORIZONTAL_SUM_FUNCTION) | |
512 | 491 |
513 //------------------------------------------------------------------- | 492 //------------------------------------------------------------------- |
514 | 493 |
515 // Bool-only functions. | 494 // Bool-only functions. |
516 | 495 |
517 #define SIMD_BOOL_TYPES(FUNCTION) \ | 496 #define SIMD_BOOL_TYPES(FUNCTION) \ |
518 FUNCTION(Bool32x4, 4) \ | 497 FUNCTION(Bool32x4, 4) \ |
519 FUNCTION(Bool16x8, 8) \ | 498 FUNCTION(Bool16x8, 8) \ |
520 FUNCTION(Bool8x16, 16) | 499 FUNCTION(Bool8x16, 16) |
521 | 500 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 HandleScope scope(isolate); \ | 554 HandleScope scope(isolate); \ |
576 SIMD_BINARY_OP(type, lane_type, lane_count, SubSaturate, result); \ | 555 SIMD_BINARY_OP(type, lane_type, lane_count, SubSaturate, result); \ |
577 return *result; \ | 556 return *result; \ |
578 } | 557 } |
579 | 558 |
580 SIMD_SMALL_INT_TYPES(SIMD_ADD_SATURATE_FUNCTION) | 559 SIMD_SMALL_INT_TYPES(SIMD_ADD_SATURATE_FUNCTION) |
581 SIMD_SMALL_INT_TYPES(SIMD_SUB_SATURATE_FUNCTION) | 560 SIMD_SMALL_INT_TYPES(SIMD_SUB_SATURATE_FUNCTION) |
582 | 561 |
583 //------------------------------------------------------------------- | 562 //------------------------------------------------------------------- |
584 | 563 |
585 // Small Unsigned int-only functions. | |
586 | |
587 #define SIMD_SMALL_UINT_TYPES(FUNCTION) \ | |
588 FUNCTION(Uint16x8, uint16_t, 8, Uint32x4, uint32_t) \ | |
589 FUNCTION(Uint8x16, uint8_t, 16, Uint16x8, uint16_t) | |
590 | |
591 #define SIMD_ABS_DIFF_FUNCTION(type, lane_type, lane_count, wide_type, \ | |
592 wide_ctype) \ | |
593 RUNTIME_FUNCTION(Runtime_##type##AbsoluteDifference) { \ | |
594 HandleScope scope(isolate); \ | |
595 SIMD_BINARY_OP(type, lane_type, lane_count, AbsoluteDifference, result); \ | |
596 return *result; \ | |
597 } | |
598 | |
599 #define SIMD_WIDE_ABS_DIFF_FUNCTION(type, lane_type, lane_count, wide_type, \ | |
600 wide_ctype) \ | |
601 RUNTIME_FUNCTION(Runtime_##type##WidenedAbsoluteDifference) { \ | |
602 HandleScope scope(isolate); \ | |
603 static const int kLaneCount = lane_count / 2; \ | |
604 DCHECK(args.length() == 2); \ | |
605 CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ | |
606 CONVERT_ARG_HANDLE_CHECKED(type, b, 1); \ | |
607 wide_ctype lanes[kLaneCount]; \ | |
608 for (int i = 0; i < kLaneCount; i++) { \ | |
609 lanes[i] = AbsoluteDifference(a->get_lane(i), b->get_lane(i)); \ | |
610 } \ | |
611 Handle<wide_type> result = isolate->factory()->New##wide_type(lanes); \ | |
612 return *result; \ | |
613 } | |
614 | |
615 SIMD_SMALL_UINT_TYPES(SIMD_ABS_DIFF_FUNCTION) | |
616 SIMD_SMALL_UINT_TYPES(SIMD_WIDE_ABS_DIFF_FUNCTION) | |
617 | |
618 //------------------------------------------------------------------- | |
619 | |
620 // Numeric functions. | 564 // Numeric functions. |
621 | 565 |
622 #define SIMD_NUMERIC_TYPES(FUNCTION) \ | 566 #define SIMD_NUMERIC_TYPES(FUNCTION) \ |
623 FUNCTION(Float32x4, float, 4) \ | 567 FUNCTION(Float32x4, float, 4) \ |
624 FUNCTION(Int32x4, int32_t, 4) \ | 568 FUNCTION(Int32x4, int32_t, 4) \ |
625 FUNCTION(Uint32x4, uint32_t, 4) \ | 569 FUNCTION(Uint32x4, uint32_t, 4) \ |
626 FUNCTION(Int16x8, int16_t, 8) \ | 570 FUNCTION(Int16x8, int16_t, 8) \ |
627 FUNCTION(Uint16x8, uint16_t, 8) \ | 571 FUNCTION(Uint16x8, uint16_t, 8) \ |
628 FUNCTION(Int8x16, int8_t, 16) \ | 572 FUNCTION(Int8x16, int8_t, 16) \ |
629 FUNCTION(Uint8x16, uint8_t, 16) | 573 FUNCTION(Uint8x16, uint8_t, 16) |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 SIMD_LOADN_STOREN_TYPES(SIMD_LOAD3_FUNCTION) | 1006 SIMD_LOADN_STOREN_TYPES(SIMD_LOAD3_FUNCTION) |
1063 SIMD_NUMERIC_TYPES(SIMD_STORE_FUNCTION) | 1007 SIMD_NUMERIC_TYPES(SIMD_STORE_FUNCTION) |
1064 SIMD_LOADN_STOREN_TYPES(SIMD_STORE1_FUNCTION) | 1008 SIMD_LOADN_STOREN_TYPES(SIMD_STORE1_FUNCTION) |
1065 SIMD_LOADN_STOREN_TYPES(SIMD_STORE2_FUNCTION) | 1009 SIMD_LOADN_STOREN_TYPES(SIMD_STORE2_FUNCTION) |
1066 SIMD_LOADN_STOREN_TYPES(SIMD_STORE3_FUNCTION) | 1010 SIMD_LOADN_STOREN_TYPES(SIMD_STORE3_FUNCTION) |
1067 | 1011 |
1068 //------------------------------------------------------------------- | 1012 //------------------------------------------------------------------- |
1069 | 1013 |
1070 } // namespace internal | 1014 } // namespace internal |
1071 } // namespace v8 | 1015 } // namespace v8 |
OLD | NEW |