| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/bigint_operations.h" | 6 #include "vm/bigint_operations.h" |
| 7 #include "vm/object.h" | 7 #include "vm/object.h" |
| 8 #include "vm/object_store.h" | 8 #include "vm/object_store.h" |
| 9 #include "vm/unit_test.h" | 9 #include "vm/unit_test.h" |
| 10 | 10 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 big = BigintOperations::NewFromInt64(kValue64); | 72 big = BigintOperations::NewFromInt64(kValue64); |
| 73 big_test = BigintOperations::Multiply(big_test, big_test); | 73 big_test = BigintOperations::Multiply(big_test, big_test); |
| 74 EXPECT_EQ(0, BigintOperations::Compare(big, big_test)); | 74 EXPECT_EQ(0, BigintOperations::Compare(big, big_test)); |
| 75 big = BigintOperations::NewFromInt64(-kValue64); | 75 big = BigintOperations::NewFromInt64(-kValue64); |
| 76 big_test = BigintOperations::Subtract( | 76 big_test = BigintOperations::Subtract( |
| 77 Bigint::Handle(BigintOperations::NewFromInt64(0)), big_test); | 77 Bigint::Handle(BigintOperations::NewFromInt64(0)), big_test); |
| 78 EXPECT_EQ(0, BigintOperations::Compare(big, big_test)); | 78 EXPECT_EQ(0, BigintOperations::Compare(big, big_test)); |
| 79 | 79 |
| 80 const Bigint& one = Bigint::Handle(BigintOperations::NewFromInt64(1)); | 80 const Bigint& one = Bigint::Handle(BigintOperations::NewFromInt64(1)); |
| 81 big = BigintOperations::NewFromInt64(kMinInt64); | 81 big = BigintOperations::NewFromInt64(kMinInt64); |
| 82 EXPECT(BigintOperations::FitsIntoInt64(big)); | 82 EXPECT(BigintOperations::FitsIntoMint(big)); |
| 83 int64_t back = BigintOperations::ToInt64(big); | 83 int64_t back = BigintOperations::ToMint(big); |
| 84 EXPECT_EQ(kMinInt64, back); | 84 EXPECT_EQ(kMinInt64, back); |
| 85 | 85 |
| 86 big = BigintOperations::Subtract(big, one); | 86 big = BigintOperations::Subtract(big, one); |
| 87 EXPECT(!BigintOperations::FitsIntoInt64(big)); | 87 EXPECT(!BigintOperations::FitsIntoMint(big)); |
| 88 | 88 |
| 89 big = BigintOperations::NewFromInt64(kMaxInt64); | 89 big = BigintOperations::NewFromInt64(kMaxInt64); |
| 90 EXPECT(BigintOperations::FitsIntoInt64(big)); | 90 EXPECT(BigintOperations::FitsIntoMint(big)); |
| 91 back = BigintOperations::ToInt64(big); | 91 back = BigintOperations::ToMint(big); |
| 92 EXPECT_EQ(kMaxInt64, back); | 92 EXPECT_EQ(kMaxInt64, back); |
| 93 | 93 |
| 94 big = BigintOperations::Add(big, one); | 94 big = BigintOperations::Add(big, one); |
| 95 EXPECT(!BigintOperations::FitsIntoInt64(big)); | 95 EXPECT(!BigintOperations::FitsIntoMint(big)); |
| 96 } | 96 } |
| 97 | 97 |
| 98 | 98 |
| 99 TEST_CASE(BigintUint64) { | 99 TEST_CASE(BigintUint64) { |
| 100 const Bigint& one = Bigint::Handle(BigintOperations::NewFromUint64(1)); | 100 const Bigint& one = Bigint::Handle(BigintOperations::NewFromUint64(1)); |
| 101 EXPECT(BigintOperations::FitsIntoInt64(one)); | 101 EXPECT(BigintOperations::FitsIntoMint(one)); |
| 102 EXPECT(BigintOperations::FitsIntoUint64(one)); | 102 EXPECT(BigintOperations::FitsIntoUint64(one)); |
| 103 | 103 |
| 104 Bigint& big = Bigint::Handle(BigintOperations::NewFromUint64(kMaxUint64)); | 104 Bigint& big = Bigint::Handle(BigintOperations::NewFromUint64(kMaxUint64)); |
| 105 EXPECT(!BigintOperations::FitsIntoInt64(big)); | 105 EXPECT(!BigintOperations::FitsIntoMint(big)); |
| 106 EXPECT(BigintOperations::FitsIntoUint64(big)); | 106 EXPECT(BigintOperations::FitsIntoUint64(big)); |
| 107 | 107 |
| 108 uint64_t back = BigintOperations::ToUint64(big); | 108 uint64_t back = BigintOperations::ToUint64(big); |
| 109 EXPECT_EQ(kMaxUint64, back); | 109 EXPECT_EQ(kMaxUint64, back); |
| 110 | 110 |
| 111 big = BigintOperations::Add(big, one); | 111 big = BigintOperations::Add(big, one); |
| 112 EXPECT(!BigintOperations::FitsIntoInt64(big)); | 112 EXPECT(!BigintOperations::FitsIntoMint(big)); |
| 113 EXPECT(!BigintOperations::FitsIntoUint64(big)); | 113 EXPECT(!BigintOperations::FitsIntoUint64(big)); |
| 114 | 114 |
| 115 big = BigintOperations::Subtract(big, one); | 115 big = BigintOperations::Subtract(big, one); |
| 116 EXPECT(!BigintOperations::FitsIntoInt64(big)); | 116 EXPECT(!BigintOperations::FitsIntoMint(big)); |
| 117 EXPECT(BigintOperations::FitsIntoUint64(big)); | 117 EXPECT(BigintOperations::FitsIntoUint64(big)); |
| 118 | 118 |
| 119 big = BigintOperations::ShiftRight(big, 1); | 119 big = BigintOperations::ShiftRight(big, 1); |
| 120 EXPECT(BigintOperations::FitsIntoInt64(big)); | 120 EXPECT(BigintOperations::FitsIntoMint(big)); |
| 121 EXPECT(BigintOperations::FitsIntoUint64(big)); | 121 EXPECT(BigintOperations::FitsIntoUint64(big)); |
| 122 } | 122 } |
| 123 | 123 |
| 124 | 124 |
| 125 TEST_CASE(BigintDouble) { | 125 TEST_CASE(BigintDouble) { |
| 126 Smi& smi = Smi::Handle(Smi::New(5)); | 126 Smi& smi = Smi::Handle(Smi::New(5)); |
| 127 Bigint& bigint = Bigint::Handle(BigintOperations::NewFromSmi(smi)); | 127 Bigint& bigint = Bigint::Handle(BigintOperations::NewFromSmi(smi)); |
| 128 Double& dbl = Double::Handle(BigintOperations::ToDouble(bigint)); | 128 Double& dbl = Double::Handle(BigintOperations::ToDouble(bigint)); |
| 129 EXPECT_EQ(5.0, dbl.value()); | 129 EXPECT_EQ(5.0, dbl.value()); |
| 130 | 130 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 141 | 141 |
| 142 bigint = BigintOperations::NewFromCString("98765432109876"); | 142 bigint = BigintOperations::NewFromCString("98765432109876"); |
| 143 dbl = BigintOperations::ToDouble(bigint); | 143 dbl = BigintOperations::ToDouble(bigint); |
| 144 EXPECT_EQ(9.8765432109876e+13, dbl.value()); | 144 EXPECT_EQ(9.8765432109876e+13, dbl.value()); |
| 145 | 145 |
| 146 // Reduced precision. | 146 // Reduced precision. |
| 147 bigint = BigintOperations::NewFromCString( | 147 bigint = BigintOperations::NewFromCString( |
| 148 "9876543210987654321098765432109876543210"); | 148 "9876543210987654321098765432109876543210"); |
| 149 dbl = BigintOperations::ToDouble(bigint); | 149 dbl = BigintOperations::ToDouble(bigint); |
| 150 // TODO(floitsch): Proper rounding if deemed necessary. | 150 // TODO(floitsch): Proper rounding if deemed necessary. |
| 151 EXPECT_EQ(9.8765432109876534e+39, dbl.value()); | 151 EXPECT_EQ(9.8765432109876546e+39, dbl.value()); |
| 152 | 152 |
| 153 bigint = BigintOperations::NewFromCString( | 153 bigint = BigintOperations::NewFromCString( |
| 154 "12345678901234567890123456789012345678901234567890" | 154 "12345678901234567890123456789012345678901234567890" |
| 155 "12345678901234567890123456789012345678901234567890" | 155 "12345678901234567890123456789012345678901234567890" |
| 156 "12345678901234567890123456789012345678901234567890" | 156 "12345678901234567890123456789012345678901234567890" |
| 157 "12345678901234567890123456789012345678901234567890" | 157 "12345678901234567890123456789012345678901234567890" |
| 158 "12345678901234567890123456789012345678901234567890" | 158 "12345678901234567890123456789012345678901234567890" |
| 159 "12345678901234567890123456789012345678901234567890" | 159 "12345678901234567890123456789012345678901234567890" |
| 160 "12345678901234567890123456789012345678901234567890" | 160 "12345678901234567890123456789012345678901234567890" |
| 161 "12345678901234567890123456789012345678901234567890" | 161 "12345678901234567890123456789012345678901234567890" |
| 162 "12345678901234567890123456789012345678901234567890" | 162 "12345678901234567890123456789012345678901234567890" |
| 163 "12345678901234567890123456789012345678901234567890"); | 163 "12345678901234567890123456789012345678901234567890"); |
| 164 dbl = BigintOperations::ToDouble(bigint); | 164 dbl = BigintOperations::ToDouble(bigint); |
| 165 EXPECT_EQ(1.0/zero, dbl.value()); | 165 EXPECT_EQ(1.0/zero, dbl.value()); |
| 166 | 166 |
| 167 bigint = BigintOperations::NewFromCString("100000000000000000000000"); | 167 bigint = BigintOperations::NewFromCString("100000000000000000000000"); |
| 168 dbl = BigintOperations::ToDouble(bigint); | 168 dbl = BigintOperations::ToDouble(bigint); |
| 169 EXPECT_EQ(1e+23, dbl.value()); | 169 EXPECT_EQ(1e+23, dbl.value()); |
| 170 | 170 |
| 171 // TODO(floitsch): Proper rounding if deemed necessary. |
| 172 #if 0 |
| 171 bigint = BigintOperations::NewFromCString("100000000000000000000001"); | 173 bigint = BigintOperations::NewFromCString("100000000000000000000001"); |
| 172 dbl = BigintOperations::ToDouble(bigint); | 174 dbl = BigintOperations::ToDouble(bigint); |
| 173 // TODO(floitsch): Proper rounding if deemed necessary. | |
| 174 // EXPECT_EQ(1.0000000000000001e+23, dbl.value()); | 175 // EXPECT_EQ(1.0000000000000001e+23, dbl.value()); |
| 175 EXPECT_EQ(9.9999999999999992e+22, dbl.value()); | 176 EXPECT_EQ(9.9999999999999992e+22, dbl.value()); |
| 177 #endif |
| 176 | 178 |
| 177 // Same but shifted 64 bits to the left. | 179 // Same but shifted 64 bits to the left. |
| 178 bigint = BigintOperations::NewFromCString( | 180 bigint = BigintOperations::NewFromCString( |
| 179 "1844674407370955161600000000000000000000000"); | 181 "1844674407370955161600000000000000000000000"); |
| 180 dbl = BigintOperations::ToDouble(bigint); | 182 dbl = BigintOperations::ToDouble(bigint); |
| 181 EXPECT_EQ(1.844674407370955e+42, dbl.value()); | 183 EXPECT_EQ(1.844674407370955e+42, dbl.value()); |
| 182 | 184 |
| 183 bigint = BigintOperations::NewFromCString( | 185 bigint = BigintOperations::NewFromCString( |
| 184 "1844674407370955161600000000000000000000001"); | 186 "1844674407370955161600000000000000000000001"); |
| 185 dbl = BigintOperations::ToDouble(bigint); | 187 dbl = BigintOperations::ToDouble(bigint); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 const char* test = "-12345678901234567890"; | 384 const char* test = "-12345678901234567890"; |
| 383 const char* out = "-0xAB54A98CEB1F0AD2"; | 385 const char* out = "-0xAB54A98CEB1F0AD2"; |
| 384 const Bigint& bigint = Bigint::Handle( | 386 const Bigint& bigint = Bigint::Handle( |
| 385 BigintOperations::NewFromCString(test)); | 387 BigintOperations::NewFromCString(test)); |
| 386 const char* str = BigintOperations::ToHexCString(bigint, &ZoneAllocator); | 388 const char* str = BigintOperations::ToHexCString(bigint, &ZoneAllocator); |
| 387 EXPECT_STREQ(out, str); | 389 EXPECT_STREQ(out, str); |
| 388 } | 390 } |
| 389 } | 391 } |
| 390 | 392 |
| 391 | 393 |
| 394 #if 0 |
| 395 // TODO(florian): Add a ToDecString method in bigint operations. |
| 396 // Turn this test back on once it is implemented. |
| 392 TEST_CASE(BigintDecStrings) { | 397 TEST_CASE(BigintDecStrings) { |
| 393 { | 398 { |
| 394 const Bigint& bigint = Bigint::Handle( | 399 const Bigint& bigint = Bigint::Handle( |
| 395 BigintOperations::NewFromCString("0x123")); | 400 BigintOperations::NewFromCString("0x123")); |
| 396 const char* str = BigintOperations::ToDecCString(bigint, &ZoneAllocator); | 401 const char* str = BigintOperations::ToDecCString(bigint, &ZoneAllocator); |
| 397 EXPECT_STREQ("291", str); | 402 EXPECT_STREQ("291", str); |
| 398 } | 403 } |
| 399 | 404 |
| 400 { | 405 { |
| 401 const Bigint& bigint = Bigint::Handle( | 406 const Bigint& bigint = Bigint::Handle( |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 EXPECT_EQ(0x123, smi.Value()); | 486 EXPECT_EQ(0x123, smi.Value()); |
| 482 } | 487 } |
| 483 | 488 |
| 484 { | 489 { |
| 485 const Bigint& bigint = Bigint::Handle( | 490 const Bigint& bigint = Bigint::Handle( |
| 486 BigintOperations::NewFromCString("0x000000123")); | 491 BigintOperations::NewFromCString("0x000000123")); |
| 487 const char* str = BigintOperations::ToDecCString(bigint, &ZoneAllocator); | 492 const char* str = BigintOperations::ToDecCString(bigint, &ZoneAllocator); |
| 488 EXPECT_STREQ("291", str); | 493 EXPECT_STREQ("291", str); |
| 489 } | 494 } |
| 490 } | 495 } |
| 496 #endif |
| 491 | 497 |
| 492 | 498 |
| 493 static void TestBigintCompare(const char* a, const char* b, int compare) { | 499 static void TestBigintCompare(const char* a, const char* b, int compare) { |
| 494 const Bigint& bigint_a = Bigint::Handle(BigintOperations::NewFromCString(a)); | 500 const Bigint& bigint_a = Bigint::Handle(BigintOperations::NewFromCString(a)); |
| 495 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); | 501 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); |
| 496 int computed_compare = BigintOperations::Compare(bigint_a, bigint_b); | 502 int computed_compare = BigintOperations::Compare(bigint_a, bigint_b); |
| 497 int inverted_compare = BigintOperations::Compare(bigint_b, bigint_a); | 503 int inverted_compare = BigintOperations::Compare(bigint_b, bigint_a); |
| 498 if (compare == 0) { | 504 if (compare == 0) { |
| 499 EXPECT(computed_compare == 0); | 505 EXPECT(computed_compare == 0); |
| 500 EXPECT(inverted_compare == 0); | 506 EXPECT(inverted_compare == 0); |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); | 907 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); |
| 902 const Bigint& anded = | 908 const Bigint& anded = |
| 903 Bigint::Handle(BigintOperations::BitAnd(bigint_a, bigint_b)); | 909 Bigint::Handle(BigintOperations::BitAnd(bigint_a, bigint_b)); |
| 904 const char* str_anded = BigintOperations::ToHexCString(anded, &ZoneAllocator); | 910 const char* str_anded = BigintOperations::ToHexCString(anded, &ZoneAllocator); |
| 905 EXPECT_STREQ(result, str_anded); | 911 EXPECT_STREQ(result, str_anded); |
| 906 const Bigint& anded2 = | 912 const Bigint& anded2 = |
| 907 Bigint::Handle(BigintOperations::BitAnd(bigint_b, bigint_a)); | 913 Bigint::Handle(BigintOperations::BitAnd(bigint_b, bigint_a)); |
| 908 const char* str_anded2 = BigintOperations::ToHexCString(anded2, | 914 const char* str_anded2 = BigintOperations::ToHexCString(anded2, |
| 909 &ZoneAllocator); | 915 &ZoneAllocator); |
| 910 EXPECT_STREQ(result, str_anded2); | 916 EXPECT_STREQ(result, str_anded2); |
| 911 if (BigintOperations::FitsIntoSmi(bigint_a) && !bigint_a.IsNegative()) { | |
| 912 const Smi& smi = Smi::Handle(BigintOperations::ToSmi(bigint_a)); | |
| 913 Smi& smi_anded = Smi::Handle(); | |
| 914 smi_anded ^= BigintOperations::BitAndWithSmi(bigint_b, smi); | |
| 915 const Bigint& anded = | |
| 916 Bigint::Handle(BigintOperations::NewFromSmi(smi_anded)); | |
| 917 const char* str_anded = BigintOperations::ToHexCString(anded, | |
| 918 &ZoneAllocator); | |
| 919 EXPECT_STREQ(result, str_anded); | |
| 920 } | |
| 921 if (BigintOperations::FitsIntoSmi(bigint_b) && !bigint_b.IsNegative()) { | |
| 922 const Smi& smi = Smi::Handle(BigintOperations::ToSmi(bigint_b)); | |
| 923 Smi& smi_anded = Smi::Handle(); | |
| 924 smi_anded ^= BigintOperations::BitAndWithSmi(bigint_a, smi); | |
| 925 const Bigint& anded = | |
| 926 Bigint::Handle(BigintOperations::NewFromSmi(smi_anded)); | |
| 927 const char* str_anded = BigintOperations::ToHexCString(anded, | |
| 928 &ZoneAllocator); | |
| 929 EXPECT_STREQ(result, str_anded); | |
| 930 } | |
| 931 } | 917 } |
| 932 | 918 |
| 933 | 919 |
| 934 TEST_CASE(BigintBitAnd) { | 920 TEST_CASE(BigintBitAnd) { |
| 935 const char* zero = "0x0"; | 921 const char* zero = "0x0"; |
| 936 const char* one = "0x1"; | 922 const char* one = "0x1"; |
| 937 const char* minus_one = "-0x1"; | 923 const char* minus_one = "-0x1"; |
| 938 | 924 |
| 939 TestBigintBitAnd(one, zero, zero); | 925 TestBigintBitAnd(one, zero, zero); |
| 940 TestBigintBitAnd(one, one, one); | 926 TestBigintBitAnd(one, one, one); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); | 1017 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); |
| 1032 const Bigint& anded = | 1018 const Bigint& anded = |
| 1033 Bigint::Handle(BigintOperations::BitOr(bigint_a, bigint_b)); | 1019 Bigint::Handle(BigintOperations::BitOr(bigint_a, bigint_b)); |
| 1034 const char* str_anded = BigintOperations::ToHexCString(anded, &ZoneAllocator); | 1020 const char* str_anded = BigintOperations::ToHexCString(anded, &ZoneAllocator); |
| 1035 EXPECT_STREQ(result, str_anded); | 1021 EXPECT_STREQ(result, str_anded); |
| 1036 const Bigint& anded2 = | 1022 const Bigint& anded2 = |
| 1037 Bigint::Handle(BigintOperations::BitOr(bigint_b, bigint_a)); | 1023 Bigint::Handle(BigintOperations::BitOr(bigint_b, bigint_a)); |
| 1038 const char* str_anded2 = BigintOperations::ToHexCString(anded2, | 1024 const char* str_anded2 = BigintOperations::ToHexCString(anded2, |
| 1039 &ZoneAllocator); | 1025 &ZoneAllocator); |
| 1040 EXPECT_STREQ(result, str_anded2); | 1026 EXPECT_STREQ(result, str_anded2); |
| 1041 if (BigintOperations::FitsIntoSmi(bigint_a) && bigint_a.IsNegative()) { | |
| 1042 const Smi& smi = Smi::Handle(BigintOperations::ToSmi(bigint_a)); | |
| 1043 Smi& smi_ored = Smi::Handle(); | |
| 1044 smi_ored ^= BigintOperations::BitOrWithSmi(bigint_b, smi); | |
| 1045 const Bigint& ored = | |
| 1046 Bigint::Handle(BigintOperations::NewFromSmi(smi_ored)); | |
| 1047 const char* str_ored = BigintOperations::ToHexCString(ored, &ZoneAllocator); | |
| 1048 EXPECT_STREQ(result, str_ored); | |
| 1049 } | |
| 1050 if (BigintOperations::FitsIntoSmi(bigint_b) && bigint_b.IsNegative()) { | |
| 1051 const Smi& smi = Smi::Handle(BigintOperations::ToSmi(bigint_b)); | |
| 1052 Smi& smi_ored = Smi::Handle(); | |
| 1053 smi_ored ^= BigintOperations::BitOrWithSmi(bigint_a, smi); | |
| 1054 const Bigint& ored = | |
| 1055 Bigint::Handle(BigintOperations::NewFromSmi(smi_ored)); | |
| 1056 const char* str_ored = BigintOperations::ToHexCString(ored, &ZoneAllocator); | |
| 1057 EXPECT_STREQ(result, str_ored); | |
| 1058 } | |
| 1059 } | 1027 } |
| 1060 | 1028 |
| 1061 | 1029 |
| 1062 TEST_CASE(BigintBitOr) { | 1030 TEST_CASE(BigintBitOr) { |
| 1063 const char* zero = "0x0"; | 1031 const char* zero = "0x0"; |
| 1064 const char* one = "0x1"; | 1032 const char* one = "0x1"; |
| 1065 const char* minus_one = "-0x1"; | 1033 const char* minus_one = "-0x1"; |
| 1066 | 1034 |
| 1067 TestBigintBitOr(one, zero, one); | 1035 TestBigintBitOr(one, zero, one); |
| 1068 TestBigintBitOr(one, one, one); | 1036 TestBigintBitOr(one, one, one); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1233 TestBigintBitNot("0x50000000", "-0x50000001"); | 1201 TestBigintBitNot("0x50000000", "-0x50000001"); |
| 1234 TestBigintBitNot("0xFFFFFFF", "-0x10000000"); | 1202 TestBigintBitNot("0xFFFFFFF", "-0x10000000"); |
| 1235 TestBigintBitNot("0xFFFFFFFF", "-0x100000000"); | 1203 TestBigintBitNot("0xFFFFFFFF", "-0x100000000"); |
| 1236 TestBigintBitNot("0xFFFFFFFFFFFFFF", "-0x100000000000000"); | 1204 TestBigintBitNot("0xFFFFFFFFFFFFFF", "-0x100000000000000"); |
| 1237 TestBigintBitNot("0xFFFFFFFFFFFFFFFF", "-0x10000000000000000"); | 1205 TestBigintBitNot("0xFFFFFFFFFFFFFFFF", "-0x10000000000000000"); |
| 1238 TestBigintBitNot("0x1234567890ABCDEF012345678", | 1206 TestBigintBitNot("0x1234567890ABCDEF012345678", |
| 1239 "-0x1234567890ABCDEF012345679"); | 1207 "-0x1234567890ABCDEF012345679"); |
| 1240 } | 1208 } |
| 1241 | 1209 |
| 1242 | 1210 |
| 1211 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) |
| 1243 static void TestBigintMultiplyDivide(const char* a, | 1212 static void TestBigintMultiplyDivide(const char* a, |
| 1244 const char* b, | 1213 const char* b, |
| 1245 const char* product) { | 1214 const char* product) { |
| 1246 const Bigint& bigint_a = Bigint::Handle(BigintOperations::NewFromCString(a)); | 1215 const Bigint& bigint_a = Bigint::Handle(BigintOperations::NewFromCString(a)); |
| 1247 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); | 1216 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); |
| 1248 const Bigint& computed_product = | 1217 const Bigint& computed_product = |
| 1249 Bigint::Handle(BigintOperations::Multiply(bigint_a, bigint_b)); | 1218 Bigint::Handle(BigintOperations::Multiply(bigint_a, bigint_b)); |
| 1250 const char* str_product = BigintOperations::ToHexCString(computed_product, | 1219 const char* str_product = BigintOperations::ToHexCString(computed_product, |
| 1251 &ZoneAllocator); | 1220 &ZoneAllocator); |
| 1252 EXPECT_STREQ(product, str_product); | 1221 EXPECT_STREQ(product, str_product); |
| (...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2024 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1993 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2025 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1994 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2026 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1995 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2027 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1996 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2028 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1997 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2029 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1998 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2030 "000000000000000000000000000000000000000000000000000000000000000000000000" | 1999 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2031 "000000000000000000000000000000000000000000000000000000000000000000000000" | 2000 "000000000000000000000000000000000000000000000000000000000000000000000000" |
| 2032 "0000000000000000000000000000000000000000000000000000000001"); | 2001 "0000000000000000000000000000000000000000000000000000000001"); |
| 2033 } | 2002 } |
| 2003 #endif |
| 2034 | 2004 |
| 2035 | 2005 |
| 2036 static void TestBigintDivideRemainder(const char* a, | 2006 static void TestBigintDivideRemainder(const char* a, |
| 2037 const char* b, | 2007 const char* b, |
| 2038 const char* quotient, | 2008 const char* quotient, |
| 2039 const char* remainder) { | 2009 const char* remainder) { |
| 2040 const Bigint& bigint_a = Bigint::Handle(BigintOperations::NewFromCString(a)); | 2010 const Bigint& bigint_a = Bigint::Handle(BigintOperations::NewFromCString(a)); |
| 2041 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); | 2011 const Bigint& bigint_b = Bigint::Handle(BigintOperations::NewFromCString(b)); |
| 2042 const Bigint& computed_quotient = | 2012 const Bigint& computed_quotient = |
| 2043 Bigint::Handle(BigintOperations::Divide(bigint_a, bigint_b)); | 2013 Bigint::Handle(BigintOperations::Divide(bigint_a, bigint_b)); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2123 "123456789012345678901234567890123456789012345678901234567890123456789012" | 2093 "123456789012345678901234567890123456789012345678901234567890123456789012" |
| 2124 "345678901234567890123456789012345678901234567890123456789012345678901234" | 2094 "345678901234567890123456789012345678901234567890123456789012345678901234" |
| 2125 "567890123456789012345678901234567890123456789012345678901234567890123456" | 2095 "567890123456789012345678901234567890123456789012345678901234567890123456" |
| 2126 "789012345678901234567890123456789012345678901234567890123456789012345678" | 2096 "789012345678901234567890123456789012345678901234567890123456789012345678" |
| 2127 "90123456789012345678901234567890", | 2097 "90123456789012345678901234567890", |
| 2128 "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF" | 2098 "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF" |
| 2129 "01234567890ABCDEE"); | 2099 "01234567890ABCDEE"); |
| 2130 } | 2100 } |
| 2131 | 2101 |
| 2132 } // namespace dart | 2102 } // namespace dart |
| OLD | NEW |