assembler_thumb2_test.cc revision ddb7df25af45d7cd19ed1138e537973735cc78a5
11a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain/* 21a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * Copyright (C) 2014 The Android Open Source Project 31a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * 41a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * Licensed under the Apache License, Version 2.0 (the "License"); 51a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * you may not use this file except in compliance with the License. 61a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * You may obtain a copy of the License at 71a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * 81a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * http://www.apache.org/licenses/LICENSE-2.0 91a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * 101a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * Unless required by applicable law or agreed to in writing, software 111a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * distributed under the License is distributed on an "AS IS" BASIS, 121a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * See the License for the specific language governing permissions and 141a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain * limitations under the License. 151a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain */ 161a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 171a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain#include "assembler_thumb2.h" 181a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 191a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain#include "base/stl_util.h" 201a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain#include "utils/assembler_test.h" 211a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 221a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillainnamespace art { 231a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 241a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillainclass AssemblerThumb2Test : public AssemblerTest<arm::Thumb2Assembler, 25851df20225593b10e698a760ac3cd5243620700bAndreas Gampe arm::Register, arm::SRegister, 26851df20225593b10e698a760ac3cd5243620700bAndreas Gampe uint32_t> { 271a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain protected: 281a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain std::string GetArchitectureString() OVERRIDE { 291a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain return "arm"; 301a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 311a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 321a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain std::string GetAssemblerParameters() OVERRIDE { 33ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle return " -mthumb -mfpu=neon"; 341a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 351a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 361a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain std::string GetDisassembleParameters() OVERRIDE { 371a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain return " -D -bbinary -marm --no-show-raw-insn"; 381a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 391a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 401a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain void SetUpHelpers() OVERRIDE { 411a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain if (registers_.size() == 0) { 421a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain registers_.insert(end(registers_), 431a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain { // NOLINT(whitespace/braces) 441a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R0), 451a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R1), 461a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R2), 471a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R3), 481a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R4), 491a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R5), 501a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R6), 511a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R7), 521a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R8), 531a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R9), 541a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R10), 551a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R11), 561a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R12), 571a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R13), 581a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R14), 591a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain new arm::Register(arm::R15) 601a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain }); 611a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 621a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 631a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 641a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain void TearDown() OVERRIDE { 651a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain AssemblerTest::TearDown(); 661a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain STLDeleteElements(®isters_); 671a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 681a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 691a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain std::vector<arm::Register*> GetRegisters() OVERRIDE { 701a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain return registers_; 711a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 721a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 731a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain uint32_t CreateImmediate(int64_t imm_value) OVERRIDE { 741a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain return imm_value; 751a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain } 761a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 771a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain private: 781a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain std::vector<arm::Register*> registers_; 791a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain}; 801a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 811a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 821a28fc43ea7daa624ada9af40e30de64d4e946a8Roland LevillainTEST_F(AssemblerThumb2Test, Toolchain) { 831a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain EXPECT_TRUE(CheckTools()); 841a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain} 851a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 861a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 871a28fc43ea7daa624ada9af40e30de64d4e946a8Roland LevillainTEST_F(AssemblerThumb2Test, Sbfx) { 881a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 0, 1); 891a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 0, 8); 901a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 0, 16); 911a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 0, 32); 921a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 931a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 8, 1); 941a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 8, 8); 951a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 8, 16); 961a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 8, 24); 971a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 981a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 16, 1); 991a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 16, 8); 1001a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 16, 16); 1011a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 1021a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain GetAssembler()->sbfx(arm::R0, arm::R1, 31, 1); 1031a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 1041a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain const char* expected = 1051a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #0, #1\n" 1061a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #0, #8\n" 1071a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #0, #16\n" 1081a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #0, #32\n" 1091a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 1101a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #8, #1\n" 1111a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #8, #8\n" 1121a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #8, #16\n" 1131a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #8, #24\n" 1141a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 1151a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #16, #1\n" 1161a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #16, #8\n" 1171a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #16, #16\n" 1181a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 1191a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain "sbfx r0, r1, #31, #1\n"; 1201a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain DriverStr(expected, "sbfx"); 1211a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain} 1221a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain 123981e45424f52735b1c61ae0eac7e299ed313f8dbRoland LevillainTEST_F(AssemblerThumb2Test, Ubfx) { 124981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 0, 1); 125981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 0, 8); 126981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 0, 16); 127981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 0, 32); 128981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 129981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 8, 1); 130981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 8, 8); 131981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 8, 16); 132981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 8, 24); 133981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 134981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 16, 1); 135981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 16, 8); 136981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 16, 16); 137981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 138981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain GetAssembler()->ubfx(arm::R0, arm::R1, 31, 1); 139981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 140981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain const char* expected = 141981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #0, #1\n" 142981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #0, #8\n" 143981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #0, #16\n" 144981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #0, #32\n" 145981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 146981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #8, #1\n" 147981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #8, #8\n" 148981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #8, #16\n" 149981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #8, #24\n" 150981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 151981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #16, #1\n" 152981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #16, #8\n" 153981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #16, #16\n" 154981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 155981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain "ubfx r0, r1, #31, #1\n"; 156981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain DriverStr(expected, "ubfx"); 157981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain} 158981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain 159ddb7df25af45d7cd19ed1138e537973735cc78a5Calin JuravleTEST_F(AssemblerThumb2Test, Vmstat) { 160ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle GetAssembler()->vmstat(); 161ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 162ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle const char* expected = "vmrs APSR_nzcv, FPSCR\n"; 163ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 164ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle DriverStr(expected, "vmrs"); 165ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 166ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1671a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain} // namespace art 168