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