assembler_thumb2_test.cc revision 981e45424f52735b1c61ae0eac7e299ed313f8db
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 {
331a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain    return " -mthumb";
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(&registers_);
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
1591a28fc43ea7daa624ada9af40e30de64d4e946a8Roland Levillain}  // namespace art
160