143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Copyright (c) 1994-2006 Sun Microsystems Inc. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All Rights Reserved. 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// are met: 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Redistributions of source code must retain the above copyright notice, 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// this list of conditions and the following disclaimer. 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Redistribution in binary form must reproduce the above copyright 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer in the 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// documentation and/or other materials provided with the 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// distribution. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Neither the name of Sun Microsystems or the names of contributors may 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// be used to endorse or promote products derived from this software without 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// specific prior written permission. 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THE POSSIBILITY OF SUCH DAMAGE. 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The original source code covered by the above license above has been modified 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// significantly by Google Inc. 3556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32 409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 4121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org#include "src/base/bits.h" 425de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/cpu.h" 43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disassembler.h" 44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 45196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h" 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 4871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of CpuFeatures 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgvoid CpuFeatures::ProbeImpl(bool cross_compile) { 545de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::CPU cpu; 553c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org CHECK(cpu.has_sse2()); // SSE2 support is mandatory. 561e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org CHECK(cpu.has_cmov()); // CMOV support is mandatory. 571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 58874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org // Only use statically determined features for cross compile (snapshot). 59874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cross_compile) return; 601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 61874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1; 62874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3; 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgvoid CpuFeatures::PrintTarget() { } 67874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgvoid CpuFeatures::PrintFeatures() { } 68874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 69874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 717276f14ca716596e0a0d17539516370c1f453847kasper.lund// Implementation of Displacement 727276f14ca716596e0a0d17539516370c1f453847kasper.lund 737276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid Displacement::init(Label* L, Type type) { 74e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!L->is_bound()); 757276f14ca716596e0a0d17539516370c1f453847kasper.lund int next = 0; 767276f14ca716596e0a0d17539516370c1f453847kasper.lund if (L->is_linked()) { 777276f14ca716596e0a0d17539516370c1f453847kasper.lund next = L->pos(); 78e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(next > 0); // Displacements must be at positions > 0 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 807276f14ca716596e0a0d17539516370c1f453847kasper.lund // Ensure that we _never_ overflow the next field. 81e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(NextField::is_valid(Assembler::kMaximalBufferSize)); 827276f14ca716596e0a0d17539516370c1f453847kasper.lund data_ = NextField::encode(next) | TypeField::encode(type); 837276f14ca716596e0a0d17539516370c1f453847kasper.lund} 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of RelocInfo 8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst int RelocInfo::kApplyMask = 91236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY | 92c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE | 93e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1 << RelocInfo::DEBUG_BREAK_SLOT | 1 << RelocInfo::CODE_AGE_SEQUENCE; 9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 969dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.combool RelocInfo::IsCodedSpecially() { 979dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // The deserializer needs to know whether a pointer is specially coded. Being 989dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // specially coded on IA32 means that it is a relative address, as used by 999dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // branch instructions. These are also the ones that need changing when a 1009dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // code object moves. 1019dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com return (1 << rmode_) & kApplyMask; 1029dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 1039dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1049dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 105bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool RelocInfo::IsInConstantPool() { 106bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return false; 107bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 108bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 109bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 110245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) { 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Patch the code at the current address with the supplied instructions. 11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < instruction_count; i++) { 11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *(pc_ + i) = *(instructions + i); 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1154af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1164af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Indicate that code has changed. 1175de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CpuFeatures::FlushICache(pc_, instruction_count); 11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Patch the code at the current PC with a call to the target address. 12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Additional guard int3 instructions can be added if required. 123245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Call instruction takes up 5 bytes and int3 takes up one byte. 1254af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org static const int kCallCodeSize = 5; 1264af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org int code_size = kCallCodeSize + guard_bytes; 12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1284af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Create a code patcher. 12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CodePatcher patcher(pc_, code_size); 1304af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1314af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Add a label for checking the size of the code used for returning. 1324af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#ifdef DEBUG 1334af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org Label check_codesize; 1344af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->bind(&check_codesize); 1354af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#endif 1364af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1374af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Patch the code. 13859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org patcher.masm()->call(target, RelocInfo::NONE32); 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1404af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Check that the size of the code generated is as expected. 141e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(kCallCodeSize, 1424af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); 1434af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Add the requested number of int3 instructions after the call. 145e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_GE(guard_bytes, 0); 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < guard_bytes; i++) { 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen patcher.masm()->int3(); 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of Operand 15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 155236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) { 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + disp/r] 15759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) { 15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base] 15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(0, base); 16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (base.is(esp)) set_sib(times_1, esp, base); 16159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) { 16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + disp8] 16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(1, base); 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (base.is(esp)) set_sib(times_1, esp, base); 16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_disp8(disp); 16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + disp/r] 16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(2, base); 16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (base.is(esp)) set_sib(times_1, esp, base); 17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_dispr(disp, rmode); 17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOperand::Operand(Register base, 17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Register index, 17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ScaleFactor scale, 17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int32_t disp, 179236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org RelocInfo::Mode rmode) { 180e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!index.is(esp)); // illegal addressing mode 18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + index*scale + disp/r] 18259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) { 18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + index*scale] 18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(0, esp); 18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_sib(scale, index, base); 18659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) { 18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + index*scale + disp8] 18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(1, esp); 18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_sib(scale, index, base); 19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_disp8(disp); 19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [base + index*scale + disp/r] 19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(2, esp); 19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_sib(scale, index, base); 19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_dispr(disp, rmode); 19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOperand::Operand(Register index, 20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ScaleFactor scale, 20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int32_t disp, 203236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org RelocInfo::Mode rmode) { 204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!index.is(esp)); // illegal addressing mode 20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [index*scale + disp/r] 20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_modrm(0, esp); 20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_sib(scale, index, ebp); 20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_dispr(disp, rmode); 20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Operand::is_reg(Register reg) const { 21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return ((buf_[0] & 0xF8) == 0xC0) // addressing mode is register only. 21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen && ((buf_[0] & 0x07) == reg.code()); // register codes match. 21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 217c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 218c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Operand::is_reg_only() const { 219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return (buf_[0] & 0xF8) == 0xC0; // Addressing mode is register only. 220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 221c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comRegister Operand::reg() const { 224e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_reg_only()); 225c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return Register::from_code(buf_[0] & 0x07); 226c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 227c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 228c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 2305c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Implementation of Assembler. 23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Emit a single byte. Must always be inlined. 23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define EMIT(x) \ 23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *pc_++ = (x) 23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef GENERATED_CODE_COVERAGE 23865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void InitCoverageLog(); 23965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif 24065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2418e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 2428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : AssemblerBase(isolate, buffer, buffer_size), 243e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org positions_recorder_(this) { 24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Clear the buffer in debug mode unless it was provided by the 24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // caller in which case we can't be sure it's okay to overwrite 24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // existing code in it; see CodePatcher::CodePatcher(...). 24765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef DEBUG 24865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (own_buffer_) { 2498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org memset(buffer_, 0xCC, buffer_size_); // int3 25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 25165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif 25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2538e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef GENERATED_CODE_COVERAGE 25665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org InitCoverageLog(); 25765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif 25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::GetCode(CodeDesc* desc) { 2625c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Finalize code (at this point overflow() may be true, but the gap ensures 2635c838251403b0be9a882540f1922577abba4c872ager@chromium.org // that we are still not overlapping instructions and relocation info). 264e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap. 265f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up code descriptor. 26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc->buffer = buffer_; 26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc->buffer_size = buffer_size_; 26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc->instr_size = pc_offset(); 26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 27037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com desc->origin = this; 27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::Align(int m) { 27521d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org DCHECK(base::bits::IsPowerOfTwo32(m)); 27664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org int mask = m - 1; 27764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org int addr = pc_offset(); 27864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Nop((m - (addr & mask)) & mask); 27964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 28064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 28164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 28264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool Assembler::IsNop(Address addr) { 28364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Address a = addr; 28464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org while (*a == 0x66) a++; 28564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (*a == 0x90) return true; 28664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (a[0] == 0xf && a[1] == 0x1f) return true; 28764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return false; 28864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 28964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 29064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 29164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::Nop(int bytes) { 29264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 29364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 29464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // Multi byte nops from http://support.amd.com/us/Processor_TechDocs/40546.pdf 29564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org while (bytes > 0) { 29664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org switch (bytes) { 29764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 2: 29864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 29964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 1: 30064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x90); 30164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 30264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 3: 30364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xf); 30464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x1f); 30564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 30664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 30764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 4: 30864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xf); 30964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x1f); 31064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x40); 31164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 31264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 31364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 6: 31464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 31564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 5: 31664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xf); 31764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x1f); 31864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x44); 31964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 32064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 32164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 32264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 7: 32364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xf); 32464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x1f); 32564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x80); 32664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 32764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 32864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 32964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 33064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 33164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org default: 33264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 11: 33364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 33464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org bytes--; 33564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 10: 33664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 33764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org bytes--; 33864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 9: 33964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 34064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org bytes--; 34164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 8: 34264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xf); 34364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x1f); 34464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x84); 34564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 34664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 34764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 34864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 34964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0); 35064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org bytes -= 8; 35164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org } 35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3565ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgvoid Assembler::CodeTargetAlign() { 3575ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org Align(16); // Preferred alignment of jump targets on ia32. 3585ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 3595ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 3605ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cpuid() { 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xA2); 36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pushad() { 36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x60); 37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::popad() { 37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x61); 37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pushfd() { 38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x9C); 38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::popfd() { 38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x9D); 38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::push(const Immediate& x) { 39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (x.is_int8()) { 39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x6a); 39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(x.x_); 39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x68); 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(x); 40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 404a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::push_imm32(int32_t imm32) { 405a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 406a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0x68); 407a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(imm32); 408a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 409a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 410a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::push(Register src) { 41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x50 | src.code()); 41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::push(const Operand& src) { 41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFF); 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(esi, src); 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pop(Register dst) { 425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reloc_info_writer.last_pc() != NULL); 42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x58 | dst.code()); 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pop(const Operand& dst) { 43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x8F); 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, dst); 43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 438a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::enter(const Immediate& size) { 439a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 440a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0xC8); 441a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org emit_w(size); 442a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0); 443a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 444a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 445a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 446a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::leave() { 447a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 448a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0xC9); 449a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 450a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 451a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_b(Register dst, const Operand& src) { 45356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org CHECK(dst.is_byte_register()); 45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x8A); 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_b(const Operand& dst, int8_t imm8) { 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC6); 46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, dst); 46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm8); 46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_b(const Operand& dst, Register src) { 46956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org CHECK(src.is_byte_register()); 47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x88); 47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(src, dst); 47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_w(Register dst, const Operand& src) { 47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x66); 47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x8B); 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_w(const Operand& dst, Register src) { 48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x66); 48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x89); 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(src, dst); 48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 492e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::mov_w(const Operand& dst, int16_t imm16) { 493e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 494e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EMIT(0x66); 495e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EMIT(0xC7); 496e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(eax, dst); 497e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EMIT(static_cast<int8_t>(imm16 & 0xff)); 498e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EMIT(static_cast<int8_t>(imm16 >> 8)); 499e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 500e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 501e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(Register dst, int32_t imm32) { 50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xB8 | dst.code()); 50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(imm32); 50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5093bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.orgvoid Assembler::mov(Register dst, const Immediate& x) { 5103bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org EnsureSpace ensure_space(this); 5113bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org EMIT(0xB8 | dst.code()); 5123bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org emit(x); 5133bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org} 5143bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 5153bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(Register dst, Handle<Object> handle) { 51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xB8 | dst.code()); 51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(handle); 52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(Register dst, const Operand& src) { 52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x8B); 52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5303bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.orgvoid Assembler::mov(Register dst, Register src) { 5313bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org EnsureSpace ensure_space(this); 5323bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org EMIT(0x89); 5333bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org EMIT(0xC0 | src.code() << 3 | dst.code()); 5343bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org} 5353bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 5363bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(const Operand& dst, const Immediate& x) { 53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC7); 54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, dst); 54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(x); 54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(const Operand& dst, Handle<Object> handle) { 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC7); 54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, dst); 54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(handle); 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(const Operand& dst, Register src) { 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x89); 55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(src, dst); 55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsx_b(Register dst, const Operand& src) { 56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xBE); 56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsx_w(Register dst, const Operand& src) { 56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 57043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 57143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xBF); 57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movzx_b(Register dst, const Operand& src) { 57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xB6); 58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movzx_w(Register dst, const Operand& src) { 58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xB7); 58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) { 59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 5945c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: 0f 40 + cc /r. 5954af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org EMIT(0x0F); 5964af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org EMIT(0x40 + cc); 5974af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit_operand(dst, src); 59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 601ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::cld() { 602ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 603ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xFC); 604ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 605ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 606ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 6070c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::rep_movs() { 6080c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EnsureSpace ensure_space(this); 6090c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0xF3); 6100c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0xA5); 6110c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 6120c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 6130c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 614ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::rep_stos() { 615ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 616ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xF3); 617ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xAB); 618ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 619ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 620ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 6219dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comvoid Assembler::stos() { 6229dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com EnsureSpace ensure_space(this); 6239dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com EMIT(0xAB); 6249dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 6259dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 6269dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 6277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvoid Assembler::xchg(Register dst, Register src) { 6287be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EnsureSpace ensure_space(this); 6295c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (src.is(eax) || dst.is(eax)) { // Single-byte encoding. 6307be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EMIT(0x90 | (src.is(eax) ? dst.code() : src.code())); 6317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org } else { 6327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EMIT(0x87); 6337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EMIT(0xC0 | src.code() << 3 | dst.code()); 6347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org } 6357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org} 6367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 6377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::xchg(Register dst, const Operand& src) { 6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EMIT(0x87); 6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(dst, src); 6427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::adc(Register dst, int32_t imm32) { 64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(2, Operand(dst), Immediate(imm32)); 64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::adc(Register dst, const Operand& src) { 65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x13); 65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::add(Register dst, const Operand& src) { 65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x03); 66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 665c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::add(const Operand& dst, Register src) { 666c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com EnsureSpace ensure_space(this); 667c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com EMIT(0x01); 668c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_operand(src, dst); 669c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 670c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 671c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::add(const Operand& dst, const Immediate& x) { 673e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reloc_info_writer.last_pc() != NULL); 67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(0, dst, x); 67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(Register dst, int32_t imm32) { 6802ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org and_(dst, Immediate(imm32)); 6812ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org} 6822ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org 6832ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org 6842ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgvoid Assembler::and_(Register dst, const Immediate& x) { 68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 6862ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org emit_arith(4, Operand(dst), x); 68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(Register dst, const Operand& src) { 69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x23); 69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 69643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(const Operand& dst, const Immediate& x) { 69843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(4, dst, x); 70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(const Operand& dst, Register src) { 70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x21); 7063bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org emit_operand(src, dst); 70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 710a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::cmpb(const Operand& op, int8_t imm8) { 711a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 712c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (op.is_reg(eax)) { 713c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com EMIT(0x3C); 714c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 715c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com EMIT(0x80); 716c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_operand(edi, op); // edi == 7 717c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 718a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(imm8); 719a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 720a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 721a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 722c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::cmpb(const Operand& op, Register reg) { 72356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org CHECK(reg.is_byte_register()); 724b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 725b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EMIT(0x38); 726c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_operand(reg, op); 727b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 728b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 729b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 730c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::cmpb(Register reg, const Operand& op) { 73156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org CHECK(reg.is_byte_register()); 732b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 733b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EMIT(0x3A); 734c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_operand(reg, op); 735b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 736b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 737b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 738a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::cmpw(const Operand& op, Immediate imm16) { 739e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(imm16.is_int16()); 740a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 741a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0x66); 742a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0x81); 743a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org emit_operand(edi, op); 744a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org emit_w(imm16); 745a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 746a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 747a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(Register reg, int32_t imm32) { 74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(7, Operand(reg), Immediate(imm32)); 75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(Register reg, Handle<Object> handle) { 75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(7, Operand(reg), Immediate(handle)); 75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(Register reg, const Operand& op) { 76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x3B); 76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(reg, op); 76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(const Operand& op, const Immediate& imm) { 76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(7, op, imm); 77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7734af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgvoid Assembler::cmp(const Operand& op, Handle<Object> handle) { 7744af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org EnsureSpace ensure_space(this); 7754af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit_arith(7, op, Immediate(handle)); 7764af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org} 7774af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 7784af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 77937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid Assembler::cmpb_al(const Operand& op) { 780a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 78137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com EMIT(0x38); // CMP r/m8, r8 78237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com emit_operand(eax, op); // eax has same code as register al. 783a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 784a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 78537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 78637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid Assembler::cmpw_ax(const Operand& op) { 787a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 78837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com EMIT(0x66); 78937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com EMIT(0x39); // CMP r/m16, r16 79037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com emit_operand(eax, op); // eax has same code as register ax. 791a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 792a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 793a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::dec_b(Register dst) { 79556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org CHECK(dst.is_byte_register()); 79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFE); 79843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC8 | dst.code()); 79943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 80143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8024a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgvoid Assembler::dec_b(const Operand& dst) { 8034a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org EnsureSpace ensure_space(this); 8044a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org EMIT(0xFE); 8054a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org emit_operand(ecx, dst); 8064a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org} 8074a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 8084a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 80943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::dec(Register dst) { 81043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 81143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x48 | dst.code()); 81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::dec(const Operand& dst) { 81643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFF); 81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ecx, dst); 81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cdq() { 82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x99); 82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 82643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::idiv(const Operand& src) { 8297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 8307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EMIT(0xF7); 8317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(edi, src); 8327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 8337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::div(const Operand& src) { 83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF7); 8387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(esi, src); 83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8422abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.orgvoid Assembler::imul(Register reg) { 8432abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org EnsureSpace ensure_space(this); 8442abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org EMIT(0xF7); 8452abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org EMIT(0xE8 | reg.code()); 8462abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 8472abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 8482abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::imul(Register dst, const Operand& src) { 85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xAF); 85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 85643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::imul(Register dst, Register src, int32_t imm32) { 8587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org imul(dst, Operand(src), imm32); 8597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 8607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::imul(Register dst, const Operand& src, int32_t imm32) { 86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (is_int8(imm32)) { 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x6B); 8667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(dst, src); 86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm32); 86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x69); 8707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(dst, src); 87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(imm32); 87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::inc(Register dst) { 87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x40 | dst.code()); 87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::inc(const Operand& dst) { 88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFF); 88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, dst); 88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::lea(Register dst, const Operand& src) { 89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 89143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x8D); 89243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 89643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mul(Register src) { 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF7); 89943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE0 | src.code()); 90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::neg(Register dst) { 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF7); 90643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD8 | dst.code()); 90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::neg(const Operand& dst) { 9117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 9127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EMIT(0xF7); 9137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(ebx, dst); 9147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 9157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 9167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::not_(Register dst) { 91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF7); 92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD0 | dst.code()); 92143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::not_(const Operand& dst) { 9257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 9267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EMIT(0xF7); 9277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(edx, dst); 9287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 9297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 9307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(Register dst, int32_t imm32) { 93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(1, Operand(dst), Immediate(imm32)); 93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(Register dst, const Operand& src) { 93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0B); 94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(const Operand& dst, const Immediate& x) { 94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(1, dst, x); 94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(const Operand& dst, Register src) { 95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x09); 9533bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org emit_operand(src, dst); 95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::rcl(Register dst, uint8_t imm8) { 95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 959e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (imm8 == 1) { 96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD1); 96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD0 | dst.code()); 96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC1); 96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD0 | dst.code()); 96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm8); 96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 97126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvoid Assembler::rcr(Register dst, uint8_t imm8) { 97226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org EnsureSpace ensure_space(this); 973e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 97426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org if (imm8 == 1) { 97526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org EMIT(0xD1); 97626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org EMIT(0xD8 | dst.code()); 97726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } else { 97826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org EMIT(0xC1); 97926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org EMIT(0xD8 | dst.code()); 98026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org EMIT(imm8); 98126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 98226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 98326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 984e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 985e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid Assembler::ror(Register dst, uint8_t imm8) { 986e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EnsureSpace ensure_space(this); 987e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 988e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org if (imm8 == 1) { 989e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(0xD1); 990e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(0xC8 | dst.code()); 991e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } else { 992e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(0xC1); 993e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(0xC8 | dst.code()); 994e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(imm8); 995e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 996e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 997e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 998e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 999e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid Assembler::ror_cl(Register dst) { 1000e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EnsureSpace ensure_space(this); 1001e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(0xD3); 1002e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org EMIT(0xC8 | dst.code()); 1003e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 1004e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 100526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 10067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::sar(const Operand& dst, uint8_t imm8) { 100743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1008e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 100943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (imm8 == 1) { 101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD1); 10117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(edi, dst); 101243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 101343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC1); 10147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(edi, dst); 101543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm8); 101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::sar_cl(const Operand& dst) { 102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD3); 10237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(edi, dst); 102443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 102543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sbb(Register dst, const Operand& src) { 102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x1B); 103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 103243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::shld(Register dst, const Operand& src) { 103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xA5); 103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::shl(const Operand& dst, uint8_t imm8) { 104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1044e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (imm8 == 1) { 104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD1); 10477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(esp, dst); 104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC1); 10507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(esp, dst); 105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm8); 105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::shl_cl(const Operand& dst) { 105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD3); 10597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(esp, dst); 106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::shrd(Register dst, const Operand& src) { 106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xAD); 106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::shr(const Operand& dst, uint8_t imm8) { 107243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1073e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 1074c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (imm8 == 1) { 1075c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org EMIT(0xD1); 10767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(ebp, dst); 1077c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else { 1078c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org EMIT(0xC1); 10797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(ebp, dst); 1080c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org EMIT(imm8); 1081c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::shr_cl(const Operand& dst) { 1086a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 1087c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org EMIT(0xD3); 10887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(ebp, dst); 1089a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1090a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1091a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sub(const Operand& dst, const Immediate& x) { 109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(5, dst, x); 109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sub(Register dst, const Operand& src) { 109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x2B); 110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 110343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sub(const Operand& dst, Register src) { 110643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 110743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x29); 11083bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org emit_operand(src, dst); 110943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 111043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 111143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::test(Register reg, const Immediate& imm) { 11133d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) { 11143d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org test_b(reg, imm.x_); 11153d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return; 11163d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 11173d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org 111843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 11193d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // This is not using emit_arith because test doesn't support 11203d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // sign-extension of 8-bit operands. 11213d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (reg.is(eax)) { 11223d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(0xA9); 112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 11243d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(0xF7); 11253d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(0xC0 | reg.code()); 112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 11273d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org emit(imm); 112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 113043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::test(Register reg, const Operand& op) { 113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x85); 113443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(reg, op); 113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1138b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::test_b(Register reg, const Operand& op) { 113956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org CHECK(reg.is_byte_register()); 1140b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1141b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EMIT(0x84); 1142b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_operand(reg, op); 1143b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1144b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1145b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::test(const Operand& op, const Immediate& imm) { 1147594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (op.is_reg_only()) { 1148594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org test(op.reg(), imm); 1149594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return; 1150594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 11513d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) { 11523d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return test_b(op, imm.x_); 11533d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 115443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 115543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF7); 115643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, op); 115743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(imm); 115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 115943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11613d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.orgvoid Assembler::test_b(Register reg, uint8_t imm8) { 11623d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EnsureSpace ensure_space(this); 11633d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // Only use test against byte for registers that have a byte 11643d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // variant: eax, ebx, ecx, and edx. 11653d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (reg.is(eax)) { 11663d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(0xA8); 11673d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(imm8); 11683d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } else if (reg.is_byte_register()) { 11693d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org emit_arith_b(0xF6, 0xC0, reg, imm8); 11703d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } else { 11713d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(0xF7); 11723d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org EMIT(0xC0 | reg.code()); 11733d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org emit(imm8); 11743d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 11753d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org} 11763d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org 11773d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org 11781af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::test_b(const Operand& op, uint8_t imm8) { 11793d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (op.is_reg_only()) { 11803d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org test_b(op.reg(), imm8); 1181c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return; 1182c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 11831af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EnsureSpace ensure_space(this); 11841af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0xF6); 11851af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org emit_operand(eax, op); 11861af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(imm8); 11871af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org} 11881af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 11891af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 119043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::xor_(Register dst, int32_t imm32) { 119143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 119243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(6, Operand(dst), Immediate(imm32)); 119343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 119543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 119643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::xor_(Register dst, const Operand& src) { 119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x33); 119943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 120043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 120143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 120243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::xor_(const Operand& dst, Register src) { 120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 120543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x31); 1206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_operand(src, dst); 120743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 120843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 120943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 121043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::xor_(const Operand& dst, const Immediate& x) { 121143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 121243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_arith(6, dst, x); 121343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 121443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::bt(const Operand& dst, Register src) { 1217a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnsureSpace ensure_space(this); 1218a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0x0F); 1219a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EMIT(0xA3); 1220a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org emit_operand(src, dst); 1221a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1222a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1223a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 122443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::bts(const Operand& dst, Register src) { 122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xAB); 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(src, dst); 122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1232f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid Assembler::bsr(Register dst, const Operand& src) { 1233f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org EnsureSpace ensure_space(this); 1234f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org EMIT(0x0F); 1235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org EMIT(0xBD); 1236f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org emit_operand(dst, src); 1237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::hlt() { 124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 124243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF4); 124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 124443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::int3() { 124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xCC); 124943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 125043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::nop() { 125343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x90); 125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::ret(int imm16) { 125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1260e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint16(imm16)); 126143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (imm16 == 0) { 126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC3); 126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 126443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC2); 126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm16 & 0xFF); 126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT((imm16 >> 8) & 0xFF); 126743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 126843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 126943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 127043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 127143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Labels refer to positions in the (to be) generated code. 127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// There are bound, linked, and unused labels. 127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Bound labels refer to known positions in the already 127543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// generated code. pos() is the position the label refers to. 127643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 127743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Linked labels refer to unknown positions in the code 127843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// to be generated; pos() is the position of the 32bit 127943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Displacement of the last instruction using the label. 128043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 128143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 128243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::print(Label* L) { 128343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (L->is_unused()) { 128443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("unused label\n"); 128543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (L->is_bound()) { 128643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("bound label to %d\n", L->pos()); 128743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (L->is_linked()) { 128843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Label l = *L; 128943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("unbound label"); 129043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (l.is_linked()) { 129143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Displacement disp = disp_at(&l); 129243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("@ %d ", l.pos()); 129343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen disp.print(); 129443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("\n"); 129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen disp.next(&l); 129643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 129843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("label in inconsistent state (pos = %d)\n", L->pos_); 129943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 130043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 130143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::bind_to(Label* L, int pos) { 130443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= pos && pos <= pc_offset()); // must have a valid binding position 130643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (L->is_linked()) { 130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Displacement disp = disp_at(L); 130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int fixup_pos = L->pos(); 1309a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (disp.type() == Displacement::CODE_RELATIVE) { 1310a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Relative to Code* heap object pointer. 1311a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); 1312a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 1313a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { 1314e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(byte_at(fixup_pos - 1) == 0xE9); // jmp expected 1315a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 13165c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Relative address, relative to point after address. 1317a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int imm32 = pos - (fixup_pos + sizeof(int32_t)); 1318a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org long_at_put(fixup_pos, imm32); 131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen disp.next(L); 132143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 132283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org while (L->is_near_linked()) { 132383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int fixup_pos = L->near_link_pos(); 132483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset_to_next = 132583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); 1326e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset_to_next <= 0); 132783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org // Relative address, relative to point after address. 132883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int disp = pos - fixup_pos - sizeof(int8_t); 13299c741c80bfc8026103e86b46e15e2544095ce67eyangguo@chromium.org CHECK(0 <= disp && disp <= 127); 133083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org set_byte_at(fixup_pos, disp); 133183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (offset_to_next < 0) { 133283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(fixup_pos + offset_to_next, Label::kNear); 133383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else { 133483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->UnuseNear(); 133583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 133683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 133743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen L->bind_to(pos); 133843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 133943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::bind(Label* L) { 134243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1343e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!L->is_bound()); // label can only be bound once 134443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bind_to(L, pc_offset()); 134543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 134643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::call(Label* L) { 1349a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 135043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 135143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (L->is_bound()) { 135243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const int long_size = 5; 135343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int offs = L->pos() - pc_offset(); 1354e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 13555c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1000 #32-bit disp. 135643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE8); 135743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(offs - long_size); 135843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 13595c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1000 #32-bit disp. 136043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE8); 136143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_disp(L, Displacement::OTHER); 136243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 136343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 136443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 136543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1366236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) { 1367a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 136843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1369e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsCodeTarget(rmode)); 137043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE8); 13716e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org if (RelocInfo::IsRuntimeEntry(rmode)) { 13726e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(reinterpret_cast<uint32_t>(entry), rmode); 13736e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } else { 13746e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(entry - (pc_ + sizeof(int32_t)), rmode); 13756e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } 137643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 137743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 137843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1379fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgint Assembler::CallSize(const Operand& adr) { 1380fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org // Call size is 1 (opcode) + adr.len_ (operand). 1381fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org return 1 + adr.len_; 1382fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org} 1383fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 1384fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 138543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::call(const Operand& adr) { 1386a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 138743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 138843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFF); 138943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(edx, adr); 1390fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org} 1391fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 1392fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 1393fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) { 1394fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org return 1 /* EMIT */ + sizeof(uint32_t) /* emit */; 139543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 139643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 139743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13988e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid Assembler::call(Handle<Code> code, 13998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org RelocInfo::Mode rmode, 1400471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId ast_id) { 1401f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 140243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1403e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsCodeTarget(rmode) 1404c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org || rmode == RelocInfo::CODE_AGE_SEQUENCE); 140543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE8); 140632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org emit(code, rmode, ast_id); 140743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 140843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 140943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 141083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid Assembler::jmp(Label* L, Label::Distance distance) { 141143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 141243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (L->is_bound()) { 141343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const int short_size = 2; 141443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const int long_size = 5; 141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int offs = L->pos() - pc_offset(); 1416e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (is_int8(offs - short_size)) { 14185c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1011 #8-bit disp. 141943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xEB); 142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT((offs - short_size) & 0xFF); 142143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 14225c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 142343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE9); 142443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(offs - long_size); 142543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 142683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (distance == Label::kNear) { 142783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org EMIT(0xEB); 142883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit_near_disp(L); 142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 14305c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE9); 143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1437236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { 143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1439e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsCodeTarget(rmode)); 144043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE9); 14416e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org if (RelocInfo::IsRuntimeEntry(rmode)) { 14426e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(reinterpret_cast<uint32_t>(entry), rmode); 14436e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } else { 14446e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(entry - (pc_ + sizeof(int32_t)), rmode); 14456e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } 144643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::jmp(const Operand& adr) { 145043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFF); 145243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(esp, adr); 145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1456236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) { 145743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1458e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsCodeTarget(rmode)); 145943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE9); 146032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org emit(code, rmode); 146143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 146243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 146343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) { 146543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1466e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= cc && static_cast<int>(cc) < 16); 146743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (L->is_bound()) { 146843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const int short_size = 2; 146943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const int long_size = 6; 147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int offs = L->pos() - pc_offset(); 1471e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (is_int8(offs - short_size)) { 147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 0111 tttn #8-bit disp 147443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x70 | cc); 147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT((offs - short_size) & 0xFF); 147643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 147743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 0000 1111 1000 tttn #32-bit disp 147843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 147943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x80 | cc); 148043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(offs - long_size); 148143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 148283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (distance == Label::kNear) { 148383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org EMIT(0x70 | cc); 148483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit_near_disp(L); 148543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 148643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 0000 1111 1000 tttn #32-bit disp 148743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Note: could eliminate cond. jumps to this jump if condition 148843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // is the same however, seems to be rather unlikely case. 148943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 149043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x80 | cc); 149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_disp(L, Displacement::OTHER); 149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 149543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) { 149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 1498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((0 <= cc) && (static_cast<int>(cc) < 16)); 14995c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 150143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x80 | cc); 15026e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org if (RelocInfo::IsRuntimeEntry(rmode)) { 15036e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(reinterpret_cast<uint32_t>(entry), rmode); 15046e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } else { 15056e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(entry - (pc_ + sizeof(int32_t)), rmode); 15066e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } 150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, Handle<Code> code) { 151143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 151243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 0000 1111 1000 tttn #32-bit disp 151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x80 | cc); 151532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org emit(code, RelocInfo::CODE_TARGET); 151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 151843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// FPU instructions. 152043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 152143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld(int i) { 152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 152343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xD9, 0xC0, i); 152443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 152543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1527ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::fstp(int i) { 1528ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 1529ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_farith(0xDD, 0xD8, i); 1530ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 1531ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 1532ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld1() { 153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 153543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 153643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE8); 153743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 153843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1540ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::fldpi() { 1541ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 1542ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xD9); 1543ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xEB); 1544ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 1545ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 1546ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 154743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fldz() { 154843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 154943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 155043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xEE); 155143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 155243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 155343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fldln2() { 1555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 1556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0xD9); 1557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0xED); 1558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 156143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld_s(const Operand& adr) { 156243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 156343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 156443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, adr); 156543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 156643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 156743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 156843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld_d(const Operand& adr) { 156943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 157043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDD); 157143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, adr); 157243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 157343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 157443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 157543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fstp_s(const Operand& adr) { 157643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 157743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 157843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ebx, adr); 157943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 158043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 158232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgvoid Assembler::fst_s(const Operand& adr) { 158332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org EnsureSpace ensure_space(this); 158432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org EMIT(0xD9); 158532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org emit_operand(edx, adr); 158632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org} 158732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 158832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org 158943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fstp_d(const Operand& adr) { 159043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 159143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDD); 159243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ebx, adr); 159343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 159443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 159543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1596ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::fst_d(const Operand& adr) { 1597ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 1598ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xDD); 1599ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_operand(edx, adr); 1600ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 1601ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 1602ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 160343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fild_s(const Operand& adr) { 160443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 160543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDB); 160643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(eax, adr); 160743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 160843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 160943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 161043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fild_d(const Operand& adr) { 161143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 161243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDF); 161343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ebp, adr); 161443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 161543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 161643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 161743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fistp_s(const Operand& adr) { 161843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 161943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDB); 162043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ebx, adr); 162143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 162243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 162343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1624061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgvoid Assembler::fisttp_s(const Operand& adr) { 1625e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE3)); 1626061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org EnsureSpace ensure_space(this); 1627061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org EMIT(0xDB); 1628061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org emit_operand(ecx, adr); 1629061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org} 1630061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 1631061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 16320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::fisttp_d(const Operand& adr) { 1633e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE3)); 16340c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EnsureSpace ensure_space(this); 16350c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0xDD); 16360c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org emit_operand(ecx, adr); 16370c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 16380c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 16390c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 164043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fist_s(const Operand& adr) { 164143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 164243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDB); 164343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(edx, adr); 164443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 164543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 164643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 164743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fistp_d(const Operand& adr) { 164843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 164943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDF); 165043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(edi, adr); 165143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 165343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 165443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fabs() { 165543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 165643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 165743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE1); 165843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 165943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 166043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 166143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fchs() { 166243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 166343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 166443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE0); 166543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 166643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 166743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1668eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::fcos() { 1669eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 1670eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EMIT(0xD9); 1671eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EMIT(0xFF); 1672eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1673eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1674eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1675eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::fsin() { 1676eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 1677eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EMIT(0xD9); 1678eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EMIT(0xFE); 1679eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1680eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1681eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 16821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid Assembler::fptan() { 16831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org EnsureSpace ensure_space(this); 16841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org EMIT(0xD9); 16851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org EMIT(0xF2); 16861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org} 16871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 16881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 1689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fyl2x() { 1690a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 1691a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0xD9); 1692a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0xF1); 1693a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1694a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1695a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 169664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::f2xm1() { 169764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 169864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xD9); 169964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xF0); 170064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 170164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 170264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 170364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fscale() { 170464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 170564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xD9); 170664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xFD); 170764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 170864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 170964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 171064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fninit() { 171164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 171264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xDB); 171364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0xE3); 171464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 171564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 171664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 171743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fadd(int i) { 171843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 171943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDC, 0xC0, i); 172043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 172143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 172243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1723c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid Assembler::fadd_i(int i) { 1724c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org EnsureSpace ensure_space(this); 1725c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org emit_farith(0xD8, 0xC0, i); 1726c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org} 1727c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 1728c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 172943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fsub(int i) { 173043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 173143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDC, 0xE8, i); 173243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 173343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 173443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1735c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid Assembler::fsub_i(int i) { 1736c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org EnsureSpace ensure_space(this); 1737c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org emit_farith(0xD8, 0xE0, i); 1738c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org} 1739c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 1740c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fisub_s(const Operand& adr) { 174243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 174343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDA); 174443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(esp, adr); 174543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 174643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 174743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1748169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgvoid Assembler::fmul_i(int i) { 1749169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org EnsureSpace ensure_space(this); 1750169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org emit_farith(0xD8, 0xC8, i); 1751169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 1752169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1753169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 175443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fmul(int i) { 175543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 175643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDC, 0xC8, i); 175743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 175843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 176043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fdiv(int i) { 176143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 176243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDC, 0xF8, i); 176343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 176443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 176543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1766c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid Assembler::fdiv_i(int i) { 1767c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org EnsureSpace ensure_space(this); 1768c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org emit_farith(0xD8, 0xF0, i); 1769c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org} 1770c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 1771c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 177243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::faddp(int i) { 177343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 177443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDE, 0xC0, i); 177543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 177643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 177743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 177843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fsubp(int i) { 177943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 178043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDE, 0xE8, i); 178143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 178243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 178343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 178443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fsubrp(int i) { 178543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 178643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDE, 0xE0, i); 178743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 178843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 178943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 179043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fmulp(int i) { 179143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 179243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDE, 0xC8, i); 179343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 179443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 179543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 179643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fdivp(int i) { 179743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 179843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDE, 0xF8, i); 179943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 180043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 180143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 180243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fprem() { 180343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 180443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 180543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF8); 180643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 180743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 180843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 180943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fprem1() { 181043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 181143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 181243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF5); 181343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 181443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 181543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 181643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fxch(int i) { 181743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 181843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xD9, 0xC8, i); 181943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 182043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 182143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 182243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fincstp() { 182343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 182443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 182543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF7); 182643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 182743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 182843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 182943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::ffree(int i) { 183043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 183143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDD, 0xC0, i); 183243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 183343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 183443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 183543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::ftst() { 183643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 183743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 183843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE4); 183943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 184043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 184143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 184243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fucomp(int i) { 184343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 184443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_farith(0xDD, 0xE8, i); 184543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 184643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 184743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 184843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fucompp() { 184943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 185043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDA); 185143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE9); 185243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 185343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 185443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomi(int i) { 18563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 18573811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EMIT(0xDB); 18583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EMIT(0xE8 + i); 18593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 18603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 18613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 18623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomip() { 18633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 18643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EMIT(0xDF); 18653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EMIT(0xE9); 18663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 18673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 18683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 186943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fcompp() { 187043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 187143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xDE); 187243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 187343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 187443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 187543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 187643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fnstsw_ax() { 187743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 18785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EMIT(0xDF); 187943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xE0); 188043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 188143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 188243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 188343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fwait() { 188443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 188543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x9B); 188643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 188743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 188843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::frndint() { 189043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 189143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xD9); 189243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xFC); 189343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 189443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 189543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1896061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgvoid Assembler::fnclex() { 1897061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org EnsureSpace ensure_space(this); 1898061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org EMIT(0xDB); 1899061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org EMIT(0xE2); 1900061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org} 1901061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 1902061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sahf() { 190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 190543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x9E); 190643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 190843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19097be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvoid Assembler::setcc(Condition cc, Register reg) { 1910e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reg.is_byte_register()); 19117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EnsureSpace ensure_space(this); 19127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EMIT(0x0F); 19137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EMIT(0x90 | cc); 19147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EMIT(0xC0 | reg.code()); 19157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org} 19167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 19177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 191843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cvttss2si(Register dst, const Operand& src) { 191943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 192043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF3); 192143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 192243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x2C); 192343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 192443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 192543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 192643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 192743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cvttsd2si(Register dst, const Operand& src) { 192843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 192943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); 193043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 193143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x2C); 193243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(dst, src); 193343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 193443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 193543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 193646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid Assembler::cvtsd2si(Register dst, XMMRegister src) { 193746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org EnsureSpace ensure_space(this); 193846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org EMIT(0xF2); 193946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org EMIT(0x0F); 194046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org EMIT(0x2D); 194146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org emit_sse_operand(dst, src); 194246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org} 194346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 194446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 194543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) { 194643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); 194843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 194943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x2A); 195043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(dst, src); 195143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 195243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1954ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { 1955ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 1956ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xF3); 1957ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x0F); 1958ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x5A); 1959ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_sse_operand(dst, src); 1960ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 1961ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 1962ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 19637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { 19647979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EnsureSpace ensure_space(this); 19657979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0xF2); 19667979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0x0F); 19677979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0x5A); 19687979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org emit_sse_operand(dst, src); 19697979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org} 19707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 19717979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 197243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::addsd(XMMRegister dst, XMMRegister src) { 197343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 197443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); 197543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 197643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x58); 197743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(dst, src); 197843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 197943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 198043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19811f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::addsd(XMMRegister dst, const Operand& src) { 19821f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EnsureSpace ensure_space(this); 19831f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EMIT(0xF2); 19841f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EMIT(0x0F); 19851f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EMIT(0x58); 19861f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_sse_operand(dst, src); 19871f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 19881f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 19891f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 199043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mulsd(XMMRegister dst, XMMRegister src) { 199143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 199243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); 199343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 199443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x59); 199543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(dst, src); 199643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 199743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 199843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19991f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::mulsd(XMMRegister dst, const Operand& src) { 20001f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EnsureSpace ensure_space(this); 20011f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EMIT(0xF2); 20021f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EMIT(0x0F); 20031f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EMIT(0x59); 20041f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_sse_operand(dst, src); 20051f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 20061f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 20071f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 200843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::subsd(XMMRegister dst, XMMRegister src) { 200943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 201043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); 201143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 201243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x5C); 201343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(dst, src); 201443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 201543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 201643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2017a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid Assembler::subsd(XMMRegister dst, const Operand& src) { 2018a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org EnsureSpace ensure_space(this); 2019a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org EMIT(0xF2); 2020a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org EMIT(0x0F); 2021a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org EMIT(0x5C); 2022a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit_sse_operand(dst, src); 2023a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 2024a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2025a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 202643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::divsd(XMMRegister dst, XMMRegister src) { 202743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 202843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); 202943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 203043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x5E); 203143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(dst, src); 203243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 203343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 203443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2035846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.orgvoid Assembler::xorpd(XMMRegister dst, XMMRegister src) { 2036846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org EnsureSpace ensure_space(this); 2037846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org EMIT(0x66); 2038846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org EMIT(0x0F); 2039846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org EMIT(0x57); 2040846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org emit_sse_operand(dst, src); 2041846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org} 2042846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 2043846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 2044af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::andps(XMMRegister dst, const Operand& src) { 2045057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EnsureSpace ensure_space(this); 2046057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EMIT(0x0F); 2047057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EMIT(0x54); 2048057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_sse_operand(dst, src); 2049057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 2050057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2051057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2052af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::orps(XMMRegister dst, const Operand& src) { 2053057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EnsureSpace ensure_space(this); 2054057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EMIT(0x0F); 2055057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EMIT(0x56); 2056057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_sse_operand(dst, src); 2057057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 2058057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2059057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2060af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::xorps(XMMRegister dst, const Operand& src) { 2061fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org EnsureSpace ensure_space(this); 2062fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org EMIT(0x0F); 2063fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org EMIT(0x57); 2064fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org emit_sse_operand(dst, src); 2065fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org} 2066fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 2067fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org 2068af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::addps(XMMRegister dst, const Operand& src) { 2069ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 2070ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x0F); 2071af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x58); 2072ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_sse_operand(dst, src); 2073ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2074ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2075ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2076af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::subps(XMMRegister dst, const Operand& src) { 2077c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EnsureSpace ensure_space(this); 2078c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x0F); 2079af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x5C); 2080c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org emit_sse_operand(dst, src); 2081c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org} 2082c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2083c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2084af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::mulps(XMMRegister dst, const Operand& src) { 2085af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2086af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x0F); 2087af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x59); 2088af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2089af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2090af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2091af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2092af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::divps(XMMRegister dst, const Operand& src) { 2093af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2094af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x0F); 2095af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x5E); 2096af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2097af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2098af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2099af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2100af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { 2101af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2102af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0xF2); 2103af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x0F); 2104af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x51); 2105af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2106af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2107af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2108af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 21097e6132b924829c353864933f29124419916db550machenbach@chromium.orgvoid Assembler::sqrtsd(XMMRegister dst, const Operand& src) { 21107e6132b924829c353864933f29124419916db550machenbach@chromium.org EnsureSpace ensure_space(this); 21117e6132b924829c353864933f29124419916db550machenbach@chromium.org EMIT(0xF2); 21127e6132b924829c353864933f29124419916db550machenbach@chromium.org EMIT(0x0F); 21137e6132b924829c353864933f29124419916db550machenbach@chromium.org EMIT(0x51); 21147e6132b924829c353864933f29124419916db550machenbach@chromium.org emit_sse_operand(dst, src); 21157e6132b924829c353864933f29124419916db550machenbach@chromium.org} 21167e6132b924829c353864933f29124419916db550machenbach@chromium.org 21177e6132b924829c353864933f29124419916db550machenbach@chromium.org 2118af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::andpd(XMMRegister dst, XMMRegister src) { 2119471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org EnsureSpace ensure_space(this); 2120471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org EMIT(0x66); 2121471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org EMIT(0x0F); 2122af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x54); 2123471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org emit_sse_operand(dst, src); 2124471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org} 2125471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2126471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2127af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::orpd(XMMRegister dst, XMMRegister src) { 2128ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 2129ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x66); 2130ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x0F); 2131af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x56); 2132ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_sse_operand(dst, src); 2133ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2134ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2135ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 213664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) { 213764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 213864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 213964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x0F); 214064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x2E); 214164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit_sse_operand(dst, src); 214264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 214364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 214464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 21454acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) { 2146e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 21474acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org EnsureSpace ensure_space(this); 21484acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org EMIT(0x66); 21494acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org EMIT(0x0F); 21504acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org EMIT(0x3A); 21514acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org EMIT(0x0B); 21524acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org emit_sse_operand(dst, src); 21534acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org // Mask precision exeption. 21544acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org EMIT(static_cast<byte>(mode) | 0x8); 21554acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org} 21564acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 2157e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2158f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgvoid Assembler::movmskpd(Register dst, XMMRegister src) { 2159f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org EnsureSpace ensure_space(this); 2160f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org EMIT(0x66); 2161f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org EMIT(0x0F); 2162f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org EMIT(0x50); 2163f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org emit_sse_operand(dst, src); 2164f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org} 2165f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 2166f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 21674121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.orgvoid Assembler::movmskps(Register dst, XMMRegister src) { 21684121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org EnsureSpace ensure_space(this); 21694121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org EMIT(0x0F); 21704121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org EMIT(0x50); 21714121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit_sse_operand(dst, src); 21724121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org} 21734121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org 21744121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org 217533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvoid Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) { 217633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org EnsureSpace ensure_space(this); 217733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org EMIT(0x66); 217833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org EMIT(0x0F); 217933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org EMIT(0x76); 218033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org emit_sse_operand(dst, src); 218133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 218233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 218333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2184c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) { 2185c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EnsureSpace ensure_space(this); 2186c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0xF2); 2187c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x0F); 2188c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0xC2); 2189c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org emit_sse_operand(dst, src); 2190c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(1); // LT == 1 2191c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org} 2192c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2193c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2194c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgvoid Assembler::movaps(XMMRegister dst, XMMRegister src) { 2195c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EnsureSpace ensure_space(this); 2196c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x0F); 2197c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x28); 2198c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org emit_sse_operand(dst, src); 2199c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org} 2200c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2201c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2202af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) { 2203e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(imm8)); 2204af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2205af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0x0F); 2206af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(0xC6); 2207af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2208af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EMIT(imm8); 2209af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2210af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2211af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2212c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgvoid Assembler::movdqa(const Operand& dst, XMMRegister src) { 22130c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EnsureSpace ensure_space(this); 22140c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x66); 22150c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x0F); 22160c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x7F); 22170c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org emit_sse_operand(src, dst); 22180c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 22190c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22200c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22210c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::movdqa(XMMRegister dst, const Operand& src) { 22220c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EnsureSpace ensure_space(this); 22230c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x66); 22240c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x0F); 22250c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x6F); 22260c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org emit_sse_operand(dst, src); 22270c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 22280c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22290c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22300c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::movdqu(const Operand& dst, XMMRegister src ) { 22310c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EnsureSpace ensure_space(this); 22320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0xF3); 22330c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x0F); 22340c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x7F); 22350c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org emit_sse_operand(src, dst); 22360c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 22370c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22380c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22390c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::movdqu(XMMRegister dst, const Operand& src) { 22400c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EnsureSpace ensure_space(this); 22410c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0xF3); 22420c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x0F); 22430c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org EMIT(0x6F); 22440c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org emit_sse_operand(dst, src); 22450c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 22460c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22470c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 22481af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::movntdqa(XMMRegister dst, const Operand& src) { 2249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 22501af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EnsureSpace ensure_space(this); 22511af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x66); 22521af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x0F); 22531af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x38); 22541af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x2A); 22551af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org emit_sse_operand(dst, src); 22561af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org} 22571af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 22581af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 22591af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::movntdq(const Operand& dst, XMMRegister src) { 22601af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EnsureSpace ensure_space(this); 22611af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x66); 22621af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x0F); 22631af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0xE7); 22641af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org emit_sse_operand(src, dst); 22651af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org} 22661af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 22671af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 22681af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::prefetch(const Operand& src, int level) { 2269e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint2(level)); 22701af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EnsureSpace ensure_space(this); 22711af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x0F); 22721af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org EMIT(0x18); 2273a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Emit hint number in Reg position of RegR/M. 2274a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org XMMRegister code = XMMRegister::from_code(level); 22751af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org emit_sse_operand(code, src); 22761af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org} 22771af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 22781af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org 227943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsd(const Operand& dst, XMMRegister src ) { 228043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 228143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); // double 228243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 228343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x11); // store 228443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(src, dst); 228543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 228643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 228743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 228843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsd(XMMRegister dst, const Operand& src) { 228943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 229043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xF2); // double 229143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x0F); 229243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x10); // load 229343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_sse_operand(dst, src); 229443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 229543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 22977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::movss(const Operand& dst, XMMRegister src ) { 22987979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EnsureSpace ensure_space(this); 22997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0xF3); // float 23007979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0x0F); 23017979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0x11); // store 23027979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org emit_sse_operand(src, dst); 23037979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org} 23047979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 23057979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 23067979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::movss(XMMRegister dst, const Operand& src) { 23077979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EnsureSpace ensure_space(this); 23087979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0xF3); // float 23097979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0x0F); 23107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EMIT(0x10); // load 23117979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org emit_sse_operand(dst, src); 23127979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org} 23137979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 23147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 2315ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::movd(XMMRegister dst, const Operand& src) { 2316ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 2317ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x66); 2318ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x0F); 2319ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x6E); 2320ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_sse_operand(dst, src); 2321ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2322ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2323ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 23245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Assembler::movd(const Operand& dst, XMMRegister src) { 23255f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EnsureSpace ensure_space(this); 23265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x66); 23275f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x0F); 23285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x7E); 23295f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org emit_sse_operand(src, dst); 23305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 23315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 23325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 233364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) { 2334e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 2335e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(imm8)); 233664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 233764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x66); 233864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x0F); 233964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x3A); 234064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(0x17); 2341b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org emit_sse_operand(src, dst); 234264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EMIT(imm8); 234364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 234464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 234564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 2346a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::pand(XMMRegister dst, XMMRegister src) { 2347a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 2348a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0x66); 2349a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0x0F); 2350a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(0xDB); 2351a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit_sse_operand(dst, src); 2352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2355ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::pxor(XMMRegister dst, XMMRegister src) { 2356ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 2357ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x66); 2358ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x0F); 2359ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0xEF); 2360ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_sse_operand(dst, src); 2361ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2362ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2363ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2364c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::por(XMMRegister dst, XMMRegister src) { 2365c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EnsureSpace ensure_space(this); 2366c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x66); 2367c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x0F); 2368c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0xEB); 2369c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org emit_sse_operand(dst, src); 2370c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2371c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2372c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2373ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::ptest(XMMRegister dst, XMMRegister src) { 2374e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 2375ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EnsureSpace ensure_space(this); 2376ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x66); 2377ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x0F); 2378ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x38); 2379ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org EMIT(0x17); 2380ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org emit_sse_operand(dst, src); 2381ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2382ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2383c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 23845f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Assembler::psllq(XMMRegister reg, int8_t shift) { 2385c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EnsureSpace ensure_space(this); 2386c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x66); 2387c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x0F); 2388c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org EMIT(0x73); 2389c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org emit_sse_operand(esi, reg); // esi == 6 23905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(shift); 23915f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 23925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 23935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 2394c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::psllq(XMMRegister dst, XMMRegister src) { 2395c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EnsureSpace ensure_space(this); 2396c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x66); 2397c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x0F); 2398c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0xF3); 2399c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org emit_sse_operand(dst, src); 2400c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2401c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2402c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2403c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::psrlq(XMMRegister reg, int8_t shift) { 2404c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EnsureSpace ensure_space(this); 2405c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x66); 2406c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x0F); 2407c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x73); 2408c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org emit_sse_operand(edx, reg); // edx == 2 2409c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(shift); 2410c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2411c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2412c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2413c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) { 2414c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EnsureSpace ensure_space(this); 2415c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x66); 2416c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0x0F); 2417c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org EMIT(0xD3); 2418c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org emit_sse_operand(dst, src); 2419c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2420c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2421c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 24221f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) { 24235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EnsureSpace ensure_space(this); 24245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x66); 24255f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x0F); 24265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x70); 24275f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org emit_sse_operand(dst, src); 24285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(shuffle); 24295f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 24305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 24315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 24325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) { 2433e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 24345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EnsureSpace ensure_space(this); 24355f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x66); 24365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x0F); 24375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x3A); 24385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(0x16); 24395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org emit_sse_operand(src, dst); 24405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org EMIT(offset); 2441d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com} 2442d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2443d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2444d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.comvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) { 2445e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 2446d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EnsureSpace ensure_space(this); 2447d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EMIT(0x66); 2448d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EMIT(0x0F); 2449d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EMIT(0x3A); 2450d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EMIT(0x22); 2451d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com emit_sse_operand(dst, src); 2452d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EMIT(offset); 2453c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org} 2454c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 2455c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org 245643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { 245743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Register ireg = { reg.code() }; 245843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ireg, adr); 245943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 246043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 246143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 246243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { 246343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0xC0 | dst.code() << 3 | src.code()); 246443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 246543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 246643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2467f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) { 2468f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org EMIT(0xC0 | dst.code() << 3 | src.code()); 2469f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org} 2470f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 2471f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 2472b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) { 2473b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org EMIT(0xC0 | (dst.code() << 3) | src.code()); 2474b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org} 2475b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org 2476b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org 247743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::Print() { 247809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Disassembler::Decode(isolate(), stdout, buffer_, pc_); 247943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 248043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 248143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 248243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::RecordJSReturn() { 2483f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 248443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 2485236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org RecordRelocInfo(RelocInfo::JS_RETURN); 248643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 248743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 248843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24892356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgvoid Assembler::RecordDebugBreakSlot() { 2490f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 24912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org EnsureSpace ensure_space(this); 24922356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 24932356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 24942356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 24952356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 249649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgvoid Assembler::RecordComment(const char* msg, bool force) { 249749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org if (FLAG_code_comments || force) { 249843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EnsureSpace ensure_space(this); 2499236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 250043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 250143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::GrowBuffer() { 2505e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(buffer_overflow()); 250643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!own_buffer_) FATAL("external code buffer is too small"); 250743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25085c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Compute new buffer size. 250943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CodeDesc desc; // the new buffer 25109d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org desc.buffer_size = 2 * buffer_size_; 25119d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 251243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Some internal data structures overflow for very large buffers, 251343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // they must ensure that kMaximalBufferSize is not too large. 251443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((desc.buffer_size > kMaximalBufferSize) || 25157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) { 251643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 251743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 251843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2519f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up new buffer. 252043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc.buffer = NewArray<byte>(desc.buffer_size); 252143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc.instr_size = pc_offset(); 252243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos()); 252343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 252443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Clear the buffer in debug mode. Use 'int3' instructions to make 252543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // sure to get into problems if we ever run uninitialized code. 252665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef DEBUG 252765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org memset(desc.buffer, 0xCC, desc.buffer_size); 252865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif 252943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25305c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Copy the data. 253143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int pc_delta = desc.buffer - buffer_; 253243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_); 2533d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemMove(desc.buffer, buffer_, desc.instr_size); 2534d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(), 2535d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org desc.reloc_size); 253643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25375c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Switch buffers. 25389d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org DeleteArray(buffer_); 253943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer_ = desc.buffer; 254043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer_size_ = desc.buffer_size; 254143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pc_ += pc_delta; 254243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 254343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reloc_info_writer.last_pc() + pc_delta); 254443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25455c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Relocate runtime entries. 254643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (RelocIterator it(desc); !it.done(); it.next()) { 2547236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org RelocInfo::Mode rmode = it.rinfo()->rmode(); 25486e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org if (rmode == RelocInfo::INTERNAL_REFERENCE) { 2549236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 2550236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org if (*p != 0) { // 0 means uninitialized. 2551236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org *p += pc_delta; 2552236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org } 255343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 255443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 255543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2556e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!buffer_overflow()); 255743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 255843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 255943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 256043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { 2561e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(op1) && is_uint8(op2)); // wrong opcode 2562e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(imm8)); 2563e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((op1 & 0x01) == 0); // should be 8bit operation 256443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(op1); 256543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(op2 | dst.code()); 256643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(imm8); 256743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 256843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 256943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 257043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) { 2571e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((0 <= sel) && (sel <= 7)); 257243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Register ireg = { sel }; 257343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (x.is_int8()) { 257443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x83); // using a sign-extended 8-bit immediate. 257543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ireg, dst); 257643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(x.x_ & 0xFF); 257743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (dst.is_reg(eax)) { 257843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT((sel << 3) | 0x05); // short form if the destination is eax. 257943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(x); 258043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 258143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(0x81); // using a literal 32-bit immediate. 258243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_operand(ireg, dst); 258343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit(x); 258443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 258543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 258643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 258743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 258843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_operand(Register reg, const Operand& adr) { 2589ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org const unsigned length = adr.len_; 2590e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length > 0); 2591ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2592ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Emit updated ModRM byte containing the given register. 2593ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); 2594ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2595ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Emit the rest of the encoded operand. 2596ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 2597ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc_ += length; 2598ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2599ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Emit relocation information if necessary. 260059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) { 260143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 260243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RecordRelocInfo(adr.rmode_); 260343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pc_ += sizeof(int32_t); 260443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 260543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 260643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 260743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 260843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_farith(int b1, int b2, int i) { 2609e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2610e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= i && i < 8); // illegal stack offset 261143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(b1); 261243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EMIT(b2 + i); 261343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 261443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 261543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2616a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::db(uint8_t data) { 2617a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 2618a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EMIT(data); 2619a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2620a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::dd(uint32_t data) { 2623236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org EnsureSpace ensure_space(this); 2624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(data); 2625236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org} 2626236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 2627236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 2628236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 2629e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsNone(rmode)); 2630769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com // Don't record external references unless the heap will be serialized. 2631874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (rmode == RelocInfo::EXTERNAL_REFERENCE && 2632874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org !serializer_enabled() && !emit_debug_code()) { 2633874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org return; 2634769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com } 2635c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RelocInfo rinfo(pc_, rmode, data, NULL); 263643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reloc_info_writer.Write(&rinfo); 263743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 263843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 26409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgHandle<ConstantPoolArray> Assembler::NewConstantPool(Isolate* isolate) { 2641763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org // No out-of-line constant pool support. 2642e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!FLAG_enable_ool_constant_pool); 26439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return isolate->factory()->empty_constant_pool_array(); 2644763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org} 2645763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2646763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2647763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) { 2648763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org // No out-of-line constant pool support. 2649e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!FLAG_enable_ool_constant_pool); 26509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return; 2651763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org} 2652763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2653763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 265465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef GENERATED_CODE_COVERAGE 265565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic FILE* coverage_log = NULL; 265665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 265765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 265865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void InitCoverageLog() { 265965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG"); 266065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (file_name != NULL) { 266165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org coverage_log = fopen(file_name, "aw+"); 266265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 266365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 266465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 266565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 266665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgvoid LogGeneratedCodeCoverage(const char* file_line) { 266765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* return_address = (&file_line)[-1]; 266865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org char* push_insn = const_cast<char*>(return_address - 12); 266965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org push_insn[0] = 0xeb; // Relative branch insn. 267065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org push_insn[1] = 13; // Skip over coverage insns. 267165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (coverage_log != NULL) { 267265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org fprintf(coverage_log, "%s\n", file_line); 267365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org fflush(coverage_log); 267465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 267565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 267665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 267765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif 267865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 267943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 26809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 26819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_IA32 2682