1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are met:
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//   * Redistributions of source code must retain the above copyright notice,
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     this list of conditions and the following disclaimer.
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//   * Redistributions in binary form must reproduce the above copyright notice,
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     this list of conditions and the following disclaimer in the documentation
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     and/or other materials provided with the distribution.
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//   * Neither the name of ARM Limited nor the names of its contributors may be
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     used to endorse or promote products derived from this software without
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     specific prior written permission.
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <stdlib.h>
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/decoder-arm64.h"
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/decoder-arm64-inl.h"
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/disasm-arm64.h"
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(FUZZ_decoder) {
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Feed noise into the decoder to check that it doesn't crash.
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // 43 million = ~1% of the instruction space.
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int instruction_count = 43 * 1024 * 1024;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint16_t seed[3] = {1, 2, 3};
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  seed48(seed);
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Decoder<DispatchingDecoderVisitor> decoder;
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Instruction buffer[kInstructionSize];
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < instruction_count; i++) {
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint32_t instr = static_cast<uint32_t>(mrand48());
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer->SetInstructionBits(instr);
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    decoder.Decode(buffer);
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(FUZZ_disasm) {
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Feed noise into the disassembler to check that it doesn't crash.
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // 9 million = ~0.2% of the instruction space.
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int instruction_count = 9 * 1024 * 1024;
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint16_t seed[3] = {42, 43, 44};
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  seed48(seed);
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Decoder<DispatchingDecoderVisitor> decoder;
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DisassemblingDecoder disasm;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Instruction buffer[kInstructionSize];
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  decoder.AppendVisitor(&disasm);
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < instruction_count; i++) {
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint32_t instr = static_cast<uint32_t>(mrand48());
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer->SetInstructionBits(instr);
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    decoder.Decode(buffer);
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
72