test_compiler_builtins.cpp 11.6 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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_assert( res == 100, "__multi3 result should be 100" );
93

B
Bucky Kittinger 已提交
94
   __multi3( res, 1, 0, rhs_b, rhs_b >> 64 );
95
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_assert( res == 100, "__divti3 result should be 100" ); 
137

B
Bucky Kittinger 已提交
138
   __divti3( res, lhs_a, ( lhs_a >> 64 ), 1, 0 );
139
   eosio_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
   eosio_assert( false, "Should have eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_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
   eosio_assert( res == 100, "__divti3 result should be 100" ); 
B
Bucky Kittinger 已提交
188 189

   __udivti3( res, lhs_a, ( lhs_a >> 64 ), 1, 0 );
190
   eosio_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
   eosio_assert( false, "Should have eosio_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
   eosio_assert( res == 1, "__lshlti3 result should be 1" );
B
Bucky Kittinger 已提交
212 213 214


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

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

   __lshlti3( res, val, ( val >> 64 ), 64 );
224
   eosio_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
   eosio_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
   eosio_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
   eosio_assert( res == 1, "__ashlti3 result should be 1" );
246 247


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

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

B
Bucky Kittinger 已提交
257
   __ashlti3( res, val, (val >> 64), 64 );
258
   eosio_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
   eosio_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
   eosio_assert( res == test_res, "__ashlti3 result should be 2^128" );
268 269 270 271 272 273 274 275 276 277 278
}


void test_compiler_builtins::test_lshrti3() {
   __int128 res      = 0;
   __int128 val      = 0x8000000000000000;
   __int128 test_res = 0x8000000000000000;

   val      <<= 64;
   test_res <<= 64;
   
B
Bucky Kittinger 已提交
279
   __lshrti3( res, val, (val >> 64), 0 );
280
   eosio_assert( res == test_res, "__lshrti3 result should be 2^127" );
281

B
Bucky Kittinger 已提交
282
   __lshrti3( res, val, (val >> 64), 1 );
283
   eosio_assert( res == 85070591730234615865843651857942052864_ULLL, "__lshrti3 result should be 2^126" );
284

B
Bucky Kittinger 已提交
285
   __lshrti3( res, val, (val >> 64), 63 );
286
   eosio_assert( res == 18446744073709551616_ULLL, "__lshrti3 result should be 2^64" );
287

B
Bucky Kittinger 已提交
288
   __lshrti3( res, val, (val >> 64), 64 );
289
   eosio_assert( res == 9223372036854775808_ULLL, "__lshrti3 result should be 2^63" );
290

B
Bucky Kittinger 已提交
291
   __lshrti3( res, val, (val >> 64), 96 );
292
   eosio_assert( res == 2147483648_ULLL, "__lshrti3 result should be 2^31" );
293

B
Bucky Kittinger 已提交
294
   __lshrti3( res, val, (val >> 64), 127 );
295
   eosio_assert( res == 0x1, "__lshrti3 result should be 2^0" );
296 297 298 299
}

void test_compiler_builtins::test_ashrti3() {
   __int128 res      = 0;
B
Bucky Kittinger 已提交
300
   __int128 test     = 1;
B
Bucky Kittinger 已提交
301
   __int128 val      = -170141183460469231731687303715884105728_LLL;
302

B
Bucky Kittinger 已提交
303 304 305
   test <<= 127; 

   __ashrti3( res, val, (val >> 64), 0 );
306
   eosio_assert( res == -170141183460469231731687303715884105728_LLL, "__ashrti3 result should be -2^127" );
B
Bucky Kittinger 已提交
307 308

   __ashrti3(res, val, (val >> 64), 1 );
309
   eosio_assert( res == -85070591730234615865843651857942052864_LLL, "__ashrti3 result should be -2^126" );
B
Bucky Kittinger 已提交
310 311

   __ashrti3(res, val, (val >> 64), 2 );
312
   eosio_assert( res == test >> 2, "__ashrti3 result should be -2^125" );
B
Bucky Kittinger 已提交
313 314

   __ashrti3( res, val, (val >> 64), 64 );
315
   eosio_assert( res == test >> 64, "__ashrti3 result should be -2^63" );
B
Bucky Kittinger 已提交
316 317

   __ashrti3( res, val, (val >> 64), 95 );
318
   eosio_assert( res == test >> 95, "__ashrti3 result should be -2^31" );
B
Bucky Kittinger 已提交
319 320

   __ashrti3( res, val, (val >> 64), 127 );
321
   eosio_assert( res == test >> 127, "__ashrti3 result should be -2^0" );
B
Bucky Kittinger 已提交
322
}
323

B
Bucky Kittinger 已提交
324

B
Bucky Kittinger 已提交
325 326 327 328 329 330 331 332
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 );
333
   eosio_assert( res ==  -30, "__modti3 result should be -30" );
