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

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') | runtime/vm/object.h » ('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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 = v.x();
66 float _y = v.y();
srdjan 2014/01/29 23:49:42 Cast explicitly
Cutch 2014/01/30 18:27:27 Done.
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') | runtime/vm/object.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698