diff options
author | Roland Levillain <rpl@google.com> | 2014-11-13 18:03:06 +0000 |
---|---|---|
committer | Roland Levillain <rpl@google.com> | 2014-11-13 18:03:06 +0000 |
commit | 1a28fc43ea7daa624ada9af40e30de64d4e946a8 (patch) | |
tree | aeb6c0aea89df5dd824e5366ad727e0557e6ebee | |
parent | 51d3fc40637fc73d4156ad617cd451b844cbb75e (diff) | |
download | art-1a28fc43ea7daa624ada9af40e30de64d4e946a8.tar.gz art-1a28fc43ea7daa624ada9af40e30de64d4e946a8.tar.bz2 art-1a28fc43ea7daa624ada9af40e30de64d4e946a8.zip |
Exercise the generation of SBFX on ARM32 & Thumb-2.
Exercise the generation of the ARM SBFX intruction in
compiler/utils/arm/assembler_arm32_test.cc (ARM
instruction set encoding) and in
compiler/utils/arm/assembler_thumb2_test.cc (Thumb
instruction set encoding).
Change-Id: Ic72683aac6dd6628e227523e352c395e1a63b52e
-rw-r--r-- | build/Android.gtest.mk | 4 | ||||
-rw-r--r-- | compiler/utils/arm/assembler_arm32_test.cc | 119 | ||||
-rw-r--r-- | compiler/utils/arm/assembler_thumb2_test.cc | 123 | ||||
-rw-r--r-- | compiler/utils/assembler_test.h | 15 |
4 files changed, 260 insertions, 1 deletions
diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk index 295135005b..a8041c5365 100644 --- a/build/Android.gtest.mk +++ b/build/Android.gtest.mk @@ -186,7 +186,9 @@ COMPILER_GTEST_TARGET_SRC_FILES := \ COMPILER_GTEST_HOST_SRC_FILES := \ $(COMPILER_GTEST_COMMON_SRC_FILES) \ - compiler/utils//assembler_thumb_test.cc \ + compiler/utils/arm/assembler_arm32_test.cc \ + compiler/utils/arm/assembler_thumb2_test.cc \ + compiler/utils/assembler_thumb_test.cc \ compiler/utils/x86/assembler_x86_test.cc \ compiler/utils/x86_64/assembler_x86_64_test.cc diff --git a/compiler/utils/arm/assembler_arm32_test.cc b/compiler/utils/arm/assembler_arm32_test.cc new file mode 100644 index 0000000000..3ba77b5e74 --- /dev/null +++ b/compiler/utils/arm/assembler_arm32_test.cc @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "assembler_arm32.h" + +#include "base/stl_util.h" +#include "utils/assembler_test.h" + +namespace art { + +class AssemblerArm32Test : public AssemblerTest<arm::Arm32Assembler, + arm::Register, + uint32_t> { + protected: + std::string GetArchitectureString() OVERRIDE { + return "arm"; + } + + std::string GetDisassembleParameters() OVERRIDE { + return " -D -bbinary -marm --no-show-raw-insn"; + } + + void SetUpHelpers() OVERRIDE { + if (registers_.size() == 0) { + registers_.insert(end(registers_), + { // NOLINT(whitespace/braces) + new arm::Register(arm::R0), + new arm::Register(arm::R1), + new arm::Register(arm::R2), + new arm::Register(arm::R3), + new arm::Register(arm::R4), + new arm::Register(arm::R5), + new arm::Register(arm::R6), + new arm::Register(arm::R7), + new arm::Register(arm::R8), + new arm::Register(arm::R9), + new arm::Register(arm::R10), + new arm::Register(arm::R11), + new arm::Register(arm::R12), + new arm::Register(arm::R13), + new arm::Register(arm::R14), + new arm::Register(arm::R15) + }); + } + } + + void TearDown() OVERRIDE { + AssemblerTest::TearDown(); + STLDeleteElements(®isters_); + } + + std::vector<arm::Register*> GetRegisters() OVERRIDE { + return registers_; + } + + uint32_t CreateImmediate(int64_t imm_value) OVERRIDE { + return imm_value; + } + + private: + std::vector<arm::Register*> registers_; +}; + + +TEST_F(AssemblerArm32Test, Toolchain) { + EXPECT_TRUE(CheckTools()); +} + + +TEST_F(AssemblerArm32Test, Sbfx) { + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 1); + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 8); + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 16); + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 32); + + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 1); + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 8); + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 16); + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 24); + + GetAssembler()->sbfx(arm::R0, arm::R1, 16, 1); + GetAssembler()->sbfx(arm::R0, arm::R1, 16, 8); + GetAssembler()->sbfx(arm::R0, arm::R1, 16, 16); + + GetAssembler()->sbfx(arm::R0, arm::R1, 31, 1); + + const char* expected = + "sbfx r0, r1, #0, #1\n" + "sbfx r0, r1, #0, #8\n" + "sbfx r0, r1, #0, #16\n" + "sbfx r0, r1, #0, #32\n" + + "sbfx r0, r1, #8, #1\n" + "sbfx r0, r1, #8, #8\n" + "sbfx r0, r1, #8, #16\n" + "sbfx r0, r1, #8, #24\n" + + "sbfx r0, r1, #16, #1\n" + "sbfx r0, r1, #16, #8\n" + "sbfx r0, r1, #16, #16\n" + + "sbfx r0, r1, #31, #1\n"; + DriverStr(expected, "sbfx"); +} + +} // namespace art diff --git a/compiler/utils/arm/assembler_thumb2_test.cc b/compiler/utils/arm/assembler_thumb2_test.cc new file mode 100644 index 0000000000..3d9c70d734 --- /dev/null +++ b/compiler/utils/arm/assembler_thumb2_test.cc @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "assembler_thumb2.h" + +#include "base/stl_util.h" +#include "utils/assembler_test.h" + +namespace art { + +class AssemblerThumb2Test : public AssemblerTest<arm::Thumb2Assembler, + arm::Register, + uint32_t> { + protected: + std::string GetArchitectureString() OVERRIDE { + return "arm"; + } + + std::string GetAssemblerParameters() OVERRIDE { + return " -mthumb"; + } + + std::string GetDisassembleParameters() OVERRIDE { + return " -D -bbinary -marm --no-show-raw-insn"; + } + + void SetUpHelpers() OVERRIDE { + if (registers_.size() == 0) { + registers_.insert(end(registers_), + { // NOLINT(whitespace/braces) + new arm::Register(arm::R0), + new arm::Register(arm::R1), + new arm::Register(arm::R2), + new arm::Register(arm::R3), + new arm::Register(arm::R4), + new arm::Register(arm::R5), + new arm::Register(arm::R6), + new arm::Register(arm::R7), + new arm::Register(arm::R8), + new arm::Register(arm::R9), + new arm::Register(arm::R10), + new arm::Register(arm::R11), + new arm::Register(arm::R12), + new arm::Register(arm::R13), + new arm::Register(arm::R14), + new arm::Register(arm::R15) + }); + } + } + + void TearDown() OVERRIDE { + AssemblerTest::TearDown(); + STLDeleteElements(®isters_); + } + + std::vector<arm::Register*> GetRegisters() OVERRIDE { + return registers_; + } + + uint32_t CreateImmediate(int64_t imm_value) OVERRIDE { + return imm_value; + } + + private: + std::vector<arm::Register*> registers_; +}; + + +TEST_F(AssemblerThumb2Test, Toolchain) { + EXPECT_TRUE(CheckTools()); +} + + +TEST_F(AssemblerThumb2Test, Sbfx) { + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 1); + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 8); + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 16); + GetAssembler()->sbfx(arm::R0, arm::R1, 0, 32); + + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 1); + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 8); + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 16); + GetAssembler()->sbfx(arm::R0, arm::R1, 8, 24); + + GetAssembler()->sbfx(arm::R0, arm::R1, 16, 1); + GetAssembler()->sbfx(arm::R0, arm::R1, 16, 8); + GetAssembler()->sbfx(arm::R0, arm::R1, 16, 16); + + GetAssembler()->sbfx(arm::R0, arm::R1, 31, 1); + + const char* expected = + "sbfx r0, r1, #0, #1\n" + "sbfx r0, r1, #0, #8\n" + "sbfx r0, r1, #0, #16\n" + "sbfx r0, r1, #0, #32\n" + + "sbfx r0, r1, #8, #1\n" + "sbfx r0, r1, #8, #8\n" + "sbfx r0, r1, #8, #16\n" + "sbfx r0, r1, #8, #24\n" + + "sbfx r0, r1, #16, #1\n" + "sbfx r0, r1, #16, #8\n" + "sbfx r0, r1, #16, #16\n" + + "sbfx r0, r1, #31, #1\n"; + DriverStr(expected, "sbfx"); +} + +} // namespace art diff --git a/compiler/utils/assembler_test.h b/compiler/utils/assembler_test.h index 91237ae910..0378176afd 100644 --- a/compiler/utils/assembler_test.h +++ b/compiler/utils/assembler_test.h @@ -394,10 +394,19 @@ class AssemblerTest : public testing::Test { std::vector<std::string> args; + // Encaspulate the whole command line in a single string passed to + // the shell, so that GetAssemblerCommand() may contain arguments + // in addition to the program name. args.push_back(GetAssemblerCommand()); args.push_back("-o"); args.push_back(to_file); args.push_back(from_file); + std::string cmd = Join(args, ' '); + + args.clear(); + args.push_back("/bin/sh"); + args.push_back("-c"); + args.push_back(cmd); return Exec(args, error_msg); } @@ -414,6 +423,9 @@ class AssemblerTest : public testing::Test { std::string error_msg; std::vector<std::string> args; + // Encaspulate the whole command line in a single string passed to + // the shell, so that GetObjdumpCommand() may contain arguments + // in addition to the program name. args.push_back(GetObjdumpCommand()); args.push_back(file); args.push_back(">"); @@ -490,6 +502,9 @@ class AssemblerTest : public testing::Test { bool DisassembleBinary(std::string file, std::string* error_msg) { std::vector<std::string> args; + // Encaspulate the whole command line in a single string passed to + // the shell, so that GetDisassembleCommand() may contain arguments + // in addition to the program name. args.push_back(GetDisassembleCommand()); args.push_back(file); args.push_back("| sed -n \'/<.data>/,$p\' | sed -e \'s/.*://\'"); |