13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdlib.h>
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/debug/debug.h"
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disasm.h"
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disassembler.h"
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ia32/frames-ia32.h"
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ic/ic.h"
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h"
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockusing namespace v8::internal;
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define __ assm.
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void DummyStaticFunction(Object* result) {
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(DisasmIa320) {
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CcTest::InitializeVM();
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = CcTest::i_isolate();
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  v8::internal::byte buffer[4096];
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Assembler assm(isolate, buffer, sizeof buffer);
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  DummyStaticFunction(NULL);  // just bloody use it (DELETE; debugging)
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Short immediate instructions
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ adc(eax, 12345678);
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ add(eax, Immediate(12345678));
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ or_(eax, 12345678);
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ sub(eax, Immediate(12345678));
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ xor_(eax, 12345678);
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ and_(eax, 12345678);
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> foo = isolate->factory()->NewFixedArray(10, TENURED);
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(eax, foo);
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ---- This one caused crash
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov(ebx,  Operand(esp, ecx, times_2, 0));  // [esp+ecx*4]
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ---- All instructions that I can think of
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ add(edx, ebx);
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edx, Operand(12, RelocInfo::NONE32));
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(ebx, 0));
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(ebx, 16));
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(ebx, 1999));
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edx, Operand(ebx, -4));
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edx, Operand(ebx, -1999));
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(esp, 0));
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(esp, 16));
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(esp, 1999));
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edx, Operand(esp, -4));
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edx, Operand(esp, -1999));
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ nop();
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(esi, Operand(ecx, times_4, 0));
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(esi, Operand(ecx, times_4, 24));
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(esi, Operand(ecx, times_4, -4));
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(esi, Operand(ecx, times_4, -1999));
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edi, Operand(ebp, ecx, times_4, 0));
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edi, Operand(ebp, ecx, times_4, 12));
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edi, Operand(ebp, ecx, times_4, -8));
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ add(edi, Operand(ebp, ecx, times_4, -3999));
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(Operand(ebp, ecx, times_4, 12), Immediate(12));
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ add(ebx, Immediate(12));
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ adc(ecx, 12);
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ adc(ecx, 1000);
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ and_(edx, 3);
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ and_(edx, Operand(esp, 4));
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(edx, 3);
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(edx, Operand(esp, 4));
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(Operand(ebp, ecx, times_4, 0), Immediate(1000));
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> foo2 = isolate->factory()->NewFixedArray(10, TENURED);
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(ebx, foo2);
109d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  __ cmpb(ebx, Operand(ebp, ecx, times_2, 0));
110d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  __ cmpb(Operand(ebp, ecx, times_2, 0), ebx);
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ or_(edx, 3);
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ xor_(edx, 3);
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ cpuid();
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ movsx_b(edx, ecx);
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ movsx_w(edx, ecx);
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ movzx_b(edx, ecx);
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ movzx_w(edx, ecx);
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ imul(edx, ecx);
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ shld(edx, ecx);
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ shrd(edx, ecx);
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ bts(edx, ecx);
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ bts(Operand(ebx, ecx, times_4, 0), ecx);
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ pushad();
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ popad();
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ pushfd();
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ popfd();
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Immediate(12));
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Immediate(23456));
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(ecx);
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(esi);
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Operand(ebx, ecx, times_4, 0));
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Operand(ebx, ecx, times_4, 0));
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Operand(ebx, ecx, times_4, 10000));
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ pop(edx);
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ pop(eax);
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ pop(Operand(ebx, ecx, times_4, 0));
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(edx, Operand(esp, 16));
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ add(edx, ecx);
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ mov_b(edx, ecx);
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ mov_b(ecx, 6);
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov_b(Operand(ebx, ecx, times_4, 10000), 6);
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov_b(Operand(esp, 16), edx);
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov_w(edx, Operand(esp, 16));
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov_w(Operand(esp, 16), edx);
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ movsx_w(edx, Operand(esp, 12));
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ movsx_b(edx, Operand(esp, 12));
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ movzx_w(edx, Operand(esp, 12));
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ movzx_b(edx, Operand(esp, 12));
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov(edx, 1234567);
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov(edx, Operand(esp, 12));
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov(Operand(ebx, ecx, times_4, 10000), Immediate(12345));
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mov(Operand(ebx, ecx, times_4, 10000), edx);
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ dec_b(edx);
1640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  __ dec_b(Operand(eax, 10));
1650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  __ dec_b(Operand(ebx, ecx, times_4, 10000));
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ dec(edx);
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cdq();
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ idiv(edx);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ idiv(Operand(edx, ecx, times_1, 1));
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ idiv(Operand(esp, 12));
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ div(edx);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ div(Operand(edx, ecx, times_1, 1));
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ div(Operand(esp, 12));
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ mul(edx);
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ neg(edx);
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ not_(edx);
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ test(Operand(ebx, ecx, times_4, 10000), Immediate(123456));
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ imul(edx, Operand(ebx, ecx, times_4, 10000));
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ imul(edx, ecx, 12);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ imul(edx, Operand(edx, eax, times_2, 42), 8);
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ imul(edx, ecx, 1000);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ imul(edx, Operand(ebx, ecx, times_4, 1), 9000);
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ inc(edx);
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ inc(Operand(ebx, ecx, times_4, 10000));
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ push(Operand(ebx, ecx, times_4, 10000));
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ pop(Operand(ebx, ecx, times_4, 10000));
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ call(Operand(ebx, ecx, times_4, 10000));
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ jmp(Operand(ebx, ecx, times_4, 10000));
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ lea(edx, Operand(ebx, ecx, times_4, 10000));
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ or_(edx, 12345);
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ or_(edx, Operand(ebx, ecx, times_4, 10000));
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ rcl(edx, 1);
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ rcl(edx, 7);
202756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  __ rcr(edx, 1);
203756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  __ rcr(edx, 7);
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  __ ror(edx, 1);
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  __ ror(edx, 6);
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  __ ror_cl(edx);
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  __ ror(Operand(ebx, ecx, times_4, 10000), 1);
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  __ ror(Operand(ebx, ecx, times_4, 10000), 6);
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  __ ror_cl(Operand(ebx, ecx, times_4, 10000));
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ sar(edx, 1);
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ sar(edx, 6);
212d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  __ sar_cl(edx);
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ sar(Operand(ebx, ecx, times_4, 10000), 1);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ sar(Operand(ebx, ecx, times_4, 10000), 6);
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ sar_cl(Operand(ebx, ecx, times_4, 10000));
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ sbb(edx, Operand(ebx, ecx, times_4, 10000));
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ shld(edx, Operand(ebx, ecx, times_4, 10000));
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ shl(edx, 1);
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ shl(edx, 6);
220d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  __ shl_cl(edx);
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ shl(Operand(ebx, ecx, times_4, 10000), 1);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ shl(Operand(ebx, ecx, times_4, 10000), 6);
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ shl_cl(Operand(ebx, ecx, times_4, 10000));
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ shrd(edx, Operand(ebx, ecx, times_4, 10000));
225d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  __ shr(edx, 1);
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ shr(edx, 7);
227d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  __ shr_cl(edx);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ shr(Operand(ebx, ecx, times_4, 10000), 1);
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ shr(Operand(ebx, ecx, times_4, 10000), 6);
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ shr_cl(Operand(ebx, ecx, times_4, 10000));
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Immediates
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ adc(edx, 12345);
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ add(ebx, Immediate(12));
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ add(Operand(edx, ecx, times_4, 10000), Immediate(12));
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ and_(ebx, 12345);
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(ebx, 12345);
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ cmp(ebx, Immediate(12));
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ cmp(Operand(edx, ecx, times_4, 10000), Immediate(12));
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ cmpb(eax, 100);
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ or_(ebx, 12345);
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ sub(ebx, Immediate(12));
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ sub(Operand(edx, ecx, times_4, 10000), Immediate(12));
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ xor_(ebx, 12345);
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ imul(edx, ecx, 12);
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ imul(edx, ecx, 1000);
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  __ cld();
258e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  __ rep_movs();
2596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  __ rep_stos();
260f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  __ stos();
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ sub(edx, Operand(ebx, ecx, times_4, 10000));
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  __ sub(edx, ebx);
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ test(edx, Immediate(12345));
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ test(edx, Operand(ebx, ecx, times_8, 10000));
2677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  __ test(Operand(esi, edi, times_1, -20000000), Immediate(300000000));
2687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  __ test_b(edx, Operand(ecx, ebx, times_2, 1000));
2697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  __ test_b(Operand(eax, -20), 0x9A);
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ xor_(edx, 12345);
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ xor_(edx, Operand(ebx, ecx, times_8, 10000));
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ bts(Operand(ebx, ecx, times_8, 10000), edx);
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ hlt();
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ int3();
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ ret(0);
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ ret(8);
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Calls
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Label L1, L2;
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ bind(&L1);
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ call(&L1);
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ call(&L2);
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ bind(&L2);
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ call(Operand(ebx, ecx, times_4, 10000));
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> ic(LoadIC::initialize_stub(isolate, NOT_INSIDE_TYPEOF));
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ call(ic, RelocInfo::CODE_TARGET);
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ call(FUNCTION_ADDR(DummyStaticFunction), RelocInfo::RUNTIME_ENTRY);
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ jmp(&L1);
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ jmp(Operand(ebx, ecx, times_4, 10000));
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ExternalReference after_break_target =
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ExternalReference::debug_after_break_target_address(isolate);
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ jmp(Operand::StaticVariable(after_break_target));
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ jmp(ic, RelocInfo::CODE_TARGET);
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Label Ljcc;
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // long jumps
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(overflow, &Ljcc);
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(no_overflow, &Ljcc);
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(below, &Ljcc);
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(above_equal, &Ljcc);
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(equal, &Ljcc);
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(not_equal, &Ljcc);
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(below_equal, &Ljcc);
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(above, &Ljcc);
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(sign, &Ljcc);
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(not_sign, &Ljcc);
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(parity_even, &Ljcc);
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(parity_odd, &Ljcc);
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(less, &Ljcc);
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(greater_equal, &Ljcc);
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(less_equal, &Ljcc);
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(greater, &Ljcc);
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ bind(&Ljcc);
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // short jumps
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(overflow, &Ljcc);
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(no_overflow, &Ljcc);
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(below, &Ljcc);
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(above_equal, &Ljcc);
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(equal, &Ljcc);
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(not_equal, &Ljcc);
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(below_equal, &Ljcc);
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(above, &Ljcc);
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(sign, &Ljcc);
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(not_sign, &Ljcc);
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(parity_even, &Ljcc);
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(parity_odd, &Ljcc);
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(less, &Ljcc);
341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(greater_equal, &Ljcc);
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(less_equal, &Ljcc);
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ j(greater, &Ljcc);
344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 0xD9 instructions
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  __ fld(1);
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fld1();
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fldz();
3510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  __ fldpi();
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fabs();
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fchs();
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fprem();
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fprem1();
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fincstp();
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ ftst();
358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fxch(3);
359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fld_s(Operand(ebx, ecx, times_4, 10000));
360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fstp_s(Operand(ebx, ecx, times_4, 10000));
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ ffree(3);
362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fld_d(Operand(ebx, ecx, times_4, 10000));
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fstp_d(Operand(ebx, ecx, times_4, 10000));
364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fild_s(Operand(ebx, ecx, times_4, 10000));
367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fistp_s(Operand(ebx, ecx, times_4, 10000));
368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fild_d(Operand(ebx, ecx, times_4, 10000));
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fistp_d(Operand(ebx, ecx, times_4, 10000));
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fnstsw_ax();
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fadd(3);
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fsub(3);
374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fmul(3);
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fdiv(3);
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ faddp(3);
378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fsubp(3);
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fmulp(3);
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fdivp(3);
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fcompp();
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ fwait();
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ frndint();
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  __ fninit();
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ nop();
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // SSE instruction
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  {
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Move operation
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movaps(xmm0, xmm1);
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ shufps(xmm0, xmm0, 0x0);
392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ cvtsd2ss(xmm0, xmm1);
393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ cvtsd2ss(xmm0, Operand(ebx, ecx, times_4, 10000));
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // logic operation
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ andps(xmm0, xmm1);
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ andps(xmm0, Operand(ebx, ecx, times_4, 10000));
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ orps(xmm0, xmm1);
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ orps(xmm0, Operand(ebx, ecx, times_4, 10000));
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ xorps(xmm0, xmm1);
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ xorps(xmm0, Operand(ebx, ecx, times_4, 10000));
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Arithmetic operation
404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ addss(xmm1, xmm0);
405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ addss(xmm1, Operand(ebx, ecx, times_4, 10000));
406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ mulss(xmm1, xmm0);
407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ mulss(xmm1, Operand(ebx, ecx, times_4, 10000));
408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ subss(xmm1, xmm0);
409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ subss(xmm1, Operand(ebx, ecx, times_4, 10000));
410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ divss(xmm1, xmm0);
411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ divss(xmm1, Operand(ebx, ecx, times_4, 10000));
412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ maxss(xmm1, xmm0);
413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ maxss(xmm1, Operand(ebx, ecx, times_4, 10000));
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ minss(xmm1, xmm0);
415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ minss(xmm1, Operand(ebx, ecx, times_4, 10000));
416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ sqrtss(xmm1, xmm0);
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ sqrtss(xmm1, Operand(ebx, ecx, times_4, 10000));
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ addps(xmm1, xmm0);
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ addps(xmm1, Operand(ebx, ecx, times_4, 10000));
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ subps(xmm1, xmm0);
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ subps(xmm1, Operand(ebx, ecx, times_4, 10000));
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ mulps(xmm1, xmm0);
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ mulps(xmm1, Operand(ebx, ecx, times_4, 10000));
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ divps(xmm1, xmm0);
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ divps(xmm1, Operand(ebx, ecx, times_4, 10000));
426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ ucomiss(xmm0, xmm1);
428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ ucomiss(xmm0, Operand(ebx, ecx, times_4, 10000));
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cvttss2si(edx, Operand(ebx, ecx, times_4, 10000));
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cvtsi2sd(xmm1, Operand(ebx, ecx, times_4, 10000));
433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ cvtss2sd(xmm1, Operand(ebx, ecx, times_4, 10000));
434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ cvtss2sd(xmm1, xmm0);
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movsd(xmm1, Operand(ebx, ecx, times_4, 10000));
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movsd(Operand(ebx, ecx, times_4, 10000), xmm1);
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // 128 bit move instructions.
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movdqa(xmm0, Operand(ebx, ecx, times_4, 10000));
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movdqa(Operand(ebx, ecx, times_4, 10000), xmm0);
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movdqu(xmm0, Operand(ebx, ecx, times_4, 10000));
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ movdqu(Operand(ebx, ecx, times_4, 10000), xmm0);
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ addsd(xmm1, xmm0);
444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ addsd(xmm1, Operand(ebx, ecx, times_4, 10000));
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ mulsd(xmm1, xmm0);
446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ mulsd(xmm1, Operand(ebx, ecx, times_4, 10000));
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ subsd(xmm1, xmm0);
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ subsd(xmm1, Operand(ebx, ecx, times_4, 10000));
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ divsd(xmm1, xmm0);
450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    __ divsd(xmm1, Operand(ebx, ecx, times_4, 10000));
451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ minsd(xmm1, xmm0);
452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ minsd(xmm1, Operand(ebx, ecx, times_4, 10000));
453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ maxsd(xmm1, xmm0);
454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ maxsd(xmm1, Operand(ebx, ecx, times_4, 10000));
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ ucomisd(xmm0, xmm1);
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmpltsd(xmm0, xmm1);
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ andpd(xmm0, xmm1);
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ psllq(xmm0, 17);
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ psllq(xmm0, xmm1);
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ psrlq(xmm0, 17);
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ psrlq(xmm0, xmm1);
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ por(xmm0, xmm1);
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ pcmpeqd(xmm1, xmm0);
466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ punpckldq(xmm1, xmm6);
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    __ punpckhdq(xmm7, xmm5);
4693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
4703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // cmov.
4720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  {
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(overflow, eax, Operand(eax, 0));
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(no_overflow, eax, Operand(eax, 1));
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(below, eax, Operand(eax, 2));
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(above_equal, eax, Operand(eax, 3));
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(equal, eax, Operand(ebx, 0));
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(not_equal, eax, Operand(ebx, 1));
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(below_equal, eax, Operand(ebx, 2));
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(above, eax, Operand(ebx, 3));
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(sign, eax, Operand(ecx, 0));
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(not_sign, eax, Operand(ecx, 1));
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(parity_even, eax, Operand(ecx, 2));
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(parity_odd, eax, Operand(ecx, 3));
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(less, eax, Operand(edx, 0));
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(greater_equal, eax, Operand(edx, 1));
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(less_equal, eax, Operand(edx, 2));
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ cmov(greater, eax, Operand(edx, 3));
4890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
4900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
4911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  {
4928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    if (CpuFeatures::IsSupported(SSE4_1)) {
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CpuFeatureScope scope(&assm, SSE4_1);
4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      __ pextrd(eax, xmm0, 1);
4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      __ pinsrd(xmm1, eax, 0);
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      __ extractps(eax, xmm1, 0);
4971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
4981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
4991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // AVX instruction
501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (CpuFeatures::IsSupported(AVX)) {
503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CpuFeatureScope scope(&assm, AVX);
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vaddsd(xmm0, xmm1, xmm2);
505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vaddsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vmulsd(xmm0, xmm1, xmm2);
507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vmulsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vsubsd(xmm0, xmm1, xmm2);
509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vsubsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vdivsd(xmm0, xmm1, xmm2);
511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vdivsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vminsd(xmm0, xmm1, xmm2);
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vminsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vmaxsd(xmm0, xmm1, xmm2);
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vmaxsd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vaddss(xmm0, xmm1, xmm2);
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vaddss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vmulss(xmm0, xmm1, xmm2);
520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vmulss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vsubss(xmm0, xmm1, xmm2);
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vsubss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vdivss(xmm0, xmm1, xmm2);
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vdivss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vminss(xmm0, xmm1, xmm2);
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vminss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vmaxss(xmm0, xmm1, xmm2);
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vmaxss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vandps(xmm0, xmm1, xmm2);
531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vandps(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vxorps(xmm0, xmm1, xmm2);
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vxorps(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vandpd(xmm0, xmm1, xmm2);
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vandpd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vxorpd(xmm0, xmm1, xmm2);
538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ vxorpd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // FMA3 instruction
543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (CpuFeatures::IsSupported(FMA3)) {
545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CpuFeatureScope scope(&assm, FMA3);
546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd132sd(xmm0, xmm1, xmm2);
547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd213sd(xmm0, xmm1, xmm2);
549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd231sd(xmm0, xmm1, xmm2);
551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub132sd(xmm0, xmm1, xmm2);
554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub213sd(xmm0, xmm1, xmm2);
556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub231sd(xmm0, xmm1, xmm2);
558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd132sd(xmm0, xmm1, xmm2);
561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd213sd(xmm0, xmm1, xmm2);
563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd231sd(xmm0, xmm1, xmm2);
565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub132sd(xmm0, xmm1, xmm2);
568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub132sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub213sd(xmm0, xmm1, xmm2);
570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub213sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub231sd(xmm0, xmm1, xmm2);
572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub231sd(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd132ss(xmm0, xmm1, xmm2);
575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd213ss(xmm0, xmm1, xmm2);
577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd231ss(xmm0, xmm1, xmm2);
579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmadd231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub132ss(xmm0, xmm1, xmm2);
582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub213ss(xmm0, xmm1, xmm2);
584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub231ss(xmm0, xmm1, xmm2);
586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfmsub231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd132ss(xmm0, xmm1, xmm2);
589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd213ss(xmm0, xmm1, xmm2);
591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd231ss(xmm0, xmm1, xmm2);
593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmadd231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub132ss(xmm0, xmm1, xmm2);
596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub132ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub213ss(xmm0, xmm1, xmm2);
598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub213ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub231ss(xmm0, xmm1, xmm2);
600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      __ vfnmsub231ss(xmm0, xmm1, Operand(ebx, ecx, times_4, 10000));
601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // BMI1 instructions
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (CpuFeatures::IsSupported(BMI1)) {
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatureScope scope(&assm, BMI1);
608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ andn(eax, ebx, ecx);
609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ andn(eax, ebx, Operand(ebx, ecx, times_4, 10000));
610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ bextr(eax, ebx, ecx);
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ bextr(eax, Operand(ebx, ecx, times_4, 10000), ebx);
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ blsi(eax, ebx);
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ blsi(eax, Operand(ebx, ecx, times_4, 10000));
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ blsmsk(eax, ebx);
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ blsmsk(eax, Operand(ebx, ecx, times_4, 10000));
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ blsr(eax, ebx);
617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ blsr(eax, Operand(ebx, ecx, times_4, 10000));
618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ tzcnt(eax, ebx);
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ tzcnt(eax, Operand(ebx, ecx, times_4, 10000));
620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // LZCNT instructions
624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (CpuFeatures::IsSupported(LZCNT)) {
626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatureScope scope(&assm, LZCNT);
627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ lzcnt(eax, ebx);
628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ lzcnt(eax, Operand(ebx, ecx, times_4, 10000));
629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // POPCNT instructions
633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (CpuFeatures::IsSupported(POPCNT)) {
635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatureScope scope(&assm, POPCNT);
636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ popcnt(eax, ebx);
637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ popcnt(eax, Operand(ebx, ecx, times_4, 10000));
638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // BMI2 instructions
642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (CpuFeatures::IsSupported(BMI2)) {
644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatureScope scope(&assm, BMI2);
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ bzhi(eax, ebx, ecx);
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ bzhi(eax, Operand(ebx, ecx, times_4, 10000), ebx);
647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ mulx(eax, ebx, ecx);
648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ mulx(eax, ebx, Operand(ebx, ecx, times_4, 10000));
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ pdep(eax, ebx, ecx);
650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ pdep(eax, ebx, Operand(ebx, ecx, times_4, 10000));
651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ pext(eax, ebx, ecx);
652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ pext(eax, ebx, Operand(ebx, ecx, times_4, 10000));
653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ sarx(eax, ebx, ecx);
654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ sarx(eax, Operand(ebx, ecx, times_4, 10000), ebx);
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ shlx(eax, ebx, ecx);
656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ shlx(eax, Operand(ebx, ecx, times_4, 10000), ebx);
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ shrx(eax, ebx, ecx);
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ shrx(eax, Operand(ebx, ecx, times_4, 10000), ebx);
659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ rorx(eax, ebx, 31);
660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __ rorx(eax, Operand(ebx, ecx, times_4, 10000), 31);
661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // xchg.
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ xchg(eax, eax);
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ xchg(eax, ebx);
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ xchg(ebx, ebx);
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    __ xchg(ebx, Operand(esp, 12));
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Nop instructions
6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < 16; i++) {
6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    __ Nop(i);
6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  __ ret(0);
678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CodeDesc desc;
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assm.GetCode(&desc);
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Code> code = isolate->factory()->NewCode(
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(code);
6849fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block#ifdef OBJECT_PRINT
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OFStream os(stdout);
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->Print(os);
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  byte* begin = code->instruction_start();
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  byte* end = begin + code->instruction_size();
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  disasm::Disassembler::Disassemble(stdout, begin, end);
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef __
694