Home | History | Annotate | Download | only in aarch32
      1 // Copyright 2016, VIXL authors
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //   * Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //   * Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //   * Neither the name of ARM Limited nor the names of its contributors may be
     13 //     used to endorse or promote products derived from this software without
     14 //     specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
     17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
     20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26 
     27 #include <stdint.h>
     28 #include <stdio.h>
     29 #include <sys/time.h>
     30 
     31 #include "aarch32/constants-aarch32.h"
     32 #include "aarch32/instructions-aarch32.h"
     33 #include "aarch32/macro-assembler-aarch32.h"
     34 
     35 using namespace vixl;
     36 using namespace vixl::aarch32;
     37 
     38 static const unsigned kDefaultInstructionCount = 100000;
     39 
     40 // This program focuses on emitting simple instructions.
     41 //
     42 // This code will emit a given number of 'add r0, r1, r2' in a buffer.
     43 // This code therefore focuses on Emit and Operand.
     44 void benchmark(unsigned instructions, InstructionSet isa) {
     45   const unsigned buffer_size = 256 * KBytes;
     46   timeval start;
     47   gettimeofday(&start, NULL);
     48 
     49   MacroAssembler masm(buffer_size);
     50   masm.UseInstructionSet(isa);
     51 
     52 #define __ masm.
     53 
     54   for (unsigned i = 0; i < instructions; ++i) {
     55     __ Add(r0, r1, Operand(r2));
     56   }
     57 
     58   masm.FinalizeCode();
     59 
     60   timeval end;
     61   gettimeofday(&end, NULL);
     62   double delta = (end.tv_sec - start.tv_sec) +
     63                  static_cast<double>(end.tv_usec - start.tv_usec) / 1000000;
     64   printf("%s: time for %d instructions: %gs\n",
     65          isa == T32 ? "T32" : "A32",
     66          instructions,
     67          delta);
     68 }
     69 
     70 int main(int argc, char* argv[]) {
     71   unsigned instructions = 0;
     72 
     73   switch (argc) {
     74     case 1:
     75       instructions = kDefaultInstructionCount;
     76       break;
     77     case 2:
     78       instructions = atoi(argv[1]);
     79       break;
     80     default:
     81       printf("Usage: %s [#instructions]\n", argv[0]);
     82       exit(1);
     83   }
     84 
     85 #ifdef VIXL_INCLUDE_TARGET_A32
     86   benchmark(instructions, A32);
     87 #endif
     88 #ifdef VIXL_INCLUDE_TARGET_T32
     89   benchmark(instructions, T32);
     90 #endif
     91 
     92   return 0;
     93 }
     94