Chromium Code Reviews| 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 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 |