* Copyright (c) 2026 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ecmascript/compiler/assembler/x64/assembler_x64.h"
#include <ostream>
#include "ecmascript/compiler/assembler/aarch64/assembler_aarch64.h"
#include "ecmascript/compiler/assembler/x64/extended_assembler_x64.h"
#include "ecmascript/compiler/codegen/llvm/llvm_codegen.h"
#include "ecmascript/compiler/trampoline/x64/common_call.h"
#include "ecmascript/ecma_vm.h"
#include "ecmascript/mem/dyn_chunk.h"
#include "ecmascript/tests/test_helper.h"
#include "llvm-c/Analysis.h"
#include "llvm-c/Core.h"
#include "llvm-c/Disassembler.h"
#include "llvm-c/ExecutionEngine.h"
#include "llvm-c/Target.h"
namespace panda::test {
using namespace panda::ecmascript;
using namespace panda::ecmascript::x64;
class AssemblerX64Test : public testing::Test {
public:
static void SetUpTestCase()
{
GTEST_LOG_(INFO) << "SetUpTestCase";
}
static void TearDownTestCase()
{
GTEST_LOG_(INFO) << "TearDownCase";
}
void SetUp() override
{
InitializeLLVM(TARGET_X64);
TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
chunk_ = thread->GetEcmaVM()->GetChunk();
}
void TearDown() override
{
TestHelper::DestroyEcmaVMWithScope(instance, scope);
}
static const char *SymbolLookupCallback([[maybe_unused]] void *disInfo, [[maybe_unused]] uint64_t referenceValue,
uint64_t *referenceType, [[maybe_unused]] uint64_t referencePC,
[[maybe_unused]] const char **referenceName)
{
*referenceType = LLVMDisassembler_ReferenceType_InOut_None;
return nullptr;
}
void InitializeLLVM(std::string triple)
{
if (triple.compare(TARGET_X64) == 0) {
LLVMInitializeX86TargetInfo();
LLVMInitializeX86TargetMC();
LLVMInitializeX86Disassembler();
LLVMInitializeX86AsmPrinter();
LLVMInitializeX86AsmParser();
LLVMInitializeX86Target();
} else if (triple.compare(TARGET_AARCH64) == 0) {
LLVMInitializeAArch64TargetInfo();
LLVMInitializeAArch64TargetMC();
LLVMInitializeAArch64Disassembler();
LLVMInitializeAArch64AsmPrinter();
LLVMInitializeAArch64AsmParser();
LLVMInitializeAArch64Target();
} else {
LOG_ECMA(FATAL) << "this branch is unreachable";
UNREACHABLE();
}
}
void DisassembleChunk(const char *triple, Assembler *assemlber, std::ostream &os)
{
LLVMDisasmContextRef dcr = LLVMCreateDisasm(triple, nullptr, 0, nullptr, SymbolLookupCallback);
uint8_t *byteSp = assemlber->GetBegin();
size_t numBytes = assemlber->GetCurrentPosition();
unsigned pc = 0;
const char outStringSize = 100;
char outString[outStringSize];
while (numBytes > 0) {
size_t InstSize = LLVMDisasmInstruction(dcr, byteSp, numBytes, pc, outString, outStringSize);
if (InstSize == 0) {
os << std::setw(8) << std::setfill('0') << std::hex << pc << ":" << std::setw(8)
<< *reinterpret_cast<uint32_t *>(byteSp) << "maybe constant" << std::endl;
pc += 4;
byteSp += 4;
numBytes -= 4;
}
os << std::setw(8) << std::setfill('0') << std::hex << pc << ":" << std::setw(8)
<< *reinterpret_cast<uint32_t *>(byteSp) << " " << outString << std::endl;
pc += InstSize;
byteSp += InstSize;
numBytes -= InstSize;
}
LLVMDisasmDispose(dcr);
}
EcmaVM *instance {nullptr};
JSThread *thread {nullptr};
EcmaHandleScope *scope {nullptr};
Chunk *chunk_ {nullptr};
};
#define __ masm.
HWTEST_F_L0(AssemblerX64Test, Emit)
{
x64::AssemblerX64 masm(chunk_);
Label lable1;
size_t current = 0;
__ Pushq(rbp);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x55U);
__ Pushq(0);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x6AU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
__ Popq(rbp);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x5DU);
__ Bind(&lable1);
__ Movq(rcx, rbx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x89U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xCBU);
__ Movq(Operand(rsp, 0x40U), rbx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x8BU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x5CU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x24U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x40U);
__ Jmp(&lable1);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xEBU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xF6U);
__ Ret();
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC3U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, Emit1)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Movl(Operand(rax, 0x38), rax);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x8BU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x40U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x38U);
__ Movl(rsi, r14);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x41U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x89U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xF6U);
__ Movzbq(Operand(rcx, 0), rax);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xB6U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x01U);
__ Movabs(0x2, rdx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xBAU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x02U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
__ Movq(0x5, rdx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xBAU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x05U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
__ Movq(rsp, r8);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x49U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x89U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, Emit2)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Cmpl(0x9FFFFFF, rdx);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x81U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFAU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x09U);
__ Cmpl(rcx, rbx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x39U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xCBU);
__ Cmp(0x0, rdx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x83U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFAU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
__ Cmpq(r11, rax);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x4CU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x39U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xD8U);
__ Btl(0x8, rax);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xBAU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE0U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x08U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, Emit3)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ CMovbe(rbx, rcx);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x46U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xCBU);
__ Testb(0x1, r14);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x41U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xF6U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC6U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x01U);
__ Testq(15, rsp);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x40U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xF6U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC4U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
__ Andq(0xfffffff, r11);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x49U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x81U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE3U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
__ Andl(0xfffffff, rax);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x25U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
__ And(rax, rdx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x21U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC2U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, Emit4)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Leaq(Operand(r14, Scale::Times8, 0), rcx);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x4AU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x8DU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0CU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xF5U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x00U);
__ Leal(Operand(rax, -50331649), rdx);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x8DU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x90U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFFU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xFCU);
__ Shll(0x18, rax);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC1U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE0U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x18U);
__ Shrq(32, r11);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x49U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC1U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xEBU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x20U);
__ Int3();
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xCCU);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, SublImm8)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Subl(5, rax);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x83U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE8U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x05U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, SublRax)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Subl(0x12345678, rax);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x2DU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x78U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x56U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x34U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x12U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, SublNonRax)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Subl(0x12345678, rcx);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x81U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE9U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x78U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x56U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x34U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x12U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, JmpImm8)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Jmp(0x10);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0xEBU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x10U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, JmpImm32)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Jmp(0x12345678);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0xE9U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x78U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x56U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x34U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x12U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, OrImm8)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Or(0xF, rax);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x83U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC8U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0FU);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, OrRax)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Or(0x12345678, rax);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x0DU);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x78U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x56U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x34U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x12U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, OrNonRax)
{
x64::AssemblerX64 masm(chunk_);
size_t current = 0;
__ Or(0x12345678, rcx);
uint32_t value = masm.GetU8(current++);
ASSERT_EQ(value, 0x48U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x81U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0xC9U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x78U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x56U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x34U);
value = masm.GetU8(current++);
ASSERT_EQ(value, 0x12U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), masm.GetCurrentPosition());
}
HWTEST_F_L0(AssemblerX64Test, JzTest)
{
x64::AssemblerX64 masm(chunk_);
Label label;
__ Bind(&label);
__ Movq(rax, rbx);
Label jmpLabel;
__ Jz(&jmpLabel);
__ Bind(&jmpLabel);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JzBoundLabel)
{
x64::AssemblerX64 masm(chunk_);
Label target;
__ Movq(rax, rbx);
__ Movq(rcx, rdx);
__ Movq(r8, r9);
__ Bind(&target);
__ Movq(r10, r11);
Label jmpHere;
__ Bind(&jmpHere);
__ Jz(&target);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JleTest)
{
x64::AssemblerX64 masm(chunk_);
Label label;
__ Bind(&label);
__ Movq(rax, rbx);
Label jmpLabel;
__ Jle(&jmpLabel);
__ Bind(&jmpLabel);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JleBoundLabel)
{
x64::AssemblerX64 masm(chunk_);
Label target;
__ Movq(rax, rbx);
__ Movq(rcx, rdx);
__ Movq(r8, r9);
__ Bind(&target);
__ Movq(r10, r11);
Label jmpHere;
__ Bind(&jmpHere);
__ Jle(&target);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, ConditionalJumps)
{
x64::AssemblerX64 masm(chunk_);
Label label1;
Label label2;
Label label3;
__ Bind(&label1);
__ Cmpq(rax, rbx);
__ Jz(&label2);
__ Jle(&label3);
__ Jmp(&label1);
__ Bind(&label2);
__ Movq(rax, rcx);
__ Bind(&label3);
__ Movq(rbx, rdx);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JmpNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jmp(&end, Distance::Near);
__ Jmp(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JzNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jz(&end, Distance::Near);
__ Jz(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JnzNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jnz(&end, Distance::Near);
__ Jnz(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JeNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Je(&end, Distance::Near);
__ Je(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JneNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jne(&end, Distance::Near);
__ Jne(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JaNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Ja(&end, Distance::Near);
__ Ja(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JbNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jb(&end, Distance::Near);
__ Jb(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JaeNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jae(&end, Distance::Near);
__ Jae(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JgNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jg(&end, Distance::Near);
__ Jg(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JgeNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jge(&end, Distance::Near);
__ Jge(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JbeNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jbe(&end, Distance::Near);
__ Jbe(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JnbNearLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jnb(&end, Distance::Near);
__ Jnb(&target, Distance::Near);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JmpFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jmp(&end, Distance::Far);
__ Jmp(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JzFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jz(&end, Distance::Far);
__ Jz(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JnzFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jnz(&end, Distance::Far);
__ Jnz(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JeFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Je(&end, Distance::Far);
__ Je(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JneFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jne(&end, Distance::Far);
__ Jne(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JaFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Ja(&end, Distance::Far);
__ Ja(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JbFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jb(&end, Distance::Far);
__ Jb(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JaeFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jae(&end, Distance::Far);
__ Jae(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JgFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jg(&end, Distance::Far);
__ Jg(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JgeFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jge(&end, Distance::Far);
__ Jge(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JbeFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jbe(&end, Distance::Far);
__ Jbe(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
HWTEST_F_L0(AssemblerX64Test, JnbFarLinked)
{
x64::AssemblerX64 masm(chunk_);
Label target;
Label end;
__ Jnb(&end, Distance::Far);
__ Jnb(&target, Distance::Far);
__ Bind(&target);
__ Bind(&end);
size_t size = masm.GetCurrentPosition();
ASSERT_GT(size, 0U);
ecmascript::kungfu::LLVMAssembler::Disassemble(nullptr, TARGET_X64,
masm.GetBegin(), size);
}
#undef __
}