test_compiler_builtins.cpp 12.3 KB
Newer Older
1 2 3 4 5
/**
 *    @file test_compiler_builtins.cpp
 *    @copyright defined in eos/LICENSE.txt
 */

B
Bucky Kittinger 已提交
6 7 8
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
#include <eosiolib/compiler_builtins.h>
9 10 11 12

#include "test_api.hpp"

using namespace eosio;
B
Bucky Kittinger 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
unsigned __int128 operator "" _ULLL( const char* lit ) {
      __int128 ret = 0;
      size_t   i = 0;
      bool     sign = false;

      if (lit[i] == '-') {
         ++i;
         sign = true;
      }

      if (lit[i] == '+')
         ++i;

      for (; lit[i] != '\0' ; ++i) {
         const char c = lit[i];
         ret *= 10;
         ret += c - '0';
      }

      if (sign)
         ret *= -1;

      return ret;
}

__int128 operator "" _LLL( const char* lit ) {
      __int128 ret = 0;
      size_t   i = 0;
      bool     sign = false;

      if (lit[i] == '-') {
         ++i;
         sign = true;
      }

      if (lit[i] == '+')
         ++i;

      for (; lit[i] != '\0' ; ++i) {
         const char c = lit[i];
         ret *= 10;
         ret += c - '0';
      }

      if (sign)
         ret *= -1;

      return ret;
}
62 63 64 65 66 67 68 69 70 71 72

void test_compiler_builtins::test_multi3() {
   /*
    * tests for negative values
    */
   __int128 res   = 0;
   __int128 lhs_a = -30;
   __int128 rhs_a = 100;
   __int128 lhs_b = 100;
   __int128 rhs_b = -30;

B
Bucky Kittinger 已提交
73
   __multi3( res, lhs_a, ( lhs_a >> 64 ), rhs_a, ( rhs_a >> 64 ) );
74
   eos_assert( res == -3000, "__multi3 result should be -3000" ); 
75

B
Bucky Kittinger 已提交
76
   __multi3( res, lhs_b, ( lhs_b >> 64 ), rhs_b, ( rhs_b >> 64 ) );
77
   eos_assert( res == -3000, "__multi3 result should be -3000" ); 
78

B
Bucky Kittinger 已提交
79
   __multi3( res, lhs_a, ( lhs_a >> 64 ), rhs_b, ( rhs_b >> 64 ) );
80
   eos_assert( res == 900, "__multi3 result should be 900" ); 
81 82 83 84

   /*
    * test for positive values
    */
B
Bucky Kittinger 已提交
85
   __multi3( res, lhs_b, ( lhs_b >> 64 ), rhs_a, ( rhs_a >> 64 ) );
86
   eos_assert( res == 10000, "__multi3 result should be 10000" ); 
87 88 89 90

   /*
    * test identity
    */
B
Bucky Kittinger 已提交
91
   __multi3( res, 1, 0, rhs_a, rhs_a >> 64 );
92
   eos_assert( res == 100, "__multi3 result should be 100" );
93

B
Bucky Kittinger 已提交
94
   __multi3( res, 1, 0, rhs_b, rhs_b >> 64 );
95
   eos_assert( res == -30, "__multi3 result should be -30" );
B
Bucky Kittinger 已提交
96
} 
97 98 99 100 101 102 103 104 105 106 107

