e4c5b84652
Contribution of PowerPC port (continuation of 422063005). The inital patch covers the core changes to the common files. Subsequent patches will cover changes to common files to support AIX and to update the ppc directories so they are current with the changes in the rest of the project. This is based off of the GitHub repository https://github.com/andrewlow/v8ppc BUG= R=svenpanne@chromium.org, danno@chromium.org, sevnpanne@chromium.org Review URL: https://codereview.chromium.org/817143002 Cr-Commit-Position: refs/heads/master@{#26091}
156 lines
6.9 KiB
C++
156 lines
6.9 KiB
C++
// Copyright 2011 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 "src/v8.h"
|
|
|
|
#include "src/debug.h"
|
|
#include "src/disasm.h"
|
|
#include "src/disassembler.h"
|
|
#include "src/macro-assembler.h"
|
|
#include "src/serialize.h"
|
|
#include "test/cctest/cctest.h"
|
|
|
|
using namespace v8::internal;
|
|
|
|
|
|
bool DisassembleAndCompare(byte* pc, const char* compare_string) {
|
|
disasm::NameConverter converter;
|
|
disasm::Disassembler disasm(converter);
|
|
EmbeddedVector<char, 128> disasm_buffer;
|
|
|
|
disasm.InstructionDecode(disasm_buffer, pc);
|
|
|
|
if (strcmp(compare_string, disasm_buffer.start()) != 0) {
|
|
fprintf(stderr,
|
|
"expected: \n"
|
|
"%s\n"
|
|
"disassembled: \n"
|
|
"%s\n\n",
|
|
compare_string, disasm_buffer.start());
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
// Set up V8 to a state where we can at least run the assembler and
|
|
// disassembler. Declare the variables and allocate the data structures used
|
|
// in the rest of the macros.
|
|
#define SET_UP() \
|
|
CcTest::InitializeVM(); \
|
|
Isolate* isolate = Isolate::Current(); \
|
|
HandleScope scope(isolate); \
|
|
byte* buffer = reinterpret_cast<byte*>(malloc(4 * 1024)); \
|
|
Assembler assm(isolate, buffer, 4 * 1024); \
|
|
bool failure = false;
|
|
|
|
|
|
// This macro assembles one instruction using the preallocated assembler and
|
|
// disassembles the generated instruction, comparing the output to the expected
|
|
// value. If the comparison fails an error message is printed, but the test
|
|
// continues to run until the end.
|
|
#define COMPARE(asm_, compare_string) \
|
|
{ \
|
|
int pc_offset = assm.pc_offset(); \
|
|
byte* progcounter = &buffer[pc_offset]; \
|
|
assm.asm_; \
|
|
if (!DisassembleAndCompare(progcounter, compare_string)) failure = true; \
|
|
}
|
|
|
|
// Force emission of any pending literals into a pool.
|
|
#define EMIT_PENDING_LITERALS() assm.CheckConstPool(true, false)
|
|
|
|
|
|
// Verify that all invocations of the COMPARE macro passed successfully.
|
|
// Exit with a failure if at least one of the tests failed.
|
|
#define VERIFY_RUN() \
|
|
if (failure) { \
|
|
V8_Fatal(__FILE__, __LINE__, "PPC Disassembler tests failed.\n"); \
|
|
}
|
|
|
|
TEST(DisasmPPC) {
|
|
SET_UP();
|
|
|
|
COMPARE(addc(r9, r7, r9), "7d274814 addc r9, r7, r9");
|
|
COMPARE(addic(r3, r5, Operand(20)), "30650014 addic r3, r5, 20");
|
|
COMPARE(addi(r0, ip, Operand(63)), "380c003f addi r0, r12, 63");
|
|
COMPARE(add(r5, r7, r0), "7ca70214 add r5, r7, r0");
|
|
COMPARE(addze(r0, r0, LeaveOE, SetRC), "7c000195 addze. r0, r0");
|
|
COMPARE(andi(r0, r3, Operand(4)), "70600004 andi. r0, r3, 4");
|
|
COMPARE(and_(r3, r6, r5), "7cc32838 and r3, r6, r5");
|
|
COMPARE(and_(r6, r0, r6, SetRC), "7c063039 and. r6, r0, r6");
|
|
// skipping branches (for now?)
|
|
COMPARE(bctr(), "4e800420 bctr");
|
|
COMPARE(blr(), "4e800020 blr");
|
|
COMPARE(bclr(BA, SetLK), "4e800021 blrl");
|
|
// skipping call - only used in simulator
|
|
#if V8_TARGET_ARCH_PPC64
|
|
COMPARE(cmpi(r0, Operand(5)), "2fa00005 cmpi r0, 5");
|
|
#else
|
|
COMPARE(cmpi(r0, Operand(5)), "2f800005 cmpi r0, 5");
|
|
#endif
|
|
#if V8_TARGET_ARCH_PPC64
|
|
COMPARE(cmpl(r6, r7), "7fa63840 cmpl r6, r7");
|
|
#else
|
|
COMPARE(cmpl(r6, r7), "7f863840 cmpl r6, r7");
|
|
#endif
|
|
#if V8_TARGET_ARCH_PPC64
|
|
COMPARE(cmp(r5, r11), "7fa55800 cmp r5, r11");
|
|
#else
|
|
COMPARE(cmp(r5, r11), "7f855800 cmp r5, r11");
|
|
#endif
|
|
// skipping crxor - incomplete disassembly
|
|
COMPARE(lbz(r4, MemOperand(r4, 7)), "88840007 lbz r4, 7(r4)");
|
|
COMPARE(lfd(d0, MemOperand(sp, 128)), "c8010080 lfd d0, 128(sp)");
|
|
COMPARE(li(r0, Operand(16)), "38000010 li r0, 16");
|
|
COMPARE(lis(r8, Operand(22560)), "3d005820 lis r8, 22560");
|
|
COMPARE(lwz(ip, MemOperand(r19, 44)), "8193002c lwz r12, 44(r19)");
|
|
COMPARE(lwzx(r0, MemOperand(r5, ip)), "7c05602e lwzx r0, r5, r12");
|
|
COMPARE(mflr(r0), "7c0802a6 mflr r0");
|
|
COMPARE(mr(r15, r4), "7c8f2378 mr r15, r4");
|
|
COMPARE(mtctr(r0), "7c0903a6 mtctr r0");
|
|
COMPARE(mtlr(r15), "7de803a6 mtlr r15");
|
|
COMPARE(ori(r8, r8, Operand(42849)), "6108a761 ori r8, r8, 42849");
|
|
COMPARE(orx(r5, r3, r4), "7c652378 or r5, r3, r4");
|
|
COMPARE(rlwinm(r4, r3, 2, 0, 29), "5464103a rlwinm r4, r3, 2, 0, 29");
|
|
COMPARE(rlwinm(r0, r3, 0, 31, 31, SetRC),
|
|
"546007ff rlwinm. r0, r3, 0, 31, 31");
|
|
COMPARE(srawi(r3, r6, 1), "7cc30e70 srawi r3,r6,1");
|
|
COMPARE(stb(r5, MemOperand(r11, 11)), "98ab000b stb r5, 11(r11)");
|
|
COMPARE(stfd(d2, MemOperand(sp, 8)), "d8410008 stfd d2, 8(sp)");
|
|
COMPARE(stw(r16, MemOperand(sp, 64)), "92010040 stw r16, 64(sp)");
|
|
COMPARE(stwu(r3, MemOperand(sp, -4)), "9461fffc stwu r3, -4(sp)");
|
|
COMPARE(sub(r3, r3, r4), "7c641850 subf r3, r4, r3");
|
|
COMPARE(sub(r0, r9, r8, LeaveOE, SetRC), "7c084851 subf. r0, r8, r9");
|
|
COMPARE(xor_(r6, r5, r4), "7ca62278 xor r6, r5, r4");
|
|
|
|
VERIFY_RUN();
|
|
}
|