Home | History | Annotate | Download | only in compiler
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_CCTEST_COMPILER_VALUE_HELPER_H_
      6 #define V8_CCTEST_COMPILER_VALUE_HELPER_H_
      7 
      8 #include <stdint.h>
      9 
     10 #include "src/compiler/common-operator.h"
     11 #include "src/compiler/node.h"
     12 #include "src/compiler/node-matchers.h"
     13 #include "src/isolate.h"
     14 #include "src/objects.h"
     15 #include "test/cctest/cctest.h"
     16 
     17 namespace v8 {
     18 namespace internal {
     19 namespace compiler {
     20 
     21 // A collection of utilities related to numerical and heap values, including
     22 // example input values of various types, including int32_t, uint32_t, double,
     23 // etc.
     24 class ValueHelper {
     25  public:
     26   Isolate* isolate_;
     27 
     28   ValueHelper() : isolate_(CcTest::InitIsolateOnce()) {}
     29 
     30   void CheckFloat64Constant(double expected, Node* node) {
     31     CHECK_EQ(IrOpcode::kFloat64Constant, node->opcode());
     32     CHECK_EQ(expected, OpParameter<double>(node));
     33   }
     34 
     35   void CheckNumberConstant(double expected, Node* node) {
     36     CHECK_EQ(IrOpcode::kNumberConstant, node->opcode());
     37     CHECK_EQ(expected, OpParameter<double>(node));
     38   }
     39 
     40   void CheckInt32Constant(int32_t expected, Node* node) {
     41     CHECK_EQ(IrOpcode::kInt32Constant, node->opcode());
     42     CHECK_EQ(expected, OpParameter<int32_t>(node));
     43   }
     44 
     45   void CheckUint32Constant(int32_t expected, Node* node) {
     46     CHECK_EQ(IrOpcode::kInt32Constant, node->opcode());
     47     CHECK_EQ(expected, OpParameter<int32_t>(node));
     48   }
     49 
     50   void CheckHeapConstant(HeapObject* expected, Node* node) {
     51     CHECK_EQ(IrOpcode::kHeapConstant, node->opcode());
     52     CHECK_EQ(expected, *OpParameter<Handle<HeapObject>>(node));
     53   }
     54 
     55   void CheckTrue(Node* node) {
     56     CheckHeapConstant(isolate_->heap()->true_value(), node);
     57   }
     58 
     59   void CheckFalse(Node* node) {
     60     CheckHeapConstant(isolate_->heap()->false_value(), node);
     61   }
     62 
     63   static std::vector<float> float32_vector() {
     64     static const float nan = std::numeric_limits<float>::quiet_NaN();
     65     static const float kValues[] = {
     66         -std::numeric_limits<float>::infinity(),
     67         -2.70497e+38f,
     68         -1.4698e+37f,
     69         -1.22813e+35f,
     70         -1.20555e+35f,
     71         -1.34584e+34f,
     72         -1.0079e+32f,
     73         -6.49364e+26f,
     74         -3.06077e+25f,
     75         -1.46821e+25f,
     76         -1.17658e+23f,
     77         -1.9617e+22f,
     78         -2.7357e+20f,
     79         -9223372036854775808.0f,  // INT64_MIN
     80         -1.48708e+13f,
     81         -1.89633e+12f,
     82         -4.66622e+11f,
     83         -2.22581e+11f,
     84         -1.45381e+10f,
     85         -1.3956e+09f,
     86         -1.32951e+09f,
     87         -1.30721e+09f,
     88         -1.19756e+09f,
     89         -9.26822e+08f,
     90         -6.35647e+08f,
     91         -4.00037e+08f,
     92         -1.81227e+08f,
     93         -5.09256e+07f,
     94         -964300.0f,
     95         -192446.0f,
     96         -28455.0f,
     97         -27194.0f,
     98         -26401.0f,
     99         -20575.0f,
    100         -17069.0f,
    101         -9167.0f,
    102         -960.178f,
    103         -113.0f,
    104         -62.0f,
    105         -15.0f,
    106         -7.0f,
    107         -1.0f,
    108         -0.0256635f,
    109         -4.60374e-07f,
    110         -3.63759e-10f,
    111         -4.30175e-14f,
    112         -5.27385e-15f,
    113         -1.48084e-15f,
    114         -1.05755e-19f,
    115         -3.2995e-21f,
    116         -1.67354e-23f,
    117         -1.11885e-23f,
    118         -1.78506e-30f,
    119         -5.07594e-31f,
    120         -3.65799e-31f,
    121         -1.43718e-34f,
    122         -1.27126e-38f,
    123         -0.0f,
    124         0.0f,
    125         1.17549e-38f,
    126         1.56657e-37f,
    127         4.08512e-29f,
    128         3.31357e-28f,
    129         6.25073e-22f,
    130         4.1723e-13f,
    131         1.44343e-09f,
    132         5.27004e-08f,
    133         9.48298e-08f,
    134         5.57888e-07f,
    135         4.89988e-05f,
    136         0.244326f,
    137         1.0f,
    138         12.4895f,
    139         19.0f,
    140         47.0f,
    141         106.0f,
    142         538.324f,
    143         564.536f,
    144         819.124f,
    145         7048.0f,
    146         12611.0f,
    147         19878.0f,
    148         20309.0f,
    149         797056.0f,
    150         1.77219e+09f,
    151         1.51116e+11f,
    152         4.18193e+13f,
    153         3.59167e+16f,
    154         9223372036854775807.0f,   // INT64_MAX
    155         18446744073709551615.0f,  // UINT64_MAX
    156         3.38211e+19f,
    157         2.67488e+20f,
    158         1.78831e+21f,
    159         9.20914e+21f,
    160         8.35654e+23f,
    161         1.4495e+24f,
    162         5.94015e+25f,
    163         4.43608e+30f,
    164         2.44502e+33f,
    165         2.61152e+33f,
    166         1.38178e+37f,
    167         1.71306e+37f,
    168         3.31899e+38f,
    169         3.40282e+38f,
    170         std::numeric_limits<float>::infinity(),
    171         nan,
    172         -nan,
    173     };
    174     return std::vector<float>(&kValues[0], &kValues[arraysize(kValues)]);
    175   }
    176 
    177   static std::vector<double> float64_vector() {
    178     static const double nan = std::numeric_limits<double>::quiet_NaN();
    179     static const double values[] = {-2e66,
    180                                     -9223373136366403584.0,
    181                                     -9223372036854775808.0,  // INT64_MIN
    182                                     -2147483649.5,
    183                                     -2147483648.25,
    184                                     -2147483648.0,
    185                                     -2147483647.875,
    186                                     -2147483647.125,
    187                                     -2147483647.0,
    188                                     -999.75,
    189                                     -2e66,
    190                                     -1.75,
    191                                     -1.0,
    192                                     -0.5,
    193                                     -0.0,
    194                                     0.0,
    195                                     3e-88,
    196                                     0.125,
    197                                     0.25,
    198                                     0.375,
    199                                     0.5,
    200                                     1.0,
    201                                     1.25,
    202                                     2,
    203                                     3.1e7,
    204                                     5.125,
    205                                     6.25,
    206                                     888,
    207                                     982983.25,
    208                                     2147483647.0,
    209                                     2147483647.375,
    210                                     2147483647.75,
    211                                     2147483648.0,
    212                                     2147483648.25,
    213                                     2147483649.25,
    214                                     9223372036854775807.0,  // INT64_MAX
    215                                     9223373136366403584.0,
    216                                     18446744073709551615.0,  // UINT64_MAX
    217                                     2e66,
    218                                     V8_INFINITY,
    219                                     -V8_INFINITY,
    220                                     -nan,
    221                                     nan};
    222     return std::vector<double>(&values[0], &values[arraysize(values)]);
    223   }
    224 
    225   static const std::vector<int32_t> int32_vector() {
    226     std::vector<uint32_t> values = uint32_vector();
    227     return std::vector<int32_t>(values.begin(), values.end());
    228   }
    229 
    230   static const std::vector<uint32_t> uint32_vector() {
    231     static const uint32_t kValues[] = {
    232         0x00000000, 0x00000001, 0xffffffff, 0x1b09788b, 0x04c5fce8, 0xcc0de5bf,
    233         // This row is useful for testing lea optimizations on intel.
    234         0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000008, 0x00000009,
    235         0x273a798e, 0x187937a3, 0xece3af83, 0x5495a16b, 0x0b668ecc, 0x11223344,
    236         0x0000009e, 0x00000043, 0x0000af73, 0x0000116b, 0x00658ecc, 0x002b3b4c,
    237         0x88776655, 0x70000000, 0x07200000, 0x7fffffff, 0x56123761, 0x7fffff00,
    238         0x761c4761, 0x80000000, 0x88888888, 0xa0000000, 0xdddddddd, 0xe0000000,
    239         0xeeeeeeee, 0xfffffffd, 0xf0000000, 0x007fffff, 0x003fffff, 0x001fffff,
    240         0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff,
    241         0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff};
    242     return std::vector<uint32_t>(&kValues[0], &kValues[arraysize(kValues)]);
    243   }
    244 
    245   static const std::vector<int64_t> int64_vector() {
    246     std::vector<uint64_t> values = uint64_vector();
    247     return std::vector<int64_t>(values.begin(), values.end());
    248   }
    249 
    250   static const std::vector<uint64_t> uint64_vector() {
    251     static const uint64_t kValues[] = {
    252         0x00000000,         0x00000001,         0xffffffff,
    253         0x1b09788b,         0x04c5fce8,         0xcc0de5bf,
    254         0x00000002,         0x00000003,         0x00000004,
    255         0x00000005,         0x00000008,         0x00000009,
    256         0xffffffffffffffff, 0xfffffffffffffffe, 0xfffffffffffffffd,
    257         0x0000000000000000, 0x0000000100000000, 0xffffffff00000000,
    258         0x1b09788b00000000, 0x04c5fce800000000, 0xcc0de5bf00000000,
    259         0x0000000200000000, 0x0000000300000000, 0x0000000400000000,
    260         0x0000000500000000, 0x0000000800000000, 0x0000000900000000,
    261         0x273a798e187937a3, 0xece3af835495a16b, 0x0b668ecc11223344,
    262         0x0000009e,         0x00000043,         0x0000af73,
    263         0x0000116b,         0x00658ecc,         0x002b3b4c,
    264         0x88776655,         0x70000000,         0x07200000,
    265         0x7fffffff,         0x56123761,         0x7fffff00,
    266         0x761c4761eeeeeeee, 0x80000000eeeeeeee, 0x88888888dddddddd,
    267         0xa0000000dddddddd, 0xddddddddaaaaaaaa, 0xe0000000aaaaaaaa,
    268         0xeeeeeeeeeeeeeeee, 0xfffffffdeeeeeeee, 0xf0000000dddddddd,
    269         0x007fffffdddddddd, 0x003fffffaaaaaaaa, 0x001fffffaaaaaaaa,
    270         0x000fffff,         0x0007ffff,         0x0003ffff,
    271         0x0001ffff,         0x0000ffff,         0x00007fff,
    272         0x00003fff,         0x00001fff,         0x00000fff,
    273         0x000007ff,         0x000003ff,         0x000001ff,
    274         0x00003fffffffffff, 0x00001fffffffffff, 0x00000fffffffffff,
    275         0x000007ffffffffff, 0x000003ffffffffff, 0x000001ffffffffff,
    276         0x8000008000000000, 0x8000008000000001, 0x8000000000000400,
    277         0x8000000000000401};
    278     return std::vector<uint64_t>(&kValues[0], &kValues[arraysize(kValues)]);
    279   }
    280 
    281   static const std::vector<double> nan_vector(size_t limit = 0) {
    282     static const double nan = std::numeric_limits<double>::quiet_NaN();
    283     static const double values[] = {-nan,               -V8_INFINITY * -0.0,
    284                                     -V8_INFINITY * 0.0, V8_INFINITY * -0.0,
    285                                     V8_INFINITY * 0.0,  nan};
    286     return std::vector<double>(&values[0], &values[arraysize(values)]);
    287   }
    288 
    289   static const std::vector<uint32_t> ror_vector() {
    290     static const uint32_t kValues[31] = {
    291         1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16,
    292         17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
    293     return std::vector<uint32_t>(&kValues[0], &kValues[arraysize(kValues)]);
    294   }
    295 };
    296 
    297 // Helper macros that can be used in FOR_INT32_INPUTS(i) { ... *i ... }
    298 // Watch out, these macros aren't hygenic; they pollute your scope. Thanks STL.
    299 #define FOR_INPUTS(ctype, itype, var)                           \
    300   std::vector<ctype> var##_vec = ValueHelper::itype##_vector(); \
    301   for (std::vector<ctype>::iterator var = var##_vec.begin();    \
    302        var != var##_vec.end(); ++var)
    303 
    304 #define FOR_INT32_INPUTS(var) FOR_INPUTS(int32_t, int32, var)
    305 #define FOR_UINT32_INPUTS(var) FOR_INPUTS(uint32_t, uint32, var)
    306 #define FOR_INT64_INPUTS(var) FOR_INPUTS(int64_t, int64, var)
    307 #define FOR_UINT64_INPUTS(var) FOR_INPUTS(uint64_t, uint64, var)
    308 #define FOR_FLOAT32_INPUTS(var) FOR_INPUTS(float, float32, var)
    309 #define FOR_FLOAT64_INPUTS(var) FOR_INPUTS(double, float64, var)
    310 
    311 #define FOR_INT32_SHIFTS(var) for (int32_t var = 0; var < 32; var++)
    312 
    313 #define FOR_UINT32_SHIFTS(var) for (uint32_t var = 0; var < 32; var++)
    314 
    315 }  // namespace compiler
    316 }  // namespace internal
    317 }  // namespace v8
    318 
    319 #endif  // V8_CCTEST_COMPILER_VALUE_HELPER_H_
    320