void test_compiler_builtins::test_divti3() {
   /*
    * test for negative values
    */
   __int128 res   = 0;
   __int128 lhs_a = -30;
   __int128 rhs_a = 100;
   __int128 lhs_b = 100;
   __int128 rhs_b = -30;

B
Bucky Kittinger 已提交
108
   __divti3( res, lhs_a, ( lhs_a >> 64 ), rhs_a, ( rhs_a >> 64 ) );
109
   eos_assert( res == 0, "__divti3 result should be 0" ); 
110

B
Bucky Kittinger 已提交
111
   __divti3( res, lhs_b, ( lhs_b >> 64 ), rhs_b, ( rhs_b >> 64 ) );
112
   eos_assert( res == -3, "__divti3 result should be -3" ); 
113

B
Bucky Kittinger 已提交
114
   __divti3( res, lhs_a, ( lhs_a >> 64 ), rhs_b, ( rhs_b >> 64 ) );
115
   eos_assert( res == 1, "__divti3 result should be 1" ); 
116 117 118 119 120 121 122

   /*
    * test for positive values
    */
   __int128 lhs_c = 3333;
   __int128 rhs_c = 3333;

B
Bucky Kittinger 已提交
123
   __divti3( res, lhs_b, ( lhs_b >> 64 ), rhs_a, ( rhs_a >> 64 ) );
124
   eos_assert( res == 1, "__divti3 result should be 1" ); 
B
Bucky Kittinger 已提交
125 126

   __divti3( res, lhs_b, ( lhs_b >> 64 ), rhs_c, ( rhs_c >> 64 ) );
127
   eos_assert( res == 0, "__divti3 result should be 0" ); 
128

B
Bucky Kittinger 已提交
129
   __divti3( res, lhs_c, ( lhs_c >> 64 ), rhs_a, ( rhs_a >> 64 ) );
130
   eos_assert( res == 33, "__divti3 result should be 33" ); 
131 132 133 134

   /*
    * test identity
    */
B
Bucky Kittinger 已提交
135
   __divti3( res, lhs_b, ( lhs_b >> 64 ), 1, 0 );
136
   eos_assert( res == 100, "__divti3 result should be 100" ); 
137

B
Bucky Kittinger 已提交
138
   __divti3( res, lhs_a, ( lhs_a >> 64 ), 1, 0 );
139
   eos_assert( res == -30, "__divti3 result should be -30" ); 
140 141 142 143 144
}

void test_compiler_builtins::test_divti3_by_0() {
   __int128 res = 0;

B
Bucky Kittinger 已提交
145
   __divti3( res, 100, 0, 0, 0 );
146
   eos_assert( false, "Should have eos_asserted" );
147 148
}

B
Bucky Kittinger 已提交
149 150 151 152 153 154 155 156 157
void test_compiler_builtins::test_udivti3() {
   /*
    * test for negative values
    */
   unsigned __int128 res   = 0;
   unsigned __int128 lhs_a = -30;
   unsigned __int128 rhs_a = 100;
   unsigned __int128 lhs_b = 100;
   unsigned __int128 rhs_b = -30;
158

B
Bucky Kittinger 已提交
159
   __udivti3( res, lhs_a, ( lhs_a >> 64 ), rhs_a, ( rhs_a >> 64 ) );
160
   eos_assert( res == 3402823669209384634633746074317682114_ULLL, "__udivti3 result should be 0" ); 
161

B
Bucky Kittinger 已提交
162
   __udivti3( res, lhs_b, ( lhs_b >> 64 ), rhs_b, ( rhs_b >> 64 ) );
163
   eos_assert( res == 0, "__udivti3 result should be 0" ); 
164

B
Bucky Kittinger 已提交
165
   __udivti3( res, lhs_a, ( lhs_a >> 64 ), rhs_b, ( rhs_b >> 64 ) );
166
   eos_assert( res == 1, "__udivti3 result should be 1" ); 
167

B
Bucky Kittinger 已提交
168 169 170 171 172
   /*
    * test for positive values
    */
   __int128 lhs_c = 3333;
   __int128 rhs_c = 3333;
173

B
Bucky Kittinger 已提交
174
   __udivti3( res, lhs_b, ( lhs_b >> 64 ), rhs_a, ( rhs_a >> 64 ) );
175
   eos_assert( res == 1, "__divti3 result should be 1" ); 
B
Bucky Kittinger 已提交
176 177

   __udivti3( res, lhs_b, ( lhs_b >> 64 ), rhs_c, ( rhs_c >> 64 ) );
178
   eos_assert( res == 0, "__divti3 result should be 0" ); 
B
Bucky Kittinger 已提交
179 180

   __udivti3( res, lhs_c, ( lhs_c >> 64 ), rhs_a, ( rhs_a >> 64 ) );
181
   eos_assert( res == 33, "__divti3 result should be 33" ); 
B
Bucky Kittinger 已提交
182 183 184 185 186

   /*
    * test identity
    */
   __udivti3( res, lhs_b, ( lhs_b >> 64 ), 1, 0 );
187
   eos_assert( res == 100, "__divti3 result should be 100" ); 
B
Bucky Kittinger 已提交
188 189

   __udivti3( res, lhs_a, ( lhs_a >> 64 ), 1, 0 );
190
   eos_assert( res == -30, "__divti3 result should be -30" ); 
B
Bucky Kittinger 已提交
191 192 193 194 195 196
}

