18b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdlib.h>
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "debug.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "disasm.h"
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "disassembler.h"
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "macro-assembler.h"
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "serialize.h"
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "cctest.h"
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockusing namespace v8::internal;
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic v8::Persistent<v8::Context> env;
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitializeVM() {
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (env.IsEmpty()) {
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    env = v8::Context::New();
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DisassembleAndCompare(byte* pc, const char* compare_string) {
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  disasm::NameConverter converter;
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  disasm::Disassembler disasm(converter);
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EmbeddedVector<char, 128> disasm_buffer;
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  disasm.InstructionDecode(disasm_buffer, pc);
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (strcmp(compare_string, disasm_buffer.start()) != 0) {
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    fprintf(stderr,
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            "expected: \n"
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            "%s\n"
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            "disassembled: \n"
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            "%s\n\n",
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            compare_string, disasm_buffer.start());
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Set up V8 to a state where we can at least run the assembler and
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disassembler. Declare the variables and allocate the data structures used
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// in the rest of the macros.
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define SET_UP()                                           \
768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  InitializeVM();                                         \
778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  v8::HandleScope scope;                                  \
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  byte *buffer = reinterpret_cast<byte*>(malloc(4*1024)); \
798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Assembler assm(Isolate::Current(), buffer, 4*1024);     \
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool failure = false;
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This macro assembles one instruction using the preallocated assembler and
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disassembles the generated instruction, comparing the output to the expected
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// value. If the comparison fails an error message is printed, but the test
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// continues to run until the end.
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define COMPARE(asm_, compare_string) \
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  { \
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int pc_offset = assm.pc_offset(); \
908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    byte *progcounter = &buffer[pc_offset]; \
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assm.asm_; \
928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    if (!DisassembleAndCompare(progcounter, compare_string)) failure = true; \
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Verify that all invocations of the COMPARE macro passed successfully.
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Exit with a failure if at least one of the tests failed.
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define VERIFY_RUN() \
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockif (failure) { \
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(__FILE__, __LINE__, "ARM Disassembler tests failed.\n"); \
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(Type0) {
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SET_UP();
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r0, r1, Operand(r2)),
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0010002       and r0, r1, r2");
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r1, r2, Operand(r3), LeaveCC),
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0021003       and r1, r2, r3");
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r2, r3, Operand(r4), SetCC),
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0132004       ands r2, r3, r4");
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r3, r4, Operand(r5), LeaveCC, eq),
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "00043005       andeq r3, r4, r5");
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r5, Operand(r6, LSL, 0)),
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0254006       eor r4, r5, r6");
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r5, Operand(r7, LSL, 1), SetCC),
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0354087       eors r4, r5, r7, lsl #1");
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r5, Operand(r8, LSL, 2), LeaveCC, ne),
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "10254108       eorne r4, r5, r8, lsl #2");
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r5, Operand(r9, LSL, 3), SetCC, cs),
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "20354189       eorcss r4, r5, r9, lsl #3");
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sub(r5, r6, Operand(r10, LSL, 31), LeaveCC, hs),
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "20465f8a       subcs r5, r6, r10, lsl #31");
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sub(r5, r6, Operand(r10, LSL, 30), SetCC, cc),
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "30565f0a       subccs r5, r6, r10, lsl #30");
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sub(r5, r6, Operand(r10, LSL, 24), LeaveCC, lo),
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "30465c0a       subcc r5, r6, r10, lsl #24");
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sub(r5, r6, Operand(r10, LSL, 16), SetCC, mi),
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "4056580a       submis r5, r6, r10, lsl #16");
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsb(r6, r7, Operand(fp)),
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e067600b       rsb r6, r7, fp");
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsb(r6, r7, Operand(fp, LSR, 1)),
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e06760ab       rsb r6, r7, fp, lsr #1");
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsb(r6, r7, Operand(fp, LSR, 0), SetCC),
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e077602b       rsbs r6, r7, fp, lsr #32");
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsb(r6, r7, Operand(fp, LSR, 31), LeaveCC, pl),
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "50676fab       rsbpl r6, r7, fp, lsr #31");
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(add(r7, r8, Operand(ip, ASR, 1)),
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e08870cc       add r7, r8, ip, asr #1");
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(add(r7, r8, Operand(ip, ASR, 0)),
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e088704c       add r7, r8, ip, asr #32");
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(add(r7, r8, Operand(ip), SetCC),
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e098700c       adds r7, r8, ip");
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(add(r7, r8, Operand(ip, ASR, 31), SetCC, vs),
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "60987fcc       addvss r7, r8, ip, asr #31");
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(adc(r7, fp, Operand(ip, ASR, 5)),
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0ab72cc       adc r7, fp, ip, asr #5");
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(adc(r4, ip, Operand(ip, ASR, 1), LeaveCC, vc),
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "70ac40cc       adcvc r4, ip, ip, asr #1");
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(adc(r5, sp, Operand(ip), SetCC),
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0bd500c       adcs r5, sp, ip");
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(adc(r8, lr, Operand(ip, ASR, 31), SetCC, vc),
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "70be8fcc       adcvcs r8, lr, ip, asr #31");
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sbc(r7, r1, Operand(ip, ROR, 1), LeaveCC, hi),
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "80c170ec       sbchi r7, r1, ip, ror #1");
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sbc(r7, r9, Operand(ip, ROR, 4)),
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0c9726c       sbc r7, r9, ip, ror #4");
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sbc(r7, r10, Operand(ip), SetCC),
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0da700c       sbcs r7, r10, ip");
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(sbc(r7, ip, Operand(ip, ROR, 31), SetCC, hi),
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "80dc7fec       sbchis r7, ip, ip, ror #31");
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsc(r7, r8, Operand(ip, LSL, r0)),
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0e8701c       rsc r7, r8, ip, lsl r0");
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsc(r7, r8, Operand(ip, LSL, r1)),
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0e8711c       rsc r7, r8, ip, lsl r1");
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsc(r7, r8, Operand(ip), SetCC),
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e0f8700c       rscs r7, r8, ip");
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(rsc(r7, r8, Operand(ip, LSL, r3), SetCC, ls),
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "90f8731c       rsclss r7, r8, ip, lsl r3");
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(tst(r7, Operand(r5, ASR, ip), ge),
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "a1170c55       tstge r7, r5, asr ip");
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(tst(r7, Operand(r6, ASR, sp)),
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1170d56       tst r7, r6, asr sp");
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(tst(r7, Operand(r7), ge),
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "a1170007       tstge r7, r7");
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(tst(r7, Operand(r8, ASR, fp), ge),
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "a1170b58       tstge r7, r8, asr fp");
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(teq(r7, Operand(r5, ROR, r0), lt),
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "b1370075       teqlt r7, r5, ror r0");
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(teq(r7, Operand(r6, ROR, lr)),
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1370e76       teq r7, r6, ror lr");
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(teq(r7, Operand(r7), lt),
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "b1370007       teqlt r7, r7");
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(teq(r7, Operand(r8, ROR, r1)),
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1370178       teq r7, r8, ror r1");
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmp(r7, Operand(r4)),
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1570004       cmp r7, r4");
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmp(r7, Operand(r6, LSL, 1), gt),
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "c1570086       cmpgt r7, r6, lsl #1");
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmp(r7, Operand(r8, LSR, 3), gt),
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "c15701a8       cmpgt r7, r8, lsr #3");
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmp(r7, Operand(r8, ASR, 19)),
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e15709c8       cmp r7, r8, asr #19");
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmn(r0, Operand(r4)),
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1700004       cmn r0, r4");
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmn(r1, Operand(r6, ROR, 1)),
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e17100e6       cmn r1, r6, ror #1");
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmn(r2, Operand(r8)),
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1720008       cmn r2, r8");
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(cmn(r3, Operand(fp), le),
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "d173000b       cmnle r3, fp");
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(orr(r7, r8, Operand(lr), LeaveCC, al),
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e188700e       orr r7, r8, lr");
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(orr(r7, r8, Operand(fp)),
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e188700b       orr r7, r8, fp");
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(orr(r7, r8, Operand(sp), SetCC),
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e198700d       orrs r7, r8, sp");
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(orr(r7, r8, Operand(ip), SetCC, al),
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e198700c       orrs r7, r8, ip");
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mov(r0, Operand(r1), LeaveCC, eq),
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "01a00001       moveq r0, r1");
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mov(r0, Operand(r2)),
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1a00002       mov r0, r2");
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mov(r0, Operand(r3), SetCC),
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1b00003       movs r0, r3");
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mov(r0, Operand(r4), SetCC, pl),
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "51b00004       movpls r0, r4");
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(bic(r0, lr, Operand(r1), LeaveCC, vs),
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "61ce0001       bicvs r0, lr, r1");
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(bic(r0, r9, Operand(r2), LeaveCC, vc),
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "71c90002       bicvc r0, r9, r2");
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(bic(r0, r5, Operand(r3), SetCC),
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1d50003       bics r0, r5, r3");
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(bic(r0, r1, Operand(r4), SetCC, pl),
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "51d10004       bicpls r0, r1, r4");
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mvn(r10, Operand(r1)),
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1e0a001       mvn r10, r1");
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mvn(r9, Operand(r2)),
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1e09002       mvn r9, r2");
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mvn(r0, Operand(r3), SetCC),
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e1f00003       mvns r0, r3");
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(mvn(r5, Operand(r4), SetCC, cc),
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "31f05004       mvnccs r5, r4");
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2519dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // Instructions autotransformed by the assembler.
2529dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // mov -> mvn.
2539dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mov(r3, Operand(-1), LeaveCC, al),
2549dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3e03000       mvn r3, #0");
2559dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mov(r4, Operand(-2), SetCC, al),
2569dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3f04001       mvns r4, #1");
2579dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mov(r5, Operand(0x0ffffff0), SetCC, ne),
2589dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "13f052ff       mvnnes r5, #-268435441");
2599dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mov(r6, Operand(-1), LeaveCC, ne),
2609dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "13e06000       mvnne r6, #0");
2619dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2629dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // mvn -> mov.
2639dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mvn(r3, Operand(-1), LeaveCC, al),
2649dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3a03000       mov r3, #0");
2659dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mvn(r4, Operand(-2), SetCC, al),
2669dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3b04001       movs r4, #1");
2679dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mvn(r5, Operand(0x0ffffff0), SetCC, ne),
2689dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "13b052ff       movnes r5, #-268435441");
2699dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(mvn(r6, Operand(-1), LeaveCC, ne),
2709dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "13a06000       movne r6, #0");
2719dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2729dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // mov -> movw.
2738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (CpuFeatures::IsSupported(ARMv7)) {
2749dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    COMPARE(mov(r5, Operand(0x01234), LeaveCC, ne),
2759dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen            "13015234       movwne r5, #4660");
2769dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    // We only disassemble one instruction so the eor instruction is not here.
2779dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    COMPARE(eor(r5, r4, Operand(0x1234), LeaveCC, ne),
2789dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen            "1301c234       movwne ip, #4660");
2799dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    // Movw can't do setcc so we don't get that here.  Mov immediate with setcc
2809dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    // is pretty strange anyway.
2819dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    COMPARE(mov(r5, Operand(0x01234), SetCC, ne),
2829dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen            "159fc000       ldrne ip, [pc, #+0]");
2839dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    // We only disassemble one instruction so the eor instruction is not here.
2849dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    // The eor does the setcc so we get a movw here.
2859dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    COMPARE(eor(r5, r4, Operand(0x1234), SetCC, ne),
2869dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen            "1301c234       movwne ip, #4660");
2879dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2889dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    COMPARE(movt(r5, 0x4321, ne),
2899dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen            "13445321       movtne r5, #17185");
2909dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen    COMPARE(movw(r5, 0xabcd, eq),
2919dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen            "030a5bcd       movweq r5, #43981");
2929dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  }
2939dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2949dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // Eor doesn't have an eor-negative variant, but we can do an mvn followed by
2959dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // an eor to get the same effect.
2969dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(eor(r5, r4, Operand(0xffffff34), SetCC, ne),
2979dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "13e0c0cb       mvnne ip, #203");
2989dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2999dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // and <-> bic.
3009dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(and_(r3, r5, Operand(0xfc03ffff)),
3019dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3c537ff       bic r3, r5, #66846720");
3029dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(bic(r3, r5, Operand(0xfc03ffff)),
3039dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e20537ff       and r3, r5, #66846720");
3049dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3059dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // sub <-> add.
3069dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(add(r3, r5, Operand(-1024)),
3079dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e2453b01       sub r3, r5, #1024");
3089dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(sub(r3, r5, Operand(-1024)),
3099dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e2853b01       add r3, r5, #1024");
3109dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3119dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // cmp <-> cmn.
3129dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(cmp(r3, Operand(-1024)),
3139dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3730b01       cmn r3, #1024");
3149dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  COMPARE(cmn(r3, Operand(-1024)),
3159dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen          "e3530b01       cmp r3, #1024");
3169dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Miscellaneous instructions encoded as type 0.
3186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  COMPARE(blx(ip),
3196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block          "e12fff3c       blx ip");
3206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  COMPARE(bkpt(0),
3216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block          "e1200070       bkpt 0");
3226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  COMPARE(bkpt(0xffff),
3236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block          "e12fff7f       bkpt 65535");
3246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  COMPARE(clz(r6, r7),
3256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block          "e16f6f17       clz r6, r7");
3266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VERIFY_RUN();
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(Type1) {
3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SET_UP();
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r0, r1, Operand(0x00000000)),
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e2010000       and r0, r1, #0");
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r1, r2, Operand(0x00000001), LeaveCC),
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e2021001       and r1, r2, #1");
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r2, r3, Operand(0x00000010), SetCC),
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e2132010       ands r2, r3, #16");
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r3, r4, Operand(0x00000100), LeaveCC, eq),
341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "02043c01       andeq r3, r4, #256");
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(and_(r4, r5, Operand(0x00001000), SetCC, ne),
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "12154a01       andnes r4, r5, #4096");
344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r5, Operand(0x00001000)),
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e2254a01       eor r4, r5, #4096");
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r4, Operand(0x00010000), LeaveCC),
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e2244801       eor r4, r4, #65536");
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r3, Operand(0x00100000), SetCC),
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "e2334601       eors r4, r3, #1048576");
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r2, Operand(0x01000000), LeaveCC, cs),
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "22224401       eorcs r4, r2, #16777216");
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  COMPARE(eor(r4, r1, Operand(0x10000000), SetCC, cc),
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          "32314201       eorccs r4, r1, #268435456");
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VERIFY_RUN();
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochTEST(Type3) {
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SET_UP();
3627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (CpuFeatures::IsSupported(ARMv7)) {
3647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(ubfx(r0, r1, 5, 10),
3657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7e902d1       ubfx r0, r1, #5, #10");
3667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(ubfx(r1, r0, 5, 10),
3677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7e912d0       ubfx r1, r0, #5, #10");
3687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(ubfx(r0, r1, 31, 1),
3697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7e00fd1       ubfx r0, r1, #31, #1");
3707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(ubfx(r1, r0, 31, 1),
3717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7e01fd0       ubfx r1, r0, #31, #1");
3727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(sbfx(r0, r1, 5, 10),
3747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7a902d1       sbfx r0, r1, #5, #10");
3757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(sbfx(r1, r0, 5, 10),
3767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7a912d0       sbfx r1, r0, #5, #10");
3777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(sbfx(r0, r1, 31, 1),
3787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7a00fd1       sbfx r0, r1, #31, #1");
3797f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(sbfx(r1, r0, 31, 1),
3807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7a01fd0       sbfx r1, r0, #31, #1");
3817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfc(r0, 5, 10),
3837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7ce029f       bfc r0, #5, #10");
3847f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfc(r1, 5, 10),
3857f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7ce129f       bfc r1, #5, #10");
3867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfc(r0, 31, 1),
3877f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7df0f9f       bfc r0, #31, #1");
3887f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfc(r1, 31, 1),
3897f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7df1f9f       bfc r1, #31, #1");
3907f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3917f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfi(r0, r1, 5, 10),
3927f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7ce0291       bfi r0, r1, #5, #10");
3937f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfi(r1, r0, 5, 10),
3947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7ce1290       bfi r1, r0, #5, #10");
3957f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfi(r0, r1, 31, 1),
3967f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7df0f91       bfi r0, r1, #31, #1");
3977f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    COMPARE(bfi(r1, r0, 31, 1),
3987f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch            "e7df1f90       bfi r1, r0, #31, #1");
39950ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen
40050ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen    COMPARE(usat(r0, 1, Operand(r1)),
40150ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen            "e6e10011       usat r0, #1, r1");
40250ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen    COMPARE(usat(r2, 7, Operand(lr)),
40350ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen            "e6e7201e       usat r2, #7, lr");
40450ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen    COMPARE(usat(r3, 31, Operand(r4, LSL, 31)),
40550ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen            "e6ff3f94       usat r3, #31, r4, lsl #31");
40650ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen    COMPARE(usat(r8, 0, Operand(r5, ASR, 17)),
40750ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen            "e6e088d5       usat r8, #0, r5, asr #17");
4087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
4097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
4107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  VERIFY_RUN();
4117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
4127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
4138defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4148defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4158defd9ff6930b4e24729971a61cf7469daf119beSteve BlockTEST(Vfp) {
4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SET_UP();
4178defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (CpuFeatures::IsSupported(VFP3)) {
4198defd9ff6930b4e24729971a61cf7469daf119beSteve Block    CpuFeatures::Scope scope(VFP3);
4208defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vmov(d0, d1),
4218defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "eeb00b41       vmov.f64 d0, d1");
4228defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vmov(d3, d3, eq),
4238defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "0eb03b43       vmov.f64eq d3, d3");
4248defd9ff6930b4e24729971a61cf7469daf119beSteve Block
42580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vmov(s0, s31),
42680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "eeb00a6f       vmov.f32 s0, s31");
42780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vmov(s31, s0),
42880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "eef0fa40       vmov.f32 s31, s0");
42980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vmov(r0, s0),
43080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ee100a10       vmov r0, s0");
43180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vmov(r10, s31),
43280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ee1faa90       vmov r10, s31");
43380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vmov(s0, r0),
43480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ee000a10       vmov s0, r0");
43580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vmov(s31, r10),
43680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ee0faa90       vmov s31, r10");
43780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
4381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    COMPARE(vabs(d0, d1),
439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "eeb00bc1       vabs.f64 d0, d1");
4401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    COMPARE(vabs(d3, d4, mi),
441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "4eb03bc4       vabs.f64mi d3, d4");
4421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    COMPARE(vneg(d0, d1),
444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "eeb10b41       vneg.f64 d0, d1");
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    COMPARE(vneg(d3, d4, mi),
446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "4eb13b44       vneg.f64mi d3, d4");
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4488defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vadd(d0, d1, d2),
4498defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "ee310b02       vadd.f64 d0, d1, d2");
4508defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vadd(d3, d4, d5, mi),
4518defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "4e343b05       vadd.f64mi d3, d4, d5");
4528defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4538defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vsub(d0, d1, d2),
4548defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "ee310b42       vsub.f64 d0, d1, d2");
4558defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vsub(d3, d4, d5, ne),
4568defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "1e343b45       vsub.f64ne d3, d4, d5");
4578defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4588defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vmul(d2, d1, d0),
4598defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "ee212b00       vmul.f64 d2, d1, d0");
4608defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vmul(d6, d4, d5, cc),
4618defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "3e246b05       vmul.f64cc d6, d4, d5");
4628defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4638defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vdiv(d2, d2, d2),
4648defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "ee822b02       vdiv.f64 d2, d2, d2");
4658defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vdiv(d6, d7, d7, hi),
4668defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "8e876b07       vdiv.f64hi d6, d7, d7");
4678defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4688defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vsqrt(d0, d0),
4698defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "eeb10bc0       vsqrt.f64 d0, d0");
4708defd9ff6930b4e24729971a61cf7469daf119beSteve Block    COMPARE(vsqrt(d2, d3, ne),
4718defd9ff6930b4e24729971a61cf7469daf119beSteve Block            "1eb12bc3       vsqrt.f64ne d2, d3");
4723bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
4733bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    COMPARE(vmov(d0, 1.0),
4743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch            "eeb70b00       vmov.f64 d0, #1");
4753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    COMPARE(vmov(d2, -13.0),
4763bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch            "eeba2b0a       vmov.f64 d2, #-13");
47780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
47880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(s0, r0, 0),
47980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed900a00       vldr s0, [r0 + 4*0]");
48080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(s1, r1, 4),
48180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "edd10a01       vldr s1, [r1 + 4*1]");
48280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(s15, r4, 16),
48380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "edd47a04       vldr s15, [r4 + 4*4]");
48480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(s16, r5, 20),
48580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed958a05       vldr s16, [r5 + 4*5]");
48680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(s31, r10, 1020),
48780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "eddafaff       vldr s31, [r10 + 4*255]");
48880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
48980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(s0, r0, 0),
49080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed800a00       vstr s0, [r0 + 4*0]");
49180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(s1, r1, 4),
49280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "edc10a01       vstr s1, [r1 + 4*1]");
49380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(s15, r8, 8),
49480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "edc87a02       vstr s15, [r8 + 4*2]");
49580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(s16, r9, 12),
49680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed898a03       vstr s16, [r9 + 4*3]");
49780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(s31, r10, 1020),
49880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "edcafaff       vstr s31, [r10 + 4*255]");
49980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
50080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(d0, r0, 0),
50180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed900b00       vldr d0, [r0 + 4*0]");
50280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(d1, r1, 4),
50380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed911b01       vldr d1, [r1 + 4*1]");
50480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vldr(d15, r10, 1020),
50580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed9afbff       vldr d15, [r10 + 4*255]");
50680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(d0, r0, 0),
50780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed800b00       vstr d0, [r0 + 4*0]");
50880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(d1, r1, 4),
50980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed811b01       vstr d1, [r1 + 4*1]");
51080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    COMPARE(vstr(d15, r10, 1020),
51180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            "ed8afbff       vstr d15, [r10 + 4*255]");
5128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
5138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    COMPARE(vmsr(r5),
5148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang            "eee15a10       vmsr FPSCR, r5");
5158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    COMPARE(vmsr(r10, pl),
5168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang            "5ee1aa10       vmsrpl FPSCR, r10");
5178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    COMPARE(vmsr(pc),
5188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang            "eee1fa10       vmsr FPSCR, APSR");
5198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    COMPARE(vmrs(r5),
5208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang            "eef15a10       vmrs r5, FPSCR");
5218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    COMPARE(vmrs(r10, ge),
5228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang            "aef1aa10       vmrsge r10, FPSCR");
5238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    COMPARE(vmrs(pc),
5248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang            "eef1fa10       vmrs APSR, FPSCR");
5258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vstm(ia, r0, d1, d3),
5278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec801b06       vstmia r0, {d1-d3}");
5288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vldm(ia, r1, d2, d5),
5298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec912b08       vldmia r1, {d2-d5}");
5308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vstm(ia, r2, d0, d15),
5318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec820b20       vstmia r2, {d0-d15}");
5328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vldm(ia, r3, d0, d15),
5338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec930b20       vldmia r3, {d0-d15}");
5348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vstm(ia, r4, s1, s3),
5358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ecc40a03       vstmia r4, {s1-s3}");
5368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vldm(ia, r5, s2, s5),
5378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec951a04       vldmia r5, {s2-s5}");
5388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vstm(ia, r6, s0, s31),
5398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec860a20       vstmia r6, {s0-s31}");
5408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    COMPARE(vldm(ia, r7, s0, s31),
5418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            "ec970a20       vldmia r7, {s0-s31}");
5428defd9ff6930b4e24729971a61cf7469daf119beSteve Block  }
5438defd9ff6930b4e24729971a61cf7469daf119beSteve Block
5448defd9ff6930b4e24729971a61cf7469daf119beSteve Block  VERIFY_RUN();
5458defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochTEST(LoadStore) {
5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SET_UP();
550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1)),
552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5d10000       ldrb r0, [r1, #+0]");
553257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r2, MemOperand(r3, 42)),
554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5d3202a       ldrb r2, [r3, #+42]");
555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r4, MemOperand(r5, -42)),
556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e555402a       ldrb r4, [r5, #-42]");
557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r6, MemOperand(r7, 42, PostIndex)),
558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e4d7602a       ldrb r6, [r7], #+42");
559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r8, MemOperand(r9, -42, PostIndex)),
560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e459802a       ldrb r8, [r9], #-42");
561257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r10, MemOperand(fp, 42, PreIndex)),
562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5fba02a       ldrb r10, [fp, #+42]!");
563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(ip, MemOperand(sp, -42, PreIndex)),
564257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e57dc02a       ldrb ip, [sp, #-42]!");
565257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1, r2)),
566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7d10002       ldrb r0, [r1, +r2]");
567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1, r2, NegOffset)),
568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7510002       ldrb r0, [r1, -r2]");
569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1, r2, PostIndex)),
570257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6d10002       ldrb r0, [r1], +r2");
571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1, r2, NegPostIndex)),
572257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6510002       ldrb r0, [r1], -r2");
573257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1, r2, PreIndex)),
574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7f10002       ldrb r0, [r1, +r2]!");
575257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrb(r0, MemOperand(r1, r2, NegPreIndex)),
576257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7710002       ldrb r0, [r1, -r2]!");
577257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1)),
579257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5c10000       strb r0, [r1, #+0]");
580257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r2, MemOperand(r3, 42)),
581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5c3202a       strb r2, [r3, #+42]");
582257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r4, MemOperand(r5, -42)),
583257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e545402a       strb r4, [r5, #-42]");
584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r6, MemOperand(r7, 42, PostIndex)),
585257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e4c7602a       strb r6, [r7], #+42");
586257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r8, MemOperand(r9, -42, PostIndex)),
587257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e449802a       strb r8, [r9], #-42");
588257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r10, MemOperand(fp, 42, PreIndex)),
589257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5eba02a       strb r10, [fp, #+42]!");
590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(ip, MemOperand(sp, -42, PreIndex)),
591257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e56dc02a       strb ip, [sp, #-42]!");
592257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1, r2)),
593257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7c10002       strb r0, [r1, +r2]");
594257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1, r2, NegOffset)),
595257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7410002       strb r0, [r1, -r2]");
596257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1, r2, PostIndex)),
597257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6c10002       strb r0, [r1], +r2");
598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1, r2, NegPostIndex)),
599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6410002       strb r0, [r1], -r2");
600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1, r2, PreIndex)),
601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7e10002       strb r0, [r1, +r2]!");
602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strb(r0, MemOperand(r1, r2, NegPreIndex)),
603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7610002       strb r0, [r1, -r2]!");
604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
605257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1)),
606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1d100b0       ldrh r0, [r1, #+0]");
607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r2, MemOperand(r3, 42)),
608257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1d322ba       ldrh r2, [r3, #+42]");
609257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r4, MemOperand(r5, -42)),
610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e15542ba       ldrh r4, [r5, #-42]");
611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r6, MemOperand(r7, 42, PostIndex)),
612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e0d762ba       ldrh r6, [r7], #+42");
613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r8, MemOperand(r9, -42, PostIndex)),
614257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e05982ba       ldrh r8, [r9], #-42");
615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r10, MemOperand(fp, 42, PreIndex)),
616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1fba2ba       ldrh r10, [fp, #+42]!");
617257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(ip, MemOperand(sp, -42, PreIndex)),
618257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e17dc2ba       ldrh ip, [sp, #-42]!");
619257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1, r2)),
620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e19100b2       ldrh r0, [r1, +r2]");
621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1, r2, NegOffset)),
622257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e11100b2       ldrh r0, [r1, -r2]");
623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1, r2, PostIndex)),
624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e09100b2       ldrh r0, [r1], +r2");
625257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1, r2, NegPostIndex)),
626257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e01100b2       ldrh r0, [r1], -r2");
627257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1, r2, PreIndex)),
628257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1b100b2       ldrh r0, [r1, +r2]!");
629257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldrh(r0, MemOperand(r1, r2, NegPreIndex)),
630257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e13100b2       ldrh r0, [r1, -r2]!");
631257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1)),
633257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1c100b0       strh r0, [r1, #+0]");
634257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r2, MemOperand(r3, 42)),
635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1c322ba       strh r2, [r3, #+42]");
636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r4, MemOperand(r5, -42)),
637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e14542ba       strh r4, [r5, #-42]");
638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r6, MemOperand(r7, 42, PostIndex)),
639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e0c762ba       strh r6, [r7], #+42");
640257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r8, MemOperand(r9, -42, PostIndex)),
641257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e04982ba       strh r8, [r9], #-42");
642257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r10, MemOperand(fp, 42, PreIndex)),
643257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1eba2ba       strh r10, [fp, #+42]!");
644257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(ip, MemOperand(sp, -42, PreIndex)),
645257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e16dc2ba       strh ip, [sp, #-42]!");
646257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1, r2)),
647257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e18100b2       strh r0, [r1, +r2]");
648257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1, r2, NegOffset)),
649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e10100b2       strh r0, [r1, -r2]");
650257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1, r2, PostIndex)),
651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e08100b2       strh r0, [r1], +r2");
652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1, r2, NegPostIndex)),
653257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e00100b2       strh r0, [r1], -r2");
654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1, r2, PreIndex)),
655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e1a100b2       strh r0, [r1, +r2]!");
656257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(strh(r0, MemOperand(r1, r2, NegPreIndex)),
657257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e12100b2       strh r0, [r1, -r2]!");
658257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
659257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1)),
660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5910000       ldr r0, [r1, #+0]");
661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r2, MemOperand(r3, 42)),
662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e593202a       ldr r2, [r3, #+42]");
663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r4, MemOperand(r5, -42)),
664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e515402a       ldr r4, [r5, #-42]");
665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r6, MemOperand(r7, 42, PostIndex)),
666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e497602a       ldr r6, [r7], #+42");
667257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r8, MemOperand(r9, -42, PostIndex)),
668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e419802a       ldr r8, [r9], #-42");
669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r10, MemOperand(fp, 42, PreIndex)),
670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5bba02a       ldr r10, [fp, #+42]!");
671257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(ip, MemOperand(sp, -42, PreIndex)),
672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e53dc02a       ldr ip, [sp, #-42]!");
673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1, r2)),
674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7910002       ldr r0, [r1, +r2]");
675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1, r2, NegOffset)),
676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7110002       ldr r0, [r1, -r2]");
677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1, r2, PostIndex)),
678257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6910002       ldr r0, [r1], +r2");
679257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1, r2, NegPostIndex)),
680257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6110002       ldr r0, [r1], -r2");
681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1, r2, PreIndex)),
682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7b10002       ldr r0, [r1, +r2]!");
683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(ldr(r0, MemOperand(r1, r2, NegPreIndex)),
684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7310002       ldr r0, [r1, -r2]!");
685257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
686257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1)),
687257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5810000       str r0, [r1, #+0]");
688257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r2, MemOperand(r3, 42)),
689257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e583202a       str r2, [r3, #+42]");
690257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r4, MemOperand(r5, -42)),
691257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e505402a       str r4, [r5, #-42]");
692257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r6, MemOperand(r7, 42, PostIndex)),
693257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e487602a       str r6, [r7], #+42");
694257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r8, MemOperand(r9, -42, PostIndex)),
695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e409802a       str r8, [r9], #-42");
696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r10, MemOperand(fp, 42, PreIndex)),
697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e5aba02a       str r10, [fp, #+42]!");
698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(ip, MemOperand(sp, -42, PreIndex)),
699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e52dc02a       str ip, [sp, #-42]!");
700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1, r2)),
701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7810002       str r0, [r1, +r2]");
702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1, r2, NegOffset)),
703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7010002       str r0, [r1, -r2]");
704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1, r2, PostIndex)),
705257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6810002       str r0, [r1], +r2");
706257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1, r2, NegPostIndex)),
707257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e6010002       str r0, [r1], -r2");
708257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1, r2, PreIndex)),
709257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7a10002       str r0, [r1, +r2]!");
710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  COMPARE(str(r0, MemOperand(r1, r2, NegPreIndex)),
711257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          "e7210002       str r0, [r1, -r2]!");
712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
713257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (CpuFeatures::IsSupported(ARMv7)) {
714257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    CpuFeatures::Scope scope(ARMv7);
715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(r0, r1, MemOperand(r1)),
716257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e1c100d0       ldrd r0, [r1, #+0]");
717257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(r2, r3, MemOperand(r3, 127)),
718257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e1c327df       ldrd r2, [r3, #+127]");
719257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(r4, r5, MemOperand(r5, -127)),
720257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e14547df       ldrd r4, [r5, #-127]");
721257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(r6, r7, MemOperand(r7, 127, PostIndex)),
722257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e0c767df       ldrd r6, [r7], #+127");
723257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(r8, r9, MemOperand(r9, -127, PostIndex)),
724257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e04987df       ldrd r8, [r9], #-127");
725257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(r10, fp, MemOperand(fp, 127, PreIndex)),
726257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e1eba7df       ldrd r10, [fp, #+127]!");
727257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(ldrd(ip, sp, MemOperand(sp, -127, PreIndex)),
728257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e16dc7df       ldrd ip, [sp, #-127]!");
729257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
730257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(r0, r1, MemOperand(r1)),
731257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e1c100f0       strd r0, [r1, #+0]");
732257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(r2, r3, MemOperand(r3, 127)),
733257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e1c327ff       strd r2, [r3, #+127]");
734257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(r4, r5, MemOperand(r5, -127)),
735257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e14547ff       strd r4, [r5, #-127]");
736257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(r6, r7, MemOperand(r7, 127, PostIndex)),
737257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e0c767ff       strd r6, [r7], #+127");
738257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(r8, r9, MemOperand(r9, -127, PostIndex)),
739257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e04987ff       strd r8, [r9], #-127");
740257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(r10, fp, MemOperand(fp, 127, PreIndex)),
741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e1eba7ff       strd r10, [fp, #+127]!");
742257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    COMPARE(strd(ip, sp, MemOperand(sp, -127, PreIndex)),
743257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            "e16dc7ff       strd ip, [sp, #-127]!");
744257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
745257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
746257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VERIFY_RUN();
747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
748257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
749