165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison/*
265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * Copyright (C) 2014 The Android Open Source Project
365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *
465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * Licensed under the Apache License, Version 2.0 (the "License");
565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * you may not use this file except in compliance with the License.
665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * You may obtain a copy of the License at
765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *
865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *      http://www.apache.org/licenses/LICENSE-2.0
965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *
1065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * Unless required by applicable law or agreed to in writing, software
1165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * distributed under the License is distributed on an "AS IS" BASIS,
1265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * See the License for the specific language governing permissions and
1465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * limitations under the License.
1565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison */
1665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray#include <dirent.h>
18fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe#include <errno.h>
1965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include <fstream>
2096f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray#include <map>
21fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe#include <string.h>
22fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe#include <sys/types.h>
2365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
2465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "gtest/gtest.h"
2565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "utils/arm/assembler_thumb2.h"
2665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "base/hex_dump.h"
2765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "common_runtime_test.h"
2865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
2965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonnamespace art {
3065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonnamespace arm {
3165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
3265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison// Include results file (generated manually)
3365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "assembler_thumb_test_expected.cc.inc"
3465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
35c60e1b755c5632dfeb04c333489ede52ee5c945fAndreas Gampe#ifndef __ANDROID__
3645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// This controls whether the results are printed to the
3745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// screen or compared against the expected output.
3845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// To generate new expected output, set this to true and
3945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// copy the output into the .cc.inc file in the form
4045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// of the other results.
4145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison//
4245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// When this is false, the results are not printed to the
4345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// output, but are compared against the expected results
4445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison// in the .cc.inc file.
4565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonstatic constexpr bool kPrintResults = false;
46d20ddb22891f083b762a81eb64ec391e0f60b43aDave Allison#endif
4765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
4865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonvoid SetAndroidData() {
4965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  const char* data = getenv("ANDROID_DATA");
5065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  if (data == nullptr) {
5165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    setenv("ANDROID_DATA", "/tmp", 1);
5265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
5365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
5465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
5545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allisonint CompareIgnoringSpace(const char* s1, const char* s2) {
5645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  while (*s1 != '\0') {
5745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison    while (isspace(*s1)) ++s1;
5845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison    while (isspace(*s2)) ++s2;
5945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison    if (*s1 == '\0' || *s1 != *s2) {
6045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison      break;
6145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison    }
6245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison    ++s1;
6345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison    ++s2;
6445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  }
6545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  return *s1 - *s2;
6645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison}
6745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
68cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Markovoid InitResults() {
69cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  if (test_results.empty()) {
70cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko    setup_results();
71cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  }
72cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko}
73cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
74cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Markostd::string GetToolsDir() {
75c60e1b755c5632dfeb04c333489ede52ee5c945fAndreas Gampe#ifndef __ANDROID__
76cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  // This will only work on the host.  There is no as, objcopy or objdump on the device.
7765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  static std::string toolsdir;
7865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
79cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  if (toolsdir.empty()) {
8065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    setup_results();
813e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky    toolsdir = CommonRuntimeTest::GetAndroidTargetToolsDir(kThumb2);
8265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    SetAndroidData();
8365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
8465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
85cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  return toolsdir;
86cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko#else
87cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  return std::string();
88cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko#endif
89cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko}
90cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
91cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Markovoid DumpAndCheck(std::vector<uint8_t>& code, const char* testname, const char* const* results) {
92c60e1b755c5632dfeb04c333489ede52ee5c945fAndreas Gampe#ifndef __ANDROID__
93cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  static std::string toolsdir = GetToolsDir();
94cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
9565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  ScratchFile file;
9665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
9765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  const char* filename = file.GetFilename().c_str();
9865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
9965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  std::ofstream out(filename);
10065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  if (out) {
10165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".section \".text\"\n";
10265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".syntax unified\n";
10365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".arch armv7-a\n";
10465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".thumb\n";
10565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".thumb_func\n";
10665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".type " << testname << ", #function\n";
10765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".global " << testname << "\n";
10865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << testname << ":\n";
10965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".fnstart\n";
11065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
11165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    for (uint32_t i = 0 ; i < code.size(); ++i) {
11265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison      out << ".byte " << (static_cast<int>(code[i]) & 0xff) << "\n";
11365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    }
11465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".fnend\n";
11565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    out << ".size " << testname << ", .-" << testname << "\n";
11665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
11765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  out.close();
11865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1194470c1d5a94ebedd8e579a212eb4c60da1ae6b24Andreas Gampe  char cmd[1024];
12065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
12165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Assemble the .S
1223e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky  snprintf(cmd, sizeof(cmd), "%sas %s -o %s.o", toolsdir.c_str(), filename, filename);
123fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe  int cmd_result = system(cmd);
124fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe  ASSERT_EQ(cmd_result, 0) << strerror(errno);
12565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
12665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Remove the $d symbols to prevent the disassembler dumping the instructions
12765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // as .word
1283e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky  snprintf(cmd, sizeof(cmd), "%sobjcopy -N '$d' %s.o %s.oo", toolsdir.c_str(), filename, filename);
129fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe  int cmd_result2 = system(cmd);
130fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe  ASSERT_EQ(cmd_result2, 0) << strerror(errno);
13165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
13265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Disassemble.
13365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1343e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky  snprintf(cmd, sizeof(cmd), "%sobjdump -d %s.oo | grep '^  *[0-9a-f][0-9a-f]*:'",
1353e52aa4d406fe802dabee2a2e7ba8764cc13aaaaDavid Srbecky    toolsdir.c_str(), filename);
13665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  if (kPrintResults) {
13765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    // Print the results only, don't check. This is used to generate new output for inserting
138f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko    // into the .inc file, so let's add the appropriate prefix/suffix needed in the C++ code.
139f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko    strcat(cmd, " | sed '-es/^/  \"/' | sed '-es/$/\\\\n\",/'");
140fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe    int cmd_result3 = system(cmd);
141fd11470897ea356e5870280e4ab38a18dc83b48fAndreas Gampe    ASSERT_EQ(cmd_result3, 0) << strerror(errno);
14265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  } else {
14365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    // Check the results match the appropriate results in the .inc file.
14465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    FILE *fp = popen(cmd, "r");
14565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    ASSERT_TRUE(fp != nullptr);
14665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
14765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    uint32_t lineindex = 0;
14865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
14965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    while (!feof(fp)) {
15065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison      char testline[256];
15165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison      char *s = fgets(testline, sizeof(testline), fp);
15265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison      if (s == nullptr) {
15365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison        break;
15465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison      }
155cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko      if (CompareIgnoringSpace(results[lineindex], testline) != 0) {
15645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison        LOG(FATAL) << "Output is not as expected at line: " << lineindex
157cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko          << results[lineindex] << "/" << testline;
15845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison      }
15965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison      ++lineindex;
16065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    }
16165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    // Check that we are at the end.
162cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko    ASSERT_TRUE(results[lineindex] == nullptr);
16365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    fclose(fp);
16465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
16565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
16665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  char buf[FILENAME_MAX];
16765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  snprintf(buf, sizeof(buf), "%s.o", filename);
16865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  unlink(buf);
16965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
17065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  snprintf(buf, sizeof(buf), "%s.oo", filename);
17165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  unlink(buf);
17265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#endif
17365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
17465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
17565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#define __ assembler->
17665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
177cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Markovoid EmitAndCheck(arm::Thumb2Assembler* assembler, const char* testname,
178cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko                  const char* const* results) {
179cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  __ FinalizeCode();
180cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  size_t cs = __ CodeSize();
181cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  std::vector<uint8_t> managed_code(cs);
182cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  MemoryRegion code(&managed_code[0], managed_code.size());
183cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  __ FinalizeInstructions(code);
184cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
185cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  DumpAndCheck(managed_code, testname, results);
186cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko}
187cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
188cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Markovoid EmitAndCheck(arm::Thumb2Assembler* assembler, const char* testname) {
189cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  InitResults();
190cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  std::map<std::string, const char* const*>::iterator results = test_results.find(testname);
191cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  ASSERT_NE(results, test_results.end());
192cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
193cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(assembler, testname, results->second);
194cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko}
195cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
196cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko#undef __
197cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
198d1ee80948144526b985afb44a0574248cf7da58aVladimir Markoclass Thumb2AssemblerTest : public ::testing::Test {
199d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko public:
200d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko  Thumb2AssemblerTest() : pool(), arena(&pool), assembler(&arena) { }
201cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko
202d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko  ArenaPool pool;
203d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko  ArenaAllocator arena;
204cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  arm::Thumb2Assembler assembler;
205d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko};
206d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko
207d1ee80948144526b985afb44a0574248cf7da58aVladimir Marko#define __ assembler.
20865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
209d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, SimpleMov) {
21073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R0, ShifterOperand(R1));
21165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(R1));
21265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R8, ShifterOperand(R9));
21365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
21465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(1));
21565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R8, ShifterOperand(9));
21665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
217cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "SimpleMov");
21865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
21965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
220d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, SimpleMov32) {
221cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  __ Force32Bit();
22265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
22365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(R1));
22465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R8, ShifterOperand(R9));
22565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
226cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "SimpleMov32");
22765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
22865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
229d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, SimpleMovAdd) {
23065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(R1));
23173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adds(R0, R1, ShifterOperand(R2));
23273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R0, R1, ShifterOperand(0));
23365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
234cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "SimpleMovAdd");
23565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
23665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
237d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, DataProcessingRegister) {
23873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32 bit variants using low registers.
23973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mvn(R0, ShifterOperand(R1), AL, kCcKeep);
24073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sub(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ and_(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ orr(R0, R1, ShifterOperand(R2), AL, kCcKeep);
244d2b4ca2d02c86b1ce1826fd2b35ce6c9c58c1ff1Vladimir Marko  __ orn(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ eor(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ bic(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adc(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sbc(R0, R1, ShifterOperand(R2), AL, kCcKeep);
24973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsb(R0, R1, ShifterOperand(R2), AL, kCcKeep);
25073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ teq(R0, ShifterOperand(R1));
25173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
25273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16 bit variants using low registers.
25373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R0, ShifterOperand(R1));
25473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R0, ShifterOperand(R1), AL, kCcKeep);
25573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mvns(R0, ShifterOperand(R1));
25673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R0, R0, ShifterOperand(R1), AL, kCcKeep);
25773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adds(R0, R1, ShifterOperand(R2));
25873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ subs(R0, R1, ShifterOperand(R2));
25973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adcs(R0, R0, ShifterOperand(R1));
26073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sbcs(R0, R0, ShifterOperand(R1));
26173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ ands(R0, R0, ShifterOperand(R1));
26273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ orrs(R0, R0, ShifterOperand(R1));
26373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ eors(R0, R0, ShifterOperand(R1));
26473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ bics(R0, R0, ShifterOperand(R1));
26573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ tst(R0, ShifterOperand(R1));
26673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ cmp(R0, ShifterOperand(R1));
26773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ cmn(R0, ShifterOperand(R1));
26873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
26973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16-bit variants using high registers.
27073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R1, ShifterOperand(R8), AL, kCcKeep);
27173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R9, ShifterOperand(R0), AL, kCcKeep);
27273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R8, ShifterOperand(R9), AL, kCcKeep);
27373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R1, R1, ShifterOperand(R8), AL, kCcKeep);
27473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R9, R9, ShifterOperand(R0), AL, kCcKeep);
27573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R8, R8, ShifterOperand(R9), AL, kCcKeep);
27673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ cmp(R0, ShifterOperand(R9));
27773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ cmp(R8, ShifterOperand(R1));
27873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ cmp(R9, ShifterOperand(R8));
27973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
28073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // The 16-bit RSBS Rd, Rn, #0, also known as NEGS Rd, Rn is specified using
28173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // an immediate (0) but emitted without any, so we test it here.
28273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsbs(R0, R1, ShifterOperand(0));
28373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsbs(R0, R0, ShifterOperand(0));  // Check Rd == Rn code path.
28473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
28573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32 bit variants using high registers that would be 16-bit if using low registers.
28673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R0, ShifterOperand(R8));
28773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mvns(R0, ShifterOperand(R8));
28873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R0, R1, ShifterOperand(R8), AL, kCcKeep);
28973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adds(R0, R1, ShifterOperand(R8));
29073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ subs(R0, R1, ShifterOperand(R8));
29173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adcs(R0, R0, ShifterOperand(R8));
29273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sbcs(R0, R0, ShifterOperand(R8));
29373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ ands(R0, R0, ShifterOperand(R8));
29473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ orrs(R0, R0, ShifterOperand(R8));
29573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ eors(R0, R0, ShifterOperand(R8));
29673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ bics(R0, R0, ShifterOperand(R8));
29773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ tst(R0, ShifterOperand(R8));
29873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ cmn(R0, ShifterOperand(R8));
29973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsbs(R0, R8, ShifterOperand(0));  // Check that this is not emitted as 16-bit.
30073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsbs(R8, R8, ShifterOperand(0));  // Check that this is not emitted as 16-bit (Rd == Rn).
30173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
30273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32-bit variants of instructions that would be 16-bit outside IT block.
30373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
30473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mvns(R0, ShifterOperand(R1), arm::EQ);
30573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
30673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adds(R0, R1, ShifterOperand(R2), arm::EQ);
30773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
30873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ subs(R0, R1, ShifterOperand(R2), arm::EQ);
30973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
31073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adcs(R0, R0, ShifterOperand(R1), arm::EQ);
31173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
31273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sbcs(R0, R0, ShifterOperand(R1), arm::EQ);
31373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
31473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ ands(R0, R0, ShifterOperand(R1), arm::EQ);
31573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
31673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ orrs(R0, R0, ShifterOperand(R1), arm::EQ);
31773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
31873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ eors(R0, R0, ShifterOperand(R1), arm::EQ);
31973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
32073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ bics(R0, R0, ShifterOperand(R1), arm::EQ);
32173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
32273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16-bit variants of instructions that would be 32-bit outside IT block.
32373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
32473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mvn(R0, ShifterOperand(R1), arm::EQ, kCcKeep);
32573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
32673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R0, R1, ShifterOperand(R2), arm::EQ, kCcKeep);
32773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
32873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sub(R0, R1, ShifterOperand(R2), arm::EQ, kCcKeep);
32973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
33073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adc(R0, R0, ShifterOperand(R1), arm::EQ, kCcKeep);
33173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
33273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sbc(R0, R0, ShifterOperand(R1), arm::EQ, kCcKeep);
33373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
33473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ and_(R0, R0, ShifterOperand(R1), arm::EQ, kCcKeep);
33573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
33673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ orr(R0, R0, ShifterOperand(R1), arm::EQ, kCcKeep);
33773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
33873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ eor(R0, R0, ShifterOperand(R1), arm::EQ, kCcKeep);
33973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ it(arm::EQ);
34073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ bic(R0, R0, ShifterOperand(R1), arm::EQ, kCcKeep);
34173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
34273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16 bit variants selected for the default kCcDontCare.
34365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(R1));
34465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mvn(R0, ShifterOperand(R1));
34573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R0, R0, ShifterOperand(R1));
34665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R0, R1, ShifterOperand(R2));
34765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sub(R0, R1, ShifterOperand(R2));
34873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adc(R0, R0, ShifterOperand(R1));
34973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ sbc(R0, R0, ShifterOperand(R1));
3507b7e524c86a67f7357bbcfd0e7bde07ded50cca2Andreas Gampe  __ and_(R0, R0, ShifterOperand(R1));
3517b7e524c86a67f7357bbcfd0e7bde07ded50cca2Andreas Gampe  __ orr(R0, R0, ShifterOperand(R1));
3527b7e524c86a67f7357bbcfd0e7bde07ded50cca2Andreas Gampe  __ eor(R0, R0, ShifterOperand(R1));
3537b7e524c86a67f7357bbcfd0e7bde07ded50cca2Andreas Gampe  __ bic(R0, R0, ShifterOperand(R1));
35473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R1, ShifterOperand(R8));
35573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R9, ShifterOperand(R0));
35673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R8, ShifterOperand(R9));
35773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R1, R1, ShifterOperand(R8));
35873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R9, R9, ShifterOperand(R0));
35973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R8, R8, ShifterOperand(R9));
36073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsb(R0, R1, ShifterOperand(0));
36173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ rsb(R0, R0, ShifterOperand(0));
36265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
36373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // And an arbitrary 32-bit instruction using IP.
36473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ add(R12, R1, ShifterOperand(R0), AL, kCcKeep);
3653c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray
366cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "DataProcessingRegister");
36765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
36865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
369d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, DataProcessingImmediate) {
37065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x55));
37165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mvn(R0, ShifterOperand(0x55));
37265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R0, R1, ShifterOperand(0x55));
37365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sub(R0, R1, ShifterOperand(0x55));
37465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ and_(R0, R1, ShifterOperand(0x55));
37565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ orr(R0, R1, ShifterOperand(0x55));
376d2b4ca2d02c86b1ce1826fd2b35ce6c9c58c1ff1Vladimir Marko  __ orn(R0, R1, ShifterOperand(0x55));
37765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ eor(R0, R1, ShifterOperand(0x55));
37865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ bic(R0, R1, ShifterOperand(0x55));
37965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ adc(R0, R1, ShifterOperand(0x55));
38065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sbc(R0, R1, ShifterOperand(0x55));
38165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ rsb(R0, R1, ShifterOperand(0x55));
38265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
38365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ tst(R0, ShifterOperand(0x55));
38465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ teq(R0, ShifterOperand(0x55));
38565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cmp(R0, ShifterOperand(0x55));
38665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cmn(R0, ShifterOperand(0x55));
38765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
38865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R0, R1, ShifterOperand(5));
38965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sub(R0, R1, ShifterOperand(5));
39065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
39165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ movs(R0, ShifterOperand(0x55));
39265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mvns(R0, ShifterOperand(0x55));
39365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
39473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ adds(R0, R1, ShifterOperand(5));
39573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ subs(R0, R1, ShifterOperand(5));
39673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
397cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "DataProcessingImmediate");
39865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
39965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
400d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, DataProcessingModifiedImmediate) {
40165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x550055));
40265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mvn(R0, ShifterOperand(0x550055));
40365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R0, R1, ShifterOperand(0x550055));
40465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sub(R0, R1, ShifterOperand(0x550055));
40565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ and_(R0, R1, ShifterOperand(0x550055));
40665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ orr(R0, R1, ShifterOperand(0x550055));
407d2b4ca2d02c86b1ce1826fd2b35ce6c9c58c1ff1Vladimir Marko  __ orn(R0, R1, ShifterOperand(0x550055));
40865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ eor(R0, R1, ShifterOperand(0x550055));
40965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ bic(R0, R1, ShifterOperand(0x550055));
41065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ adc(R0, R1, ShifterOperand(0x550055));
41165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sbc(R0, R1, ShifterOperand(0x550055));
41265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ rsb(R0, R1, ShifterOperand(0x550055));
41365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
41465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ tst(R0, ShifterOperand(0x550055));
41565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ teq(R0, ShifterOperand(0x550055));
41665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cmp(R0, ShifterOperand(0x550055));
41765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cmn(R0, ShifterOperand(0x550055));
41865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
419cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "DataProcessingModifiedImmediate");
42065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
42165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
42265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
423d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, DataProcessingModifiedImmediates) {
42465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x550055));
42565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x55005500));
42665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x55555555));
42765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0xd5000000));       // rotated to first position
42865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x6a000000));       // rotated to second position
42965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x350));            // rotated to 2nd last position
43065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(0x1a8));            // rotated to last position
43165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
432cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "DataProcessingModifiedImmediates");
43365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
43465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
435d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, DataProcessingShiftedRegister) {
43673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16-bit variants.
43773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R3, ShifterOperand(R4, LSL, 4));
43873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R3, ShifterOperand(R4, LSR, 5));
43973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R3, ShifterOperand(R4, ASR, 6));
44065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
44173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32-bit ROR because ROR immediate doesn't have the same 16-bit version as other shifts.
44273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R3, ShifterOperand(R4, ROR, 7));
44373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
44473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32-bit RRX because RRX has no 16-bit version.
44573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R3, ShifterOperand(R4, RRX));
44673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
44773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32 bit variants (not setting condition codes).
44873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R3, ShifterOperand(R4, LSL, 4), AL, kCcKeep);
44973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R3, ShifterOperand(R4, LSR, 5), AL, kCcKeep);
45073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R3, ShifterOperand(R4, ASR, 6), AL, kCcKeep);
45173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R3, ShifterOperand(R4, ROR, 7), AL, kCcKeep);
45273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ mov(R3, ShifterOperand(R4, RRX), AL, kCcKeep);
45373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
45473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32 bit variants (high registers).
45573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R8, ShifterOperand(R4, LSL, 4));
45673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R8, ShifterOperand(R4, LSR, 5));
45773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R8, ShifterOperand(R4, ASR, 6));
45873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R8, ShifterOperand(R4, ROR, 7));
45973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ movs(R8, ShifterOperand(R4, RRX));
46065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
461cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "DataProcessingShiftedRegister");
46265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
46365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
464d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, ShiftImmediate) {
465f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // Note: This test produces the same results as DataProcessingShiftedRegister
466f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // but it does so using shift functions instead of mov().
467f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko
468f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // 16-bit variants.
469f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Lsl(R3, R4, 4);
470f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Lsr(R3, R4, 5);
471f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Asr(R3, R4, 6);
472f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko
473f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // 32-bit ROR because ROR immediate doesn't have the same 16-bit version as other shifts.
474f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Ror(R3, R4, 7);
475f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko
476f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // 32-bit RRX because RRX has no 16-bit version.
477f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Rrx(R3, R4);
478f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko
479f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // 32 bit variants (not setting condition codes).
480f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Lsl(R3, R4, 4, AL, kCcKeep);
481f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Lsr(R3, R4, 5, AL, kCcKeep);
482f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Asr(R3, R4, 6, AL, kCcKeep);
483f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Ror(R3, R4, 7, AL, kCcKeep);
484f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Rrx(R3, R4, AL, kCcKeep);
485f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko
486f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  // 32 bit variants (high registers).
487f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Lsls(R8, R4, 4);
488f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Lsrs(R8, R4, 5);
489f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Asrs(R8, R4, 6);
490f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Rors(R8, R4, 7);
491f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  __ Rrxs(R8, R4);
492f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko
493f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko  EmitAndCheck(&assembler, "ShiftImmediate");
494f9d741e32c6f1629ce70eefc68d3363fa1cfd696Vladimir Marko}
49565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
496d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, BasicLoad) {
49765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24));
49865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24));
49965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24));
50065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24));
50165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24));
50265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
50365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(SP, 24));
50465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
50565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 32 bit variants
50665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R8, Address(R4, 24));
50765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R8, Address(R4, 24));
50865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R8, Address(R4, 24));
50965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R8, Address(R4, 24));
51065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R8, Address(R4, 24));
51165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
512cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "BasicLoad");
51365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
51465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
51565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
516d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, BasicStore) {
51765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24));
51865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24));
51965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24));
52065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
52165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(SP, 24));
52265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
52365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 32 bit variants.
52465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R8, Address(R4, 24));
52565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R8, Address(R4, 24));
52665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R8, Address(R4, 24));
52765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
528cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "BasicStore");
52965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
53065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
531d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, ComplexLoad) {
53265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24, Address::Mode::Offset));
53365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24, Address::Mode::PreIndex));
53465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24, Address::Mode::PostIndex));
53565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24, Address::Mode::NegOffset));
53665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24, Address::Mode::NegPreIndex));
53765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, 24, Address::Mode::NegPostIndex));
53865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
53965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24, Address::Mode::Offset));
54065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24, Address::Mode::PreIndex));
54165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24, Address::Mode::PostIndex));
54265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24, Address::Mode::NegOffset));
54365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24, Address::Mode::NegPreIndex));
54465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, 24, Address::Mode::NegPostIndex));
54565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
54665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24, Address::Mode::Offset));
54765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24, Address::Mode::PreIndex));
54865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24, Address::Mode::PostIndex));
54965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24, Address::Mode::NegOffset));
55065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24, Address::Mode::NegPreIndex));
55165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, 24, Address::Mode::NegPostIndex));
55265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
55365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24, Address::Mode::Offset));
55465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24, Address::Mode::PreIndex));
55565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24, Address::Mode::PostIndex));
55665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24, Address::Mode::NegOffset));
55765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24, Address::Mode::NegPreIndex));
55865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, 24, Address::Mode::NegPostIndex));
55965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
56065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24, Address::Mode::Offset));
56165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24, Address::Mode::PreIndex));
56265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24, Address::Mode::PostIndex));
56365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24, Address::Mode::NegOffset));
56465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24, Address::Mode::NegPreIndex));
56565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, 24, Address::Mode::NegPostIndex));
56665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
567cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "ComplexLoad");
56865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
56965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
57065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
571d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, ComplexStore) {
57265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24, Address::Mode::Offset));
57365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24, Address::Mode::PreIndex));
57465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24, Address::Mode::PostIndex));
57565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24, Address::Mode::NegOffset));
57665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24, Address::Mode::NegPreIndex));
57765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, 24, Address::Mode::NegPostIndex));
57865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
57965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24, Address::Mode::Offset));
58065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24, Address::Mode::PreIndex));
58165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24, Address::Mode::PostIndex));
58265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24, Address::Mode::NegOffset));
58365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24, Address::Mode::NegPreIndex));
58465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, 24, Address::Mode::NegPostIndex));
58565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
58665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24, Address::Mode::Offset));
58765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24, Address::Mode::PreIndex));
58865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24, Address::Mode::PostIndex));
58965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24, Address::Mode::NegOffset));
59065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24, Address::Mode::NegPreIndex));
59165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, 24, Address::Mode::NegPostIndex));
59265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
593cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "ComplexStore");
59465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
59565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
596d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, NegativeLoadStore) {
59765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, -24, Address::Mode::Offset));
59865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, -24, Address::Mode::PreIndex));
59965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, -24, Address::Mode::PostIndex));
60065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, -24, Address::Mode::NegOffset));
60165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, -24, Address::Mode::NegPreIndex));
60265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldr(R3, Address(R4, -24, Address::Mode::NegPostIndex));
60365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
60465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, -24, Address::Mode::Offset));
60565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, -24, Address::Mode::PreIndex));
60665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, -24, Address::Mode::PostIndex));
60765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, -24, Address::Mode::NegOffset));
60865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, -24, Address::Mode::NegPreIndex));
60965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrb(R3, Address(R4, -24, Address::Mode::NegPostIndex));
61065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
61165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, -24, Address::Mode::Offset));
61265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, -24, Address::Mode::PreIndex));
61365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, -24, Address::Mode::PostIndex));
61465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, -24, Address::Mode::NegOffset));
61565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, -24, Address::Mode::NegPreIndex));
61665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrh(R3, Address(R4, -24, Address::Mode::NegPostIndex));
61765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
61865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, -24, Address::Mode::Offset));
61965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, -24, Address::Mode::PreIndex));
62065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, -24, Address::Mode::PostIndex));
62165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, -24, Address::Mode::NegOffset));
62265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, -24, Address::Mode::NegPreIndex));
62365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsb(R3, Address(R4, -24, Address::Mode::NegPostIndex));
62465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
62565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, -24, Address::Mode::Offset));
62665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, -24, Address::Mode::PreIndex));
62765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, -24, Address::Mode::PostIndex));
62865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, -24, Address::Mode::NegOffset));
62965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, -24, Address::Mode::NegPreIndex));
63065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrsh(R3, Address(R4, -24, Address::Mode::NegPostIndex));
63165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
63265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, -24, Address::Mode::Offset));
63365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, -24, Address::Mode::PreIndex));
63465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, -24, Address::Mode::PostIndex));
63565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, -24, Address::Mode::NegOffset));
63665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, -24, Address::Mode::NegPreIndex));
63765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R3, Address(R4, -24, Address::Mode::NegPostIndex));
63865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
63965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, -24, Address::Mode::Offset));
64065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, -24, Address::Mode::PreIndex));
64165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, -24, Address::Mode::PostIndex));
64265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, -24, Address::Mode::NegOffset));
64365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, -24, Address::Mode::NegPreIndex));
64465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strb(R3, Address(R4, -24, Address::Mode::NegPostIndex));
64565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
64665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, -24, Address::Mode::Offset));
64765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, -24, Address::Mode::PreIndex));
64865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, -24, Address::Mode::PostIndex));
64965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, -24, Address::Mode::NegOffset));
65065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, -24, Address::Mode::NegPreIndex));
65165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strh(R3, Address(R4, -24, Address::Mode::NegPostIndex));
65265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
653cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "NegativeLoadStore");
65465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
65565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
656d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, SimpleLoadStoreDual) {
65765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::Offset));
65865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::Offset));
65965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
660cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "SimpleLoadStoreDual");
66165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
66265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
663d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, ComplexLoadStoreDual) {
66465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::Offset));
66565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::PreIndex));
66665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::PostIndex));
66765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::NegOffset));
66865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::NegPreIndex));
66965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, 24, Address::Mode::NegPostIndex));
67065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
67165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::Offset));
67265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::PreIndex));
67365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::PostIndex));
67465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::NegOffset));
67565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::NegPreIndex));
67665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, 24, Address::Mode::NegPostIndex));
67765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
678cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "ComplexLoadStoreDual");
67965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
68065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
681d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, NegativeLoadStoreDual) {
68265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, -24, Address::Mode::Offset));
68365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, -24, Address::Mode::PreIndex));
68465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, -24, Address::Mode::PostIndex));
68565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, -24, Address::Mode::NegOffset));
68665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, -24, Address::Mode::NegPreIndex));
68765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ strd(R2, Address(R0, -24, Address::Mode::NegPostIndex));
68865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
68965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, -24, Address::Mode::Offset));
69065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, -24, Address::Mode::PreIndex));
69165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, -24, Address::Mode::PostIndex));
69265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, -24, Address::Mode::NegOffset));
69365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, -24, Address::Mode::NegPreIndex));
69465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldrd(R2, Address(R0, -24, Address::Mode::NegPostIndex));
69565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
696cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "NegativeLoadStoreDual");
69765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
69865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
699d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, SimpleBranch) {
70065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
70165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(2));
70265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
70365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1));
70465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l1);
70565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l2;
70665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l2);
70765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(2));
70865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l2);
70965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(3));
71065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
71165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l3;
71265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(2));
71365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l3);
71465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1));
71565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l3, EQ);
71665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
71765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l4;
71865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l4, EQ);
71965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(2));
72065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l4);
72165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(3));
72265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
72365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 2 linked labels.
72465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l5;
72565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l5);
72665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(4));
72765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l5);
72865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(5));
72965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l5);
73065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(6));
73165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
732cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "SimpleBranch");
73365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
73465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
735d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, LongBranch) {
736cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  __ Force32Bit();
73765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 32 bit branches.
73865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
73965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(2));
74065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
74165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1));
74265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l1);
74365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
74465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l2;
74565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l2);
74665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(2));
74765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l2);
74865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(3));
74965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
75065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l3;
75165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(2));
75265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l3);
75365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1));
75465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l3, EQ);
75565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
75665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l4;
75765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l4, EQ);
75865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(2));
75965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l4);
76065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(3));
76165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
76265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 2 linked labels.
76365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l5;
76465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l5);
76565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(4));
76665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l5);
76765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(5));
76865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l5);
76965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R0, ShifterOperand(6));
77065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
771cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "LongBranch");
77265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
77365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
774d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, LoadMultiple) {
77565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 16 bit.
77665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldm(DB_W, R4, (1 << R0 | 1 << R3));
77765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
77865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 32 bit.
77965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldm(DB_W, R4, (1 << LR | 1 << R11));
78065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldm(DB, R4, (1 << LR | 1 << R11));
78165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
78265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Single reg is converted to ldr
78365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ ldm(DB_W, R4, (1 << R5));
78465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
785cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "LoadMultiple");
78665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
78765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
788d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, StoreMultiple) {
78965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 16 bit.
79065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ stm(IA_W, R4, (1 << R0 | 1 << R3));
79165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
79265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // 32 bit.
79365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ stm(IA_W, R4, (1 << LR | 1 << R11));
79465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ stm(IA, R4, (1 << LR | 1 << R11));
79565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
79665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Single reg is converted to str
79765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ stm(IA_W, R4, (1 << R5));
79865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ stm(IA, R4, (1 << R5));
79965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
800cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "StoreMultiple");
80165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
80265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
803d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, MovWMovT) {
804b4536b7de576b20c74c612406c5d3132998075efVladimir Marko  // Always 32 bit.
805b4536b7de576b20c74c612406c5d3132998075efVladimir Marko  __ movw(R4, 0);
806b4536b7de576b20c74c612406c5d3132998075efVladimir Marko  __ movw(R4, 0x34);
807b4536b7de576b20c74c612406c5d3132998075efVladimir Marko  __ movw(R9, 0x34);
808b4536b7de576b20c74c612406c5d3132998075efVladimir Marko  __ movw(R3, 0x1234);
809b4536b7de576b20c74c612406c5d3132998075efVladimir Marko  __ movw(R9, 0xffff);
81065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
81165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Always 32 bit.
81265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ movt(R0, 0);
81365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ movt(R0, 0x1234);
81465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ movt(R1, 0xffff);
81565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
816cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "MovWMovT");
81765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
81865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
819d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, SpecialAddSub) {
82065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R2, SP, ShifterOperand(0x50));   // 16 bit.
82165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(SP, SP, ShifterOperand(0x50));   // 16 bit.
82265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R8, SP, ShifterOperand(0x50));   // 32 bit.
82365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
82465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(R2, SP, ShifterOperand(0xf00));  // 32 bit due to imm size.
82565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ add(SP, SP, ShifterOperand(0xf00));  // 32 bit due to imm size.
8266fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ add(SP, SP, ShifterOperand(0xffc));  // 32 bit due to imm size; encoding T4.
82765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
8286fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ sub(SP, SP, ShifterOperand(0x50));   // 16 bit
8296fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ sub(R0, SP, ShifterOperand(0x50));   // 32 bit
8306fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ sub(R8, SP, ShifterOperand(0x50));   // 32 bit.
83165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
8326fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ sub(SP, SP, ShifterOperand(0xf00));  // 32 bit due to imm size
8336fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ sub(SP, SP, ShifterOperand(0xffc));  // 32 bit due to imm size; encoding T4.
83465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
835cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "SpecialAddSub");
83665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
83765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
838d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, LoadFromOffset) {
8396fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R2, R4, 12);
8406fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R2, R4, 0xfff);
8416fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R2, R4, 0x1000);
8426fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R2, R4, 0x1000a4);
8436fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R2, R4, 0x101000);
8446fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R4, R4, 0x101000);
8456fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedHalfword, R2, R4, 12);
8466fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedHalfword, R2, R4, 0xfff);
8476fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedHalfword, R2, R4, 0x1000);
8486fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedHalfword, R2, R4, 0x1000a4);
8496fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedHalfword, R2, R4, 0x101000);
8506fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedHalfword, R4, R4, 0x101000);
8516fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWordPair, R2, R4, 12);
8526fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWordPair, R2, R4, 0x3fc);
8536fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWordPair, R2, R4, 0x400);
8546fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWordPair, R2, R4, 0x400a4);
8556fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWordPair, R2, R4, 0x40400);
8566fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWordPair, R4, R4, 0x40400);
8576fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko
8586fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R0, R12, 12);  // 32-bit because of R12.
8596fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadWord, R2, R4, 0xa4 - 0x100000);
8606fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko
8616fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadSignedByte, R2, R4, 12);
8626fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadUnsignedByte, R2, R4, 12);
8636fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ LoadFromOffset(kLoadSignedHalfword, R2, R4, 12);
8646fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko
8656fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  EmitAndCheck(&assembler, "LoadFromOffset");
8666fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko}
8676fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko
868d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, StoreToOffset) {
8696fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R2, R4, 12);
8706fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R2, R4, 0xfff);
8716fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R2, R4, 0x1000);
8726fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R2, R4, 0x1000a4);
8736fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R2, R4, 0x101000);
8746fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R4, R4, 0x101000);
8756fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreHalfword, R2, R4, 12);
8766fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreHalfword, R2, R4, 0xfff);
8776fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreHalfword, R2, R4, 0x1000);
8786fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreHalfword, R2, R4, 0x1000a4);
8796fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreHalfword, R2, R4, 0x101000);
8806fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreHalfword, R4, R4, 0x101000);
8816fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWordPair, R2, R4, 12);
8826fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWordPair, R2, R4, 0x3fc);
8836fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWordPair, R2, R4, 0x400);
8846fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWordPair, R2, R4, 0x400a4);
8856fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWordPair, R2, R4, 0x40400);
8866fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWordPair, R4, R4, 0x40400);
8876fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko
8886fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R0, R12, 12);  // 32-bit because of R12.
8896fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreWord, R2, R4, 0xa4 - 0x100000);
8906fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko
8916fd0ffe8da212723a3ac0256ce350b5872cc61d4Vladimir Marko  __ StoreToOffset(kStoreByte, R2, R4, 12);
89265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
893cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "StoreToOffset");
89465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
89565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
896d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, IfThen) {
89765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ it(EQ);
89865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1), EQ);
89965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
90065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ it(EQ, kItThen);
90165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1), EQ);
90265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(2), EQ);
90365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
90465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ it(EQ, kItElse);
90565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1), EQ);
90665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(2), NE);
90765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
90865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ it(EQ, kItThen, kItElse);
90965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1), EQ);
91065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(2), EQ);
91165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R3, ShifterOperand(3), NE);
91265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
91365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ it(EQ, kItElse, kItElse);
91465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1), EQ);
91565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(2), NE);
91665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R3, ShifterOperand(3), NE);
91765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
91865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ it(EQ, kItThen, kItThen, kItElse);
91965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(1), EQ);
92065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(2), EQ);
92165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R3, ShifterOperand(3), EQ);
92265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R4, ShifterOperand(4), NE);
92365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
924cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "IfThen");
92565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
92665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
927d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, CbzCbnz) {
92865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
92965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cbz(R2, &l1);
93065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(3));
93165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(3));
93265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
93365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(4));
93465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
93565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l2;
93665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cbnz(R2, &l2);
93765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R8, ShifterOperand(3));
93865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(3));
93965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l2);
94065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R2, ShifterOperand(4));
94165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
942cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "CbzCbnz");
94365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
94465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
945d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Multiply) {
94665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mul(R0, R1, R0);
94765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mul(R0, R1, R2);
94865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mul(R8, R9, R8);
94965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mul(R8, R9, R10);
95065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
95165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mla(R0, R1, R2, R3);
95265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mla(R8, R9, R8, R9);
95365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
95465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mls(R0, R1, R2, R3);
95565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mls(R8, R9, R8, R9);
95665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
95765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ umull(R0, R1, R2, R3);
95865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ umull(R8, R9, R10, R11);
95965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
960cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Multiply");
96165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
96265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
963d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Divide) {
96465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sdiv(R0, R1, R2);
96565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ sdiv(R8, R9, R10);
96665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
96765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ udiv(R0, R1, R2);
96865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ udiv(R8, R9, R10);
96965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
970cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Divide");
97165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
97265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
973d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, VMov) {
97465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmovs(S1, 1.0);
97565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmovd(D1, 1.0);
97665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
97765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmovs(S1, S2);
97865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmovd(D1, D2);
97965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
980cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "VMov");
98165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
98265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
98365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
984d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, BasicFloatingPoint) {
98565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vadds(S0, S1, S2);
98665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vsubs(S0, S1, S2);
98765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmuls(S0, S1, S2);
98865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmlas(S0, S1, S2);
98965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmlss(S0, S1, S2);
99065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vdivs(S0, S1, S2);
99165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vabss(S0, S1);
99265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vnegs(S0, S1);
99365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vsqrts(S0, S1);
99465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
99565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vaddd(D0, D1, D2);
99665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vsubd(D0, D1, D2);
99765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmuld(D0, D1, D2);
99865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmlad(D0, D1, D2);
99965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vmlsd(D0, D1, D2);
100065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vdivd(D0, D1, D2);
100165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vabsd(D0, D1);
100265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vnegd(D0, D1);
100365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vsqrtd(D0, D1);
100465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1005cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "BasicFloatingPoint");
100665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
100765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1008d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, FloatingPointConversions) {
100965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtsd(S2, D2);
101065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtds(D2, S2);
101165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
101265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtis(S1, S2);
101365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtsi(S1, S2);
101465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
101565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtid(S1, D2);
101665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtdi(D1, S2);
101765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
101865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtus(S1, S2);
101965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtsu(S1, S2);
102065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
102165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtud(S1, D2);
102265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcvtdu(D1, S2);
102365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1024cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "FloatingPointConversions");
102565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
102665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1027d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, FloatingPointComparisons) {
102865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcmps(S0, S1);
102965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcmpd(D0, D1);
103065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
103165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcmpsz(S2);
103265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vcmpdz(D2);
103365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1034cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "FloatingPointComparisons");
103565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
103665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1037d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Calls) {
103865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ blx(LR);
103965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ bx(LR);
104065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1041cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Calls");
104265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
104365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1044d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Breakpoint) {
104565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ bkpt(0);
104665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1047cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Breakpoint");
104865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
104965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1050d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, StrR1) {
105165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R1, Address(SP, 68));
105265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ str(R1, Address(SP, 1068));
105365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1054cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "StrR1");
105565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
105665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1057d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, VPushPop) {
105865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vpushs(S2, 4);
105965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vpushd(D2, 4);
106065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
106165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vpops(S2, 4);
106265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ vpopd(D2, 4);
106365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1064cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "VPushPop");
106565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
106665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1067d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Max16BitBranch) {
106865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
106965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l1);
107065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  for (int i = 0 ; i < (1 << 11) ; i += 2) {
107165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    __ mov(R3, ShifterOperand(i & 0xff));
107265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
107365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
107465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(R2));
107565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1076cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Max16BitBranch");
107765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
107865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1079d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Branch32) {
108065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
108165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l1);
108265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  for (int i = 0 ; i < (1 << 11) + 2 ; i += 2) {
108365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    __ mov(R3, ShifterOperand(i & 0xff));
108465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
108565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
108665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(R2));
108765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1088cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Branch32");
108965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
109065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1091d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, CompareAndBranchMax) {
109265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
109365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cbz(R4, &l1);
109465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  for (int i = 0 ; i < (1 << 7) ; i += 2) {
109565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    __ mov(R3, ShifterOperand(i & 0xff));
109665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
109765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
109865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(R2));
109965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1100cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "CompareAndBranchMax");
110165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
110265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1103d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, CompareAndBranchRelocation16) {
110465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
110565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cbz(R4, &l1);
110665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  for (int i = 0 ; i < (1 << 7) + 2 ; i += 2) {
110765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    __ mov(R3, ShifterOperand(i & 0xff));
110865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
110965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
111065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(R2));
111165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1112cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "CompareAndBranchRelocation16");
111365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
111465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1115d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, CompareAndBranchRelocation32) {
111665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
111765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ cbz(R4, &l1);
111865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  for (int i = 0 ; i < (1 << 11) + 2 ; i += 2) {
111965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    __ mov(R3, ShifterOperand(i & 0xff));
112065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
112165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
112265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(R2));
112365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1124cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "CompareAndBranchRelocation32");
112565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
112665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1127d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, MixedBranch32) {
112865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l1;
112965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Label l2;
113065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l1);      // Forwards.
113165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l2);
113265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
113365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Space to force relocation.
113465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  for (int i = 0 ; i < (1 << 11) + 2 ; i += 2) {
113565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    __ mov(R3, ShifterOperand(i & 0xff));
113665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
113765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ b(&l2);      // Backwards.
113865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ Bind(&l1);
113965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  __ mov(R1, ShifterOperand(R2));
114065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1141cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "MixedBranch32");
114265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}
114365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1144d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, Shifts) {
114573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16 bit selected for CcDontCare.
114645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsl(R0, R1, 5);
114745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsr(R0, R1, 5);
114845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Asr(R0, R1, 5);
114945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
115045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsl(R0, R0, R1);
115145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsr(R0, R0, R1);
115245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Asr(R0, R0, R1);
115373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Ror(R0, R0, R1);
115473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
115573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 16 bit with kCcSet.
115673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsls(R0, R1, 5);
115773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsrs(R0, R1, 5);
115873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asrs(R0, R1, 5);
115973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
116073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsls(R0, R0, R1);
116173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsrs(R0, R0, R1);
116273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asrs(R0, R0, R1);
116373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Rors(R0, R0, R1);
116473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
116573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32-bit with kCcKeep.
116673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsl(R0, R1, 5, AL, kCcKeep);
116773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsr(R0, R1, 5, AL, kCcKeep);
116873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asr(R0, R1, 5, AL, kCcKeep);
116973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
117073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsl(R0, R0, R1, AL, kCcKeep);
117173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsr(R0, R0, R1, AL, kCcKeep);
117273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asr(R0, R0, R1, AL, kCcKeep);
117373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Ror(R0, R0, R1, AL, kCcKeep);
117473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko
117573cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  // 32-bit because ROR immediate doesn't have a 16-bit version like the other shifts.
117673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Ror(R0, R1, 5);
117773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Rors(R0, R1, 5);
117873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Ror(R0, R1, 5, AL, kCcKeep);
117945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
118045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to high registers.
118145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsl(R8, R1, 5);
118245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsr(R0, R8, 5);
118345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Asr(R8, R1, 5);
118445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Ror(R0, R8, 5);
118545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
118645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to different Rd and Rn.
118745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsl(R0, R1, R2);
118845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsr(R0, R1, R2);
118945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Asr(R0, R1, R2);
119045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Ror(R0, R1, R2);
119145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
119245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to use of high registers.
119345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsl(R8, R1, R2);
119445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Lsr(R0, R8, R2);
119545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ Asr(R0, R1, R8);
119645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
119745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // S bit (all 32 bit)
119845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
119945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to high registers.
120073cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsls(R8, R1, 5);
120173cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsrs(R0, R8, 5);
120273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asrs(R8, R1, 5);
120373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Rors(R0, R8, 5);
120445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
120545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to different Rd and Rn.
120673cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsls(R0, R1, R2);
120773cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsrs(R0, R1, R2);
120873cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asrs(R0, R1, R2);
120973cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Rors(R0, R1, R2);
121045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
121145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to use of high registers.
121273cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsls(R8, R1, R2);
121373cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Lsrs(R0, R8, R2);
121473cf0fb75de2a449ce4fe329b5f1fb42eef1372fVladimir Marko  __ Asrs(R0, R1, R8);
121545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
1216cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "Shifts");
121745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison}
121845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
1219d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, LoadStoreRegOffset) {
122045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 16 bit.
122145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(R1, R2));
122245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(R1, R2));
122345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
122445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to shift.
122545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(R1, R2, LSL, 1));
122645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(R1, R2, LSL, 1));
122745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
122845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(R1, R2, LSL, 3));
122945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(R1, R2, LSL, 3));
123045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
123145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // 32 bit due to high register use.
123245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R8, Address(R1, R2));
123345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R8, Address(R1, R2));
123445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
123545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R1, Address(R8, R2));
123645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R2, Address(R8, R2));
123745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
123845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(R1, R8));
123945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(R1, R8));
124045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
1241cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "LoadStoreRegOffset");
124245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison}
124345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
1244d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, LoadStoreLiteral) {
124545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(4));
124645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(4));
124745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
124845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(-8));
124945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(-8));
125045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
125145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  // Limits.
125245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(0x3ff));       // 10 bits (16 bit).
125345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ ldr(R0, Address(0x7ff));       // 11 bits (32 bit).
125445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(0x3ff));       // 32 bit (no 16 bit str(literal)).
125545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  __ str(R0, Address(0x7ff));       // 11 bits (32 bit).
125645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
1257cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "LoadStoreLiteral");
125845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison}
125945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
1260d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, LoadStoreLimits) {
12610bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldr(R0, Address(R4, 124));     // 16 bit.
12620bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldr(R0, Address(R4, 128));     // 32 bit.
12630bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12640bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrb(R0, Address(R4, 31));     // 16 bit.
12650bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrb(R0, Address(R4, 32));     // 32 bit.
12660bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12670bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrh(R0, Address(R4, 62));     // 16 bit.
12680bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrh(R0, Address(R4, 64));     // 32 bit.
12690bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12700bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrsb(R0, Address(R4, 31));     // 32 bit.
12710bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrsb(R0, Address(R4, 32));     // 32 bit.
12720bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12730bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrsh(R0, Address(R4, 62));     // 32 bit.
12740bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ ldrsh(R0, Address(R4, 64));     // 32 bit.
12750bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12760bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ str(R0, Address(R4, 124));     // 16 bit.
12770bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ str(R0, Address(R4, 128));     // 32 bit.
12780bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12790bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ strb(R0, Address(R4, 31));     // 16 bit.
12800bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ strb(R0, Address(R4, 32));     // 32 bit.
12810bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
12820bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ strh(R0, Address(R4, 62));     // 16 bit.
12830bb9ade51635559f991259a7ac90d8570ad886aaDave Allison  __ strh(R0, Address(R4, 64));     // 32 bit.
12840bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
1285cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "LoadStoreLimits");
12860bb9ade51635559f991259a7ac90d8570ad886aaDave Allison}
12870bb9ade51635559f991259a7ac90d8570ad886aaDave Allison
1288d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, CompareAndBranch) {
1289cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  Label label;
1290d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  __ CompareAndBranchIfZero(arm::R0, &label);
1291d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  __ CompareAndBranchIfZero(arm::R11, &label);
1292d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  __ CompareAndBranchIfNonZero(arm::R0, &label);
1293d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  __ CompareAndBranchIfNonZero(arm::R11, &label);
1294d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  __ Bind(&label);
1295d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray
1296cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko  EmitAndCheck(&assembler, "CompareAndBranch");
1297d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray}
1298d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray
1299d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, AddConstant) {
1300f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // Low registers, Rd != Rn.
1301f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0);                          // MOV.
1302f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 1);                          // 16-bit ADDS, encoding T1.
1303f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 7);                          // 16-bit ADDS, encoding T1.
1304f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 8);                          // 32-bit ADD, encoding T3.
1305f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 255);                        // 32-bit ADD, encoding T3.
1306f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 256);                        // 32-bit ADD, encoding T3.
1307f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 257);                        // 32-bit ADD, encoding T4.
1308f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0xfff);                      // 32-bit ADD, encoding T4.
1309f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1000);                     // 32-bit ADD, encoding T3.
1310f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1001);                     // MVN+SUB.
1311f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1002);                     // MOVW+ADD.
1312f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0xffff);                     // MOVW+ADD.
1313f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10000);                    // 32-bit ADD, encoding T3.
1314f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10001);                    // 32-bit ADD, encoding T3.
1315f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10002);                    // MVN+SUB.
1316f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10003);                    // MOVW+MOVT+ADD.
1317f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -1);                         // 16-bit SUBS.
1318f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -7);                         // 16-bit SUBS.
1319f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -8);                         // 32-bit SUB, encoding T3.
1320f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -255);                       // 32-bit SUB, encoding T3.
1321f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -256);                       // 32-bit SUB, encoding T3.
1322f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -257);                       // 32-bit SUB, encoding T4.
1323f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0xfff);                     // 32-bit SUB, encoding T4.
1324f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1000);                    // 32-bit SUB, encoding T3.
1325f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1001);                    // MVN+ADD.
1326f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1002);                    // MOVW+SUB.
1327f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0xffff);                    // MOVW+SUB.
1328f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10000);                   // 32-bit SUB, encoding T3.
1329f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10001);                   // 32-bit SUB, encoding T3.
1330f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10002);                   // MVN+ADD.
1331f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10003);                   // MOVW+MOVT+ADD.
1332f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1333f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // Low registers, Rd == Rn.
1334f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0);                          // Nothing.
1335f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 1);                          // 16-bit ADDS, encoding T2,
1336f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 7);                          // 16-bit ADDS, encoding T2.
1337f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 8);                          // 16-bit ADDS, encoding T2.
1338f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 255);                        // 16-bit ADDS, encoding T2.
1339f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 256);                        // 32-bit ADD, encoding T3.
1340f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 257);                        // 32-bit ADD, encoding T4.
1341f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0xfff);                      // 32-bit ADD, encoding T4.
1342f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x1000);                     // 32-bit ADD, encoding T3.
1343f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x1001);                     // MVN+SUB.
1344f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x1002);                     // MOVW+ADD.
1345f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0xffff);                     // MOVW+ADD.
1346f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x10000);                    // 32-bit ADD, encoding T3.
1347f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x10001);                    // 32-bit ADD, encoding T3.
1348f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x10002);                    // MVN+SUB.
1349f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x10003);                    // MOVW+MOVT+ADD.
1350f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -1);                         // 16-bit SUBS, encoding T2.
1351f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -7);                         // 16-bit SUBS, encoding T2.
1352f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -8);                         // 16-bit SUBS, encoding T2.
1353f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -255);                       // 16-bit SUBS, encoding T2.
1354f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -256);                       // 32-bit SUB, encoding T3.
1355f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -257);                       // 32-bit SUB, encoding T4.
1356f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0xfff);                     // 32-bit SUB, encoding T4.
1357f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x1000);                    // 32-bit SUB, encoding T3.
1358f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x1001);                    // MVN+ADD.
1359f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x1002);                    // MOVW+SUB.
1360f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0xffff);                    // MOVW+SUB.
1361f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x10000);                   // 32-bit SUB, encoding T3.
1362f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x10001);                   // 32-bit SUB, encoding T3.
1363f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x10002);                   // MVN+ADD.
1364f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x10003);                   // MOVW+MOVT+ADD.
1365f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1366f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // High registers.
1367f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, 0);                          // Nothing.
1368f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, 1);                          // 32-bit ADD, encoding T3,
1369f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, 7);                          // 32-bit ADD, encoding T3.
1370f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, 8);                          // 32-bit ADD, encoding T3.
1371f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, 255);                        // 32-bit ADD, encoding T3.
1372f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, 256);                        // 32-bit ADD, encoding T3.
1373f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, 257);                        // 32-bit ADD, encoding T4.
1374f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, 0xfff);                      // 32-bit ADD, encoding T4.
1375f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, 0x1000);                     // 32-bit ADD, encoding T3.
1376f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, 0x1001);                     // MVN+SUB.
1377f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1002);                     // MOVW+ADD.
1378f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, 0xffff);                     // MOVW+ADD.
1379f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, 0x10000);                    // 32-bit ADD, encoding T3.
1380f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, 0x10001);                    // 32-bit ADD, encoding T3.
1381f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, 0x10002);                    // MVN+SUB.
1382f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, 0x10003);                    // MOVW+MOVT+ADD.
1383f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, -1);                         // 32-bit ADD, encoding T3.
1384f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, -7);                         // 32-bit SUB, encoding T3.
1385f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, -8);                         // 32-bit SUB, encoding T3.
1386f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, -255);                       // 32-bit SUB, encoding T3.
1387f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, -256);                       // 32-bit SUB, encoding T3.
1388f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, -257);                       // 32-bit SUB, encoding T4.
1389f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, -0xfff);                     // 32-bit SUB, encoding T4.
1390f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, -0x1000);                    // 32-bit SUB, encoding T3.
1391f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, -0x1001);                    // MVN+ADD.
1392f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1002);                    // MOVW+SUB.
1393f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, -0xffff);                    // MOVW+SUB.
1394f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, -0x10000);                   // 32-bit SUB, encoding T3.
1395f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R8, -0x10001);                   // 32-bit SUB, encoding T3.
1396f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R8, R1, -0x10002);                   // MVN+SUB.
1397f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R8, -0x10003);                   // MOVW+MOVT+ADD.
1398f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1399f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // Low registers, Rd != Rn, kCcKeep.
1400f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0, AL, kCcKeep);             // MOV.
1401f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 1, AL, kCcKeep);             // 32-bit ADD, encoding T3.
1402f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 7, AL, kCcKeep);             // 32-bit ADD, encoding T3.
1403f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 8, AL, kCcKeep);             // 32-bit ADD, encoding T3.
1404f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 255, AL, kCcKeep);           // 32-bit ADD, encoding T3.
1405f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 256, AL, kCcKeep);           // 32-bit ADD, encoding T3.
1406f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 257, AL, kCcKeep);           // 32-bit ADD, encoding T4.
1407f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0xfff, AL, kCcKeep);         // 32-bit ADD, encoding T4.
1408f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1000, AL, kCcKeep);        // 32-bit ADD, encoding T3.
1409f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1001, AL, kCcKeep);        // MVN+SUB.
1410f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1002, AL, kCcKeep);        // MOVW+ADD.
1411f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0xffff, AL, kCcKeep);        // MOVW+ADD.
1412f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10000, AL, kCcKeep);       // 32-bit ADD, encoding T3.
1413f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10001, AL, kCcKeep);       // 32-bit ADD, encoding T3.
1414f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10002, AL, kCcKeep);       // MVN+SUB.
1415f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10003, AL, kCcKeep);       // MOVW+MOVT+ADD.
1416f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -1, AL, kCcKeep);            // 32-bit ADD, encoding T3.
1417f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -7, AL, kCcKeep);            // 32-bit SUB, encoding T3.
1418f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -8, AL, kCcKeep);            // 32-bit SUB, encoding T3.
1419f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -255, AL, kCcKeep);          // 32-bit SUB, encoding T3.
1420f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -256, AL, kCcKeep);          // 32-bit SUB, encoding T3.
1421f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -257, AL, kCcKeep);          // 32-bit SUB, encoding T4.
1422f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0xfff, AL, kCcKeep);        // 32-bit SUB, encoding T4.
1423f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1000, AL, kCcKeep);       // 32-bit SUB, encoding T3.
1424f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1001, AL, kCcKeep);       // MVN+ADD.
1425f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1002, AL, kCcKeep);       // MOVW+SUB.
1426f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0xffff, AL, kCcKeep);       // MOVW+SUB.
1427f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10000, AL, kCcKeep);      // 32-bit SUB, encoding T3.
1428f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10001, AL, kCcKeep);      // 32-bit SUB, encoding T3.
1429f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10002, AL, kCcKeep);      // MVN+ADD.
1430f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10003, AL, kCcKeep);      // MOVW+MOVT+ADD.
1431f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1432f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // Low registers, Rd == Rn, kCcKeep.
1433f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0, AL, kCcKeep);             // Nothing.
1434f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 1, AL, kCcKeep);             // 32-bit ADD, encoding T3.
1435f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 7, AL, kCcKeep);             // 32-bit ADD, encoding T3.
1436f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 8, AL, kCcKeep);             // 32-bit ADD, encoding T3.
1437f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 255, AL, kCcKeep);           // 32-bit ADD, encoding T3.
1438f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 256, AL, kCcKeep);           // 32-bit ADD, encoding T3.
1439f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 257, AL, kCcKeep);           // 32-bit ADD, encoding T4.
1440f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0xfff, AL, kCcKeep);         // 32-bit ADD, encoding T4.
1441f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x1000, AL, kCcKeep);        // 32-bit ADD, encoding T3.
1442f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x1001, AL, kCcKeep);        // MVN+SUB.
1443f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x1002, AL, kCcKeep);        // MOVW+ADD.
1444f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0xffff, AL, kCcKeep);        // MOVW+ADD.
1445f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x10000, AL, kCcKeep);       // 32-bit ADD, encoding T3.
1446f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x10001, AL, kCcKeep);       // 32-bit ADD, encoding T3.
1447f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x10002, AL, kCcKeep);       // MVN+SUB.
1448f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x10003, AL, kCcKeep);       // MOVW+MOVT+ADD.
1449f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -1, AL, kCcKeep);            // 32-bit ADD, encoding T3.
1450f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -7, AL, kCcKeep);            // 32-bit SUB, encoding T3.
1451f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -8, AL, kCcKeep);            // 32-bit SUB, encoding T3.
1452f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -255, AL, kCcKeep);          // 32-bit SUB, encoding T3.
1453f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -256, AL, kCcKeep);          // 32-bit SUB, encoding T3.
1454f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -257, AL, kCcKeep);          // 32-bit SUB, encoding T4.
1455f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0xfff, AL, kCcKeep);        // 32-bit SUB, encoding T4.
1456f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x1000, AL, kCcKeep);       // 32-bit SUB, encoding T3.
1457f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x1001, AL, kCcKeep);       // MVN+ADD.
1458f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x1002, AL, kCcKeep);       // MOVW+SUB.
1459f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0xffff, AL, kCcKeep);       // MOVW+SUB.
1460f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x10000, AL, kCcKeep);      // 32-bit SUB, encoding T3.
1461f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x10001, AL, kCcKeep);      // 32-bit SUB, encoding T3.
1462f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x10002, AL, kCcKeep);      // MVN+ADD.
1463f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x10003, AL, kCcKeep);      // MOVW+MOVT+ADD.
1464f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1465f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // Low registers, Rd != Rn, kCcSet.
1466f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0, AL, kCcSet);              // 16-bit ADDS.
1467f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 1, AL, kCcSet);              // 16-bit ADDS.
1468f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 7, AL, kCcSet);              // 16-bit ADDS.
1469f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 8, AL, kCcSet);              // 32-bit ADDS, encoding T3.
1470f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 255, AL, kCcSet);            // 32-bit ADDS, encoding T3.
1471f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 256, AL, kCcSet);            // 32-bit ADDS, encoding T3.
1472f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 257, AL, kCcSet);            // MVN+SUBS.
1473f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0xfff, AL, kCcSet);          // MOVW+ADDS.
1474f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1000, AL, kCcSet);         // 32-bit ADDS, encoding T3.
1475f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1001, AL, kCcSet);         // MVN+SUBS.
1476f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x1002, AL, kCcSet);         // MOVW+ADDS.
1477f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0xffff, AL, kCcSet);         // MOVW+ADDS.
1478f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10000, AL, kCcSet);        // 32-bit ADDS, encoding T3.
1479f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10001, AL, kCcSet);        // 32-bit ADDS, encoding T3.
1480f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10002, AL, kCcSet);        // MVN+SUBS.
1481f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 0x10003, AL, kCcSet);        // MOVW+MOVT+ADDS.
1482f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -1, AL, kCcSet);             // 16-bit SUBS.
1483f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -7, AL, kCcSet);             // 16-bit SUBS.
1484f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -8, AL, kCcSet);             // 32-bit SUBS, encoding T3.
1485f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -255, AL, kCcSet);           // 32-bit SUBS, encoding T3.
1486f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -256, AL, kCcSet);           // 32-bit SUBS, encoding T3.
1487f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -257, AL, kCcSet);           // MVN+ADDS.
1488f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0xfff, AL, kCcSet);         // MOVW+SUBS.
1489f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1000, AL, kCcSet);        // 32-bit SUBS, encoding T3.
1490f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1001, AL, kCcSet);        // MVN+ADDS.
1491f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x1002, AL, kCcSet);        // MOVW+SUBS.
1492f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0xffff, AL, kCcSet);        // MOVW+SUBS.
1493f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10000, AL, kCcSet);       // 32-bit SUBS, encoding T3.
1494f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10001, AL, kCcSet);       // 32-bit SUBS, encoding T3.
1495f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10002, AL, kCcSet);       // MVN+ADDS.
1496f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, -0x10003, AL, kCcSet);       // MOVW+MOVT+ADDS.
1497f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1498f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  // Low registers, Rd == Rn, kCcSet.
1499f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0, AL, kCcSet);              // 16-bit ADDS, encoding T2.
1500f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 1, AL, kCcSet);              // 16-bit ADDS, encoding T2.
1501f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 7, AL, kCcSet);              // 16-bit ADDS, encoding T2.
1502f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 8, AL, kCcSet);              // 16-bit ADDS, encoding T2.
1503f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 255, AL, kCcSet);            // 16-bit ADDS, encoding T2.
1504f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 256, AL, kCcSet);            // 32-bit ADDS, encoding T3.
1505f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 257, AL, kCcSet);            // MVN+SUBS.
1506f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0xfff, AL, kCcSet);          // MOVW+ADDS.
1507f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x1000, AL, kCcSet);         // 32-bit ADDS, encoding T3.
1508f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x1001, AL, kCcSet);         // MVN+SUBS.
1509f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x1002, AL, kCcSet);         // MOVW+ADDS.
1510f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0xffff, AL, kCcSet);         // MOVW+ADDS.
1511f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x10000, AL, kCcSet);        // 32-bit ADDS, encoding T3.
1512f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x10001, AL, kCcSet);        // 32-bit ADDS, encoding T3.
1513f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 0x10002, AL, kCcSet);        // MVN+SUBS.
1514f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, 0x10003, AL, kCcSet);        // MOVW+MOVT+ADDS.
1515f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -1, AL, kCcSet);             // 16-bit SUBS, encoding T2.
1516f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -7, AL, kCcSet);             // 16-bit SUBS, encoding T2.
1517f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -8, AL, kCcSet);             // 16-bit SUBS, encoding T2.
1518f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -255, AL, kCcSet);           // 16-bit SUBS, encoding T2.
1519f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -256, AL, kCcSet);           // 32-bit SUB, encoding T3.
1520f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -257, AL, kCcSet);           // MNV+ADDS.
1521f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0xfff, AL, kCcSet);         // MOVW+SUBS.
1522f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x1000, AL, kCcSet);        // 32-bit SUB, encoding T3.
1523f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x1001, AL, kCcSet);        // MVN+ADDS.
1524f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x1002, AL, kCcSet);        // MOVW+SUBS.
1525f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0xffff, AL, kCcSet);        // MOVW+SUBS.
1526f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x10000, AL, kCcSet);       // 32-bit SUBS, encoding T3.
1527f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x10001, AL, kCcSet);       // 32-bit SUBS, encoding T3.
1528f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R1, R1, -0x10002, AL, kCcSet);       // MVN+ADDS.
1529f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, -0x10003, AL, kCcSet);       // MOVW+MOVT+ADDS.
1530f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1531f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ it(EQ);
1532f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 1, EQ, kCcSet);              // 32-bit ADDS, encoding T3.
1533f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ it(NE);
1534f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R1, 1, NE, kCcKeep);             // 16-bit ADDS, encoding T1.
1535f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ it(GE);
1536f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 1, GE, kCcSet);              // 32-bit ADDS, encoding T3.
1537f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ it(LE);
1538f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  __ AddConstant(R0, R0, 1, LE, kCcKeep);             // 16-bit ADDS, encoding T2.
1539f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1540f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko  EmitAndCheck(&assembler, "AddConstant");
1541f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko}
1542f5c09c3ed5bca4c34d8476dd9ed2714106fafbcfVladimir Marko
1543d1ee80948144526b985afb44a0574248cf7da58aVladimir MarkoTEST_F(Thumb2AssemblerTest, CmpConstant) {
1544ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 0);                              // 16-bit CMP.
1545ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 1);                              // 16-bit CMP.
1546ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 7);                              // 16-bit CMP.
1547ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 8);                              // 16-bit CMP.
1548ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 255);                            // 16-bit CMP.
1549ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 256);                            // 32-bit CMP.
1550ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 257);                            // MNV+CMN.
1551ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 0xfff);                          // MOVW+CMP.
1552ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 0x1000);                         // 32-bit CMP.
1553ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 0x1001);                         // MNV+CMN.
1554ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 0x1002);                         // MOVW+CMP.
1555ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 0xffff);                         // MOVW+CMP.
1556ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 0x10000);                        // 32-bit CMP.
1557ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 0x10001);                        // 32-bit CMP.
1558ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, 0x10002);                        // MVN+CMN.
1559ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, 0x10003);                        // MOVW+MOVT+CMP.
1560ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -1);                             // 32-bit CMP.
1561ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -7);                             // CMN.
1562ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -8);                             // CMN.
1563ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -255);                           // CMN.
1564ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -256);                           // CMN.
1565ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -257);                           // MNV+CMP.
1566ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -0xfff);                         // MOVW+CMN.
1567ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -0x1000);                        // CMN.
1568ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -0x1001);                        // MNV+CMP.
1569ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -0x1002);                        // MOVW+CMN.
1570ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -0xffff);                        // MOVW+CMN.
1571ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -0x10000);                       // CMN.
1572ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -0x10001);                       // CMN.
1573ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R1, -0x10002);                       // MVN+CMP.
1574ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R0, -0x10003);                       // MOVW+MOVT+CMP.
1575ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko
1576ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 0);                              // 32-bit CMP.
1577ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 1);                              // 32-bit CMP.
1578ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 7);                              // 32-bit CMP.
1579ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 8);                              // 32-bit CMP.
1580ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 255);                            // 32-bit CMP.
1581ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 256);                            // 32-bit CMP.
1582ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 257);                            // MNV+CMN
1583ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 0xfff);                          // MOVW+CMP.
1584ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 0x1000);                         // 32-bit CMP.
1585ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 0x1001);                         // MVN+CMN.
1586ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 0x1002);                         // MOVW+CMP.
1587ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 0xffff);                         // MOVW+CMP.
1588ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 0x10000);                        // 32-bit CMP.
1589ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 0x10001);                        // 32-bit CMP.
1590ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, 0x10002);                        // MVN+CMN.
1591ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, 0x10003);                        // MOVW+MOVT+CMP.
1592ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -1);                             // 32-bit CMP
1593ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -7);                             // CMN.
1594ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -8);                             // CMN.
1595ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -255);                           // CMN.
1596ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -256);                           // CMN.
1597ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -257);                           // MNV+CMP.
1598ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -0xfff);                         // MOVW+CMN.
1599ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -0x1000);                        // CMN.
1600ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -0x1001);                        // MVN+CMP.
1601ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -0x1002);                        // MOVW+CMN.
1602ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -0xffff);                        // MOVW+CMN.
1603ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -0x10000);                       // CMN.
1604ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -0x10001);                       // CMN.
1605ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R9, -0x10002);                       // MVN+CMP.
1606ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  __ CmpConstant(R8, -0x10003);                       // MOVW+MOVT+CMP.
1607ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko
1608ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko  EmitAndCheck(&assembler, "CmpConstant");
1609ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko}
1610ac6ac10a0801fa6eb95e0ab0c72b2ed562210b34Vladimir Marko
161165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#undef __
161265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}  // namespace arm
161365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}  // namespace art
1614