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

Side by Side Diff: runtime/lib/simd128.cc

Issue 148043003: Add Float64x2, Float64x2List, etc... with runtime and dart2js implementations (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months 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 | « no previous file | runtime/lib/typed_data.cc » ('j') | sdk/lib/typed_data/typed_data.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/bootstrap_natives.h" 5 #include "vm/bootstrap_natives.h"
6 6
7 #include "vm/exceptions.h" 7 #include "vm/exceptions.h"
8 #include "vm/native_entry.h" 8 #include "vm/native_entry.h"
9 #include "vm/object.h" 9 #include "vm/object.h"
10 #include "vm/symbols.h" 10 #include "vm/symbols.h"
(...skipping 12 matching lines...) Expand all
23 } 23 }
24 24
25 25
26 DEFINE_NATIVE_ENTRY(Float32x4_fromDoubles, 5) { 26 DEFINE_NATIVE_ENTRY(Float32x4_fromDoubles, 5) {
27 ASSERT(AbstractTypeArguments::CheckedHandle( 27 ASSERT(AbstractTypeArguments::CheckedHandle(
28 arguments->NativeArgAt(0)).IsNull()); 28 arguments->NativeArgAt(0)).IsNull());
29 GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1)); 29 GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
30 GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(2)); 30 GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(2));
31 GET_NON_NULL_NATIVE_ARGUMENT(Double, z, arguments->NativeArgAt(3)); 31 GET_NON_NULL_NATIVE_ARGUMENT(Double, z, arguments->NativeArgAt(3));
32 GET_NON_NULL_NATIVE_ARGUMENT(Double, w, arguments->NativeArgAt(4)); 32 GET_NON_NULL_NATIVE_ARGUMENT(Double, w, arguments->NativeArgAt(4));
33 float _x = x.value(); 33 float _x = static_cast<float>(x.value());
34 float _y = y.value(); 34 float _y = static_cast<float>(y.value());
35 float _z = z.value(); 35 float _z = static_cast<float>(z.value());
36 float _w = w.value(); 36 float _w = static_cast<float>(w.value());
37 return Float32x4::New(_x, _y, _z, _w); 37 return Float32x4::New(_x, _y, _z, _w);
38 } 38 }
39 39
40 40
41 DEFINE_NATIVE_ENTRY(Float32x4_splat, 2) { 41 DEFINE_NATIVE_ENTRY(Float32x4_splat, 2) {
42 ASSERT(AbstractTypeArguments::CheckedHandle( 42 ASSERT(AbstractTypeArguments::CheckedHandle(
43 arguments->NativeArgAt(0)).IsNull()); 43 arguments->NativeArgAt(0)).IsNull());
44 GET_NON_NULL_NATIVE_ARGUMENT(Double, v, arguments->NativeArgAt(1)); 44 GET_NON_NULL_NATIVE_ARGUMENT(Double, v, arguments->NativeArgAt(1));
45 float _v = v.value(); 45 float _v = v.value();
46 return Float32x4::New(_v, _v, _v, _v); 46 return Float32x4::New(_v, _v, _v, _v);
47 } 47 }
48 48
49 49
50 DEFINE_NATIVE_ENTRY(Float32x4_zero, 1) { 50 DEFINE_NATIVE_ENTRY(Float32x4_zero, 1) {
51 ASSERT(AbstractTypeArguments::CheckedHandle( 51 ASSERT(AbstractTypeArguments::CheckedHandle(
52 arguments->NativeArgAt(0)).IsNull()); 52 arguments->NativeArgAt(0)).IsNull());
53 return Float32x4::New(0.0f, 0.0f, 0.0f, 0.0f); 53 return Float32x4::New(0.0f, 0.0f, 0.0f, 0.0f);
54 } 54 }
55 55
56 56
57 DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 2) { 57 DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 2) {
58 GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, v, arguments->NativeArgAt(1)); 58 GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, v, arguments->NativeArgAt(1));
59 return Float32x4::New(v.value()); 59 return Float32x4::New(v.value());
60 } 60 }
61 61
62 62
63 DEFINE_NATIVE_ENTRY(Float32x4_fromFloat64x2, 2) {
64 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, v, arguments->NativeArgAt(1));
65 float _x = static_cast<float>(v.x());
66 float _y = static_cast<float>(v.y());
67 return Float32x4::New(_x, _y, 0.0f, 0.0f);
68 }
69
70
63 DEFINE_NATIVE_ENTRY(Float32x4_add, 2) { 71 DEFINE_NATIVE_ENTRY(Float32x4_add, 2) {
64 GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0)); 72 GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
65 GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1)); 73 GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
66 float _x = self.x() + other.x(); 74 float _x = self.x() + other.x();
67 float _y = self.y() + other.y(); 75 float _y = self.y() + other.y();
68 float _z = self.z() + other.z(); 76 float _z = self.z() + other.z();
69 float _w = self.w() + other.w(); 77 float _w = self.w() + other.w();
70 return Float32x4::New(_x, _y, _z, _w); 78 return Float32x4::New(_x, _y, _z, _w);
71 } 79 }
72 80
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 float32_int32 fvw(fv.w()); 709 float32_int32 fvw(fv.w());
702 // Perform select. 710 // Perform select.
703 float32_int32 tempX((_maskX & tvx.u) | (~_maskX & fvx.u)); 711 float32_int32 tempX((_maskX & tvx.u) | (~_maskX & fvx.u));
704 float32_int32 tempY((_maskY & tvy.u) | (~_maskY & fvy.u)); 712 float32_int32 tempY((_maskY & tvy.u) | (~_maskY & fvy.u));
705 float32_int32 tempZ((_maskZ & tvz.u) | (~_maskZ & fvz.u)); 713 float32_int32 tempZ((_maskZ & tvz.u) | (~_maskZ & fvz.u));
706 float32_int32 tempW((_maskW & tvw.u) | (~_maskW & fvw.u)); 714 float32_int32 tempW((_maskW & tvw.u) | (~_maskW & fvw.u));
707 return Float32x4::New(tempX.f, tempY.f, tempZ.f, tempW.f); 715 return Float32x4::New(tempX.f, tempY.f, tempZ.f, tempW.f);
708 } 716 }
709 717
710 718
719 DEFINE_NATIVE_ENTRY(Float64x2_fromDoubles, 3) {
720 ASSERT(AbstractTypeArguments::CheckedHandle(
721 arguments->NativeArgAt(0)).IsNull());
722 GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
723 GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(2));
724 return Float64x2::New(x.value(), y.value());
725 }
726
727
728 DEFINE_NATIVE_ENTRY(Float64x2_splat, 2) {
729 ASSERT(AbstractTypeArguments::CheckedHandle(
730 arguments->NativeArgAt(0)).IsNull());
731 GET_NON_NULL_NATIVE_ARGUMENT(Double, v, arguments->NativeArgAt(1));
732 return Float64x2::New(v.value(), v.value());
733 }
734
735
736 DEFINE_NATIVE_ENTRY(Float64x2_zero, 1) {
737 ASSERT(AbstractTypeArguments::CheckedHandle(
738 arguments->NativeArgAt(0)).IsNull());
739 return Float64x2::New(0.0, 0.0);
740 }
741
742
743 DEFINE_NATIVE_ENTRY(Float64x2_fromFloat32x4, 2) {
744 ASSERT(AbstractTypeArguments::CheckedHandle(
745 arguments->NativeArgAt(0)).IsNull());
746 GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(1));
747 double _x = v.x();
748 double _y = v.y();
749 return Float64x2::New(_x, _y);
750 }
751
752
753 DEFINE_NATIVE_ENTRY(Float64x2_add, 2) {
754 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
755 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
756 double _x = self.x() + other.x();
757 double _y = self.y() + other.y();
758 return Float64x2::New(_x, _y);
759 }
760
761
762 DEFINE_NATIVE_ENTRY(Float64x2_negate, 1) {
763 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
764 double _x = -self.x();
765 double _y = -self.y();
766 return Float64x2::New(_x, _y);
767 }
768
769
770 DEFINE_NATIVE_ENTRY(Float64x2_sub, 2) {
771 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
772 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
773 double _x = self.x() - other.x();
774 double _y = self.y() - other.y();
775 return Float64x2::New(_x, _y);
776 }
777
778
779 DEFINE_NATIVE_ENTRY(Float64x2_mul, 2) {
780 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
781 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
782 double _x = self.x() * other.x();
783 double _y = self.y() * other.y();
784 return Float64x2::New(_x, _y);
785 }
786
787
788 DEFINE_NATIVE_ENTRY(Float64x2_div, 2) {
789 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
790 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
791 double _x = self.x() / other.x();
792 double _y = self.y() / other.y();
793 return Float64x2::New(_x, _y);
794 }
795
796
797 DEFINE_NATIVE_ENTRY(Float64x2_scale, 2) {
798 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
799 GET_NON_NULL_NATIVE_ARGUMENT(Double, scale, arguments->NativeArgAt(1));
800 double _s = scale.value();
801 double _x = self.x() * _s;
802 double _y = self.y() * _s;
803 return Float64x2::New(_x, _y);
804 }
805
806
807 DEFINE_NATIVE_ENTRY(Float64x2_abs, 1) {
808 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
809 double _x = fabs(self.x());
810 double _y = fabs(self.y());
811 return Float64x2::New(_x, _y);
812 }
813
814
815 DEFINE_NATIVE_ENTRY(Float64x2_clamp, 3) {
816 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
817 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, lo, arguments->NativeArgAt(1));
818 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, hi, arguments->NativeArgAt(2));
819 // The order of the clamping must match the order of the optimized code:
820 // MAX(MIN(self, hi), lo).
821 double _x = self.x() < hi.x() ? self.x() : hi.x();
822 double _y = self.y() < hi.y() ? self.y() : hi.y();
823 _x = _x < lo.x() ? lo.x() : _x;
824 _y = _y < lo.y() ? lo.y() : _y;
825 return Float64x2::New(_x, _y);
826 }
827
828
829 DEFINE_NATIVE_ENTRY(Float64x2_getX, 1) {
830 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
831 return Double::New(self.x());
832 }
833
834
835 DEFINE_NATIVE_ENTRY(Float64x2_getY, 1) {
836 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
837 return Double::New(self.y());
838 }
839
840
841 DEFINE_NATIVE_ENTRY(Float64x2_getSignMask, 1) {
842 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
843 uint32_t mx = (bit_cast<uint64_t>(self.x()) & 0x8000000000000000) >> 63;
844 uint32_t my = (bit_cast<uint64_t>(self.y()) & 0x8000000000000000) >> 63;
845 uint32_t value = mx | (my << 1);
846 return Integer::New(value);
847 }
848
849
850 DEFINE_NATIVE_ENTRY(Float64x2_setX, 2) {
851 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
852 GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
853 double _x = x.value();
854 double _y = self.y();
855 return Float64x2::New(_x, _y);
856 }
857
858
859 DEFINE_NATIVE_ENTRY(Float64x2_setY, 2) {
860 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
861 GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(1));
862 double _x = self.x();
863 double _y = y.value();
864 return Float64x2::New(_x, _y);
865 }
866
867
868 DEFINE_NATIVE_ENTRY(Float64x2_min, 2) {
869 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
870 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other,
871 arguments->NativeArgAt(1));
872 double _x = self.x() < other.x() ? self.x() : other.x();
873 double _y = self.y() < other.y() ? self.y() : other.y();
874 return Float64x2::New(_x, _y);
875 }
876
877
878 DEFINE_NATIVE_ENTRY(Float64x2_max, 2) {
879 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
880 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other,
881 arguments->NativeArgAt(1));
882 double _x = self.x() > other.x() ? self.x() : other.x();
883 double _y = self.y() > other.y() ? self.y() : other.y();
884 return Float64x2::New(_x, _y);
885 }
886
887
888 DEFINE_NATIVE_ENTRY(Float64x2_sqrt, 1) {
889 GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
890 double _x = sqrt(self.x());
891 double _y = sqrt(self.y());
892 return Float64x2::New(_x, _y);
893 }
894
711 } // namespace dart 895 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/typed_data.cc » ('j') | sdk/lib/typed_data/typed_data.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698