| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |