1// Copyright 2011 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#include <stdlib.h>
29
30#include "src/v8.h"
31
32#include "src/code-factory.h"
33#include "src/debug/debug.h"
34#include "src/disasm.h"
35#include "src/disassembler.h"
36#include "src/ia32/frames-ia32.h"
37#include "src/macro-assembler.h"
38#include "test/cctest/cctest.h"
39
40using namespace v8::internal;
41
42
43#define __ assm.
44
45
46static void DummyStaticFunction(Object* result) {
47}
48
49
50TEST(DisasmIa320) {
51  CcTest::InitializeVM();
52  Isolate* isolate = CcTest::i_isolate();
53  HandleScope scope(isolate);
54  v8::internal::byte buffer[4096];
55  Assembler assm(isolate, buffer, sizeof buffer);
56  DummyStaticFunction(NULL);  // just bloody use it (DELETE; debugging)
57
58  // Short immediate instructions
59  __ adc(eax, 12345678);
60  __ add(eax, Immediate(12345678));
61  __ or_(eax, 12345678);
62  __ sub(eax, Immediate(12345678));
63  __ xor_(eax, 12345678);
64  __ and_(eax, 12345678);
65  Handle<FixedArray> foo = isolate->factory()->NewFixedArray(10, TENURED);
66  __ cmp(eax, foo);
67
68  // ---- This one caused crash
69  __ mov(ebx,  Operand(esp, ecx, times_2, 0));  // [esp+ecx*4]
70
71  // ---- All instructions that I can think of
72  __ add(edx, ebx);
73  __ add(edx, Operand(12, RelocInfo::NONE32));
74  __ add(edx, Operand(ebx, 0));
75  __ add(edx, Operand(ebx, 16));
76  __ add(edx, Operand(ebx, 1999));
77  __ add(edx, Operand(ebx, -4));
78  __ add(edx, Operand(ebx, -1999));
79  __ add(edx, Operand(esp, 0));
80  __ add(edx, Operand(esp, 16));
81  __ add(edx, Operand(esp, 1999));
82  __ add(edx, Operand(esp, -4));
83  __ add(edx, Operand(esp, -1999));
84  __ nop();
85  __ add(esi, Operand(ecx, times_4, 0));
86  __ add(esi, Operand(ecx, times_4, 24));
87  __ add(esi, Operand(ecx, times_4, -4));
88  __ add(esi, Operand(ecx, times_4, -1999));
89  __ nop();
90  __ add(edi, Operand(ebp, ecx, times_4, 0));
91  __ add(edi, Operand(ebp, ecx, times_4, 12));
92  __ add(edi, Operand(ebp, ecx, times_4, -8));
93  __ add(edi, Operand(ebp, ecx, times_4, -3999));
94  __ add(Operand(ebp, ecx, times_4, 12), Immediate(12));
95
96  __ nop();
97  __ add(ebx, Immediate(12));
98  __ nop();
99  __ adc(edx, Operand(ebx));
100  __ adc(ecx, 12);
101  __ adc(ecx, 1000);
102  __ nop();
103  __ and_(edx, 3);
104  __ and_(edx, Operand(esp, 4));
105  __ cmp(edx, 3);
106  __ cmp(edx, Operand(esp, 4));
107  __ cmp(Operand(ebp, ecx, times_4, 0), Immediate(1000));
108  Handle<FixedArray> foo2 = isolate->factory()->NewFixedArray(10, TENURED);
109  __ cmp(ebx, foo2);
110  __ cmpb(ebx, Operand(ebp, ecx, times_2, 0));
111  __ cmpb(Operand(ebp, ecx, times_2, 0), ebx);
112  __ or_(edx, 3);
113  __ xor_(edx, 3);
114  __ nop();
115  __ cpuid();
116  __ movsx_b(edx, ecx);
117  __ movsx_w(edx, ecx);
118  __ movzx_b(edx, ecx);
119  __ movzx_w(edx, ecx);
120
121  __ nop();
122  __ imul(edx, ecx);
123  __ shld(edx, ecx, 10);
124  __ shld_cl(edx, ecx);
125  __ shrd(edx, ecx, 10);
126  __ shrd_cl(edx, ecx);
127  __ bts(edx, ecx);
128  __ bts(Operand(ebx, ecx, times_4, 0), ecx);
129  __ nop();
130  __ pushad();
131  __ popad();
132  __ pushfd();
133  __ popfd();
134  __ push(Immediate(12));
135  __ push(Immediate(23456));
136  __ push(ecx);
137  __ push(esi);
138  __ push(Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
139  __ push(Operand(ebx, ecx, times_4, 0));
140  __ push(Operand(ebx, ecx, times_4, 0));
141  __ push(Operand(ebx, ecx, times_4, 10000));
142  __ pop(edx);
143  __ pop(eax);
144  __ pop(Operand(ebx, ecx, times_4, 0));
145  __ nop();
146
147  __ add(edx, Operand(esp, 16));
148  __ add(edx, ecx);
149  __ mov_b(edx, ecx);
150  __ mov_b(ecx, 6);
151  __ mov_b(Operand(ebx, ecx, times_4, 10000), 6);
152  __ mov_b(Operand(esp, 16), edx);
153  __ mov_w(edx, Operand(esp, 16));
154  __ mov_w(Operand(esp, 16), edx);
155  __ nop();
156  __ movsx_w(edx, Operand(esp, 12));
157  __ movsx_b(edx, Operand(esp, 12));
158  __ movzx_w(edx, Operand(esp, 12));
159  __ movzx_b(edx, Operand(esp, 12));
160  __ nop();
161  __ mov(edx, 1234567);
162  __ mov(edx, Operand(esp, 12));
163  __ mov(Operand(ebx, ecx, times_4, 10000), Immediate(12345));
164  __ mov(Operand(ebx, ecx, times_4, 10000), edx);
165  __ nop();
166  __ dec_b(edx);
167  __ dec_b(Operand(eax, 10));
168  __ dec_b(Operand(ebx, ecx, times_4, 10000));
169  __ dec(edx);
170  __ cdq();
171
172  __ nop();
173  __ idiv(edx);
174  __ idiv(Operand(edx, ecx, times_1, 1));
175  __ idiv(Operand(esp, 12));
176  __ div(edx);
177  __ div(Operand(edx, ecx, times_1, 1));
178  __ div(Operand(esp, 12));
179  __ mul(edx);
180  __ neg(edx);
181  __ not_(edx);
182  __ test(Operand(ebx, ecx, times_4, 10000), Immediate(123456));
183
184  __ imul(edx, Operand(ebx, ecx, times_4, 10000));
185  __ imul(edx, ecx, 12);
186  __ imul(edx, Operand(edx, eax, times_2, 42), 8);
187  __ imul(edx, ecx, 1000);
188  __ imul(edx, Operand(ebx, ecx, times_4, 1), 9000);
189
190  __ inc(edx);
191  __ inc(Operand(ebx, ecx, times_4, 10000));
192  __ push(Operand(ebx, ecx, times_4, 10000));
193  __ pop(Operand(ebx, ecx, times_4, 10000));
194  __ call(Operand(ebx, ecx, times_4, 10000));
195  __ jmp(Operand(ebx, ecx, times_4, 10000));
196
197  __ lea(edx, Operand(ebx, ecx, times_4, 10000));
198  __ or_(edx, 12345);
199  __ or_(edx, Operand(ebx, ecx, times_4, 10000));
200
201  __ nop();
202
203  __ rcl(edx, 1);
204  __ rcl(edx, 7);
205  __ rcr(edx, 1);
206  __ rcr(edx, 7);
207  __ ror(edx, 1);
208  __ ror(edx, 6);
209  __ ror_cl(edx);
210  __ ror(Operand(ebx, ecx, times_4, 10000), 1);
211  __ ror(Operand(ebx, ecx, times_4, 10000), 6);
212  __ ror_cl(Operand(ebx, ecx, times_4, 10000));
213  __ sar(edx, 1);
214  __ sar(edx, 6);
215  __ sar_cl(edx);
216  __ sar(Operand(ebx, ecx, times_4, 10000), 1);
217  __ sar(Operand(ebx, ecx, times_4, 10000), 6);
218  __ sar_cl(Operand(ebx, ecx, times_4, 10000));
219  __ sbb(edx, Operand(ebx, ecx, times_4, 10000));
220  __ shl(edx, 1);
221  __ shl(edx, 6);
222  __ shl_cl(edx);
223  __ shl(Operand(ebx, ecx, times_4, 10000), 1);
224  __ shl(Operand(ebx, ecx, times_4, 10000), 6);
225  __ shl_cl(Operand(ebx, ecx, times_4, 10000));
226  __ shrd_cl(Operand(ebx, ecx, times_4, 10000), edx);
227  __ shr(edx, 1);
228  __ shr(edx, 7);
229  __ shr_cl(edx);
230  __ shr(Operand(ebx, ecx, times_4, 10000), 1);
231  __ shr(Operand(ebx, ecx, times_4, 10000), 6);
232  __ shr_cl(Operand(ebx, ecx, times_4, 10000));
233
234
235  // Immediates
236
237  __ adc(edx, 12345);
238
239  __ add(ebx, Immediate(12));
240  __ add(Operand(edx, ecx, times_4, 10000), Immediate(12));
241
242  __ and_(ebx, 12345);
243
244  __ cmp(ebx, 12345);
245  __ cmp(ebx, Immediate(12));
246  __ cmp(Operand(edx, ecx, times_4, 10000), Immediate(12));
247  __ cmpb(eax, Immediate(100));
248
249  __ or_(ebx, 12345);
250
251  __ sub(ebx, Immediate(12));
252  __ sub(Operand(edx, ecx, times_4, 10000), Immediate(12));
253
254  __ xor_(ebx, 12345);
255
256  __ imul(edx, ecx, 12);
257  __ imul(edx, ecx, 1000);
258
259  __ cld();
260  __ rep_movs();
261  __ rep_stos();
262  __ stos();
263
264  __ sub(edx, Operand(ebx, ecx, times_4, 10000));
265  __ sub(edx, ebx);
266
267  __ test(edx, Immediate(12345));
268  __ test(edx, Operand(ebx, ecx, times_8, 10000));
269  __ test(Operand(esi, edi, times_1, -20000000), Immediate(300000000));
270  __ test_b(edx, Operand(ecx, ebx, times_2, 1000));
271  __ test_b(Operand(eax, -20), Immediate(0x9A));
272  __ nop();
273
274  __ xor_(edx, 12345);
275  __ xor_(edx, Operand(ebx, ecx, times_8, 10000));
276  __ bts(Operand(ebx, ecx, times_8, 10000), edx);
277  __ hlt();
278  __ int3();
279  __ ret(0);
280  __ ret(8);
281
282  // Calls
283
284  Label L1, L2;
285  __ bind(&L1);
286  __ nop();
287  __ call(&L1);
288  __ call(&L2);
289  __ nop();
290  __ bind(&L2);
291  __ call(Operand(ebx, ecx, times_4, 10000));
292  __ nop();
293  Handle<Code> ic(CodeFactory::LoadIC(isolate).code());
294  __ call(ic, RelocInfo::CODE_TARGET);
295  __ nop();
296  __ call(FUNCTION_ADDR(DummyStaticFunction), RelocInfo::RUNTIME_ENTRY);
297  __ nop();
298
299  __ jmp(&L1);
300  __ jmp(Operand(ebx, ecx, times_4, 10000));
301  ExternalReference after_break_target =
302      ExternalReference::debug_after_break_target_address(isolate);
303  __ jmp(Operand::StaticVariable(after_break_target));
304  __ jmp(ic, RelocInfo::CODE_TARGET);
305  __ nop();
306
307
308  Label Ljcc;
309  __ nop();
310  // long jumps
311  __ j(overflow, &Ljcc);
312  __ j(no_overflow, &Ljcc);
313  __ j(below, &Ljcc);
314  __ j(above_equal, &Ljcc);
315  __ j(equal, &Ljcc);
316  __ j(not_equal, &Ljcc);
317  __ j(below_equal, &Ljcc);
318  __ j(above, &Ljcc);
319  __ j(sign, &Ljcc);
320  __ j(not_sign, &Ljcc);
321  __ j(parity_even, &Ljcc);
322  __ j(parity_odd, &Ljcc);
323  __ j(less, &Ljcc);
324  __ j(greater_equal, &Ljcc);
325  __ j(less_equal, &Ljcc);
326  __ j(greater, &Ljcc);
327  __ nop();
328  __ bind(&Ljcc);
329  // short jumps
330  __ j(overflow, &Ljcc);
331  __ j(no_overflow, &Ljcc);
332  __ j(below, &Ljcc);
333  __ j(above_equal, &Ljcc);
334  __ j(equal, &Ljcc);
335  __ j(not_equal, &Ljcc);
336  __ j(below_equal, &Ljcc);
337  __ j(above, &Ljcc);
338  __ j(sign, &Ljcc);
339  __ j(not_sign, &Ljcc);
340  __ j(parity_even, &Ljcc);
341  __ j(parity_odd, &Ljcc);
342  __ j(less, &Ljcc);
343  __ j(greater_equal, &Ljcc);
344  __ j(less_equal, &Ljcc);
345  __ j(greater, &Ljcc);
346
347  // 0xD9 instructions
348  __ nop();
349
350  __ fld(1);
351  __ fld1();
352  __ fldz();
353  __ fldpi();
354  __ fabs();
355  __ fchs();
356  __ fprem();
357  __ fprem1();
358  __ fincstp();
359  __ ftst();
360  __ fxch(3);
361  __ fld_s(Operand(ebx, ecx, times_4, 10000));
362  __ fstp_s(Operand(ebx, ecx, times_4, 10000));
363  __ ffree(3);
364  __ fld_d(Operand(ebx, ecx, times_4, 10000));
365  __ fstp_d(Operand(ebx, ecx, times_4, 10000));
366  __ nop();
367
368  __ fild_s(Operand(ebx, ecx, times_4, 10000));
369  __ fistp_s(Operand(ebx, ecx, times_4, 10000));
370  __ fild_d(Operand(ebx, ecx, times_4, 10000));
371  __ fistp_d(Operand(ebx, ecx, times_4, 10000));
372  __ fnstsw_ax();
373  __ nop();
374  __ fadd(3);
375  __ fsub(3);
376  __ fmul(3);
377  __ fdiv(3);
378
379  __ faddp(3);
380  __ fsubp(3);
381  __ fmulp(3);
382  __ fdivp(3);
383  __ fcompp();
384  __ fwait();
385  __ frndint();
386  __ fninit();
387  __ nop();
388
389  // SSE instruction
390  {
391    // Move operation
392    __ movaps(xmm0, xmm1);
393    __ shufps(xmm0, xmm0, 0x0);
394    __ cvtsd2ss(xmm0, xmm1);
395    __ cvtsd2ss(xmm0, Operand(ebx, ecx, times_4, 10000));
396
397    // logic operation
398    __ andps(xmm0, xmm1);
399    __ andps(xmm0, Operand(ebx, ecx, times_4, 10000));
400    __ orps(xmm0, xmm1);
401    __ orps(xmm0, Operand(ebx, ecx, times_4, 10000));
402    __ xorps(xmm0, xmm1);
403    __ xorps(xmm0, Operand(ebx, ecx, times_4, 10000));
404
405    // Arithmetic operation
406    __ addss(xmm1, xmm0);
407    __ addss(xmm1, Operand(ebx, ecx, times_4, 10000));
408    __ mulss(xmm1, xmm0);
409    __ mulss(xmm1, Operand(ebx, ecx, times_4, 10000));
410    __ subss(xmm1, xmm0);
411    __ subss(xmm1, Operand(ebx, ecx, times_4, 10000));
412    __ divss(xmm1, xmm0);
413    __ divss(xmm1, Operand(ebx, ecx, times_4, 10000));
414    __ maxss(xmm1, xmm0);
415    __ maxss(xmm1, Operand(ebx, ecx, times_4, 10000));
416    __ minss(xmm1, xmm0);
417    __ minss(xmm1, Operand(ebx, ecx, times_4, 10000));
418    __ sqrtss(xmm1, xmm0);
419    __ sqrtss(xmm1, Operand(ebx, ecx, times_4, 10000));
420    __ addps(xmm1, xmm0);
421    __ addps(xmm1, Operand(ebx, ecx, times_4, 10000));
422    __ subps(xmm1, xmm0);
423    __ subps(xmm1, Operand(ebx, ecx, times_4, 10000));
424    __ mulps(xmm1, xmm0);
425    __ mulps(xmm1, Operand(ebx, ecx, times_4, 10000));
426    __ divps(xmm1, xmm0);
427    __ divps(xmm1, Operand(ebx, ecx, times_4, 10000));
428
429    __ ucomiss(xmm0, xmm1);
430    __ ucomiss(xmm0, Operand(ebx, ecx, times_4, 10000));
431  }
432  {
433    __ cvttss2si(edx, Operand(ebx, ecx, times_4, 10000));
434    __ cvtsi2sd(xmm1, Operand(ebx, ecx, times_4, 10000));
435    __ cvtss2sd(xmm1, Operand(ebx, ecx, times_4, 10000));
436    __ cvtss2sd(xmm1, xmm0);
437    __ movsd(xmm1, Operand(ebx, ecx, times_4, 10000));
438    __ movsd(Operand(ebx, ecx, times_4, 10000), xmm1);
439    // 128 bit move instructions.
440    __ movdqa(xmm0, Operand(ebx, ecx, times_4, 10000));
441    __ movdqa(Operand(ebx, ecx, times_4, 10000), xmm0);
442    __ movdqu(xmm0, Operand(ebx, ecx, times_4, 10000));
443    __ movdqu(Operand(ebx, ecx, times_4, 10000), xmm0);
444
445    __ addsd(xmm1, xmm0);
446    __ addsd(xmm1, Operand(ebx, ecx, times_4, 10000));
447    __ mulsd(xmm1, xmm0);
448    __ mulsd(xmm1, Operand(ebx, ecx, times_4, 10000));
449    __ subsd(xmm1, xmm0);
450    __ subsd(xmm1, Operand(ebx, ecx, times_4, 10000));
451    __ divsd(xmm1, xmm0);
452    __ divsd(xmm1, Operand(ebx, ecx, times_4, 10000));
453    __ minsd(xmm1, xmm0);
454    __ minsd(xmm1, Operand(ebx, ecx, times_4, 10000));
455    __ maxsd(xmm1, xmm0);
456    __ maxsd(xmm1, Operand(ebx, ecx, times_4, 10000));
457    __ ucomisd(xmm0, xmm1);
458    __ cmpltsd(xmm0, xmm1);
459
460    __ andpd(xmm0, xmm1);
461    __ psllq(xmm0, 17);
462    __ psllq(xmm0, xmm1);
463    __ psrlq(xmm0, 17);
464    __ psrlq(xmm0, xmm1);
465    __ por(xmm0, xmm1);
466
467    __ pcmpeqd(xmm1, xmm0);
468
469    __ punpckldq(xmm1, xmm6);
470    __ punpckhdq(xmm7, xmm5);
471  }
472
473  // cmov.
474  {
475    __ cmov(overflow, eax, Operand(eax, 0));
476    __ cmov(no_overflow, eax, Operand(eax, 1));
477    __ cmov(below, eax, Operand(eax, 2));
478    __ cmov(above_equal, eax, Operand(eax, 3));
479    __ cmov(equal, eax, Operand(ebx, 0));
480    __ cmov(not_equal, eax, Operand(ebx, 1));
481    __ cmov(below_equal, eax, Operand(ebx, 2));
482    __ cmov(above, eax, Operand(ebx, 3));
483    __ cmov(sign, eax, Operand(ecx, 0));
484    __ cmov(not_sign, eax, Operand(ecx, 1));
485    __ cmov(parity_even, eax, Operand(ecx, 2));
486    __ cmov(parity_odd, eax, Operand(ecx, 3));
487    __ cmov(less, eax, Operand(edx, 0));
488    __ cmov(greater_equal, eax, Operand(edx, 1));
489    __ cmov(less_equal, eax, Operand(edx, 2));
490    __ cmov(greater, eax, Operand(edx, 3));
491  }
492
493  {
494    if (CpuFeatures::IsSupported(SSE4_1)) {
495      CpuFeatureScope scope(&assm, SSE4_1);
496      __ pextrd(eax, xmm0, 1);
497      __ pinsrd(xmm1, eax, 0);
498      __ extractps(eax, xmm1, 0);
499    }
500  }
501
502  // AVX instruction
503  {
504    if (CpuFeatures::IsSupported(AVX)) {
505      CpuFeatureScope scope(&assm, AVX);
506      __ vaddsd(xmm0, xmm1, xmm2);
507      __ vaddsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
508      __ vmulsd(xmm0, xmm1, xmm2);
509      __ vmulsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
510      __ vsubsd(xmm0, xmm1, xmm2);
511      __ vsubsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
512      __ vdivsd(xmm0, xmm1, xmm2);
513      __ vdivsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
514      __ vminsd(xmm0, xmm1, xmm2);
515      __ vminsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
516      __ vmaxsd(xmm0, xmm1, xmm2);
517      __ vmaxsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
518
519      __ vaddss(xmm0, xmm1, xmm2);
520      __ vaddss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
521      __ vmulss(xmm0, xmm1, xmm2);
522      __ vmulss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
523      __ vsubss(xmm0, xmm1, xmm2);
524      __ vsubss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
525      __ vdivss(xmm0, xmm1, xmm2);
526      __ vdivss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
527      __ vminss(xmm0, xmm1, xmm2);
528      __ vminss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
529      __ vmaxss(xmm0, xmm1, xmm2);
530      __ vmaxss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
531
532      __ vandps(xmm0, xmm1, xmm2);
533      __ vandps(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
534      __ vxorps(xmm0, xmm1, xmm2);
535      __ vxorps(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
536
537      __ vandpd(xmm0, xmm1, xmm2);
538      __ vandpd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
539      __ vxorpd(xmm0, xmm1, xmm2);
540      __ vxorpd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
541    }
542  }
543
544  // FMA3 instruction
545  {
546    if (CpuFeatures::IsSupported(FMA3)) {
547      CpuFeatureScope scope(&assm, FMA3);
548      __ vfmadd132sd(xmm0, xmm1, xmm2);
549      __ vfmadd132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
550      __ vfmadd213sd(xmm0, xmm1, xmm2);
551      __ vfmadd213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
552      __ vfmadd231sd(xmm0, xmm1, xmm2);
553      __ vfmadd231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
554
555      __ vfmsub132sd(xmm0, xmm1, xmm2);
556      __ vfmsub132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
557      __ vfmsub213sd(xmm0, xmm1, xmm2);
558      __ vfmsub213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
559      __ vfmsub231sd(xmm0, xmm1, xmm2);
560      __ vfmsub231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
561
562      __ vfnmadd132sd(xmm0, xmm1, xmm2);
563      __ vfnmadd132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
564      __ vfnmadd213sd(xmm0, xmm1, xmm2);
565      __ vfnmadd213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
566      __ vfnmadd231sd(xmm0, xmm1, xmm2);
567      __ vfnmadd231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
568
569      __ vfnmsub132sd(xmm0, xmm1, xmm2);
570      __ vfnmsub132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
571      __ vfnmsub213sd(xmm0, xmm1, xmm2);
572      __ vfnmsub213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
573      __ vfnmsub231sd(xmm0, xmm1, xmm2);
574      __ vfnmsub231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
575
576      __ vfmadd132ss(xmm0, xmm1, xmm2);
577      __ vfmadd132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
578      __ vfmadd213ss(xmm0, xmm1, xmm2);
579      __ vfmadd213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
580      __ vfmadd231ss(xmm0, xmm1, xmm2);
581      __ vfmadd231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
582
583      __ vfmsub132ss(xmm0, xmm1, xmm2);
584      __ vfmsub132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
585      __ vfmsub213ss(xmm0, xmm1, xmm2);
586      __ vfmsub213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
587      __ vfmsub231ss(xmm0, xmm1, xmm2);
588      __ vfmsub231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
589
590      __ vfnmadd132ss(xmm0, xmm1, xmm2);
591      __ vfnmadd132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
592      __ vfnmadd213ss(xmm0, xmm1, xmm2);
593      __ vfnmadd213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
594      __ vfnmadd231ss(xmm0, xmm1, xmm2);
595      __ vfnmadd231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
596
597      __ vfnmsub132ss(xmm0, xmm1, xmm2);
598      __ vfnmsub132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
599      __ vfnmsub213ss(xmm0, xmm1, xmm2);
600      __ vfnmsub213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
601      __ vfnmsub231ss(xmm0, xmm1, xmm2);
602      __ vfnmsub231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
603    }
604  }
605
606  // BMI1 instructions
607  {
608    if (CpuFeatures::IsSupported(BMI1)) {
609      CpuFeatureScope scope(&assm, BMI1);
610      __ andn(eax, ebx, ecx);
611      __ andn(eax, ebx, Operand(ebx, ecx, times_4, 10000));
612      __ bextr(eax, ebx, ecx);
613      __ bextr(eax, Operand(ebx, ecx, times_4, 10000), ebx);
614      __ blsi(eax, ebx);
615      __ blsi(eax, Operand(ebx, ecx, times_4, 10000));
616      __ blsmsk(eax, ebx);
617      __ blsmsk(eax, Operand(ebx, ecx, times_4, 10000));
618      __ blsr(eax, ebx);
619      __ blsr(eax, Operand(ebx, ecx, times_4, 10000));
620      __ tzcnt(eax, ebx);
621      __ tzcnt(eax, Operand(ebx, ecx, times_4, 10000));
622    }
623  }
624
625  // LZCNT instructions
626  {
627    if (CpuFeatures::IsSupported(LZCNT)) {
628      CpuFeatureScope scope(&assm, LZCNT);
629      __ lzcnt(eax, ebx);
630      __ lzcnt(eax, Operand(ebx, ecx, times_4, 10000));
631    }
632  }
633
634  // POPCNT instructions
635  {
636    if (CpuFeatures::IsSupported(POPCNT)) {
637      CpuFeatureScope scope(&assm, POPCNT);
638      __ popcnt(eax, ebx);
639      __ popcnt(eax, Operand(ebx, ecx, times_4, 10000));
640    }
641  }
642
643  // BMI2 instructions
644  {
645    if (CpuFeatures::IsSupported(BMI2)) {
646      CpuFeatureScope scope(&assm, BMI2);
647      __ bzhi(eax, ebx, ecx);
648      __ bzhi(eax, Operand(ebx, ecx, times_4, 10000), ebx);
649      __ mulx(eax, ebx, ecx);
650      __ mulx(eax, ebx, Operand(ebx, ecx, times_4, 10000));
651      __ pdep(eax, ebx, ecx);
652      __ pdep(eax, ebx, Operand(ebx, ecx, times_4, 10000));
653      __ pext(eax, ebx, ecx);
654      __ pext(eax, ebx, Operand(ebx, ecx, times_4, 10000));
655      __ sarx(eax, ebx, ecx);
656      __ sarx(eax, Operand(ebx, ecx, times_4, 10000), ebx);
657      __ shlx(eax, ebx, ecx);
658      __ shlx(eax, Operand(ebx, ecx, times_4, 10000), ebx);
659      __ shrx(eax, ebx, ecx);
660      __ shrx(eax, Operand(ebx, ecx, times_4, 10000), ebx);
661      __ rorx(eax, ebx, 31);
662      __ rorx(eax, Operand(ebx, ecx, times_4, 10000), 31);
663    }
664  }
665
666  // xchg.
667  {
668    __ xchg_b(eax, Operand(eax, 8));
669    __ xchg_w(eax, Operand(ebx, 8));
670    __ xchg(eax, eax);
671    __ xchg(eax, ebx);
672    __ xchg(ebx, ebx);
673    __ xchg(ebx, Operand(esp, 12));
674  }
675
676  // cmpxchg.
677  {
678    __ cmpxchg_b(Operand(esp, 12), eax);
679    __ cmpxchg_w(Operand(ebx, ecx, times_4, 10000), eax);
680    __ cmpxchg(Operand(ebx, ecx, times_4, 10000), eax);
681  }
682
683  // lock prefix.
684  {
685    __ lock();
686    __ cmpxchg(Operand(esp, 12), ebx);
687
688    __ lock();
689    __ xchg_w(eax, Operand(ecx, 8));
690  }
691
692  // Nop instructions
693  for (int i = 0; i < 16; i++) {
694    __ Nop(i);
695  }
696
697  __ ret(0);
698
699  CodeDesc desc;
700  assm.GetCode(&desc);
701  Handle<Code> code = isolate->factory()->NewCode(
702      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
703  USE(code);
704#ifdef OBJECT_PRINT
705  OFStream os(stdout);
706  code->Print(os);
707  byte* begin = code->instruction_start();
708  byte* end = begin + code->instruction_size();
709  disasm::Disassembler::Disassemble(stdout, begin, end);
710#endif
711}
712
713#undef __
714