| 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 3885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3896 static_cast<int32_t>(static_cast<uint32_t>(x) - static_cast<uint32_t>(y)); | 3896 static_cast<int32_t>(static_cast<uint32_t>(x) - static_cast<uint32_t>(y)); |
| 3897 *val = v; | 3897 *val = v; |
| 3898 return (((v ^ x) & (v ^ ~y)) >> 31) & 1; | 3898 return (((v ^ x) & (v ^ ~y)) >> 31) & 1; |
| 3899 } | 3899 } |
| 3900 | 3900 |
| 3901 | 3901 |
| 3902 TEST(RunInt32AddWithOverflowP) { | 3902 TEST(RunInt32AddWithOverflowP) { |
| 3903 int32_t actual_val = -1; | 3903 int32_t actual_val = -1; |
| 3904 RawMachineAssemblerTester<int32_t> m; | 3904 RawMachineAssemblerTester<int32_t> m; |
| 3905 Int32BinopTester bt(&m); | 3905 Int32BinopTester bt(&m); |
| 3906 Node* val, *ovf; | 3906 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
| 3907 m.Int32AddWithOverflow(bt.param0, bt.param1, &val, &ovf); | 3907 Node* val = m.Projection(0, add); |
| 3908 Node* ovf = m.Projection(1, add); |
| 3908 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3909 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 3909 bt.AddReturn(ovf); | 3910 bt.AddReturn(ovf); |
| 3910 FOR_INT32_INPUTS(i) { | 3911 FOR_INT32_INPUTS(i) { |
| 3911 FOR_INT32_INPUTS(j) { | 3912 FOR_INT32_INPUTS(j) { |
| 3912 int32_t expected_val; | 3913 int32_t expected_val; |
| 3913 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3914 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3914 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 3915 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
| 3915 CHECK_EQ(expected_val, actual_val); | 3916 CHECK_EQ(expected_val, actual_val); |
| 3916 } | 3917 } |
| 3917 } | 3918 } |
| 3918 } | 3919 } |
| 3919 | 3920 |
| 3920 | 3921 |
| 3921 TEST(RunInt32AddWithOverflowImm) { | 3922 TEST(RunInt32AddWithOverflowImm) { |
| 3922 int32_t actual_val = -1, expected_val = 0; | 3923 int32_t actual_val = -1, expected_val = 0; |
| 3923 FOR_INT32_INPUTS(i) { | 3924 FOR_INT32_INPUTS(i) { |
| 3924 { | 3925 { |
| 3925 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3926 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 3926 Node* val, *ovf; | 3927 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
| 3927 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0), &val, &ovf); | 3928 Node* val = m.Projection(0, add); |
| 3929 Node* ovf = m.Projection(1, add); |
| 3928 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3930 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 3929 m.Return(ovf); | 3931 m.Return(ovf); |
| 3930 FOR_INT32_INPUTS(j) { | 3932 FOR_INT32_INPUTS(j) { |
| 3931 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3933 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3932 CHECK_EQ(expected_ovf, m.Call(*j)); | 3934 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 3933 CHECK_EQ(expected_val, actual_val); | 3935 CHECK_EQ(expected_val, actual_val); |
| 3934 } | 3936 } |
| 3935 } | 3937 } |
| 3936 { | 3938 { |
| 3937 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3939 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 3938 Node* val, *ovf; | 3940 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
| 3939 m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i), &val, &ovf); | 3941 Node* val = m.Projection(0, add); |
| 3942 Node* ovf = m.Projection(1, add); |
| 3940 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3943 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 3941 m.Return(ovf); | 3944 m.Return(ovf); |
| 3942 FOR_INT32_INPUTS(j) { | 3945 FOR_INT32_INPUTS(j) { |
| 3943 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3946 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3944 CHECK_EQ(expected_ovf, m.Call(*j)); | 3947 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 3945 CHECK_EQ(expected_val, actual_val); | 3948 CHECK_EQ(expected_val, actual_val); |
| 3946 } | 3949 } |
| 3947 } | 3950 } |
| 3948 FOR_INT32_INPUTS(j) { | 3951 FOR_INT32_INPUTS(j) { |
| 3949 RawMachineAssemblerTester<int32_t> m; | 3952 RawMachineAssemblerTester<int32_t> m; |
| 3950 Node* val, *ovf; | 3953 Node* add = |
| 3951 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j), &val, | 3954 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
| 3952 &ovf); | 3955 Node* val = m.Projection(0, add); |
| 3956 Node* ovf = m.Projection(1, add); |
| 3953 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3957 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 3954 m.Return(ovf); | 3958 m.Return(ovf); |
| 3955 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3959 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3956 CHECK_EQ(expected_ovf, m.Call()); | 3960 CHECK_EQ(expected_ovf, m.Call()); |
| 3957 CHECK_EQ(expected_val, actual_val); | 3961 CHECK_EQ(expected_val, actual_val); |
| 3958 } | 3962 } |
| 3959 } | 3963 } |
| 3960 } | 3964 } |
| 3961 | 3965 |
| 3962 | 3966 |
| 3963 TEST(RunInt32AddWithOverflowInBranchP) { | 3967 TEST(RunInt32AddWithOverflowInBranchP) { |
| 3968 int constant = 911777; |
| 3964 MLabel blocka, blockb; | 3969 MLabel blocka, blockb; |
| 3965 RawMachineAssemblerTester<int32_t> m; | 3970 RawMachineAssemblerTester<int32_t> m; |
| 3966 Int32BinopTester bt(&m); | 3971 Int32BinopTester bt(&m); |
| 3967 Node* val, *ovf; | 3972 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
| 3968 m.Int32AddWithOverflow(bt.param0, bt.param1, &val, &ovf); | 3973 Node* ovf = m.Projection(1, add); |
| 3969 m.Branch(ovf, &blocka, &blockb); | 3974 m.Branch(ovf, &blocka, &blockb); |
| 3970 m.Bind(&blocka); | 3975 m.Bind(&blocka); |
| 3971 bt.AddReturn(m.Word32Not(val)); | 3976 bt.AddReturn(m.Int32Constant(constant)); |
| 3972 m.Bind(&blockb); | 3977 m.Bind(&blockb); |
| 3978 Node* val = m.Projection(0, add); |
| 3973 bt.AddReturn(val); | 3979 bt.AddReturn(val); |
| 3974 FOR_UINT32_INPUTS(i) { | 3980 FOR_UINT32_INPUTS(i) { |
| 3975 FOR_UINT32_INPUTS(j) { | 3981 FOR_UINT32_INPUTS(j) { |
| 3976 int32_t expected; | 3982 int32_t expected; |
| 3977 if (sadd_overflow(*i, *j, &expected)) expected = ~expected; | 3983 if (sadd_overflow(*i, *j, &expected)) expected = constant; |
| 3978 CHECK_EQ(expected, bt.call(*i, *j)); | 3984 CHECK_EQ(expected, bt.call(*i, *j)); |
| 3979 } | 3985 } |
| 3980 } | 3986 } |
| 3981 } | 3987 } |
| 3982 | 3988 |
| 3983 | 3989 |
| 3984 TEST(RunInt32SubWithOverflowP) { | 3990 TEST(RunInt32SubWithOverflowP) { |
| 3985 int32_t actual_val = -1; | 3991 int32_t actual_val = -1; |
| 3986 RawMachineAssemblerTester<int32_t> m; | 3992 RawMachineAssemblerTester<int32_t> m; |
| 3987 Int32BinopTester bt(&m); | 3993 Int32BinopTester bt(&m); |
| 3988 Node* val, *ovf; | 3994 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); |
| 3989 m.Int32SubWithOverflow(bt.param0, bt.param1, &val, &ovf); | 3995 Node* val = m.Projection(0, add); |
| 3996 Node* ovf = m.Projection(1, add); |
| 3990 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3997 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 3991 bt.AddReturn(ovf); | 3998 bt.AddReturn(ovf); |
| 3992 FOR_INT32_INPUTS(i) { | 3999 FOR_INT32_INPUTS(i) { |
| 3993 FOR_INT32_INPUTS(j) { | 4000 FOR_INT32_INPUTS(j) { |
| 3994 int32_t expected_val; | 4001 int32_t expected_val; |
| 3995 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 4002 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
| 3996 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 4003 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
| 3997 CHECK_EQ(expected_val, actual_val); | 4004 CHECK_EQ(expected_val, actual_val); |
| 3998 } | 4005 } |
| 3999 } | 4006 } |
| 4000 } | 4007 } |
| 4001 | 4008 |
| 4002 | 4009 |
| 4003 TEST(RunInt32SubWithOverflowImm) { | 4010 TEST(RunInt32SubWithOverflowImm) { |
| 4004 int32_t actual_val = -1, expected_val = 0; | 4011 int32_t actual_val = -1, expected_val = 0; |
| 4005 FOR_INT32_INPUTS(i) { | 4012 FOR_INT32_INPUTS(i) { |
| 4006 { | 4013 { |
| 4007 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 4014 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 4008 Node* val, *ovf; | 4015 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
| 4009 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0), &val, &ovf); | 4016 Node* val = m.Projection(0, add); |
| 4017 Node* ovf = m.Projection(1, add); |
| 4010 m.StoreToPointer(&actual_val, kMachineWord32, val); | 4018 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 4011 m.Return(ovf); | 4019 m.Return(ovf); |
| 4012 FOR_INT32_INPUTS(j) { | 4020 FOR_INT32_INPUTS(j) { |
| 4013 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 4021 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
| 4014 CHECK_EQ(expected_ovf, m.Call(*j)); | 4022 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4015 CHECK_EQ(expected_val, actual_val); | 4023 CHECK_EQ(expected_val, actual_val); |
| 4016 } | 4024 } |
| 4017 } | 4025 } |
| 4018 { | 4026 { |
| 4019 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 4027 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 4020 Node* val, *ovf; | 4028 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
| 4021 m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i), &val, &ovf); | 4029 Node* val = m.Projection(0, add); |
| 4030 Node* ovf = m.Projection(1, add); |
| 4022 m.StoreToPointer(&actual_val, kMachineWord32, val); | 4031 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 4023 m.Return(ovf); | 4032 m.Return(ovf); |
| 4024 FOR_INT32_INPUTS(j) { | 4033 FOR_INT32_INPUTS(j) { |
| 4025 int expected_ovf = ssub_overflow(*j, *i, &expected_val); | 4034 int expected_ovf = ssub_overflow(*j, *i, &expected_val); |
| 4026 CHECK_EQ(expected_ovf, m.Call(*j)); | 4035 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4027 CHECK_EQ(expected_val, actual_val); | 4036 CHECK_EQ(expected_val, actual_val); |
| 4028 } | 4037 } |
| 4029 } | 4038 } |
| 4030 FOR_INT32_INPUTS(j) { | 4039 FOR_INT32_INPUTS(j) { |
| 4031 RawMachineAssemblerTester<int32_t> m; | 4040 RawMachineAssemblerTester<int32_t> m; |
| 4032 Node* val, *ovf; | 4041 Node* add = |
| 4033 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j), &val, | 4042 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
| 4034 &ovf); | 4043 Node* val = m.Projection(0, add); |
| 4044 Node* ovf = m.Projection(1, add); |
| 4035 m.StoreToPointer(&actual_val, kMachineWord32, val); | 4045 m.StoreToPointer(&actual_val, kMachineWord32, val); |
| 4036 m.Return(ovf); | 4046 m.Return(ovf); |
| 4037 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 4047 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
| 4038 CHECK_EQ(expected_ovf, m.Call()); | 4048 CHECK_EQ(expected_ovf, m.Call()); |
| 4039 CHECK_EQ(expected_val, actual_val); | 4049 CHECK_EQ(expected_val, actual_val); |
| 4040 } | 4050 } |
| 4041 } | 4051 } |
| 4042 } | 4052 } |
| 4043 | 4053 |
| 4044 | 4054 |
| 4045 TEST(RunInt32SubWithOverflowInBranchP) { | 4055 TEST(RunInt32SubWithOverflowInBranchP) { |
| 4056 int constant = 911999; |
| 4046 MLabel blocka, blockb; | 4057 MLabel blocka, blockb; |
| 4047 RawMachineAssemblerTester<int32_t> m; | 4058 RawMachineAssemblerTester<int32_t> m; |
| 4048 Int32BinopTester bt(&m); | 4059 Int32BinopTester bt(&m); |
| 4049 Node* val, *ovf; | 4060 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); |
| 4050 m.Int32SubWithOverflow(bt.param0, bt.param1, &val, &ovf); | 4061 Node* ovf = m.Projection(1, sub); |
| 4051 m.Branch(ovf, &blocka, &blockb); | 4062 m.Branch(ovf, &blocka, &blockb); |
| 4052 m.Bind(&blocka); | 4063 m.Bind(&blocka); |
| 4053 bt.AddReturn(m.Word32Not(val)); | 4064 bt.AddReturn(m.Int32Constant(constant)); |
| 4054 m.Bind(&blockb); | 4065 m.Bind(&blockb); |
| 4066 Node* val = m.Projection(0, sub); |
| 4055 bt.AddReturn(val); | 4067 bt.AddReturn(val); |
| 4056 FOR_UINT32_INPUTS(i) { | 4068 FOR_UINT32_INPUTS(i) { |
| 4057 FOR_UINT32_INPUTS(j) { | 4069 FOR_UINT32_INPUTS(j) { |
| 4058 int32_t expected; | 4070 int32_t expected; |
| 4059 if (ssub_overflow(*i, *j, &expected)) expected = ~expected; | 4071 if (ssub_overflow(*i, *j, &expected)) expected = constant; |
| 4060 CHECK_EQ(expected, bt.call(*i, *j)); | 4072 CHECK_EQ(expected, bt.call(*i, *j)); |
| 4061 } | 4073 } |
| 4062 } | 4074 } |
| 4063 } | 4075 } |
| 4064 | 4076 |
| 4065 #endif // V8_TURBOFAN_TARGET | 4077 #endif // V8_TURBOFAN_TARGET |
| OLD | NEW |