mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 12:34:35 +03:00
[abi] Added support for 32-bit ARM (WIP)
This commit is contained in:
@@ -28,6 +28,10 @@ static void print_app_info() noexcept {
|
||||
void benchmark_x86_emitters(uint32_t num_iterations, bool test_x86, bool test_x64) noexcept;
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
void benchmark_aarch32_emitters(uint32_t num_iterations);
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH64)
|
||||
void benchmark_aarch64_emitters(uint32_t num_iterations);
|
||||
#endif
|
||||
@@ -49,6 +53,9 @@ int main(int argc, char* argv[]) {
|
||||
printf(" --arch=x86 32-bit X86 architecture (X86)\n");
|
||||
printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
|
||||
#endif
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
printf(" --arch=aarch32 32-bit ARM architecture (AArch32)\n");
|
||||
#endif
|
||||
#if !defined(ASMJIT_NO_AARCH64)
|
||||
printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
|
||||
#endif
|
||||
@@ -71,6 +78,14 @@ int main(int argc, char* argv[]) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
bool test_aarch32 = strcmp(arch, "all") == 0 || strcmp(arch, "aarch32") == 0;
|
||||
|
||||
if (test_aarch32) {
|
||||
benchmark_aarch32_emitters(num_iterations);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH64)
|
||||
bool test_aarch64 = strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0;
|
||||
|
||||
|
||||
23
asmjit-testing/bench/asmjit_bench_codegen_a32.cpp
Normal file
23
asmjit-testing/bench/asmjit_bench_codegen_a32.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
// This file is part of AsmJit project <https://asmjit.com>
|
||||
//
|
||||
// See <asmjit/core.h> or LICENSE.md for license and copyright information
|
||||
// SPDX-License-Identifier: Zlib
|
||||
|
||||
#include <asmjit/core.h>
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
#include <asmjit/a32.h>
|
||||
|
||||
#include <limits>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <asmjit-testing/bench/asmjit_bench_codegen.h>
|
||||
|
||||
using namespace asmjit;
|
||||
|
||||
void benchmark_aarch32_emitters(uint32_t num_iterations) {
|
||||
Support::maybe_unused(num_iterations);
|
||||
}
|
||||
|
||||
#endif // !ASMJIT_NO_AARCH32
|
||||
@@ -20,6 +20,10 @@ bool test_x86_assembler(const TestSettings& settings) noexcept;
|
||||
bool test_x64_assembler(const TestSettings& settings) noexcept;
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
bool test_aarch32_assembler(const TestSettings& settings) noexcept;
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH64)
|
||||
bool test_aarch64_assembler(const TestSettings& settings) noexcept;
|
||||
#endif
|
||||
@@ -47,6 +51,9 @@ static void print_app_usage(const TestSettings& settings) noexcept {
|
||||
printf(" --arch=x86 32-bit X86 architecture (X86)\n");
|
||||
printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
|
||||
#endif
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
printf(" --arch=aarch32 32-bit ARM architecture (AArch32)\n");
|
||||
#endif
|
||||
#if !defined(ASMJIT_NO_AARCH64)
|
||||
printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
|
||||
#endif
|
||||
@@ -68,34 +75,52 @@ int main(int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
const char* arch = cmd_line.value_of("--arch", "all");
|
||||
|
||||
bool x86_failed = false;
|
||||
bool x64_failed = false;
|
||||
bool aarch32_failed = false;
|
||||
bool aarch64_failed = false;
|
||||
|
||||
#if !defined(ASMJIT_NO_X86)
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0))
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0)) {
|
||||
x86_failed = !test_x86_assembler(settings);
|
||||
}
|
||||
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0))
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0)) {
|
||||
x64_failed = !test_x64_assembler(settings);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch32") == 0)) {
|
||||
aarch32_failed = !test_aarch32_assembler(settings);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH64)
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0))
|
||||
if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0)) {
|
||||
aarch64_failed = !test_aarch64_assembler(settings);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool failed = x86_failed || x64_failed || aarch64_failed;
|
||||
bool failed = x86_failed || x64_failed || aarch32_failed || aarch64_failed;
|
||||
|
||||
if (failed) {
|
||||
if (x86_failed)
|
||||
if (x86_failed) {
|
||||
printf("** X86 test suite failed **\n");
|
||||
}
|
||||
|
||||
if (x64_failed)
|
||||
if (x64_failed) {
|
||||
printf("** X64 test suite failed **\n");
|
||||
}
|
||||
|
||||
if (aarch64_failed)
|
||||
if (aarch32_failed) {
|
||||
printf("** AArch32 test suite failed **\n");
|
||||
}
|
||||
|
||||
if (aarch64_failed) {
|
||||
printf("** AArch64 test suite failed **\n");
|
||||
}
|
||||
|
||||
printf("** FAILURE **\n");
|
||||
}
|
||||
|
||||
2881
asmjit-testing/tests/asmjit_test_assembler_a32.cpp
Normal file
2881
asmjit-testing/tests/asmjit_test_assembler_a32.cpp
Normal file
File diff suppressed because it is too large
Load Diff
638
asmjit-testing/tests/asmjit_test_perf_a32.cpp
Normal file
638
asmjit-testing/tests/asmjit_test_perf_a32.cpp
Normal file
@@ -0,0 +1,638 @@
|
||||
// This file is part of AsmJit project <https://asmjit.com>
|
||||
//
|
||||
// See asmjit.h or LICENSE.md for license and copyright information
|
||||
// SPDX-License-Identifier: Zlib
|
||||
|
||||
#include <asmjit/core.h>
|
||||
|
||||
#if !defined(ASMJIT_NO_AARCH32)
|
||||
#include <asmjit/a32.h>
|
||||
|
||||
#include <asmjit-testing/commons/asmjit_test_perf.h.
|
||||
|
||||
#include <limits>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
using namespace asmjit;
|
||||
|
||||
// Generates a long sequence of GP instructions.
|
||||
template<typename Emitter>
|
||||
static void generateGpSequenceInternal(
|
||||
Emitter& cc,
|
||||
const a32::Gp& a, const a32::Gp& b, const a32::Gp& c, const a32::Gp& d) {
|
||||
|
||||
using namespace asmjit::a32;
|
||||
|
||||
cc.mov(a, 0);
|
||||
cc.mov(b, 1);
|
||||
cc.mov(c, 2);
|
||||
cc.mov(d, 3);
|
||||
|
||||
cc.adc(a, b, c, lsl(d));
|
||||
cc.adc(a, b, c, lsr(d));
|
||||
cc.adc(a, b, c, asr(d));
|
||||
cc.adc(a, b, c, ror(d));
|
||||
cc.adc(a, b, c, lsl(8));
|
||||
cc.adc(a, b, c, lsr(8));
|
||||
cc.adc(a, b, c, asr(8));
|
||||
cc.adc(a, b, c, ror(8));
|
||||
cc.adc(a, b, 0xFF);
|
||||
cc.adc(a, b, 0xFF00);
|
||||
cc.adc(a, b, 0xFF000000);
|
||||
cc.adc(a, b, 0xF000000F);
|
||||
cc.adcs(a, b, c, lsl(d));
|
||||
cc.adcs(a, b, c, lsr(d));
|
||||
cc.adcs(a, b, c, asr(d));
|
||||
cc.adcs(a, b, c, ror(d));
|
||||
cc.adcs(a, b, c, lsl(8));
|
||||
cc.adcs(a, b, c, lsr(8));
|
||||
cc.adcs(a, b, c, asr(8));
|
||||
cc.adcs(a, b, c, ror(8));
|
||||
cc.adcs(a, b, 0xFF);
|
||||
cc.adcs(a, b, 0xFF00);
|
||||
cc.adcs(a, b, 0xFF000000);
|
||||
cc.adcs(a, b, 0xF000000F);
|
||||
cc.add(a, b, c, lsl(d));
|
||||
cc.add(a, b, c, lsr(d));
|
||||
cc.add(a, b, c, asr(d));
|
||||
cc.add(a, b, c, ror(d));
|
||||
cc.add(a, b, c, lsl(8));
|
||||
cc.add(a, b, c, lsr(8));
|
||||
cc.add(a, b, c, asr(8));
|
||||
cc.add(a, b, c, ror(8));
|
||||
cc.add(a, b, 0xFF);
|
||||
cc.add(a, b, 0xFF00);
|
||||
cc.add(a, b, 0xFF000000);
|
||||
cc.add(a, b, 0xF000000F);
|
||||
cc.adds(a, b, c, lsl(d));
|
||||
cc.adds(a, b, c, lsr(d));
|
||||
cc.adds(a, b, c, asr(d));
|
||||
cc.adds(a, b, c, ror(d));
|
||||
cc.adds(a, b, c, lsl(8));
|
||||
cc.adds(a, b, c, lsr(8));
|
||||
cc.adds(a, b, c, asr(8));
|
||||
cc.adds(a, b, c, ror(8));
|
||||
cc.adds(a, b, 0xFF);
|
||||
cc.adds(a, b, 0xFF00);
|
||||
cc.adds(a, b, 0xFF000000);
|
||||
cc.adds(a, b, 0xF000000F);
|
||||
cc.and_(a, b, c, lsl(d));
|
||||
cc.and_(a, b, c, lsr(d));
|
||||
cc.and_(a, b, c, asr(d));
|
||||
cc.and_(a, b, c, ror(d));
|
||||
cc.and_(a, b, c, lsl(8));
|
||||
cc.and_(a, b, c, lsr(8));
|
||||
cc.and_(a, b, c, asr(8));
|
||||
cc.and_(a, b, c, ror(8));
|
||||
cc.and_(a, b, 0xFF);
|
||||
cc.and_(a, b, 0xFF00);
|
||||
cc.and_(a, b, 0xFF000000);
|
||||
cc.and_(a, b, 0xF000000F);
|
||||
cc.ands(a, b, c, lsl(d));
|
||||
cc.ands(a, b, c, lsr(d));
|
||||
cc.ands(a, b, c, asr(d));
|
||||
cc.ands(a, b, c, ror(d));
|
||||
cc.ands(a, b, c, lsl(8));
|
||||
cc.ands(a, b, c, lsr(8));
|
||||
cc.ands(a, b, c, asr(8));
|
||||
cc.ands(a, b, c, ror(8));
|
||||
cc.ands(a, b, 0xFF);
|
||||
cc.ands(a, b, 0xFF00);
|
||||
cc.ands(a, b, 0xFF000000);
|
||||
cc.ands(a, b, 0xF000000F);
|
||||
cc.asr(a, b, c);
|
||||
cc.asr(a, b, 3);
|
||||
cc.asrs(a, b, c);
|
||||
cc.asrs(a, b, 3);
|
||||
cc.bfc(a, 3, 5);
|
||||
cc.bfi(a, b, 3, 5);
|
||||
cc.bic(a, b, c, lsl(d));
|
||||
cc.bic(a, b, c, lsr(d));
|
||||
cc.bic(a, b, c, asr(d));
|
||||
cc.bic(a, b, c, ror(d));
|
||||
cc.bic(a, b, c, lsl(8));
|
||||
cc.bic(a, b, c, lsr(8));
|
||||
cc.bic(a, b, c, asr(8));
|
||||
cc.bic(a, b, c, ror(8));
|
||||
cc.bic(a, b, 0xFF);
|
||||
cc.bic(a, b, 0xFF00);
|
||||
cc.bic(a, b, 0xFF000000);
|
||||
cc.bic(a, b, 0xF000000F);
|
||||
cc.bics(a, b, c, lsl(d));
|
||||
cc.bics(a, b, c, lsr(d));
|
||||
cc.bics(a, b, c, asr(d));
|
||||
cc.bics(a, b, c, ror(d));
|
||||
cc.bics(a, b, c, lsl(8));
|
||||
cc.bics(a, b, c, lsr(8));
|
||||
cc.bics(a, b, c, asr(8));
|
||||
cc.bics(a, b, c, ror(8));
|
||||
cc.bics(a, b, 0xFF);
|
||||
cc.bics(a, b, 0xFF00);
|
||||
cc.bics(a, b, 0xFF000000);
|
||||
cc.bics(a, b, 0xF000000F);
|
||||
cc.clz(a, b);
|
||||
cc.cmn(a, b, lsl(c));
|
||||
cc.cmn(a, b, lsr(c));
|
||||
cc.cmn(a, b, asr(c));
|
||||
cc.cmn(a, b, ror(c));
|
||||
cc.cmn(a, b, lsl(8));
|
||||
cc.cmn(a, b, lsr(8));
|
||||
cc.cmn(a, b, asr(8));
|
||||
cc.cmn(a, b, ror(8));
|
||||
cc.cmn(a, 0xFF);
|
||||
cc.cmn(a, 0xFF00);
|
||||
cc.cmn(a, 0xFF000000);
|
||||
cc.cmn(a, 0xF000000F);
|
||||
cc.cmp(a, b, lsl(c));
|
||||
cc.cmp(a, b, lsr(c));
|
||||
cc.cmp(a, b, asr(c));
|
||||
cc.cmp(a, b, ror(c));
|
||||
cc.cmp(a, b, lsl(8));
|
||||
cc.cmp(a, b, lsr(8));
|
||||
cc.cmp(a, b, asr(8));
|
||||
cc.cmp(a, b, ror(8));
|
||||
cc.cmp(a, 0xFF);
|
||||
cc.cmp(a, 0xFF00);
|
||||
cc.cmp(a, 0xFF000000);
|
||||
cc.cmp(a, 0xF000000F);
|
||||
cc.crc32b(a, b, c);
|
||||
cc.crc32cb(a, b, c);
|
||||
cc.crc32ch(a, b, c);
|
||||
cc.crc32cw(a, b, c);
|
||||
cc.crc32h(a, b, c);
|
||||
cc.crc32w(a, b, c);
|
||||
cc.eor(a, b, c, lsl(d));
|
||||
cc.eor(a, b, c, lsr(d));
|
||||
cc.eor(a, b, c, asr(d));
|
||||
cc.eor(a, b, c, ror(d));
|
||||
cc.eor(a, b, c, lsl(8));
|
||||
cc.eor(a, b, c, lsr(8));
|
||||
cc.eor(a, b, c, asr(8));
|
||||
cc.eor(a, b, c, ror(8));
|
||||
cc.eor(a, b, 0xFF);
|
||||
cc.eor(a, b, 0xFF00);
|
||||
cc.eor(a, b, 0xFF000000);
|
||||
cc.eor(a, b, 0xF000000F);
|
||||
cc.eors(a, b, c, lsl(d));
|
||||
cc.eors(a, b, c, lsr(d));
|
||||
cc.eors(a, b, c, asr(d));
|
||||
cc.eors(a, b, c, ror(d));
|
||||
cc.eors(a, b, c, lsl(8));
|
||||
cc.eors(a, b, c, lsr(8));
|
||||
cc.eors(a, b, c, asr(8));
|
||||
cc.eors(a, b, c, ror(8));
|
||||
cc.eors(a, b, 0xFF);
|
||||
cc.eors(a, b, 0xFF00);
|
||||
cc.eors(a, b, 0xFF000000);
|
||||
cc.eors(a, b, 0xF000000F);
|
||||
cc.ldr(a, ptr(b, c));
|
||||
cc.ldr(a, ptr_pre(b, c));
|
||||
cc.ldr(a, ptr_post(b, c));
|
||||
cc.ldr(a, ptr(b, 4));
|
||||
cc.ldr(a, ptr_pre(b, 4));
|
||||
cc.ldr(a, ptr_post(b, 4));
|
||||
cc.ldrb(a, ptr(b, c));
|
||||
cc.ldrb(a, ptr_pre(b, c));
|
||||
cc.ldrb(a, ptr_post(b, c));
|
||||
cc.ldrb(a, ptr(b, 4));
|
||||
cc.ldrb(a, ptr_pre(b, 4));
|
||||
cc.ldrb(a, ptr_post(b, 4));
|
||||
cc.ldrbt(a, ptr_post(b, c));
|
||||
cc.ldrbt(a, ptr_post(b, 4));
|
||||
cc.ldrh(a, ptr(b, c));
|
||||
cc.ldrh(a, ptr_pre(b, c));
|
||||
cc.ldrh(a, ptr_post(b, c));
|
||||
cc.ldrh(a, ptr(b, 4));
|
||||
cc.ldrh(a, ptr_pre(b, 4));
|
||||
cc.ldrh(a, ptr_post(b, 4));
|
||||
cc.ldrht(a, ptr_post(b, c));
|
||||
cc.ldrht(a, ptr_post(b, 4));
|
||||
cc.ldrsb(a, ptr(b, c));
|
||||
cc.ldrsb(a, ptr_pre(b, c));
|
||||
cc.ldrsb(a, ptr_post(b, c));
|
||||
cc.ldrsb(a, ptr(b, 4));
|
||||
cc.ldrsb(a, ptr_pre(b, 4));
|
||||
cc.ldrsb(a, ptr_post(b, 4));
|
||||
cc.ldrsbt(a, ptr_post(b, c));
|
||||
cc.ldrsbt(a, ptr_post(b, 4));
|
||||
cc.ldrsh(a, ptr(b, c));
|
||||
cc.ldrsh(a, ptr_pre(b, c));
|
||||
cc.ldrsh(a, ptr_post(b, c));
|
||||
cc.ldrsh(a, ptr(b, 4));
|
||||
cc.ldrsh(a, ptr_pre(b, 4));
|
||||
cc.ldrsh(a, ptr_post(b, 4));
|
||||
cc.ldrsht(a, ptr_post(b, 4));
|
||||
cc.ldrsht(a, ptr_post(b, c));
|
||||
cc.ldrt(a, ptr_post(b, c));
|
||||
cc.ldrt(a, ptr_post(b, 4));
|
||||
cc.lsl(a, b, 3);
|
||||
cc.lsl(a, b, c);
|
||||
cc.lsls(a, b, 3);
|
||||
cc.lsls(a, b, c);
|
||||
cc.lsr(a, b, 3);
|
||||
cc.lsr(a, b, c);
|
||||
cc.lsrs(a, b, 3);
|
||||
cc.lsrs(a, b, c);
|
||||
cc.mla(a, b, c, d);
|
||||
cc.mlas(a, b, c, d);
|
||||
cc.mls(a, b, c, d);
|
||||
cc.mov(a, b, lsl(c));
|
||||
cc.mov(a, b, lsr(c));
|
||||
cc.mov(a, b, asr(c));
|
||||
cc.mov(a, b, ror(c));
|
||||
cc.mov(a, b, lsl(8));
|
||||
cc.mov(a, b, lsr(8));
|
||||
cc.mov(a, b, asr(8));
|
||||
cc.mov(a, b, ror(8));
|
||||
cc.mov(a, 0xFF);
|
||||
cc.mov(a, 0xFF00);
|
||||
cc.mov(a, 0xFF000000);
|
||||
cc.mov(a, 0xF000000F);
|
||||
cc.movs(a, b, lsl(c));
|
||||
cc.movs(a, b, lsr(c));
|
||||
cc.movs(a, b, asr(c));
|
||||
cc.movs(a, b, ror(c));
|
||||
cc.movs(a, b, lsl(8));
|
||||
cc.movs(a, b, lsr(8));
|
||||
cc.movs(a, b, asr(8));
|
||||
cc.movs(a, b, ror(8));
|
||||
cc.movs(a, 0xFF);
|
||||
cc.movs(a, 0xFF00);
|
||||
cc.movs(a, 0xFF000000);
|
||||
cc.movs(a, 0xF000000F);
|
||||
cc.movt(a, 1);
|
||||
cc.movw(a, 1);
|
||||
cc.mul(a, b, c);
|
||||
cc.muls(a, b, c);
|
||||
cc.mvn(a, b, lsl(c));
|
||||
cc.mvn(a, b, lsr(c));
|
||||
cc.mvn(a, b, asr(c));
|
||||
cc.mvn(a, b, ror(c));
|
||||
cc.mvn(a, b, lsl(8));
|
||||
cc.mvn(a, b, lsr(8));
|
||||
cc.mvn(a, b, asr(8));
|
||||
cc.mvn(a, b, ror(8));
|
||||
cc.mvn(a, 0xFF);
|
||||
cc.mvn(a, 0xFF00);
|
||||
cc.mvn(a, 0xFF000000);
|
||||
cc.mvn(a, 0xF000000F);
|
||||
cc.mvns(a, b, lsl(c));
|
||||
cc.mvns(a, b, lsr(c));
|
||||
cc.mvns(a, b, asr(c));
|
||||
cc.mvns(a, b, ror(c));
|
||||
cc.mvns(a, b, lsl(8));
|
||||
cc.mvns(a, b, lsr(8));
|
||||
cc.mvns(a, b, asr(8));
|
||||
cc.mvns(a, b, ror(8));
|
||||
cc.mvns(a, 0xFF);
|
||||
cc.mvns(a, 0xFF00);
|
||||
cc.mvns(a, 0xFF000000);
|
||||
cc.mvns(a, 0xF000000F);
|
||||
cc.orr(a, b, c, lsl(d));
|
||||
cc.orr(a, b, c, lsr(d));
|
||||
cc.orr(a, b, c, asr(d));
|
||||
cc.orr(a, b, c, ror(d));
|
||||
cc.orr(a, b, c, lsl(8));
|
||||
cc.orr(a, b, c, lsr(8));
|
||||
cc.orr(a, b, c, asr(8));
|
||||
cc.orr(a, b, c, ror(8));
|
||||
cc.orr(a, b, 0xFF);
|
||||
cc.orr(a, b, 0xFF00);
|
||||
cc.orr(a, b, 0xFF000000);
|
||||
cc.orr(a, b, 0xF000000F);
|
||||
cc.orrs(a, b, c, lsl(d));
|
||||
cc.orrs(a, b, c, lsr(d));
|
||||
cc.orrs(a, b, c, asr(d));
|
||||
cc.orrs(a, b, c, ror(d));
|
||||
cc.orrs(a, b, c, lsl(8));
|
||||
cc.orrs(a, b, c, lsr(8));
|
||||
cc.orrs(a, b, c, asr(8));
|
||||
cc.orrs(a, b, c, ror(8));
|
||||
cc.orrs(a, b, 0xFF);
|
||||
cc.orrs(a, b, 0xFF00);
|
||||
cc.orrs(a, b, 0xFF000000);
|
||||
cc.orrs(a, b, 0xF000000F);
|
||||
cc.pkhbt(a, b, c, lsl(8));
|
||||
cc.pkhtb(a, b, c, asr(8));
|
||||
cc.qadd(a, b, c);
|
||||
cc.qadd16(a, b, c);
|
||||
cc.qadd8(a, b, c);
|
||||
cc.qasx(a, b, c);
|
||||
cc.qdadd(a, b, c);
|
||||
cc.qdsub(a, b, c);
|
||||
cc.qsax(a, b, c);
|
||||
cc.qsub(a, b, c);
|
||||
cc.qsub16(a, b, c);
|
||||
cc.qsub8(a, b, c);
|
||||
cc.rbit(a, b);
|
||||
cc.rev(a, b);
|
||||
cc.rev16(a, b);
|
||||
cc.revsh(a, b);
|
||||
cc.ror(a, b, 3);
|
||||
cc.ror(a, b, c);
|
||||
cc.rors(a, b, 3);
|
||||
cc.rors(a, b, c);
|
||||
cc.rrx(a, b);
|
||||
cc.rrxs(a, b);
|
||||
cc.rsb(a, b, c, lsl(d));
|
||||
cc.rsb(a, b, c, lsr(d));
|
||||
cc.rsb(a, b, c, asr(d));
|
||||
cc.rsb(a, b, c, ror(d));
|
||||
cc.rsb(a, b, c, lsl(8));
|
||||
cc.rsb(a, b, c, lsr(8));
|
||||
cc.rsb(a, b, c, asr(8));
|
||||
cc.rsb(a, b, c, ror(8));
|
||||
cc.rsb(a, b, 0xFF);
|
||||
cc.rsb(a, b, 0xFF00);
|
||||
cc.rsb(a, b, 0xFF000000);
|
||||
cc.rsb(a, b, 0xF000000F);
|
||||
cc.rsbs(a, b, c, lsl(d));
|
||||
cc.rsbs(a, b, c, lsr(d));
|
||||
cc.rsbs(a, b, c, asr(d));
|
||||
cc.rsbs(a, b, c, ror(d));
|
||||
cc.rsbs(a, b, c, lsl(8));
|
||||
cc.rsbs(a, b, c, lsr(8));
|
||||
cc.rsbs(a, b, c, asr(8));
|
||||
cc.rsbs(a, b, c, ror(8));
|
||||
cc.rsbs(a, b, 0xFF);
|
||||
cc.rsbs(a, b, 0xFF00);
|
||||
cc.rsbs(a, b, 0xFF000000);
|
||||
cc.rsbs(a, b, 0xF000000F);
|
||||
cc.rsc(a, b, c, lsl(d));
|
||||
cc.rsc(a, b, c, lsr(d));
|
||||
cc.rsc(a, b, c, asr(d));
|
||||
cc.rsc(a, b, c, ror(d));
|
||||
cc.rsc(a, b, c, lsl(8));
|
||||
cc.rsc(a, b, c, lsr(8));
|
||||
cc.rsc(a, b, c, asr(8));
|
||||
cc.rsc(a, b, c, ror(8));
|
||||
cc.rsc(a, b, 0xFF);
|
||||
cc.rsc(a, b, 0xFF00);
|
||||
cc.rsc(a, b, 0xFF000000);
|
||||
cc.rsc(a, b, 0xF000000F);
|
||||
cc.rscs(a, b, c, lsl(d));
|
||||
cc.rscs(a, b, c, lsr(d));
|
||||
cc.rscs(a, b, c, asr(d));
|
||||
cc.rscs(a, b, c, ror(d));
|
||||
cc.rscs(a, b, c, lsl(8));
|
||||
cc.rscs(a, b, c, lsr(8));
|
||||
cc.rscs(a, b, c, asr(8));
|
||||
cc.rscs(a, b, c, ror(8));
|
||||
cc.rscs(a, b, 0xFF);
|
||||
cc.rscs(a, b, 0xFF00);
|
||||
cc.rscs(a, b, 0xFF000000);
|
||||
cc.rscs(a, b, 0xF000000F);
|
||||
cc.sadd16(a, b, c);
|
||||
cc.sadd8(a, b, c);
|
||||
cc.sasx(a, b, c);
|
||||
cc.sbc(a, b, c, lsl(d));
|
||||
cc.sbc(a, b, c, lsr(d));
|
||||
cc.sbc(a, b, c, asr(d));
|
||||
cc.sbc(a, b, c, ror(d));
|
||||
cc.sbc(a, b, c, lsl(8));
|
||||
cc.sbc(a, b, c, lsr(8));
|
||||
cc.sbc(a, b, c, asr(8));
|
||||
cc.sbc(a, b, c, ror(8));
|
||||
cc.sbc(a, b, 0xFF);
|
||||
cc.sbc(a, b, 0xFF00);
|
||||
cc.sbc(a, b, 0xFF000000);
|
||||
cc.sbc(a, b, 0xF000000F);
|
||||
cc.sbcs(a, b, c, lsl(d));
|
||||
cc.sbcs(a, b, c, lsr(d));
|
||||
cc.sbcs(a, b, c, asr(d));
|
||||
cc.sbcs(a, b, c, ror(d));
|
||||
cc.sbcs(a, b, c, lsl(8));
|
||||
cc.sbcs(a, b, c, lsr(8));
|
||||
cc.sbcs(a, b, c, asr(8));
|
||||
cc.sbcs(a, b, c, ror(8));
|
||||
cc.sbcs(a, b, 0xFF);
|
||||
cc.sbcs(a, b, 0xFF00);
|
||||
cc.sbcs(a, b, 0xFF000000);
|
||||
cc.sbcs(a, b, 0xF000000F);
|
||||
cc.sbfx(a, b, 3, 5);
|
||||
cc.sdiv(a, b, c);
|
||||
cc.sel(a, b, c);
|
||||
cc.shadd16(a, b, c);
|
||||
cc.shadd8(a, b, c);
|
||||
cc.shasx(a, b, c);
|
||||
cc.shsax(a, b, c);
|
||||
cc.shsub16(a, b, c);
|
||||
cc.shsub8(a, b, c);
|
||||
cc.smlabb(a, b, c, d);
|
||||
cc.smlabt(a, b, c, d);
|
||||
cc.smlad(a, b, c, d);
|
||||
cc.smladx(a, b, c, d);
|
||||
cc.smlal(a, b, c, d);
|
||||
cc.smlalbb(a, b, c, d);
|
||||
cc.smlalbt(a, b, c, d);
|
||||
cc.smlald(a, b, c, d);
|
||||
cc.smlaldx(a, b, c, d);
|
||||
cc.smlals(a, b, c, d);
|
||||
cc.smlaltb(a, b, c, d);
|
||||
cc.smlaltt(a, b, c, d);
|
||||
cc.smlatb(a, b, c, d);
|
||||
cc.smlatt(a, b, c, d);
|
||||
cc.smlawb(a, b, c, d);
|
||||
cc.smlawt(a, b, c, d);
|
||||
cc.smlsd(a, b, c, d);
|
||||
cc.smlsdx(a, b, c, d);
|
||||
cc.smlsld(a, b, c, d);
|
||||
cc.smlsldx(a, b, c, d);
|
||||
cc.smmla(a, b, c, d);
|
||||
cc.smmlar(a, b, c, d);
|
||||
cc.smmls(a, b, c, d);
|
||||
cc.smmlsr(a, b, c, d);
|
||||
cc.smmul(a, b, c);
|
||||
cc.smmulr(a, b, c);
|
||||
cc.smuad(a, b, c);
|
||||
cc.smuadx(a, b, c);
|
||||
cc.smulbb(a, b, c);
|
||||
cc.smulbt(a, b, c);
|
||||
cc.smull(a, b, c, d);
|
||||
cc.smulls(a, b, c, d);
|
||||
cc.smultb(a, b, c);
|
||||
cc.smultt(a, b, c);
|
||||
cc.smulwb(a, b, c);
|
||||
cc.smulwt(a, b, c);
|
||||
cc.smusd(a, b, c);
|
||||
cc.smusdx(a, b, c);
|
||||
cc.ssat(a, 8, c);
|
||||
cc.ssat(a, 8, c, lsl(8));
|
||||
cc.ssat(a, 8, c, asr(8));
|
||||
cc.ssat16(a, 8, c);
|
||||
cc.ssax(a, b, c);
|
||||
cc.ssub16(a, b, c);
|
||||
cc.ssub8(a, b, c);
|
||||
cc.str(a, ptr(b, c));
|
||||
cc.str(a, ptr_pre(b, c));
|
||||
cc.str(a, ptr_post(b, c));
|
||||
cc.str(a, ptr(b, 4));
|
||||
cc.str(a, ptr_pre(b, 4));
|
||||
cc.str(a, ptr_post(b, 4));
|
||||
cc.strb(a, ptr(b, c));
|
||||
cc.strb(a, ptr_pre(b, c));
|
||||
cc.strb(a, ptr_post(b, c));
|
||||
cc.strb(a, ptr(b, 4));
|
||||
cc.strb(a, ptr_pre(b, 4));
|
||||
cc.strb(a, ptr_post(b, 4));
|
||||
cc.strbt(a, ptr_post(b, c));
|
||||
cc.strbt(a, ptr_post(b, 4));
|
||||
cc.strh(a, ptr(b, c));
|
||||
cc.strh(a, ptr_pre(b, c));
|
||||
cc.strh(a, ptr_post(b, c));
|
||||
cc.strh(a, ptr(b, 4));
|
||||
cc.strh(a, ptr_pre(b, 4));
|
||||
cc.strh(a, ptr_post(b, 4));
|
||||
cc.strht(a, ptr_post(b, c));
|
||||
cc.strht(a, ptr_post(b, 4));
|
||||
cc.strt(a, ptr_post(b, c));
|
||||
cc.strt(a, ptr_post(b, 4));
|
||||
cc.sub(a, b, c, lsl(d));
|
||||
cc.sub(a, b, c, lsr(d));
|
||||
cc.sub(a, b, c, asr(d));
|
||||
cc.sub(a, b, c, ror(d));
|
||||
cc.sub(a, b, c, lsl(8));
|
||||
cc.sub(a, b, c, lsr(8));
|
||||
cc.sub(a, b, c, asr(8));
|
||||
cc.sub(a, b, c, ror(8));
|
||||
cc.sub(a, b, 0xFF);
|
||||
cc.sub(a, b, 0xFF00);
|
||||
cc.sub(a, b, 0xFF000000);
|
||||
cc.sub(a, b, 0xF000000F);
|
||||
cc.subs(a, b, c, lsl(d));
|
||||
cc.subs(a, b, c, lsr(d));
|
||||
cc.subs(a, b, c, asr(d));
|
||||
cc.subs(a, b, c, ror(d));
|
||||
cc.subs(a, b, c, lsl(8));
|
||||
cc.subs(a, b, c, lsr(8));
|
||||
cc.subs(a, b, c, asr(8));
|
||||
cc.subs(a, b, c, ror(8));
|
||||
cc.subs(a, b, 0xFF);
|
||||
cc.subs(a, b, 0xFF00);
|
||||
cc.subs(a, b, 0xFF000000);
|
||||
cc.subs(a, b, 0xF000000F);
|
||||
cc.sxtab(a, b, c, ror(8));
|
||||
cc.sxtab16(a, b, c, ror(8));
|
||||
cc.sxtah(a, b, c, ror(8));
|
||||
cc.sxtb(a, b, ror(8));
|
||||
cc.sxtb16(a, b, ror(8));
|
||||
cc.sxth(a, b, ror(8));
|
||||
cc.teq(a, b, lsl(c));
|
||||
cc.teq(a, b, lsr(c));
|
||||
cc.teq(a, b, asr(c));
|
||||
cc.teq(a, b, ror(c));
|
||||
cc.teq(a, b, lsl(8));
|
||||
cc.teq(a, b, lsr(8));
|
||||
cc.teq(a, b, asr(8));
|
||||
cc.teq(a, b, ror(8));
|
||||
cc.teq(a, 0xFF);
|
||||
cc.teq(a, 0xFF00);
|
||||
cc.teq(a, 0xFF000000);
|
||||
cc.teq(a, 0xF000000F);
|
||||
cc.tst(a, b, lsl(c));
|
||||
cc.tst(a, b, lsr(c));
|
||||
cc.tst(a, b, asr(c));
|
||||
cc.tst(a, b, ror(c));
|
||||
cc.tst(a, b, lsl(8));
|
||||
cc.tst(a, b, lsr(8));
|
||||
cc.tst(a, b, asr(8));
|
||||
cc.tst(a, b, ror(8));
|
||||
cc.tst(a, 0xFF);
|
||||
cc.tst(a, 0xFF00);
|
||||
cc.tst(a, 0xFF000000);
|
||||
cc.tst(a, 0xF000000F);
|
||||
cc.uadd16(a, b, c);
|
||||
cc.uadd8(a, b, c);
|
||||
cc.uasx(a, b, c);
|
||||
cc.ubfx(a, b, 3, 5);
|
||||
cc.udiv(a, b, c);
|
||||
cc.uhadd16(a, b, c);
|
||||
cc.uhadd8(a, b, c);
|
||||
cc.uhasx(a, b, c);
|
||||
cc.uhsax(a, b, c);
|
||||
cc.uhsub16(a, b, c);
|
||||
cc.uhsub8(a, b, c);
|
||||
cc.umaal(a, b, c, d);
|
||||
cc.umlal(a, b, c, d);
|
||||
cc.umlals(a, b, c, d);
|
||||
cc.umull(a, b, c, d);
|
||||
cc.umulls(a, b, c, d);
|
||||
cc.uqadd16(a, b, c);
|
||||
cc.uqadd8(a, b, c);
|
||||
cc.uqasx(a, b, c);
|
||||
cc.uqsax(a, b, c);
|
||||
cc.uqsub16(a, b, c);
|
||||
cc.uqsub8(a, b, c);
|
||||
cc.usad8(a, b, c);
|
||||
cc.usada8(a, b, c, d);
|
||||
cc.usat(a, 8, c, lsl(8));
|
||||
cc.usat(a, 8, c, asr(8));
|
||||
cc.usat16(a, 8, c);
|
||||
cc.usax(a, b, c);
|
||||
cc.usub16(a, b, c);
|
||||
cc.usub8(a, b, c);
|
||||
cc.uxtab(a, b, c, ror(8));
|
||||
cc.uxtab16(a, b, c, ror(8));
|
||||
cc.uxtah(a, b, c, ror(8));
|
||||
cc.uxtb(a, b, ror(8));
|
||||
cc.uxtb16(a, b, ror(8));
|
||||
cc.uxth(a, b, ror(8));
|
||||
}
|
||||
|
||||
static void generateGpSequence(BaseEmitter& emitter, bool emitPrologEpilog) {
|
||||
if (emitter.isAssembler()) {
|
||||
a32::Assembler& cc = *emitter.as<a32::Assembler>();
|
||||
|
||||
a32::Gp a = a32::r0;
|
||||
a32::Gp b = a32::r1;
|
||||
a32::Gp c = a32::r2;
|
||||
a32::Gp d = a32::r3;
|
||||
|
||||
if (emitPrologEpilog) {
|
||||
FuncDetail func;
|
||||
func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
|
||||
|
||||
FuncFrame frame;
|
||||
frame.init(func);
|
||||
frame.addDirtyRegs(a, b, c, d);
|
||||
frame.finalize();
|
||||
|
||||
cc.emitProlog(frame);
|
||||
generateGpSequenceInternal(cc, a, b, c, d);
|
||||
cc.emitEpilog(frame);
|
||||
}
|
||||
else {
|
||||
generateGpSequenceInternal(cc, a, b, c, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename EmitterFn>
|
||||
static void benchmarkA32Function(Arch arch, uint32_t numIterations, const char* description, const EmitterFn& emitterFn) noexcept {
|
||||
CodeHolder code;
|
||||
printf("%s:\n", description);
|
||||
|
||||
uint32_t instCount = 0;
|
||||
|
||||
#ifndef ASMJIT_NO_BUILDER
|
||||
instCount = asmjit_perf_utils::calculateInstructionCount<a32::Builder>(code, arch, [&](a32::Builder& emitter) {
|
||||
emitterFn(emitter, false);
|
||||
});
|
||||
#endif
|
||||
|
||||
asmjit_perf_utils::bench<a32::Assembler>(code, arch, numIterations, "[raw]", instCount, [&](a32::Assembler& emitter) {
|
||||
emitterFn(emitter, false);
|
||||
});
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void benchmarkA32Emitters(uint32_t numIterations) {
|
||||
static const char description[] = "GpSequence (Sequence of GP instructions)";
|
||||
benchmarkA32Function(Arch::kARM, numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
|
||||
generateGpSequence(emitter, emitPrologEpilog);
|
||||
});
|
||||
}
|
||||
|
||||
#endif // !ASMJIT_NO_AARCH32
|
||||
Reference in New Issue
Block a user