void test_compiler_builtins::test_udivti3_by_0() {
   unsigned __int128 res = 0;

   __udivti3( res, 100, 0, 0, 0 );
197
   eos_assert( false, "Should have eos_asserted" );
B
Bucky Kittinger 已提交
198 199 200 201 202 203
}


void test_compiler_builtins::test_lshlti3() {
   __int128 res      = 0;
   __int128 val      = 1;
204
   __int128 test_res = 0;
B
Bucky Kittinger 已提交
205 206

   test_res =   0x8000000000000000;
207 208
   test_res <<= 1;

B
Bucky Kittinger 已提交
209 210

   __lshlti3( res, val, val >> 64, 0 );
211
   eos_assert( res == 1, "__lshlti3 result should be 1" );
B
Bucky Kittinger 已提交
212 213 214


   __lshlti3( res, val, val >> 64, 1 );
215
   eos_assert( res == ( 1 << 1 ), "__lshlti3 result should be 2" );
B
Bucky Kittinger 已提交
216 217

   __lshlti3( res, val, ( val >> 64 ), 31 );
218
   eos_assert( res == 2147483648_ULLL, "__lshlti3 result should be 2^31" );
B
Bucky Kittinger 已提交
219 220
   
   __lshlti3( res, val, ( val >> 64 ), 63 );
221
   eos_assert( res == 9223372036854775808_ULLL, "__lshlti3 result should be 2^63" );
B
Bucky Kittinger 已提交
222 223

   __lshlti3( res, val, ( val >> 64 ), 64 );
224
   eos_assert( res == test_res, "__lshlti3 result should be 2^64" );
B
Bucky Kittinger 已提交
225 226

   __lshlti3( res, val, ( val >> 64 ), 127 );
227
   test_res <<= 63;
228
   eos_assert( res == test_res, "__lshlti3 result should be 2^127" );
229

B
Bucky Kittinger 已提交
230
   __lshlti3( res, val, ( val >> 64 ), 128 );
231 232
   test_res <<= 1;
   //should rollover
233
   eos_assert( res == test_res, "__lshlti3 result should be 2^128" );
234 235 236
}

void test_compiler_builtins::test_ashlti3() {
B
Bucky Kittinger 已提交
237 238 239 240 241 242
   __int128 res      = 0;
   __int128 val      = 1;
   __int128 test_res = 0;

   test_res =   0x8000000000000000;
   test_res <<= 1;
243

B
Bucky Kittinger 已提交
244
   __ashlti3( res, val, val >> 64, 0 );
245
   eos_assert( res == 1, "__ashlti3 result should be 1" );
246 247


B
Bucky Kittinger 已提交
248
   __ashlti3( res, val, val >> 64, 1 );
249
   eos_assert( res == (1 << 1), "__ashlti3 result should be 2" );
250

B
Bucky Kittinger 已提交
251
   __ashlti3( res, val, (val >> 64), 31 );
252
   eos_assert( res == 2147483648_ULLL, "__ashlti3 result should be 2^31" );
253
   
B
Bucky Kittinger 已提交
254
   __ashlti3( res, val, (val >> 64), 63 );
255
   eos_assert( res == 9223372036854775808_ULLL, "__ashlti3 result should be 2^63" );
256

B
Bucky Kittinger 已提交
257
   __ashlti3( res, val, (val >> 64), 64 );
258
   eos_assert( res == test_res, "__ashlti3 result should be 2^64" );
259

B
Bucky Kittinger 已提交
260
   __ashlti3( res, val, (val >> 64), 127 );
261
   test_res <<= 63;
262
   eos_assert( res == test_res, "__ashlti3 result should be 2^127" );
263

B
Bucky Kittinger 已提交
264
   __ashlti3( res, val, (val >> 64), 128 );
265 266
   test_res <<= 1;
   //should rollover
267
   eos_assert( res == test_res, "__ashlti3 result should be 2^128" );
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
}


