| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 <functional> | 5 #include <functional> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "test/cctest/cctest.h" | 8 #include "test/cctest/cctest.h" |
| 9 #include "test/cctest/compiler/codegen-tester.h" | 9 #include "test/cctest/compiler/codegen-tester.h" |
| 10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 | 475 |
| 476 m.Bind(&header); | 476 m.Bind(&header); |
| 477 Node* phi = m.Phi(minus_3, ten); | 477 Node* phi = m.Phi(minus_3, ten); |
| 478 m.Branch(m.Float64LessThan(phi, ten), &body, end); | 478 m.Branch(m.Float64LessThan(phi, ten), &body, end); |
| 479 | 479 |
| 480 m.Bind(&body); | 480 m.Bind(&body); |
| 481 phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5))); | 481 phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5))); |
| 482 m.Goto(&header); | 482 m.Goto(&header); |
| 483 | 483 |
| 484 m.Bind(end); | 484 m.Bind(end); |
| 485 m.Return(m.ConvertFloat64ToInt32(phi)); | 485 m.Return(m.ChangeFloat64ToInt32(phi)); |
| 486 | 486 |
| 487 CHECK_EQ(10, m.Call()); | 487 CHECK_EQ(10, m.Call()); |
| 488 } | 488 } |
| 489 | 489 |
| 490 | 490 |
| 491 TEST(RunLoadInt32) { | 491 TEST(RunLoadInt32) { |
| 492 RawMachineAssemblerTester<int32_t> m; | 492 RawMachineAssemblerTester<int32_t> m; |
| 493 | 493 |
| 494 int32_t p1 = 0; // loads directly from this location. | 494 int32_t p1 = 0; // loads directly from this location. |
| 495 m.Return(m.LoadFromPointer(&p1, kMachineWord32)); | 495 m.Return(m.LoadFromPointer(&p1, kMachineWord32)); |
| (...skipping 2355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2851 FOR_FLOAT64_INPUTS(i) { | 2851 FOR_FLOAT64_INPUTS(i) { |
| 2852 FOR_FLOAT64_INPUTS(j) { | 2852 FOR_FLOAT64_INPUTS(j) { |
| 2853 double expected = modulo(*i, *j); | 2853 double expected = modulo(*i, *j); |
| 2854 double found = bt.call(*i, *j); | 2854 double found = bt.call(*i, *j); |
| 2855 CHECK_EQ(expected, found); | 2855 CHECK_EQ(expected, found); |
| 2856 } | 2856 } |
| 2857 } | 2857 } |
| 2858 } | 2858 } |
| 2859 | 2859 |
| 2860 | 2860 |
| 2861 TEST(RunConvertInt32ToFloat64_A) { | 2861 TEST(RunChangeInt32ToFloat64_A) { |
| 2862 RawMachineAssemblerTester<int32_t> m; | 2862 RawMachineAssemblerTester<int32_t> m; |
| 2863 int32_t magic = 0x986234; | 2863 int32_t magic = 0x986234; |
| 2864 double result = 0; | 2864 double result = 0; |
| 2865 | 2865 |
| 2866 Node* convert = m.ConvertInt32ToFloat64(m.Int32Constant(magic)); | 2866 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); |
| 2867 m.Store(kMachineFloat64, m.PointerConstant(&result), m.Int32Constant(0), | 2867 m.Store(kMachineFloat64, m.PointerConstant(&result), m.Int32Constant(0), |
| 2868 convert); | 2868 convert); |
| 2869 m.Return(m.Int32Constant(magic)); | 2869 m.Return(m.Int32Constant(magic)); |
| 2870 | 2870 |
| 2871 CHECK_EQ(magic, m.Call()); | 2871 CHECK_EQ(magic, m.Call()); |
| 2872 CHECK_EQ(static_cast<double>(magic), result); | 2872 CHECK_EQ(static_cast<double>(magic), result); |
| 2873 } | 2873 } |
| 2874 | 2874 |
| 2875 | 2875 |
| 2876 TEST(RunConvertInt32ToFloat64_B) { | 2876 TEST(RunChangeInt32ToFloat64_B) { |
| 2877 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2877 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 2878 double output = 0; | 2878 double output = 0; |
| 2879 | 2879 |
| 2880 Node* convert = m.ConvertInt32ToFloat64(m.Parameter(0)); | 2880 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); |
| 2881 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), | 2881 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), |
| 2882 convert); | 2882 convert); |
| 2883 m.Return(m.Parameter(0)); | 2883 m.Return(m.Parameter(0)); |
| 2884 | 2884 |
| 2885 FOR_INT32_INPUTS(i) { | 2885 FOR_INT32_INPUTS(i) { |
| 2886 int32_t expect = *i; | 2886 int32_t expect = *i; |
| 2887 CHECK_EQ(expect, m.Call(expect)); | 2887 CHECK_EQ(expect, m.Call(expect)); |
| 2888 CHECK_EQ(static_cast<double>(expect), output); | 2888 CHECK_EQ(static_cast<double>(expect), output); |
| 2889 } | 2889 } |
| 2890 } | 2890 } |
| 2891 | 2891 |
| 2892 | 2892 |
| 2893 TEST(RunConvertUint32ToFloat64_B) { | 2893 TEST(RunChangeUint32ToFloat64_B) { |
| 2894 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2894 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 2895 double output = 0; | 2895 double output = 0; |
| 2896 | 2896 |
| 2897 Node* convert = m.ConvertUint32ToFloat64(m.Parameter(0)); | 2897 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); |
| 2898 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), | 2898 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), |
| 2899 convert); | 2899 convert); |
| 2900 m.Return(m.Parameter(0)); | 2900 m.Return(m.Parameter(0)); |
| 2901 | 2901 |
| 2902 FOR_UINT32_INPUTS(i) { | 2902 FOR_UINT32_INPUTS(i) { |
| 2903 uint32_t expect = *i; | 2903 uint32_t expect = *i; |
| 2904 CHECK_EQ(expect, m.Call(expect)); | 2904 CHECK_EQ(expect, m.Call(expect)); |
| 2905 CHECK_EQ(static_cast<double>(expect), output); | 2905 CHECK_EQ(static_cast<double>(expect), output); |
| 2906 } | 2906 } |
| 2907 } | 2907 } |
| 2908 | 2908 |
| 2909 | 2909 |
| 2910 TEST(RunConvertFloat64ToInt32_A) { | 2910 TEST(RunChangeFloat64ToInt32_A) { |
| 2911 RawMachineAssemblerTester<int32_t> m; | 2911 RawMachineAssemblerTester<int32_t> m; |
| 2912 int32_t magic = 0x786234; | 2912 int32_t magic = 0x786234; |
| 2913 double input = 11.1; | 2913 double input = 11.1; |
| 2914 int32_t result = 0; | 2914 int32_t result = 0; |
| 2915 | 2915 |
| 2916 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(0), | 2916 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(0), |
| 2917 m.ConvertFloat64ToInt32(m.Float64Constant(input))); | 2917 m.ChangeFloat64ToInt32(m.Float64Constant(input))); |
| 2918 m.Return(m.Int32Constant(magic)); | 2918 m.Return(m.Int32Constant(magic)); |
| 2919 | 2919 |
| 2920 CHECK_EQ(magic, m.Call()); | 2920 CHECK_EQ(magic, m.Call()); |
| 2921 CHECK_EQ(static_cast<int32_t>(input), result); | 2921 CHECK_EQ(static_cast<int32_t>(input), result); |
| 2922 } | 2922 } |
| 2923 | 2923 |
| 2924 | 2924 |
| 2925 TEST(RunConvertFloat64ToInt32_B) { | 2925 TEST(RunChangeFloat64ToInt32_B) { |
| 2926 RawMachineAssemblerTester<int32_t> m; | 2926 RawMachineAssemblerTester<int32_t> m; |
| 2927 double input = 0; | 2927 double input = 0; |
| 2928 int32_t output = 0; | 2928 int32_t output = 0; |
| 2929 | 2929 |
| 2930 Node* load = | 2930 Node* load = |
| 2931 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | 2931 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
| 2932 Node* convert = m.ConvertFloat64ToInt32(load); | 2932 Node* convert = m.ChangeFloat64ToInt32(load); |
| 2933 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), | 2933 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), |
| 2934 convert); | 2934 convert); |
| 2935 m.Return(convert); | 2935 m.Return(convert); |
| 2936 | 2936 |
| 2937 { | 2937 { |
| 2938 FOR_INT32_INPUTS(i) { | 2938 FOR_INT32_INPUTS(i) { |
| 2939 input = *i; | 2939 input = *i; |
| 2940 int32_t expect = *i; | 2940 int32_t expect = *i; |
| 2941 CHECK_EQ(expect, m.Call()); | 2941 CHECK_EQ(expect, m.Call()); |
| 2942 CHECK_EQ(expect, output); | 2942 CHECK_EQ(expect, output); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2957 int32_t expect = static_cast<int32_t>(input); | 2957 int32_t expect = static_cast<int32_t>(input); |
| 2958 CHECK_EQ(expect, m.Call()); | 2958 CHECK_EQ(expect, m.Call()); |
| 2959 CHECK_EQ(expect, output); | 2959 CHECK_EQ(expect, output); |
| 2960 } | 2960 } |
| 2961 } | 2961 } |
| 2962 // Note we don't check fractional inputs, because these Convert operators | 2962 // Note we don't check fractional inputs, because these Convert operators |
| 2963 // really should be Change operators. | 2963 // really should be Change operators. |
| 2964 } | 2964 } |
| 2965 | 2965 |
| 2966 | 2966 |
| 2967 TEST(RunConvertFloat64ToUint32_B) { | 2967 TEST(RunChangeFloat64ToUint32_B) { |
| 2968 RawMachineAssemblerTester<int32_t> m; | 2968 RawMachineAssemblerTester<int32_t> m; |
| 2969 double input = 0; | 2969 double input = 0; |
| 2970 int32_t output = 0; | 2970 int32_t output = 0; |
| 2971 | 2971 |
| 2972 Node* load = | 2972 Node* load = |
| 2973 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | 2973 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
| 2974 Node* convert = m.ConvertFloat64ToUint32(load); | 2974 Node* convert = m.ChangeFloat64ToUint32(load); |
| 2975 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), | 2975 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), |
| 2976 convert); | 2976 convert); |
| 2977 m.Return(convert); | 2977 m.Return(convert); |
| 2978 | 2978 |
| 2979 { | 2979 { |
| 2980 FOR_UINT32_INPUTS(i) { | 2980 FOR_UINT32_INPUTS(i) { |
| 2981 input = *i; | 2981 input = *i; |
| 2982 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. | 2982 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. |
| 2983 int32_t expect = static_cast<int32_t>(*i); | 2983 int32_t expect = static_cast<int32_t>(*i); |
| 2984 CHECK_EQ(expect, m.Call()); | 2984 CHECK_EQ(expect, m.Call()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3000 int32_t expect = static_cast<int32_t>(static_cast<uint32_t>(input)); | 3000 int32_t expect = static_cast<int32_t>(static_cast<uint32_t>(input)); |
| 3001 CHECK_EQ(expect, m.Call()); | 3001 CHECK_EQ(expect, m.Call()); |
| 3002 CHECK_EQ(expect, output); | 3002 CHECK_EQ(expect, output); |
| 3003 } | 3003 } |
| 3004 } | 3004 } |
| 3005 // Note we don't check fractional inputs, because these Convert operators | 3005 // Note we don't check fractional inputs, because these Convert operators |
| 3006 // really should be Change operators. | 3006 // really should be Change operators. |
| 3007 } | 3007 } |
| 3008 | 3008 |
| 3009 | 3009 |
| 3010 TEST(RunConvertFloat64ToInt32_spilled) { | 3010 TEST(RunChangeFloat64ToInt32_spilled) { |
| 3011 RawMachineAssemblerTester<int32_t> m; | 3011 RawMachineAssemblerTester<int32_t> m; |
| 3012 const int kNumInputs = 32; | 3012 const int kNumInputs = 32; |
| 3013 int32_t magic = 0x786234; | 3013 int32_t magic = 0x786234; |
| 3014 double input[kNumInputs]; | 3014 double input[kNumInputs]; |
| 3015 int32_t result[kNumInputs]; | 3015 int32_t result[kNumInputs]; |
| 3016 Node* input_node[kNumInputs]; | 3016 Node* input_node[kNumInputs]; |
| 3017 | 3017 |
| 3018 for (int i = 0; i < kNumInputs; i++) { | 3018 for (int i = 0; i < kNumInputs; i++) { |
| 3019 input_node[i] = m.Load(kMachineFloat64, m.PointerConstant(&input), | 3019 input_node[i] = m.Load(kMachineFloat64, m.PointerConstant(&input), |
| 3020 m.Int32Constant(i * 8)); | 3020 m.Int32Constant(i * 8)); |
| 3021 } | 3021 } |
| 3022 | 3022 |
| 3023 for (int i = 0; i < kNumInputs; i++) { | 3023 for (int i = 0; i < kNumInputs; i++) { |
| 3024 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(i * 4), | 3024 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(i * 4), |
| 3025 m.ConvertFloat64ToInt32(input_node[i])); | 3025 m.ChangeFloat64ToInt32(input_node[i])); |
| 3026 } | 3026 } |
| 3027 | 3027 |
| 3028 m.Return(m.Int32Constant(magic)); | 3028 m.Return(m.Int32Constant(magic)); |
| 3029 | 3029 |
| 3030 for (int i = 0; i < kNumInputs; i++) { | 3030 for (int i = 0; i < kNumInputs; i++) { |
| 3031 input[i] = 100.9 + i; | 3031 input[i] = 100.9 + i; |
| 3032 } | 3032 } |
| 3033 | 3033 |
| 3034 CHECK_EQ(magic, m.Call()); | 3034 CHECK_EQ(magic, m.Call()); |
| 3035 | 3035 |
| 3036 for (int i = 0; i < kNumInputs; i++) { | 3036 for (int i = 0; i < kNumInputs; i++) { |
| 3037 CHECK_EQ(result[i], 100 + i); | 3037 CHECK_EQ(result[i], 100 + i); |
| 3038 } | 3038 } |
| 3039 } | 3039 } |
| 3040 | 3040 |
| 3041 | 3041 |
| 3042 TEST(RunDeadConvertFloat64ToInt32) { | 3042 TEST(RunDeadChangeFloat64ToInt32) { |
| 3043 RawMachineAssemblerTester<int32_t> m; | 3043 RawMachineAssemblerTester<int32_t> m; |
| 3044 const int magic = 0x88abcda4; | 3044 const int magic = 0x88abcda4; |
| 3045 m.ConvertFloat64ToInt32(m.Float64Constant(999.78)); | 3045 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); |
| 3046 m.Return(m.Int32Constant(magic)); | 3046 m.Return(m.Int32Constant(magic)); |
| 3047 CHECK_EQ(magic, m.Call()); | 3047 CHECK_EQ(magic, m.Call()); |
| 3048 } | 3048 } |
| 3049 | 3049 |
| 3050 | 3050 |
| 3051 TEST(RunDeadConvertInt32ToFloat64) { | 3051 TEST(RunDeadChangeInt32ToFloat64) { |
| 3052 RawMachineAssemblerTester<int32_t> m; | 3052 RawMachineAssemblerTester<int32_t> m; |
| 3053 const int magic = 0x8834abcd; | 3053 const int magic = 0x8834abcd; |
| 3054 m.ConvertInt32ToFloat64(m.Int32Constant(magic - 6888)); | 3054 m.ChangeInt32ToFloat64(m.Int32Constant(magic - 6888)); |
| 3055 m.Return(m.Int32Constant(magic)); | 3055 m.Return(m.Int32Constant(magic)); |
| 3056 CHECK_EQ(magic, m.Call()); | 3056 CHECK_EQ(magic, m.Call()); |
| 3057 } | 3057 } |
| 3058 | 3058 |
| 3059 | 3059 |
| 3060 TEST(RunLoopPhiInduction2) { | 3060 TEST(RunLoopPhiInduction2) { |
| 3061 RawMachineAssemblerTester<int32_t> m; | 3061 RawMachineAssemblerTester<int32_t> m; |
| 3062 | 3062 |
| 3063 int false_val = 0x10777; | 3063 int false_val = 0x10777; |
| 3064 | 3064 |
| (...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3966 FOR_UINT32_INPUTS(i) { | 3966 FOR_UINT32_INPUTS(i) { |
| 3967 FOR_UINT32_INPUTS(j) { | 3967 FOR_UINT32_INPUTS(j) { |
| 3968 int32_t expected; | 3968 int32_t expected; |
| 3969 if (sadd_overflow(*i, *j, &expected)) expected = ~expected; | 3969 if (sadd_overflow(*i, *j, &expected)) expected = ~expected; |
| 3970 CHECK_EQ(expected, bt.call(*i, *j)); | 3970 CHECK_EQ(expected, bt.call(*i, *j)); |
| 3971 } | 3971 } |
| 3972 } | 3972 } |
| 3973 } | 3973 } |
| 3974 | 3974 |
| 3975 #endif // V8_TURBOFAN_TARGET | 3975 #endif // V8_TURBOFAN_TARGET |
| OLD | NEW |