xref: /aosp_15_r20/external/vixl/test/aarch32/test-disasm-a32.cc (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1*f5c631daSSadaf Ebrahimi // Copyright 2016, VIXL authors
2*f5c631daSSadaf Ebrahimi // All rights reserved.
3*f5c631daSSadaf Ebrahimi //
4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without
5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met:
6*f5c631daSSadaf Ebrahimi //
7*f5c631daSSadaf Ebrahimi //   * Redistributions of source code must retain the above copyright notice,
8*f5c631daSSadaf Ebrahimi //     this list of conditions and the following disclaimer.
9*f5c631daSSadaf Ebrahimi //   * Redistributions in binary form must reproduce the above copyright notice,
10*f5c631daSSadaf Ebrahimi //     this list of conditions and the following disclaimer in the documentation
11*f5c631daSSadaf Ebrahimi //     and/or other materials provided with the distribution.
12*f5c631daSSadaf Ebrahimi //   * Neither the name of ARM Limited nor the names of its contributors may be
13*f5c631daSSadaf Ebrahimi //     used to endorse or promote products derived from this software without
14*f5c631daSSadaf Ebrahimi //     specific prior written permission.
15*f5c631daSSadaf Ebrahimi //
16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*f5c631daSSadaf Ebrahimi // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*f5c631daSSadaf Ebrahimi // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20*f5c631daSSadaf Ebrahimi // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*f5c631daSSadaf Ebrahimi // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22*f5c631daSSadaf Ebrahimi // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23*f5c631daSSadaf Ebrahimi // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*f5c631daSSadaf Ebrahimi // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25*f5c631daSSadaf Ebrahimi // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*f5c631daSSadaf Ebrahimi 
27*f5c631daSSadaf Ebrahimi #include <list>
28*f5c631daSSadaf Ebrahimi #include <sstream>
29*f5c631daSSadaf Ebrahimi #include <string>
30*f5c631daSSadaf Ebrahimi 
31*f5c631daSSadaf Ebrahimi #include "test-runner.h"
32*f5c631daSSadaf Ebrahimi #include "test-utils.h"
33*f5c631daSSadaf Ebrahimi 
34*f5c631daSSadaf Ebrahimi #include "aarch32/disasm-aarch32.h"
35*f5c631daSSadaf Ebrahimi #include "aarch32/macro-assembler-aarch32.h"
36*f5c631daSSadaf Ebrahimi 
37*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING
38*f5c631daSSadaf Ebrahimi #include <stdexcept>
39*f5c631daSSadaf Ebrahimi #endif
40*f5c631daSSadaf Ebrahimi 
41*f5c631daSSadaf Ebrahimi namespace vixl {
42*f5c631daSSadaf Ebrahimi namespace aarch32 {
43*f5c631daSSadaf Ebrahimi 
44*f5c631daSSadaf Ebrahimi #define __ masm.
45*f5c631daSSadaf Ebrahimi #define TEST(name) TEST_(AARCH32_DISASM_##name)
46*f5c631daSSadaf Ebrahimi 
47*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
48*f5c631daSSadaf Ebrahimi #define TEST_T32(name) TEST_(AARCH32_DISASM_##name)
49*f5c631daSSadaf Ebrahimi #else
50*f5c631daSSadaf Ebrahimi #define TEST_T32(name) void Test##name()
51*f5c631daSSadaf Ebrahimi #endif
52*f5c631daSSadaf Ebrahimi 
53*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
54*f5c631daSSadaf Ebrahimi #define TEST_A32(name) TEST_(AARCH32_DISASM_##name)
55*f5c631daSSadaf Ebrahimi #else
56*f5c631daSSadaf Ebrahimi #define TEST_A32(name) void Test##name()
57*f5c631daSSadaf Ebrahimi #endif
58*f5c631daSSadaf Ebrahimi 
59*f5c631daSSadaf Ebrahimi #define BUF_SIZE (4096)
60*f5c631daSSadaf Ebrahimi 
61*f5c631daSSadaf Ebrahimi #define SETUP() MacroAssembler masm(BUF_SIZE);
62*f5c631daSSadaf Ebrahimi 
63*f5c631daSSadaf Ebrahimi #define CLEANUP()
64*f5c631daSSadaf Ebrahimi 
65*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING
66*f5c631daSSadaf Ebrahimi #define START_COMPARE() \
67*f5c631daSSadaf Ebrahimi   {                     \
68*f5c631daSSadaf Ebrahimi     try {               \
69*f5c631daSSadaf Ebrahimi       int32_t start = masm.GetCursorOffset();
70*f5c631daSSadaf Ebrahimi 
71*f5c631daSSadaf Ebrahimi #define END_COMPARE_CHECK_SIZE(EXP, SIZE)                       \
72*f5c631daSSadaf Ebrahimi   int32_t end = masm.GetCursorOffset();                         \
73*f5c631daSSadaf Ebrahimi   masm.FinalizeCode();                                          \
74*f5c631daSSadaf Ebrahimi   std::ostringstream ss;                                        \
75*f5c631daSSadaf Ebrahimi   TestDisassembler disassembler(ss, 0);                         \
76*f5c631daSSadaf Ebrahimi   if (masm.IsUsingT32()) {                                      \
77*f5c631daSSadaf Ebrahimi     disassembler.DisassembleT32(*masm.GetBuffer(), start, end); \
78*f5c631daSSadaf Ebrahimi   } else {                                                      \
79*f5c631daSSadaf Ebrahimi     disassembler.DisassembleA32(*masm.GetBuffer(), start, end); \
80*f5c631daSSadaf Ebrahimi   }                                                             \
81*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();                                    \
82*f5c631daSSadaf Ebrahimi   if (Test::disassemble()) {                                    \
83*f5c631daSSadaf Ebrahimi     printf("----\n");                                           \
84*f5c631daSSadaf Ebrahimi     printf("%s", ss.str().c_str());                             \
85*f5c631daSSadaf Ebrahimi   }                                                             \
86*f5c631daSSadaf Ebrahimi   if (std::string(EXP) != ss.str()) {                           \
87*f5c631daSSadaf Ebrahimi     printf("\n%s:%d:%s\nFound:\n%sExpected:\n%s",               \
88*f5c631daSSadaf Ebrahimi            __FILE__,                                            \
89*f5c631daSSadaf Ebrahimi            __LINE__,                                            \
90*f5c631daSSadaf Ebrahimi            masm.IsUsingT32() ? "T32" : "A32",                   \
91*f5c631daSSadaf Ebrahimi            ss.str().c_str(),                                    \
92*f5c631daSSadaf Ebrahimi            EXP);                                                \
93*f5c631daSSadaf Ebrahimi     abort();                                                    \
94*f5c631daSSadaf Ebrahimi   }                                                             \
95*f5c631daSSadaf Ebrahimi   if ((SIZE) != -1 && ((end - start) != (SIZE))) {              \
96*f5c631daSSadaf Ebrahimi     printf("\nExpected %d bits, found %d bits\n",               \
97*f5c631daSSadaf Ebrahimi            8 * (SIZE),                                          \
98*f5c631daSSadaf Ebrahimi            8 * (end - start));                                  \
99*f5c631daSSadaf Ebrahimi     abort();                                                    \
100*f5c631daSSadaf Ebrahimi   }                                                             \
101*f5c631daSSadaf Ebrahimi   }                                                             \
102*f5c631daSSadaf Ebrahimi   catch (const std::runtime_error& e) {                         \
103*f5c631daSSadaf Ebrahimi     const char* msg = e.what();                                 \
104*f5c631daSSadaf Ebrahimi     printf("\n%s:%d:%s\nFound:\n%sExpected:\n%s",               \
105*f5c631daSSadaf Ebrahimi            __FILE__,                                            \
106*f5c631daSSadaf Ebrahimi            __LINE__,                                            \
107*f5c631daSSadaf Ebrahimi            masm.IsUsingT32() ? "T32" : "A32",                   \
108*f5c631daSSadaf Ebrahimi            msg,                                                 \
109*f5c631daSSadaf Ebrahimi            EXP);                                                \
110*f5c631daSSadaf Ebrahimi     abort();                                                    \
111*f5c631daSSadaf Ebrahimi   }                                                             \
112*f5c631daSSadaf Ebrahimi   }
113*f5c631daSSadaf Ebrahimi #else
114*f5c631daSSadaf Ebrahimi #define START_COMPARE() \
115*f5c631daSSadaf Ebrahimi   {                     \
116*f5c631daSSadaf Ebrahimi     int32_t start = masm.GetCursorOffset();
117*f5c631daSSadaf Ebrahimi 
118*f5c631daSSadaf Ebrahimi #define END_COMPARE_CHECK_SIZE(EXP, SIZE)                       \
119*f5c631daSSadaf Ebrahimi   int32_t end = masm.GetCursorOffset();                         \
120*f5c631daSSadaf Ebrahimi   masm.FinalizeCode();                                          \
121*f5c631daSSadaf Ebrahimi   std::ostringstream ss;                                        \
122*f5c631daSSadaf Ebrahimi   TestDisassembler disassembler(ss, 0);                         \
123*f5c631daSSadaf Ebrahimi   if (masm.IsUsingT32()) {                                      \
124*f5c631daSSadaf Ebrahimi     disassembler.DisassembleT32(*masm.GetBuffer(), start, end); \
125*f5c631daSSadaf Ebrahimi   } else {                                                      \
126*f5c631daSSadaf Ebrahimi     disassembler.DisassembleA32(*masm.GetBuffer(), start, end); \
127*f5c631daSSadaf Ebrahimi   }                                                             \
128*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();                                    \
129*f5c631daSSadaf Ebrahimi   if (Test::disassemble()) {                                    \
130*f5c631daSSadaf Ebrahimi     printf("----\n");                                           \
131*f5c631daSSadaf Ebrahimi     printf("%s", ss.str().c_str());                             \
132*f5c631daSSadaf Ebrahimi   }                                                             \
133*f5c631daSSadaf Ebrahimi   if (std::string(EXP) != ss.str()) {                           \
134*f5c631daSSadaf Ebrahimi     printf("\n%s:%d:%s\nFound:\n%sExpected:\n%s",               \
135*f5c631daSSadaf Ebrahimi            __FILE__,                                            \
136*f5c631daSSadaf Ebrahimi            __LINE__,                                            \
137*f5c631daSSadaf Ebrahimi            masm.IsUsingT32() ? "T32" : "A32",                   \
138*f5c631daSSadaf Ebrahimi            ss.str().c_str(),                                    \
139*f5c631daSSadaf Ebrahimi            EXP);                                                \
140*f5c631daSSadaf Ebrahimi     abort();                                                    \
141*f5c631daSSadaf Ebrahimi   }                                                             \
142*f5c631daSSadaf Ebrahimi   if ((SIZE) != -1 && ((end - start) != (SIZE))) {              \
143*f5c631daSSadaf Ebrahimi     printf("\nExpected %d bits, found %d bits\n",               \
144*f5c631daSSadaf Ebrahimi            8 * (SIZE),                                          \
145*f5c631daSSadaf Ebrahimi            8 * (end - start));                                  \
146*f5c631daSSadaf Ebrahimi     abort();                                                    \
147*f5c631daSSadaf Ebrahimi   }                                                             \
148*f5c631daSSadaf Ebrahimi   }
149*f5c631daSSadaf Ebrahimi #endif
150*f5c631daSSadaf Ebrahimi 
151*f5c631daSSadaf Ebrahimi #define END_COMPARE(EXP) END_COMPARE_CHECK_SIZE(EXP, -1)
152*f5c631daSSadaf Ebrahimi 
153*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
154*f5c631daSSadaf Ebrahimi #define COMPARE_A32(ASM, EXP) \
155*f5c631daSSadaf Ebrahimi   masm.UseA32();              \
156*f5c631daSSadaf Ebrahimi   START_COMPARE()             \
157*f5c631daSSadaf Ebrahimi   masm.ASM;                   \
158*f5c631daSSadaf Ebrahimi   END_COMPARE(EXP)
159*f5c631daSSadaf Ebrahimi #else
160*f5c631daSSadaf Ebrahimi #define COMPARE_A32(ASM, EXP)
161*f5c631daSSadaf Ebrahimi #endif
162*f5c631daSSadaf Ebrahimi 
163*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
164*f5c631daSSadaf Ebrahimi #define COMPARE_T32(ASM, EXP) \
165*f5c631daSSadaf Ebrahimi   masm.UseT32();              \
166*f5c631daSSadaf Ebrahimi   START_COMPARE()             \
167*f5c631daSSadaf Ebrahimi   masm.ASM;                   \
168*f5c631daSSadaf Ebrahimi   END_COMPARE(EXP)
169*f5c631daSSadaf Ebrahimi #else
170*f5c631daSSadaf Ebrahimi #define COMPARE_T32(ASM, EXP)
171*f5c631daSSadaf Ebrahimi #endif
172*f5c631daSSadaf Ebrahimi 
173*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
174*f5c631daSSadaf Ebrahimi #define COMPARE_T32_CHECK_SIZE(ASM, EXP, SIZE) \
175*f5c631daSSadaf Ebrahimi   masm.UseT32();                               \
176*f5c631daSSadaf Ebrahimi   START_COMPARE()                              \
177*f5c631daSSadaf Ebrahimi   masm.ASM;                                    \
178*f5c631daSSadaf Ebrahimi   END_COMPARE_CHECK_SIZE(EXP, SIZE)
179*f5c631daSSadaf Ebrahimi #else
180*f5c631daSSadaf Ebrahimi #define COMPARE_T32_CHECK_SIZE(ASM, EXP, SIZE)
181*f5c631daSSadaf Ebrahimi #endif
182*f5c631daSSadaf Ebrahimi 
183*f5c631daSSadaf Ebrahimi #define COMPARE_BOTH(ASM, EXP) \
184*f5c631daSSadaf Ebrahimi   COMPARE_A32(ASM, EXP)        \
185*f5c631daSSadaf Ebrahimi   COMPARE_T32(ASM, EXP)
186*f5c631daSSadaf Ebrahimi 
187*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING
188*f5c631daSSadaf Ebrahimi #define NEGATIVE_TEST(ASM, EXP, TEMPORARILY_ACCEPTED)                          \
189*f5c631daSSadaf Ebrahimi   {                                                                            \
190*f5c631daSSadaf Ebrahimi     try {                                                                      \
191*f5c631daSSadaf Ebrahimi       int32_t start = masm.GetCursorOffset();                                  \
192*f5c631daSSadaf Ebrahimi       ASM int32_t end = masm.GetCursorOffset();                                \
193*f5c631daSSadaf Ebrahimi       masm.FinalizeCode();                                                     \
194*f5c631daSSadaf Ebrahimi       if (!TEMPORARILY_ACCEPTED) {                                             \
195*f5c631daSSadaf Ebrahimi         std::ostringstream ss;                                                 \
196*f5c631daSSadaf Ebrahimi         PrintDisassembler disassembler(ss, 0);                                 \
197*f5c631daSSadaf Ebrahimi         if (masm.IsUsingT32()) {                                               \
198*f5c631daSSadaf Ebrahimi           disassembler.DisassembleT32Buffer(masm.GetBuffer()                   \
199*f5c631daSSadaf Ebrahimi                                                 ->GetOffsetAddress<uint16_t*>( \
200*f5c631daSSadaf Ebrahimi                                                     start),                    \
201*f5c631daSSadaf Ebrahimi                                             end);                              \
202*f5c631daSSadaf Ebrahimi         } else {                                                               \
203*f5c631daSSadaf Ebrahimi           disassembler.DisassembleA32Buffer(masm.GetBuffer()                   \
204*f5c631daSSadaf Ebrahimi                                                 ->GetOffsetAddress<uint32_t*>( \
205*f5c631daSSadaf Ebrahimi                                                     start),                    \
206*f5c631daSSadaf Ebrahimi                                             end);                              \
207*f5c631daSSadaf Ebrahimi         }                                                                      \
208*f5c631daSSadaf Ebrahimi         printf("\n%s:%d:%s\nNo exception raised.\n",                           \
209*f5c631daSSadaf Ebrahimi                __FILE__,                                                       \
210*f5c631daSSadaf Ebrahimi                __LINE__,                                                       \
211*f5c631daSSadaf Ebrahimi                masm.IsUsingT32() ? "T32" : "A32");                             \
212*f5c631daSSadaf Ebrahimi         printf("Found:\n%sExpected:\n%s", ss.str().c_str(), EXP);              \
213*f5c631daSSadaf Ebrahimi         abort();                                                               \
214*f5c631daSSadaf Ebrahimi       }                                                                        \
215*f5c631daSSadaf Ebrahimi     } catch (const std::runtime_error& e) {                                    \
216*f5c631daSSadaf Ebrahimi       const char* msg = e.what();                                              \
217*f5c631daSSadaf Ebrahimi       size_t exp_len = strlen(EXP);                                            \
218*f5c631daSSadaf Ebrahimi       if (TEMPORARILY_ACCEPTED) {                                              \
219*f5c631daSSadaf Ebrahimi         printf(                                                                \
220*f5c631daSSadaf Ebrahimi             "\nNegative MacroAssembler test that was temporarily "             \
221*f5c631daSSadaf Ebrahimi             "assembling a deprecated or unpredictable instruction is now "     \
222*f5c631daSSadaf Ebrahimi             "correctly raising an exception. Please update the "               \
223*f5c631daSSadaf Ebrahimi             "test to reflect this.\n");                                        \
224*f5c631daSSadaf Ebrahimi         printf("at: %s:%d:%s\n",                                               \
225*f5c631daSSadaf Ebrahimi                __FILE__,                                                       \
226*f5c631daSSadaf Ebrahimi                __LINE__,                                                       \
227*f5c631daSSadaf Ebrahimi                masm.IsUsingT32() ? "T32" : "A32");                             \
228*f5c631daSSadaf Ebrahimi         abort();                                                               \
229*f5c631daSSadaf Ebrahimi       } else if (std::strncmp(EXP, msg, exp_len) != 0) {                       \
230*f5c631daSSadaf Ebrahimi         printf("\n%s:%d:%s\nFound:\n%sExpected:\n%s...",                       \
231*f5c631daSSadaf Ebrahimi                __FILE__,                                                       \
232*f5c631daSSadaf Ebrahimi                __LINE__,                                                       \
233*f5c631daSSadaf Ebrahimi                masm.IsUsingT32() ? "T32" : "A32",                              \
234*f5c631daSSadaf Ebrahimi                msg,                                                            \
235*f5c631daSSadaf Ebrahimi                EXP);                                                           \
236*f5c631daSSadaf Ebrahimi         abort();                                                               \
237*f5c631daSSadaf Ebrahimi       }                                                                        \
238*f5c631daSSadaf Ebrahimi     }                                                                          \
239*f5c631daSSadaf Ebrahimi   }
240*f5c631daSSadaf Ebrahimi 
241*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
242*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_A32(ASM, EXP)       \
243*f5c631daSSadaf Ebrahimi   masm.UseA32();                           \
244*f5c631daSSadaf Ebrahimi   NEGATIVE_TEST({ masm.ASM; }, EXP, false) \
245*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();
246*f5c631daSSadaf Ebrahimi #else
247*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_A32(ASM, EXP)
248*f5c631daSSadaf Ebrahimi #endif
249*f5c631daSSadaf Ebrahimi 
250*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
251*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_T32(ASM, EXP)       \
252*f5c631daSSadaf Ebrahimi   masm.UseT32();                           \
253*f5c631daSSadaf Ebrahimi   NEGATIVE_TEST({ masm.ASM; }, EXP, false) \
254*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();
255*f5c631daSSadaf Ebrahimi #else
256*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_T32(ASM, EXP)
257*f5c631daSSadaf Ebrahimi #endif
258*f5c631daSSadaf Ebrahimi 
259*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_BOTH(ASM, EXP) \
260*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(ASM, EXP)        \
261*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(ASM, EXP)
262*f5c631daSSadaf Ebrahimi 
263*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
264*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_A32_BLOCK(ASM, EXP) \
265*f5c631daSSadaf Ebrahimi   masm.UseA32();                           \
266*f5c631daSSadaf Ebrahimi   NEGATIVE_TEST(ASM, EXP, false)           \
267*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();
268*f5c631daSSadaf Ebrahimi #else
269*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_A32_BLOCK(ASM, EXP)
270*f5c631daSSadaf Ebrahimi #endif
271*f5c631daSSadaf Ebrahimi 
272*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
273*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_T32_BLOCK(ASM, EXP) \
274*f5c631daSSadaf Ebrahimi   masm.UseT32();                           \
275*f5c631daSSadaf Ebrahimi   NEGATIVE_TEST(ASM, EXP, false)           \
276*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();
277*f5c631daSSadaf Ebrahimi #else
278*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_T32_BLOCK(ASM, EXP)
279*f5c631daSSadaf Ebrahimi #endif
280*f5c631daSSadaf Ebrahimi 
281*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_BOTH_BLOCK(ASM, EXP) \
282*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32_BLOCK(ASM, EXP)        \
283*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32_BLOCK(ASM, EXP)
284*f5c631daSSadaf Ebrahimi #else
285*f5c631daSSadaf Ebrahimi // Skip negative tests.
286*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_A32(ASM, EXP)                         \
287*f5c631daSSadaf Ebrahimi   printf(                                                    \
288*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
289*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
290*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_T32(ASM, EXP)                         \
291*f5c631daSSadaf Ebrahimi   printf(                                                    \
292*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
293*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
294*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_BOTH(ASM, EXP)                        \
295*f5c631daSSadaf Ebrahimi   printf(                                                    \
296*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
297*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
298*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_A32_BLOCK(ASM, EXP)                   \
299*f5c631daSSadaf Ebrahimi   printf(                                                    \
300*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
301*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
302*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_T32_BLOCK(ASM, EXP)                   \
303*f5c631daSSadaf Ebrahimi   printf(                                                    \
304*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
305*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
306*f5c631daSSadaf Ebrahimi #define MUST_FAIL_TEST_BOTH_BLOCK(ASM, EXP)                  \
307*f5c631daSSadaf Ebrahimi   printf(                                                    \
308*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
309*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
310*f5c631daSSadaf Ebrahimi #endif
311*f5c631daSSadaf Ebrahimi 
312*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING
313*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
314*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_A32(ASM)        \
315*f5c631daSSadaf Ebrahimi   masm.UseA32();                         \
316*f5c631daSSadaf Ebrahimi   NEGATIVE_TEST({ masm.ASM; }, "", true) \
317*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();
318*f5c631daSSadaf Ebrahimi #else
319*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_A32(ASM)
320*f5c631daSSadaf Ebrahimi #endif
321*f5c631daSSadaf Ebrahimi 
322*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
323*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_T32(ASM)        \
324*f5c631daSSadaf Ebrahimi   masm.UseT32();                         \
325*f5c631daSSadaf Ebrahimi   NEGATIVE_TEST({ masm.ASM; }, "", true) \
326*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Reset();
327*f5c631daSSadaf Ebrahimi #else
328*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_T32(ASM)
329*f5c631daSSadaf Ebrahimi #endif
330*f5c631daSSadaf Ebrahimi 
331*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_BOTH(ASM) \
332*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(ASM)        \
333*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_T32(ASM)
334*f5c631daSSadaf Ebrahimi #else
335*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_A32(ASM)                            \
336*f5c631daSSadaf Ebrahimi   printf(                                                    \
337*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
338*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
339*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_T32(ASM)                            \
340*f5c631daSSadaf Ebrahimi   printf(                                                    \
341*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
342*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
343*f5c631daSSadaf Ebrahimi #define SHOULD_FAIL_TEST_BOTH(ASM)                           \
344*f5c631daSSadaf Ebrahimi   printf(                                                    \
345*f5c631daSSadaf Ebrahimi       "Skipping negative tests. To enable them, build with " \
346*f5c631daSSadaf Ebrahimi       "'negative_testing=on'.\n");
347*f5c631daSSadaf Ebrahimi #endif
348*f5c631daSSadaf Ebrahimi 
349*f5c631daSSadaf Ebrahimi class TestDisassembler : public PrintDisassembler {
350*f5c631daSSadaf Ebrahimi  public:
TestDisassembler(std::ostream & os,uint32_t program_counter)351*f5c631daSSadaf Ebrahimi   TestDisassembler(std::ostream& os,
352*f5c631daSSadaf Ebrahimi                    uint32_t program_counter)  // NOLINT(runtime/references)
353*f5c631daSSadaf Ebrahimi       : PrintDisassembler(os, program_counter) {}
354*f5c631daSSadaf Ebrahimi 
PrintCodeAddress(uint32_t code_address)355*f5c631daSSadaf Ebrahimi   virtual void PrintCodeAddress(uint32_t code_address) VIXL_OVERRIDE {
356*f5c631daSSadaf Ebrahimi     USE(code_address);
357*f5c631daSSadaf Ebrahimi   }
358*f5c631daSSadaf Ebrahimi 
PrintOpcode16(uint32_t opcode)359*f5c631daSSadaf Ebrahimi   virtual void PrintOpcode16(uint32_t opcode) VIXL_OVERRIDE { USE(opcode); }
360*f5c631daSSadaf Ebrahimi 
PrintOpcode32(uint32_t opcode)361*f5c631daSSadaf Ebrahimi   virtual void PrintOpcode32(uint32_t opcode) VIXL_OVERRIDE { USE(opcode); }
362*f5c631daSSadaf Ebrahimi 
DisassembleA32(const CodeBuffer & buffer,ptrdiff_t start,ptrdiff_t end)363*f5c631daSSadaf Ebrahimi   void DisassembleA32(const CodeBuffer& buffer,
364*f5c631daSSadaf Ebrahimi                       ptrdiff_t start,
365*f5c631daSSadaf Ebrahimi                       ptrdiff_t end) {
366*f5c631daSSadaf Ebrahimi     DisassembleA32Buffer(buffer.GetOffsetAddress<const uint32_t*>(start),
367*f5c631daSSadaf Ebrahimi                          end - start);
368*f5c631daSSadaf Ebrahimi   }
369*f5c631daSSadaf Ebrahimi 
DisassembleT32(const CodeBuffer & buffer,ptrdiff_t start,ptrdiff_t end)370*f5c631daSSadaf Ebrahimi   void DisassembleT32(const CodeBuffer& buffer,
371*f5c631daSSadaf Ebrahimi                       ptrdiff_t start,
372*f5c631daSSadaf Ebrahimi                       ptrdiff_t end) {
373*f5c631daSSadaf Ebrahimi     DisassembleT32Buffer(buffer.GetOffsetAddress<const uint16_t*>(start),
374*f5c631daSSadaf Ebrahimi                          end - start);
375*f5c631daSSadaf Ebrahimi   }
376*f5c631daSSadaf Ebrahimi };
377*f5c631daSSadaf Ebrahimi 
378*f5c631daSSadaf Ebrahimi 
TEST_T32(t32_disassembler_limit1)379*f5c631daSSadaf Ebrahimi TEST_T32(t32_disassembler_limit1) {
380*f5c631daSSadaf Ebrahimi   SETUP();
381*f5c631daSSadaf Ebrahimi 
382*f5c631daSSadaf Ebrahimi   masm.UseT32();
383*f5c631daSSadaf Ebrahimi   START_COMPARE()
384*f5c631daSSadaf Ebrahimi   masm.Add(r9, r10, r11);
385*f5c631daSSadaf Ebrahimi   masm.GetBuffer()->Emit16(kLowestT32_32Opcode >> 16);
386*f5c631daSSadaf Ebrahimi   END_COMPARE(
387*f5c631daSSadaf Ebrahimi       "add r9, r10, r11\n"
388*f5c631daSSadaf Ebrahimi       "?\n");
389*f5c631daSSadaf Ebrahimi 
390*f5c631daSSadaf Ebrahimi   CLEANUP();
391*f5c631daSSadaf Ebrahimi }
392*f5c631daSSadaf Ebrahimi 
393*f5c631daSSadaf Ebrahimi 
TEST_T32(t32_disassembler_limit2)394*f5c631daSSadaf Ebrahimi TEST_T32(t32_disassembler_limit2) {
395*f5c631daSSadaf Ebrahimi   SETUP();
396*f5c631daSSadaf Ebrahimi 
397*f5c631daSSadaf Ebrahimi   masm.UseT32();
398*f5c631daSSadaf Ebrahimi   START_COMPARE()
399*f5c631daSSadaf Ebrahimi   masm.Add(r9, r10, r11);
400*f5c631daSSadaf Ebrahimi   masm.Add(r0, r0, r1);
401*f5c631daSSadaf Ebrahimi   END_COMPARE(
402*f5c631daSSadaf Ebrahimi       "add r9, r10, r11\n"
403*f5c631daSSadaf Ebrahimi       "add r0, r1\n");
404*f5c631daSSadaf Ebrahimi 
405*f5c631daSSadaf Ebrahimi   CLEANUP();
406*f5c631daSSadaf Ebrahimi }
407*f5c631daSSadaf Ebrahimi 
408*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_orn)409*f5c631daSSadaf Ebrahimi TEST(macro_assembler_orn) {
410*f5c631daSSadaf Ebrahimi   SETUP();
411*f5c631daSSadaf Ebrahimi 
412*f5c631daSSadaf Ebrahimi   // - Identities.
413*f5c631daSSadaf Ebrahimi 
414*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orn(r0, r1, 0), "mvn r0, #0\n");
415*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orn(r0, r0, 0xffffffff), "");
416*f5c631daSSadaf Ebrahimi 
417*f5c631daSSadaf Ebrahimi   // - Immediate form. This form does not need macro-assembler support
418*f5c631daSSadaf Ebrahimi   //   for T32.
419*f5c631daSSadaf Ebrahimi 
420*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
421*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r1, 1),
422*f5c631daSSadaf Ebrahimi               "mvn r0, #1\n"
423*f5c631daSSadaf Ebrahimi               "orr r0, r1, r0\n");
424*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
425*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orns(r0, r0, 1),
426*f5c631daSSadaf Ebrahimi               "mvn ip, #1\n"
427*f5c631daSSadaf Ebrahimi               "orrs r0, ip\n");
428*f5c631daSSadaf Ebrahimi 
429*f5c631daSSadaf Ebrahimi   //  - Too large immediate form.
430*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orn(r0, r1, 0x00ffffff), "orr r0, r1, #0xff000000\n");
431*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orn(r0, r1, 0xff00ffff), "orr r0, r1, #0xff0000\n");
432*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orns(r0, r1, 0x00ffffff), "orrs r0, r1, #0xff000000\n");
433*f5c631daSSadaf Ebrahimi 
434*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orns(r0, r1, 0xabcd2345),
435*f5c631daSSadaf Ebrahimi               "mov ip, #9029\n"
436*f5c631daSSadaf Ebrahimi               "movt ip, #43981\n"
437*f5c631daSSadaf Ebrahimi               "mvn r0, ip\n"
438*f5c631daSSadaf Ebrahimi               "orrs r0, r1, r0\n");
439*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orn(r0, r1, 0xabcd2345),
440*f5c631daSSadaf Ebrahimi               "mov r0, #9029\n"
441*f5c631daSSadaf Ebrahimi               "movt r0, #43981\n"
442*f5c631daSSadaf Ebrahimi               "orn r0, r1, r0\n");
443*f5c631daSSadaf Ebrahimi 
444*f5c631daSSadaf Ebrahimi   // - Plain register form. This form does not need macro-assembler
445*f5c631daSSadaf Ebrahimi   //   support for T32.
446*f5c631daSSadaf Ebrahimi 
447*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
448*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r1, r2),
449*f5c631daSSadaf Ebrahimi               "mvn r0, r2\n"
450*f5c631daSSadaf Ebrahimi               "orr r0, r1, r0\n");
451*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
452*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r0, r1),
453*f5c631daSSadaf Ebrahimi               "mvn ip, r1\n"
454*f5c631daSSadaf Ebrahimi               "orr r0, ip\n");
455*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
456*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r1, r0),
457*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
458*f5c631daSSadaf Ebrahimi               "orr r0, r1, r0\n");
459*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
460*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r0, r0),
461*f5c631daSSadaf Ebrahimi               "mvn ip, r0\n"
462*f5c631daSSadaf Ebrahimi               "orr r0, ip\n");
463*f5c631daSSadaf Ebrahimi 
464*f5c631daSSadaf Ebrahimi   // - Shifted register form. This form does not need macro-assembler
465*f5c631daSSadaf Ebrahimi   //   support for T32.
466*f5c631daSSadaf Ebrahimi 
467*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
468*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r1, Operand(r2, LSL, 1)),
469*f5c631daSSadaf Ebrahimi               "mvn r0, r2, lsl #1\n"
470*f5c631daSSadaf Ebrahimi               "orr r0, r1, r0\n");
471*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
472*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orns(r0, r0, Operand(r2, LSR, 2)),
473*f5c631daSSadaf Ebrahimi               "mvn ip, r2, lsr #2\n"
474*f5c631daSSadaf Ebrahimi               "orrs r0, ip\n");
475*f5c631daSSadaf Ebrahimi 
476*f5c631daSSadaf Ebrahimi   // - Register shifted register form.
477*f5c631daSSadaf Ebrahimi 
478*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
479*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r1, Operand(r2, LSL, r3)),
480*f5c631daSSadaf Ebrahimi               "mvn r0, r2, lsl r3\n"
481*f5c631daSSadaf Ebrahimi               "orr r0, r1, r0\n");
482*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orn(r0, r1, Operand(r2, LSL, r3)),
483*f5c631daSSadaf Ebrahimi               "lsl r0, r2, r3\n"
484*f5c631daSSadaf Ebrahimi               "orn r0, r1, r0\n");
485*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
486*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orns(r0, r0, Operand(r2, LSR, r3)),
487*f5c631daSSadaf Ebrahimi               "mvn ip, r2, lsr r3\n"
488*f5c631daSSadaf Ebrahimi               "orrs r0, ip\n");
489*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orns(r0, r0, Operand(r2, LSR, r3)),
490*f5c631daSSadaf Ebrahimi               "lsr ip, r2, r3\n"
491*f5c631daSSadaf Ebrahimi               "orns r0, ip\n");
492*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
493*f5c631daSSadaf Ebrahimi   COMPARE_A32(Orn(r0, r0, Operand(r0, ASR, r3)),
494*f5c631daSSadaf Ebrahimi               "mvn ip, r0, asr r3\n"
495*f5c631daSSadaf Ebrahimi               "orr r0, ip\n");
496*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orn(r0, r0, Operand(r0, ASR, r3)),
497*f5c631daSSadaf Ebrahimi               "asr ip, r0, r3\n"
498*f5c631daSSadaf Ebrahimi               "orn r0, ip\n");
499*f5c631daSSadaf Ebrahimi   CLEANUP();
500*f5c631daSSadaf Ebrahimi }
501*f5c631daSSadaf Ebrahimi 
502*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_t32_rsc)503*f5c631daSSadaf Ebrahimi TEST(macro_assembler_t32_rsc) {
504*f5c631daSSadaf Ebrahimi   SETUP();
505*f5c631daSSadaf Ebrahimi 
506*f5c631daSSadaf Ebrahimi   // - Immediate form. We can always re-use `rn`.
507*f5c631daSSadaf Ebrahimi 
508*f5c631daSSadaf Ebrahimi   // No need for temporay registers.
509*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsc(r0, r1, 1),
510*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
511*f5c631daSSadaf Ebrahimi               "adc r0, #1\n");
512*f5c631daSSadaf Ebrahimi   // No need for temporay registers.
513*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r0, 2),
514*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
515*f5c631daSSadaf Ebrahimi               "adcs r0, #2\n");
516*f5c631daSSadaf Ebrahimi 
517*f5c631daSSadaf Ebrahimi   //  - Too large immediate form.
518*f5c631daSSadaf Ebrahimi 
519*f5c631daSSadaf Ebrahimi   // TODO: optimize this.
520*f5c631daSSadaf Ebrahimi   COMPARE_A32(Rsc(r0, r1, 0x00ffffff),
521*f5c631daSSadaf Ebrahimi               "mvn r0, #4278190080\n"
522*f5c631daSSadaf Ebrahimi               "rsc r0, r1, r0\n");
523*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r1, 0x00ffffff),
524*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
525*f5c631daSSadaf Ebrahimi               "mvn ip, #4278190080\n"
526*f5c631daSSadaf Ebrahimi               "adcs r0, ip\n");
527*f5c631daSSadaf Ebrahimi   COMPARE_A32(Rsc(r0, r0, 0x00ffffff),
528*f5c631daSSadaf Ebrahimi               "mvn ip, #4278190080\n"
529*f5c631daSSadaf Ebrahimi               "rsc r0, ip\n");
530*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r0, 0x00ffffff),
531*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
532*f5c631daSSadaf Ebrahimi               "mvn ip, #4278190080\n"
533*f5c631daSSadaf Ebrahimi               "adcs r0, ip\n");
534*f5c631daSSadaf Ebrahimi 
535*f5c631daSSadaf Ebrahimi   COMPARE_A32(Rsc(r0, r1, 0xabcd2345),
536*f5c631daSSadaf Ebrahimi               "mov r0, #9029\n"
537*f5c631daSSadaf Ebrahimi               "movt r0, #43981\n"
538*f5c631daSSadaf Ebrahimi               "rsc r0, r1, r0\n");
539*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r1, 0xabcd2345),
540*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
541*f5c631daSSadaf Ebrahimi               "mov ip, #56506\n"
542*f5c631daSSadaf Ebrahimi               "movt ip, #21554\n"
543*f5c631daSSadaf Ebrahimi               "sbcs r0, ip\n");
544*f5c631daSSadaf Ebrahimi   COMPARE_A32(Rsc(r0, r0, 0xabcd2345),
545*f5c631daSSadaf Ebrahimi               "mov ip, #9029\n"
546*f5c631daSSadaf Ebrahimi               "movt ip, #43981\n"
547*f5c631daSSadaf Ebrahimi               "rsc r0, ip\n");
548*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r0, 0xabcd2345),
549*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
550*f5c631daSSadaf Ebrahimi               "mov ip, #56506\n"
551*f5c631daSSadaf Ebrahimi               "movt ip, #21554\n"
552*f5c631daSSadaf Ebrahimi               "sbcs r0, ip\n");
553*f5c631daSSadaf Ebrahimi 
554*f5c631daSSadaf Ebrahimi   // - Plain register form.
555*f5c631daSSadaf Ebrahimi 
556*f5c631daSSadaf Ebrahimi   // No need for temporary registers.
557*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r1, r2),
558*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
559*f5c631daSSadaf Ebrahimi               "adcs r0, r2\n");
560*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
561*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r1, r1),
562*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
563*f5c631daSSadaf Ebrahimi               "adcs r0, r1\n");
564*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
565*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r0, r0),
566*f5c631daSSadaf Ebrahimi               "mvn ip, r0\n"
567*f5c631daSSadaf Ebrahimi               "adcs r0, ip, r0\n");
568*f5c631daSSadaf Ebrahimi 
569*f5c631daSSadaf Ebrahimi   // - Shifted register form.
570*f5c631daSSadaf Ebrahimi 
571*f5c631daSSadaf Ebrahimi   // No need for temporay registers.
572*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsc(r0, r1, Operand(r2, LSL, 1)),
573*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
574*f5c631daSSadaf Ebrahimi               "adc r0, r2, lsl #1\n");
575*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
576*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r1, Operand(r0, LSR, 2)),
577*f5c631daSSadaf Ebrahimi               "mvn ip, r1\n"
578*f5c631daSSadaf Ebrahimi               "adcs r0, ip, r0, lsr #2\n");
579*f5c631daSSadaf Ebrahimi   // Use r0 as the temporary register.
580*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsc(r0, r1, Operand(r1, ASR, 3)),
581*f5c631daSSadaf Ebrahimi               "mvn r0, r1\n"
582*f5c631daSSadaf Ebrahimi               "adc r0, r1, asr #3\n");
583*f5c631daSSadaf Ebrahimi   // Use ip as the temporary register.
584*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r0, Operand(r0, ROR, 4)),
585*f5c631daSSadaf Ebrahimi               "mvn ip, r0\n"
586*f5c631daSSadaf Ebrahimi               "adcs r0, ip, r0, ror #4\n");
587*f5c631daSSadaf Ebrahimi 
588*f5c631daSSadaf Ebrahimi   // - Register shifted register form. The macro-assembler handles this form in
589*f5c631daSSadaf Ebrahimi   //   two steps. First, a shift instruction is generated from the operand. And
590*f5c631daSSadaf Ebrahimi   //   finally the operation is reduced to its plain register form.
591*f5c631daSSadaf Ebrahimi 
592*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsc(r0, r1, Operand(r2, LSL, r3)),
593*f5c631daSSadaf Ebrahimi               "lsl r0, r2, r3\n"
594*f5c631daSSadaf Ebrahimi               "mvn ip, r1\n"
595*f5c631daSSadaf Ebrahimi               "adc r0, ip, r0\n");
596*f5c631daSSadaf Ebrahimi   // Use r0 and ip as the temporary register.
597*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r1, Operand(r1, LSR, r3)),
598*f5c631daSSadaf Ebrahimi               "lsr r0, r1, r3\n"
599*f5c631daSSadaf Ebrahimi               "mvn ip, r1\n"
600*f5c631daSSadaf Ebrahimi               "adcs r0, ip, r0\n");
601*f5c631daSSadaf Ebrahimi   // Use ip and r0 as the temporary register.
602*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsc(r0, r0, Operand(r2, ASR, r3)),
603*f5c631daSSadaf Ebrahimi               "asr ip, r2, r3\n"
604*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
605*f5c631daSSadaf Ebrahimi               "adc r0, ip\n");
606*f5c631daSSadaf Ebrahimi   // Use ip and r0 as the temporary register.
607*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rscs(r0, r0, Operand(r0, ROR, r3)),
608*f5c631daSSadaf Ebrahimi               "ror ip, r0, r3\n"
609*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
610*f5c631daSSadaf Ebrahimi               "adcs r0, ip\n");
611*f5c631daSSadaf Ebrahimi   // Use ip and r0 as the temporary register.
612*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsc(r0, r0, Operand(r0, LSL, r0)),
613*f5c631daSSadaf Ebrahimi               "lsl ip, r0, r0\n"
614*f5c631daSSadaf Ebrahimi               "mvn r0, r0\n"
615*f5c631daSSadaf Ebrahimi               "adc r0, ip\n");
616*f5c631daSSadaf Ebrahimi 
617*f5c631daSSadaf Ebrahimi   CLEANUP();
618*f5c631daSSadaf Ebrahimi }
619*f5c631daSSadaf Ebrahimi 
620*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_t32_register_shift_register)621*f5c631daSSadaf Ebrahimi TEST(macro_assembler_t32_register_shift_register) {
622*f5c631daSSadaf Ebrahimi   SETUP();
623*f5c631daSSadaf Ebrahimi 
624*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adc(r0, r1, Operand(r2, LSL, r3)),
625*f5c631daSSadaf Ebrahimi               "lsl r0, r2, r3\n"
626*f5c631daSSadaf Ebrahimi               "adc r0, r1, r0\n");
627*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adcs(r0, r0, Operand(r2, LSR, r3)),
628*f5c631daSSadaf Ebrahimi               "lsr ip, r2, r3\n"
629*f5c631daSSadaf Ebrahimi               "adcs r0, ip\n");
630*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, r0, Operand(r0, ASR, r3)),
631*f5c631daSSadaf Ebrahimi               "asr ip, r0, r3\n"
632*f5c631daSSadaf Ebrahimi               "add r0, ip\n");
633*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adds(r0, r0, Operand(r0, ROR, r0)),
634*f5c631daSSadaf Ebrahimi               "ror ip, r0, r0\n"
635*f5c631daSSadaf Ebrahimi               "adds r0, ip\n");
636*f5c631daSSadaf Ebrahimi 
637*f5c631daSSadaf Ebrahimi   CLEANUP();
638*f5c631daSSadaf Ebrahimi }
639*f5c631daSSadaf Ebrahimi 
640*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_big_offset)641*f5c631daSSadaf Ebrahimi TEST(macro_assembler_big_offset) {
642*f5c631daSSadaf Ebrahimi   SETUP();
643*f5c631daSSadaf Ebrahimi 
644*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldr(r0, MemOperand(r1, 0xfff123)),
645*f5c631daSSadaf Ebrahimi                "add r0, r1, #1044480\n"  // #0xff000
646*f5c631daSSadaf Ebrahimi                "add r0, #15728640\n"     // #0x00f00000
647*f5c631daSSadaf Ebrahimi                "ldr r0, [r0, #291]\n");  // #0x123
648*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldr(r0, MemOperand(r1, 0xff123)),
649*f5c631daSSadaf Ebrahimi                "add r0, r1, #1044480\n"  // #0xff000
650*f5c631daSSadaf Ebrahimi                "ldr r0, [r0, #291]\n");  // #0x123
651*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldr(r0, MemOperand(r1, -0xff123)),
652*f5c631daSSadaf Ebrahimi                "sub r0, r1, #1048576\n"   // #0x100000
653*f5c631daSSadaf Ebrahimi                "ldr r0, [r0, #3805]\n");  // #0xedd
654*f5c631daSSadaf Ebrahimi 
655*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(r1, 0xfff123, PreIndex)),
656*f5c631daSSadaf Ebrahimi               "add r1, #1044480\n"       // #0xff000
657*f5c631daSSadaf Ebrahimi               "add r1, #15728640\n"      // #0x00f00000
658*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #291]!\n");  // #0x123
659*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(r1, 0xff123, PreIndex)),
660*f5c631daSSadaf Ebrahimi               "add r1, #1044480\n"       // #0xff000
661*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #291]!\n");  // #0x123
662*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(r1, -0xff123, PreIndex)),
663*f5c631daSSadaf Ebrahimi               "sub r1, #1048576\n"        // #0x100000
664*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #3805]!\n");  // #0xedd
665*f5c631daSSadaf Ebrahimi 
666*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, 0xfff12, PreIndex)),
667*f5c631daSSadaf Ebrahimi               "add r1, #65280\n"        // #0xff00
668*f5c631daSSadaf Ebrahimi               "add r1, #983040\n"       // #0x000f0000
669*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #18]!\n");  // #0x12
670*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, 0xff12, PreIndex)),
671*f5c631daSSadaf Ebrahimi               "add r1, #65280\n"        // #0xff00
672*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #18]!\n");  // #0x12
673*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, -0xff12, PreIndex)),
674*f5c631daSSadaf Ebrahimi               "sub r1, #65536\n"         // #0x10000
675*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #238]!\n");  // #0xee
676*f5c631daSSadaf Ebrahimi 
677*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(r1, 0xfff123, PostIndex)),
678*f5c631daSSadaf Ebrahimi               "ldr r0, [r1], #291\n"   // #0x123
679*f5c631daSSadaf Ebrahimi               "add r1, #1044480\n"     // #0xff000
680*f5c631daSSadaf Ebrahimi               "add r1, #15728640\n");  // #0x00f00000
681*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(r1, 0xff123, PostIndex)),
682*f5c631daSSadaf Ebrahimi               "ldr r0, [r1], #291\n"  // #0x123
683*f5c631daSSadaf Ebrahimi               "add r1, #1044480\n");  // #0xff000
684*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(r1, -0xff123, PostIndex)),
685*f5c631daSSadaf Ebrahimi               "ldr r0, [r1], #3805\n"  // #0xedd
686*f5c631daSSadaf Ebrahimi               "sub r1, #1048576\n");   // #0x100000
687*f5c631daSSadaf Ebrahimi 
688*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, 0xfff12, PostIndex)),
689*f5c631daSSadaf Ebrahimi               "ldr r0, [r1], #18\n"  // #0x12
690*f5c631daSSadaf Ebrahimi               "add r1, #65280\n"     // #0xff00
691*f5c631daSSadaf Ebrahimi               "add r1, #983040\n");  // #0x000f0000
692*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, 0xff12, PostIndex)),
693*f5c631daSSadaf Ebrahimi               "ldr r0, [r1], #18\n"  // #0x12
694*f5c631daSSadaf Ebrahimi               "add r1, #65280\n");   // #0xff00
695*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, -0xff12, PostIndex)),
696*f5c631daSSadaf Ebrahimi               "ldr r0, [r1], #238\n"  // #0xee
697*f5c631daSSadaf Ebrahimi               "sub r1, #65536\n");    // #0x10000
698*f5c631daSSadaf Ebrahimi 
699*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrh(r0, MemOperand(r1, 0xfff123)),
700*f5c631daSSadaf Ebrahimi               "add r0, r1, #61696\n"    // #0xf100
701*f5c631daSSadaf Ebrahimi               "add r0, #16711680\n"     // #0x00ff0000
702*f5c631daSSadaf Ebrahimi               "ldrh r0, [r0, #35]\n");  // #0x23
703*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(r0, MemOperand(r1, 0xfff123)),
704*f5c631daSSadaf Ebrahimi               "add r0, r1, #1044480\n"   // #0xff000
705*f5c631daSSadaf Ebrahimi               "add r0, #15728640\n"      // #0x00f00000
706*f5c631daSSadaf Ebrahimi               "ldrh r0, [r0, #291]\n");  // #0x123
707*f5c631daSSadaf Ebrahimi 
708*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrh(r0, MemOperand(r1, 0xff123)),
709*f5c631daSSadaf Ebrahimi               "add r0, r1, #61696\n"    // #0xf100
710*f5c631daSSadaf Ebrahimi               "add r0, #983040\n"       // #0x000f0000
711*f5c631daSSadaf Ebrahimi               "ldrh r0, [r0, #35]\n");  // #0x23
712*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(r0, MemOperand(r1, 0xff123)),
713*f5c631daSSadaf Ebrahimi               "add r0, r1, #1044480\n"   // #0xff000
714*f5c631daSSadaf Ebrahimi               "ldrh r0, [r0, #291]\n");  // #0x123
715*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrh(r0, MemOperand(r1, -0xff123)),
716*f5c631daSSadaf Ebrahimi               "sub r0, r1, #61952\n"     // #0xf200
717*f5c631daSSadaf Ebrahimi               "sub r0, #983040\n"        // #0x000f0000
718*f5c631daSSadaf Ebrahimi               "ldrh r0, [r0, #221]\n");  // #0xdd
719*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(r0, MemOperand(r1, -0xff123)),
720*f5c631daSSadaf Ebrahimi               "sub r0, r1, #1048576\n"    // #0x100000
721*f5c631daSSadaf Ebrahimi               "ldrh r0, [r0, #3805]\n");  // #0xedd
722*f5c631daSSadaf Ebrahimi 
723*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldr(r0, MemOperand(r0, 0xfff12, PreIndex)),
724*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldr' instruction.\n");
725*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldr(r0, MemOperand(r0, 0xfff12, PostIndex)),
726*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldr' instruction.\n");
727*f5c631daSSadaf Ebrahimi   CLEANUP();
728*f5c631daSSadaf Ebrahimi }
729*f5c631daSSadaf Ebrahimi 
730*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_load)731*f5c631daSSadaf Ebrahimi TEST(macro_assembler_load) {
732*f5c631daSSadaf Ebrahimi   SETUP();
733*f5c631daSSadaf Ebrahimi 
734*f5c631daSSadaf Ebrahimi   // Register base and offset that we can encode in both A1 and T1.
735*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldr(r0, MemOperand(r1, r8, Offset)), "ldr r0, [r1, r8]\n");
736*f5c631daSSadaf Ebrahimi 
737*f5c631daSSadaf Ebrahimi   // Negative register offset. Use the destination as a scratch register,
738*f5c631daSSadaf Ebrahimi   // regardless of the values of the base and offset register.
739*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r0, minus, r0, Offset)),
740*f5c631daSSadaf Ebrahimi               "sub r0, r0\n"
741*f5c631daSSadaf Ebrahimi               "ldr r0, [r0]\n");
742*f5c631daSSadaf Ebrahimi 
743*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r0, minus, r1, Offset)),
744*f5c631daSSadaf Ebrahimi               "sub r0, r1\n"
745*f5c631daSSadaf Ebrahimi               "ldr r0, [r0]\n");
746*f5c631daSSadaf Ebrahimi 
747*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, minus, r0, Offset)),
748*f5c631daSSadaf Ebrahimi               "sub r0, r1, r0\n"
749*f5c631daSSadaf Ebrahimi               "ldr r0, [r0]\n");
750*f5c631daSSadaf Ebrahimi 
751*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, minus, r2, Offset)),
752*f5c631daSSadaf Ebrahimi               "sub r0, r1, r2\n"
753*f5c631daSSadaf Ebrahimi               "ldr r0, [r0]\n");
754*f5c631daSSadaf Ebrahimi 
755*f5c631daSSadaf Ebrahimi   // Pre-index negative offset.
756*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, minus, r2, PreIndex)),
757*f5c631daSSadaf Ebrahimi               "sub r1, r2\n"
758*f5c631daSSadaf Ebrahimi               "ldr r0, [r1]\n");
759*f5c631daSSadaf Ebrahimi 
760*f5c631daSSadaf Ebrahimi   // Post-index negative offset.
761*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(r1, minus, r2, PostIndex)),
762*f5c631daSSadaf Ebrahimi               "ldr r0, [r1]\n"
763*f5c631daSSadaf Ebrahimi               "sub r1, r2\n");
764*f5c631daSSadaf Ebrahimi 
765*f5c631daSSadaf Ebrahimi   // SP is allowed as base, offset and destination.
766*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldr(sp, MemOperand(sp, sp, Offset)), "ldr sp, [sp, sp]\n");
767*f5c631daSSadaf Ebrahimi 
768*f5c631daSSadaf Ebrahimi   // PC is allowed as destination - make sure it is not used as a temporary
769*f5c631daSSadaf Ebrahimi   // register.
770*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldr(pc, MemOperand(r0, r0, Offset)), "ldr pc, [r0, r0]\n");
771*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(pc, MemOperand(r0, r0, PreIndex)), "ldr pc, [r0, r0]!\n");
772*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(pc, MemOperand(r0, r0, PreIndex)),
773*f5c631daSSadaf Ebrahimi               "add r0, r0\n"
774*f5c631daSSadaf Ebrahimi               "ldr pc, [r0]\n");
775*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(pc, MemOperand(r0, r0, PostIndex)), "ldr pc, [r0], r0\n");
776*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(pc, MemOperand(r0, r0, PostIndex)),
777*f5c631daSSadaf Ebrahimi               "ldr pc, [r0]\n"
778*f5c631daSSadaf Ebrahimi               "add r0, r0\n");
779*f5c631daSSadaf Ebrahimi 
780*f5c631daSSadaf Ebrahimi   // PC is allowed as register base in the offset variant only for A32.
781*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(pc, r0, Offset)), "ldr r0, [pc, r0]\n");
782*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(pc, r0, Offset)),
783*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores with"
784*f5c631daSSadaf Ebrahimi                      " a PC base register for T32.\n");
785*f5c631daSSadaf Ebrahimi 
786*f5c631daSSadaf Ebrahimi   // PC is not allowed as register base in the pre-index and post-index
787*f5c631daSSadaf Ebrahimi   // variants.
788*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(pc, r0, PreIndex)),
789*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
790*f5c631daSSadaf Ebrahimi                      "with a PC base register in pre-index or post-index "
791*f5c631daSSadaf Ebrahimi                      "mode.\n");
792*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(pc, r0, PostIndex)),
793*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
794*f5c631daSSadaf Ebrahimi                      "with a PC base register in pre-index or post-index "
795*f5c631daSSadaf Ebrahimi                      "mode.\n");
796*f5c631daSSadaf Ebrahimi 
797*f5c631daSSadaf Ebrahimi   // We don't convert loads with PC as the register offset.
798*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(r0, minus, pc, Offset)),
799*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
800*f5c631daSSadaf Ebrahimi                      "with a PC offset register.\n");
801*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(r0, pc, PreIndex)),
802*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
803*f5c631daSSadaf Ebrahimi                      "with a PC offset register.\n");
804*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(r0, pc, PostIndex)),
805*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
806*f5c631daSSadaf Ebrahimi                      "with a PC offset register.\n");
807*f5c631daSSadaf Ebrahimi 
808*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldr(r0, MemOperand(r0, Sign(plus), pc, Offset)),
809*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
810*f5c631daSSadaf Ebrahimi 
811*f5c631daSSadaf Ebrahimi   // TODO: PC should not be allowed as register base in A32 with pre-index
812*f5c631daSSadaf Ebrahimi   //       and post-index (unpredictable).
813*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Ldr(r0, MemOperand(pc, r0, PreIndex)));
814*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Ldr(r0, MemOperand(pc, r0, PostIndex)));
815*f5c631daSSadaf Ebrahimi 
816*f5c631daSSadaf Ebrahimi   // TODO: load with the same register used as base and as destination
817*f5c631daSSadaf Ebrahimi   //       should fail to assemble (unpredictable).
818*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Ldr(r0, MemOperand(r0, r1, PreIndex)));
819*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Ldr(r0, MemOperand(r0, r1, PostIndex)));
820*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(r0, r1, PreIndex)),
821*f5c631daSSadaf Ebrahimi                      "Ill-formed 'ldr' instruction.\n");
822*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Ldr(r0, MemOperand(r0, r1, PostIndex)),
823*f5c631daSSadaf Ebrahimi                      "Ill-formed 'ldr' instruction.\n");
824*f5c631daSSadaf Ebrahimi 
825*f5c631daSSadaf Ebrahimi   CLEANUP();
826*f5c631daSSadaf Ebrahimi }
827*f5c631daSSadaf Ebrahimi 
828*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_store)829*f5c631daSSadaf Ebrahimi TEST(macro_assembler_store) {
830*f5c631daSSadaf Ebrahimi   SETUP();
831*f5c631daSSadaf Ebrahimi 
832*f5c631daSSadaf Ebrahimi   // Register base and offset that we can encode in both A1 and T1.
833*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Str(r0, MemOperand(r1, r8, Offset)), "str r0, [r1, r8]\n");
834*f5c631daSSadaf Ebrahimi 
835*f5c631daSSadaf Ebrahimi   // Negative register offset.
836*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(r0, MemOperand(r0, minus, r0, Offset)),
837*f5c631daSSadaf Ebrahimi               "sub ip, r0, r0\n"
838*f5c631daSSadaf Ebrahimi               "str r0, [ip]\n");
839*f5c631daSSadaf Ebrahimi 
840*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(r0, MemOperand(r0, minus, r1, Offset)),
841*f5c631daSSadaf Ebrahimi               "sub ip, r0, r1\n"
842*f5c631daSSadaf Ebrahimi               "str r0, [ip]\n");
843*f5c631daSSadaf Ebrahimi 
844*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(r0, MemOperand(r1, minus, r0, Offset)),
845*f5c631daSSadaf Ebrahimi               "sub ip, r1, r0\n"
846*f5c631daSSadaf Ebrahimi               "str r0, [ip]\n");
847*f5c631daSSadaf Ebrahimi 
848*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(r0, MemOperand(r1, minus, r2, Offset)),
849*f5c631daSSadaf Ebrahimi               "sub ip, r1, r2\n"
850*f5c631daSSadaf Ebrahimi               "str r0, [ip]\n");
851*f5c631daSSadaf Ebrahimi 
852*f5c631daSSadaf Ebrahimi   // Pre-index negative offset.
853*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(r0, MemOperand(r1, minus, r2, PreIndex)),
854*f5c631daSSadaf Ebrahimi               "sub r1, r2\n"
855*f5c631daSSadaf Ebrahimi               "str r0, [r1]\n");
856*f5c631daSSadaf Ebrahimi 
857*f5c631daSSadaf Ebrahimi   // Post-index negative offset.
858*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(r0, MemOperand(r1, minus, r2, PostIndex)),
859*f5c631daSSadaf Ebrahimi               "str r0, [r1]\n"
860*f5c631daSSadaf Ebrahimi               "sub r1, r2\n");
861*f5c631daSSadaf Ebrahimi 
862*f5c631daSSadaf Ebrahimi   // SP is allowed as base, offset and source.
863*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Str(sp, MemOperand(sp, sp, Offset)), "str sp, [sp, sp]\n");
864*f5c631daSSadaf Ebrahimi 
865*f5c631daSSadaf Ebrahimi   COMPARE_A32(Str(pc, MemOperand(r0, r0, Offset)), "str pc, [r0, r0]\n");
866*f5c631daSSadaf Ebrahimi   COMPARE_A32(Str(pc, MemOperand(r0, r0, PreIndex)), "str pc, [r0, r0]!\n");
867*f5c631daSSadaf Ebrahimi   COMPARE_A32(Str(pc, MemOperand(r0, r0, PostIndex)), "str pc, [r0], r0\n");
868*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(pc, MemOperand(r0, r0, Offset)),
869*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
870*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(pc, MemOperand(r0, r0, PreIndex)),
871*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
872*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(pc, MemOperand(r0, r0, PostIndex)),
873*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
874*f5c631daSSadaf Ebrahimi 
875*f5c631daSSadaf Ebrahimi   // PC is allowed as register base in the offset variant only for A32.
876*f5c631daSSadaf Ebrahimi   COMPARE_A32(Str(r0, MemOperand(pc, r0, Offset)), "str r0, [pc, r0]\n");
877*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(pc, r0, Offset)),
878*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores with"
879*f5c631daSSadaf Ebrahimi                      " a PC base register for T32.\n");
880*f5c631daSSadaf Ebrahimi 
881*f5c631daSSadaf Ebrahimi   // PC is not allowed as register base in the pre-index and post-index
882*f5c631daSSadaf Ebrahimi   // variants.
883*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(pc, r0, PreIndex)),
884*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
885*f5c631daSSadaf Ebrahimi                      "with a PC base register in pre-index or post-index "
886*f5c631daSSadaf Ebrahimi                      "mode.\n");
887*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(pc, r0, PostIndex)),
888*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
889*f5c631daSSadaf Ebrahimi                      "with a PC base register in pre-index or post-index "
890*f5c631daSSadaf Ebrahimi                      "mode.\n");
891*f5c631daSSadaf Ebrahimi 
892*f5c631daSSadaf Ebrahimi   // We don't convert loads with PC as the register offset.
893*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(r0, minus, pc, Offset)),
894*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
895*f5c631daSSadaf Ebrahimi                      "with a PC offset register.\n");
896*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(r0, pc, PreIndex)),
897*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
898*f5c631daSSadaf Ebrahimi                      "with a PC offset register.\n");
899*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(r0, pc, PostIndex)),
900*f5c631daSSadaf Ebrahimi                      "The MacroAssembler does not convert loads and stores "
901*f5c631daSSadaf Ebrahimi                      "with a PC offset register.\n");
902*f5c631daSSadaf Ebrahimi 
903*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Str(r0, MemOperand(r0, Sign(plus), pc, Offset)),
904*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
905*f5c631daSSadaf Ebrahimi 
906*f5c631daSSadaf Ebrahimi   // TODO: PC should not be allowed as register base in A32 with pre-index
907*f5c631daSSadaf Ebrahimi   //       and post-index (unpredictable).
908*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Str(r0, MemOperand(pc, r0, PreIndex)));
909*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Str(r0, MemOperand(pc, r0, PostIndex)));
910*f5c631daSSadaf Ebrahimi 
911*f5c631daSSadaf Ebrahimi   // TODO: store with the same register used as base and as source
912*f5c631daSSadaf Ebrahimi   //       should fail to assemble (unpredictable).
913*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Str(r0, MemOperand(r0, r1, PreIndex)));
914*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Str(r0, MemOperand(r0, r1, PostIndex)));
915*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(r0, r1, PreIndex)),
916*f5c631daSSadaf Ebrahimi                      "Ill-formed 'str' instruction.\n");
917*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Str(r0, MemOperand(r0, r1, PostIndex)),
918*f5c631daSSadaf Ebrahimi                      "Ill-formed 'str' instruction.\n");
919*f5c631daSSadaf Ebrahimi 
920*f5c631daSSadaf Ebrahimi   CLEANUP();
921*f5c631daSSadaf Ebrahimi }
922*f5c631daSSadaf Ebrahimi 
923*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_ldrd)924*f5c631daSSadaf Ebrahimi TEST(macro_assembler_ldrd) {
925*f5c631daSSadaf Ebrahimi   SETUP();
926*f5c631daSSadaf Ebrahimi 
927*f5c631daSSadaf Ebrahimi   // - Tests with no offset.
928*f5c631daSSadaf Ebrahimi 
929*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrd(r0, r1, MemOperand(r3)), "ldrd r0, r1, [r3]\n");
930*f5c631daSSadaf Ebrahimi   // Destination registers need to start with a even numbered register on A32.
931*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(r1, r2, MemOperand(r3)),
932*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
933*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r1, r2, MemOperand(r3)), "ldrd r1, r2, [r3]\n");
934*f5c631daSSadaf Ebrahimi   // Registers need to be adjacent on A32.
935*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(r0, r2, MemOperand(r1)),
936*f5c631daSSadaf Ebrahimi                      "Ill-formed 'ldrd' instruction.\n");
937*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r2, MemOperand(r1)), "ldrd r0, r2, [r1]\n");
938*f5c631daSSadaf Ebrahimi 
939*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrd(r0, r1, MemOperand(r2)), "ldrd r0, r1, [r2]\n");
940*f5c631daSSadaf Ebrahimi 
941*f5c631daSSadaf Ebrahimi   // - Tests with immediate offsets.
942*f5c631daSSadaf Ebrahimi 
943*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 1020)),
944*f5c631daSSadaf Ebrahimi               "add r0, r2, #1020\n"
945*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0]\n");
946*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 1020)), "ldrd r0, r1, [r2, #1020]\n");
947*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -1020)),
948*f5c631daSSadaf Ebrahimi               "sub r0, r2, #1020\n"
949*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0]\n");
950*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -1020)),
951*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #-1020]\n");
952*f5c631daSSadaf Ebrahimi 
953*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 0xabcc)),
954*f5c631daSSadaf Ebrahimi               "add r0, r2, #43776\n"
955*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #204]\n");
956*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 0xabcc)),
957*f5c631daSSadaf Ebrahimi               "add r0, r2, #43008\n"
958*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #972]\n");
959*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -0xabcc)),
960*f5c631daSSadaf Ebrahimi               "sub r0, r2, #44032\n"
961*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #52]\n");
962*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -0xabcc)),
963*f5c631daSSadaf Ebrahimi               "sub r0, r2, #44032\n"
964*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #52]\n");
965*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 0xabcdec)),
966*f5c631daSSadaf Ebrahimi               "add r0, r2, #52480\n"
967*f5c631daSSadaf Ebrahimi               "add r0, #11206656\n"
968*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #236]\n");
969*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 0xabcdec)),
970*f5c631daSSadaf Ebrahimi               "add r0, r2, #248832\n"
971*f5c631daSSadaf Ebrahimi               "add r0, #11010048\n"
972*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #492]\n");
973*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -0xabcdec)),
974*f5c631daSSadaf Ebrahimi               "sub r0, r2, #52736\n"
975*f5c631daSSadaf Ebrahimi               "sub r0, #11206656\n"
976*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #20]\n");
977*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -0xabcdec)),
978*f5c631daSSadaf Ebrahimi               "sub r0, r2, #774144\n"
979*f5c631daSSadaf Ebrahimi               "sub r0, #10485760\n"
980*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #532]\n");
981*f5c631daSSadaf Ebrahimi 
982*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r0, 0xabcc)),
983*f5c631daSSadaf Ebrahimi               "add r1, r0, #43776\n"
984*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #204]\n");
985*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r0, 0xabcc)),
986*f5c631daSSadaf Ebrahimi               "add r1, r0, #43008\n"
987*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #972]\n");
988*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r0, -0xabcc)),
989*f5c631daSSadaf Ebrahimi               "sub r1, r0, #44032\n"
990*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #52]\n");
991*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r0, -0xabcc)),
992*f5c631daSSadaf Ebrahimi               "sub r1, r0, #44032\n"
993*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #52]\n");
994*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r0, 0xabcdec)),
995*f5c631daSSadaf Ebrahimi               "add r1, r0, #52480\n"
996*f5c631daSSadaf Ebrahimi               "add r1, #11206656\n"
997*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #236]\n");
998*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r0, 0xabcdec)),
999*f5c631daSSadaf Ebrahimi               "add r1, r0, #248832\n"
1000*f5c631daSSadaf Ebrahimi               "add r1, #11010048\n"
1001*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #492]\n");
1002*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r0, -0xabcdec)),
1003*f5c631daSSadaf Ebrahimi               "sub r1, r0, #52736\n"
1004*f5c631daSSadaf Ebrahimi               "sub r1, #11206656\n"
1005*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #20]\n");
1006*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r0, -0xabcdec)),
1007*f5c631daSSadaf Ebrahimi               "sub r1, r0, #774144\n"
1008*f5c631daSSadaf Ebrahimi               "sub r1, #10485760\n"
1009*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r1, #532]\n");
1010*f5c631daSSadaf Ebrahimi 
1011*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r1, 0xabcc)),
1012*f5c631daSSadaf Ebrahimi               "add r0, r1, #43776\n"
1013*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #204]\n");
1014*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r1, 0xabcc)),
1015*f5c631daSSadaf Ebrahimi               "add r0, r1, #43008\n"
1016*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #972]\n");
1017*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r1, -0xabcc)),
1018*f5c631daSSadaf Ebrahimi               "sub r0, r1, #44032\n"
1019*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #52]\n");
1020*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r1, -0xabcc)),
1021*f5c631daSSadaf Ebrahimi               "sub r0, r1, #44032\n"
1022*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #52]\n");
1023*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r1, 0xabcdec)),
1024*f5c631daSSadaf Ebrahimi               "add r0, r1, #52480\n"
1025*f5c631daSSadaf Ebrahimi               "add r0, #11206656\n"
1026*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #236]\n");
1027*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r1, 0xabcdec)),
1028*f5c631daSSadaf Ebrahimi               "add r0, r1, #248832\n"
1029*f5c631daSSadaf Ebrahimi               "add r0, #11010048\n"
1030*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #492]\n");
1031*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r1, -0xabcdec)),
1032*f5c631daSSadaf Ebrahimi               "sub r0, r1, #52736\n"
1033*f5c631daSSadaf Ebrahimi               "sub r0, #11206656\n"
1034*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #20]\n");
1035*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r1, -0xabcdec)),
1036*f5c631daSSadaf Ebrahimi               "sub r0, r1, #774144\n"
1037*f5c631daSSadaf Ebrahimi               "sub r0, #10485760\n"
1038*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0, #532]\n");
1039*f5c631daSSadaf Ebrahimi 
1040*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 0xabcc, PostIndex)),
1041*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #204\n"
1042*f5c631daSSadaf Ebrahimi               "add r2, #43776\n");
1043*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 0xabcc, PostIndex)),
1044*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #972\n"
1045*f5c631daSSadaf Ebrahimi               "add r2, #43008\n");
1046*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -0xabcc, PostIndex)),
1047*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #52\n"
1048*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n");
1049*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -0xabcc, PostIndex)),
1050*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #52\n"
1051*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n");
1052*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 0xabcdec, PostIndex)),
1053*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #236\n"
1054*f5c631daSSadaf Ebrahimi               "add r2, #52480\n"
1055*f5c631daSSadaf Ebrahimi               "add r2, #11206656\n");
1056*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 0xabcdec, PostIndex)),
1057*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #492\n"
1058*f5c631daSSadaf Ebrahimi               "add r2, #248832\n"
1059*f5c631daSSadaf Ebrahimi               "add r2, #11010048\n");
1060*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -0xabcdec, PostIndex)),
1061*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #20\n"
1062*f5c631daSSadaf Ebrahimi               "sub r2, #52736\n"
1063*f5c631daSSadaf Ebrahimi               "sub r2, #11206656\n");
1064*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -0xabcdec, PostIndex)),
1065*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], #532\n"
1066*f5c631daSSadaf Ebrahimi               "sub r2, #774144\n"
1067*f5c631daSSadaf Ebrahimi               "sub r2, #10485760\n");
1068*f5c631daSSadaf Ebrahimi 
1069*f5c631daSSadaf Ebrahimi   // PostIndex with the same register as base and destination is invalid.
1070*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrd(r0, r1, MemOperand(r0, 0xabcd, PostIndex)),
1071*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrd' instruction.\n");
1072*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrd(r0, r1, MemOperand(r1, 0xabcdef, PostIndex)),
1073*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrd' instruction.\n");
1074*f5c631daSSadaf Ebrahimi 
1075*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 0xabcc, PreIndex)),
1076*f5c631daSSadaf Ebrahimi               "add r2, #43776\n"
1077*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #204]!\n");
1078*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 0xabcc, PreIndex)),
1079*f5c631daSSadaf Ebrahimi               "add r2, #43008\n"
1080*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #972]!\n");
1081*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -0xabcc, PreIndex)),
1082*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n"
1083*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #52]!\n");
1084*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -0xabcc, PreIndex)),
1085*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n"
1086*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #52]!\n");
1087*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, 0xabcdec, PreIndex)),
1088*f5c631daSSadaf Ebrahimi               "add r2, #52480\n"
1089*f5c631daSSadaf Ebrahimi               "add r2, #11206656\n"
1090*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #236]!\n");
1091*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, 0xabcdec, PreIndex)),
1092*f5c631daSSadaf Ebrahimi               "add r2, #248832\n"
1093*f5c631daSSadaf Ebrahimi               "add r2, #11010048\n"
1094*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #492]!\n");
1095*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, -0xabcdec, PreIndex)),
1096*f5c631daSSadaf Ebrahimi               "sub r2, #52736\n"
1097*f5c631daSSadaf Ebrahimi               "sub r2, #11206656\n"
1098*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #20]!\n");
1099*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, -0xabcdec, PreIndex)),
1100*f5c631daSSadaf Ebrahimi               "sub r2, #774144\n"
1101*f5c631daSSadaf Ebrahimi               "sub r2, #10485760\n"
1102*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, #532]!\n");
1103*f5c631daSSadaf Ebrahimi 
1104*f5c631daSSadaf Ebrahimi   // - Tests with register offsets.
1105*f5c631daSSadaf Ebrahimi 
1106*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, r3)), "ldrd r0, r1, [r2, r3]\n");
1107*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, r3)),
1108*f5c631daSSadaf Ebrahimi               "add r0, r2, r3\n"
1109*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0]\n");
1110*f5c631daSSadaf Ebrahimi 
1111*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, minus, r3)),
1112*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, -r3]\n");
1113*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, minus, r3)),
1114*f5c631daSSadaf Ebrahimi               "sub r0, r2, r3\n"
1115*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r0]\n");
1116*f5c631daSSadaf Ebrahimi 
1117*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, r3, PostIndex)),
1118*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], r3\n");
1119*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, r3, PostIndex)),
1120*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2]\n"
1121*f5c631daSSadaf Ebrahimi               "add r2, r3\n");
1122*f5c631daSSadaf Ebrahimi 
1123*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, minus, r3, PostIndex)),
1124*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2], -r3\n");
1125*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, minus, r3, PostIndex)),
1126*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2]\n"
1127*f5c631daSSadaf Ebrahimi               "sub r2, r3\n");
1128*f5c631daSSadaf Ebrahimi 
1129*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, r3, PreIndex)),
1130*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, r3]!\n");
1131*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, r3, PreIndex)),
1132*f5c631daSSadaf Ebrahimi               "add r2, r3\n"
1133*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2]\n");
1134*f5c631daSSadaf Ebrahimi 
1135*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldrd(r0, r1, MemOperand(r2, minus, r3, PreIndex)),
1136*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2, -r3]!\n");
1137*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrd(r0, r1, MemOperand(r2, minus, r3, PreIndex)),
1138*f5c631daSSadaf Ebrahimi               "sub r2, r3\n"
1139*f5c631daSSadaf Ebrahimi               "ldrd r0, r1, [r2]\n");
1140*f5c631daSSadaf Ebrahimi 
1141*f5c631daSSadaf Ebrahimi   // - We do not support register shifted base register operands with LDRD.
1142*f5c631daSSadaf Ebrahimi 
1143*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrd(r0, r1, MemOperand(r2, r3, LSL, 4)),
1144*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrd' instruction.\n");
1145*f5c631daSSadaf Ebrahimi 
1146*f5c631daSSadaf Ebrahimi   // First register is odd - rejected by the Assembler.
1147*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(r1, r2, MemOperand(r0)),
1148*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1149*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(r1, r2, MemOperand(r0, r0, PreIndex)),
1150*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1151*f5c631daSSadaf Ebrahimi   // First register is odd - rejected by the MacroAssembler.
1152*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(r1, r2, MemOperand(r0, 0xabcd, PreIndex)),
1153*f5c631daSSadaf Ebrahimi                      "Ill-formed 'ldrd' instruction.\n");
1154*f5c631daSSadaf Ebrahimi 
1155*f5c631daSSadaf Ebrahimi   // First register is lr - rejected by the Assembler.
1156*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(lr, pc, MemOperand(r0)),
1157*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1158*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(lr, pc, MemOperand(r0, r0, PreIndex)),
1159*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1160*f5c631daSSadaf Ebrahimi   // First register is lr - rejected by the MacroAssembler.
1161*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(lr, pc, MemOperand(r0, 0xabcd, PreIndex)),
1162*f5c631daSSadaf Ebrahimi                      "Ill-formed 'ldrd' instruction.\n");
1163*f5c631daSSadaf Ebrahimi 
1164*f5c631daSSadaf Ebrahimi   // Non-adjacent registers.
1165*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Ldrd(r0, r2, MemOperand(r0)),
1166*f5c631daSSadaf Ebrahimi                      "Ill-formed 'ldrd' instruction.\n");
1167*f5c631daSSadaf Ebrahimi 
1168*f5c631daSSadaf Ebrahimi   CLEANUP();
1169*f5c631daSSadaf Ebrahimi }
1170*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_strd)1171*f5c631daSSadaf Ebrahimi TEST(macro_assembler_strd) {
1172*f5c631daSSadaf Ebrahimi   SETUP();
1173*f5c631daSSadaf Ebrahimi 
1174*f5c631daSSadaf Ebrahimi   // - Tests with no offset.
1175*f5c631daSSadaf Ebrahimi 
1176*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Strd(r0, r1, MemOperand(r3)), "strd r0, r1, [r3]\n");
1177*f5c631daSSadaf Ebrahimi   // Destination registers need to start with a even numbered register on A32.
1178*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(r1, r2, MemOperand(r3)),
1179*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1180*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r1, r2, MemOperand(r3)), "strd r1, r2, [r3]\n");
1181*f5c631daSSadaf Ebrahimi   // Registers need to be adjacent on A32.
1182*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(r0, r2, MemOperand(r1)),
1183*f5c631daSSadaf Ebrahimi                      "Ill-formed 'strd' instruction.\n");
1184*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r2, MemOperand(r1)), "strd r0, r2, [r1]\n");
1185*f5c631daSSadaf Ebrahimi 
1186*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Strd(r0, r1, MemOperand(r2)), "strd r0, r1, [r2]\n");
1187*f5c631daSSadaf Ebrahimi 
1188*f5c631daSSadaf Ebrahimi   // - Tests with immediate offsets.
1189*f5c631daSSadaf Ebrahimi 
1190*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 1020)),
1191*f5c631daSSadaf Ebrahimi               "add ip, r2, #1020\n"
1192*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip]\n");
1193*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 1020)), "strd r0, r1, [r2, #1020]\n");
1194*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -1020)),
1195*f5c631daSSadaf Ebrahimi               "sub ip, r2, #1020\n"
1196*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip]\n");
1197*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -1020)),
1198*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #-1020]\n");
1199*f5c631daSSadaf Ebrahimi 
1200*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 0xabcc)),
1201*f5c631daSSadaf Ebrahimi               "add ip, r2, #43776\n"
1202*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #204]\n");
1203*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 0xabcc)),
1204*f5c631daSSadaf Ebrahimi               "add ip, r2, #43008\n"
1205*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #972]\n");
1206*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -0xabcc)),
1207*f5c631daSSadaf Ebrahimi               "sub ip, r2, #44032\n"
1208*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #52]\n");
1209*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -0xabcc)),
1210*f5c631daSSadaf Ebrahimi               "sub ip, r2, #44032\n"
1211*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #52]\n");
1212*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 0xabcdec)),
1213*f5c631daSSadaf Ebrahimi               "add ip, r2, #52480\n"
1214*f5c631daSSadaf Ebrahimi               "add ip, #11206656\n"
1215*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #236]\n");
1216*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 0xabcdec)),
1217*f5c631daSSadaf Ebrahimi               "add ip, r2, #248832\n"
1218*f5c631daSSadaf Ebrahimi               "add ip, #11010048\n"
1219*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #492]\n");
1220*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -0xabcdec)),
1221*f5c631daSSadaf Ebrahimi               "sub ip, r2, #52736\n"
1222*f5c631daSSadaf Ebrahimi               "sub ip, #11206656\n"
1223*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #20]\n");
1224*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -0xabcdec)),
1225*f5c631daSSadaf Ebrahimi               "sub ip, r2, #774144\n"
1226*f5c631daSSadaf Ebrahimi               "sub ip, #10485760\n"
1227*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #532]\n");
1228*f5c631daSSadaf Ebrahimi 
1229*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r0, 0xabcc)),
1230*f5c631daSSadaf Ebrahimi               "add ip, r0, #43776\n"
1231*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #204]\n");
1232*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r0, 0xabcc)),
1233*f5c631daSSadaf Ebrahimi               "add ip, r0, #43008\n"
1234*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #972]\n");
1235*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r0, -0xabcc)),
1236*f5c631daSSadaf Ebrahimi               "sub ip, r0, #44032\n"
1237*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #52]\n");
1238*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r0, -0xabcc)),
1239*f5c631daSSadaf Ebrahimi               "sub ip, r0, #44032\n"
1240*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #52]\n");
1241*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r0, 0xabcdec)),
1242*f5c631daSSadaf Ebrahimi               "add ip, r0, #52480\n"
1243*f5c631daSSadaf Ebrahimi               "add ip, #11206656\n"
1244*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #236]\n");
1245*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r0, 0xabcdec)),
1246*f5c631daSSadaf Ebrahimi               "add ip, r0, #248832\n"
1247*f5c631daSSadaf Ebrahimi               "add ip, #11010048\n"
1248*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #492]\n");
1249*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r0, -0xabcdec)),
1250*f5c631daSSadaf Ebrahimi               "sub ip, r0, #52736\n"
1251*f5c631daSSadaf Ebrahimi               "sub ip, #11206656\n"
1252*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #20]\n");
1253*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r0, -0xabcdec)),
1254*f5c631daSSadaf Ebrahimi               "sub ip, r0, #774144\n"
1255*f5c631daSSadaf Ebrahimi               "sub ip, #10485760\n"
1256*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #532]\n");
1257*f5c631daSSadaf Ebrahimi 
1258*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r1, 0xabcc)),
1259*f5c631daSSadaf Ebrahimi               "add ip, r1, #43776\n"
1260*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #204]\n");
1261*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r1, 0xabcc)),
1262*f5c631daSSadaf Ebrahimi               "add ip, r1, #43008\n"
1263*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #972]\n");
1264*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r1, -0xabcc)),
1265*f5c631daSSadaf Ebrahimi               "sub ip, r1, #44032\n"
1266*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #52]\n");
1267*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r1, -0xabcc)),
1268*f5c631daSSadaf Ebrahimi               "sub ip, r1, #44032\n"
1269*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #52]\n");
1270*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r1, 0xabcdec)),
1271*f5c631daSSadaf Ebrahimi               "add ip, r1, #52480\n"
1272*f5c631daSSadaf Ebrahimi               "add ip, #11206656\n"
1273*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #236]\n");
1274*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r1, 0xabcdec)),
1275*f5c631daSSadaf Ebrahimi               "add ip, r1, #248832\n"
1276*f5c631daSSadaf Ebrahimi               "add ip, #11010048\n"
1277*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #492]\n");
1278*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r1, -0xabcdec)),
1279*f5c631daSSadaf Ebrahimi               "sub ip, r1, #52736\n"
1280*f5c631daSSadaf Ebrahimi               "sub ip, #11206656\n"
1281*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #20]\n");
1282*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r1, -0xabcdec)),
1283*f5c631daSSadaf Ebrahimi               "sub ip, r1, #774144\n"
1284*f5c631daSSadaf Ebrahimi               "sub ip, #10485760\n"
1285*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip, #532]\n");
1286*f5c631daSSadaf Ebrahimi 
1287*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 0xabcc, PostIndex)),
1288*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #204\n"
1289*f5c631daSSadaf Ebrahimi               "add r2, #43776\n");
1290*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 0xabcc, PostIndex)),
1291*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #972\n"
1292*f5c631daSSadaf Ebrahimi               "add r2, #43008\n");
1293*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -0xabcc, PostIndex)),
1294*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #52\n"
1295*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n");
1296*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -0xabcc, PostIndex)),
1297*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #52\n"
1298*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n");
1299*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 0xabcdec, PostIndex)),
1300*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #236\n"
1301*f5c631daSSadaf Ebrahimi               "add r2, #52480\n"
1302*f5c631daSSadaf Ebrahimi               "add r2, #11206656\n");
1303*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 0xabcdec, PostIndex)),
1304*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #492\n"
1305*f5c631daSSadaf Ebrahimi               "add r2, #248832\n"
1306*f5c631daSSadaf Ebrahimi               "add r2, #11010048\n");
1307*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -0xabcdec, PostIndex)),
1308*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #20\n"
1309*f5c631daSSadaf Ebrahimi               "sub r2, #52736\n"
1310*f5c631daSSadaf Ebrahimi               "sub r2, #11206656\n");
1311*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -0xabcdec, PostIndex)),
1312*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], #532\n"
1313*f5c631daSSadaf Ebrahimi               "sub r2, #774144\n"
1314*f5c631daSSadaf Ebrahimi               "sub r2, #10485760\n");
1315*f5c631daSSadaf Ebrahimi 
1316*f5c631daSSadaf Ebrahimi   // PostIndex with the same register as base and source is invalid.
1317*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strd(r0, r1, MemOperand(r0, 0xabcd, PostIndex)),
1318*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strd' instruction.\n");
1319*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strd(r0, r1, MemOperand(r1, 0xabcdef, PostIndex)),
1320*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strd' instruction.\n");
1321*f5c631daSSadaf Ebrahimi 
1322*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 0xabcc, PreIndex)),
1323*f5c631daSSadaf Ebrahimi               "add r2, #43776\n"
1324*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #204]!\n");
1325*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 0xabcc, PreIndex)),
1326*f5c631daSSadaf Ebrahimi               "add r2, #43008\n"
1327*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #972]!\n");
1328*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -0xabcc, PreIndex)),
1329*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n"
1330*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #52]!\n");
1331*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -0xabcc, PreIndex)),
1332*f5c631daSSadaf Ebrahimi               "sub r2, #44032\n"
1333*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #52]!\n");
1334*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, 0xabcdec, PreIndex)),
1335*f5c631daSSadaf Ebrahimi               "add r2, #52480\n"
1336*f5c631daSSadaf Ebrahimi               "add r2, #11206656\n"
1337*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #236]!\n");
1338*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, 0xabcdec, PreIndex)),
1339*f5c631daSSadaf Ebrahimi               "add r2, #248832\n"
1340*f5c631daSSadaf Ebrahimi               "add r2, #11010048\n"
1341*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #492]!\n");
1342*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, -0xabcdec, PreIndex)),
1343*f5c631daSSadaf Ebrahimi               "sub r2, #52736\n"
1344*f5c631daSSadaf Ebrahimi               "sub r2, #11206656\n"
1345*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #20]!\n");
1346*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, -0xabcdec, PreIndex)),
1347*f5c631daSSadaf Ebrahimi               "sub r2, #774144\n"
1348*f5c631daSSadaf Ebrahimi               "sub r2, #10485760\n"
1349*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, #532]!\n");
1350*f5c631daSSadaf Ebrahimi 
1351*f5c631daSSadaf Ebrahimi   // - Tests with register offsets.
1352*f5c631daSSadaf Ebrahimi 
1353*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, r3)), "strd r0, r1, [r2, r3]\n");
1354*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, r3)),
1355*f5c631daSSadaf Ebrahimi               "add ip, r2, r3\n"
1356*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip]\n");
1357*f5c631daSSadaf Ebrahimi 
1358*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, minus, r3)),
1359*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, -r3]\n");
1360*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, minus, r3)),
1361*f5c631daSSadaf Ebrahimi               "sub ip, r2, r3\n"
1362*f5c631daSSadaf Ebrahimi               "strd r0, r1, [ip]\n");
1363*f5c631daSSadaf Ebrahimi 
1364*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, r3, PostIndex)),
1365*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], r3\n");
1366*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, r3, PostIndex)),
1367*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2]\n"
1368*f5c631daSSadaf Ebrahimi               "add r2, r3\n");
1369*f5c631daSSadaf Ebrahimi 
1370*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, minus, r3, PostIndex)),
1371*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2], -r3\n");
1372*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, minus, r3, PostIndex)),
1373*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2]\n"
1374*f5c631daSSadaf Ebrahimi               "sub r2, r3\n");
1375*f5c631daSSadaf Ebrahimi 
1376*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, r3, PreIndex)),
1377*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, r3]!\n");
1378*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, r3, PreIndex)),
1379*f5c631daSSadaf Ebrahimi               "add r2, r3\n"
1380*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2]\n");
1381*f5c631daSSadaf Ebrahimi 
1382*f5c631daSSadaf Ebrahimi   COMPARE_A32(Strd(r0, r1, MemOperand(r2, minus, r3, PreIndex)),
1383*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2, -r3]!\n");
1384*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strd(r0, r1, MemOperand(r2, minus, r3, PreIndex)),
1385*f5c631daSSadaf Ebrahimi               "sub r2, r3\n"
1386*f5c631daSSadaf Ebrahimi               "strd r0, r1, [r2]\n");
1387*f5c631daSSadaf Ebrahimi 
1388*f5c631daSSadaf Ebrahimi   // - We do not support register shifted base register operands with LDRD.
1389*f5c631daSSadaf Ebrahimi 
1390*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strd(r0, r1, MemOperand(r2, r3, LSL, 4)),
1391*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strd' instruction.\n");
1392*f5c631daSSadaf Ebrahimi 
1393*f5c631daSSadaf Ebrahimi   // First register is odd - rejected by the Assembler.
1394*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(r1, r2, MemOperand(r0)),
1395*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1396*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(r1, r2, MemOperand(r0, r0, PreIndex)),
1397*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1398*f5c631daSSadaf Ebrahimi   // First register is odd - rejected by the MacroAssembler.
1399*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(r1, r2, MemOperand(r0, 0xabcd, PreIndex)),
1400*f5c631daSSadaf Ebrahimi                      "Ill-formed 'strd' instruction.\n");
1401*f5c631daSSadaf Ebrahimi 
1402*f5c631daSSadaf Ebrahimi   // First register is lr - rejected by the Assembler.
1403*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(lr, pc, MemOperand(r0)),
1404*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1405*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(lr, pc, MemOperand(r0, r0, PreIndex)),
1406*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
1407*f5c631daSSadaf Ebrahimi   // First register is lr - rejected by the MacroAssembler.
1408*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(lr, pc, MemOperand(r0, 0xabcd, PreIndex)),
1409*f5c631daSSadaf Ebrahimi                      "Ill-formed 'strd' instruction.\n");
1410*f5c631daSSadaf Ebrahimi 
1411*f5c631daSSadaf Ebrahimi   // Non-adjacent registers.
1412*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Strd(r0, r2, MemOperand(r0)),
1413*f5c631daSSadaf Ebrahimi                      "Ill-formed 'strd' instruction.\n");
1414*f5c631daSSadaf Ebrahimi 
1415*f5c631daSSadaf Ebrahimi   CLEANUP();
1416*f5c631daSSadaf Ebrahimi }
1417*f5c631daSSadaf Ebrahimi 
1418*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_wide_immediate)1419*f5c631daSSadaf Ebrahimi TEST(macro_assembler_wide_immediate) {
1420*f5c631daSSadaf Ebrahimi   SETUP();
1421*f5c631daSSadaf Ebrahimi 
1422*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adc(r0, r1, 0xbadbeef),
1423*f5c631daSSadaf Ebrahimi                "mov r0, #48879\n"
1424*f5c631daSSadaf Ebrahimi                "movt r0, #2989\n"
1425*f5c631daSSadaf Ebrahimi                "adc r0, r1, r0\n");
1426*f5c631daSSadaf Ebrahimi 
1427*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(r0, r0, 0xbadbeef),
1428*f5c631daSSadaf Ebrahimi                "mov ip, #48879\n"
1429*f5c631daSSadaf Ebrahimi                "movt ip, #2989\n"
1430*f5c631daSSadaf Ebrahimi                "add r0, ip\n");
1431*f5c631daSSadaf Ebrahimi 
1432*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Mov(r0, 0xbadbeef),
1433*f5c631daSSadaf Ebrahimi                "mov r0, #48879\n"
1434*f5c631daSSadaf Ebrahimi                "movt r0, #2989\n");
1435*f5c631daSSadaf Ebrahimi   COMPARE_A32(Mov(eq, r0, 0xbadbeef),
1436*f5c631daSSadaf Ebrahimi               "moveq r0, #48879\n"
1437*f5c631daSSadaf Ebrahimi               "movteq r0, #2989\n");
1438*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r0, 0xbadbeef),
1439*f5c631daSSadaf Ebrahimi               "bne 0x0000000a\n"
1440*f5c631daSSadaf Ebrahimi               "mov r0, #48879\n"
1441*f5c631daSSadaf Ebrahimi               "movt r0, #2989\n");
1442*f5c631daSSadaf Ebrahimi 
1443*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Movs(r0, 0xbadbeef),
1444*f5c631daSSadaf Ebrahimi                "mov r0, #48879\n"
1445*f5c631daSSadaf Ebrahimi                "movt r0, #2989\n"
1446*f5c631daSSadaf Ebrahimi                "tst r0, r0\n");
1447*f5c631daSSadaf Ebrahimi   COMPARE_A32(Movs(eq, r0, 0xbadbeef),
1448*f5c631daSSadaf Ebrahimi               "moveq r0, #48879\n"
1449*f5c631daSSadaf Ebrahimi               "movteq r0, #2989\n"
1450*f5c631daSSadaf Ebrahimi               "tsteq r0, r0\n");
1451*f5c631daSSadaf Ebrahimi   COMPARE_T32(Movs(eq, r0, 0xbadbeef),
1452*f5c631daSSadaf Ebrahimi               "bne 0x0000000c\n"
1453*f5c631daSSadaf Ebrahimi               "mov r0, #48879\n"
1454*f5c631daSSadaf Ebrahimi               "movt r0, #2989\n"
1455*f5c631daSSadaf Ebrahimi               "tst r0, r0\n");
1456*f5c631daSSadaf Ebrahimi   COMPARE_A32(Movs(pc, 0x1), "movs pc, #1\n");
1457*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Movs(pc, 0x1), "Unpredictable instruction.\n");
1458*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, 0xbadbeed), "Ill-formed 'movs' instruction.\n");
1459*f5c631daSSadaf Ebrahimi 
1460*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Mov(pc, 0xbadbeef),
1461*f5c631daSSadaf Ebrahimi                "mov ip, #48879\n"
1462*f5c631daSSadaf Ebrahimi                "movt ip, #2989\n"
1463*f5c631daSSadaf Ebrahimi                "bx ip\n");
1464*f5c631daSSadaf Ebrahimi   COMPARE_A32(Mov(eq, pc, 0xbadbeef),
1465*f5c631daSSadaf Ebrahimi               "mov ip, #48879\n"
1466*f5c631daSSadaf Ebrahimi               "movt ip, #2989\n"
1467*f5c631daSSadaf Ebrahimi               "bxeq ip\n");
1468*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, pc, 0xbadbeef),
1469*f5c631daSSadaf Ebrahimi               "bne 0x0000000c\n"
1470*f5c631daSSadaf Ebrahimi               "mov ip, #48879\n"
1471*f5c631daSSadaf Ebrahimi               "movt ip, #2989\n"
1472*f5c631daSSadaf Ebrahimi               "bx ip\n");
1473*f5c631daSSadaf Ebrahimi 
1474*f5c631daSSadaf Ebrahimi   CLEANUP();
1475*f5c631daSSadaf Ebrahimi }
1476*f5c631daSSadaf Ebrahimi 
1477*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_And)1478*f5c631daSSadaf Ebrahimi TEST(macro_assembler_And) {
1479*f5c631daSSadaf Ebrahimi   SETUP();
1480*f5c631daSSadaf Ebrahimi 
1481*f5c631daSSadaf Ebrahimi   // Identities.
1482*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(And(r0, r1, 0), "mov r0, #0\n");
1483*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(And(r0, r0, 0xffffffff), "");
1484*f5c631daSSadaf Ebrahimi   CLEANUP();
1485*f5c631daSSadaf Ebrahimi }
1486*f5c631daSSadaf Ebrahimi 
1487*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Bic)1488*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Bic) {
1489*f5c631daSSadaf Ebrahimi   SETUP();
1490*f5c631daSSadaf Ebrahimi 
1491*f5c631daSSadaf Ebrahimi   // Identities.
1492*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Bic(r0, r1, 0xffffffff), "mov r0, #0\n");
1493*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Bic(r0, r0, 0), "");
1494*f5c631daSSadaf Ebrahimi   CLEANUP();
1495*f5c631daSSadaf Ebrahimi }
1496*f5c631daSSadaf Ebrahimi 
1497*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Orr)1498*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Orr) {
1499*f5c631daSSadaf Ebrahimi   SETUP();
1500*f5c631daSSadaf Ebrahimi 
1501*f5c631daSSadaf Ebrahimi   // Identities.
1502*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orr(r0, r1, 0xffffffff), "mvn r0, #0\n");
1503*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orr(r0, r0, 0), "");
1504*f5c631daSSadaf Ebrahimi   CLEANUP();
1505*f5c631daSSadaf Ebrahimi }
1506*f5c631daSSadaf Ebrahimi 
1507*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_InstructionCondSizeRROp)1508*f5c631daSSadaf Ebrahimi TEST(macro_assembler_InstructionCondSizeRROp) {
1509*f5c631daSSadaf Ebrahimi   SETUP();
1510*f5c631daSSadaf Ebrahimi 
1511*f5c631daSSadaf Ebrahimi   // Special case for Orr <-> Orn correspondance.
1512*f5c631daSSadaf Ebrahimi 
1513*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orr(r0, r1, 0x00ffffff), "orn r0, r1, #0xff000000\n");
1514*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orrs(r0, r1, 0x00ffffff), "orns r0, r1, #0xff000000\n");
1515*f5c631daSSadaf Ebrahimi 
1516*f5c631daSSadaf Ebrahimi   // Encodable immediates.
1517*f5c631daSSadaf Ebrahimi 
1518*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, r1, -1), "sub r0, r1, #1\n");
1519*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(r0, r1, -1), "subs r0, r1, #1\n");
1520*f5c631daSSadaf Ebrahimi   // 0xffffffff is encodable in a T32 ADD.
1521*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, r1, -1), "add r0, r1, #4294967295\n");
1522*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adds(r0, r1, -1), "adds r0, r1, #4294967295\n");
1523*f5c631daSSadaf Ebrahimi 
1524*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(r0, r1, -4), "sub r0, r1, #4\n");
1525*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adds(r0, r1, -4), "subs r0, r1, #4\n");
1526*f5c631daSSadaf Ebrahimi 
1527*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adc(r0, r1, -2), "sbc r0, r1, #1\n");
1528*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adcs(r0, r1, -2), "sbcs r0, r1, #1\n");
1529*f5c631daSSadaf Ebrahimi 
1530*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, r1, -1), "add r0, r1, #1\n");
1531*f5c631daSSadaf Ebrahimi   COMPARE_A32(Subs(r0, r1, -1), "adds r0, r1, #1\n");
1532*f5c631daSSadaf Ebrahimi   // 0xffffffff is encodable in a T32 SUB.
1533*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, r1, -1), "sub r0, r1, #4294967295\n");
1534*f5c631daSSadaf Ebrahimi   COMPARE_T32(Subs(r0, r1, -1), "subs r0, r1, #4294967295\n");
1535*f5c631daSSadaf Ebrahimi 
1536*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sub(r0, r1, -4), "add r0, r1, #4\n");
1537*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Subs(r0, r1, -4), "adds r0, r1, #4\n");
1538*f5c631daSSadaf Ebrahimi 
1539*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sbc(r0, r1, -5), "adc r0, r1, #4\n");
1540*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sbcs(r0, r1, -5), "adcs r0, r1, #4\n");
1541*f5c631daSSadaf Ebrahimi 
1542*f5c631daSSadaf Ebrahimi   // Non-encodable immediates
1543*f5c631daSSadaf Ebrahimi 
1544*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adc(r0, r1, 0xabcd),
1545*f5c631daSSadaf Ebrahimi                "mov r0, #43981\n"
1546*f5c631daSSadaf Ebrahimi                "adc r0, r1, r0\n");
1547*f5c631daSSadaf Ebrahimi 
1548*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adc(r0, r1, -0xabcd),
1549*f5c631daSSadaf Ebrahimi                "mov r0, #43980\n"  // This represents #0xabcd - 1.
1550*f5c631daSSadaf Ebrahimi                "sbc r0, r1, r0\n");
1551*f5c631daSSadaf Ebrahimi 
1552*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adc(r0, r1, 0x1234abcd),
1553*f5c631daSSadaf Ebrahimi                "mov r0, #43981\n"
1554*f5c631daSSadaf Ebrahimi                "movt r0, #4660\n"
1555*f5c631daSSadaf Ebrahimi                "adc r0, r1, r0\n");
1556*f5c631daSSadaf Ebrahimi 
1557*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Adc(r0, r1, -0x1234abcd),
1558*f5c631daSSadaf Ebrahimi                "mov r0, #43980\n"  // This represents #0x1234abcd - 1.
1559*f5c631daSSadaf Ebrahimi                "movt r0, #4660\n"
1560*f5c631daSSadaf Ebrahimi                "sbc r0, r1, r0\n");
1561*f5c631daSSadaf Ebrahimi 
1562*f5c631daSSadaf Ebrahimi   // Non-encodable immediates with the same source and destination registers.
1563*f5c631daSSadaf Ebrahimi 
1564*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sbc(r0, r0, 0xabcd),
1565*f5c631daSSadaf Ebrahimi                "mov ip, #43981\n"
1566*f5c631daSSadaf Ebrahimi                "sbc r0, ip\n");
1567*f5c631daSSadaf Ebrahimi 
1568*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sbc(r0, r0, -0xabcd),
1569*f5c631daSSadaf Ebrahimi                "mov ip, #43980\n"  // This represents #0xabcd - 1.
1570*f5c631daSSadaf Ebrahimi                "adc r0, ip\n");
1571*f5c631daSSadaf Ebrahimi 
1572*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sbc(r0, r0, 0x1234abcd),
1573*f5c631daSSadaf Ebrahimi                "mov ip, #43981\n"
1574*f5c631daSSadaf Ebrahimi                "movt ip, #4660\n"
1575*f5c631daSSadaf Ebrahimi                "sbc r0, ip\n");
1576*f5c631daSSadaf Ebrahimi 
1577*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sbc(r0, r0, -0x1234abcd),
1578*f5c631daSSadaf Ebrahimi                "mov ip, #43980\n"  // This represents #0x1234abcd - 1.
1579*f5c631daSSadaf Ebrahimi                "movt ip, #4660\n"
1580*f5c631daSSadaf Ebrahimi                "adc r0, ip\n");
1581*f5c631daSSadaf Ebrahimi 
1582*f5c631daSSadaf Ebrahimi 
1583*f5c631daSSadaf Ebrahimi   // Test that we can pass a register shifted register operand in T32.
1584*f5c631daSSadaf Ebrahimi 
1585*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adc(r0, r1, Operand(r2, LSL, r3)),
1586*f5c631daSSadaf Ebrahimi               "lsl r0, r2, r3\n"
1587*f5c631daSSadaf Ebrahimi               "adc r0, r1, r0\n");
1588*f5c631daSSadaf Ebrahimi 
1589*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r3, r2, Operand(r2, ASR, r3)),
1590*f5c631daSSadaf Ebrahimi               "asr r3, r2, r3\n"
1591*f5c631daSSadaf Ebrahimi               "add r3, r2, r3\n");
1592*f5c631daSSadaf Ebrahimi 
1593*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ands(r3, r2, Operand(r2, LSR, r2)),
1594*f5c631daSSadaf Ebrahimi               "lsr r3, r2, r2\n"
1595*f5c631daSSadaf Ebrahimi               "ands r3, r2, r3\n");
1596*f5c631daSSadaf Ebrahimi 
1597*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(r2, r2, Operand(r2, ROR, r2)),
1598*f5c631daSSadaf Ebrahimi               "ror ip, r2, r2\n"
1599*f5c631daSSadaf Ebrahimi               "asr r2, ip\n");
1600*f5c631daSSadaf Ebrahimi 
1601*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(r2, r2, Operand(r2, ROR, r2)),
1602*f5c631daSSadaf Ebrahimi               "ror ip, r2, r2\n"
1603*f5c631daSSadaf Ebrahimi               "asr r2, ip\n");
1604*f5c631daSSadaf Ebrahimi 
1605*f5c631daSSadaf Ebrahimi 
1606*f5c631daSSadaf Ebrahimi   CLEANUP();
1607*f5c631daSSadaf Ebrahimi }
1608*f5c631daSSadaf Ebrahimi 
1609*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_InstructionCondRO)1610*f5c631daSSadaf Ebrahimi TEST(macro_assembler_InstructionCondRO) {
1611*f5c631daSSadaf Ebrahimi   SETUP();
1612*f5c631daSSadaf Ebrahimi 
1613*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Teq(r0, 0xbad),
1614*f5c631daSSadaf Ebrahimi                "mov ip, #2989\n"
1615*f5c631daSSadaf Ebrahimi                "teq r0, ip\n");
1616*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Teq(r0, 0xbadbeef),
1617*f5c631daSSadaf Ebrahimi                "mov ip, #48879\n"
1618*f5c631daSSadaf Ebrahimi                "movt ip, #2989\n"
1619*f5c631daSSadaf Ebrahimi                "teq r0, ip\n");
1620*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Teq(r0, Operand(r1, LSL, r2)),
1621*f5c631daSSadaf Ebrahimi                      "Ill-formed 'teq' instruction.\n");
1622*f5c631daSSadaf Ebrahimi 
1623*f5c631daSSadaf Ebrahimi   CLEANUP();
1624*f5c631daSSadaf Ebrahimi }
1625*f5c631daSSadaf Ebrahimi 
1626*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_too_large_immediate)1627*f5c631daSSadaf Ebrahimi TEST(macro_assembler_too_large_immediate) {
1628*f5c631daSSadaf Ebrahimi   SETUP();
1629*f5c631daSSadaf Ebrahimi 
1630*f5c631daSSadaf Ebrahimi   // Attempting to use a 17-bit immediate with movt.
1631*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movt(r0, 0x10000), "`Movt` expects a 16-bit immediate.");
1632*f5c631daSSadaf Ebrahimi 
1633*f5c631daSSadaf Ebrahimi   CLEANUP();
1634*f5c631daSSadaf Ebrahimi }
1635*f5c631daSSadaf Ebrahimi 
1636*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Cbz)1637*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Cbz) {
1638*f5c631daSSadaf Ebrahimi   SETUP();
1639*f5c631daSSadaf Ebrahimi 
1640*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
1641*f5c631daSSadaf Ebrahimi   // Cbz/Cbnz are not available in A32 mode.
1642*f5c631daSSadaf Ebrahimi   // Make sure GetArchitectureStatePCOffset() returns the correct value.
1643*f5c631daSSadaf Ebrahimi   __ UseA32();
1644*f5c631daSSadaf Ebrahimi   Label label_64(__ GetCursorOffset() + __ GetArchitectureStatePCOffset() + 64);
1645*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Cbz(r0, &label_64), "Cbz is only available for T32.\n");
1646*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Cbnz(r0, &label_64), "Cbnz is only available for T32.\n");
1647*f5c631daSSadaf Ebrahimi #endif
1648*f5c631daSSadaf Ebrahimi 
1649*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_T32
1650*f5c631daSSadaf Ebrahimi   // Make sure GetArchitectureStatePCOffset() returns the correct value.
1651*f5c631daSSadaf Ebrahimi   __ UseT32();
1652*f5c631daSSadaf Ebrahimi   // Largest encodable offset.
1653*f5c631daSSadaf Ebrahimi   Label label_126(__ GetCursorOffset() + __ GetArchitectureStatePCOffset() +
1654*f5c631daSSadaf Ebrahimi                   126);
1655*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbz(r0, &label_126), "cbz r0, 0x00000082\n");
1656*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbnz(r0, &label_126), "cbnz r0, 0x00000082\n");
1657*f5c631daSSadaf Ebrahimi 
1658*f5c631daSSadaf Ebrahimi   // Offset cannot be encoded.
1659*f5c631daSSadaf Ebrahimi   Label label_128(__ GetCursorOffset() + __ GetArchitectureStatePCOffset() +
1660*f5c631daSSadaf Ebrahimi                   128);
1661*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbz(r0, &label_128),
1662*f5c631daSSadaf Ebrahimi               "cbnz r0, 0x00000004\n"
1663*f5c631daSSadaf Ebrahimi               "b 0x00000084\n");
1664*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbnz(r0, &label_128),
1665*f5c631daSSadaf Ebrahimi               "cbz r0, 0x00000004\n"
1666*f5c631daSSadaf Ebrahimi               "b 0x00000084\n");
1667*f5c631daSSadaf Ebrahimi 
1668*f5c631daSSadaf Ebrahimi   // Offset that cannot be encoded and needs 32-bit branch instruction.
1669*f5c631daSSadaf Ebrahimi   Label label_8192(__ GetCursorOffset() + __ GetArchitectureStatePCOffset() +
1670*f5c631daSSadaf Ebrahimi                    8192);
1671*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbz(r0, &label_8192),
1672*f5c631daSSadaf Ebrahimi               "cbnz r0, 0x00000006\n"
1673*f5c631daSSadaf Ebrahimi               "b 0x00002004\n");
1674*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbnz(r0, &label_8192),
1675*f5c631daSSadaf Ebrahimi               "cbz r0, 0x00000006\n"
1676*f5c631daSSadaf Ebrahimi               "b 0x00002004\n");
1677*f5c631daSSadaf Ebrahimi 
1678*f5c631daSSadaf Ebrahimi   // Negative offset.
1679*f5c631daSSadaf Ebrahimi   Label label_neg(__ GetCursorOffset() + __ GetArchitectureStatePCOffset() +
1680*f5c631daSSadaf Ebrahimi                   -8);
1681*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbz(r0, &label_neg),
1682*f5c631daSSadaf Ebrahimi               "cbnz r0, 0x00000004\n"
1683*f5c631daSSadaf Ebrahimi               "b 0xfffffffc\n");
1684*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbnz(r0, &label_neg),
1685*f5c631daSSadaf Ebrahimi               "cbz r0, 0x00000004\n"
1686*f5c631daSSadaf Ebrahimi               "b 0xfffffffc\n");
1687*f5c631daSSadaf Ebrahimi 
1688*f5c631daSSadaf Ebrahimi   // Large negative offset.
1689*f5c631daSSadaf Ebrahimi   Label label_neg128(__ GetCursorOffset() + __ GetArchitectureStatePCOffset() +
1690*f5c631daSSadaf Ebrahimi                      -128);
1691*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbz(r0, &label_neg128),
1692*f5c631daSSadaf Ebrahimi               "cbnz r0, 0x00000004\n"
1693*f5c631daSSadaf Ebrahimi               "b 0xffffff84\n");
1694*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cbnz(r0, &label_neg128),
1695*f5c631daSSadaf Ebrahimi               "cbz r0, 0x00000004\n"
1696*f5c631daSSadaf Ebrahimi               "b 0xffffff84\n");
1697*f5c631daSSadaf Ebrahimi #endif
1698*f5c631daSSadaf Ebrahimi 
1699*f5c631daSSadaf Ebrahimi   CLEANUP();
1700*f5c631daSSadaf Ebrahimi }
1701*f5c631daSSadaf Ebrahimi 
1702*f5c631daSSadaf Ebrahimi 
1703*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING
TEST(assembler_crc_negative)1704*f5c631daSSadaf Ebrahimi TEST(assembler_crc_negative) {
1705*f5c631daSSadaf Ebrahimi   SETUP();
1706*f5c631daSSadaf Ebrahimi 
1707*f5c631daSSadaf Ebrahimi   ExactAssemblyScope scope(&masm, 2, CodeBufferCheckScope::kMaximumSize);
1708*f5c631daSSadaf Ebrahimi 
1709*f5c631daSSadaf Ebrahimi   masm.it(eq);
1710*f5c631daSSadaf Ebrahimi 
1711*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(crc32b(eq, r0, r1, r2), "Unpredictable instruction.\n");
1712*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(crc32cb(eq, r0, r1, r2), "Unpredictable instruction.\n");
1713*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(crc32ch(eq, r0, r1, r2), "Unpredictable instruction.\n");
1714*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(crc32cw(eq, r0, r1, r2), "Unpredictable instruction.\n");
1715*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(crc32h(eq, r0, r1, r2), "Unpredictable instruction.\n");
1716*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(crc32w(eq, r0, r1, r2), "Unpredictable instruction.\n");
1717*f5c631daSSadaf Ebrahimi 
1718*f5c631daSSadaf Ebrahimi   CLEANUP();
1719*f5c631daSSadaf Ebrahimi }
1720*f5c631daSSadaf Ebrahimi #endif
1721*f5c631daSSadaf Ebrahimi 
1722*f5c631daSSadaf Ebrahimi 
1723*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING
TEST(assembler_hvc_negative)1724*f5c631daSSadaf Ebrahimi TEST(assembler_hvc_negative) {
1725*f5c631daSSadaf Ebrahimi   SETUP();
1726*f5c631daSSadaf Ebrahimi 
1727*f5c631daSSadaf Ebrahimi   ExactAssemblyScope scope(&masm, 2, CodeBufferCheckScope::kMaximumSize);
1728*f5c631daSSadaf Ebrahimi 
1729*f5c631daSSadaf Ebrahimi   masm.it(eq);
1730*f5c631daSSadaf Ebrahimi 
1731*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(hvc(eq, 0), "Unpredictable instruction.\n");
1732*f5c631daSSadaf Ebrahimi 
1733*f5c631daSSadaf Ebrahimi   CLEANUP();
1734*f5c631daSSadaf Ebrahimi }
1735*f5c631daSSadaf Ebrahimi #endif
1736*f5c631daSSadaf Ebrahimi 
1737*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_vld)1738*f5c631daSSadaf Ebrahimi TEST(macro_assembler_vld) {
1739*f5c631daSSadaf Ebrahimi   SETUP();
1740*f5c631daSSadaf Ebrahimi 
1741*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1742*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kMultipleLanes),
1743*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1744*f5c631daSSadaf Ebrahimi                "vld1.8 {d0}, [r1]\n");
1745*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1746*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kMultipleLanes),
1747*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1748*f5c631daSSadaf Ebrahimi                "vld1.8 {d0}, [r1]!\n");
1749*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1750*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kMultipleLanes),
1751*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r8, kNoAlignment, r2, PostIndex)),
1752*f5c631daSSadaf Ebrahimi                "vld1.8 {d0}, [r8], r2\n");
1753*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1754*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kAllLanes),
1755*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1756*f5c631daSSadaf Ebrahimi                "vld1.8 {d0[]}, [r1]\n");
1757*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1758*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kAllLanes),
1759*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r9, kNoAlignment, PostIndex)),
1760*f5c631daSSadaf Ebrahimi                "vld1.8 {d0[]}, [r9]!\n");
1761*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1762*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kAllLanes),
1763*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1764*f5c631daSSadaf Ebrahimi                "vld1.8 {d0[]}, [r1], r2\n");
1765*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1766*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, 0),
1767*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r10, kNoAlignment)),
1768*f5c631daSSadaf Ebrahimi                "vld1.8 {d0[0]}, [r10]\n");
1769*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1770*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, 1),
1771*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1772*f5c631daSSadaf Ebrahimi                "vld1.8 {d0[1]}, [r1]!\n");
1773*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld1(Untyped8,
1774*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, 2),
1775*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1776*f5c631daSSadaf Ebrahimi                "vld1.8 {d0[2]}, [r1], r2\n");
1777*f5c631daSSadaf Ebrahimi 
1778*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1779*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kMultipleLanes),
1780*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1781*f5c631daSSadaf Ebrahimi                "vld2.8 {d0,d1}, [r1]\n");
1782*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1783*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kMultipleLanes),
1784*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1785*f5c631daSSadaf Ebrahimi                "vld2.8 {d0,d1}, [r1]!\n");
1786*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1787*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kMultipleLanes),
1788*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r8, PostIndex)),
1789*f5c631daSSadaf Ebrahimi                "vld2.8 {d0,d1}, [r1], r8\n");
1790*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1791*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kAllLanes),
1792*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1793*f5c631daSSadaf Ebrahimi                "vld2.8 {d0[],d1[]}, [r1]\n");
1794*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1795*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kAllLanes),
1796*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r9, kNoAlignment, PostIndex)),
1797*f5c631daSSadaf Ebrahimi                "vld2.8 {d0[],d1[]}, [r9]!\n");
1798*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1799*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kAllLanes),
1800*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1801*f5c631daSSadaf Ebrahimi                "vld2.8 {d0[],d1[]}, [r1], r2\n");
1802*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1803*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, 0),
1804*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r10, kNoAlignment)),
1805*f5c631daSSadaf Ebrahimi                "vld2.8 {d0[0],d1[0]}, [r10]\n");
1806*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1807*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, 1),
1808*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1809*f5c631daSSadaf Ebrahimi                "vld2.8 {d0[1],d1[1]}, [r1]!\n");
1810*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld2(Untyped8,
1811*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, 2),
1812*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1813*f5c631daSSadaf Ebrahimi                "vld2.8 {d0[2],d1[2]}, [r1], r2\n");
1814*f5c631daSSadaf Ebrahimi 
1815*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1816*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kMultipleLanes),
1817*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1818*f5c631daSSadaf Ebrahimi                "vld3.8 {d0,d1,d2}, [r1]\n");
1819*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1820*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kMultipleLanes),
1821*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1822*f5c631daSSadaf Ebrahimi                "vld3.8 {d0,d1,d2}, [r1]!\n");
1823*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1824*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kMultipleLanes),
1825*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r11, kNoAlignment, r2, PostIndex)),
1826*f5c631daSSadaf Ebrahimi                "vld3.8 {d0,d1,d2}, [r11], r2\n");
1827*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1828*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kAllLanes),
1829*f5c631daSSadaf Ebrahimi                     MemOperand(r1)),
1830*f5c631daSSadaf Ebrahimi                "vld3.8 {d0[],d1[],d2[]}, [r1]\n");
1831*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1832*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kAllLanes),
1833*f5c631daSSadaf Ebrahimi                     MemOperand(r11, PostIndex)),
1834*f5c631daSSadaf Ebrahimi                "vld3.8 {d0[],d1[],d2[]}, [r11]!\n");
1835*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1836*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kAllLanes),
1837*f5c631daSSadaf Ebrahimi                     MemOperand(r1, r2, PostIndex)),
1838*f5c631daSSadaf Ebrahimi                "vld3.8 {d0[],d1[],d2[]}, [r1], r2\n");
1839*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1840*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, 0),
1841*f5c631daSSadaf Ebrahimi                     MemOperand(sp)),
1842*f5c631daSSadaf Ebrahimi                "vld3.8 {d0[0],d1[0],d2[0]}, [sp]\n");
1843*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1844*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, 1),
1845*f5c631daSSadaf Ebrahimi                     MemOperand(r1, PostIndex)),
1846*f5c631daSSadaf Ebrahimi                "vld3.8 {d0[1],d1[1],d2[1]}, [r1]!\n");
1847*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld3(Untyped8,
1848*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, 2),
1849*f5c631daSSadaf Ebrahimi                     MemOperand(r1, r2, PostIndex)),
1850*f5c631daSSadaf Ebrahimi                "vld3.8 {d0[2],d1[2],d2[2]}, [r1], r2\n");
1851*f5c631daSSadaf Ebrahimi 
1852*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1853*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d6, kDouble, kMultipleLanes),
1854*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1855*f5c631daSSadaf Ebrahimi                "vld4.8 {d0,d2,d4,d6}, [r1]\n");
1856*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1857*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, kMultipleLanes),
1858*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1859*f5c631daSSadaf Ebrahimi                "vld4.8 {d0,d1,d2,d3}, [r1]!\n");
1860*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1861*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, kMultipleLanes),
1862*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1863*f5c631daSSadaf Ebrahimi                "vld4.8 {d0,d1,d2,d3}, [r1], r2\n");
1864*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1865*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, kAllLanes),
1866*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1867*f5c631daSSadaf Ebrahimi                "vld4.8 {d0[],d1[],d2[],d3[]}, [r1]\n");
1868*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1869*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d6, kDouble, kAllLanes),
1870*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1871*f5c631daSSadaf Ebrahimi                "vld4.8 {d0[],d2[],d4[],d6[]}, [r1]!\n");
1872*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1873*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, kAllLanes),
1874*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1875*f5c631daSSadaf Ebrahimi                "vld4.8 {d0[],d1[],d2[],d3[]}, [r1], r2\n");
1876*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped16,
1877*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d6, kDouble, 3),
1878*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1879*f5c631daSSadaf Ebrahimi                "vld4.16 {d0[3],d2[3],d4[3],d6[3]}, [r1]\n");
1880*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1881*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, 6),
1882*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1883*f5c631daSSadaf Ebrahimi                "vld4.8 {d0[6],d1[6],d2[6],d3[6]}, [r1]!\n");
1884*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vld4(Untyped8,
1885*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, 7),
1886*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1887*f5c631daSSadaf Ebrahimi                "vld4.8 {d0[7],d1[7],d2[7],d3[7]}, [r1], r2\n");
1888*f5c631daSSadaf Ebrahimi 
1889*f5c631daSSadaf Ebrahimi   CLEANUP();
1890*f5c631daSSadaf Ebrahimi }
1891*f5c631daSSadaf Ebrahimi 
1892*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_vst)1893*f5c631daSSadaf Ebrahimi TEST(macro_assembler_vst) {
1894*f5c631daSSadaf Ebrahimi   SETUP();
1895*f5c631daSSadaf Ebrahimi 
1896*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst1(Untyped8,
1897*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kMultipleLanes),
1898*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1899*f5c631daSSadaf Ebrahimi                "vst1.8 {d0}, [r1]\n");
1900*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst1(Untyped8,
1901*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kMultipleLanes),
1902*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1903*f5c631daSSadaf Ebrahimi                "vst1.8 {d0}, [r1]!\n");
1904*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst1(Untyped8,
1905*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, kMultipleLanes),
1906*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1907*f5c631daSSadaf Ebrahimi                "vst1.8 {d0}, [r1], r2\n");
1908*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst1(Untyped8,
1909*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, 0),
1910*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1911*f5c631daSSadaf Ebrahimi                "vst1.8 {d0[0]}, [r1]\n");
1912*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst1(Untyped8,
1913*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, 1),
1914*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1915*f5c631daSSadaf Ebrahimi                "vst1.8 {d0[1]}, [r1]!\n");
1916*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst1(Untyped8,
1917*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, 2),
1918*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1919*f5c631daSSadaf Ebrahimi                "vst1.8 {d0[2]}, [r1], r2\n");
1920*f5c631daSSadaf Ebrahimi 
1921*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst2(Untyped8,
1922*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kMultipleLanes),
1923*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1924*f5c631daSSadaf Ebrahimi                "vst2.8 {d0,d1}, [r1]\n");
1925*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst2(Untyped8,
1926*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kMultipleLanes),
1927*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1928*f5c631daSSadaf Ebrahimi                "vst2.8 {d0,d1}, [r1]!\n");
1929*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst2(Untyped8,
1930*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, kMultipleLanes),
1931*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1932*f5c631daSSadaf Ebrahimi                "vst2.8 {d0,d1}, [r1], r2\n");
1933*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst2(Untyped8,
1934*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, 3),
1935*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1936*f5c631daSSadaf Ebrahimi                "vst2.8 {d0[3],d1[3]}, [r1]\n");
1937*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst2(Untyped8,
1938*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, 4),
1939*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1940*f5c631daSSadaf Ebrahimi                "vst2.8 {d0[4],d1[4]}, [r1]!\n");
1941*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst2(Untyped8,
1942*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d1, kSingle, 5),
1943*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1944*f5c631daSSadaf Ebrahimi                "vst2.8 {d0[5],d1[5]}, [r1], r2\n");
1945*f5c631daSSadaf Ebrahimi 
1946*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst3(Untyped8,
1947*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kMultipleLanes),
1948*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1949*f5c631daSSadaf Ebrahimi                "vst3.8 {d0,d1,d2}, [r1]\n");
1950*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst3(Untyped8,
1951*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kMultipleLanes),
1952*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1953*f5c631daSSadaf Ebrahimi                "vst3.8 {d0,d1,d2}, [r1]!\n");
1954*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst3(Untyped8,
1955*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, kMultipleLanes),
1956*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1957*f5c631daSSadaf Ebrahimi                "vst3.8 {d0,d1,d2}, [r1], r2\n");
1958*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst3(Untyped8,
1959*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, 0),
1960*f5c631daSSadaf Ebrahimi                     MemOperand(r1)),
1961*f5c631daSSadaf Ebrahimi                "vst3.8 {d0[0],d1[0],d2[0]}, [r1]\n");
1962*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst3(Untyped8,
1963*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, 6),
1964*f5c631daSSadaf Ebrahimi                     MemOperand(r1, PostIndex)),
1965*f5c631daSSadaf Ebrahimi                "vst3.8 {d0[6],d1[6],d2[6]}, [r1]!\n");
1966*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst3(Untyped8,
1967*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d2, kSingle, 7),
1968*f5c631daSSadaf Ebrahimi                     MemOperand(r1, r2, PostIndex)),
1969*f5c631daSSadaf Ebrahimi                "vst3.8 {d0[7],d1[7],d2[7]}, [r1], r2\n");
1970*f5c631daSSadaf Ebrahimi 
1971*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst4(Untyped8,
1972*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d10, d13, kSingle, kMultipleLanes),
1973*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1974*f5c631daSSadaf Ebrahimi                "vst4.8 {d10,d11,d12,d13}, [r1]\n");
1975*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst4(Untyped8,
1976*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d10, d13, kSingle, kMultipleLanes),
1977*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1978*f5c631daSSadaf Ebrahimi                "vst4.8 {d10,d11,d12,d13}, [r1]!\n");
1979*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst4(Untyped8,
1980*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, kMultipleLanes),
1981*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r8, kNoAlignment, r9, PostIndex)),
1982*f5c631daSSadaf Ebrahimi                "vst4.8 {d0,d1,d2,d3}, [r8], r9\n");
1983*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst4(Untyped8,
1984*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, 0),
1985*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment)),
1986*f5c631daSSadaf Ebrahimi                "vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]\n");
1987*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst4(Untyped8,
1988*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, 0),
1989*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, PostIndex)),
1990*f5c631daSSadaf Ebrahimi                "vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!\n");
1991*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vst4(Untyped8,
1992*f5c631daSSadaf Ebrahimi                     NeonRegisterList(d0, d3, kSingle, 0),
1993*f5c631daSSadaf Ebrahimi                     AlignedMemOperand(r1, kNoAlignment, r2, PostIndex)),
1994*f5c631daSSadaf Ebrahimi                "vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1], r2\n");
1995*f5c631daSSadaf Ebrahimi 
1996*f5c631daSSadaf Ebrahimi   CLEANUP();
1997*f5c631daSSadaf Ebrahimi }
1998*f5c631daSSadaf Ebrahimi 
1999*f5c631daSSadaf Ebrahimi 
TEST(assembler_vldm_vstm_negative)2000*f5c631daSSadaf Ebrahimi TEST(assembler_vldm_vstm_negative) {
2001*f5c631daSSadaf Ebrahimi   SETUP();
2002*f5c631daSSadaf Ebrahimi 
2003*f5c631daSSadaf Ebrahimi   ExactAssemblyScope scope(&masm, 0, CodeBufferCheckScope::kMaximumSize);
2004*f5c631daSSadaf Ebrahimi 
2005*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(fldmdbx(pc, WRITE_BACK, DRegisterList(d0)),
2006*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2007*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(fldmiax(pc, WRITE_BACK, DRegisterList(d0)),
2008*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2009*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(fldmiax(pc, NO_WRITE_BACK, DRegisterList(d0)),
2010*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2011*f5c631daSSadaf Ebrahimi 
2012*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(fstmdbx(pc, WRITE_BACK, DRegisterList(d0)),
2013*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2014*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(fstmiax(pc, WRITE_BACK, DRegisterList(d0)),
2015*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2016*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(fstmiax(pc, NO_WRITE_BACK, DRegisterList(d0)),
2017*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2018*f5c631daSSadaf Ebrahimi 
2019*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vldmdb(pc, WRITE_BACK, SRegisterList(s0)),
2020*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2021*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vldm(pc, WRITE_BACK, SRegisterList(s0)),
2022*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2023*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vldm(pc, NO_WRITE_BACK, SRegisterList(s0)),
2024*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2025*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vldmia(pc, WRITE_BACK, SRegisterList(s0)),
2026*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2027*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vldmia(pc, NO_WRITE_BACK, SRegisterList(s0)),
2028*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2029*f5c631daSSadaf Ebrahimi 
2030*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vldmdb(pc, WRITE_BACK, DRegisterList(d0)),
2031*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2032*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vldm(pc, WRITE_BACK, DRegisterList(d0)),
2033*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2034*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vldm(pc, NO_WRITE_BACK, DRegisterList(d0)),
2035*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2036*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vldmia(pc, WRITE_BACK, DRegisterList(d0)),
2037*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2038*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vldmia(pc, NO_WRITE_BACK, DRegisterList(d0)),
2039*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2040*f5c631daSSadaf Ebrahimi 
2041*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vstmdb(pc, WRITE_BACK, SRegisterList(s0)),
2042*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2043*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vstm(pc, WRITE_BACK, SRegisterList(s0)),
2044*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2045*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vstm(pc, NO_WRITE_BACK, SRegisterList(s0)),
2046*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2047*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vstmia(pc, WRITE_BACK, SRegisterList(s0)),
2048*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2049*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vstmia(pc, NO_WRITE_BACK, SRegisterList(s0)),
2050*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2051*f5c631daSSadaf Ebrahimi 
2052*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vstmdb(pc, WRITE_BACK, DRegisterList(d0)),
2053*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2054*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vstm(pc, WRITE_BACK, DRegisterList(d0)),
2055*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2056*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vstm(pc, NO_WRITE_BACK, DRegisterList(d0)),
2057*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2058*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(vstmia(pc, WRITE_BACK, DRegisterList(d0)),
2059*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2060*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vstmia(pc, NO_WRITE_BACK, DRegisterList(d0)),
2061*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2062*f5c631daSSadaf Ebrahimi 
2063*f5c631daSSadaf Ebrahimi   CLEANUP();
2064*f5c631daSSadaf Ebrahimi }
2065*f5c631daSSadaf Ebrahimi 
2066*f5c631daSSadaf Ebrahimi 
2067*f5c631daSSadaf Ebrahimi #define TEST_VMEMOP(MACRO_OP, STRING_OP, DST_REG)                    \
2068*f5c631daSSadaf Ebrahimi   SETUP();                                                           \
2069*f5c631daSSadaf Ebrahimi                                                                      \
2070*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, 1024)),               \
2071*f5c631daSSadaf Ebrahimi               "add ip, r8, #1024\n" STRING_OP #DST_REG ", [ip]\n");  \
2072*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, 1371)),               \
2073*f5c631daSSadaf Ebrahimi               "add ip, r8, #1371\n" STRING_OP #DST_REG ", [ip]\n");  \
2074*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, 4113)),               \
2075*f5c631daSSadaf Ebrahimi               "add ip, r8, #17\n"                                    \
2076*f5c631daSSadaf Ebrahimi               "add ip, #4096\n" STRING_OP #DST_REG ", [ip]\n");      \
2077*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, 65808)),              \
2078*f5c631daSSadaf Ebrahimi               "add ip, r8, #272\n"                                   \
2079*f5c631daSSadaf Ebrahimi               "add ip, #65536\n" STRING_OP #DST_REG ", [ip]\n");     \
2080*f5c631daSSadaf Ebrahimi                                                                      \
2081*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, -1024)),              \
2082*f5c631daSSadaf Ebrahimi               "sub ip, r8, #1024\n" STRING_OP #DST_REG ", [ip]\n");  \
2083*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, -1371)),              \
2084*f5c631daSSadaf Ebrahimi               "sub ip, r8, #1371\n" STRING_OP #DST_REG ", [ip]\n");  \
2085*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, -4113)),              \
2086*f5c631daSSadaf Ebrahimi               "sub ip, r8, #17\n"                                    \
2087*f5c631daSSadaf Ebrahimi               "sub ip, #4096\n" STRING_OP #DST_REG ", [ip]\n");      \
2088*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r8, -65808)),             \
2089*f5c631daSSadaf Ebrahimi               "sub ip, r8, #272\n"                                   \
2090*f5c631daSSadaf Ebrahimi               "sub ip, #65536\n" STRING_OP #DST_REG ", [ip]\n");     \
2091*f5c631daSSadaf Ebrahimi                                                                      \
2092*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, 0, PreIndex)),        \
2093*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG ", [r9]\n");                        \
2094*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, 137, PreIndex)),      \
2095*f5c631daSSadaf Ebrahimi               "add r9, #137\n" STRING_OP #DST_REG ", [r9]\n");       \
2096*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, 4110, PreIndex)),     \
2097*f5c631daSSadaf Ebrahimi               "add r9, #14\n"                                        \
2098*f5c631daSSadaf Ebrahimi               "add r9, #4096\n" STRING_OP #DST_REG ", [r9]\n");      \
2099*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, 65623, PreIndex)),    \
2100*f5c631daSSadaf Ebrahimi               "add r9, #87\n"                                        \
2101*f5c631daSSadaf Ebrahimi               "add r9, #65536\n" STRING_OP #DST_REG ", [r9]\n");     \
2102*f5c631daSSadaf Ebrahimi                                                                      \
2103*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, -137, PreIndex)),     \
2104*f5c631daSSadaf Ebrahimi               "sub r9, #137\n" STRING_OP #DST_REG ", [r9]\n");       \
2105*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, -4110, PreIndex)),    \
2106*f5c631daSSadaf Ebrahimi               "sub r9, #14\n"                                        \
2107*f5c631daSSadaf Ebrahimi               "sub r9, #4096\n" STRING_OP #DST_REG ", [r9]\n");      \
2108*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r9, -65623, PreIndex)),   \
2109*f5c631daSSadaf Ebrahimi               "sub r9, #87\n"                                        \
2110*f5c631daSSadaf Ebrahimi               "sub r9, #65536\n" STRING_OP #DST_REG ", [r9]\n");     \
2111*f5c631daSSadaf Ebrahimi                                                                      \
2112*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, 0, PostIndex)),      \
2113*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG ", [r10]\n");                       \
2114*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, 137, PostIndex)),    \
2115*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2116*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2117*f5c631daSSadaf Ebrahimi               "add r10, #137\n");                                    \
2118*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, 4110, PostIndex)),   \
2119*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2120*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2121*f5c631daSSadaf Ebrahimi               "add r10, #14\n"                                       \
2122*f5c631daSSadaf Ebrahimi               "add r10, #4096\n");                                   \
2123*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, 65623, PostIndex)),  \
2124*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2125*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2126*f5c631daSSadaf Ebrahimi               "add r10, #87\n"                                       \
2127*f5c631daSSadaf Ebrahimi               "add r10, #65536\n");                                  \
2128*f5c631daSSadaf Ebrahimi                                                                      \
2129*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, -137, PostIndex)),   \
2130*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2131*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2132*f5c631daSSadaf Ebrahimi               "sub r10, #137\n");                                    \
2133*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, -4110, PostIndex)),  \
2134*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2135*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2136*f5c631daSSadaf Ebrahimi               "sub r10, #14\n"                                       \
2137*f5c631daSSadaf Ebrahimi               "sub r10, #4096\n");                                   \
2138*f5c631daSSadaf Ebrahimi   COMPARE_T32(MACRO_OP(DST_REG, MemOperand(r10, -65623, PostIndex)), \
2139*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2140*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2141*f5c631daSSadaf Ebrahimi               "sub r10, #87\n"                                       \
2142*f5c631daSSadaf Ebrahimi               "sub r10, #65536\n");                                  \
2143*f5c631daSSadaf Ebrahimi   CLEANUP();
2144*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_T32_Vldr_d)2145*f5c631daSSadaf Ebrahimi TEST(macro_assembler_T32_Vldr_d) { TEST_VMEMOP(Vldr, "vldr ", d0); }
2146*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_T32_Vstr_d)2147*f5c631daSSadaf Ebrahimi TEST(macro_assembler_T32_Vstr_d) { TEST_VMEMOP(Vstr, "vstr ", d1); }
2148*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_T32_Vldr_s)2149*f5c631daSSadaf Ebrahimi TEST(macro_assembler_T32_Vldr_s) { TEST_VMEMOP(Vldr, "vldr ", s2); }
2150*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_T32_Vstr_s)2151*f5c631daSSadaf Ebrahimi TEST(macro_assembler_T32_Vstr_s) { TEST_VMEMOP(Vstr, "vstr ", s3); }
2152*f5c631daSSadaf Ebrahimi 
2153*f5c631daSSadaf Ebrahimi #undef TEST_VMEMOP
2154*f5c631daSSadaf Ebrahimi 
2155*f5c631daSSadaf Ebrahimi #define TEST_VMEMOP(MACRO_OP, STRING_OP, DST_REG)                    \
2156*f5c631daSSadaf Ebrahimi   SETUP();                                                           \
2157*f5c631daSSadaf Ebrahimi                                                                      \
2158*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r8, 137)),                \
2159*f5c631daSSadaf Ebrahimi               "add ip, r8, #137\n" STRING_OP #DST_REG ", [ip]\n");   \
2160*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r8, 274)),                \
2161*f5c631daSSadaf Ebrahimi               "add ip, r8, #18\n"                                    \
2162*f5c631daSSadaf Ebrahimi               "add ip, #256\n" STRING_OP #DST_REG ", [ip]\n");       \
2163*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r8, 65623)),              \
2164*f5c631daSSadaf Ebrahimi               "add ip, r8, #87\n"                                    \
2165*f5c631daSSadaf Ebrahimi               "add ip, #65536\n" STRING_OP #DST_REG ", [ip]\n");     \
2166*f5c631daSSadaf Ebrahimi                                                                      \
2167*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r8, -137)),               \
2168*f5c631daSSadaf Ebrahimi               "sub ip, r8, #137\n" STRING_OP #DST_REG ", [ip]\n");   \
2169*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r8, -274)),               \
2170*f5c631daSSadaf Ebrahimi               "sub ip, r8, #18\n"                                    \
2171*f5c631daSSadaf Ebrahimi               "sub ip, #256\n" STRING_OP #DST_REG ", [ip]\n");       \
2172*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r8, -65623)),             \
2173*f5c631daSSadaf Ebrahimi               "sub ip, r8, #87\n"                                    \
2174*f5c631daSSadaf Ebrahimi               "sub ip, #65536\n" STRING_OP #DST_REG ", [ip]\n");     \
2175*f5c631daSSadaf Ebrahimi                                                                      \
2176*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, 0, PreIndex)),        \
2177*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG ", [r9]\n");                        \
2178*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, 137, PreIndex)),      \
2179*f5c631daSSadaf Ebrahimi               "add r9, #137\n" STRING_OP #DST_REG ", [r9]\n");       \
2180*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, 274, PreIndex)),      \
2181*f5c631daSSadaf Ebrahimi               "add r9, #18\n"                                        \
2182*f5c631daSSadaf Ebrahimi               "add r9, #256\n" STRING_OP #DST_REG ", [r9]\n");       \
2183*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, 65623, PreIndex)),    \
2184*f5c631daSSadaf Ebrahimi               "add r9, #87\n"                                        \
2185*f5c631daSSadaf Ebrahimi               "add r9, #65536\n" STRING_OP #DST_REG ", [r9]\n");     \
2186*f5c631daSSadaf Ebrahimi                                                                      \
2187*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, -137, PreIndex)),     \
2188*f5c631daSSadaf Ebrahimi               "sub r9, #137\n" STRING_OP #DST_REG ", [r9]\n");       \
2189*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, -274, PreIndex)),     \
2190*f5c631daSSadaf Ebrahimi               "sub r9, #18\n"                                        \
2191*f5c631daSSadaf Ebrahimi               "sub r9, #256\n" STRING_OP #DST_REG ", [r9]\n");       \
2192*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r9, -65623, PreIndex)),   \
2193*f5c631daSSadaf Ebrahimi               "sub r9, #87\n"                                        \
2194*f5c631daSSadaf Ebrahimi               "sub r9, #65536\n" STRING_OP #DST_REG ", [r9]\n");     \
2195*f5c631daSSadaf Ebrahimi                                                                      \
2196*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, 0, PostIndex)),      \
2197*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG ", [r10]\n");                       \
2198*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, 137, PostIndex)),    \
2199*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2200*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2201*f5c631daSSadaf Ebrahimi               "add r10, #137\n");                                    \
2202*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, 274, PostIndex)),    \
2203*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2204*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2205*f5c631daSSadaf Ebrahimi               "add r10, #18\n"                                       \
2206*f5c631daSSadaf Ebrahimi               "add r10, #256\n");                                    \
2207*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, 65623, PostIndex)),  \
2208*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2209*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2210*f5c631daSSadaf Ebrahimi               "add r10, #87\n"                                       \
2211*f5c631daSSadaf Ebrahimi               "add r10, #65536\n");                                  \
2212*f5c631daSSadaf Ebrahimi                                                                      \
2213*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, -137, PostIndex)),   \
2214*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2215*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2216*f5c631daSSadaf Ebrahimi               "sub r10, #137\n");                                    \
2217*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, -274, PostIndex)),   \
2218*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2219*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2220*f5c631daSSadaf Ebrahimi               "sub r10, #18\n"                                       \
2221*f5c631daSSadaf Ebrahimi               "sub r10, #256\n");                                    \
2222*f5c631daSSadaf Ebrahimi   COMPARE_A32(MACRO_OP(DST_REG, MemOperand(r10, -65623, PostIndex)), \
2223*f5c631daSSadaf Ebrahimi               STRING_OP #DST_REG                                     \
2224*f5c631daSSadaf Ebrahimi               ", [r10]\n"                                            \
2225*f5c631daSSadaf Ebrahimi               "sub r10, #87\n"                                       \
2226*f5c631daSSadaf Ebrahimi               "sub r10, #65536\n");                                  \
2227*f5c631daSSadaf Ebrahimi   CLEANUP();
2228*f5c631daSSadaf Ebrahimi 
2229*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_A32_Vldr_d)2230*f5c631daSSadaf Ebrahimi TEST(macro_assembler_A32_Vldr_d) { TEST_VMEMOP(Vldr, "vldr ", d0); }
2231*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_A32_Vstr_d)2232*f5c631daSSadaf Ebrahimi TEST(macro_assembler_A32_Vstr_d) { TEST_VMEMOP(Vstr, "vstr ", d1); }
2233*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_A32_Vldr_s)2234*f5c631daSSadaf Ebrahimi TEST(macro_assembler_A32_Vldr_s) { TEST_VMEMOP(Vldr, "vldr ", s2); }
2235*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_A32_Vstr_s)2236*f5c631daSSadaf Ebrahimi TEST(macro_assembler_A32_Vstr_s) { TEST_VMEMOP(Vstr, "vstr ", s3); }
2237*f5c631daSSadaf Ebrahimi 
2238*f5c631daSSadaf Ebrahimi #undef TEST_VMEMOP
2239*f5c631daSSadaf Ebrahimi 
TEST(assembler_vstr_negative)2240*f5c631daSSadaf Ebrahimi TEST(assembler_vstr_negative) {
2241*f5c631daSSadaf Ebrahimi   SETUP();
2242*f5c631daSSadaf Ebrahimi 
2243*f5c631daSSadaf Ebrahimi   ExactAssemblyScope scope(&masm, 8, CodeBufferCheckScope::kMaximumSize);
2244*f5c631daSSadaf Ebrahimi 
2245*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vstr(s0, MemOperand(pc, 0)),
2246*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2247*f5c631daSSadaf Ebrahimi 
2248*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(vstr(d0, MemOperand(pc, 0)),
2249*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2250*f5c631daSSadaf Ebrahimi 
2251*f5c631daSSadaf Ebrahimi   CLEANUP();
2252*f5c631daSSadaf Ebrahimi }
2253*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Vldr_Vstr_negative)2254*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Vldr_Vstr_negative) {
2255*f5c631daSSadaf Ebrahimi   SETUP();
2256*f5c631daSSadaf Ebrahimi 
2257*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vldr(s0, MemOperand(pc, 1, PreIndex)),
2258*f5c631daSSadaf Ebrahimi                       "The MacroAssembler does not convert vldr or vstr"
2259*f5c631daSSadaf Ebrahimi                       " with a PC base register.\n");
2260*f5c631daSSadaf Ebrahimi 
2261*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vldr(s0, MemOperand(pc, r0, PreIndex)),
2262*f5c631daSSadaf Ebrahimi                       "Ill-formed 'vldr' instruction.\n");
2263*f5c631daSSadaf Ebrahimi 
2264*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vstr(s0, MemOperand(pc, 1, PreIndex)),
2265*f5c631daSSadaf Ebrahimi                       "The MacroAssembler does not convert vldr or vstr"
2266*f5c631daSSadaf Ebrahimi                       " with a PC base register.\n");
2267*f5c631daSSadaf Ebrahimi 
2268*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vstr(s0, MemOperand(pc, r0, PreIndex)),
2269*f5c631daSSadaf Ebrahimi                       "Ill-formed 'vstr' instruction.\n");
2270*f5c631daSSadaf Ebrahimi 
2271*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vldr(d0, MemOperand(pc, 1, PreIndex)),
2272*f5c631daSSadaf Ebrahimi                       "The MacroAssembler does not convert vldr or vstr"
2273*f5c631daSSadaf Ebrahimi                       " with a PC base register.\n");
2274*f5c631daSSadaf Ebrahimi 
2275*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vldr(d0, MemOperand(pc, r0, PreIndex)),
2276*f5c631daSSadaf Ebrahimi                       "Ill-formed 'vldr' instruction.\n");
2277*f5c631daSSadaf Ebrahimi 
2278*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vstr(d0, MemOperand(pc, 1, PreIndex)),
2279*f5c631daSSadaf Ebrahimi                       "The MacroAssembler does not convert vldr or vstr"
2280*f5c631daSSadaf Ebrahimi                       " with a PC base register.\n");
2281*f5c631daSSadaf Ebrahimi 
2282*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Vstr(d0, MemOperand(pc, r0, PreIndex)),
2283*f5c631daSSadaf Ebrahimi                       "Ill-formed 'vstr' instruction.\n");
2284*f5c631daSSadaf Ebrahimi   CLEANUP();
2285*f5c631daSSadaf Ebrahimi }
2286*f5c631daSSadaf Ebrahimi 
2287*f5c631daSSadaf Ebrahimi #define TEST_SHIFT_T32(Inst, name, offset)          \
2288*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, LSL, r2)),       \
2289*f5c631daSSadaf Ebrahimi               "lsl ip, r1, r2\n" name " r0, ip\n"); \
2290*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, LSR, r2)),       \
2291*f5c631daSSadaf Ebrahimi               "lsr ip, r1, r2\n" name " r0, ip\n"); \
2292*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, ASR, r2)),       \
2293*f5c631daSSadaf Ebrahimi               "asr ip, r1, r2\n" name " r0, ip\n"); \
2294*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, ROR, r2)),       \
2295*f5c631daSSadaf Ebrahimi               "ror ip, r1, r2\n" name " r0, ip\n"); \
2296*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(eq, r0, Operand(r1, LSL, r2)),   \
2297*f5c631daSSadaf Ebrahimi               "bne " #offset                        \
2298*f5c631daSSadaf Ebrahimi               "\n"                                  \
2299*f5c631daSSadaf Ebrahimi               "lsl ip, r1, r2\n" name " r0, ip\n"); \
2300*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(le, r0, Operand(r1, LSL, r2)),   \
2301*f5c631daSSadaf Ebrahimi               "bgt " #offset                        \
2302*f5c631daSSadaf Ebrahimi               "\n"                                  \
2303*f5c631daSSadaf Ebrahimi               "lsl ip, r1, r2\n" name " r0, ip\n");
2304*f5c631daSSadaf Ebrahimi 
2305*f5c631daSSadaf Ebrahimi #define TEST_MOV_SHIFT_T32(Inst, s, offset)                             \
2306*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, LSL, r2)), "lsl" s " r0, r1, r2\n"); \
2307*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, LSR, r2)), "lsr" s " r0, r1, r2\n"); \
2308*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, ASR, r2)), "asr" s " r0, r1, r2\n"); \
2309*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(r0, Operand(r1, ROR, r2)), "ror" s " r0, r1, r2\n"); \
2310*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(eq, r0, Operand(r1, LSL, r2)),                       \
2311*f5c631daSSadaf Ebrahimi               "bne " #offset                                            \
2312*f5c631daSSadaf Ebrahimi               "\n"                                                      \
2313*f5c631daSSadaf Ebrahimi               "lsl" s " r0, r1, r2\n");                                 \
2314*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(le, r0, Operand(r1, LSL, r2)),                       \
2315*f5c631daSSadaf Ebrahimi               "bgt " #offset                                            \
2316*f5c631daSSadaf Ebrahimi               "\n"                                                      \
2317*f5c631daSSadaf Ebrahimi               "lsl" s " r0, r1, r2\n");
2318*f5c631daSSadaf Ebrahimi 
2319*f5c631daSSadaf Ebrahimi #define TEST_WIDE_IMMEDIATE(Inst, name, offset)         \
2320*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Inst(r0, 0xbadbeef),                     \
2321*f5c631daSSadaf Ebrahimi                "mov ip, #48879\n"                       \
2322*f5c631daSSadaf Ebrahimi                "movt ip, #2989\n" name " r0, ip\n");    \
2323*f5c631daSSadaf Ebrahimi   COMPARE_A32(Inst(eq, r0, 0xbadbeef),                  \
2324*f5c631daSSadaf Ebrahimi               "moveq ip, #48879\n"                      \
2325*f5c631daSSadaf Ebrahimi               "movteq ip, #2989\n" name "eq r0, ip\n"); \
2326*f5c631daSSadaf Ebrahimi   COMPARE_T32(Inst(eq, r0, 0xbadbeef),                  \
2327*f5c631daSSadaf Ebrahimi               "bne " #offset                            \
2328*f5c631daSSadaf Ebrahimi               "\n"                                      \
2329*f5c631daSSadaf Ebrahimi               "mov ip, #48879\n"                        \
2330*f5c631daSSadaf Ebrahimi               "movt ip, #2989\n" name " r0, ip\n");
2331*f5c631daSSadaf Ebrahimi 
2332*f5c631daSSadaf Ebrahimi #define TEST_WIDE_IMMEDIATE_PC(Inst, name, offset)            \
2333*f5c631daSSadaf Ebrahimi   COMPARE_A32(Inst(pc, 0xbadbeef),                            \
2334*f5c631daSSadaf Ebrahimi               "mov ip, #48879\n"                              \
2335*f5c631daSSadaf Ebrahimi               "movt ip, #2989\n" name " pc, ip\n");           \
2336*f5c631daSSadaf Ebrahimi   COMPARE_A32(Inst(eq, pc, 0xbadbeef),                        \
2337*f5c631daSSadaf Ebrahimi               "moveq ip, #48879\n"                            \
2338*f5c631daSSadaf Ebrahimi               "movteq ip, #2989\n" name "eq pc, ip\n");       \
2339*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Inst(pc, 0xbadbeef),                     \
2340*f5c631daSSadaf Ebrahimi                      "Ill-formed '" name "' instruction.\n"); \
2341*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Inst(eq, pc, 0xbadbeef),                 \
2342*f5c631daSSadaf Ebrahimi                      "Ill-formed '" name "' instruction.\n");
2343*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_InstructionCondSizeROp)2344*f5c631daSSadaf Ebrahimi TEST(macro_assembler_InstructionCondSizeROp) {
2345*f5c631daSSadaf Ebrahimi   SETUP();
2346*f5c631daSSadaf Ebrahimi 
2347*f5c631daSSadaf Ebrahimi   // T32 register shifted register.
2348*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Cmn, "cmn", 0x0000000a)
2349*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Cmp, "cmp", 0x00000008)
2350*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Mvn, "mvn", 0x0000000a)
2351*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Mvns, "mvns", 0x0000000a)
2352*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Sxtb, "sxtb", 0x0000000a)
2353*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Sxth, "sxth", 0x0000000a)
2354*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Tst, "tst", 0x0000000a)
2355*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Uxtb, "uxtb", 0x0000000a)
2356*f5c631daSSadaf Ebrahimi   TEST_SHIFT_T32(Uxth, "uxth", 0x0000000a)
2357*f5c631daSSadaf Ebrahimi 
2358*f5c631daSSadaf Ebrahimi   TEST_MOV_SHIFT_T32(Mov, "", 0x00000006)
2359*f5c631daSSadaf Ebrahimi   TEST_MOV_SHIFT_T32(Movs, "s", 0x00000006)
2360*f5c631daSSadaf Ebrahimi 
2361*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, r0), "Unpredictable instruction.\n");
2362*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, Operand(r0, LSL, 0x4)),
2363*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2364*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, Operand(r0, ASR, r2)),
2365*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2366*f5c631daSSadaf Ebrahimi 
2367*f5c631daSSadaf Ebrahimi   // Wide immediates (Mov and Movs are tested in
2368*f5c631daSSadaf Ebrahimi   // "macro_assembler_wide_immediate").
2369*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE(Cmp, "cmp", 0x0000000c);
2370*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE(Cmn, "cmn", 0x0000000e);
2371*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE(Tst, "tst", 0x0000000e);
2372*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE_PC(Cmp, "cmp", 0x0000000c);
2373*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE_PC(Cmn, "cmn", 0x0000000e);
2374*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE_PC(Tst, "tst", 0x0000000e);
2375*f5c631daSSadaf Ebrahimi 
2376*f5c631daSSadaf Ebrahimi   // For Mvn and Mvns, we don't allow PC as a destination.
2377*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE(Mvn, "mvn", 0x0000000e);
2378*f5c631daSSadaf Ebrahimi   TEST_WIDE_IMMEDIATE(Mvns, "mvns", 0x0000000e);
2379*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mvn(pc, 0xbadbeef), "Ill-formed 'mvn' instruction.\n");
2380*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mvn(eq, pc, 0xbadbeef),
2381*f5c631daSSadaf Ebrahimi                       "Ill-formed 'mvn' instruction.\n");
2382*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mvns(pc, 0xbadbeef), "Ill-formed 'mvns' instruction.\n");
2383*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mvns(eq, pc, 0xbadbeef),
2384*f5c631daSSadaf Ebrahimi                       "Ill-formed 'mvns' instruction.\n");
2385*f5c631daSSadaf Ebrahimi 
2386*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Sxtb(r0, 0x1), "Ill-formed 'sxtb' instruction.\n");
2387*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Sxth(r0, 0x1), "Ill-formed 'sxth' instruction.\n");
2388*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Uxtb(r0, 0x1), "Ill-formed 'uxtb' instruction.\n");
2389*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Uxth(r0, 0x1), "Ill-formed 'uxth' instruction.\n");
2390*f5c631daSSadaf Ebrahimi 
2391*f5c631daSSadaf Ebrahimi   CLEANUP();
2392*f5c631daSSadaf Ebrahimi }
2393*f5c631daSSadaf Ebrahimi 
2394*f5c631daSSadaf Ebrahimi #undef TEST_SHIFT_T32
2395*f5c631daSSadaf Ebrahimi #undef TEST_MOV_SHIFT_T32
2396*f5c631daSSadaf Ebrahimi #undef TEST_WIDE_IMMEDIATE
2397*f5c631daSSadaf Ebrahimi #undef TEST_WIDE_IMMEDIATE_PC
2398*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Msr)2399*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Msr) {
2400*f5c631daSSadaf Ebrahimi   SETUP();
2401*f5c631daSSadaf Ebrahimi 
2402*f5c631daSSadaf Ebrahimi   // Msr with immediate for T32.
2403*f5c631daSSadaf Ebrahimi   COMPARE_T32(Msr(APSR_nzcvq, 0x0),
2404*f5c631daSSadaf Ebrahimi               "mov ip, #0\n"
2405*f5c631daSSadaf Ebrahimi               "msr APSR_nzcvq, ip\n");
2406*f5c631daSSadaf Ebrahimi 
2407*f5c631daSSadaf Ebrahimi   // Wide immediate.
2408*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Msr(APSR_nzcvq, 0xbadbeef),
2409*f5c631daSSadaf Ebrahimi                "mov ip, #48879\n"
2410*f5c631daSSadaf Ebrahimi                "movt ip, #2989\n"
2411*f5c631daSSadaf Ebrahimi                "msr APSR_nzcvq, ip\n");
2412*f5c631daSSadaf Ebrahimi 
2413*f5c631daSSadaf Ebrahimi   // Other types of operands are not handled.
2414*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Msr(APSR_nzcvq, Operand(r0, LSR, r1)),
2415*f5c631daSSadaf Ebrahimi                       "Ill-formed 'msr' instruction.\n");
2416*f5c631daSSadaf Ebrahimi   CLEANUP();
2417*f5c631daSSadaf Ebrahimi }
2418*f5c631daSSadaf Ebrahimi 
2419*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Vmov_imm)2420*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Vmov_imm) {
2421*f5c631daSSadaf Ebrahimi   SETUP();
2422*f5c631daSSadaf Ebrahimi 
2423*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(s0, 0.0f),
2424*f5c631daSSadaf Ebrahimi                "mov ip, #0\n"
2425*f5c631daSSadaf Ebrahimi                "vmov s0, ip\n");
2426*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(s1, 1.0f), "vmov.f32 s1, #1\n");
2427*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(s2, RawbitsToFloat(0x0000db6c)),
2428*f5c631daSSadaf Ebrahimi                "mov ip, #56172\n"
2429*f5c631daSSadaf Ebrahimi                "vmov s2, ip\n");
2430*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(s3, RawbitsToFloat(0x327b23c6)),
2431*f5c631daSSadaf Ebrahimi                "mov ip, #9158\n"
2432*f5c631daSSadaf Ebrahimi                "movt ip, #12923\n"
2433*f5c631daSSadaf Ebrahimi                "vmov s3, ip\n");
2434*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(s4, RawbitsToFloat(0xffcc7fff)),
2435*f5c631daSSadaf Ebrahimi                "mvn ip, #3375104\n"
2436*f5c631daSSadaf Ebrahimi                "vmov s4, ip\n");
2437*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(s5, RawbitsToFloat(0xb72df575)),
2438*f5c631daSSadaf Ebrahimi                "mov ip, #62837\n"
2439*f5c631daSSadaf Ebrahimi                "movt ip, #46893\n"
2440*f5c631daSSadaf Ebrahimi                "vmov s5, ip\n");
2441*f5c631daSSadaf Ebrahimi 
2442*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d6, 0.0), "vmov.i64 d6, #0x0000000000000000\n");
2443*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d7, 1.0), "vmov.f64 d7, #1\n");
2444*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d8, RawbitsToDouble(0x000000000000af8e)),
2445*f5c631daSSadaf Ebrahimi                "mov ip, #44942\n"
2446*f5c631daSSadaf Ebrahimi                "vdup.32 d8, ip\n"
2447*f5c631daSSadaf Ebrahimi                "mov ip, #0\n"
2448*f5c631daSSadaf Ebrahimi                "vmov.32 d8[1], ip\n");
2449*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d9, RawbitsToDouble(0x000070210000af8e)),
2450*f5c631daSSadaf Ebrahimi                "mov ip, #44942\n"
2451*f5c631daSSadaf Ebrahimi                "vdup.32 d9, ip\n"
2452*f5c631daSSadaf Ebrahimi                "mov ip, #28705\n"
2453*f5c631daSSadaf Ebrahimi                "vmov.32 d9[1], ip\n");
2454*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d10, RawbitsToDouble(0x7021000000000000)),
2455*f5c631daSSadaf Ebrahimi                "mov ip, #0\n"
2456*f5c631daSSadaf Ebrahimi                "vdup.32 d10, ip\n"
2457*f5c631daSSadaf Ebrahimi                "mov ip, #0\n"
2458*f5c631daSSadaf Ebrahimi                "movt ip, #28705\n"
2459*f5c631daSSadaf Ebrahimi                "vmov.32 d10[1], ip\n");
2460*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d11, RawbitsToDouble(0x7021da4b0000af8e)),
2461*f5c631daSSadaf Ebrahimi                "mov ip, #44942\n"
2462*f5c631daSSadaf Ebrahimi                "vdup.32 d11, ip\n"
2463*f5c631daSSadaf Ebrahimi                "mov ip, #55883\n"
2464*f5c631daSSadaf Ebrahimi                "movt ip, #28705\n"
2465*f5c631daSSadaf Ebrahimi                "vmov.32 d11[1], ip\n");
2466*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d12, RawbitsToDouble(0x0cff553204ec4a3f)),
2467*f5c631daSSadaf Ebrahimi                "mov ip, #19007\n"
2468*f5c631daSSadaf Ebrahimi                "movt ip, #1260\n"
2469*f5c631daSSadaf Ebrahimi                "vdup.32 d12, ip\n"
2470*f5c631daSSadaf Ebrahimi                "mov ip, #21810\n"
2471*f5c631daSSadaf Ebrahimi                "movt ip, #3327\n"
2472*f5c631daSSadaf Ebrahimi                "vmov.32 d12[1], ip\n");
2473*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d13, RawbitsToDouble(0xa2037ad20000f592)),
2474*f5c631daSSadaf Ebrahimi                "mov ip, #62866\n"
2475*f5c631daSSadaf Ebrahimi                "vdup.32 d13, ip\n"
2476*f5c631daSSadaf Ebrahimi                "mov ip, #31442\n"
2477*f5c631daSSadaf Ebrahimi                "movt ip, #41475\n"
2478*f5c631daSSadaf Ebrahimi                "vmov.32 d13[1], ip\n");
2479*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(d14, RawbitsToDouble(0xe62556c325a59470)),
2480*f5c631daSSadaf Ebrahimi                "mov ip, #38000\n"
2481*f5c631daSSadaf Ebrahimi                "movt ip, #9637\n"
2482*f5c631daSSadaf Ebrahimi                "vdup.32 d14, ip\n"
2483*f5c631daSSadaf Ebrahimi                "mov ip, #22211\n"
2484*f5c631daSSadaf Ebrahimi                "movt ip, #58917\n"
2485*f5c631daSSadaf Ebrahimi                "vmov.32 d14[1], ip\n");
2486*f5c631daSSadaf Ebrahimi   CLEANUP();
2487*f5c631daSSadaf Ebrahimi }
2488*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_PushRegisterList)2489*f5c631daSSadaf Ebrahimi TEST(macro_assembler_PushRegisterList) {
2490*f5c631daSSadaf Ebrahimi   SETUP();
2491*f5c631daSSadaf Ebrahimi 
2492*f5c631daSSadaf Ebrahimi   // Allow the test to use all registers.
2493*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope temps(&masm);
2494*f5c631daSSadaf Ebrahimi   temps.ExcludeAll();
2495*f5c631daSSadaf Ebrahimi 
2496*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(0x1111)), "push {r0,r4,r8,ip}\n");
2497*f5c631daSSadaf Ebrahimi 
2498*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(0x1fff)),
2499*f5c631daSSadaf Ebrahimi                "push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip}\n");
2500*f5c631daSSadaf Ebrahimi 
2501*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(0x5fff)),
2502*f5c631daSSadaf Ebrahimi                "push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip,lr}\n");
2503*f5c631daSSadaf Ebrahimi 
2504*f5c631daSSadaf Ebrahimi   COMPARE_A32(Push(ne, RegisterList(0x1fff)),
2505*f5c631daSSadaf Ebrahimi               "pushne {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip}\n");
2506*f5c631daSSadaf Ebrahimi 
2507*f5c631daSSadaf Ebrahimi   COMPARE_T32(Push(ne, RegisterList(0x1fff)),
2508*f5c631daSSadaf Ebrahimi               "beq 0x00000006\n"
2509*f5c631daSSadaf Ebrahimi               "push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip}\n");
2510*f5c631daSSadaf Ebrahimi 
2511*f5c631daSSadaf Ebrahimi   // Narrow form, T1.
2512*f5c631daSSadaf Ebrahimi   COMPARE_T32(Pop(RegisterList(r0)), "pop {r0}\n");
2513*f5c631daSSadaf Ebrahimi   // <single_register_list> form, T4
2514*f5c631daSSadaf Ebrahimi   COMPARE_T32(Pop(RegisterList(r10)), "pop {r10}\n");
2515*f5c631daSSadaf Ebrahimi 
2516*f5c631daSSadaf Ebrahimi   // It is usually UNPREDICTABLE to push sp.
2517*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Push(RegisterList(r0, sp)),
2518*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2519*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Push(RegisterList(sp)), "Unpredictable instruction.\n");
2520*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Push(sp), "Unpredictable instruction.\n");
2521*f5c631daSSadaf Ebrahimi   // A32 can push sp if it is the first register in the list.
2522*f5c631daSSadaf Ebrahimi   COMPARE_A32(Push(sp), "stmdb sp!, {sp}\n");
2523*f5c631daSSadaf Ebrahimi   COMPARE_A32(Push(RegisterList(sp)), "stmdb sp!, {sp}\n");
2524*f5c631daSSadaf Ebrahimi   COMPARE_A32(Push(RegisterList(sp, lr)), "push {sp,lr}\n");
2525*f5c631daSSadaf Ebrahimi 
2526*f5c631daSSadaf Ebrahimi   // Deprecated, but accepted:
2527*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Push(pc));
2528*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Push(RegisterList(pc)));
2529*f5c631daSSadaf Ebrahimi   SHOULD_FAIL_TEST_A32(Push(RegisterList(r0, pc)));
2530*f5c631daSSadaf Ebrahimi 
2531*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Push(pc), "Unpredictable instruction.\n");
2532*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Push(RegisterList(pc)), "Unpredictable instruction.\n");
2533*f5c631daSSadaf Ebrahimi   // The multiple-register T32 push can't encode PC at all.
2534*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Push(RegisterList(r0, pc)),
2535*f5c631daSSadaf Ebrahimi                      "Ill-formed 'push' instruction.\n");
2536*f5c631daSSadaf Ebrahimi 
2537*f5c631daSSadaf Ebrahimi   // The following use the PUSH (T1) and PUSH (single register) (A1) encodings
2538*f5c631daSSadaf Ebrahimi   // for T32 and A32 respectively:
2539*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(r0)), "push {r0}\n");
2540*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(r7)), "push {r7}\n");
2541*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(lr)), "push {lr}\n");
2542*f5c631daSSadaf Ebrahimi 
2543*f5c631daSSadaf Ebrahimi   // PUSH (single register), T4 and A1 encodings:
2544*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList(r8)), "push {r8}\n");
2545*f5c631daSSadaf Ebrahimi 
2546*f5c631daSSadaf Ebrahimi   // Pushing zero registers should produce no instructions.
2547*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Push(RegisterList()), "");
2548*f5c631daSSadaf Ebrahimi 
2549*f5c631daSSadaf Ebrahimi   CLEANUP();
2550*f5c631daSSadaf Ebrahimi }
2551*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_PopRegisterList)2552*f5c631daSSadaf Ebrahimi TEST(macro_assembler_PopRegisterList) {
2553*f5c631daSSadaf Ebrahimi   SETUP();
2554*f5c631daSSadaf Ebrahimi 
2555*f5c631daSSadaf Ebrahimi   // Allow the test to use all registers.
2556*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope temps(&masm);
2557*f5c631daSSadaf Ebrahimi   temps.ExcludeAll();
2558*f5c631daSSadaf Ebrahimi 
2559*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(0x1111)), "pop {r0,r4,r8,ip}\n");
2560*f5c631daSSadaf Ebrahimi 
2561*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(0x1fff)),
2562*f5c631daSSadaf Ebrahimi                "pop {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip}\n");
2563*f5c631daSSadaf Ebrahimi 
2564*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(0x5fff)),
2565*f5c631daSSadaf Ebrahimi                "pop {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip,lr}\n");
2566*f5c631daSSadaf Ebrahimi 
2567*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pop(ne, RegisterList(0x1fff)),
2568*f5c631daSSadaf Ebrahimi               "popne {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip}\n");
2569*f5c631daSSadaf Ebrahimi 
2570*f5c631daSSadaf Ebrahimi   COMPARE_T32(Pop(ne, RegisterList(0x1fff)),
2571*f5c631daSSadaf Ebrahimi               "beq 0x00000006\n"
2572*f5c631daSSadaf Ebrahimi               "pop {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,ip}\n");
2573*f5c631daSSadaf Ebrahimi 
2574*f5c631daSSadaf Ebrahimi   // Narrow form, T1.
2575*f5c631daSSadaf Ebrahimi   COMPARE_T32(Pop(RegisterList(r0)), "pop {r0}\n");
2576*f5c631daSSadaf Ebrahimi   // <single_register_list> form, T4.
2577*f5c631daSSadaf Ebrahimi   COMPARE_T32(Pop(RegisterList(r10)), "pop {r10}\n");
2578*f5c631daSSadaf Ebrahimi 
2579*f5c631daSSadaf Ebrahimi   // It is UNPREDICTABLE to pop sp.
2580*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pop(RegisterList(r0, sp)),
2581*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2582*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pop(RegisterList(sp)), "Unpredictable instruction.\n");
2583*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pop(sp), "Unpredictable instruction.\n");
2584*f5c631daSSadaf Ebrahimi 
2585*f5c631daSSadaf Ebrahimi   // The following use the POP (T1) and POP (single register) (A1) encodings for
2586*f5c631daSSadaf Ebrahimi   // T32 and A32 respectively:
2587*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(pc)), "pop {pc}\n");
2588*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(r0)), "pop {r0}\n");
2589*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(r7)), "pop {r7}\n");
2590*f5c631daSSadaf Ebrahimi 
2591*f5c631daSSadaf Ebrahimi   // POP (single register), T4 and A1 encodings:
2592*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(r8)), "pop {r8}\n");
2593*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList(lr)), "pop {lr}\n");
2594*f5c631daSSadaf Ebrahimi 
2595*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Pop(RegisterList(lr, pc)), "Unpredictable instruction.\n");
2596*f5c631daSSadaf Ebrahimi   // Deprecated, but allowed.
2597*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pop(RegisterList(lr, pc)), "pop {lr,pc}\n");
2598*f5c631daSSadaf Ebrahimi 
2599*f5c631daSSadaf Ebrahimi   // Popping zero registers should produce no instructions.
2600*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pop(RegisterList()), "");
2601*f5c631daSSadaf Ebrahimi 
2602*f5c631daSSadaf Ebrahimi   CLEANUP();
2603*f5c631daSSadaf Ebrahimi }
2604*f5c631daSSadaf Ebrahimi 
2605*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_unpredictable)2606*f5c631daSSadaf Ebrahimi TEST(macro_assembler_unpredictable) {
2607*f5c631daSSadaf Ebrahimi   SETUP();
2608*f5c631daSSadaf Ebrahimi 
2609*f5c631daSSadaf Ebrahimi   // ADC, ADCS (immediate).
2610*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adc(pc, r0, 1), "adc pc, r0, #1\n");
2611*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adc(r0, pc, 1), "adc r0, pc, #1\n");
2612*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adc(pc, r0, 1), "Unpredictable instruction.\n");
2613*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adc(r0, pc, 1), "Unpredictable instruction.\n");
2614*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adcs(pc, r0, 1), "adcs pc, r0, #1\n");
2615*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adcs(r0, pc, 1), "adcs r0, pc, #1\n");
2616*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adcs(pc, r0, 1), "Unpredictable instruction.\n");
2617*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adcs(r0, pc, 1), "Unpredictable instruction.\n");
2618*f5c631daSSadaf Ebrahimi 
2619*f5c631daSSadaf Ebrahimi   // ADC, ADCS (register).
2620*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adc(pc, r0, r1), "adc pc, r0, r1\n");
2621*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adc(r0, pc, r1), "adc r0, pc, r1\n");
2622*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adc(r0, r1, pc), "adc r0, r1, pc\n");
2623*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adc(pc, r0, r1), "Unpredictable instruction.\n");
2624*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adc(r0, pc, r1), "Unpredictable instruction.\n");
2625*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adc(r0, r1, pc), "Unpredictable instruction.\n");
2626*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adcs(pc, r0, r1), "adcs pc, r0, r1\n");
2627*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adcs(r0, pc, r1), "adcs r0, pc, r1\n");
2628*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adcs(r0, r1, pc), "adcs r0, r1, pc\n");
2629*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adcs(pc, r0, r1), "Unpredictable instruction.\n");
2630*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adcs(r0, pc, r1), "Unpredictable instruction.\n");
2631*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adcs(r0, r1, pc), "Unpredictable instruction.\n");
2632*f5c631daSSadaf Ebrahimi 
2633*f5c631daSSadaf Ebrahimi   // ADC, ADCS (register-shifted register).
2634*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adc(pc, r0, Operand(r1, LSL, r2)),
2635*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2636*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adc(r0, pc, Operand(r1, LSL, r2)),
2637*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2638*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adc(r0, r1, Operand(pc, LSL, r2)),
2639*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2640*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adc(r0, r1, Operand(r2, LSL, pc)),
2641*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2642*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adcs(pc, r0, Operand(r1, LSL, r2)),
2643*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2644*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adcs(r0, pc, Operand(r1, LSL, r2)),
2645*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2646*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adcs(r0, r1, Operand(pc, LSL, r2)),
2647*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2648*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adcs(r0, r1, Operand(r2, LSL, pc)),
2649*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2650*f5c631daSSadaf Ebrahimi 
2651*f5c631daSSadaf Ebrahimi   // ADD (immediate, to PC).
2652*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, 1), "adr r0, 0x00000009\n");
2653*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, 1), "adr r0, 0x00000005\n");
2654*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(pc, pc, 1), "adr pc, 0x00000009\n");
2655*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, pc, 1), "Unpredictable instruction.\n");
2656*f5c631daSSadaf Ebrahimi 
2657*f5c631daSSadaf Ebrahimi   // ADD, ADDS (immediate).
2658*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(pc, r0, 1), "add pc, r0, #1\n");
2659*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, r0, 1), "Unpredictable instruction.\n");
2660*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, r0, 0x123), "Unpredictable instruction.\n");
2661*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(pc, r0, 1), "adds pc, r0, #1\n");
2662*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(r0, pc, 1), "adds r0, pc, #1\n");
2663*f5c631daSSadaf Ebrahimi   // TODO: Try to make these error messages more consistent.
2664*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(r0, pc, 1), "Unpredictable instruction.\n");
2665*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(r0, pc, 0x123), "Ill-formed 'adds' instruction.\n");
2666*f5c631daSSadaf Ebrahimi 
2667*f5c631daSSadaf Ebrahimi   // ADD, ADDS (register).
2668*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(pc, r0, r1), "add pc, r0, r1\n");
2669*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, r1), "add r0, pc, r1\n");
2670*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, r1, pc), "add r0, r1, pc\n");
2671*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, r0, pc), "add r0, pc\n");
2672*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(pc, pc, r0), "add pc, r0\n");
2673*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, pc, pc), "Unpredictable instruction.\n");
2674*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, r0, r1), "Unpredictable instruction.\n");
2675*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, r1), "Unpredictable instruction.\n");
2676*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, r1, pc), "Unpredictable instruction.\n");
2677*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(pc, r0, r1), "adds pc, r0, r1\n");
2678*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(r0, pc, r1), "adds r0, pc, r1\n");
2679*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(r0, r1, pc), "adds r0, r1, pc\n");
2680*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(r0, pc, r1), "Unpredictable instruction.\n");
2681*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(r0, r1, pc), "Unpredictable instruction.\n");
2682*f5c631daSSadaf Ebrahimi 
2683*f5c631daSSadaf Ebrahimi   // ADD, ADDS (register-shifted register)
2684*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(pc, r0, Operand(r1, LSL, r2)),
2685*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2686*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, pc, Operand(r1, LSL, r2)),
2687*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2688*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, r1, Operand(pc, LSL, r2)),
2689*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2690*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, r1, Operand(r2, LSL, pc)),
2691*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2692*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(pc, sp, 1), "add pc, sp, #1\n");
2693*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, sp, 1), "Unpredictable instruction.\n");
2694*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adds(pc, r0, Operand(r1, LSL, r2)),
2695*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2696*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adds(r0, pc, Operand(r1, LSL, r2)),
2697*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2698*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adds(r0, r1, Operand(pc, LSL, r2)),
2699*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2700*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Adds(r0, r1, Operand(r2, LSL, pc)),
2701*f5c631daSSadaf Ebrahimi                      "Unpredictable instruction.\n");
2702*f5c631daSSadaf Ebrahimi 
2703*f5c631daSSadaf Ebrahimi   // ADD, ADDS (SP plus immediate).
2704*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(pc, sp, 1), "add pc, sp, #1\n");
2705*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, sp, 1), "Unpredictable instruction.\n");
2706*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(pc, sp, 1), "adds pc, sp, #1\n");
2707*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(pc, sp, 1), "Ill-formed 'adds' instruction.\n");
2708*f5c631daSSadaf Ebrahimi 
2709*f5c631daSSadaf Ebrahimi   // ADD, ADDS (SP plus register).
2710*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(pc, sp, r0), "add pc, sp, r0\n");
2711*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(pc, sp, r0), "Unpredictable instruction.\n");
2712*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, sp, pc), "add r0, sp, pc\n");
2713*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, sp, pc), "Unpredictable instruction.\n");
2714*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(pc, sp, pc), "add pc, sp, pc\n");
2715*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(sp, sp, pc), "add sp, pc\n");
2716*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(pc, sp, r0), "adds pc, sp, r0\n");
2717*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(pc, sp, r0), "Ill-formed 'adds' instruction.\n");
2718*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(r0, sp, pc), "adds r0, sp, pc\n");
2719*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(r0, sp, pc), "Unpredictable instruction.\n");
2720*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(pc, sp, pc), "adds pc, sp, pc\n");
2721*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(pc, sp, pc), "Ill-formed 'adds' instruction.\n");
2722*f5c631daSSadaf Ebrahimi   COMPARE_A32(Adds(sp, sp, pc), "adds sp, pc\n");
2723*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Adds(sp, sp, pc), "Unpredictable instruction.\n");
2724*f5c631daSSadaf Ebrahimi 
2725*f5c631daSSadaf Ebrahimi   // ADR.
2726*f5c631daSSadaf Ebrahimi   {
2727*f5c631daSSadaf Ebrahimi     Literal<uint32_t> literal(0x12345678);
2728*f5c631daSSadaf Ebrahimi     // The address is 0x4 and not 0x0 because of the branch over the literal.
2729*f5c631daSSadaf Ebrahimi     // TODO: Consider disallowing this instruction.
2730*f5c631daSSadaf Ebrahimi     COMPARE_A32(Adr(pc, &literal), "adr pc, 0x00000004\n");
2731*f5c631daSSadaf Ebrahimi     MUST_FAIL_TEST_T32(Adr(pc, &literal), "Unpredictable instruction.\n");
2732*f5c631daSSadaf Ebrahimi   }
2733*f5c631daSSadaf Ebrahimi 
2734*f5c631daSSadaf Ebrahimi   // CLZ.
2735*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Clz(pc, r0), "Unpredictable instruction.\n");
2736*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Clz(r0, pc), "Unpredictable instruction.\n");
2737*f5c631daSSadaf Ebrahimi 
2738*f5c631daSSadaf Ebrahimi   // MOV, MOVS (immediate).
2739*f5c631daSSadaf Ebrahimi   COMPARE_A32(Mov(pc, 1), "mov pc, #1\n");
2740*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Mov(pc, 1), "Unpredictable instruction.\n");
2741*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Mov(pc, 0xfff), "Unpredictable instruction.\n");
2742*f5c631daSSadaf Ebrahimi   COMPARE_A32(Mov(pc, 0xf000), "mov pc, #61440\n");
2743*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Mov(pc, 0xf000), "Unpredictable instruction.\n");
2744*f5c631daSSadaf Ebrahimi   COMPARE_A32(Movs(pc, 1), "movs pc, #1\n");
2745*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Movs(pc, 1), "Unpredictable instruction.\n");
2746*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, 0xfff), "Ill-formed 'movs' instruction.\n");
2747*f5c631daSSadaf Ebrahimi   COMPARE_A32(Movs(pc, 0xf000), "movs pc, #61440\n");
2748*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Movs(pc, 0xf000), "Unpredictable instruction.\n");
2749*f5c631daSSadaf Ebrahimi 
2750*f5c631daSSadaf Ebrahimi   // MOV, MOVS (register).
2751*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Mov(pc, r0), "mov pc, r0\n");
2752*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Mov(r0, pc), "mov r0, pc\n");
2753*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, r0), "Unpredictable instruction.\n");
2754*f5c631daSSadaf Ebrahimi   COMPARE_A32(Movs(r0, pc), "movs r0, pc\n");
2755*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Movs(r0, pc), "Unpredictable instruction.\n");
2756*f5c631daSSadaf Ebrahimi 
2757*f5c631daSSadaf Ebrahimi   // MOV, MOVS (register-shifted register).
2758*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mov(pc, Operand(r0, ASR, r1)),
2759*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2760*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mov(r0, Operand(pc, ASR, r1)),
2761*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2762*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Mov(r0, Operand(r1, ASR, pc)),
2763*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2764*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(pc, Operand(r0, ASR, r1)),
2765*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2766*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(r0, Operand(pc, ASR, r1)),
2767*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2768*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Movs(r0, Operand(r1, ASR, pc)),
2769*f5c631daSSadaf Ebrahimi                       "Unpredictable instruction.\n");
2770*f5c631daSSadaf Ebrahimi 
2771*f5c631daSSadaf Ebrahimi   CLEANUP();
2772*f5c631daSSadaf Ebrahimi }
2773*f5c631daSSadaf Ebrahimi 
2774*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_pc_rel_A32)2775*f5c631daSSadaf Ebrahimi TEST(macro_assembler_pc_rel_A32) {
2776*f5c631daSSadaf Ebrahimi   SETUP();
2777*f5c631daSSadaf Ebrahimi   // Simple cases alias adr.
2778*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -8), "adr r0, 0x00000000\n");
2779*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, 255), "adr r0, 0x00000107\n");
2780*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, 256), "adr r0, 0x00000108\n");
2781*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, 1024), "adr r0, 0x00000408\n");
2782*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -9), "adr r0, 0xffffffff\n");
2783*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -1024), "adr r0, 0xfffffc08\n");
2784*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, UINT32_C(0x80000000)), "adr r0, 0x80000008\n");
2785*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -0x7fffffff), "adr r0, 0x80000009\n");
2786*f5c631daSSadaf Ebrahimi 
2787*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 8), "adr r0, 0x00000000\n");
2788*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, -255), "adr r0, 0x00000107\n");
2789*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, -256), "adr r0, 0x00000108\n");
2790*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, -1024), "adr r0, 0x00000408\n");
2791*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 9), "adr r0, 0xffffffff\n");
2792*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 1024), "adr r0, 0xfffffc08\n");
2793*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, UINT32_C(0x80000000)), "adr r0, 0x80000008\n");
2794*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, -0x7fffffff), "adr r0, 0x80000007\n");
2795*f5c631daSSadaf Ebrahimi 
2796*f5c631daSSadaf Ebrahimi   // Cases out of range.
2797*f5c631daSSadaf Ebrahimi   // Only negative offsets are supported, because the proper behaviour for
2798*f5c631daSSadaf Ebrahimi   // positive offsets is not clear.
2799*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, pc, 1025), "Ill-formed 'add' instruction.\n");
2800*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, pc, 0xffff), "Ill-formed 'add' instruction.\n");
2801*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, pc, 0x10001), "Ill-formed 'add' instruction.\n");
2802*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, pc, 0x12345678),
2803*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2804*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Add(r0, pc, 0x7fffffff),
2805*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2806*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -1025),
2807*f5c631daSSadaf Ebrahimi               "adr r0, 0x00000007\n"
2808*f5c631daSSadaf Ebrahimi               "sub r0, #1024\n");
2809*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -0xffff),
2810*f5c631daSSadaf Ebrahimi               "adr r0, 0xffffff09\n"
2811*f5c631daSSadaf Ebrahimi               "sub r0, #65280\n");
2812*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -0x10001),
2813*f5c631daSSadaf Ebrahimi               "adr r0, 0x00000007\n"
2814*f5c631daSSadaf Ebrahimi               "sub r0, #65536\n");
2815*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -0x2345678),
2816*f5c631daSSadaf Ebrahimi               "adr r0, 0xfffffd90\n"
2817*f5c631daSSadaf Ebrahimi               "sub r0, #21504\n"
2818*f5c631daSSadaf Ebrahimi               "sub r0, #36962304\n");
2819*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, pc, -0x12345678),
2820*f5c631daSSadaf Ebrahimi               "adr r0, 0xfffffd90\n"
2821*f5c631daSSadaf Ebrahimi               "mov ip, #21504\n"
2822*f5c631daSSadaf Ebrahimi               "movt ip, #4660\n"
2823*f5c631daSSadaf Ebrahimi               "sub r0, ip\n");
2824*f5c631daSSadaf Ebrahimi 
2825*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Sub(r0, pc, -1025), "Ill-formed 'add' instruction.\n");
2826*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Sub(r0, pc, -0xffff), "Ill-formed 'add' instruction.\n");
2827*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Sub(r0, pc, -0x10001), "Ill-formed 'add' instruction.\n");
2828*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_A32(Sub(r0, pc, -0x12345678),
2829*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2830*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 1025),
2831*f5c631daSSadaf Ebrahimi               "adr r0, 0x00000007\n"
2832*f5c631daSSadaf Ebrahimi               "sub r0, #1024\n");
2833*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 0xffff),
2834*f5c631daSSadaf Ebrahimi               "adr r0, 0xffffff09\n"
2835*f5c631daSSadaf Ebrahimi               "sub r0, #65280\n");
2836*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 0x10001),
2837*f5c631daSSadaf Ebrahimi               "adr r0, 0x00000007\n"
2838*f5c631daSSadaf Ebrahimi               "sub r0, #65536\n");
2839*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 0x2345678),
2840*f5c631daSSadaf Ebrahimi               "adr r0, 0xfffffd90\n"
2841*f5c631daSSadaf Ebrahimi               "sub r0, #21504\n"
2842*f5c631daSSadaf Ebrahimi               "sub r0, #36962304\n");
2843*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 0x12345678),
2844*f5c631daSSadaf Ebrahimi               "adr r0, 0xfffffd90\n"
2845*f5c631daSSadaf Ebrahimi               "mov ip, #21504\n"
2846*f5c631daSSadaf Ebrahimi               "movt ip, #4660\n"
2847*f5c631daSSadaf Ebrahimi               "sub r0, ip\n");
2848*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, pc, 0x7fffffff),
2849*f5c631daSSadaf Ebrahimi               "adr r0, 0xffffff09\n"
2850*f5c631daSSadaf Ebrahimi               "add r0, #256\n"
2851*f5c631daSSadaf Ebrahimi               "add r0, #2147483648\n");
2852*f5c631daSSadaf Ebrahimi 
2853*f5c631daSSadaf Ebrahimi   CLEANUP();
2854*f5c631daSSadaf Ebrahimi }
2855*f5c631daSSadaf Ebrahimi 
2856*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_pc_rel_T32)2857*f5c631daSSadaf Ebrahimi TEST(macro_assembler_pc_rel_T32) {
2858*f5c631daSSadaf Ebrahimi   SETUP();
2859*f5c631daSSadaf Ebrahimi   // Simple cases alias adr.
2860*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, -4), "adr r0, 0x00000000\n");     // T1
2861*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, 1020), "adr r0, 0x00000400\n");   // T1
2862*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, -5), "adr r0, 0xffffffff\n");     // T2
2863*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, -4095), "adr r0, 0xfffff005\n");  // T2
2864*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, -3), "adr r0, 0x00000001\n");     // T3
2865*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, 1021), "adr r0, 0x00000401\n");   // T3
2866*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, 1019), "adr r0, 0x000003ff\n");   // T3
2867*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, 4095), "adr r0, 0x00001003\n");   // T3
2868*f5c631daSSadaf Ebrahimi 
2869*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, 4), "adr r0, 0x00000000\n");      // T1
2870*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, -1020), "adr r0, 0x00000400\n");  // T1
2871*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, 5), "adr r0, 0xffffffff\n");      // T2
2872*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, 4095), "adr r0, 0xfffff005\n");   // T2
2873*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, 3), "adr r0, 0x00000001\n");      // T3
2874*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, -1021), "adr r0, 0x00000401\n");  // T3
2875*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, -1019), "adr r0, 0x000003ff\n");  // T3
2876*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, -4095), "adr r0, 0x00001003\n");  // T3
2877*f5c631daSSadaf Ebrahimi 
2878*f5c631daSSadaf Ebrahimi   // Cases out of range.
2879*f5c631daSSadaf Ebrahimi   // Only negative offsets are supported, because the proper behaviour for
2880*f5c631daSSadaf Ebrahimi   // positive offsets is not clear.
2881*f5c631daSSadaf Ebrahimi 
2882*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, 4096), "Unpredictable instruction.\n");
2883*f5c631daSSadaf Ebrahimi 
2884*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, -4096), "Unpredictable instruction.\n");
2885*f5c631daSSadaf Ebrahimi 
2886*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, 0xffff), "Ill-formed 'add' instruction.\n");
2887*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, 0x10002), "Ill-formed 'add' instruction.\n");
2888*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, 0x12345678),
2889*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2890*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Add(r0, pc, 0x7fffffff),
2891*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2892*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, -0x12345678),
2893*f5c631daSSadaf Ebrahimi               "mov r0, pc\n"
2894*f5c631daSSadaf Ebrahimi               "mov ip, #22136\n"
2895*f5c631daSSadaf Ebrahimi               "movt ip, #4660\n"
2896*f5c631daSSadaf Ebrahimi               "sub r0, ip\n");
2897*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, pc, -0x7fffffff),
2898*f5c631daSSadaf Ebrahimi               "mov r0, pc\n"
2899*f5c631daSSadaf Ebrahimi               "add r0, #1\n"
2900*f5c631daSSadaf Ebrahimi               "add r0, #2147483648\n");
2901*f5c631daSSadaf Ebrahimi 
2902*f5c631daSSadaf Ebrahimi   // TODO: This test aborts in the Assembler (with unpredictable instruction
2903*f5c631daSSadaf Ebrahimi   // errors) before the MacroAssembler gets a chance to do something
2904*f5c631daSSadaf Ebrahimi   // predictable.
2905*f5c631daSSadaf Ebrahimi   // COMPARE_T32(Sub(r0, pc, -4096), "mov r0, pc\n"
2906*f5c631daSSadaf Ebrahimi   //                                 "add r0, #4096\n");
2907*f5c631daSSadaf Ebrahimi 
2908*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Sub(r0, pc, 4096), "Unpredictable instruction.\n");
2909*f5c631daSSadaf Ebrahimi 
2910*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Sub(r0, pc, -0xffff), "Ill-formed 'add' instruction.\n");
2911*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Sub(r0, pc, -0x10002), "Ill-formed 'add' instruction.\n");
2912*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Sub(r0, pc, -0x12345678),
2913*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2914*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Sub(r0, pc, -0x7fffffff),
2915*f5c631daSSadaf Ebrahimi                      "Ill-formed 'add' instruction.\n");
2916*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, 0x12345678),
2917*f5c631daSSadaf Ebrahimi               "mov r0, pc\n"
2918*f5c631daSSadaf Ebrahimi               "mov ip, #22136\n"
2919*f5c631daSSadaf Ebrahimi               "movt ip, #4660\n"
2920*f5c631daSSadaf Ebrahimi               "sub r0, ip\n");
2921*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, pc, 0x7fffffff),
2922*f5c631daSSadaf Ebrahimi               "mov r0, pc\n"
2923*f5c631daSSadaf Ebrahimi               "add r0, #1\n"
2924*f5c631daSSadaf Ebrahimi               "add r0, #2147483648\n");
2925*f5c631daSSadaf Ebrahimi   CLEANUP();
2926*f5c631daSSadaf Ebrahimi }
2927*f5c631daSSadaf Ebrahimi 
2928*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_unsupported)2929*f5c631daSSadaf Ebrahimi TEST(macro_assembler_unsupported) {
2930*f5c631daSSadaf Ebrahimi   SETUP();
2931*f5c631daSSadaf Ebrahimi 
2932*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Sxtab(r0, r1, Operand(r2, ROR, 1)),
2933*f5c631daSSadaf Ebrahimi                       "Ill-formed 'sxtab' instruction.\n");
2934*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Sxtab16(r0, r1, Operand(r0, ASR, 2)),
2935*f5c631daSSadaf Ebrahimi                       "Ill-formed 'sxtab16' instruction.\n");
2936*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Sxtah(r0, r1, Operand(r0, LSL, r1)),
2937*f5c631daSSadaf Ebrahimi                       "Ill-formed 'sxtah' instruction.\n");
2938*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Uxtab(r0, r1, Operand(r0, LSR, r2)),
2939*f5c631daSSadaf Ebrahimi                       "Ill-formed 'uxtab' instruction.\n");
2940*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Uxtab16(r0, r1, Operand(r0, ROR, 1)),
2941*f5c631daSSadaf Ebrahimi                       "Ill-formed 'uxtab16' instruction.\n");
2942*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Uxtah(r0, r1, Operand(r0, ASR, 2)),
2943*f5c631daSSadaf Ebrahimi                       "Ill-formed 'uxtah' instruction.\n");
2944*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pkhbt(r0, r1, Operand(r0, LSL, r1)),
2945*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pkhbt' instruction.\n");
2946*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pkhtb(r0, r1, Operand(r0, LSR, r2)),
2947*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pkhtb' instruction.\n");
2948*f5c631daSSadaf Ebrahimi 
2949*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pld(MemOperand(r0, 1, PreIndex)),
2950*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pld' instruction.\n");
2951*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pldw(MemOperand(r0, 1, PostIndex)),
2952*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pldw' instruction.\n");
2953*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pli(MemOperand(r0, 1, PreIndex)),
2954*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pli' instruction.\n");
2955*f5c631daSSadaf Ebrahimi 
2956*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pld(MemOperand(r0, r0, PreIndex)),
2957*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pld' instruction.\n");
2958*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pldw(MemOperand(r0, r1, PostIndex)),
2959*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pldw' instruction.\n");
2960*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pli(MemOperand(r0, r2, PreIndex)),
2961*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pli' instruction.\n");
2962*f5c631daSSadaf Ebrahimi 
2963*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pld(MemOperand(r0, r0, LSL, 1, PreIndex)),
2964*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pld' instruction.\n");
2965*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pldw(MemOperand(r0, r1, LSR, 2, PostIndex)),
2966*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pldw' instruction.\n");
2967*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Pli(MemOperand(r0, r2, ASR, 3, PreIndex)),
2968*f5c631daSSadaf Ebrahimi                       "Ill-formed 'pli' instruction.\n");
2969*f5c631daSSadaf Ebrahimi 
2970*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Lda(r0, MemOperand(r0, 1)),
2971*f5c631daSSadaf Ebrahimi                       "Ill-formed 'lda' instruction.\n");
2972*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldab(r0, MemOperand(r0, 1)),
2973*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldab' instruction.\n");
2974*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldaex(r0, MemOperand(r0, 1)),
2975*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldaex' instruction.\n");
2976*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldaexb(r0, MemOperand(r0, 1)),
2977*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldaexb' instruction.\n");
2978*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldaexh(r0, MemOperand(r0, 1)),
2979*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldaexh' instruction.\n");
2980*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldah(r0, MemOperand(r0, 1)),
2981*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldah' instruction.\n");
2982*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrex(r0, MemOperand(r0, 1)),
2983*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrex' instruction.\n");
2984*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrexb(r0, MemOperand(r0, 1)),
2985*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrexb' instruction.\n");
2986*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrexh(r0, MemOperand(r0, 1)),
2987*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrexh' instruction.\n");
2988*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stl(r0, MemOperand(r0, 1)),
2989*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stl' instruction.\n");
2990*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stlb(r0, MemOperand(r0, 1)),
2991*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stlb' instruction.\n");
2992*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stlh(r0, MemOperand(r0, 1)),
2993*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stlh' instruction.\n");
2994*f5c631daSSadaf Ebrahimi 
2995*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldaexd(r0, r1, MemOperand(r0, 1)),
2996*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldaexd' instruction.\n");
2997*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Ldrexd(r0, r1, MemOperand(r0, 1)),
2998*f5c631daSSadaf Ebrahimi                       "Ill-formed 'ldrexd' instruction.\n");
2999*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stlex(r0, r1, MemOperand(r0, 1)),
3000*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stlex' instruction.\n");
3001*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stlexb(r0, r1, MemOperand(r0, 1)),
3002*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stlexb' instruction.\n");
3003*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stlexh(r0, r1, MemOperand(r0, 1)),
3004*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stlexh' instruction.\n");
3005*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strex(r0, r1, MemOperand(r0, 1)),
3006*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strex' instruction.\n");
3007*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strexb(r0, r1, MemOperand(r0, 1)),
3008*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strexb' instruction.\n");
3009*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strexh(r0, r1, MemOperand(r0, 1)),
3010*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strexh' instruction.\n");
3011*f5c631daSSadaf Ebrahimi 
3012*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Stlexd(r0, r1, r2, MemOperand(r0, 1)),
3013*f5c631daSSadaf Ebrahimi                       "Ill-formed 'stlexd' instruction.\n");
3014*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH(Strexd(r0, r1, r2, MemOperand(r0, 1)),
3015*f5c631daSSadaf Ebrahimi                       "Ill-formed 'strexd' instruction.\n");
3016*f5c631daSSadaf Ebrahimi 
3017*f5c631daSSadaf Ebrahimi   CLEANUP();
3018*f5c631daSSadaf Ebrahimi }
3019*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_Vmov_neon_immediate)3020*f5c631daSSadaf Ebrahimi TEST(macro_assembler_Vmov_neon_immediate) {
3021*f5c631daSSadaf Ebrahimi   SETUP();
3022*f5c631daSSadaf Ebrahimi 
3023*f5c631daSSadaf Ebrahimi   // Move 8, 16 and 32-bit immediates into D registers, duplicated across the
3024*f5c631daSSadaf Ebrahimi   // destination.
3025*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I8, d0, 0xac), "vmov.i8 d0, #172\n");
3026*f5c631daSSadaf Ebrahimi 
3027*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I16, d0, 0xa4), "vmov.i16 d0, #164\n");
3028*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I16, d0, 0x9797), "vmov.i8 d0, #151\n");
3029*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I16, d0, 0x9ef6),
3030*f5c631daSSadaf Ebrahimi                "mov ip, #40694\n"
3031*f5c631daSSadaf Ebrahimi                "vdup.16 d0, ip\n");
3032*f5c631daSSadaf Ebrahimi 
3033*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0x6d0000), "vmov.i32 d0, #7143424\n");
3034*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0x15ffffff), "vmvn.i32 d0, #3925868544\n");
3035*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0x74747474), "vmov.i8 d0, #116\n");
3036*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0xff0000ff), "vmov.i64 d0, #0xff0000ffff0000ff\n");
3037*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0x1ecb9ef6),
3038*f5c631daSSadaf Ebrahimi                "mov ip, #40694\n"
3039*f5c631daSSadaf Ebrahimi                "movt ip, #7883\n"
3040*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n");
3041*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0x006d0000), "vmov.i32 d0, #7143424\n");
3042*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0x00004da6),
3043*f5c631daSSadaf Ebrahimi                "mov ip, #19878\n"
3044*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n");
3045*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0xffffff55), "vmvn.i32 d0, #170\n");
3046*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0xffff55ff), "vmvn.i32 d0, #43520\n");
3047*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, d0, 0xff55ffff), "vmvn.i32 d0, #11141120\n");
3048*f5c631daSSadaf Ebrahimi 
3049*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, d0, UINT64_C(0xa5a5a5a5a5a5a5a5)),
3050*f5c631daSSadaf Ebrahimi                "vmov.i8 d0, #165\n");
3051*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, d0, UINT64_C(0x0a01248315ffffff)),
3052*f5c631daSSadaf Ebrahimi                "mvn ip, #3925868544\n"
3053*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n"
3054*f5c631daSSadaf Ebrahimi                "mov ip, #9347\n"
3055*f5c631daSSadaf Ebrahimi                "movt ip, #2561\n"
3056*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n");
3057*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, d0, UINT64_C(0x6fe1a7a779e33af2)),
3058*f5c631daSSadaf Ebrahimi                "mov ip, #15090\n"
3059*f5c631daSSadaf Ebrahimi                "movt ip, #31203\n"
3060*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n"
3061*f5c631daSSadaf Ebrahimi                "mov ip, #42919\n"
3062*f5c631daSSadaf Ebrahimi                "movt ip, #28641\n"
3063*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n");
3064*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, d0, UINT64_C(0x2efa8b440000c1da)),
3065*f5c631daSSadaf Ebrahimi                "mov ip, #49626\n"
3066*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n"
3067*f5c631daSSadaf Ebrahimi                "mov ip, #35652\n"
3068*f5c631daSSadaf Ebrahimi                "movt ip, #12026\n"
3069*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n");
3070*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, d0, UINT64_C(0x00008bb75c3036fd)),
3071*f5c631daSSadaf Ebrahimi                "mov ip, #14077\n"
3072*f5c631daSSadaf Ebrahimi                "movt ip, #23600\n"
3073*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n"
3074*f5c631daSSadaf Ebrahimi                "mov ip, #35767\n"
3075*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n");
3076*f5c631daSSadaf Ebrahimi 
3077*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(F32, d0, 0.5), "vmov.f32 d0, #0.5\n");
3078*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(F32, d0, 1.1),
3079*f5c631daSSadaf Ebrahimi                "mov ip, #52429\n"
3080*f5c631daSSadaf Ebrahimi                "movt ip, #16268\n"
3081*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n");
3082*f5c631daSSadaf Ebrahimi 
3083*f5c631daSSadaf Ebrahimi   COMPARE_T32(Vmov(I64, d0, UINT64_C(0x2fff2fff3e2869e7)),
3084*f5c631daSSadaf Ebrahimi               "mov ip, #27111\n"
3085*f5c631daSSadaf Ebrahimi               "movt ip, #15912\n"
3086*f5c631daSSadaf Ebrahimi               "vdup.32 d0, ip\n"
3087*f5c631daSSadaf Ebrahimi               "mvn ip, #3489714176\n"
3088*f5c631daSSadaf Ebrahimi               "vmov.32 d0[1], ip\n");
3089*f5c631daSSadaf Ebrahimi 
3090*f5c631daSSadaf Ebrahimi   COMPARE_A32(Vmov(I32, d0, 0x0ffffffa),
3091*f5c631daSSadaf Ebrahimi               "mvn ip, #4026531845\n"
3092*f5c631daSSadaf Ebrahimi               "vdup.32 d0, ip\n");
3093*f5c631daSSadaf Ebrahimi   COMPARE_A32(Vmov(I64, d0, UINT64_C(0x65ffffff16a0ef46)),
3094*f5c631daSSadaf Ebrahimi               "mov ip, #61254\n"
3095*f5c631daSSadaf Ebrahimi               "movt ip, #5792\n"
3096*f5c631daSSadaf Ebrahimi               "vdup.32 d0, ip\n"
3097*f5c631daSSadaf Ebrahimi               "mvn ip, #2583691264\n"
3098*f5c631daSSadaf Ebrahimi               "vmov.32 d0[1], ip\n");
3099*f5c631daSSadaf Ebrahimi 
3100*f5c631daSSadaf Ebrahimi   // Move 8, 16 and 32-bit immediates into Q registers, duplicated across the
3101*f5c631daSSadaf Ebrahimi   // destination.
3102*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I8, q0, 0xac), "vmov.i8 q0, #172\n");
3103*f5c631daSSadaf Ebrahimi 
3104*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I16, q0, 0xa4), "vmov.i16 q0, #164\n");
3105*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I16, q0, 0x9797), "vmov.i8 q0, #151\n");
3106*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I16, q0, 0x9ef6),
3107*f5c631daSSadaf Ebrahimi                "mov ip, #40694\n"
3108*f5c631daSSadaf Ebrahimi                "vdup.16 q0, ip\n");
3109*f5c631daSSadaf Ebrahimi 
3110*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0x6d0000), "vmov.i32 q0, #7143424\n");
3111*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0x15ffffff), "vmvn.i32 q0, #3925868544\n");
3112*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0x74747474), "vmov.i8 q0, #116\n");
3113*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0xff0000ff), "vmov.i64 q0, #0xff0000ffff0000ff\n");
3114*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0x1ecb9ef6),
3115*f5c631daSSadaf Ebrahimi                "mov ip, #40694\n"
3116*f5c631daSSadaf Ebrahimi                "movt ip, #7883\n"
3117*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n");
3118*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0x006d0000), "vmov.i32 q0, #7143424\n");
3119*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I32, q0, 0x00004da6),
3120*f5c631daSSadaf Ebrahimi                "mov ip, #19878\n"
3121*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n");
3122*f5c631daSSadaf Ebrahimi 
3123*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, q0, UINT64_C(0xa5a5a5a5a5a5a5a5)),
3124*f5c631daSSadaf Ebrahimi                "vmov.i8 q0, #165\n");
3125*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, q0, UINT64_C(0x0a01248315ffffff)),
3126*f5c631daSSadaf Ebrahimi                "mvn ip, #3925868544\n"
3127*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n"
3128*f5c631daSSadaf Ebrahimi                "mov ip, #9347\n"
3129*f5c631daSSadaf Ebrahimi                "movt ip, #2561\n"
3130*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n"
3131*f5c631daSSadaf Ebrahimi                "vmov.f64 d1, d0\n");
3132*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, q0, UINT64_C(0x6fe1a7a779e33af2)),
3133*f5c631daSSadaf Ebrahimi                "mov ip, #15090\n"
3134*f5c631daSSadaf Ebrahimi                "movt ip, #31203\n"
3135*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n"
3136*f5c631daSSadaf Ebrahimi                "mov ip, #42919\n"
3137*f5c631daSSadaf Ebrahimi                "movt ip, #28641\n"
3138*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n"
3139*f5c631daSSadaf Ebrahimi                "vmov.f64 d1, d0\n");
3140*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, q0, UINT64_C(0x2efa8b440000c1da)),
3141*f5c631daSSadaf Ebrahimi                "mov ip, #49626\n"
3142*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n"
3143*f5c631daSSadaf Ebrahimi                "mov ip, #35652\n"
3144*f5c631daSSadaf Ebrahimi                "movt ip, #12026\n"
3145*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n"
3146*f5c631daSSadaf Ebrahimi                "vmov.f64 d1, d0\n");
3147*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(I64, q0, UINT64_C(0x00008bb75c3036fd)),
3148*f5c631daSSadaf Ebrahimi                "mov ip, #14077\n"
3149*f5c631daSSadaf Ebrahimi                "movt ip, #23600\n"
3150*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n"
3151*f5c631daSSadaf Ebrahimi                "mov ip, #35767\n"
3152*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n"
3153*f5c631daSSadaf Ebrahimi                "vmov.f64 d1, d0\n");
3154*f5c631daSSadaf Ebrahimi 
3155*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(F32, q0, 0.5), "vmov.f32 q0, #0.5\n");
3156*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(F32, q0, 1.1),
3157*f5c631daSSadaf Ebrahimi                "mov ip, #52429\n"
3158*f5c631daSSadaf Ebrahimi                "movt ip, #16268\n"
3159*f5c631daSSadaf Ebrahimi                "vdup.32 q0, ip\n");
3160*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(F64, q0, 0.5),
3161*f5c631daSSadaf Ebrahimi                "vmov.f64 d0, #0.5\n"
3162*f5c631daSSadaf Ebrahimi                "vmov.f64 d1, d0\n");
3163*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmov(F64, q0, 1.1),
3164*f5c631daSSadaf Ebrahimi                "mov ip, #39322\n"
3165*f5c631daSSadaf Ebrahimi                "movt ip, #39321\n"
3166*f5c631daSSadaf Ebrahimi                "vdup.32 d0, ip\n"
3167*f5c631daSSadaf Ebrahimi                "mov ip, #39321\n"
3168*f5c631daSSadaf Ebrahimi                "movt ip, #16369\n"
3169*f5c631daSSadaf Ebrahimi                "vmov.32 d0[1], ip\n"
3170*f5c631daSSadaf Ebrahimi                "vmov.f64 d1, d0\n");
3171*f5c631daSSadaf Ebrahimi 
3172*f5c631daSSadaf Ebrahimi   COMPARE_T32(Vmov(I64, q0, UINT64_C(0x2fff2fff3e2869e7)),
3173*f5c631daSSadaf Ebrahimi               "mov ip, #27111\n"
3174*f5c631daSSadaf Ebrahimi               "movt ip, #15912\n"
3175*f5c631daSSadaf Ebrahimi               "vdup.32 q0, ip\n"
3176*f5c631daSSadaf Ebrahimi               "mvn ip, #3489714176\n"
3177*f5c631daSSadaf Ebrahimi               "vmov.32 d0[1], ip\n"
3178*f5c631daSSadaf Ebrahimi               "vmov.f64 d1, d0\n");
3179*f5c631daSSadaf Ebrahimi 
3180*f5c631daSSadaf Ebrahimi   COMPARE_A32(Vmov(I32, q0, 0x0ffffffa),
3181*f5c631daSSadaf Ebrahimi               "mvn ip, #4026531845\n"
3182*f5c631daSSadaf Ebrahimi               "vdup.32 q0, ip\n");
3183*f5c631daSSadaf Ebrahimi   COMPARE_A32(Vmov(I64, q0, UINT64_C(0x65ffffff16a0ef46)),
3184*f5c631daSSadaf Ebrahimi               "mov ip, #61254\n"
3185*f5c631daSSadaf Ebrahimi               "movt ip, #5792\n"
3186*f5c631daSSadaf Ebrahimi               "vdup.32 q0, ip\n"
3187*f5c631daSSadaf Ebrahimi               "mvn ip, #2583691264\n"
3188*f5c631daSSadaf Ebrahimi               "vmov.32 d0[1], ip\n"
3189*f5c631daSSadaf Ebrahimi               "vmov.f64 d1, d0\n");
3190*f5c631daSSadaf Ebrahimi   CLEANUP();
3191*f5c631daSSadaf Ebrahimi }
3192*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_T32_IT)3193*f5c631daSSadaf Ebrahimi TEST(macro_assembler_T32_IT) {
3194*f5c631daSSadaf Ebrahimi   SETUP();
3195*f5c631daSSadaf Ebrahimi 
3196*f5c631daSSadaf Ebrahimi   // ADC (register) T1
3197*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adc(eq, r0, r0, r1),
3198*f5c631daSSadaf Ebrahimi               "it eq\n"
3199*f5c631daSSadaf Ebrahimi               "adceq r0, r1\n");
3200*f5c631daSSadaf Ebrahimi 
3201*f5c631daSSadaf Ebrahimi   COMPARE_T32(Adc(eq, r0, r1, r2),
3202*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3203*f5c631daSSadaf Ebrahimi               "adc r0, r1, r2\n");
3204*f5c631daSSadaf Ebrahimi 
3205*f5c631daSSadaf Ebrahimi   // ADD (immediate) T1
3206*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r0, r1, 0x1),
3207*f5c631daSSadaf Ebrahimi               "it eq\n"
3208*f5c631daSSadaf Ebrahimi               "addeq r0, r1, #1\n");
3209*f5c631daSSadaf Ebrahimi 
3210*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r0, r1, 0x8),
3211*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3212*f5c631daSSadaf Ebrahimi               "add r0, r1, #8\n");
3213*f5c631daSSadaf Ebrahimi 
3214*f5c631daSSadaf Ebrahimi   // ADD (immediate) T2
3215*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r0, r0, 0xff),
3216*f5c631daSSadaf Ebrahimi               "it eq\n"
3217*f5c631daSSadaf Ebrahimi               "addeq r0, #255\n");
3218*f5c631daSSadaf Ebrahimi 
3219*f5c631daSSadaf Ebrahimi   // ADD (register) T1
3220*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r0, r1, r7),
3221*f5c631daSSadaf Ebrahimi               "it eq\n"
3222*f5c631daSSadaf Ebrahimi               "addeq r0, r1, r7\n");
3223*f5c631daSSadaf Ebrahimi 
3224*f5c631daSSadaf Ebrahimi   // ADD (register) T2
3225*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r5, r5, r8),
3226*f5c631daSSadaf Ebrahimi               "it eq\n"
3227*f5c631daSSadaf Ebrahimi               "addeq r5, r8\n");
3228*f5c631daSSadaf Ebrahimi 
3229*f5c631daSSadaf Ebrahimi   // ADD (SP plus immediate) T1
3230*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r7, sp, 1020),
3231*f5c631daSSadaf Ebrahimi               "it eq\n"
3232*f5c631daSSadaf Ebrahimi               "addeq r7, sp, #1020\n");
3233*f5c631daSSadaf Ebrahimi 
3234*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r7, sp, 1),
3235*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3236*f5c631daSSadaf Ebrahimi               "add r7, sp, #1\n");
3237*f5c631daSSadaf Ebrahimi 
3238*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r7, sp, 1024),
3239*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3240*f5c631daSSadaf Ebrahimi               "add r7, sp, #1024\n");
3241*f5c631daSSadaf Ebrahimi 
3242*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, sp, sp, 32),
3243*f5c631daSSadaf Ebrahimi               "bne 0x00000004\n"
3244*f5c631daSSadaf Ebrahimi               "add sp, #32\n");
3245*f5c631daSSadaf Ebrahimi 
3246*f5c631daSSadaf Ebrahimi   // ADD (SP plus register) T1
3247*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r7, sp, r7),
3248*f5c631daSSadaf Ebrahimi               "it eq\n"
3249*f5c631daSSadaf Ebrahimi               "addeq r7, sp, r7\n");
3250*f5c631daSSadaf Ebrahimi 
3251*f5c631daSSadaf Ebrahimi   // ADD (SP plus register) T2
3252*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, sp, sp, r10),
3253*f5c631daSSadaf Ebrahimi               "it eq\n"
3254*f5c631daSSadaf Ebrahimi               "addeq sp, r10\n");
3255*f5c631daSSadaf Ebrahimi 
3256*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(eq, r5, r5, sp),
3257*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3258*f5c631daSSadaf Ebrahimi               "add.w r5, sp\n");
3259*f5c631daSSadaf Ebrahimi 
3260*f5c631daSSadaf Ebrahimi   // AND (register) T1
3261*f5c631daSSadaf Ebrahimi   COMPARE_T32(And(eq, r7, r7, r0),
3262*f5c631daSSadaf Ebrahimi               "it eq\n"
3263*f5c631daSSadaf Ebrahimi               "andeq r7, r0\n");
3264*f5c631daSSadaf Ebrahimi 
3265*f5c631daSSadaf Ebrahimi   COMPARE_T32(And(eq, r8, r8, r0),
3266*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3267*f5c631daSSadaf Ebrahimi               "and r8, r0\n");
3268*f5c631daSSadaf Ebrahimi 
3269*f5c631daSSadaf Ebrahimi   // ASR (immediate) T2
3270*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(eq, r0, r1, 16),
3271*f5c631daSSadaf Ebrahimi               "it eq\n"
3272*f5c631daSSadaf Ebrahimi               "asreq r0, r1, #16\n");
3273*f5c631daSSadaf Ebrahimi 
3274*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(eq, r0, r1, 32),
3275*f5c631daSSadaf Ebrahimi               "it eq\n"
3276*f5c631daSSadaf Ebrahimi               "asreq r0, r1, #32\n");
3277*f5c631daSSadaf Ebrahimi 
3278*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(eq, r0, r1, 0),
3279*f5c631daSSadaf Ebrahimi               "bne 0x0000000a\n"
3280*f5c631daSSadaf Ebrahimi               "mov r0, #0\n"
3281*f5c631daSSadaf Ebrahimi               "asr r0, r1, r0\n");
3282*f5c631daSSadaf Ebrahimi 
3283*f5c631daSSadaf Ebrahimi   // ASR (register) T1
3284*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(eq, r7, r7, r3),
3285*f5c631daSSadaf Ebrahimi               "it eq\n"
3286*f5c631daSSadaf Ebrahimi               "asreq r7, r3\n");
3287*f5c631daSSadaf Ebrahimi 
3288*f5c631daSSadaf Ebrahimi   COMPARE_T32(Asr(eq, r8, r8, r3),
3289*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3290*f5c631daSSadaf Ebrahimi               "asr r8, r3\n");
3291*f5c631daSSadaf Ebrahimi 
3292*f5c631daSSadaf Ebrahimi   // BIC (register) T1
3293*f5c631daSSadaf Ebrahimi   COMPARE_T32(Bic(eq, r7, r7, r6),
3294*f5c631daSSadaf Ebrahimi               "it eq\n"
3295*f5c631daSSadaf Ebrahimi               "biceq r7, r6\n");
3296*f5c631daSSadaf Ebrahimi 
3297*f5c631daSSadaf Ebrahimi   COMPARE_T32(Bic(eq, r8, r8, r6),
3298*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3299*f5c631daSSadaf Ebrahimi               "bic r8, r6\n");
3300*f5c631daSSadaf Ebrahimi 
3301*f5c631daSSadaf Ebrahimi   Label l;
3302*f5c631daSSadaf Ebrahimi   __ Bind(&l);
3303*f5c631daSSadaf Ebrahimi 
3304*f5c631daSSadaf Ebrahimi   // BLX (register) T1
3305*f5c631daSSadaf Ebrahimi   COMPARE_T32(Blx(eq, lr),
3306*f5c631daSSadaf Ebrahimi               "it eq\n"
3307*f5c631daSSadaf Ebrahimi               "blxeq lr\n");
3308*f5c631daSSadaf Ebrahimi   COMPARE_T32(Blx(eq, &l),
3309*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3310*f5c631daSSadaf Ebrahimi               "blx 0x00000000\n");
3311*f5c631daSSadaf Ebrahimi 
3312*f5c631daSSadaf Ebrahimi   // BX (register) T1
3313*f5c631daSSadaf Ebrahimi   COMPARE_T32(Bx(eq, lr),
3314*f5c631daSSadaf Ebrahimi               "it eq\n"
3315*f5c631daSSadaf Ebrahimi               "bxeq lr\n");
3316*f5c631daSSadaf Ebrahimi 
3317*f5c631daSSadaf Ebrahimi   // CMN (register) T1
3318*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cmn(eq, r0, r1),
3319*f5c631daSSadaf Ebrahimi               "it eq\n"
3320*f5c631daSSadaf Ebrahimi               "cmneq r0, r1\n");
3321*f5c631daSSadaf Ebrahimi 
3322*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cmn(eq, r0, r8),
3323*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3324*f5c631daSSadaf Ebrahimi               "cmn r0, r8\n");
3325*f5c631daSSadaf Ebrahimi 
3326*f5c631daSSadaf Ebrahimi   // CMP (immediate) T1
3327*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cmp(eq, r7, 0xff),
3328*f5c631daSSadaf Ebrahimi               "it eq\n"
3329*f5c631daSSadaf Ebrahimi               "cmpeq r7, #255\n");
3330*f5c631daSSadaf Ebrahimi 
3331*f5c631daSSadaf Ebrahimi   // CMP (register) T1
3332*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cmp(eq, r6, r7),
3333*f5c631daSSadaf Ebrahimi               "it eq\n"
3334*f5c631daSSadaf Ebrahimi               "cmpeq r6, r7\n");
3335*f5c631daSSadaf Ebrahimi 
3336*f5c631daSSadaf Ebrahimi   // CMP (register) T2
3337*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cmp(eq, r9, r10),
3338*f5c631daSSadaf Ebrahimi               "it eq\n"
3339*f5c631daSSadaf Ebrahimi               "cmpeq r9, r10\n");
3340*f5c631daSSadaf Ebrahimi 
3341*f5c631daSSadaf Ebrahimi   COMPARE_T32(Cmp(eq, r0, 0x100),
3342*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3343*f5c631daSSadaf Ebrahimi               "cmp r0, #256\n");
3344*f5c631daSSadaf Ebrahimi 
3345*f5c631daSSadaf Ebrahimi   // EOR (register) T1
3346*f5c631daSSadaf Ebrahimi   COMPARE_T32(Eor(eq, r0, r0, r7),
3347*f5c631daSSadaf Ebrahimi               "it eq\n"
3348*f5c631daSSadaf Ebrahimi               "eoreq r0, r7\n");
3349*f5c631daSSadaf Ebrahimi 
3350*f5c631daSSadaf Ebrahimi   COMPARE_T32(Eor(eq, r0, r0, 0x1),
3351*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3352*f5c631daSSadaf Ebrahimi               "eor r0, #0x1\n");
3353*f5c631daSSadaf Ebrahimi 
3354*f5c631daSSadaf Ebrahimi   // LDR (immediate) T1
3355*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r4, MemOperand(r7, 124)),
3356*f5c631daSSadaf Ebrahimi               "it eq\n"
3357*f5c631daSSadaf Ebrahimi               "ldreq r4, [r7, #124]\n");
3358*f5c631daSSadaf Ebrahimi 
3359*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r4, MemOperand(r7, 1)),
3360*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3361*f5c631daSSadaf Ebrahimi               "ldr r4, [r7, #1]\n");
3362*f5c631daSSadaf Ebrahimi 
3363*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r4, MemOperand(r7, 128)),
3364*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3365*f5c631daSSadaf Ebrahimi               "ldr r4, [r7, #128]\n");
3366*f5c631daSSadaf Ebrahimi 
3367*f5c631daSSadaf Ebrahimi   // LDR (immediate) T2
3368*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r4, MemOperand(sp, 1020)),
3369*f5c631daSSadaf Ebrahimi               "it eq\n"
3370*f5c631daSSadaf Ebrahimi               "ldreq r4, [sp, #1020]\n");
3371*f5c631daSSadaf Ebrahimi 
3372*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r4, MemOperand(sp, 1)),
3373*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3374*f5c631daSSadaf Ebrahimi               "ldr r4, [sp, #1]\n");
3375*f5c631daSSadaf Ebrahimi 
3376*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r4, MemOperand(sp, 1024)),
3377*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3378*f5c631daSSadaf Ebrahimi               "ldr r4, [sp, #1024]\n");
3379*f5c631daSSadaf Ebrahimi 
3380*f5c631daSSadaf Ebrahimi   // LDR (register) T1
3381*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r5, MemOperand(r6, r7)),
3382*f5c631daSSadaf Ebrahimi               "it eq\n"
3383*f5c631daSSadaf Ebrahimi               "ldreq r5, [r6, r7]\n");
3384*f5c631daSSadaf Ebrahimi 
3385*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(eq, r5, MemOperand(r6, r8)),
3386*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3387*f5c631daSSadaf Ebrahimi               "ldr r5, [r6, r8]\n");
3388*f5c631daSSadaf Ebrahimi 
3389*f5c631daSSadaf Ebrahimi   // LDRB (immediate) T1
3390*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrb(eq, r6, MemOperand(r7, 31)),
3391*f5c631daSSadaf Ebrahimi               "it eq\n"
3392*f5c631daSSadaf Ebrahimi               "ldrbeq r6, [r7, #31]\n");
3393*f5c631daSSadaf Ebrahimi 
3394*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrb(eq, r6, MemOperand(r7, 32)),
3395*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3396*f5c631daSSadaf Ebrahimi               "ldrb r6, [r7, #32]\n");
3397*f5c631daSSadaf Ebrahimi 
3398*f5c631daSSadaf Ebrahimi   // LDRB (register) T1
3399*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrb(eq, r5, MemOperand(r6, r7)),
3400*f5c631daSSadaf Ebrahimi               "it eq\n"
3401*f5c631daSSadaf Ebrahimi               "ldrbeq r5, [r6, r7]\n");
3402*f5c631daSSadaf Ebrahimi 
3403*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrb(eq, r6, MemOperand(r9)),
3404*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3405*f5c631daSSadaf Ebrahimi               "ldrb r6, [r9]\n");
3406*f5c631daSSadaf Ebrahimi 
3407*f5c631daSSadaf Ebrahimi   // LDRH (immediate) T1
3408*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(eq, r6, MemOperand(r7, 62)),
3409*f5c631daSSadaf Ebrahimi               "it eq\n"
3410*f5c631daSSadaf Ebrahimi               "ldrheq r6, [r7, #62]\n");
3411*f5c631daSSadaf Ebrahimi 
3412*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(eq, r6, MemOperand(r7, 64)),
3413*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3414*f5c631daSSadaf Ebrahimi               "ldrh r6, [r7, #64]\n");
3415*f5c631daSSadaf Ebrahimi 
3416*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(eq, r6, MemOperand(r7, 1)),
3417*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3418*f5c631daSSadaf Ebrahimi               "ldrh r6, [r7, #1]\n");
3419*f5c631daSSadaf Ebrahimi 
3420*f5c631daSSadaf Ebrahimi   // LDRH (register) T1
3421*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(eq, r5, MemOperand(r6, r7)),
3422*f5c631daSSadaf Ebrahimi               "it eq\n"
3423*f5c631daSSadaf Ebrahimi               "ldrheq r5, [r6, r7]\n");
3424*f5c631daSSadaf Ebrahimi 
3425*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrh(eq, r6, MemOperand(r9)),
3426*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3427*f5c631daSSadaf Ebrahimi               "ldrh r6, [r9]\n");
3428*f5c631daSSadaf Ebrahimi 
3429*f5c631daSSadaf Ebrahimi   // LDRSB (register) T1
3430*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrsb(eq, r5, MemOperand(r6, r7)),
3431*f5c631daSSadaf Ebrahimi               "it eq\n"
3432*f5c631daSSadaf Ebrahimi               "ldrsbeq r5, [r6, r7]\n");
3433*f5c631daSSadaf Ebrahimi 
3434*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrsb(eq, r6, MemOperand(r9)),
3435*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3436*f5c631daSSadaf Ebrahimi               "ldrsb r6, [r9]\n");
3437*f5c631daSSadaf Ebrahimi 
3438*f5c631daSSadaf Ebrahimi   // LDRSH (register) T1
3439*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrsh(eq, r5, MemOperand(r6, r7)),
3440*f5c631daSSadaf Ebrahimi               "it eq\n"
3441*f5c631daSSadaf Ebrahimi               "ldrsheq r5, [r6, r7]\n");
3442*f5c631daSSadaf Ebrahimi 
3443*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldrsh(eq, r6, MemOperand(r9)),
3444*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3445*f5c631daSSadaf Ebrahimi               "ldrsh r6, [r9]\n");
3446*f5c631daSSadaf Ebrahimi 
3447*f5c631daSSadaf Ebrahimi   // LSL (immediate) T2
3448*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsl(eq, r0, r1, 16),
3449*f5c631daSSadaf Ebrahimi               "it eq\n"
3450*f5c631daSSadaf Ebrahimi               "lsleq r0, r1, #16\n");
3451*f5c631daSSadaf Ebrahimi 
3452*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsl(eq, r0, r1, 0),
3453*f5c631daSSadaf Ebrahimi               "bne 0x0000000a\n"
3454*f5c631daSSadaf Ebrahimi               "mov r0, #0\n"
3455*f5c631daSSadaf Ebrahimi               "lsl r0, r1, r0\n");
3456*f5c631daSSadaf Ebrahimi 
3457*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsl(eq, r0, r1, 32),
3458*f5c631daSSadaf Ebrahimi               "bne 0x0000000a\n"
3459*f5c631daSSadaf Ebrahimi               "mov r0, #32\n"
3460*f5c631daSSadaf Ebrahimi               "lsl r0, r1, r0\n");
3461*f5c631daSSadaf Ebrahimi 
3462*f5c631daSSadaf Ebrahimi   // LSL (register) T1
3463*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsl(eq, r7, r7, r3),
3464*f5c631daSSadaf Ebrahimi               "it eq\n"
3465*f5c631daSSadaf Ebrahimi               "lsleq r7, r3\n");
3466*f5c631daSSadaf Ebrahimi 
3467*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsl(eq, r8, r8, r3),
3468*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3469*f5c631daSSadaf Ebrahimi               "lsl r8, r3\n");
3470*f5c631daSSadaf Ebrahimi 
3471*f5c631daSSadaf Ebrahimi   // LSR (immediate) T2
3472*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsr(eq, r0, r1, 16),
3473*f5c631daSSadaf Ebrahimi               "it eq\n"
3474*f5c631daSSadaf Ebrahimi               "lsreq r0, r1, #16\n");
3475*f5c631daSSadaf Ebrahimi 
3476*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsr(eq, r0, r1, 32),
3477*f5c631daSSadaf Ebrahimi               "it eq\n"
3478*f5c631daSSadaf Ebrahimi               "lsreq r0, r1, #32\n");
3479*f5c631daSSadaf Ebrahimi 
3480*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsr(eq, r0, r1, 0),
3481*f5c631daSSadaf Ebrahimi               "bne 0x0000000a\n"
3482*f5c631daSSadaf Ebrahimi               "mov r0, #0\n"
3483*f5c631daSSadaf Ebrahimi               "lsr r0, r1, r0\n");
3484*f5c631daSSadaf Ebrahimi 
3485*f5c631daSSadaf Ebrahimi   // LSR (register) T1
3486*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsr(eq, r7, r7, r3),
3487*f5c631daSSadaf Ebrahimi               "it eq\n"
3488*f5c631daSSadaf Ebrahimi               "lsreq r7, r3\n");
3489*f5c631daSSadaf Ebrahimi 
3490*f5c631daSSadaf Ebrahimi   COMPARE_T32(Lsr(eq, r8, r8, r3),
3491*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3492*f5c631daSSadaf Ebrahimi               "lsr r8, r3\n");
3493*f5c631daSSadaf Ebrahimi 
3494*f5c631daSSadaf Ebrahimi   // MOV (immediate) T1
3495*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r7, 0xff),
3496*f5c631daSSadaf Ebrahimi               "it eq\n"
3497*f5c631daSSadaf Ebrahimi               "moveq r7, #255\n");
3498*f5c631daSSadaf Ebrahimi 
3499*f5c631daSSadaf Ebrahimi   // MOV (register) T1
3500*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r9, r8),
3501*f5c631daSSadaf Ebrahimi               "it eq\n"
3502*f5c631daSSadaf Ebrahimi               "moveq r9, r8\n");
3503*f5c631daSSadaf Ebrahimi 
3504*f5c631daSSadaf Ebrahimi   // MOV (register) T2
3505*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r0, Operand(r1, LSR, 16)),
3506*f5c631daSSadaf Ebrahimi               "it eq\n"
3507*f5c631daSSadaf Ebrahimi               "lsreq r0, r1, #16\n");
3508*f5c631daSSadaf Ebrahimi 
3509*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r0, Operand(r1, ROR, 16)),
3510*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3511*f5c631daSSadaf Ebrahimi               "ror r0, r1, #16\n");
3512*f5c631daSSadaf Ebrahimi 
3513*f5c631daSSadaf Ebrahimi   // MOV (register-shifted register) T1
3514*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r0, Operand(r0, LSR, r1)),
3515*f5c631daSSadaf Ebrahimi               "it eq\n"
3516*f5c631daSSadaf Ebrahimi               "lsreq r0, r1\n");
3517*f5c631daSSadaf Ebrahimi 
3518*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mov(eq, r0, Operand(r1, LSR, r2)),
3519*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3520*f5c631daSSadaf Ebrahimi               "lsr r0, r1, r2\n");
3521*f5c631daSSadaf Ebrahimi 
3522*f5c631daSSadaf Ebrahimi   // MUL (T1)
3523*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mul(eq, r0, r1, r0),
3524*f5c631daSSadaf Ebrahimi               "it eq\n"
3525*f5c631daSSadaf Ebrahimi               "muleq r0, r1, r0\n");
3526*f5c631daSSadaf Ebrahimi 
3527*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mul(eq, r0, r1, r2),
3528*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3529*f5c631daSSadaf Ebrahimi               "mul r0, r1, r2\n");
3530*f5c631daSSadaf Ebrahimi 
3531*f5c631daSSadaf Ebrahimi   // MVN (register) T1
3532*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mvn(eq, r4, r6),
3533*f5c631daSSadaf Ebrahimi               "it eq\n"
3534*f5c631daSSadaf Ebrahimi               "mvneq r4, r6\n");
3535*f5c631daSSadaf Ebrahimi 
3536*f5c631daSSadaf Ebrahimi   COMPARE_T32(Mvn(eq, r8, r6),
3537*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3538*f5c631daSSadaf Ebrahimi               "mvn r8, r6\n");
3539*f5c631daSSadaf Ebrahimi 
3540*f5c631daSSadaf Ebrahimi   // ORR (register) T1
3541*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orr(eq, r0, r0, r1),
3542*f5c631daSSadaf Ebrahimi               "it eq\n"
3543*f5c631daSSadaf Ebrahimi               "orreq r0, r1\n");
3544*f5c631daSSadaf Ebrahimi 
3545*f5c631daSSadaf Ebrahimi   COMPARE_T32(Orr(eq, r0, r1, r2),
3546*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3547*f5c631daSSadaf Ebrahimi               "orr r0, r1, r2\n");
3548*f5c631daSSadaf Ebrahimi 
3549*f5c631daSSadaf Ebrahimi   // ROR (register) T1
3550*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ror(eq, r7, r7, r3),
3551*f5c631daSSadaf Ebrahimi               "it eq\n"
3552*f5c631daSSadaf Ebrahimi               "roreq r7, r3\n");
3553*f5c631daSSadaf Ebrahimi 
3554*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ror(eq, r8, r8, r3),
3555*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3556*f5c631daSSadaf Ebrahimi               "ror r8, r3\n");
3557*f5c631daSSadaf Ebrahimi 
3558*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ror(eq, r0, r1, 16),
3559*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3560*f5c631daSSadaf Ebrahimi               "ror r0, r1, #16\n");
3561*f5c631daSSadaf Ebrahimi 
3562*f5c631daSSadaf Ebrahimi   // RSB (immediate) T1
3563*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsb(eq, r0, r1, 0),
3564*f5c631daSSadaf Ebrahimi               "it eq\n"
3565*f5c631daSSadaf Ebrahimi               "rsbeq r0, r1, #0\n");
3566*f5c631daSSadaf Ebrahimi 
3567*f5c631daSSadaf Ebrahimi   COMPARE_T32(Rsb(eq, r0, r1, 1),
3568*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3569*f5c631daSSadaf Ebrahimi               "rsb r0, r1, #1\n");
3570*f5c631daSSadaf Ebrahimi 
3571*f5c631daSSadaf Ebrahimi   // SBC (register) T1
3572*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sbc(eq, r0, r0, r1),
3573*f5c631daSSadaf Ebrahimi               "it eq\n"
3574*f5c631daSSadaf Ebrahimi               "sbceq r0, r1\n");
3575*f5c631daSSadaf Ebrahimi 
3576*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sbc(eq, r0, r1, r2),
3577*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3578*f5c631daSSadaf Ebrahimi               "sbc r0, r1, r2\n");
3579*f5c631daSSadaf Ebrahimi 
3580*f5c631daSSadaf Ebrahimi   // STR (immediate) T1
3581*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r4, MemOperand(r7, 124)),
3582*f5c631daSSadaf Ebrahimi               "it eq\n"
3583*f5c631daSSadaf Ebrahimi               "streq r4, [r7, #124]\n");
3584*f5c631daSSadaf Ebrahimi 
3585*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r4, MemOperand(r7, 1)),
3586*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3587*f5c631daSSadaf Ebrahimi               "str r4, [r7, #1]\n");
3588*f5c631daSSadaf Ebrahimi 
3589*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r4, MemOperand(r7, 128)),
3590*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3591*f5c631daSSadaf Ebrahimi               "str r4, [r7, #128]\n");
3592*f5c631daSSadaf Ebrahimi 
3593*f5c631daSSadaf Ebrahimi   // STR (immediate) T2
3594*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r4, MemOperand(sp, 1020)),
3595*f5c631daSSadaf Ebrahimi               "it eq\n"
3596*f5c631daSSadaf Ebrahimi               "streq r4, [sp, #1020]\n");
3597*f5c631daSSadaf Ebrahimi 
3598*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r4, MemOperand(sp, 1)),
3599*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3600*f5c631daSSadaf Ebrahimi               "str r4, [sp, #1]\n");
3601*f5c631daSSadaf Ebrahimi 
3602*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r4, MemOperand(sp, 1024)),
3603*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3604*f5c631daSSadaf Ebrahimi               "str r4, [sp, #1024]\n");
3605*f5c631daSSadaf Ebrahimi 
3606*f5c631daSSadaf Ebrahimi   // STR (register) T1
3607*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r5, MemOperand(r6, r7)),
3608*f5c631daSSadaf Ebrahimi               "it eq\n"
3609*f5c631daSSadaf Ebrahimi               "streq r5, [r6, r7]\n");
3610*f5c631daSSadaf Ebrahimi 
3611*f5c631daSSadaf Ebrahimi   COMPARE_T32(Str(eq, r5, MemOperand(r6, r8)),
3612*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3613*f5c631daSSadaf Ebrahimi               "str r5, [r6, r8]\n");
3614*f5c631daSSadaf Ebrahimi 
3615*f5c631daSSadaf Ebrahimi   // STRB (immediate) T1
3616*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strb(eq, r6, MemOperand(r7, 31)),
3617*f5c631daSSadaf Ebrahimi               "it eq\n"
3618*f5c631daSSadaf Ebrahimi               "strbeq r6, [r7, #31]\n");
3619*f5c631daSSadaf Ebrahimi 
3620*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strb(eq, r6, MemOperand(r7, 32)),
3621*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3622*f5c631daSSadaf Ebrahimi               "strb r6, [r7, #32]\n");
3623*f5c631daSSadaf Ebrahimi 
3624*f5c631daSSadaf Ebrahimi   // STRB (register) T1
3625*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strb(eq, r5, MemOperand(r6, r7)),
3626*f5c631daSSadaf Ebrahimi               "it eq\n"
3627*f5c631daSSadaf Ebrahimi               "strbeq r5, [r6, r7]\n");
3628*f5c631daSSadaf Ebrahimi 
3629*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strb(eq, r6, MemOperand(r9)),
3630*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3631*f5c631daSSadaf Ebrahimi               "strb r6, [r9]\n");
3632*f5c631daSSadaf Ebrahimi 
3633*f5c631daSSadaf Ebrahimi   // STRH (immediate) T1
3634*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strh(eq, r6, MemOperand(r7, 62)),
3635*f5c631daSSadaf Ebrahimi               "it eq\n"
3636*f5c631daSSadaf Ebrahimi               "strheq r6, [r7, #62]\n");
3637*f5c631daSSadaf Ebrahimi 
3638*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strh(eq, r6, MemOperand(r7, 64)),
3639*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3640*f5c631daSSadaf Ebrahimi               "strh r6, [r7, #64]\n");
3641*f5c631daSSadaf Ebrahimi 
3642*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strh(eq, r6, MemOperand(r7, 1)),
3643*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3644*f5c631daSSadaf Ebrahimi               "strh r6, [r7, #1]\n");
3645*f5c631daSSadaf Ebrahimi 
3646*f5c631daSSadaf Ebrahimi   // STRH (register) T1
3647*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strh(eq, r5, MemOperand(r6, r7)),
3648*f5c631daSSadaf Ebrahimi               "it eq\n"
3649*f5c631daSSadaf Ebrahimi               "strheq r5, [r6, r7]\n");
3650*f5c631daSSadaf Ebrahimi 
3651*f5c631daSSadaf Ebrahimi   COMPARE_T32(Strh(eq, r6, MemOperand(r9)),
3652*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3653*f5c631daSSadaf Ebrahimi               "strh r6, [r9]\n");
3654*f5c631daSSadaf Ebrahimi 
3655*f5c631daSSadaf Ebrahimi   // SUB (immediate) T1
3656*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(eq, r0, r1, 0x1),
3657*f5c631daSSadaf Ebrahimi               "it eq\n"
3658*f5c631daSSadaf Ebrahimi               "subeq r0, r1, #1\n");
3659*f5c631daSSadaf Ebrahimi 
3660*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(eq, r0, r1, 0x8),
3661*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3662*f5c631daSSadaf Ebrahimi               "sub r0, r1, #8\n");
3663*f5c631daSSadaf Ebrahimi 
3664*f5c631daSSadaf Ebrahimi   // SUB (immediate) T2
3665*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(eq, r0, r0, 0xff),
3666*f5c631daSSadaf Ebrahimi               "it eq\n"
3667*f5c631daSSadaf Ebrahimi               "subeq r0, #255\n");
3668*f5c631daSSadaf Ebrahimi 
3669*f5c631daSSadaf Ebrahimi   // SUB (register) T1
3670*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(eq, r0, r1, r7),
3671*f5c631daSSadaf Ebrahimi               "it eq\n"
3672*f5c631daSSadaf Ebrahimi               "subeq r0, r1, r7\n");
3673*f5c631daSSadaf Ebrahimi 
3674*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(eq, r5, r5, r8),
3675*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3676*f5c631daSSadaf Ebrahimi               "sub r5, r8\n");
3677*f5c631daSSadaf Ebrahimi 
3678*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(eq, r7, sp, 1),
3679*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3680*f5c631daSSadaf Ebrahimi               "sub r7, sp, #1\n");
3681*f5c631daSSadaf Ebrahimi 
3682*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32(Sub(eq, pc, pc, 0), "Unpredictable instruction.\n");
3683*f5c631daSSadaf Ebrahimi 
3684*f5c631daSSadaf Ebrahimi   // TST (register) T1
3685*f5c631daSSadaf Ebrahimi   COMPARE_T32(Tst(eq, r0, r1),
3686*f5c631daSSadaf Ebrahimi               "it eq\n"
3687*f5c631daSSadaf Ebrahimi               "tsteq r0, r1\n");
3688*f5c631daSSadaf Ebrahimi 
3689*f5c631daSSadaf Ebrahimi   COMPARE_T32(Tst(eq, r8, r9),
3690*f5c631daSSadaf Ebrahimi               "bne 0x00000006\n"
3691*f5c631daSSadaf Ebrahimi               "tst r8, r9\n");
3692*f5c631daSSadaf Ebrahimi 
3693*f5c631daSSadaf Ebrahimi   CLEANUP();
3694*f5c631daSSadaf Ebrahimi }
3695*f5c631daSSadaf Ebrahimi 
3696*f5c631daSSadaf Ebrahimi 
TEST(unbound_label)3697*f5c631daSSadaf Ebrahimi TEST(unbound_label) {
3698*f5c631daSSadaf Ebrahimi   SETUP();
3699*f5c631daSSadaf Ebrahimi 
3700*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG
3701*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH_BLOCK(
3702*f5c631daSSadaf Ebrahimi       {
3703*f5c631daSSadaf Ebrahimi         Label label;
3704*f5c631daSSadaf Ebrahimi         masm.B(&label);
3705*f5c631daSSadaf Ebrahimi       },
3706*f5c631daSSadaf Ebrahimi       "Location, label or literal used but not bound.\n")
3707*f5c631daSSadaf Ebrahimi 
3708*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_BOTH_BLOCK(
3709*f5c631daSSadaf Ebrahimi       {
3710*f5c631daSSadaf Ebrahimi         Label label;
3711*f5c631daSSadaf Ebrahimi         masm.B(eq, &label);
3712*f5c631daSSadaf Ebrahimi       },
3713*f5c631daSSadaf Ebrahimi       "Location, label or literal used but not bound.\n")
3714*f5c631daSSadaf Ebrahimi 
3715*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32_BLOCK(
3716*f5c631daSSadaf Ebrahimi       {
3717*f5c631daSSadaf Ebrahimi         Label label;
3718*f5c631daSSadaf Ebrahimi         masm.Cbz(r0, &label);
3719*f5c631daSSadaf Ebrahimi       },
3720*f5c631daSSadaf Ebrahimi       "Location, label or literal used but not bound.\n")
3721*f5c631daSSadaf Ebrahimi 
3722*f5c631daSSadaf Ebrahimi   MUST_FAIL_TEST_T32_BLOCK(
3723*f5c631daSSadaf Ebrahimi       {
3724*f5c631daSSadaf Ebrahimi         Label label;
3725*f5c631daSSadaf Ebrahimi         masm.Cbnz(r1, &label);
3726*f5c631daSSadaf Ebrahimi       },
3727*f5c631daSSadaf Ebrahimi       "Location, label or literal used but not bound.\n")
3728*f5c631daSSadaf Ebrahimi #endif
3729*f5c631daSSadaf Ebrahimi 
3730*f5c631daSSadaf Ebrahimi   CLEANUP();
3731*f5c631daSSadaf Ebrahimi }
3732*f5c631daSSadaf Ebrahimi 
3733*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_AddressComputationHelper)3734*f5c631daSSadaf Ebrahimi TEST(macro_assembler_AddressComputationHelper) {
3735*f5c631daSSadaf Ebrahimi   SETUP();
3736*f5c631daSSadaf Ebrahimi 
3737*f5c631daSSadaf Ebrahimi   // Simple cases: the address fits in the mask.
3738*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, masm.MemOperandComputationHelper(r1, r1, 0xfff, 0xfff)),
3739*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #4095]\n");
3740*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, masm.MemOperandComputationHelper(r1, r1, 1, 0xfff)),
3741*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #1]\n");
3742*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, masm.MemOperandComputationHelper(r1, r1, 0, 0xfff)),
3743*f5c631daSSadaf Ebrahimi               "ldr r0, [r1]\n");
3744*f5c631daSSadaf Ebrahimi 
3745*f5c631daSSadaf Ebrahimi   // Similar, but the base register must be preserved. (This has no effect for
3746*f5c631daSSadaf Ebrahimi   // encodable cases.)
3747*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, masm.MemOperandComputationHelper(r2, r1, 0xfff, 0xfff)),
3748*f5c631daSSadaf Ebrahimi               "ldr r0, [r1, #4095]\n");
3749*f5c631daSSadaf Ebrahimi 
3750*f5c631daSSadaf Ebrahimi   // Cases where the extra offset has to be aligned.
3751*f5c631daSSadaf Ebrahimi   COMPARE_A32(Vldr(d0, masm.MemOperandComputationHelper(r1, r1, 0x3fc, 0x3fc)),
3752*f5c631daSSadaf Ebrahimi               "vldr d0, [r1, #1020]\n");
3753*f5c631daSSadaf Ebrahimi 
3754*f5c631daSSadaf Ebrahimi   // Out-of-range offsets.
3755*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, masm.MemOperandComputationHelper(r1, r1, 0x1000, 0xfff)),
3756*f5c631daSSadaf Ebrahimi               "add r1, #4096\n"
3757*f5c631daSSadaf Ebrahimi               "ldr r0, [r1]\n");
3758*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, masm.MemOperandComputationHelper(r2, r1, 0x1000, 0xfff)),
3759*f5c631daSSadaf Ebrahimi               "add r2, r1, #4096\n"
3760*f5c631daSSadaf Ebrahimi               "ldr r0, [r2]\n");
3761*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0,
3762*f5c631daSSadaf Ebrahimi                   masm.MemOperandComputationHelper(r2, r1, 0xffffffff, 0xfff)),
3763*f5c631daSSadaf Ebrahimi               "sub r2, r1, #1\n"
3764*f5c631daSSadaf Ebrahimi               "ldr r0, [r2]\n");
3765*f5c631daSSadaf Ebrahimi 
3766*f5c631daSSadaf Ebrahimi   // TODO: Improve the code generation for these cases.
3767*f5c631daSSadaf Ebrahimi 
3768*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0,
3769*f5c631daSSadaf Ebrahimi                   masm.MemOperandComputationHelper(r2, r1, 0x12345678, 0xfff)),
3770*f5c631daSSadaf Ebrahimi               "mov r2, #20480\n"
3771*f5c631daSSadaf Ebrahimi               "movt r2, #4660\n"
3772*f5c631daSSadaf Ebrahimi               "add r2, r1, r2\n"
3773*f5c631daSSadaf Ebrahimi               "ldr r0, [r2, #1656]\n");
3774*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0,
3775*f5c631daSSadaf Ebrahimi                   masm.MemOperandComputationHelper(r2, r1, 0x7fffffff, 0xfff)),
3776*f5c631daSSadaf Ebrahimi               "sub r2, r1, #1\n"
3777*f5c631daSSadaf Ebrahimi               "sub r2, #2147483648\n"
3778*f5c631daSSadaf Ebrahimi               "ldr r0, [r2]\n");
3779*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0,
3780*f5c631daSSadaf Ebrahimi                   masm.MemOperandComputationHelper(r2, r1, 0xffcba000, 0xfff)),
3781*f5c631daSSadaf Ebrahimi               "sub r2, r1, #286720\n"
3782*f5c631daSSadaf Ebrahimi               "sub r2, #3145728\n"
3783*f5c631daSSadaf Ebrahimi               "ldr r0, [r2]\n");
3784*f5c631daSSadaf Ebrahimi 
3785*f5c631daSSadaf Ebrahimi   CLEANUP();
3786*f5c631daSSadaf Ebrahimi }
3787*f5c631daSSadaf Ebrahimi 
3788*f5c631daSSadaf Ebrahimi 
TEST(barriers)3789*f5c631daSSadaf Ebrahimi TEST(barriers) {
3790*f5c631daSSadaf Ebrahimi   SETUP();
3791*f5c631daSSadaf Ebrahimi 
3792*f5c631daSSadaf Ebrahimi   // DMB
3793*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(SY), "dmb sy\n");
3794*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(ST), "dmb st\n");
3795*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(ISH), "dmb ish\n");
3796*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(ISHST), "dmb ishst\n");
3797*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(NSH), "dmb nsh\n");
3798*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(NSHST), "dmb nshst\n");
3799*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(OSH), "dmb osh\n");
3800*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dmb(OSHST), "dmb oshst\n");
3801*f5c631daSSadaf Ebrahimi 
3802*f5c631daSSadaf Ebrahimi   // DSB
3803*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(SY), "dsb sy\n");
3804*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(ST), "dsb st\n");
3805*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(ISH), "dsb ish\n");
3806*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(ISHST), "dsb ishst\n");
3807*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(NSH), "dsb nsh\n");
3808*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(NSHST), "dsb nshst\n");
3809*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(OSH), "dsb osh\n");
3810*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Dsb(OSHST), "dsb oshst\n");
3811*f5c631daSSadaf Ebrahimi 
3812*f5c631daSSadaf Ebrahimi   // ISB
3813*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Isb(SY), "isb sy\n");
3814*f5c631daSSadaf Ebrahimi 
3815*f5c631daSSadaf Ebrahimi   CLEANUP();
3816*f5c631daSSadaf Ebrahimi }
3817*f5c631daSSadaf Ebrahimi 
3818*f5c631daSSadaf Ebrahimi 
TEST(preloads)3819*f5c631daSSadaf Ebrahimi TEST(preloads) {
3820*f5c631daSSadaf Ebrahimi   // Smoke test for various pld/pli forms.
3821*f5c631daSSadaf Ebrahimi   SETUP();
3822*f5c631daSSadaf Ebrahimi 
3823*f5c631daSSadaf Ebrahimi   // PLD immediate
3824*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(r0, 0)), "pld [r0]\n");
3825*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(r1, 123)), "pld [r1, #123]\n");
3826*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(r4, -123)), "pld [r4, #-123]\n");
3827*f5c631daSSadaf Ebrahimi 
3828*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pld(MemOperand(r7, -4095)), "pld [r7, #-4095]\n");
3829*f5c631daSSadaf Ebrahimi 
3830*f5c631daSSadaf Ebrahimi   // PLDW immediate
3831*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pldw(MemOperand(r0, 0)), "pldw [r0]\n");
3832*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pldw(MemOperand(r1, 123)), "pldw [r1, #123]\n");
3833*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pldw(MemOperand(r4, -123)), "pldw [r4, #-123]\n");
3834*f5c631daSSadaf Ebrahimi 
3835*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pldw(MemOperand(r7, -4095)), "pldw [r7, #-4095]\n");
3836*f5c631daSSadaf Ebrahimi 
3837*f5c631daSSadaf Ebrahimi   // PLD register
3838*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(r0, r1)), "pld [r0, r1]\n");
3839*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(r0, r1, LSL, 1)), "pld [r0, r1, lsl #1]\n");
3840*f5c631daSSadaf Ebrahimi 
3841*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pld(MemOperand(r0, r1, LSL, 20)), "pld [r0, r1, lsl #20]\n");
3842*f5c631daSSadaf Ebrahimi 
3843*f5c631daSSadaf Ebrahimi   // PLDW register
3844*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pldw(MemOperand(r0, r1)), "pldw [r0, r1]\n");
3845*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pldw(MemOperand(r0, r1, LSL, 1)), "pldw [r0, r1, lsl #1]\n");
3846*f5c631daSSadaf Ebrahimi 
3847*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pldw(MemOperand(r0, r1, LSL, 20)), "pldw [r0, r1, lsl #20]\n");
3848*f5c631daSSadaf Ebrahimi 
3849*f5c631daSSadaf Ebrahimi   // PLD literal
3850*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(pc, minus, 0)), "pld [pc, #-0]\n");
3851*f5c631daSSadaf Ebrahimi 
3852*f5c631daSSadaf Ebrahimi   // PLI immediate
3853*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(r0, 0)), "pli [r0]\n");
3854*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(r1, 123)), "pli [r1, #123]\n");
3855*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(r4, -123)), "pli [r4, #-123]\n");
3856*f5c631daSSadaf Ebrahimi 
3857*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pli(MemOperand(r7, -4095)), "pli [r7, #-4095]\n");
3858*f5c631daSSadaf Ebrahimi 
3859*f5c631daSSadaf Ebrahimi   // PLI register
3860*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(r0, r1)), "pli [r0, r1]\n");
3861*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(r0, r1, LSL, 1)), "pli [r0, r1, lsl #1]\n");
3862*f5c631daSSadaf Ebrahimi 
3863*f5c631daSSadaf Ebrahimi   COMPARE_A32(Pli(MemOperand(r0, r1, LSL, 20)), "pli [r0, r1, lsl #20]\n");
3864*f5c631daSSadaf Ebrahimi 
3865*f5c631daSSadaf Ebrahimi   // PLI literal
3866*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(pc, minus, 0)), "pli [pc, #-0]\n");
3867*f5c631daSSadaf Ebrahimi 
3868*f5c631daSSadaf Ebrahimi   CLEANUP();
3869*f5c631daSSadaf Ebrahimi }
3870*f5c631daSSadaf Ebrahimi 
3871*f5c631daSSadaf Ebrahimi 
TEST(vcmp_vcmpe)3872*f5c631daSSadaf Ebrahimi TEST(vcmp_vcmpe) {
3873*f5c631daSSadaf Ebrahimi   SETUP();
3874*f5c631daSSadaf Ebrahimi 
3875*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmp(F32, s0, s1), "vcmp.f32 s0, s1\n");
3876*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmp(F64, d0, d1), "vcmp.f64 d0, d1\n");
3877*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmp(F32, s0, 0.0f), "vcmp.f32 s0, #0.0\n");
3878*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmp(F64, d0, 0.0), "vcmp.f64 d0, #0.0\n");
3879*f5c631daSSadaf Ebrahimi 
3880*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmpe(F32, s0, s1), "vcmpe.f32 s0, s1\n");
3881*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmpe(F64, d0, d1), "vcmpe.f64 d0, d1\n");
3882*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmpe(F32, s0, 0.0f), "vcmpe.f32 s0, #0.0\n");
3883*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vcmpe(F64, d0, 0.0), "vcmpe.f64 d0, #0.0\n");
3884*f5c631daSSadaf Ebrahimi 
3885*f5c631daSSadaf Ebrahimi   CLEANUP();
3886*f5c631daSSadaf Ebrahimi }
3887*f5c631daSSadaf Ebrahimi 
3888*f5c631daSSadaf Ebrahimi 
TEST(vmrs_vmsr)3889*f5c631daSSadaf Ebrahimi TEST(vmrs_vmsr) {
3890*f5c631daSSadaf Ebrahimi   SETUP();
3891*f5c631daSSadaf Ebrahimi 
3892*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmsr(FPSCR, r0), "vmsr FPSCR, r0\n");
3893*f5c631daSSadaf Ebrahimi 
3894*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmrs(RegisterOrAPSR_nzcv(r1.GetCode()), FPSCR),
3895*f5c631daSSadaf Ebrahimi                "vmrs r1, FPSCR\n");
3896*f5c631daSSadaf Ebrahimi 
3897*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vmrs(RegisterOrAPSR_nzcv(pc.GetCode()), FPSCR),
3898*f5c631daSSadaf Ebrahimi                "vmrs APSR_nzcv, FPSCR\n");
3899*f5c631daSSadaf Ebrahimi 
3900*f5c631daSSadaf Ebrahimi   CLEANUP();
3901*f5c631daSSadaf Ebrahimi }
3902*f5c631daSSadaf Ebrahimi 
3903*f5c631daSSadaf Ebrahimi 
TEST(ldm_stm)3904*f5c631daSSadaf Ebrahimi TEST(ldm_stm) {
3905*f5c631daSSadaf Ebrahimi   SETUP();
3906*f5c631daSSadaf Ebrahimi 
3907*f5c631daSSadaf Ebrahimi   // ldm/stm
3908*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldm(r0, NO_WRITE_BACK, RegisterList(r1)), "ldm r0, {r1}\n");
3909*f5c631daSSadaf Ebrahimi 
3910*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldm(r1, NO_WRITE_BACK, RegisterList(r2, r5, r9, r10)),
3911*f5c631daSSadaf Ebrahimi                "ldm r1, {r2,r5,r9,r10}\n");
3912*f5c631daSSadaf Ebrahimi 
3913*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldm(r0, WRITE_BACK, RegisterList(r1, r2)), "ldm r0!, {r1,r2}\n");
3914*f5c631daSSadaf Ebrahimi 
3915*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Stm(r1, NO_WRITE_BACK, RegisterList(r2, r5, r9, r10)),
3916*f5c631daSSadaf Ebrahimi                "stm r1, {r2,r5,r9,r10}\n");
3917*f5c631daSSadaf Ebrahimi 
3918*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Stm(r0, WRITE_BACK, RegisterList(r1, r2)), "stm r0!, {r1,r2}\n");
3919*f5c631daSSadaf Ebrahimi 
3920*f5c631daSSadaf Ebrahimi   // ldmda/stmda
3921*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldmda(r11, WRITE_BACK, RegisterList(r0, r1)),
3922*f5c631daSSadaf Ebrahimi               "ldmda r11!, {r0,r1}\n");
3923*f5c631daSSadaf Ebrahimi 
3924*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldmda(r11, NO_WRITE_BACK, RegisterList(r2, r3)),
3925*f5c631daSSadaf Ebrahimi               "ldmda r11, {r2,r3}\n");
3926*f5c631daSSadaf Ebrahimi 
3927*f5c631daSSadaf Ebrahimi   COMPARE_A32(Stmda(r11, WRITE_BACK, RegisterList(r0, r1)),
3928*f5c631daSSadaf Ebrahimi               "stmda r11!, {r0,r1}\n");
3929*f5c631daSSadaf Ebrahimi 
3930*f5c631daSSadaf Ebrahimi   COMPARE_A32(Stmda(r11, NO_WRITE_BACK, RegisterList(r2, r3)),
3931*f5c631daSSadaf Ebrahimi               "stmda r11, {r2,r3}\n");
3932*f5c631daSSadaf Ebrahimi 
3933*f5c631daSSadaf Ebrahimi   // ldmib/stmib
3934*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldmib(r11, WRITE_BACK, RegisterList(r0, r1)),
3935*f5c631daSSadaf Ebrahimi               "ldmib r11!, {r0,r1}\n");
3936*f5c631daSSadaf Ebrahimi 
3937*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldmib(r11, NO_WRITE_BACK, RegisterList(r2, r3)),
3938*f5c631daSSadaf Ebrahimi               "ldmib r11, {r2,r3}\n");
3939*f5c631daSSadaf Ebrahimi 
3940*f5c631daSSadaf Ebrahimi   COMPARE_A32(Stmib(r11, WRITE_BACK, RegisterList(r0, r1)),
3941*f5c631daSSadaf Ebrahimi               "stmib r11!, {r0,r1}\n");
3942*f5c631daSSadaf Ebrahimi 
3943*f5c631daSSadaf Ebrahimi   COMPARE_A32(Stmib(r11, NO_WRITE_BACK, RegisterList(r2, r3)),
3944*f5c631daSSadaf Ebrahimi               "stmib r11, {r2,r3}\n");
3945*f5c631daSSadaf Ebrahimi 
3946*f5c631daSSadaf Ebrahimi   // ldmdb/stmdb
3947*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldmdb(r11, WRITE_BACK, RegisterList(r0, r1)),
3948*f5c631daSSadaf Ebrahimi                "ldmdb r11!, {r0,r1}\n");
3949*f5c631daSSadaf Ebrahimi 
3950*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldmdb(r11, NO_WRITE_BACK, RegisterList(r2, r3)),
3951*f5c631daSSadaf Ebrahimi                "ldmdb r11, {r2,r3}\n");
3952*f5c631daSSadaf Ebrahimi 
3953*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Stmdb(r11, WRITE_BACK, RegisterList(r0, r1)),
3954*f5c631daSSadaf Ebrahimi                "stmdb r11!, {r0,r1}\n");
3955*f5c631daSSadaf Ebrahimi 
3956*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Stmdb(r11, NO_WRITE_BACK, RegisterList(r2, r3)),
3957*f5c631daSSadaf Ebrahimi                "stmdb r11, {r2,r3}\n");
3958*f5c631daSSadaf Ebrahimi 
3959*f5c631daSSadaf Ebrahimi   CLEANUP();
3960*f5c631daSSadaf Ebrahimi }
3961*f5c631daSSadaf Ebrahimi 
3962*f5c631daSSadaf Ebrahimi 
3963*f5c631daSSadaf Ebrahimi #define CHECK_T32_16(ASM, EXP) COMPARE_T32_CHECK_SIZE(ASM, EXP, 2)
3964*f5c631daSSadaf Ebrahimi // For instructions inside an IT block, we need to account for the IT
3965*f5c631daSSadaf Ebrahimi // instruction as well (another 16 bits).
3966*f5c631daSSadaf Ebrahimi #define CHECK_T32_16_IT_BLOCK(ASM, EXP) COMPARE_T32_CHECK_SIZE(ASM, EXP, 4)
3967*f5c631daSSadaf Ebrahimi 
TEST(macro_assembler_T32_16bit)3968*f5c631daSSadaf Ebrahimi TEST(macro_assembler_T32_16bit) {
3969*f5c631daSSadaf Ebrahimi   SETUP();
3970*f5c631daSSadaf Ebrahimi 
3971*f5c631daSSadaf Ebrahimi   // Allow the test to use all registers.
3972*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope temps(&masm);
3973*f5c631daSSadaf Ebrahimi   temps.ExcludeAll();
3974*f5c631daSSadaf Ebrahimi 
3975*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Adc(DontCare, r7, r7, r6), "adcs r7, r6\n");
3976*f5c631daSSadaf Ebrahimi 
3977*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Adc(DontCare, eq, r7, r7, r6),
3978*f5c631daSSadaf Ebrahimi                         "it eq\n"
3979*f5c631daSSadaf Ebrahimi                         "adceq r7, r6\n");
3980*f5c631daSSadaf Ebrahimi 
3981*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r6, r7, 7), "adds r6, r7, #7\n");
3982*f5c631daSSadaf Ebrahimi 
3983*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, lt, r6, r7, 7),
3984*f5c631daSSadaf Ebrahimi                         "it lt\n"
3985*f5c631daSSadaf Ebrahimi                         "addlt r6, r7, #7\n");
3986*f5c631daSSadaf Ebrahimi 
3987*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r5, r5, 255), "adds r5, #255\n");
3988*f5c631daSSadaf Ebrahimi 
3989*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, lt, r5, r5, 255),
3990*f5c631daSSadaf Ebrahimi                         "it lt\n"
3991*f5c631daSSadaf Ebrahimi                         "addlt r5, #255\n");
3992*f5c631daSSadaf Ebrahimi 
3993*f5c631daSSadaf Ebrahimi   // Make sure we select the non flag-setting version here, since
3994*f5c631daSSadaf Ebrahimi   // this can have two potential encodings.
3995*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r1, r1, r2), "add r1, r2\n");
3996*f5c631daSSadaf Ebrahimi 
3997*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r1, r2, r7), "adds r1, r2, r7\n");
3998*f5c631daSSadaf Ebrahimi 
3999*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, lt, r1, r2, r7),
4000*f5c631daSSadaf Ebrahimi                         "it lt\n"
4001*f5c631daSSadaf Ebrahimi                         "addlt r1, r2, r7\n");
4002*f5c631daSSadaf Ebrahimi 
4003*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r4, r4, r12), "add r4, ip\n");
4004*f5c631daSSadaf Ebrahimi 
4005*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, eq, r4, r4, r12),
4006*f5c631daSSadaf Ebrahimi                         "it eq\n"
4007*f5c631daSSadaf Ebrahimi                         "addeq r4, ip\n");
4008*f5c631daSSadaf Ebrahimi 
4009*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r0, sp, 1020), "add r0, sp, #1020\n");
4010*f5c631daSSadaf Ebrahimi 
4011*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, ge, r0, sp, 1020),
4012*f5c631daSSadaf Ebrahimi                         "it ge\n"
4013*f5c631daSSadaf Ebrahimi                         "addge r0, sp, #1020\n");
4014*f5c631daSSadaf Ebrahimi 
4015*f5c631daSSadaf Ebrahimi   // The equivalent inside an IT block is deprecated.
4016*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, sp, sp, 508), "add sp, #508\n");
4017*f5c631daSSadaf Ebrahimi 
4018*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r7, sp, r7), "add r7, sp, r7\n");
4019*f5c631daSSadaf Ebrahimi 
4020*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, eq, r7, sp, r7),
4021*f5c631daSSadaf Ebrahimi                         "it eq\n"
4022*f5c631daSSadaf Ebrahimi                         "addeq r7, sp, r7\n");
4023*f5c631daSSadaf Ebrahimi 
4024*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, sp, sp, r10), "add sp, r10\n");
4025*f5c631daSSadaf Ebrahimi 
4026*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Add(DontCare, eq, sp, sp, r10),
4027*f5c631daSSadaf Ebrahimi                         "it eq\n"
4028*f5c631daSSadaf Ebrahimi                         "addeq sp, r10\n");
4029*f5c631daSSadaf Ebrahimi 
4030*f5c631daSSadaf Ebrahimi   CHECK_T32_16(And(DontCare, r7, r7, r6), "ands r7, r6\n");
4031*f5c631daSSadaf Ebrahimi 
4032*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(And(DontCare, eq, r7, r7, r6),
4033*f5c631daSSadaf Ebrahimi                         "it eq\n"
4034*f5c631daSSadaf Ebrahimi                         "andeq r7, r6\n");
4035*f5c631daSSadaf Ebrahimi 
4036*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Asr(DontCare, r0, r1, 32), "asrs r0, r1, #32\n");
4037*f5c631daSSadaf Ebrahimi 
4038*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Asr(DontCare, eq, r0, r1, 32),
4039*f5c631daSSadaf Ebrahimi                         "it eq\n"
4040*f5c631daSSadaf Ebrahimi                         "asreq r0, r1, #32\n");
4041*f5c631daSSadaf Ebrahimi 
4042*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Asr(DontCare, r0, r0, r1), "asrs r0, r1\n");
4043*f5c631daSSadaf Ebrahimi 
4044*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Asr(DontCare, eq, r0, r0, r1),
4045*f5c631daSSadaf Ebrahimi                         "it eq\n"
4046*f5c631daSSadaf Ebrahimi                         "asreq r0, r1\n");
4047*f5c631daSSadaf Ebrahimi 
4048*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Bic(DontCare, r7, r7, r6), "bics r7, r6\n");
4049*f5c631daSSadaf Ebrahimi 
4050*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Bic(DontCare, eq, r7, r7, r6),
4051*f5c631daSSadaf Ebrahimi                         "it eq\n"
4052*f5c631daSSadaf Ebrahimi                         "biceq r7, r6\n");
4053*f5c631daSSadaf Ebrahimi 
4054*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Eor(DontCare, r7, r7, r6), "eors r7, r6\n");
4055*f5c631daSSadaf Ebrahimi 
4056*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Eor(DontCare, eq, r7, r7, r6),
4057*f5c631daSSadaf Ebrahimi                         "it eq\n"
4058*f5c631daSSadaf Ebrahimi                         "eoreq r7, r6\n");
4059*f5c631daSSadaf Ebrahimi 
4060*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Lsl(DontCare, r0, r1, 31), "lsls r0, r1, #31\n");
4061*f5c631daSSadaf Ebrahimi 
4062*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Lsl(DontCare, eq, r0, r1, 31),
4063*f5c631daSSadaf Ebrahimi                         "it eq\n"
4064*f5c631daSSadaf Ebrahimi                         "lsleq r0, r1, #31\n");
4065*f5c631daSSadaf Ebrahimi 
4066*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Lsl(DontCare, r0, r0, r1), "lsls r0, r1\n");
4067*f5c631daSSadaf Ebrahimi 
4068*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Lsl(DontCare, eq, r0, r0, r1),
4069*f5c631daSSadaf Ebrahimi                         "it eq\n"
4070*f5c631daSSadaf Ebrahimi                         "lsleq r0, r1\n");
4071*f5c631daSSadaf Ebrahimi 
4072*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Lsr(DontCare, r0, r1, 32), "lsrs r0, r1, #32\n");
4073*f5c631daSSadaf Ebrahimi 
4074*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Lsr(DontCare, eq, r0, r1, 32),
4075*f5c631daSSadaf Ebrahimi                         "it eq\n"
4076*f5c631daSSadaf Ebrahimi                         "lsreq r0, r1, #32\n");
4077*f5c631daSSadaf Ebrahimi 
4078*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Lsr(DontCare, r0, r0, r1), "lsrs r0, r1\n");
4079*f5c631daSSadaf Ebrahimi 
4080*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Lsr(DontCare, eq, r0, r0, r1),
4081*f5c631daSSadaf Ebrahimi                         "it eq\n"
4082*f5c631daSSadaf Ebrahimi                         "lsreq r0, r1\n");
4083*f5c631daSSadaf Ebrahimi 
4084*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r7, 255), "movs r7, #255\n");
4085*f5c631daSSadaf Ebrahimi 
4086*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r7, 255),
4087*f5c631daSSadaf Ebrahimi                         "it eq\n"
4088*f5c631daSSadaf Ebrahimi                         "moveq r7, #255\n");
4089*f5c631daSSadaf Ebrahimi 
4090*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r9, r8), "mov r9, r8\n");
4091*f5c631daSSadaf Ebrahimi 
4092*f5c631daSSadaf Ebrahimi   // Check that we don't try to pick the MOVS register-shifted register variant.
4093*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, r6), "mov r5, r6\n");
4094*f5c631daSSadaf Ebrahimi 
4095*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r9, r8),
4096*f5c631daSSadaf Ebrahimi                         "it eq\n"
4097*f5c631daSSadaf Ebrahimi                         "moveq r9, r8\n");
4098*f5c631daSSadaf Ebrahimi 
4099*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, Operand(r6, ASR, 1)), "asrs r5, r6, #1\n");
4100*f5c631daSSadaf Ebrahimi 
4101*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, Operand(r6, ASR, 32)), "asrs r5, r6, #32\n");
4102*f5c631daSSadaf Ebrahimi 
4103*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, Operand(r6, LSR, 1)), "lsrs r5, r6, #1\n");
4104*f5c631daSSadaf Ebrahimi 
4105*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, Operand(r6, LSR, 32)), "lsrs r5, r6, #32\n");
4106*f5c631daSSadaf Ebrahimi 
4107*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, Operand(r6, LSL, 1)), "lsls r5, r6, #1\n");
4108*f5c631daSSadaf Ebrahimi 
4109*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r5, Operand(r6, LSL, 31)), "lsls r5, r6, #31\n");
4110*f5c631daSSadaf Ebrahimi 
4111*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r5, Operand(r6, ASR, 1)),
4112*f5c631daSSadaf Ebrahimi                         "it eq\n"
4113*f5c631daSSadaf Ebrahimi                         "asreq r5, r6, #1\n");
4114*f5c631daSSadaf Ebrahimi 
4115*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r5, Operand(r6, ASR, 32)),
4116*f5c631daSSadaf Ebrahimi                         "it eq\n"
4117*f5c631daSSadaf Ebrahimi                         "asreq r5, r6, #32\n");
4118*f5c631daSSadaf Ebrahimi 
4119*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r5, Operand(r6, LSR, 1)),
4120*f5c631daSSadaf Ebrahimi                         "it eq\n"
4121*f5c631daSSadaf Ebrahimi                         "lsreq r5, r6, #1\n");
4122*f5c631daSSadaf Ebrahimi 
4123*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r5, Operand(r6, LSR, 32)),
4124*f5c631daSSadaf Ebrahimi                         "it eq\n"
4125*f5c631daSSadaf Ebrahimi                         "lsreq r5, r6, #32\n");
4126*f5c631daSSadaf Ebrahimi 
4127*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r5, Operand(r6, LSL, 1)),
4128*f5c631daSSadaf Ebrahimi                         "it eq\n"
4129*f5c631daSSadaf Ebrahimi                         "lsleq r5, r6, #1\n");
4130*f5c631daSSadaf Ebrahimi 
4131*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r5, Operand(r6, LSL, 31)),
4132*f5c631daSSadaf Ebrahimi                         "it eq\n"
4133*f5c631daSSadaf Ebrahimi                         "lsleq r5, r6, #31\n");
4134*f5c631daSSadaf Ebrahimi 
4135*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r7, Operand(r7, ASR, r6)), "asrs r7, r6\n");
4136*f5c631daSSadaf Ebrahimi 
4137*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r7, Operand(r7, ASR, r6)),
4138*f5c631daSSadaf Ebrahimi                         "it eq\n"
4139*f5c631daSSadaf Ebrahimi                         "asreq r7, r6\n");
4140*f5c631daSSadaf Ebrahimi 
4141*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r7, Operand(r7, LSR, r6)), "lsrs r7, r6\n");
4142*f5c631daSSadaf Ebrahimi 
4143*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r7, Operand(r7, LSR, r6)),
4144*f5c631daSSadaf Ebrahimi                         "it eq\n"
4145*f5c631daSSadaf Ebrahimi                         "lsreq r7, r6\n");
4146*f5c631daSSadaf Ebrahimi 
4147*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r7, Operand(r7, LSL, r6)), "lsls r7, r6\n");
4148*f5c631daSSadaf Ebrahimi 
4149*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r7, Operand(r7, LSL, r6)),
4150*f5c631daSSadaf Ebrahimi                         "it eq\n"
4151*f5c631daSSadaf Ebrahimi                         "lsleq r7, r6\n");
4152*f5c631daSSadaf Ebrahimi 
4153*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mov(DontCare, r7, Operand(r7, ROR, r6)), "rors r7, r6\n");
4154*f5c631daSSadaf Ebrahimi 
4155*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mov(DontCare, eq, r7, Operand(r7, ROR, r6)),
4156*f5c631daSSadaf Ebrahimi                         "it eq\n"
4157*f5c631daSSadaf Ebrahimi                         "roreq r7, r6\n");
4158*f5c631daSSadaf Ebrahimi 
4159*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mul(DontCare, r0, r1, r0), "muls r0, r1, r0\n");
4160*f5c631daSSadaf Ebrahimi 
4161*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mul(DontCare, eq, r0, r1, r0),
4162*f5c631daSSadaf Ebrahimi                         "it eq\n"
4163*f5c631daSSadaf Ebrahimi                         "muleq r0, r1, r0\n");
4164*f5c631daSSadaf Ebrahimi 
4165*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Mvn(DontCare, r6, r7), "mvns r6, r7\n");
4166*f5c631daSSadaf Ebrahimi 
4167*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Mvn(DontCare, eq, r6, r7),
4168*f5c631daSSadaf Ebrahimi                         "it eq\n"
4169*f5c631daSSadaf Ebrahimi                         "mvneq r6, r7\n");
4170*f5c631daSSadaf Ebrahimi 
4171*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Orr(DontCare, r7, r7, r6), "orrs r7, r6\n");
4172*f5c631daSSadaf Ebrahimi 
4173*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Orr(DontCare, eq, r7, r7, r6),
4174*f5c631daSSadaf Ebrahimi                         "it eq\n"
4175*f5c631daSSadaf Ebrahimi                         "orreq r7, r6\n");
4176*f5c631daSSadaf Ebrahimi 
4177*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Ror(DontCare, r0, r0, r1), "rors r0, r1\n");
4178*f5c631daSSadaf Ebrahimi 
4179*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Ror(DontCare, eq, r0, r0, r1),
4180*f5c631daSSadaf Ebrahimi                         "it eq\n"
4181*f5c631daSSadaf Ebrahimi                         "roreq r0, r1\n");
4182*f5c631daSSadaf Ebrahimi 
4183*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Rsb(DontCare, r7, r6, 0), "rsbs r7, r6, #0\n");
4184*f5c631daSSadaf Ebrahimi 
4185*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Rsb(DontCare, eq, r7, r6, 0),
4186*f5c631daSSadaf Ebrahimi                         "it eq\n"
4187*f5c631daSSadaf Ebrahimi                         "rsbeq r7, r6, #0\n");
4188*f5c631daSSadaf Ebrahimi 
4189*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sbc(DontCare, r7, r7, r6), "sbcs r7, r6\n");
4190*f5c631daSSadaf Ebrahimi 
4191*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Sbc(DontCare, eq, r7, r7, r6),
4192*f5c631daSSadaf Ebrahimi                         "it eq\n"
4193*f5c631daSSadaf Ebrahimi                         "sbceq r7, r6\n");
4194*f5c631daSSadaf Ebrahimi 
4195*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r6, r7, 7), "subs r6, r7, #7\n");
4196*f5c631daSSadaf Ebrahimi 
4197*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Sub(DontCare, lt, r6, r7, 7),
4198*f5c631daSSadaf Ebrahimi                         "it lt\n"
4199*f5c631daSSadaf Ebrahimi                         "sublt r6, r7, #7\n");
4200*f5c631daSSadaf Ebrahimi 
4201*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r5, r5, 255), "subs r5, #255\n");
4202*f5c631daSSadaf Ebrahimi 
4203*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Sub(DontCare, lt, r5, r5, 255),
4204*f5c631daSSadaf Ebrahimi                         "it lt\n"
4205*f5c631daSSadaf Ebrahimi                         "sublt r5, #255\n");
4206*f5c631daSSadaf Ebrahimi 
4207*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r1, r2, r7), "subs r1, r2, r7\n");
4208*f5c631daSSadaf Ebrahimi 
4209*f5c631daSSadaf Ebrahimi   CHECK_T32_16_IT_BLOCK(Sub(DontCare, lt, r1, r2, r7),
4210*f5c631daSSadaf Ebrahimi                         "it lt\n"
4211*f5c631daSSadaf Ebrahimi                         "sublt r1, r2, r7\n");
4212*f5c631daSSadaf Ebrahimi 
4213*f5c631daSSadaf Ebrahimi   // The equivalent inside an IT block is deprecated.
4214*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, sp, sp, 508), "sub sp, #508\n");
4215*f5c631daSSadaf Ebrahimi 
4216*f5c631daSSadaf Ebrahimi   // Generate SUBS for ADD.
4217*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r0, r1, -1), "subs r0, r1, #1\n");
4218*f5c631daSSadaf Ebrahimi 
4219*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r0, r1, -7), "subs r0, r1, #7\n");
4220*f5c631daSSadaf Ebrahimi 
4221*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r6, r6, -1), "subs r6, #1\n");
4222*f5c631daSSadaf Ebrahimi 
4223*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Add(DontCare, r6, r6, -255), "subs r6, #255\n");
4224*f5c631daSSadaf Ebrahimi 
4225*f5c631daSSadaf Ebrahimi   // Generate ADDS for SUB.
4226*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r0, r1, -1), "adds r0, r1, #1\n");
4227*f5c631daSSadaf Ebrahimi 
4228*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r0, r1, -7), "adds r0, r1, #7\n");
4229*f5c631daSSadaf Ebrahimi 
4230*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r6, r6, -1), "adds r6, #1\n");
4231*f5c631daSSadaf Ebrahimi 
4232*f5c631daSSadaf Ebrahimi   CHECK_T32_16(Sub(DontCare, r6, r6, -255), "adds r6, #255\n");
4233*f5c631daSSadaf Ebrahimi 
4234*f5c631daSSadaf Ebrahimi   // Check that we don't change the opcode for INT_MIN.
4235*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(DontCare, r6, r6, 0x80000000), "add r6, #2147483648\n");
4236*f5c631daSSadaf Ebrahimi 
4237*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(DontCare, r6, r6, 0x80000000), "sub r6, #2147483648\n");
4238*f5c631daSSadaf Ebrahimi 
4239*f5c631daSSadaf Ebrahimi   CLEANUP();
4240*f5c631daSSadaf Ebrahimi }
4241*f5c631daSSadaf Ebrahimi #undef CHECK_T32_16
4242*f5c631daSSadaf Ebrahimi #undef CHECK_T32_16_IT_BLOCK
4243*f5c631daSSadaf Ebrahimi 
TEST(nop_code)4244*f5c631daSSadaf Ebrahimi TEST(nop_code) {
4245*f5c631daSSadaf Ebrahimi   SETUP();
4246*f5c631daSSadaf Ebrahimi 
4247*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Nop(), "nop\n");
4248*f5c631daSSadaf Ebrahimi 
4249*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(And(r0, r0, r0), "");
4250*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(And(DontCare, r0, r0, r0), "");
4251*f5c631daSSadaf Ebrahimi 
4252*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Mov(r0, r0), "");
4253*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Mov(DontCare, r0, r0), "");
4254*f5c631daSSadaf Ebrahimi 
4255*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orr(r0, r0, r0), "");
4256*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Orr(DontCare, r0, r0, r0), "");
4257*f5c631daSSadaf Ebrahimi 
4258*f5c631daSSadaf Ebrahimi   CLEANUP();
4259*f5c631daSSadaf Ebrahimi }
4260*f5c631daSSadaf Ebrahimi 
4261*f5c631daSSadaf Ebrahimi 
TEST(minus_zero_offsets)4262*f5c631daSSadaf Ebrahimi TEST(minus_zero_offsets) {
4263*f5c631daSSadaf Ebrahimi   SETUP();
4264*f5c631daSSadaf Ebrahimi 
4265*f5c631daSSadaf Ebrahimi   COMPARE_A32(Ldr(r0, MemOperand(pc, minus, 0)), "ldr r0, [pc, #-0]\n");
4266*f5c631daSSadaf Ebrahimi   COMPARE_T32(Ldr(r0, MemOperand(pc, minus, 0)), "ldr.w r0, [pc, #-0]\n");
4267*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrb(r0, MemOperand(pc, minus, 0)), "ldrb r0, [pc, #-0]\n");
4268*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrh(r0, MemOperand(pc, minus, 0)), "ldrh r0, [pc, #-0]\n");
4269*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrd(r0, r1, MemOperand(pc, minus, 0)),
4270*f5c631daSSadaf Ebrahimi                "ldrd r0, r1, [pc, #-0]\n");
4271*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrsb(r0, MemOperand(pc, minus, 0)), "ldrsb r0, [pc, #-0]\n");
4272*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Ldrsh(r0, MemOperand(pc, minus, 0)), "ldrsh r0, [pc, #-0]\n");
4273*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pld(MemOperand(pc, minus, 0)), "pld [pc, #-0]\n");
4274*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Pli(MemOperand(pc, minus, 0)), "pli [pc, #-0]\n");
4275*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vldr(s0, MemOperand(pc, minus, 0)), "vldr s0, [pc, #-0]\n");
4276*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Vldr(d0, MemOperand(pc, minus, 0)), "vldr d0, [pc, #-0]\n");
4277*f5c631daSSadaf Ebrahimi 
4278*f5c631daSSadaf Ebrahimi   // This is an alias of ADR with a minus zero offset.
4279*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sub(r0, pc, 0), "sub r0, pc, #0\n");
4280*f5c631daSSadaf Ebrahimi 
4281*f5c631daSSadaf Ebrahimi   CLEANUP();
4282*f5c631daSSadaf Ebrahimi }
4283*f5c631daSSadaf Ebrahimi 
4284*f5c631daSSadaf Ebrahimi 
TEST(big_add_sub)4285*f5c631daSSadaf Ebrahimi TEST(big_add_sub) {
4286*f5c631daSSadaf Ebrahimi   SETUP();
4287*f5c631daSSadaf Ebrahimi 
4288*f5c631daSSadaf Ebrahimi   COMPARE_A32(Add(r0, r1, 0x4321),
4289*f5c631daSSadaf Ebrahimi               "add r0, r1, #33\n"
4290*f5c631daSSadaf Ebrahimi               "add r0, #17152\n");
4291*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, r1, 0x4321),
4292*f5c631daSSadaf Ebrahimi               "add r0, r1, #801\n"
4293*f5c631daSSadaf Ebrahimi               "add r0, #16384\n");
4294*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(r0, r1, 0x432100),
4295*f5c631daSSadaf Ebrahimi                "add r0, r1, #8448\n"
4296*f5c631daSSadaf Ebrahimi                "add r0, #4390912\n");
4297*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(r0, r1, 0x43000210),
4298*f5c631daSSadaf Ebrahimi                "add r0, r1, #528\n"
4299*f5c631daSSadaf Ebrahimi                "add r0, #1124073472\n");
4300*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(r0, r1, 0x30c00210),
4301*f5c631daSSadaf Ebrahimi                "add r0, r1, #528\n"
4302*f5c631daSSadaf Ebrahimi                "add r0, #817889280\n");
4303*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Add(r0, r1, 0x43000021),
4304*f5c631daSSadaf Ebrahimi                "add r0, r1, #33\n"
4305*f5c631daSSadaf Ebrahimi                "add r0, #1124073472\n");
4306*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, r1, 0x54321),
4307*f5c631daSSadaf Ebrahimi               "add r0, r1, #801\n"
4308*f5c631daSSadaf Ebrahimi               "add r0, #344064\n");
4309*f5c631daSSadaf Ebrahimi   COMPARE_T32(Add(r0, r1, 0x54000321),
4310*f5c631daSSadaf Ebrahimi               "add r0, r1, #801\n"
4311*f5c631daSSadaf Ebrahimi               "add r0, #1409286144\n");
4312*f5c631daSSadaf Ebrahimi 
4313*f5c631daSSadaf Ebrahimi   COMPARE_A32(Sub(r0, r1, 0x4321),
4314*f5c631daSSadaf Ebrahimi               "sub r0, r1, #33\n"
4315*f5c631daSSadaf Ebrahimi               "sub r0, #17152\n");
4316*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, r1, 0x4321),
4317*f5c631daSSadaf Ebrahimi               "sub r0, r1, #801\n"
4318*f5c631daSSadaf Ebrahimi               "sub r0, #16384\n");
4319*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sub(r0, r1, 0x432100),
4320*f5c631daSSadaf Ebrahimi                "sub r0, r1, #8448\n"
4321*f5c631daSSadaf Ebrahimi                "sub r0, #4390912\n");
4322*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sub(r0, r1, 0x43000210),
4323*f5c631daSSadaf Ebrahimi                "sub r0, r1, #528\n"
4324*f5c631daSSadaf Ebrahimi                "sub r0, #1124073472\n");
4325*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sub(r0, r1, 0x30c00210),
4326*f5c631daSSadaf Ebrahimi                "sub r0, r1, #528\n"
4327*f5c631daSSadaf Ebrahimi                "sub r0, #817889280\n");
4328*f5c631daSSadaf Ebrahimi   COMPARE_BOTH(Sub(r0, r1, 0x43000021),
4329*f5c631daSSadaf Ebrahimi                "sub r0, r1, #33\n"
4330*f5c631daSSadaf Ebrahimi                "sub r0, #1124073472\n");
4331*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, r1, 0x54321),
4332*f5c631daSSadaf Ebrahimi               "sub r0, r1, #801\n"
4333*f5c631daSSadaf Ebrahimi               "sub r0, #344064\n");
4334*f5c631daSSadaf Ebrahimi   COMPARE_T32(Sub(r0, r1, 0x54000321),
4335*f5c631daSSadaf Ebrahimi               "sub r0, r1, #801\n"
4336*f5c631daSSadaf Ebrahimi               "sub r0, #1409286144\n");
4337*f5c631daSSadaf Ebrahimi 
4338*f5c631daSSadaf Ebrahimi   CLEANUP();
4339*f5c631daSSadaf Ebrahimi }
4340*f5c631daSSadaf Ebrahimi 
4341*f5c631daSSadaf Ebrahimi }  // namespace aarch32
4342*f5c631daSSadaf Ebrahimi }  // namespace vixl
4343