⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test-disasm-ia32.cc

📁 Google浏览器V8内核代码
💻 CC
字号:
// Copyright 2007-2008 the V8 project authors. All rights reserved.// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright//       notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above//       copyright notice, this list of conditions and the following//       disclaimer in the documentation and/or other materials provided//       with the distribution.//     * Neither the name of Google Inc. nor the names of its//       contributors may be used to endorse or promote products derived//       from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#include <stdlib.h>#include "v8.h"#include "debug.h"#include "disasm.h"#include "disassembler.h"#include "macro-assembler.h"#include "serialize.h"#include "cctest.h"using namespace v8::internal;static v8::Persistent<v8::Context> env;static void InitializeVM() {  if (env.IsEmpty()) {    env = v8::Context::New();  }}#define __ assm.static void DummyStaticFunction(Object* result) {}TEST(DisasmIa320) {  InitializeVM();  Serializer::disable();  // Needed for Probe when running without snapshot.  CpuFeatures::Probe();  v8::HandleScope scope;  v8::internal::byte buffer[1024];  Assembler assm(buffer, sizeof buffer);  DummyStaticFunction(NULL);  // just bloody use it (DELETE; debugging)  // Short immediate instructions  __ adc(eax, 12345678);  __ add(Operand(eax), Immediate(12345678));  __ or_(eax, 12345678);  __ sub(Operand(eax), Immediate(12345678));  __ xor_(eax, 12345678);  __ and_(eax, 12345678);  Handle<FixedArray> foo = Factory::NewFixedArray(10, TENURED);  __ cmp(eax, foo);  // ---- This one caused crash  __ mov(ebx,  Operand(esp, ecx, times_2, 0));  // [esp+ecx*4]  // ---- All instructions that I can think of  __ add(edx, Operand(ebx));  __ add(edx, Operand(12, RelocInfo::NONE));  __ add(edx, Operand(ebx, 0));  __ add(edx, Operand(ebx, 16));  __ add(edx, Operand(ebx, 1999));  __ add(edx, Operand(esp, 0));  __ add(edx, Operand(esp, 16));  __ add(edx, Operand(esp, 1999));  __ nop();  __ add(edi, Operand(ebp, ecx, times_4, 0));  __ add(edi, Operand(ebp, ecx, times_4, 12));  __ add(Operand(ebp, ecx, times_4, 12), Immediate(12));  __ nop();  __ add(Operand(ebx), Immediate(12));  __ nop();  __ adc(ecx, 12);  __ adc(ecx, 1000);  __ nop();  __ and_(edx, 3);  __ and_(edx, Operand(esp, 4));  __ cmp(edx, 3);  __ cmp(edx, Operand(esp, 4));  __ cmp(Operand(ebp, ecx, times_4, 0), Immediate(1000));  Handle<FixedArray> foo2 = Factory::NewFixedArray(10, TENURED);  __ cmp(ebx, foo2);  __ or_(edx, 3);  __ xor_(edx, 3);  __ nop();  {    CHECK(CpuFeatures::IsSupported(CpuFeatures::CPUID));    CpuFeatures::Scope fscope(CpuFeatures::CPUID);    __ cpuid();  }  {    CHECK(CpuFeatures::IsSupported(CpuFeatures::RDTSC));    CpuFeatures::Scope fscope(CpuFeatures::RDTSC);    __ rdtsc();  }  __ movsx_b(edx, Operand(ecx));  __ movsx_w(edx, Operand(ecx));  __ movzx_b(edx, Operand(ecx));  __ movzx_w(edx, Operand(ecx));  __ nop();  __ imul(edx, Operand(ecx));  __ shld(edx, Operand(ecx));  __ shrd(edx, Operand(ecx));  __ bts(Operand(edx), ecx);  __ bts(Operand(ebx, ecx, times_4, 0), ecx);  __ nop();  __ pushad();  __ popad();  __ pushfd();  __ popfd();  __ push(Immediate(12));  __ push(Immediate(23456));  __ push(ecx);  __ push(esi);  __ push(Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));  __ push(Operand(ebx, ecx, times_4, 0));  __ push(Operand(ebx, ecx, times_4, 0));  __ push(Operand(ebx, ecx, times_4, 10000));  __ pop(edx);  __ pop(eax);  __ pop(Operand(ebx, ecx, times_4, 0));  __ nop();  __ add(edx, Operand(esp, 16));  __ add(edx, Operand(ecx));  __ mov_b(edx, Operand(ecx));  __ mov_b(Operand(ecx), 6);  __ mov_b(Operand(ebx, ecx, times_4, 10000), 6);  __ mov_b(Operand(esp, 16), edx);  __ mov_w(edx, Operand(esp, 16));  __ mov_w(Operand(esp, 16), edx);  __ nop();  __ movsx_w(edx, Operand(esp, 12));  __ movsx_b(edx, Operand(esp, 12));  __ movzx_w(edx, Operand(esp, 12));  __ movzx_b(edx, Operand(esp, 12));  __ nop();  __ mov(edx, 1234567);  __ mov(edx, Operand(esp, 12));  __ mov(Operand(ebx, ecx, times_4, 10000), Immediate(12345));  __ mov(Operand(ebx, ecx, times_4, 10000), edx);  __ nop();  __ dec_b(edx);  __ dec(edx);  __ cdq();  __ nop();  __ idiv(edx);  __ mul(edx);  __ neg(edx);  __ not_(edx);  __ test(Operand(ebx, ecx, times_4, 10000), Immediate(123456));  __ imul(edx, Operand(ebx, ecx, times_4, 10000));  __ imul(edx, ecx, 12);  __ imul(edx, ecx, 1000);  __ inc(edx);  __ inc(Operand(ebx, ecx, times_4, 10000));  __ push(Operand(ebx, ecx, times_4, 10000));  __ pop(Operand(ebx, ecx, times_4, 10000));  __ call(Operand(ebx, ecx, times_4, 10000));  __ jmp(Operand(ebx, ecx, times_4, 10000));  __ lea(edx, Operand(ebx, ecx, times_4, 10000));  __ or_(edx, 12345);  __ or_(edx, Operand(ebx, ecx, times_4, 10000));  __ nop();  __ rcl(edx, 1);  __ rcl(edx, 7);  __ sar(edx, 1);  __ sar(edx, 6);  __ sar(edx);  __ sbb(edx, Operand(ebx, ecx, times_4, 10000));  __ shld(edx, Operand(ebx, ecx, times_4, 10000));  __ shl(edx, 1);  __ shl(edx, 6);  __ shl(edx);  __ shrd(edx, Operand(ebx, ecx, times_4, 10000));  __ shr(edx, 7);  __ shr(edx);  // Immediates  __ adc(edx, 12345);  __ add(Operand(ebx), Immediate(12));  __ add(Operand(edx, ecx, times_4, 10000), Immediate(12));  __ and_(ebx, 12345);  __ cmp(ebx, 12345);  __ cmp(Operand(ebx), Immediate(12));  __ cmp(Operand(edx, ecx, times_4, 10000), Immediate(12));  __ or_(ebx, 12345);  __ sub(Operand(ebx), Immediate(12));  __ sub(Operand(edx, ecx, times_4, 10000), Immediate(12));  __ xor_(ebx, 12345);  __ imul(edx, ecx, 12);  __ imul(edx, ecx, 1000);  __ sub(edx, Operand(ebx, ecx, times_4, 10000));  __ sub(edx, Operand(ebx));  __ test(edx, Immediate(12345));  __ test(edx, Operand(ebx, ecx, times_8, 10000));  __ nop();  __ xor_(edx, 12345);  __ xor_(edx, Operand(ebx, ecx, times_8, 10000));  __ bts(Operand(ebx, ecx, times_8, 10000), edx);  __ hlt();  __ int3();  __ ret(0);  __ ret(8);  // Calls  Label L1, L2;  __ bind(&L1);  __ nop();  __ call(&L1);  __ call(&L2);  __ nop();  __ bind(&L2);  __ call(Operand(ebx, ecx, times_4, 10000));  __ nop();  Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));  __ call(ic, RelocInfo::CODE_TARGET);  __ nop();  __ call(FUNCTION_ADDR(DummyStaticFunction), RelocInfo::RUNTIME_ENTRY);  __ nop();  __ jmp(&L1);  __ jmp(Operand(ebx, ecx, times_4, 10000));  ExternalReference after_break_target =      ExternalReference(Debug_Address::AfterBreakTarget());  __ jmp(Operand::StaticVariable(after_break_target));  __ jmp(ic, RelocInfo::CODE_TARGET);  __ nop();  Label Ljcc;  __ nop();  // long jumps  __ j(overflow, &Ljcc);  __ j(no_overflow, &Ljcc);  __ j(below, &Ljcc);  __ j(above_equal, &Ljcc);  __ j(equal, &Ljcc);  __ j(not_equal, &Ljcc);  __ j(below_equal, &Ljcc);  __ j(above, &Ljcc);  __ j(sign, &Ljcc);  __ j(not_sign, &Ljcc);  __ j(parity_even, &Ljcc);  __ j(parity_odd, &Ljcc);  __ j(less, &Ljcc);  __ j(greater_equal, &Ljcc);  __ j(less_equal, &Ljcc);  __ j(greater, &Ljcc);  __ nop();  __ bind(&Ljcc);  // short jumps  __ j(overflow, &Ljcc);  __ j(no_overflow, &Ljcc);  __ j(below, &Ljcc);  __ j(above_equal, &Ljcc);  __ j(equal, &Ljcc);  __ j(not_equal, &Ljcc);  __ j(below_equal, &Ljcc);  __ j(above, &Ljcc);  __ j(sign, &Ljcc);  __ j(not_sign, &Ljcc);  __ j(parity_even, &Ljcc);  __ j(parity_odd, &Ljcc);  __ j(less, &Ljcc);  __ j(greater_equal, &Ljcc);  __ j(less_equal, &Ljcc);  __ j(greater, &Ljcc);  // checking hints  __ j(zero, &Ljcc, taken);  __ j(zero, &Ljcc, not_taken);  // __ mov(Operand::StaticVariable(Top::handler_address()), eax);  // 0xD9 instructions  __ nop();  __ fld1();  __ fldz();  __ fabs();  __ fchs();  __ fprem();  __ fprem1();  __ fincstp();  __ ftst();  __ fxch(3);  __ fld_s(Operand(ebx, ecx, times_4, 10000));  __ fstp_s(Operand(ebx, ecx, times_4, 10000));  __ ffree(3);  __ fld_d(Operand(ebx, ecx, times_4, 10000));  __ fstp_d(Operand(ebx, ecx, times_4, 10000));  __ nop();  __ fild_s(Operand(ebx, ecx, times_4, 10000));  __ fistp_s(Operand(ebx, ecx, times_4, 10000));  __ fild_d(Operand(ebx, ecx, times_4, 10000));  __ fistp_d(Operand(ebx, ecx, times_4, 10000));  __ fnstsw_ax();  __ nop();  __ fadd(3);  __ fsub(3);  __ fmul(3);  __ fdiv(3);  __ faddp(3);  __ fsubp(3);  __ fmulp(3);  __ fdivp(3);  __ fcompp();  __ fwait();  __ nop();  {    CHECK(CpuFeatures::IsSupported(CpuFeatures::SSE2));    CpuFeatures::Scope fscope(CpuFeatures::SSE2);    __ cvttss2si(edx, Operand(ebx, ecx, times_4, 10000));    __ cvtsi2sd(xmm1, Operand(ebx, ecx, times_4, 10000));    __ addsd(xmm1, xmm0);    __ mulsd(xmm1, xmm0);    __ subsd(xmm1, xmm0);    __ divsd(xmm1, xmm0);    __ movdbl(xmm1, Operand(ebx, ecx, times_4, 10000));    __ movdbl(Operand(ebx, ecx, times_4, 10000), xmm1);  }  __ ret(0);  CodeDesc desc;  assm.GetCode(&desc);  Object* code = Heap::CreateCode(desc, NULL, Code::ComputeFlags(Code::STUB));  CHECK(code->IsCode());#ifdef DEBUG  Code::cast(code)->Print();  byte* begin = Code::cast(code)->instruction_start();  byte* end = begin + Code::cast(code)->instruction_size();  disasm::Disassembler::Disassemble(stdout, begin, end);#endif}#undef __

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -