The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / test / cctest / test-disasm-mips.cc @ f230a1cf

History | View | Annotate | Download (14.6 KB)

1
// Copyright 2012 the V8 project authors. All rights reserved.
2
// Redistribution and use in source and binary forms, with or without
3
// modification, are permitted provided that the following conditions are
4
// met:
5
//
6
//     * Redistributions of source code must retain the above copyright
7
//       notice, this list of conditions and the following disclaimer.
8
//     * Redistributions in binary form must reproduce the above
9
//       copyright notice, this list of conditions and the following
10
//       disclaimer in the documentation and/or other materials provided
11
//       with the distribution.
12
//     * Neither the name of Google Inc. nor the names of its
13
//       contributors may be used to endorse or promote products derived
14
//       from this software without specific prior written permission.
15
//
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
//
28

    
29
#include <stdlib.h>
30

    
31
#include "v8.h"
32

    
33
#include "debug.h"
34
#include "disasm.h"
35
#include "disassembler.h"
36
#include "macro-assembler.h"
37
#include "serialize.h"
38
#include "cctest.h"
39

    
40
using namespace v8::internal;
41

    
42

    
43
bool DisassembleAndCompare(byte* pc, const char* compare_string) {
44
  disasm::NameConverter converter;
45
  disasm::Disassembler disasm(converter);
46
  EmbeddedVector<char, 128> disasm_buffer;
47

    
48
  disasm.InstructionDecode(disasm_buffer, pc);
49

    
50
  if (strcmp(compare_string, disasm_buffer.start()) != 0) {
51
    fprintf(stderr,
52
            "expected: \n"
53
            "%s\n"
54
            "disassembled: \n"
55
            "%s\n\n",
56
            compare_string, disasm_buffer.start());
57
    return false;
58
  }
59
  return true;
60
}
61

    
62

    
63
// Set up V8 to a state where we can at least run the assembler and
64
// disassembler. Declare the variables and allocate the data structures used
65
// in the rest of the macros.
66
#define SET_UP()                                          \
67
  CcTest::InitializeVM();                                 \
68
  Isolate* isolate = CcTest::i_isolate();                  \
69
  HandleScope scope(isolate);                             \
70
  byte *buffer = reinterpret_cast<byte*>(malloc(4*1024)); \
71
  Assembler assm(isolate, buffer, 4*1024);                \
72
  bool failure = false;
73

    
74

    
75
// This macro assembles one instruction using the preallocated assembler and
76
// disassembles the generated instruction, comparing the output to the expected
77
// value. If the comparison fails an error message is printed, but the test
78
// continues to run until the end.
79
#define COMPARE(asm_, compare_string) \
80
  { \
81
    int pc_offset = assm.pc_offset(); \
82
    byte *progcounter = &buffer[pc_offset]; \
83
    assm.asm_; \
84
    if (!DisassembleAndCompare(progcounter, compare_string)) failure = true; \
85
  }
86

    
87

    
88
// Verify that all invocations of the COMPARE macro passed successfully.
89
// Exit with a failure if at least one of the tests failed.
90
#define VERIFY_RUN() \
91
if (failure) { \
92
    V8_Fatal(__FILE__, __LINE__, "MIPS Disassembler tests failed.\n"); \
93
  }
