1cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// Copyright 2017, VIXL authors
2cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// All rights reserved.
3cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//
4cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// Redistribution and use in source and binary forms, with or without
5cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// modification, are permitted provided that the following conditions are met:
6cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//
7cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//   * Redistributions of source code must retain the above copyright notice,
8cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//     this list of conditions and the following disclaimer.
9cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//   * Redistributions in binary form must reproduce the above copyright notice,
10cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//     this list of conditions and the following disclaimer in the documentation
11cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//     and/or other materials provided with the distribution.
12cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//   * Neither the name of ARM Limited nor the names of its contributors may be
13cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//     used to endorse or promote products derived from this software without
14cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//     specific prior written permission.
15cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli//
16cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
27cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#include <stdint.h>
281bce007699e07bd855b7d194ca93fa5504a73edaPierre Langlois#include <stdio.h>
29cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#include <sys/time.h>
30cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
31cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#include "aarch32/constants-aarch32.h"
32cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#include "aarch32/instructions-aarch32.h"
33cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#include "aarch32/macro-assembler-aarch32.h"
34cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
35cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveliusing namespace vixl;
36cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveliusing namespace vixl::aarch32;
37cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
38cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouvelistatic const int kDefaultIterationCount = 1000;
39cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouvelistatic const int kDefaultLiteralCount = 100;
40cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
41cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// This program focuses on emitting branch instructions targeting a label bound
42cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// very closely. Here the MacroAssembler is used. This exercises label binding
43cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// and patching mechanisms, as well as the veneer resolving mechanisms for
44cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli// branches not requiring veneers.
45cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouvelivoid benchmark(int iterations, int literals, InstructionSet isa) {
46cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  const int buffer_size = 256 * KBytes;
47cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
48cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  timeval start;
49cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  gettimeofday(&start, NULL);
50cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  MacroAssembler masm(buffer_size);
51cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  masm.UseInstructionSet(isa);
52cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
53cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#define __ masm.
54cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
55cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  // Load a number of distinct literals, for a number of iterations, forcing
56cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  // pool emission in between.
57cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  for (int i = 0; i < iterations; i++) {
58cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli    for (int j = 0; j < literals; j++) {
59cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      __ Ldr(r0, j);
60cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      __ FinalizeCode();
61cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli    }
62cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  }
63cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
64cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  timeval end;
65cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  gettimeofday(&end, NULL);
66cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  double delta = (end.tv_sec - start.tv_sec) +
67cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli                 static_cast<double>(end.tv_usec - start.tv_usec) / 1000000;
68cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  printf("%s: time for %d iterations: %gs\n",
69cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli         isa == T32 ? "T32" : "A32",
70cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli         iterations,
71cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli         delta);
72cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli}
73cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
74cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
75cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveliint main(int argc, char* argv[]) {
76cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  int iterations = 0;
77cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  int literals = 0;
78cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
79cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  switch (argc) {
80cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli    case 1:
81cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      iterations = kDefaultIterationCount;
82cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      literals = kDefaultLiteralCount;
83cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      break;
84cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli    case 2:
85cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      iterations = atoi(argv[1]);
86cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      literals = kDefaultLiteralCount;
87cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      break;
88cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli    case 3:
89cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      iterations = atoi(argv[1]);
90cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      literals = atoi(argv[2]);
91cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      break;
92cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli    default:
93cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      printf("Usage: %s [#iterations] [#literals]\n", argv[0]);
94cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli      exit(1);
95cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  }
96cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
97cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#ifdef VIXL_INCLUDE_TARGET_A32
98cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  benchmark(iterations, literals, A32);
99cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#endif
100cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#ifdef VIXL_INCLUDE_TARGET_T32
101cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  benchmark(iterations, literals, T32);
102cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli#endif
103cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli
104cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli  return 0;
105cbadf8e26d9422ea0f436928239da9e99b82f3a3Georgia Kouveli}
106