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