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 #include "test/cctest/compiler/function-tester.h"
      6 
      7 namespace v8 {
      8 namespace internal {
      9 namespace compiler {
     10 
     11 template <typename U>
     12 static void TypedArrayLoadHelper(const char* array_type) {
     13   static const uint32_t kValues[] = {
     14       0x00000000, 0x00000001, 0x00000023, 0x00000042, 0x12345678, 0x87654321,
     15       0x0000003f, 0x0000007f, 0x00003fff, 0x00007fff, 0x3fffffff, 0x7fffffff,
     16       0x000000ff, 0x00000080, 0x0000ffff, 0x00008000, 0xffffffff, 0x80000000};
     17   EmbeddedVector<char, 1024> values_buffer;
     18   StringBuilder values_builder(values_buffer.start(), values_buffer.length());
     19   for (size_t i = 0; i < arraysize(kValues); ++i) {
     20     values_builder.AddFormatted("a[%d] = 0x%08x;", i, kValues[i]);
     21   }
     22 
     23   // Note that below source creates two different typed arrays with the same
     24   // elements kind to get coverage for both (on heap / with external backing
     25   // store) access patterns.
     26   const char* source =
     27       "(function(a) {"
     28       "  var x = (a = new %sArray(%d)); %s;"
     29       "  var y = (a = new %sArray(%d)); %s; %%TypedArrayGetBuffer(y);"
     30       "  if (!%%HasFixed%sElements(x)) %%AbortJS('x');"
     31       "  if (!%%HasFixed%sElements(y)) %%AbortJS('y');"
     32       "  function f(a,b) {"
     33       "    a = a | 0; b = b | 0;"
     34       "    return x[a] + y[b];"
     35       "  }"
     36       "  return f;"
     37       "})()";
     38   EmbeddedVector<char, 1024> source_buffer;
     39   SNPrintF(source_buffer, source, array_type, arraysize(kValues),
     40            values_buffer.start(), array_type, arraysize(kValues),
     41            values_buffer.start(), array_type, array_type);
     42 
     43   FunctionTester T(source_buffer.start(),
     44                    CompilationInfo::kFunctionContextSpecializing |
     45                        CompilationInfo::kTypingEnabled);
     46   for (size_t i = 0; i < arraysize(kValues); ++i) {
     47     for (size_t j = 0; j < arraysize(kValues); ++j) {
     48       volatile U value_a = static_cast<U>(kValues[i]);
     49       volatile U value_b = static_cast<U>(kValues[j]);
     50       double expected =
     51           static_cast<double>(value_a) + static_cast<double>(value_b);
     52       T.CheckCall(T.Val(expected), T.Val(static_cast<double>(i)),
     53                   T.Val(static_cast<double>(j)));
     54     }
     55   }
     56 }
     57 
     58 
     59 TEST(TypedArrayLoad) {
     60   FLAG_typed_array_max_size_in_heap = 256;
     61   TypedArrayLoadHelper<int8_t>("Int8");
     62   TypedArrayLoadHelper<uint8_t>("Uint8");
     63   TypedArrayLoadHelper<int16_t>("Int16");
     64   TypedArrayLoadHelper<uint16_t>("Uint16");
     65   TypedArrayLoadHelper<int32_t>("Int32");
     66   TypedArrayLoadHelper<uint32_t>("Uint32");
     67   TypedArrayLoadHelper<float>("Float32");
     68   TypedArrayLoadHelper<double>("Float64");
     69   // TODO(mstarzinger): Add tests for ClampedUint8.
     70 }
     71 
     72 
     73 template <typename U>
     74 static void TypedArrayStoreHelper(const char* array_type) {
     75   static const uint32_t kValues[] = {
     76       0x00000000, 0x00000001, 0x00000023, 0x00000042, 0x12345678, 0x87654321,
     77       0x0000003f, 0x0000007f, 0x00003fff, 0x00007fff, 0x3fffffff, 0x7fffffff,
     78       0x000000ff, 0x00000080, 0x0000ffff, 0x00008000, 0xffffffff, 0x80000000};
     79   EmbeddedVector<char, 1024> values_buffer;
     80   StringBuilder values_builder(values_buffer.start(), values_buffer.length());
     81   for (size_t i = 0; i < arraysize(kValues); ++i) {
     82     values_builder.AddFormatted("a[%d] = 0x%08x;", i, kValues[i]);
     83   }
     84 
     85   // Note that below source creates two different typed arrays with the same
     86   // elements kind to get coverage for both (on heap/with external backing
     87   // store) access patterns.
     88   const char* source =
     89       "(function(a) {"
     90       "  var x = (a = new %sArray(%d)); %s;"
     91       "  var y = (a = new %sArray(%d)); %s; %%TypedArrayGetBuffer(y);"
     92       "  if (!%%HasFixed%sElements(x)) %%AbortJS('x');"
     93       "  if (!%%HasFixed%sElements(y)) %%AbortJS('y');"
     94       "  function f(a,b) {"
     95       "    a = a | 0; b = b | 0;"
     96       "    var t = x[a];"
     97       "    x[a] = y[b];"
     98       "    y[b] = t;"
     99       "    t = y[b];"
    100       "    y[b] = x[a];"
    101       "    x[a] = t;"
    102       "    return x[a] + y[b];"
    103       "  }"
    104       "  return f;"
    105       "})()";
    106   EmbeddedVector<char, 2048> source_buffer;
    107   SNPrintF(source_buffer, source, array_type, arraysize(kValues),
    108            values_buffer.start(), array_type, arraysize(kValues),
    109            values_buffer.start(), array_type, array_type);
    110 
    111   FunctionTester T(source_buffer.start(),
    112                    CompilationInfo::kFunctionContextSpecializing |
    113                        CompilationInfo::kTypingEnabled);
    114   for (size_t i = 0; i < arraysize(kValues); ++i) {
    115     for (size_t j = 0; j < arraysize(kValues); ++j) {
    116       volatile U value_a = static_cast<U>(kValues[i]);
    117       volatile U value_b = static_cast<U>(kValues[j]);
    118       double expected =
    119           static_cast<double>(value_a) + static_cast<double>(value_b);
    120       T.CheckCall(T.Val(expected), T.Val(static_cast<double>(i)),
    121                   T.Val(static_cast<double>(j)));
    122     }
    123   }
    124 }
    125 
    126 
    127 TEST(TypedArrayStore) {
    128   FLAG_typed_array_max_size_in_heap = 256;
    129   TypedArrayStoreHelper<int8_t>("Int8");
    130   TypedArrayStoreHelper<uint8_t>("Uint8");
    131   TypedArrayStoreHelper<int16_t>("Int16");
    132   TypedArrayStoreHelper<uint16_t>("Uint16");
    133   TypedArrayStoreHelper<int32_t>("Int32");
    134   TypedArrayStoreHelper<uint32_t>("Uint32");
    135   TypedArrayStoreHelper<float>("Float32");
    136   TypedArrayStoreHelper<double>("Float64");
    137   // TODO(mstarzinger): Add tests for ClampedUint8.
    138 }
    139 
    140 }  // namespace compiler
    141 }  // namespace internal
    142 }  // namespace v8
    143