B
Bucky Kittinger 已提交
334

B
Bucky Kittinger 已提交
335
   __modti3( res, lhs_b, lhs_b >> 64, rhs_b, rhs_b >> 64 );
336
   eosio_assert( res ==  30, "__modti3 result should be 30" );
B
Bucky Kittinger 已提交
337 338
   
   __modti3( res, lhs_a, lhs_a >> 64, rhs_b, rhs_b >> 64 );
339
   eosio_assert( res ==  -30, "__modti3 result should be -30" );
340

B
Bucky Kittinger 已提交
341
   __modti3( res, rhs_a, rhs_a >> 64, lhs_b, lhs_b >> 64 );
342
   eosio_assert( res ==  10, "__modti3 result should be 10" );
343

B
Bucky Kittinger 已提交
344
   __modti3( res, rhs_a, rhs_a >> 64, rhs_b, rhs_b >> 64 );
345
   eosio_assert( res ==  0, "__modti3 result should be 0" );
346

B
Bucky Kittinger 已提交
347
   __modti3( res, rhs_a, rhs_a >> 64, rhs_a, rhs_a >> 64 );
348
   eosio_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
349 350

   __modti3( res, 0, 0, rhs_a, rhs_a >> 64 );
351
   eosio_assert( res ==  0, "__modti3 result should be 0" );
352
}
B
Bucky Kittinger 已提交
353

B
Bucky Kittinger 已提交
354 355 356 357 358
void test_compiler_builtins::test_modti3_by_0() {
   __int128 res = 0;
   __int128 lhs = 100;

   __modti3( res, lhs, lhs >> 64, 0, 0 );
359
   eosio_assert( false, "should have thrown an error" );
B
Bucky Kittinger 已提交
360 361 362 363 364 365 366 367 368 369
}

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 );
370
   eosio_assert( res ==  -30, "__modti3 result should be -30" );
B
Bucky Kittinger 已提交
371 372

   __umodti3( res, lhs_b, lhs_b >> 64, rhs_b, rhs_b >> 64 );
373
   eosio_assert( res ==  30, "__modti3 result should be 30" );
B
Bucky Kittinger 已提交
374 375
   
   __umodti3( res, lhs_a, lhs_a >> 64, rhs_b, rhs_b >> 64 );
376
   eosio_assert( res ==  -30, "__modti3 result should be -30" );
B
Bucky Kittinger 已提交
377 378

   __umodti3( res, rhs_a, rhs_a >> 64, lhs_b, lhs_b >> 64 );
379
   eosio_assert( res ==  10, "__modti3 result should be 10" );
B
Bucky Kittinger 已提交
380 381

   __umodti3( res, rhs_a, rhs_a >> 64, rhs_b, rhs_b >> 64 );
382
   eosio_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
383 384

   __umodti3( res, rhs_a, rhs_a >> 64, rhs_a, rhs_a >> 64 );
385
   eosio_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
386 387

   __umodti3( res, 0, 0, rhs_a, rhs_a >> 64 );
388
   eosio_assert( res ==  0, "__modti3 result should be 0" );
B
Bucky Kittinger 已提交
389 390 391 392 393 394 395
}

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

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