94

    
95

    
96
TEST(Type0) {
97
  SET_UP();
98

    
99
  COMPARE(addu(a0, a1, a2),
100
          "00a62021       addu    a0, a1, a2");
101
  COMPARE(addu(t2, t3, t4),
102
          "016c5021       addu    t2, t3, t4");
103
  COMPARE(addu(v0, v1, s0),
104
          "00701021       addu    v0, v1, s0");
105

    
106
  COMPARE(subu(a0, a1, a2),
107
          "00a62023       subu    a0, a1, a2");
108
  COMPARE(subu(t2, t3, t4),
109
          "016c5023       subu    t2, t3, t4");
110
  COMPARE(subu(v0, v1, s0),
111
          "00701023       subu    v0, v1, s0");
112

    
113
  COMPARE(mult(a0, a1),
114
          "00850018       mult    a0, a1");
115
  COMPARE(mult(t2, t3),
116
          "014b0018       mult    t2, t3");
117
  COMPARE(mult(v0, v1),
118
          "00430018       mult    v0, v1");
119

    
120
  COMPARE(multu(a0, a1),
121
          "00850019       multu   a0, a1");
122
  COMPARE(multu(t2, t3),
123
          "014b0019       multu   t2, t3");
124
  COMPARE(multu(v0, v1),
125
          "00430019       multu   v0, v1");
126

    
127
  COMPARE(div(a0, a1),
128
          "0085001a       div     a0, a1");
129
  COMPARE(div(t2, t3),
130
          "014b001a       div     t2, t3");
131
  COMPARE(div(v0, v1),
132
          "0043001a       div     v0, v1");
133

    
134
  COMPARE(divu(a0, a1),
135
          "0085001b       divu    a0, a1");
136
  COMPARE(divu(t2, t3),
137
          "014b001b       divu    t2, t3");
138
  COMPARE(divu(v0, v1),
139
          "0043001b       divu    v0, v1");
140

    
141
  if (kArchVariant != kLoongson) {
142
    COMPARE(mul(a0, a1, a2),
143
            "70a62002       mul     a0, a1, a2");
144
    COMPARE(mul(t2, t3, t4),
145
            "716c5002       mul     t2, t3, t4");
146
    COMPARE(mul(v0, v1, s0),
147
            "70701002       mul     v0, v1, s0");
148
  }
149

    
150
  COMPARE(addiu(a0, a1, 0x0),
151
          "24a40000       addiu   a0, a1, 0");
152
  COMPARE(addiu(s0, s1, 32767),
153
          "26307fff       addiu   s0, s1, 32767");
154
  COMPARE(addiu(t2, t3, -32768),
155
          "256a8000       addiu   t2, t3, -32768");
156
  COMPARE(addiu(v0, v1, -1),
157
          "2462ffff       addiu   v0, v1, -1");
158

    
159
  COMPARE(and_(a0, a1, a2),
160
          "00a62024       and     a0, a1, a2");
161
  COMPARE(and_(s0, s1, s2),
162
          "02328024       and     s0, s1, s2");
163
  COMPARE(and_(t2, t3, t4),
164
          "016c5024       and     t2, t3, t4");
165
  COMPARE(and_(v0, v1, a2),
166
          "00661024       and     v0, v1, a2");
167

    
168
  COMPARE(or_(a0, a1, a2),
169
          "00a62025       or      a0, a1, a2");
170
  COMPARE(or_(s0, s1, s2),
171
          "02328025       or      s0, s1, s2");
172
  COMPARE(or_(t2, t3, t4),
173
          "016c5025       or      t2, t3, t4");
174
  COMPARE(or_(v0, v1, a2),
175
          "00661025       or      v0, v1, a2");
176

    
177
  COMPARE(xor_(a0, a1, a2),
178
          "00a62026       xor     a0, a1, a2");
179
  COMPARE(xor_(s0, s1, s2),
180
          "02328026       xor     s0, s1, s2");
181
  COMPARE(xor_(t2, t3, t4),
182
          "016c5026       xor     t2, t3, t4");
183
  COMPARE(xor_(v0, v1, a2),
184
          "00661026       xor     v0, v1, a2");
185

    
186
  COMPARE(nor(a0, a1, a2),
187
          "00a62027       nor     a0, a1, a2");
188
  COMPARE(nor(s0, s1, s2),
189
          "02328027       nor     s0, s1, s2");
190
  COMPARE(nor(t2, t3, t4),
191
          "016c5027       nor     t2, t3, t4");
192
  COMPARE(nor(v0, v1, a2),
193
          "00661027       nor     v0, v1, a2");
194

    
195
  COMPARE(andi(a0, a1, 0x1),
196
          "30a40001       andi    a0, a1, 0x1");
197
  COMPARE(andi(v0, v1, 0xffff),
198
          "3062ffff       andi    v0, v1, 0xffff");
199

    
200
  COMPARE(ori(a0, a1, 0x1),
201
          "34a40001       ori     a0, a1, 0x1");
202
  COMPARE(ori(v0, v1, 0xffff),
203
          "3462ffff       ori     v0, v1, 0xffff");
204

    
205
  COMPARE(xori(a0, a1, 0x1),
206
          "38a40001       xori    a0, a1, 0x1");
207
  COMPARE(xori(v0, v1, 0xffff),
208
          "3862ffff       xori    v0, v1, 0xffff");
209

    
210
  COMPARE(lui(a0, 0x1),
211
          "3c040001       lui     a0, 0x1");
212
  COMPARE(lui(v0, 0xffff),
213
          "3c02ffff       lui     v0, 0xffff");
214

    
215
  COMPARE(sll(a0, a1, 0),
216
          "00052000       sll     a0, a1, 0");
217
  COMPARE(sll(s0, s1, 8),
218
          "00118200       sll     s0, s1, 8");
219
  COMPARE(sll(t2, t3, 24),
220
          "000b5600       sll     t2, t3, 24");
221
  COMPARE(sll(v0, v1, 31),
222
          "000317c0       sll     v0, v1, 31");
223

    
224
  COMPARE(sllv(a0, a1, a2),
225
          "00c52004       sllv    a0, a1, a2");
226
  COMPARE(sllv(s0, s1, s2),
227
          "02518004       sllv    s0, s1, s2");
228
  COMPARE(sllv(t2, t3, t4),
229
          "018b5004       sllv    t2, t3, t4");
230
  COMPARE(sllv(v0, v1, fp),
231
          "03c31004       sllv    v0, v1, fp");
232

    
233
  COMPARE(srl(a0, a1, 0),
234
          "00052002       srl     a0, a1, 0");
235
  COMPARE(srl(s0, s1, 8),
236
          "00118202       srl     s0, s1, 8");
237
  COMPARE(srl(t2, t3, 24),
238
          "000b5602       srl     t2, t3, 24");
239
  COMPARE(srl(v0, v1, 31),
240
          "000317c2       srl     v0, v1, 31");
241

    
242
  COMPARE(srlv(a0, a1, a2),
243
          "00c52006       srlv    a0, a1, a2");
244
  COMPARE(srlv(s0, s1, s2),
245
          "02518006       srlv    s0, s1, s2");
246
  COMPARE(srlv(t2, t3, t4),
247
          "018b5006       srlv    t2, t3, t4");
248
  COMPARE(srlv(v0, v1, fp),
249
          "03c31006       srlv    v0, v1, fp");
250

    
251
  COMPARE(sra(a0, a1, 0),
252
          "00052003       sra     a0, a1, 0");
253
  COMPARE(sra(s0, s1, 8),
254
          "00118203       sra     s0, s1, 8");
255
  COMPARE(sra(t2, t3, 24),
256
          "000b5603       sra     t2, t3, 24");
257
  COMPARE(sra(v0, v1, 31),
258
          "000317c3       sra     v0, v1, 31");
259

    
260
  COMPARE(srav(a0, a1, a2),
261
          "00c52007       srav    a0, a1, a2");
262
  COMPARE(srav(s0, s1, s2),
263
          "02518007       srav    s0, s1, s2");
264
  COMPARE(srav(t2, t3, t4),
265
          "018b5007       srav    t2, t3, t4");
266
  COMPARE(srav(v0, v1, fp),
267
          "03c31007       srav    v0, v1, fp");
268

    
269
  if (kArchVariant == kMips32r2) {
270
    COMPARE(rotr(a0, a1, 0),
271
            "00252002       rotr    a0, a1, 0");
272
    COMPARE(rotr(s0, s1, 8),
273
            "00318202       rotr    s0, s1, 8");
274
    COMPARE(rotr(t2, t3, 24),
275
            "002b5602       rotr    t2, t3, 24");
276
    COMPARE(rotr(v0, v1, 31),
277
            "002317c2       rotr    v0, v1, 31");
278

    
279
    COMPARE(rotrv(a0, a1, a2),
280
            "00c52046       rotrv   a0, a1, a2");
281
    COMPARE(rotrv(s0, s1, s2),
282
            "02518046       rotrv   s0, s1, s2");
283
    COMPARE(rotrv(t2, t3, t4),
284
            "018b5046       rotrv   t2, t3, t4");
285
    COMPARE(rotrv(v0, v1, fp),
286
            "03c31046       rotrv   v0, v1, fp");
287
  }
288

    
289
  COMPARE(break_(0),
290
          "0000000d       break, code: 0x00000 (0)");
291
  COMPARE(break_(261120),
292
          "00ff000d       break, code: 0x3fc00 (261120)");
293
  COMPARE(break_(1047552),
294
          "03ff000d       break, code: 0xffc00 (1047552)");
295

    
296
  COMPARE(tge(a0, a1, 0),
297
          "00850030       tge     a0, a1, code: 0x000");
298
  COMPARE(tge(s0, s1, 1023),
299
          "0211fff0       tge     s0, s1, code: 0x3ff");
300
  COMPARE(tgeu(a0, a1, 0),
301
          "00850031       tgeu    a0, a1, code: 0x000");
302
  COMPARE(tgeu(s0, s1, 1023),
303
          "0211fff1       tgeu    s0, s1, code: 0x3ff");
304
  COMPARE(tlt(a0, a1, 0),
305
          "00850032       tlt     a0, a1, code: 0x000");
306
  COMPARE(tlt(s0, s1, 1023),
307
          "0211fff2       tlt     s0, s1, code: 0x3ff");
308
  COMPARE(tltu(a0, a1, 0),
309
          "00850033       tltu    a0, a1, code: 0x000");
310
  COMPARE(tltu(s0, s1, 1023),
311
          "0211fff3       tltu    s0, s1, code: 0x3ff");
312
  COMPARE(teq(a0, a1, 0),
313
          "00850034       teq     a0, a1, code: 0x000");
314
  COMPARE(teq(s0, s1, 1023),
315
          "0211fff4       teq     s0, s1, code: 0x3ff");
316
  COMPARE(tne(a0, a1, 0),
317
          "00850036       tne     a0, a1, code: 0x000");
318
  COMPARE(tne(s0, s1, 1023),
319
          "0211fff6       tne     s0, s1, code: 0x3ff");
320

    
321
  COMPARE(mfhi(a0),
322
          "00002010       mfhi    a0");
323
  COMPARE(mfhi(s2),
324
          "00009010       mfhi    s2");
325
  COMPARE(mfhi(t4),
326
          "00006010       mfhi    t4");
327
  COMPARE(mfhi(v1),
328
          "00001810       mfhi    v1");
329
  COMPARE(mflo(a0),
330
          "00002012       mflo    a0");
331
  COMPARE(mflo(s2),
332
          "00009012       mflo    s2");
333
  COMPARE(mflo(t4),
334
          "00006012       mflo    t4");
335
  COMPARE(mflo(v1),
336
          "00001812       mflo    v1");
337

    
338
  COMPARE(slt(a0, a1, a2),
339
          "00a6202a       slt     a0, a1, a2");
340
  COMPARE(slt(s0, s1, s2),
341
          "0232802a       slt     s0, s1, s2");
342
  COMPARE(slt(t2, t3, t4),
343
          "016c502a       slt     t2, t3, t4");
344
  COMPARE(slt(v0, v1, a2),
345
          "0066102a       slt     v0, v1, a2");
346
  COMPARE(sltu(a0, a1, a2),
347
          "00a6202b       sltu    a0, a1, a2");
348
  COMPARE(sltu(s0, s1, s2),
349
          "0232802b       sltu    s0, s1, s2");
350
  COMPARE(sltu(t2, t3, t4),
351
          "016c502b       sltu    t2, t3, t4");
352
  COMPARE(sltu(v0, v1, a2),
353
          "0066102b       sltu    v0, v1, a2");
354

    
355
  COMPARE(slti(a0, a1, 0),
356
          "28a40000       slti    a0, a1, 0");
357
  COMPARE(slti(s0, s1, 32767),
358
          "2a307fff       slti    s0, s1, 32767");
359
  COMPARE(slti(t2, t3, -32768),
360
          "296a8000       slti    t2, t3, -32768");
361
  COMPARE(slti(v0, v1, -1),
362
          "2862ffff       slti    v0, v1, -1");
363
  COMPARE(sltiu(a0, a1, 0),
364
          "2ca40000       sltiu   a0, a1, 0");
365
  COMPARE(sltiu(s0, s1, 32767),
366
          "2e307fff       sltiu   s0, s1, 32767");
367
  COMPARE(sltiu(t2, t3, -32768),
368
          "2d6a8000       sltiu   t2, t3, -32768");
369
  COMPARE(sltiu(v0, v1, -1),
370
          "2c62ffff       sltiu   v0, v1, -1");
371

    
372
  if (kArchVariant != kLoongson) {
373
    COMPARE(movz(a0, a1, a2),
374
            "00a6200a       movz    a0, a1, a2");
375
    COMPARE(movz(s0, s1, s2),
376
            "0232800a       movz    s0, s1, s2");
377
    COMPARE(movz(t2, t3, t4),
378
            "016c500a       movz    t2, t3, t4");
379
    COMPARE(movz(v0, v1, a2),
380
            "0066100a       movz    v0, v1, a2");
381
    COMPARE(movn(a0, a1, a2),
382
            "00a6200b       movn    a0, a1, a2");
383
    COMPARE(movn(s0, s1, s2),
384
            "0232800b       movn    s0, s1, s2");
385
    COMPARE(movn(t2, t3, t4),
386
            "016c500b       movn    t2, t3, t4");
387
    COMPARE(movn(v0, v1, a2),
388
            "0066100b       movn    v0, v1, a2");
389

    
390
    COMPARE(movt(a0, a1, 1),
391
            "00a52001       movt    a0, a1, 1");
392
    COMPARE(movt(s0, s1, 2),
393
            "02298001       movt    s0, s1, 2");
394
    COMPARE(movt(t2, t3, 3),
395
            "016d5001       movt    t2, t3, 3");
396
    COMPARE(movt(v0, v1, 7),
397
            "007d1001       movt    v0, v1, 7");
398
    COMPARE(movf(a0, a1, 0),
399
            "00a02001       movf    a0, a1, 0");
400
    COMPARE(movf(s0, s1, 4),
401
            "02308001       movf    s0, s1, 4");
402
    COMPARE(movf(t2, t3, 5),
403
            "01745001       movf    t2, t3, 5");
404
    COMPARE(movf(v0, v1, 6),
405
            "00781001       movf    v0, v1, 6");
406

    
407
    COMPARE(clz(a0, a1),
408
            "70a42020       clz     a0, a1");
409
    COMPARE(clz(s6, s7),
410
            "72f6b020       clz     s6, s7");
411
    COMPARE(clz(v0, v1),
412
            "70621020       clz     v0, v1");
413
  }
414

    
415
  if (kArchVariant == kMips32r2) {
416
    COMPARE(ins_(a0, a1, 31, 1),
417
            "7ca4ffc4       ins     a0, a1, 31, 1");
418
    COMPARE(ins_(s6, s7, 30, 2),
419
            "7ef6ff84       ins     s6, s7, 30, 2");
420
    COMPARE(ins_(v0, v1, 0, 32),
421
            "7c62f804       ins     v0, v1, 0, 32");
422
    COMPARE(ext_(a0, a1, 31, 1),
423
            "7ca407c0       ext     a0, a1, 31, 1");
424
    COMPARE(ext_(s6, s7, 30, 2),
425
            "7ef60f80       ext     s6, s7, 30, 2");
426
    COMPARE(ext_(v0, v1, 0, 32),
427
            "7c62f800       ext     v0, v1, 0, 32");
428
  }
429

    
430
  VERIFY_RUN();
431
}