void test_compiler_builtins::test_lshrti3() {
   auto atoi128 = [](const char* in) {
      __int128 ret = 0;
      size_t   i = 0;
      bool     sign = false;

      if (in[i] == '-') {
         ++i;
         sign = true;
      }

      if (in[i] == '+')
         ++i;

      for (; in[i] != '\0' ; ++i) {
         const char c = in[i];
         ret *= 10;
         ret += c - '0';
      }

      if (sign)
         ret *= -1;

      return ret;
   };

   __int128 res      = 0;
   __int128 val      = 0x8000000000000000;
   __int128 test_res = 0x8000000000000000;

   val      <<= 64;
   test_res <<= 64;
   
B
Bucky Kittinger 已提交
304
   __lshrti3( res, val, (val >> 64), 0 );
305
   eos_assert( res == test_res, "__lshrti3 result should be 2^127" );
306

B
Bucky Kittinger 已提交
307
   __lshrti3( res, val, (val >> 64), 1 );
308
   eos_assert( res == 85070591730234615865843651857942052864_ULLL, "__lshrti3 result should be 2^126" );
309

B
Bucky Kittinger 已提交
310
   __lshrti3( res, val, (val >> 64), 63 );
311
   eos_assert( res == 18446744073709551616_ULLL, "__lshrti3 result should be 2^64" );
312

B
Bucky Kittinger 已提交
313
   __lshrti3( res, val, (val >> 64), 64 );
314
   eos_assert( res == 9223372036854775808_ULLL, "__lshrti3 result should be 2^63" );
315

B
Bucky Kittinger 已提交
316
   __lshrti3( res, val, (val >> 64), 96 );
317
   eos_assert( res == 2147483649_ULLL, "__lshrti3 result should be 2^31" );
318

B
Bucky Kittinger 已提交
319
   __lshrti3( res, val, (val >> 64), 127 );
320
   eos_assert( res == 0x1, "__lshrti3 result should be 2^0" );
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
}

void test_compiler_builtins::test_ashrti3() {
   auto atoi128 = [](const char* in) {
      __int128 ret = 0;
      size_t   i = 0;
      bool     sign = false;

      if (in[i] == '-') {
         ++i;
         sign = true;
      }

      if (in[i] == '+')
         ++i;

      for (; in[i] != '\0' ; ++i) {
         const char c = in[i];
         ret *= 10;
         ret += c - '0';
      }

      if (sign)
         ret *= -1;

      return ret;
   };
   
   __int128 res      = 0;
B
Bucky Kittinger 已提交
350
   __int128 test     = 1;
351 352
   __int128 val      = atoi128("-170141183460469231731687303715884105728");

B
Bucky Kittinger 已提交
353 354 355
   test <<= 127; 

   __ashrti3( res, val, (val >> 64), 0 );
356
   eos_assert( res == atoi128("-170141183460469231731687303715884105728"), "__ashrti3 result should be -2^127" );
B
Bucky Kittinger 已提交
357 358

   __ashrti3(res, val, (val >> 64), 1 );
359
   eos_assert( res == atoi128("-85070591730234615865843651857942052864"), "__ashrti3 result should be -2^126" );
B
Bucky Kittinger 已提交
360 361

   __ashrti3(res, val, (val >> 64), 2 );
362
   eos_assert( res == test >> 2, "__ashrti3 result should be -2^125" );
B
Bucky Kittinger 已提交
363 364

   __ashrti3( res, val, (val >> 64), 64 );
365
   eos_assert( res == test >> 64, "__ashrti3 result should be -2^63" );
B
Bucky Kittinger 已提交
366 367

   __ashrti3( res, val, (val >> 64), 95 );
368
   eos_assert( res == test >> 95, "__ashrti3 result should be -2^31" );
B
Bucky Kittinger 已提交
369 370

   __ashrti3( res, val, (val >> 64), 127 );
371
   eos_assert( res == test >> 127, "__ashrti3 result should be -2^0" );
B
Bucky Kittinger 已提交
372
}
373

B
Bucky Kittinger 已提交
374

