Home | History | Annotate | Download | only in assembler
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #include <stdio.h>
     30 #include <stdlib.h>
     31 #include <string.h>
     32 #include <unistd.h>
     33 #include <errno.h>
     34 
     35 #include <sys/mman.h>
     36 #include <cutils/ashmem.h>
     37 #include <cutils/atomic.h>
     38 #include <cutils/log.h>
     39 
     40 #define __STDC_FORMAT_MACROS
     41 #include <inttypes.h>
     42 
     43 #include "codeflinger/ARMAssemblerInterface.h"
     44 #include "codeflinger/MIPS64Assembler.h"
     45 using namespace android;
     46 
     47 #define TESTS_DATAOP_ENABLE             1
     48 #define TESTS_DATATRANSFER_ENABLE       1
     49 #define ASSEMBLY_SCRATCH_SIZE           4096
     50 
     51 void *instrMem;
     52 uint32_t  instrMemSize = 128 * 1024;
     53 char     dataMem[8192];
     54 
     55 typedef void (*asm_function_t)();
     56 extern "C" void asm_mips_test_jacket(asm_function_t function,
     57                                      int64_t regs[], int32_t flags[]);
     58 
     59 #define MAX_32BIT (uint32_t)(((uint64_t)1 << 32) - 1)
     60 #define MAX_64BIT ((uint64_t)0xFFFFFFFFFFFFFFFF)
     61 const uint32_t NA = 0;
     62 const uint32_t NUM_REGS = 32;
     63 const uint32_t NUM_FLAGS = 16;
     64 
     65 enum instr_t
     66 {
     67     INSTR_ADD,
     68     INSTR_SUB,
     69     INSTR_AND,
     70     INSTR_ORR,
     71     INSTR_RSB,
     72     INSTR_BIC,
     73     INSTR_CMP,
     74     INSTR_MOV,
     75     INSTR_MVN,
     76     INSTR_MUL,
     77     INSTR_MLA,
     78     INSTR_SMULBB,
     79     INSTR_SMULBT,
     80     INSTR_SMULTB,
     81     INSTR_SMULTT,
     82     INSTR_SMULWB,
     83     INSTR_SMULWT,
     84     INSTR_SMLABB,
     85     INSTR_UXTB16,
     86     INSTR_UBFX,
     87     INSTR_ADDR_ADD,
     88     INSTR_ADDR_SUB,
     89     INSTR_LDR,
     90     INSTR_LDRB,
     91     INSTR_LDRH,
     92     INSTR_ADDR_LDR,
     93     INSTR_LDM,
     94     INSTR_STR,
     95     INSTR_STRB,
     96     INSTR_STRH,
     97     INSTR_ADDR_STR,
     98     INSTR_STM
     99 };
    100 
    101 enum shift_t
    102 {
    103     SHIFT_LSL,
    104     SHIFT_LSR,
    105     SHIFT_ASR,
    106     SHIFT_ROR,
    107     SHIFT_NONE
    108 };
    109 
    110 enum offset_t
    111 {
    112     REG_SCALE_OFFSET,
    113     REG_OFFSET,
    114     IMM8_OFFSET,
    115     IMM12_OFFSET,
    116     NO_OFFSET
    117 };
    118 
    119 enum cond_t
    120 {
    121     EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV,
    122     HS = CS,
    123     LO = CC
    124 };
    125 
    126 const char * cc_code[] =
    127 {
    128     "EQ", "NE", "CS", "CC", "MI", "PL", "VS", "VC",
    129     "HI", "LS","GE","LT", "GT", "LE", "AL", "NV"
    130 };
    131 
    132 struct condTest_t
    133 {
    134     int     mode;
    135     int32_t Rcond1;
    136     int32_t Rcond2;
    137     uint64_t Rcond1Value;
    138     uint64_t Rcond2Value;
    139 };
    140 
    141 
    142 struct dataOpTest_t
    143 {
    144     uint32_t   id;
    145     instr_t    op;
    146     condTest_t preCond;
    147     cond_t     cond;
    148     bool       setFlags;
    149     uint64_t   RnValue;
    150     uint64_t   RsValue;
    151     bool       immediate;
    152     uint32_t   immValue;
    153     uint64_t   RmValue;
    154     uint32_t   shiftMode;
    155     uint32_t   shiftAmount;
    156     uint64_t   RdValue;
    157     bool       checkRd;
    158     uint64_t   postRdValue;
    159 };
    160 
    161 struct dataTransferTest_t
    162 {
    163     uint32_t id;
    164     instr_t  op;
    165     uint32_t preFlag;
    166     cond_t   cond;
    167     bool     setMem;
    168     uint64_t memOffset;
    169     uint64_t memValue;
    170     uint64_t RnValue;
    171     offset_t offsetType;
    172     uint64_t RmValue;
    173     uint32_t immValue;
    174     bool     writeBack;
    175     bool     preIndex;
    176     bool     postIndex;
    177     uint64_t RdValue;
    178     uint64_t postRdValue;
    179     uint64_t postRnValue;
    180     bool     checkMem;
    181     uint64_t postMemOffset;
    182     uint32_t postMemLength;
    183     uint64_t postMemValue;
    184 };
    185 
    186 
    187 dataOpTest_t dataOpTests [] =
    188 {
    189      {0xA000,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT,NA,NA,NA,NA,1,0},
    190      {0xA001,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT-1,NA,NA,NA,NA,1,MAX_64BIT},
    191      {0xA002,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT,NA,NA,NA,1,0},
    192      {0xA003,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT-1,NA,NA,NA,1,MAX_64BIT},
    193      {0xA004,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL, 0,NA,1,0},
    194      {0xA005,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0xFFFFFFFF80000001},
    195      {0xA006,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,2},
    196      {0xA007,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,2},
    197      {0xA008,INSTR_ADD,{0,0,0,0,0},AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,1},
    198      {0xA009,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_64BIT,SHIFT_ASR,31,NA,1,0},
    199      {0xA010,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT,0,0,0,NA,1,1},
    200      {0xA011,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT-1,0,0,0,NA,1,0},
    201      {0xA012,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,0,0,NA,1,1},
    202      {0xA013,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT-1,0,0,NA,1,0},
    203      {0xA014,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,0,NA,1,1},
    204      {0xA015,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0},
    205      {0xA016,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,1},
    206      {0xA017,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,1},
    207      {0xA018,INSTR_AND,{0,0,0,0,0},AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,0},
    208      {0xA019,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_ASR,31,NA,1,1},
    209      {0xA020,INSTR_ORR,{0,0,0,0,0},AL,0,3,NA,1,MAX_32BIT,0,0,0,NA,1,MAX_64BIT},
    210      {0xA021,INSTR_ORR,{0,0,0,0,0},AL,0,2,NA,1,MAX_32BIT-1,0,0,0,NA,1,MAX_64BIT-1},
    211      {0xA022,INSTR_ORR,{0,0,0,0,0},AL,0,3,NA,0,0,MAX_32BIT,0,0,NA,1,MAX_64BIT},
    212      {0xA023,INSTR_ORR,{0,0,0,0,0},AL,0,2,NA,0,0,MAX_32BIT-1,0,0,NA,1,MAX_64BIT-1},
    213      {0xA024,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,0,NA,1,MAX_64BIT},
    214      {0xA025,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0xFFFFFFFF80000001},
    215      {0xA026,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,1},
    216      {0xA027,INSTR_ORR,{0,0,0,0,0},AL,0,0,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,1},
    217      {0xA028,INSTR_ORR,{0,0,0,0,0},AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,1},
    218      {0xA029,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_64BIT,SHIFT_ASR,31,NA,1,MAX_64BIT},
    219      {0xA030,INSTR_CMP,{0,0,0,0,0},AL,1,0x10000,NA,1,0x10000,0,0,0,NA,0,0},
    220      {0xA031,INSTR_MUL,{0,0,0,0,0},AL,0,0,0x10000,0,0,0x10000,0,0,NA,1,0},
    221      {0xA032,INSTR_MUL,{0,0,0,0,0},AL,0,0,0x1000,0,0,0x10000,0,0,NA,1,0x10000000},
    222      {0xA033,INSTR_MUL,{0,0,0,0,0},AL,0,0,MAX_32BIT,0,0,1,0,0,NA,1,MAX_64BIT},
    223      {0xA034,INSTR_MLA,{0,0,0,0,0},AL,0,0x10000,0x10000,0,0,0x10000,0,0,NA,1,0x10000},
    224      {0xA035,INSTR_MLA,{0,0,0,0,0},AL,0,0x10000,0x1000,0,0,0x10000,0,0,NA,1,0x10010000},
    225      {0xA036,INSTR_SUB,{1,R_v1,R_a6,2,4},MI,0,2,NA,0,NA,1,NA,NA,2,1,1},
    226      {0xA037,INSTR_SUB,{2,R_v1,R_a6,2,0},MI,0,2,NA,0,NA,1,NA,NA,2,1,2},
    227      {0xA038,INSTR_SUB,{1,R_v1,R_a6,4,2},GE,0,2,NA,1,1,NA,NA,NA,2,1,1},
    228      {0xA039,INSTR_SUB,{1,R_a5,R_a6,2,7},GE,0,2,NA,1,1,NA,NA,NA,2,1,2},
    229      {0xA040,INSTR_SUB,{1,R_a5,R_a6,1,1},HS,0,2,NA,1,1,NA,NA,NA,2,1,1},
    230      {0xA041,INSTR_SUB,{1,R_a5,R_a6,0,1},HS,0,2,NA,1,1,NA,NA,NA,2,1,2},
    231      {0xA042,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,1,1<< 16,0,0,0,NA,1,UINT64_C(1) -(1<<16)},
    232      {0xA043,INSTR_SUB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,1,1,0,0,0,NA,1,MAX_64BIT-1},
    233      {0xA044,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,1,1,0,0,0,NA,1,0},
    234      {0xA045,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,1<<16,0,0,NA,1,UINT64_C(1) -(1<<16)},
    235      {0xA046,INSTR_SUB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,0,NA,1,0,0,NA,1,MAX_64BIT-1},
    236      {0xA047,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,0,0,NA,1,0},
    237      {0xA048,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,SHIFT_LSL,16,NA,1,UINT64_C(1) -(1<<16)},
    238      {0xA049,INSTR_SUB,{0,0,0,0,0},AL,0,0x80000001,NA,0,NA,MAX_32BIT,SHIFT_LSL,31,NA,1,1},
    239      {0xA050,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,3,SHIFT_LSR,1,NA,1,0},
    240      {0xA051,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT,SHIFT_LSR,31,NA,1,0},
    241      {0xA052,INSTR_RSB,{1,R_a5,R_a6,4,1},GE,0,2,NA,1,0,NA,NA,NA,2,1,UINT64_C(-2)},
    242      {0xA053,INSTR_RSB,{1,R_a5,R_a6,UINT64_C(-1),1},GE,0,2,NA,1,0,NA,NA,NA,2,1,2},
    243      {0xA054,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,1,1<<16,NA,NA,NA,NA,1,(1<<16)-1},
    244      {0xA055,INSTR_RSB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,1,1,NA,NA,NA,NA,1,UINT64_C(1)-MAX_64BIT},
    245      {0xA056,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,1,1,NA,NA,NA,NA,1,0},
    246      {0xA057,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,1<<16,0,0,NA,1,(1<<16)-1},
    247      {0xA058,INSTR_RSB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,0,NA,1,0,0,NA,1,UINT64_C(1)-MAX_64BIT},
    248      {0xA059,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,0,0,NA,1,0},
    249      {0xA060,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,SHIFT_LSL,16,NA,1,(1<<16)-1},
    250      {0xA061,INSTR_RSB,{0,0,0,0,0},AL,0,0x80000001,NA,0,NA,MAX_32BIT ,SHIFT_LSL,31,NA,1,UINT64_C(-1)},
    251      {0xA062,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,3,SHIFT_LSR,1,NA,1,0},
    252      {0xA063,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT,SHIFT_LSR,31,NA,1,0},
    253      {0xA064,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,1,0x80000001,NA,NA,NA,NA,1,0xFFFFFFFF80000001},
    254      {0xA065,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,0x80000001,0,0,NA,1,0xFFFFFFFF80000001},
    255      {0xA066,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,NA,1,MAX_64BIT-1},
    256      {0xA067,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0xFFFFFFFF80000000},
    257      {0xA068,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,3,SHIFT_LSR,1,NA,1,1},
    258      {0xA069,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,1},
    259      {0xA070,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,3,SHIFT_ASR,1,NA,1,1},
    260      {0xA071,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_64BIT ,SHIFT_ASR,31,NA,1,MAX_64BIT},
    261      {0xA072,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,3,SHIFT_ROR,1,NA,1,0xFFFFFFFF80000001},
    262      {0xA073,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,0x80000001,SHIFT_ROR,31,NA,1,3},
    263      {0xA074,INSTR_MOV,{0,0,0,0,0},AL,1,NA,NA,0,0,MAX_64BIT -1,SHIFT_ASR,1,NA,1,MAX_64BIT},
    264      {0xA075,INSTR_MOV,{0,0,0,0,0},AL,1,NA,NA,0,0,3,SHIFT_ASR,1,NA,1,1},
    265      {0xA076,INSTR_MOV,{2,R_a5,R_a6,6,8},MI,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2},
    266      {0xA077,INSTR_MOV,{2,R_a5,R_a6,UINT64_C(-4),UINT64_C(-8)},MI,0,NA,NA,0,0,0x80000001,0,0,2,1,0xFFFFFFFF80000001},
    267      {0xA078,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-1)},LT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2},
    268      {0xA079,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},LT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001},
    269      {0xA080,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-5)},GE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,MAX_64BIT-1},
    270      {0xA081,INSTR_MOV,{1,R_a5,R_a6,5,5},GE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,2,1,0xFFFFFFFF80000000},
    271      {0xA082,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},GE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,2,1,2},
    272      {0xA083,INSTR_MOV,{1,R_a5,R_a6,4,1},LE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,2},
    273      {0xA084,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-1)},LE,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001},
    274      {0xA085,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},LE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,2,1,0xFFFFFFFF80000000},
    275      {0xA086,INSTR_MOV,{1,R_a5,R_a6,1,1},GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2},
    276      {0xA087,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-3)},GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001},
    277      {0xA088,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),0},GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2},
    278      {0xA089,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-1)},GT,0,NA,NA,0,0,0x80000001,0,0,2,1,2},
    279      {0xA090,INSTR_MOV,{1,R_a5,R_a6,6,1},GT,0,NA,NA,0,0,0x80000001,0,0,2,1,0xFFFFFFFF80000001},
    280      {0xA091,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},GT,0,NA,NA,0,0,0x80000001,0,0,2,1,2},
    281      {0xA092,INSTR_MOV,{1,R_a5,R_a6,1,1},GT,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,2},
    282      {0xA093,INSTR_MOV,{1,R_a5,R_a6,4,1},GT,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,MAX_64BIT-1},
    283      {0xA094,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},GT,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,2},
    284      {0xA095,INSTR_MOV,{1,R_a5,R_a6,1,UINT64_C(-1)},HS,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2},
    285      {0xA096,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},HS,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001},
    286      {0xA097,INSTR_MVN,{1,R_a5,R_a6,1,4},HS,0,NA,NA,1,MAX_32BIT-1,NA,NA,NA,2,1,2},
    287      {0xA098,INSTR_MVN,{1,R_a5,R_a6,UINT64_C(-1),1},HS,0,NA,NA,1,MAX_32BIT-1,NA,NA,NA,2,1,1},
    288      {0xA099,INSTR_MVN,{0,0,0,0,0},AL,0,NA,NA,1,0,NA,NA,NA,2,1,MAX_64BIT},
    289      {0xA100,INSTR_MVN,{0,0,0,0,0},AL,0,NA,NA,0,NA,MAX_32BIT-1,NA,0,2,1,1},
    290      {0xA101,INSTR_MVN,{0,0,0,0,0},AL,0,NA,NA,0,NA,0x80000001,NA,0,2,1,0x7FFFFFFE},
    291      {0xA102,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT,NA,NA,NA,NA,1,0},
    292      {0xA103,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT-1,NA,NA,NA,NA,1,1},
    293      {0xA104,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,0,0,NA,1,0},
    294      {0xA105,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT-1,0,0,NA,1,1},
    295      {0xA106,INSTR_BIC,{0,0,0,0,0},AL,0,0xF0,NA,0,0,3,SHIFT_ASR,1,NA,1,0xF0},
    296      {0xA107,INSTR_BIC,{0,0,0,0,0},AL,0,0xF0,NA,0,0,MAX_64BIT,SHIFT_ASR,31,NA,1,0},
    297      {0xA108,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFABCD0001,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    298      {0xA109,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFABCD0FFF,NA,NA,NA,1,0x00000FFF},
    299      {0xA110,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    300      {0xA111,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,1},
    301      {0xA112,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFABCD0001,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    302      {0xA113,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFABCD0FFF,NA,NA,NA,1,0x00000FFF},
    303      {0xA114,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    304      {0xA115,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,1},
    305      {0xA116,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    306      {0xA117,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF},
    307      {0xA118,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    308      {0xA119,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,1},
    309      {0xA120,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    310      {0xA121,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF},
    311      {0xA122,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    312      {0xA123,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,1},
    313      {0xA124,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFE},
    314      {0xA125,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF},
    315      {0xA126,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    316      {0xA127,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0},
    317      {0xA128,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFE},
    318      {0xA129,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF},
    319      {0xA130,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF},
    320      {0xA131,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0},
    321      {0xA132,INSTR_SMLABB,{0,0,0,0,0},AL,0,1,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFABCD0001,NA,NA,NA,1,0},
    322      {0xA133,INSTR_SMLABB,{0,0,0,0,0},AL,0,1,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFABCD0FFF,NA,NA,NA,1,0x00001000},
    323      {0xA134,INSTR_SMLABB,{0,0,0,0,0},AL,0,0xFFFFFFFFFFFFFFFF,0xFFFFFFFFABCD0001,0,NA,0xABCDFFFF,NA,NA,NA,1,0xFFFFFFFFFFFFFFFE},
    324      {0xA135,INSTR_SMLABB,{0,0,0,0,0},AL,0,0xFFFFFFFFFFFFFFFF,0xFFFFFFFFABCDFFFF,0,NA,0xABCDFFFF,NA,NA,NA,1,0},
    325      {0xA136,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,0,NA,1,0x00CD0001},
    326      {0xA137,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,1,NA,1,0x00AB00EF},
    327      {0xA138,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,2,NA,1,0x000100CD},
    328      {0xA139,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,3,NA,1,0x00EF00AB},
    329      {0xA140,INSTR_ADDR_ADD,{0,0,0,0,0},AL,0,0xCFFFFFFFF,NA,0,NA,0x1,SHIFT_LSL,1,NA,1,0xD00000001},
    330      {0xA141,INSTR_ADDR_ADD,{0,0,0,0,0},AL,0,0x01,NA,0,NA,0x1,SHIFT_LSL,2,NA,1,0x5},
    331      {0xA142,INSTR_ADDR_ADD,{0,0,0,0,0},AL,0,0xCFFFFFFFF,NA,0,NA,0x1,NA,0,NA,1,0xD00000000},
    332      {0xA143,INSTR_ADDR_SUB,{0,0,0,0,0},AL,0,0xD00000001,NA,0,NA,0x010000,SHIFT_LSR,15,NA,1,0xCFFFFFFFF},
    333      {0xA144,INSTR_ADDR_SUB,{0,0,0,0,0},AL,0,0xCFFFFFFFF,NA,0,NA,0x020000,SHIFT_LSR,15,NA,1,0xCFFFFFFFB},
    334      {0xA145,INSTR_ADDR_SUB,{0,0,0,0,0},AL,0,3,NA,0,NA,0x010000,SHIFT_LSR,15,NA,1,1},
    335 };
    336 
    337 dataTransferTest_t dataTransferTests [] =
    338 {
    339     {0xB000,INSTR_LDR,AL,AL,1,24,0xABCDEF0123456789,0,REG_SCALE_OFFSET,24,NA,NA,NA,NA,NA,0x23456789,0,0,NA,NA,NA},
    340     {0xB001,INSTR_LDR,AL,AL,1,0,0xABCDEF0123456789,0,IMM12_OFFSET,NA,4,1,0,1,NA,0x23456789,4,0,NA,NA,NA},
    341     {0xB002,INSTR_LDR,AL,AL,1,0,0xABCDEF0123456789,0,NO_OFFSET,NA,NA,0,0,0,NA,0x23456789,0,0,NA,NA,NA},
    342     {0xB003,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,REG_SCALE_OFFSET,4064,NA,NA,NA,NA,NA,0x89,0,0,NA,NA,NA},
    343     {0xB004,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,0,0,1,0,NA,0x67,4065,0,NA,NA,NA},
    344     {0xB005,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,1,0,1,0,NA,0x45,4065,0,NA,NA,NA},
    345     {0xB006,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,2,0,1,0,NA,0x23,4065,0,NA,NA,NA},
    346     {0xB007,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,1,1,0,1,NA,0x67,4066,0,NA,NA,NA},
    347     {0xB008,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,NO_OFFSET,NA,NA,0,0,0,NA,0x89,0,0,NA,NA,NA},
    348     {0xB009,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,0,IMM8_OFFSET,NA,2,1,0,1,NA,0x6789,2,0,NA,NA,NA},
    349     {0xB010,INSTR_LDRH,AL,AL,1,4064,0xABCDEF0123456789,0,REG_OFFSET,4064,0,0,1,0,NA,0x6789,0,0,NA,NA,NA},
    350     {0xB011,INSTR_LDRH,AL,AL,1,4064,0xABCDEF0123456789,0,REG_OFFSET,4066,0,0,1,0,NA,0x2345,0,0,NA,NA,NA},
    351     {0xB012,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,0,NO_OFFSET,NA,0,0,0,0,NA,0x6789,0,0,NA,NA,NA},
    352     {0xB013,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,2,NO_OFFSET,NA,0,0,0,0,NA,0x2345,2,0,NA,NA,NA},
    353     {0xB014,INSTR_STR,AL,AL,1,2,0xDEADBEEFDEADBEEF,4,IMM12_OFFSET,NA,4,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,8,1,2,8,0xDEAD23456789BEEF},
    354     {0xB015,INSTR_STR,AL,AL,1,2,0xDEADBEEFDEADBEEF,4,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4,1,2,8,0xDEAD23456789BEEF},
    355     {0xB016,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,0,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDEAD89EF},
    356     {0xB017,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,1,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDE89BEEF},
    357     {0xB018,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,2,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEF89ADBEEF},
    358     {0xB019,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,4,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,5,1,0,8,0xDEADBEEFDEAD89EF},
    359     {0xB020,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDEAD89EF},
    360     {0xB021,INSTR_STRH,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4070,IMM8_OFFSET,NA,2,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,4072,1,4066,8,0xDEAD6789DEADBEEF},
    361     {0xB022,INSTR_STRH,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF},
    362 };
    363 
    364 
    365 void flushcache()
    366 {
    367     const long base = long(instrMem);
    368     const long curr = base + long(instrMemSize);
    369     __builtin___clear_cache((char*)base, (char*)curr);
    370 }
    371 
    372 void dataOpTest(dataOpTest_t test, ArmToMips64Assembler *a64asm, uint32_t Rd = R_v1,
    373                 uint32_t Rn = R_t0, uint32_t Rm = R_t1, uint32_t Rs = R_t2)
    374 {
    375     int64_t  regs[NUM_REGS] = {0};
    376     int32_t  flags[NUM_FLAGS] = {0};
    377     int64_t  savedRegs[NUM_REGS] = {0};
    378     uint32_t i;
    379     uint32_t op2;
    380 
    381     for(i = 0; i < NUM_REGS; ++i)
    382     {
    383         regs[i] = i;
    384     }
    385 
    386     regs[Rd] = test.RdValue;
    387     regs[Rn] = test.RnValue;
    388     regs[Rs] = test.RsValue;
    389     a64asm->reset();
    390     if (test.preCond.mode) {
    391         a64asm->set_condition(test.preCond.mode, test.preCond.Rcond1, test.preCond.Rcond2);
    392         regs[test.preCond.Rcond1] = test.preCond.Rcond1Value;
    393         regs[test.preCond.Rcond2] = test.preCond.Rcond2Value;
    394     }
    395     a64asm->prolog();
    396     if(test.immediate == true)
    397     {
    398         op2 = a64asm->imm(test.immValue);
    399     }
    400     else if(test.immediate == false && test.shiftAmount == 0)
    401     {
    402         op2 = Rm;
    403         regs[Rm] = (int64_t)((int32_t)(test.RmValue));
    404     }
    405     else
    406     {
    407         op2 = a64asm->reg_imm(Rm, test.shiftMode, test.shiftAmount);
    408         regs[Rm] = (int64_t)((int32_t)(test.RmValue));
    409     }
    410     switch(test.op)
    411     {
    412     case INSTR_ADD: a64asm->ADD(test.cond, test.setFlags, Rd,Rn,op2); break;
    413     case INSTR_SUB: a64asm->SUB(test.cond, test.setFlags, Rd,Rn,op2); break;
    414     case INSTR_RSB: a64asm->RSB(test.cond, test.setFlags, Rd,Rn,op2); break;
    415     case INSTR_AND: a64asm->AND(test.cond, test.setFlags, Rd,Rn,op2); break;
    416     case INSTR_ORR: a64asm->ORR(test.cond, test.setFlags, Rd,Rn,op2); break;
    417     case INSTR_BIC: a64asm->BIC(test.cond, test.setFlags, Rd,Rn,op2); break;
    418     case INSTR_MUL: a64asm->MUL(test.cond, test.setFlags, Rd,Rm,Rs); break;
    419     case INSTR_MLA: a64asm->MLA(test.cond, test.setFlags, Rd,Rm,Rs,Rn); break;
    420     case INSTR_CMP: a64asm->CMP(test.cond, Rn,op2); break;
    421     case INSTR_MOV: a64asm->MOV(test.cond, test.setFlags,Rd,op2); break;
    422     case INSTR_MVN: a64asm->MVN(test.cond, test.setFlags,Rd,op2); break;
    423     case INSTR_SMULBB:a64asm->SMULBB(test.cond, Rd,Rm,Rs); break;
    424     case INSTR_SMULBT:a64asm->SMULBT(test.cond, Rd,Rm,Rs); break;
    425     case INSTR_SMULTB:a64asm->SMULTB(test.cond, Rd,Rm,Rs); break;
    426     case INSTR_SMULTT:a64asm->SMULTT(test.cond, Rd,Rm,Rs); break;
    427     case INSTR_SMULWB:a64asm->SMULWB(test.cond, Rd,Rm,Rs); break;
    428     case INSTR_SMULWT:a64asm->SMULWT(test.cond, Rd,Rm,Rs); break;
    429     case INSTR_SMLABB:a64asm->SMLABB(test.cond, Rd,Rm,Rs,Rn); break;
    430     case INSTR_UXTB16:a64asm->UXTB16(test.cond, Rd,Rm,test.shiftAmount); break;
    431     case INSTR_ADDR_ADD: a64asm->ADDR_ADD(test.cond, test.setFlags, Rd,Rn,op2); break;
    432     case INSTR_ADDR_SUB: a64asm->ADDR_SUB(test.cond, test.setFlags, Rd,Rn,op2); break;
    433     default: printf("Error"); return;
    434     }
    435     a64asm->epilog(0);
    436     a64asm->fix_branches();
    437     flushcache();
    438 
    439     asm_function_t asm_function = (asm_function_t)(instrMem);
    440 
    441     for(i = 0; i < NUM_REGS; ++i)
    442         savedRegs[i] = regs[i];
    443 
    444     asm_mips_test_jacket(asm_function, regs, flags);
    445 
    446     /* Check if all regs except Rd is same */
    447     for(i = 0; i < NUM_REGS; ++i)
    448     {
    449         if((i == Rd) || i == 2) continue;
    450         if(regs[i] != savedRegs[i])
    451         {
    452             printf("Test %x failed Reg(%d) tampered Expected(0x%" PRIx64 "),"
    453                    "Actual(0x%" PRIx64 ") t\n", test.id, i, savedRegs[i],
    454                    regs[i]);
    455             exit(0);
    456             return;
    457         }
    458     }
    459 
    460     if(test.checkRd == 1 && regs[Rd] != test.postRdValue)
    461     {
    462         printf("Test %x failed, Expected(%" PRIx64 "), Actual(%" PRIx64 ")\n",
    463                test.id, test.postRdValue, regs[Rd]);
    464         exit(0);
    465     }
    466     else
    467     {
    468         printf("Test %x passed\n", test.id);
    469     }
    470 }
    471 
    472 
    473 void dataTransferTest(dataTransferTest_t test, ARMAssemblerInterface *a64asm,
    474                       uint32_t Rd = R_v1, uint32_t Rn = R_t0,uint32_t Rm = R_t1)
    475 {
    476     int64_t regs[NUM_REGS] = {0};
    477     int64_t savedRegs[NUM_REGS] = {0};
    478     int32_t flags[NUM_FLAGS] = {0};
    479     uint32_t i;
    480     for(i = 0; i < NUM_REGS; ++i)
    481     {
    482         regs[i] = i;
    483     }
    484 
    485     uint32_t op2;
    486 
    487     regs[Rd] = test.RdValue;
    488     regs[Rn] = (uint64_t)(&dataMem[test.RnValue]);
    489     regs[Rm] = test.RmValue;
    490     flags[test.preFlag] = 1;
    491 
    492     if(test.setMem == true)
    493     {
    494         unsigned char *mem = (unsigned char *)&dataMem[test.memOffset];
    495         uint64_t value = test.memValue;
    496         for(int j = 0; j < 8; ++j)
    497         {
    498             mem[j] = value & 0x00FF;
    499             value >>= 8;
    500         }
    501     }
    502     a64asm->reset();
    503     a64asm->prolog();
    504     if(test.offsetType == REG_SCALE_OFFSET)
    505     {
    506         op2 = a64asm->reg_scale_pre(Rm);
    507     }
    508     else if(test.offsetType == REG_OFFSET)
    509     {
    510         op2 = a64asm->reg_pre(Rm);
    511     }
    512     else if(test.offsetType == IMM12_OFFSET && test.preIndex == true)
    513     {
    514         op2 = a64asm->immed12_pre(test.immValue, test.writeBack);
    515     }
    516     else if(test.offsetType == IMM12_OFFSET && test.postIndex == true)
    517     {
    518         op2 = a64asm->immed12_post(test.immValue);
    519     }
    520     else if(test.offsetType == IMM8_OFFSET && test.preIndex == true)
    521     {
    522         op2 = a64asm->immed8_pre(test.immValue, test.writeBack);
    523     }
    524     else if(test.offsetType == IMM8_OFFSET && test.postIndex == true)
    525     {
    526         op2 = a64asm->immed8_post(test.immValue);
    527     }
    528     else if(test.offsetType == NO_OFFSET)
    529     {
    530         op2 = a64asm->__immed12_pre(0);
    531     }
    532     else
    533     {
    534         printf("Error - Unknown offset\n"); return;
    535     }
    536 
    537     switch(test.op)
    538     {
    539     case INSTR_LDR:  a64asm->LDR(test.cond, Rd,Rn,op2); break;
    540     case INSTR_LDRB: a64asm->LDRB(test.cond, Rd,Rn,op2); break;
    541     case INSTR_LDRH: a64asm->LDRH(test.cond, Rd,Rn,op2); break;
    542     case INSTR_ADDR_LDR: a64asm->ADDR_LDR(test.cond, Rd,Rn,op2); break;
    543     case INSTR_STR:  a64asm->STR(test.cond, Rd,Rn,op2); break;
    544     case INSTR_STRB: a64asm->STRB(test.cond, Rd,Rn,op2); break;
    545     case INSTR_STRH: a64asm->STRH(test.cond, Rd,Rn,op2); break;
    546     case INSTR_ADDR_STR: a64asm->ADDR_STR(test.cond, Rd,Rn,op2); break;
    547     default: printf("Error"); return;
    548     }
    549     a64asm->epilog(0);
    550     flushcache();
    551 
    552     asm_function_t asm_function = (asm_function_t)(instrMem);
    553 
    554     for(i = 0; i < NUM_REGS; ++i)
    555         savedRegs[i] = regs[i];
    556 
    557     asm_mips_test_jacket(asm_function, regs, flags);
    558 
    559     /* Check if all regs except Rd/Rn are same */
    560     for(i = 0; i < NUM_REGS; ++i)
    561     {
    562         if(i == Rd || i == Rn || i == R_v0) continue;
    563 
    564         if(regs[i] != savedRegs[i])
    565         {
    566             printf("Test %x failed Reg(%d) tampered"
    567                    " Expected(0x%" PRIx64 "), Actual(0x%" PRIx64 ") t\n",
    568                    test.id, i, savedRegs[i], regs[i]);
    569             return;
    570         }
    571     }
    572 
    573     if((uint64_t)regs[Rd] != test.postRdValue)
    574     {
    575         printf("Test %x failed, "
    576                "Expected in Rd(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n",
    577                test.id, test.postRdValue, regs[Rd]);
    578     }
    579     else if((uint64_t)regs[Rn] != (uint64_t)(&dataMem[test.postRnValue]))
    580     {
    581         printf("Test %x failed, "
    582                "Expected in Rn(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n",
    583                test.id, test.postRnValue, regs[Rn] - (uint64_t)dataMem);
    584     }
    585     else if(test.checkMem == true)
    586     {
    587         unsigned char *addr = (unsigned char *)&dataMem[test.postMemOffset];
    588         uint64_t value;
    589         value = 0;
    590         for(uint32_t j = 0; j < test.postMemLength; ++j)
    591             value = (value << 8) | addr[test.postMemLength-j-1];
    592         if(value != test.postMemValue)
    593         {
    594             printf("Test %x failed, "
    595                    "Expected in Mem(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n",
    596                    test.id, test.postMemValue, value);
    597         }
    598         else
    599         {
    600             printf("Test %x passed\n", test.id);
    601         }
    602     }
    603     else
    604     {
    605         printf("Test %x passed\n", test.id);
    606     }
    607 }
    608 
    609 int main(void)
    610 {
    611     uint32_t i;
    612 
    613     /* Allocate memory to store instructions generated by ArmToArm64Assembler */
    614     {
    615         int fd = ashmem_create_region("code cache", instrMemSize);
    616         if(fd < 0) {
    617             printf("IF < 0\n");
    618             printf("Creating code cache, ashmem_create_region "
    619                                 "failed with error '%s'", strerror(errno));
    620         }
    621         instrMem = mmap(NULL, instrMemSize,
    622                                     PROT_READ | PROT_WRITE | PROT_EXEC,
    623                                 MAP_PRIVATE, fd, 0);
    624     }
    625 
    626     ArmToMips64Assembler a64asm(instrMem);
    627 
    628     if(TESTS_DATAOP_ENABLE)
    629     {
    630         printf("Running data processing tests\n");
    631         for(i = 0; i < sizeof(dataOpTests)/sizeof(dataOpTest_t); ++i) {
    632             dataOpTest(dataOpTests[i], &a64asm);
    633         }
    634     }
    635 
    636     if(TESTS_DATATRANSFER_ENABLE)
    637     {
    638         printf("Running data transfer tests\n");
    639         for(i = 0; i < sizeof(dataTransferTests)/sizeof(dataTransferTest_t); ++i)
    640             dataTransferTest(dataTransferTests[i], &a64asm);
    641     }
    642 
    643     return 0;
    644 }
    645