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