B
Bucky Kittinger 已提交
375 376 377 378 379 380 381 382
void test_compiler_builtins::test_modti3() {
   __int128 res    = 0;
   __int128 lhs_a  = -30;
   __int128 rhs_a  = 100;
   __int128 lhs_b  = 30;
   __int128 rhs_b  = -100;
   
   __modti3( res, lhs_a, lhs_a >> 64, rhs_a, rhs_a >> 64 );
383
   eos_assert( res ==  -30, "__modti3 result should be -30" );
B
Bucky Kittinger 已提交
384

B
Bucky Kittinger 已提交
385
   __modti3( res, lhs_b, lhs_b >> 64, rhs_b, rhs_b >> 64 );
386
   eos_assert( res ==  30, "__modti3 result should be 30" );
B
Bucky Kittinger 已提交
387 388
   
   __modti3( res, lhs_a, lhs_a >> 64, rhs_b, rhs_b >> 64 );
389
   eos_assert( res ==  -30, "__modti3 result should be -30" );
390

B
Bucky Kittinger 已提交
391
   __modti3( res, rhs_a, rhs_a >> 64, lhs_b, lhs_b >> 64 );
392
   eos_assert( res ==  10, "__modti3 result should be 10" );
393

B
Bucky Kittinger 已提交
394
   __modti3( res, rhs_a, rhs_a >> 64, rhs_b, rhs_b >> 64 );
395
   eos_assert( res ==  0, "__modti3 result should be 0" );
396

B
Bucky Kittinger 已提交
397
   __modti3( res, rhs_a, rhs_a >> 64, rhs_a, rhs_a >> 64 );
398
   eos_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
399 400

   __modti3( res, 0, 0, rhs_a, rhs_a >> 64 );
401
   eos_assert( res ==  0, "__modti3 result should be 0" );
402
}
B
Bucky Kittinger 已提交
403

B
Bucky Kittinger 已提交
404 405 406 407 408
void test_compiler_builtins::test_modti3_by_0() {
   __int128 res = 0;
   __int128 lhs = 100;

   __modti3( res, lhs, lhs >> 64, 0, 0 );
409
   eos_assert( false, "should have thrown an error" );
B
Bucky Kittinger 已提交
410 411 412 413 414 415 416 417 418 419
}

void test_compiler_builtins::test_umodti3() {
   unsigned __int128 res    = 0;
   unsigned __int128 lhs_a  = -30;
   unsigned __int128 rhs_a  = 100;
   unsigned __int128 lhs_b  = 30;
   unsigned __int128 rhs_b  = -100;
   
   __umodti3( res, lhs_a, lhs_a >> 64, rhs_a, rhs_a >> 64 );
420
   eos_assert( res ==  -30, "__modti3 result should be -30" );
B
Bucky Kittinger 已提交
421 422

   __umodti3( res, lhs_b, lhs_b >> 64, rhs_b, rhs_b >> 64 );
423
   eos_assert( res ==  30, "__modti3 result should be 30" );
B
Bucky Kittinger 已提交
424 425
   
   __umodti3( res, lhs_a, lhs_a >> 64, rhs_b, rhs_b >> 64 );
426
   eos_assert( res ==  -30, "__modti3 result should be -30" );
B
Bucky Kittinger 已提交
427 428

   __umodti3( res, rhs_a, rhs_a >> 64, lhs_b, lhs_b >> 64 );
429
   eos_assert( res ==  10, "__modti3 result should be 10" );
B
Bucky Kittinger 已提交
430 431

   __umodti3( res, rhs_a, rhs_a >> 64, rhs_b, rhs_b >> 64 );
432
   eos_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
433 434

   __umodti3( res, rhs_a, rhs_a >> 64, rhs_a, rhs_a >> 64 );
435
   eos_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
436 437

   __umodti3( res, 0, 0, rhs_a, rhs_a >> 64 );
438
   eos_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
439 440 441 442 443 444 445
}

void test_compiler_builtins::test_umodti3_by_0() {
   unsigned __int128 res = 0;
   unsigned __int128 lhs = 100;

   __umodti3( res, lhs, lhs >> 64, 0, 0 );
446
   eos_assert( false, "should have thrown an error" );
B
Bucky Kittinger 已提交
447
}