From b473c18d6e6bd7e2aed1c988f9e6a395a192057a Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sat, 28 Mar 2026 20:44:19 +0100 Subject: [PATCH 01/68] [android] Remove unused framepacing strings (#3795) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3795 Reviewed-by: CamilleLaVey Co-authored-by: PavelBARABANOV Co-committed-by: PavelBARABANOV --- src/android/app/src/main/res/values-ar/strings.xml | 9 --------- src/android/app/src/main/res/values-cs/strings.xml | 2 -- src/android/app/src/main/res/values-es/strings.xml | 9 --------- src/android/app/src/main/res/values-ru/strings.xml | 9 --------- src/android/app/src/main/res/values-uk/strings.xml | 9 --------- .../app/src/main/res/values-zh-rCN/strings.xml | 9 --------- src/android/app/src/main/res/values/arrays.xml | 14 -------------- src/android/app/src/main/res/values/strings.xml | 9 --------- 8 files changed, 70 deletions(-) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 2a3d430716..577b88396b 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -473,8 +473,6 @@ يتحكم في وضع محاكاة وحدة معالجة الرسومات. تعمل معظم الألعاب بشكل جيد مع وضعي سريع أو متوازن، لكن الوضع الدقيق لا يزال مطلوبًا لبعض الألعاب. تميل الجسيمات إلى العرض بشكل صحيح فقط عند استخدام الوضع الدقيق. دقة DMA يتحكم في دقة DMA. يمكن أن تؤدي الدقة الآمنة إلى حل المشكلات في بعض الألعاب، ولكنها قد تؤثر أيضًا على الأداء في بعض الحالات. إذا لم تكن متأكدًا، فاترك هذا الخيار على الإعداد الافتراضي. - وضع توقيت الإطارات - يتحكم في كيفية إدارة المحاكي لسرعة الإطارات لتقليل التقطع وجعل معدل الإطارات أكثر سلاسة واتساقًا. تصفية متباينة الخواص يحسن جودة الأنسجة عند عرضها بزوايا مائلة وضع استخدام ذاكرة VRAM @@ -999,13 +997,6 @@ غير آمن آمن - - تلقائي - 30 إطارًا في الثانية - 60 إطارًا في الثانية - 90 إطارًا في الثانية - 120 إطارًا في الثانية - غير مضغوط diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 979f1dd707..f42e743173 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -452,8 +452,6 @@ Určuje režim emulovaného GPU. Většina her běží bez problémů v rychlém, nebo vyváženém režimu, ale některé stále vyžadují přesný režim. Částicové efekty se většinou zobrazují korektně pouze v přesném režimu. Přesnost DMA Ovládá přesnost DMA. Bezpečná přesnost může vyřešit problémy v některých hrách, ale v některých případech může také ovlivnit výkon. Pokud si nejste jisti, použijte výchozí nastavení. - Režim Framepacingu - Řídí způsob jakým emulátor spravuje časování snímku aby snížil trhání a zlepšení plynulost a stabilitu snímkové frekvence. Anizotropní filtrování Zlepšuje kvalitu textur při pohledu pod úhlem Režim využití VRAM diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 0b3955ac4b..f9d921745e 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -467,8 +467,6 @@ Controla el modo de la emulación de la GPU. La mayoría de los juegos se renderizan correctamente en los modos Rápido o Equilibrado, pero algunos requieren Preciso. Las partículas tienden a renderizarse correctamente solo con el modo Preciso. Precisión de DMA Controla la precisión de DMA. La precisión segura puede solucionar problemas en algunos juegos, pero también puede afectar al rendimiento en algunos casos. Si no está seguro, déjelo en Predeterminado. - Modo de ritmo de fotogramas - Controla cómo el emulador gestiona el ritmo de los fotogramas para reducir los tirones y hacer que la velocidad de los fotogramas sea más suave y consistente. Filtrado anisotrópico Mejora la calidad de las texturas al ser observadas desde ángulos oblicuos Modo de uso de VRAM @@ -993,13 +991,6 @@ Inseguro Seguro - - Automático - 30 FPS - 60 FPS - 90 FPS - 120 FPS - Sin compresión diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 2a6c559cf2..718b2da696 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -468,8 +468,6 @@ Управляет режимом эмуляции графического процессора. Большинство игр нормально отображаются в режимах «Быстрый» или «Сбалансированный», но для некоторых требуется режим «Точный». Частицы обычно корректно отображаются только в режиме «Точный». Точность DMA Управляет точностью DMA. Безопасная точность может исправить проблемы в некоторых играх, но в некоторых случаях также может повлиять на производительность. Если не уверены, оставьте значение По умолчанию. - Режим синхронизации кадров - Управляет синхронизацией кадров в эмуляторе для уменьшения рывков и обеспечения более плавной и стабильной частоты кадров. Анизотропная фильтрация Улучшает качество текстур под углом Режим VRAM @@ -994,13 +992,6 @@ Небезопасно Безопасный - - Авто - 30 FPS - 60 FPS - 90 FPS - 120 FPS - Без сжатия diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 1f78a85773..5f1dbd8e28 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -469,8 +469,6 @@ Керує режимом емуляції ГП. Більшість ігор добре візуалізуються з режимами «Швидко» або «Збалансовано», але деякі ігри можуть потребувати режиму «Точно». Частинки зазвичай правильно візуалізуються лише з режимом «Точно». Точність DMA Керує точністю DMA. Безпечна точність може виправити проблеми в деяких іграх, але в деяких випадках також може вплинути на продуктивність. Якщо не впевнені, залиште це значення за замовчуванням. - Режим виведення кадрів - Керує тим, як емулятор виконує виведення кадрів, щоб зменшити затримки й забезпечити плавнішу й стабільнішу частоту кадрів. Анізотропне фільтрування Покращує якість текстур під кутом. Режим використання VRAM @@ -995,13 +993,6 @@ Небезпечно Безпечно - - Автоматично - 30 к/с - 60 к/с - 90 к/с - 120 к/с - Без стиснення diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index bb5fe53596..beda261a2e 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -462,8 +462,6 @@ 控制 GPU 模拟的精确度。大部分游戏在性能或平衡模式下可以正常渲染,但部分游戏需要设置为精确。粒子效果通常只有在精确模式下才能正确显示。 DMA 精度 控制 DMA 精度。安全精度可以修复某些游戏中的问题,但在某些情况下也可能影响性能。如果不确定,请保留为“默认”。 - 帧同步模式 - 控制模拟器如何管理帧同步,以减少卡顿,使帧率表现更加平稳顺滑。 各向异性过滤 提高斜角的纹理质量 显存使用模式 @@ -988,13 +986,6 @@ 不安全 安全 - - 自动 - 30 FPS - 60 FPS - 90 FPS - 120 FPS - 不压缩 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 565decb390..9f787ab00c 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -533,20 +533,6 @@ 2 - - @string/frame_pacing_mode_target_Auto - @string/frame_pacing_mode_target_30 - @string/frame_pacing_mode_target_60 - @string/frame_pacing_mode_target_90 - @string/frame_pacing_mode_target_120 - - - 0 - 1 - 2 - 3 - 4 - @string/applet_hle diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 343cc4b21a..74c5bcd276 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -479,8 +479,6 @@ Controls the GPU emulation mode. Most games render fine with Fast or Balanced modes, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. DMA Accuracy Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. If unsure, leave this on Default. - Frame Pacing Mode - Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Anisotropic filtering Improves the quality of textures when viewed at oblique angles VRAM Usage Mode @@ -1038,13 +1036,6 @@ Unsafe Safe - - Auto - 30 FPS - 60 FPS - 90 FPS - 120 FPS - CPU GPU From 9a3af3a6a3bc76140a6d36c642a22f103c90b989 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 29 Mar 2026 01:59:45 +0100 Subject: [PATCH 02/68] [shader_recompiler] fix CBuf get/set VUUID due to using composite for U32[1], F32[1] (#3790) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3790 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- .../backend/spirv/emit_spirv_context_get_set.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index db11def7b2..378d2cd0ec 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -142,14 +142,12 @@ Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, const auto is_float = UniformDefinitions::IsFloat(member_ptr); const auto num_elements = UniformDefinitions::NumElements(member_ptr); - const std::array zero_vec{ - is_float ? ctx.Const(0.0f) : ctx.Const(0u), - is_float ? ctx.Const(0.0f) : ctx.Const(0u), - is_float ? ctx.Const(0.0f) : ctx.Const(0u), - is_float ? ctx.Const(0.0f) : ctx.Const(0u), - }; + auto const zero_const = is_float ? ctx.Const(0.0f) : ctx.Const(0u); + const std::array zero_vec{zero_const, zero_const, zero_const, zero_const}; const Id cond = ctx.OpULessThanEqual(ctx.TypeBool(), buffer_offset, ctx.Const(0xFFFFu)); - const Id zero = ctx.OpCompositeConstruct(result_type, std::span(zero_vec.data(), num_elements)); + const Id zero = num_elements > 1 + ? ctx.OpCompositeConstruct(result_type, std::span(zero_vec.data(), num_elements)) + : zero_const; return ctx.OpSelect(result_type, cond, val, zero); } From 59254cd1e7ef3bd02c6f680de5f8cbcfe99f21a4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 29 Mar 2026 13:57:49 +0200 Subject: [PATCH 03/68] [dynarmic] restore proper backtraces for A64 (#3794) trivial changes, fixes hard crashes Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3794 Reviewed-by: Maufeat Reviewed-by: MaranBr Co-authored-by: lizzie Co-committed-by: lizzie --- src/core/arm/nce/interpreter_visitor.cpp | 6 +++++- .../src/dynarmic/frontend/A64/decoder/a64.h | 7 ++++--- .../frontend/A64/translate/a64_translate.cpp | 14 ++++++++++---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/core/arm/nce/interpreter_visitor.cpp b/src/core/arm/nce/interpreter_visitor.cpp index be6fee8613..077a696cc8 100644 --- a/src/core/arm/nce/interpreter_visitor.cpp +++ b/src/core/arm/nce/interpreter_visitor.cpp @@ -773,7 +773,11 @@ std::optional MatchAndExecuteOneInstruction(Core::Memory::Memory& memory, m bool was_executed = false; auto decoder = Dynarmic::A64::Decode(instruction); - was_executed = decoder.get().call(visitor, instruction); + if (decoder) { + was_executed = decoder->get().call(visitor, instruction); + } else { + was_executed = false; + } return was_executed ? std::optional(pc + 4) : std::nullopt; } diff --git a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h index 4ac04731ea..eba9d73942 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h +++ b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h @@ -70,14 +70,15 @@ constexpr DecodeTable GetDecodeTable() { /// In practice it must always suceed, otherwise something else unrelated would have gone awry template -std::reference_wrapper> Decode(u32 instruction) { +std::optional>> Decode(u32 instruction) { alignas(64) static const auto table = GetDecodeTable(); const auto& subtable = table[detail::ToFastLookupIndex(instruction)]; auto iter = std::find_if(subtable.begin(), subtable.end(), [instruction](const auto& matcher) { return matcher.Matches(instruction); }); - DEBUG_ASSERT(iter != subtable.end()); - return std::reference_wrapper>(*iter); + return iter != subtable.end() + ? std::optional{ std::reference_wrapper>(*iter) } + : std::nullopt; } template diff --git a/src/dynarmic/src/dynarmic/frontend/A64/translate/a64_translate.cpp b/src/dynarmic/src/dynarmic/frontend/A64/translate/a64_translate.cpp index 6778d13890..4afce6bd29 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/translate/a64_translate.cpp +++ b/src/dynarmic/src/dynarmic/frontend/A64/translate/a64_translate.cpp @@ -25,7 +25,11 @@ void Translate(IR::Block& block, LocationDescriptor descriptor, MemoryReadCodeFu const u64 pc = visitor.ir.current_location->PC(); if (const auto instruction = memory_read_code(pc)) { auto decoder = Decode(*instruction); - should_continue = decoder.get().call(visitor, *instruction); + if (decoder) { + should_continue = decoder->get().call(visitor, *instruction); + } else { + should_continue = visitor.RaiseException(Exception::UnallocatedEncoding); + } } else { should_continue = visitor.RaiseException(Exception::NoExecuteFault); } @@ -45,13 +49,15 @@ bool TranslateSingleInstruction(IR::Block& block, LocationDescriptor descriptor, bool should_continue = true; auto const decoder = Decode(instruction); - should_continue = decoder.get().call(visitor, instruction); + if (decoder) { + should_continue = decoder->get().call(visitor, instruction); + } else { + should_continue = false; + } visitor.ir.current_location = visitor.ir.current_location->AdvancePC(4); block.CycleCount()++; - block.SetEndLocation(*visitor.ir.current_location); - return should_continue; } From 276dcdd8eaa5d8be4c2210cf8cf3b474512bbaf5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 30 Mar 2026 00:09:51 +0200 Subject: [PATCH 04/68] [dynarmic] fix constexpr build issue on gcc-debian-stable (#3798) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3798 Co-authored-by: lizzie Co-committed-by: lizzie --- src/dynarmic/src/dynarmic/backend/arm64/fastmem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h b/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h index 953fc3783e..8e40e81569 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/fastmem.h @@ -29,7 +29,7 @@ constexpr size_t xmrx(size_t x) noexcept { } struct DoNotFastmemMarkerHash { - [[nodiscard]] constexpr size_t operator()(const DoNotFastmemMarker& value) const noexcept { + [[nodiscard]] size_t operator()(const DoNotFastmemMarker& value) const noexcept { return xmrx(std::get<0>(value).Value() ^ u64(std::get<1>(value))); } }; From 5322bce4b86956e590ffb11faa058670f4488d70 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 30 Mar 2026 04:58:30 +0200 Subject: [PATCH 05/68] [dynarmic] fix ODR violations (#3749) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3749 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- .../arm64/emit_arm64_data_processing.cpp | 6 +-- .../backend/arm64/emit_arm64_memory.cpp | 22 ++++----- .../riscv64/emit_riscv64_data_processing.cpp | 7 ++- .../backend/x64/emit_x64_data_processing.cpp | 4 +- .../dynarmic/backend/x64/emit_x64_memory.h | 28 ++++++----- .../backend/x64/emit_x64_saturation.cpp | 48 +++++++++---------- .../dynarmic/backend/x64/emit_x64_vector.cpp | 2 + .../x64/emit_x64_vector_saturation.cpp | 38 +++++++-------- src/dynarmic/src/dynarmic/common/fp/fused.cpp | 6 +-- src/dynarmic/src/dynarmic/common/u128.cpp | 4 +- src/dynarmic/src/dynarmic/common/u128.h | 13 +---- src/dynarmic/src/dynarmic/ir/ir_emitter.h | 6 +-- src/dynarmic/src/dynarmic/ir/opcodes.h | 6 +-- src/dynarmic/src/dynarmic/ir/opcodes.inc | 5 +- src/dynarmic/src/dynarmic/ir/opt_passes.cpp | 4 +- 15 files changed, 99 insertions(+), 100 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp index ef21fd45bd..6e4ce06eb6 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -642,7 +642,7 @@ void EmitIR(oaknut::CodeGenerator& code, Emi } template<> -void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { +void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { const auto carry_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp); auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -708,7 +708,7 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& } template<> -void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { +void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto& operand_arg = args[0]; auto& shift_arg = args[1]; diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp index 67ab61f8a3..b7ea792a38 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp @@ -209,9 +209,9 @@ void CallbackOnlyEmitExclusiveWriteMemory(oaknut::CodeGenerator& code, EmitConte ctx.reg_alloc.DefineAsRegister(inst, X0); } -constexpr size_t page_bits = 12; -constexpr size_t page_size = 1 << page_bits; -constexpr size_t page_mask = (1 << page_bits) - 1; +constexpr size_t page_table_const_bits = 12; +constexpr size_t page_table_const_size = 1 << page_table_const_bits; +constexpr size_t page_table_const_mask = (1 << page_table_const_bits) - 1; // This function may use Xscratch0 as a scratch register // Trashes NZCV @@ -242,28 +242,28 @@ void EmitDetectMisalignedVAddr(oaknut::CodeGenerator& code, EmitContext& ctx, oa code.TST(Xaddr, align_mask); code.B(NE, *fallback); } else { - // If (addr & page_mask) > page_size - byte_size, use fallback. - code.AND(Xscratch0, Xaddr, page_mask); - code.CMP(Xscratch0, page_size - bitsize / 8); + // If (addr & page_table_const_mask) > page_table_const_size - byte_size, use fallback. + code.AND(Xscratch0, Xaddr, page_table_const_mask); + code.CMP(Xscratch0, page_table_const_size - bitsize / 8); code.B(HI, *fallback); } } -// Outputs Xscratch0 = page_table[addr >> page_bits] +// Outputs Xscratch0 = page_table[addr >> page_table_const_bits] // May use Xscratch1 as scratch register // Address to read/write = [ret0 + ret1], ret0 is always Xscratch0 and ret1 is either Xaddr or Xscratch1 // Trashes NZCV template std::pair InlinePageTableEmitVAddrLookup(oaknut::CodeGenerator& code, EmitContext& ctx, oaknut::XReg Xaddr, const SharedLabel& fallback) { - const size_t valid_page_index_bits = ctx.conf.page_table_address_space_bits - page_bits; + const size_t valid_page_index_bits = ctx.conf.page_table_address_space_bits - page_table_const_bits; const size_t unused_top_bits = 64 - ctx.conf.page_table_address_space_bits; EmitDetectMisalignedVAddr(code, ctx, Xaddr, fallback); if (ctx.conf.silently_mirror_page_table || unused_top_bits == 0) { - code.UBFX(Xscratch0, Xaddr, page_bits, valid_page_index_bits); + code.UBFX(Xscratch0, Xaddr, page_table_const_bits, valid_page_index_bits); } else { - code.LSR(Xscratch0, Xaddr, page_bits); + code.LSR(Xscratch0, Xaddr, page_table_const_bits); code.TST(Xscratch0, u64(~u64(0)) << valid_page_index_bits); code.B(NE, *fallback); } @@ -283,7 +283,7 @@ std::pair InlinePageTableEmitVAddrLookup(oaknut::Cod if (ctx.conf.absolute_offset_page_table) { return std::make_pair(Xscratch0, Xaddr); } - code.AND(Xscratch1, Xaddr, page_mask); + code.AND(Xscratch1, Xaddr, page_table_const_mask); return std::make_pair(Xscratch0, Xscratch1); } diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64_data_processing.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64_data_processing.cpp index 51ed027a05..114147e018 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64_data_processing.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/emit_riscv64_data_processing.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2024 MerryMage * SPDX-License-Identifier: 0BSD @@ -164,12 +167,12 @@ void EmitIR(biscuit::Assembler&, EmitContext } template<> -void EmitIR(biscuit::Assembler&, EmitContext&, IR::Inst*) { +void EmitIR(biscuit::Assembler&, EmitContext&, IR::Inst*) { UNIMPLEMENTED(); } template<> -void EmitIR(biscuit::Assembler&, EmitContext&, IR::Inst*) { +void EmitIR(biscuit::Assembler&, EmitContext&, IR::Inst*) { UNIMPLEMENTED(); } diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_data_processing.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_data_processing.cpp index f2af4e5b80..38e107fb13 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_data_processing.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_data_processing.cpp @@ -663,7 +663,7 @@ void EmitX64::EmitArithmeticShiftRight64(EmitContext& ctx, IR::Inst* inst) { } } -void EmitX64::EmitRotateRight32(EmitContext& ctx, IR::Inst* inst) { +void EmitX64::EmitBitRotateRight32(EmitContext& ctx, IR::Inst* inst) { const auto carry_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp); auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -736,7 +736,7 @@ void EmitX64::EmitRotateRight32(EmitContext& ctx, IR::Inst* inst) { } } -void EmitX64::EmitRotateRight64(EmitContext& ctx, IR::Inst* inst) { +void EmitX64::EmitBitRotateRight64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto& operand_arg = args[0]; auto& shift_arg = args[1]; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 211f620ceb..b354efcb51 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -6,6 +6,8 @@ * SPDX-License-Identifier: 0BSD */ +#pragma once + #include #include "dynarmic/backend/x64/xbyak.h" @@ -22,9 +24,9 @@ namespace { using namespace Xbyak::util; -constexpr size_t page_bits = 12; -constexpr size_t page_size = 1 << page_bits; -constexpr size_t page_mask = (1 << page_bits) - 1; +constexpr size_t page_table_const_bits = 12; +constexpr size_t page_table_const_size = 1 << page_table_const_bits; +constexpr size_t page_table_const_mask = (1 << page_table_const_bits) - 1; template void EmitDetectMisalignedVAddr(BlockOfCode& code, EmitContext& ctx, size_t bitsize, Xbyak::Label& abort, Xbyak::Reg64 vaddr, Xbyak::Reg64 tmp) { @@ -50,7 +52,7 @@ void EmitDetectMisalignedVAddr(BlockOfCode& code, EmitContext& ctx, size_t bitsi code.test(vaddr, align_mask); if (ctx.conf.only_detect_misalignment_via_page_table_on_page_boundary) { - const u32 page_align_mask = static_cast(page_size - 1) & ~align_mask; + const u32 page_align_mask = static_cast(page_table_const_size - 1) & ~align_mask; SharedLabel detect_boundary = GenSharedLabel(), resume = GenSharedLabel(); @@ -83,7 +85,7 @@ template<> // TODO: This code assumes vaddr has been zext from 32-bits to 64-bits. code.mov(tmp, vaddr.cvt32()); - code.shr(tmp, int(page_bits)); + code.shr(tmp, int(page_table_const_bits)); code.shl(tmp, int(ctx.conf.page_table_log2_stride)); code.mov(page, qword[r14 + tmp.cvt64()]); if (ctx.conf.page_table_pointer_mask_bits == 0) { @@ -96,13 +98,13 @@ template<> return page + vaddr; } code.mov(tmp, vaddr.cvt32()); - code.and_(tmp, static_cast(page_mask)); + code.and_(tmp, static_cast(page_table_const_mask)); return page + tmp.cvt64(); } template<> [[maybe_unused]] Xbyak::RegExp EmitVAddrLookup(BlockOfCode& code, A64EmitContext& ctx, size_t bitsize, Xbyak::Label& abort, Xbyak::Reg64 vaddr) { - const size_t valid_page_index_bits = ctx.conf.page_table_address_space_bits - page_bits; + const size_t valid_page_index_bits = ctx.conf.page_table_address_space_bits - page_table_const_bits; const size_t unused_top_bits = 64 - ctx.conf.page_table_address_space_bits; const Xbyak::Reg64 page = ctx.reg_alloc.ScratchGpr(code); @@ -112,29 +114,29 @@ template<> if (unused_top_bits == 0) { code.mov(tmp, vaddr); - code.shr(tmp, int(page_bits)); + code.shr(tmp, int(page_table_const_bits)); } else if (ctx.conf.silently_mirror_page_table) { if (valid_page_index_bits >= 32) { if (code.HasHostFeature(HostFeature::BMI2)) { const Xbyak::Reg64 bit_count = ctx.reg_alloc.ScratchGpr(code); code.mov(bit_count, unused_top_bits); code.bzhi(tmp, vaddr, bit_count); - code.shr(tmp, int(page_bits)); + code.shr(tmp, int(page_table_const_bits)); ctx.reg_alloc.Release(bit_count); } else { code.mov(tmp, vaddr); code.shl(tmp, int(unused_top_bits)); - code.shr(tmp, int(unused_top_bits + page_bits)); + code.shr(tmp, int(unused_top_bits + page_table_const_bits)); } } else { code.mov(tmp, vaddr); - code.shr(tmp, int(page_bits)); + code.shr(tmp, int(page_table_const_bits)); code.and_(tmp, u32((1 << valid_page_index_bits) - 1)); } } else { ASSERT(valid_page_index_bits < 32); code.mov(tmp, vaddr); - code.shr(tmp, int(page_bits)); + code.shr(tmp, int(page_table_const_bits)); code.test(tmp, u32(-(1 << valid_page_index_bits))); code.jnz(abort, code.T_NEAR); } @@ -151,7 +153,7 @@ template<> return page + vaddr; } code.mov(tmp, vaddr); - code.and_(tmp, static_cast(page_mask)); + code.and_(tmp, static_cast(page_table_const_mask)); return page + tmp; } diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp index 63827979df..4c9ea821cc 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp @@ -25,12 +25,12 @@ using namespace Xbyak::util; namespace { -enum class Op { +enum class SaturationOp { Add, Sub, }; -template +template void EmitSignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -51,7 +51,7 @@ void EmitSignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) // overflow now contains 0x7F... if a was positive, or 0x80... if a was negative - if constexpr (op == Op::Add) { + if constexpr (op == SaturationOp::Add) { code.add(result, addend); } else { code.sub(result, addend); @@ -75,16 +75,16 @@ void EmitSignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) ctx.reg_alloc.DefineValue(code, inst, result); } -template +template void EmitUnsignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); Xbyak::Reg op_result = ctx.reg_alloc.UseScratchGpr(code, args[0]).changeBit(size); Xbyak::Reg addend = ctx.reg_alloc.UseScratchGpr(code, args[1]).changeBit(size); - constexpr u64 boundary = op == Op::Add ? (std::numeric_limits>::max)() : 0; + constexpr u64 boundary = op == SaturationOp::Add ? (std::numeric_limits>::max)() : 0; - if constexpr (op == Op::Add) { + if constexpr (op == SaturationOp::Add) { code.add(op_result, addend); } else { code.sub(op_result, addend); @@ -106,11 +106,11 @@ void EmitUnsignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst } // anonymous namespace void EmitX64::EmitSignedSaturatedAddWithFlag32(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedSubWithFlag32(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturation(EmitContext& ctx, IR::Inst* inst) { @@ -192,19 +192,19 @@ void EmitX64::EmitUnsignedSaturation(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitSignedSaturatedAdd8(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedAdd16(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedAdd32(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedAdd64(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedDoublingMultiplyReturnHigh16(EmitContext& ctx, IR::Inst* inst) { @@ -256,51 +256,51 @@ void EmitX64::EmitSignedSaturatedDoublingMultiplyReturnHigh32(EmitContext& ctx, } void EmitX64::EmitSignedSaturatedSub8(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedSub16(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedSub32(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitSignedSaturatedSub64(EmitContext& ctx, IR::Inst* inst) { - EmitSignedSaturatedOp(code, ctx, inst); + EmitSignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedAdd8(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedAdd16(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedAdd32(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedAdd64(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedSub8(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedSub16(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedSub32(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } void EmitX64::EmitUnsignedSaturatedSub64(EmitContext& ctx, IR::Inst* inst) { - EmitUnsignedSaturatedOp(code, ctx, inst); + EmitUnsignedSaturatedOp(code, ctx, inst); } } // namespace Dynarmic::Backend::X64 diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp index d94f0329f8..a0fd944041 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp @@ -5854,3 +5854,5 @@ void EmitX64::EmitZeroVector(EmitContext& ctx, IR::Inst* inst) { } } // namespace Dynarmic::Backend::X64 + +#undef ICODE diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_saturation.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_saturation.cpp index 03ded4066d..f0b02169d7 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_saturation.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -52,12 +52,12 @@ void EmitVectorSaturatedNative(BlockOfCode& code, EmitContext& ctx, IR::Inst* in ctx.reg_alloc.DefineValue(code, inst, result); } -enum class Op { +enum class VectorSaturationOp { Add, Sub, }; -template +template void EmitVectorSignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { static_assert(esize == 32 || esize == 64); constexpr u64 msb_mask = esize == 32 ? 0x8000000080000000 : 0x8000000000000000; @@ -72,7 +72,7 @@ void EmitVectorSignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* in code.movaps(xmm0, operand1); - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { ICODE(vpadd)(result, operand1, operand2); code.vpternlogd(xmm0, result, operand2, 0b00100100); } else { @@ -102,7 +102,7 @@ void EmitVectorSignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* in const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { ICODE(vpadd)(result, operand1, operand2); } else { ICODE(vpsub)(result, operand1, operand2); @@ -112,7 +112,7 @@ void EmitVectorSignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* in } else { code.movaps(xmm0, operand1); code.movaps(tmp, operand1); - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { ICODE(padd)(result, operand2); } else { ICODE(psub)(result, operand2); @@ -121,7 +121,7 @@ void EmitVectorSignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* in code.pxor(tmp, result); } - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { code.pandn(xmm0, tmp); } else { code.pand(xmm0, tmp); @@ -165,7 +165,7 @@ void EmitVectorSignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* in } } -template +template void EmitVectorUnsignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { static_assert(esize == 32 || esize == 64); @@ -177,7 +177,7 @@ void EmitVectorUnsignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Reg8 overflow = ctx.reg_alloc.ScratchGpr(code).cvt8(); - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { ICODE(vpadd)(result, operand1, operand2); ICODE(vpcmpu)(k1, result, operand1, CmpInt::LessThan); ICODE(vpternlog)(result | k1, result, result, u8(0xFF)); @@ -201,7 +201,7 @@ void EmitVectorUnsignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* const Xbyak::Reg8 overflow = ctx.reg_alloc.ScratchGpr(code).cvt8(); const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { if (code.HasHostFeature(HostFeature::AVX)) { code.vpxor(xmm0, operand1, operand2); code.vpand(tmp, operand1, operand2); @@ -250,7 +250,7 @@ void EmitVectorUnsignedSaturated(BlockOfCode& code, EmitContext& ctx, IR::Inst* code.setnz(overflow); code.or_(code.byte[code.ABI_JIT_PTR + code.GetJitStateInfo().offsetof_fpsr_qc], overflow); - if constexpr (op == Op::Add) { + if constexpr (op == VectorSaturationOp::Add) { code.por(result, tmp); ctx.reg_alloc.DefineValue(code, inst, result); } else { @@ -270,11 +270,11 @@ void EmitX64::EmitVectorSignedSaturatedAdd16(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitVectorSignedSaturatedAdd32(EmitContext& ctx, IR::Inst* inst) { - EmitVectorSignedSaturated(code, ctx, inst); + EmitVectorSignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorSignedSaturatedAdd64(EmitContext& ctx, IR::Inst* inst) { - EmitVectorSignedSaturated(code, ctx, inst); + EmitVectorSignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorSignedSaturatedSub8(EmitContext& ctx, IR::Inst* inst) { @@ -286,11 +286,11 @@ void EmitX64::EmitVectorSignedSaturatedSub16(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitVectorSignedSaturatedSub32(EmitContext& ctx, IR::Inst* inst) { - EmitVectorSignedSaturated(code, ctx, inst); + EmitVectorSignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorSignedSaturatedSub64(EmitContext& ctx, IR::Inst* inst) { - EmitVectorSignedSaturated(code, ctx, inst); + EmitVectorSignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorUnsignedSaturatedAdd8(EmitContext& ctx, IR::Inst* inst) { @@ -302,11 +302,11 @@ void EmitX64::EmitVectorUnsignedSaturatedAdd16(EmitContext& ctx, IR::Inst* inst) } void EmitX64::EmitVectorUnsignedSaturatedAdd32(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedSaturated(code, ctx, inst); + EmitVectorUnsignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorUnsignedSaturatedAdd64(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedSaturated(code, ctx, inst); + EmitVectorUnsignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorUnsignedSaturatedSub8(EmitContext& ctx, IR::Inst* inst) { @@ -318,11 +318,11 @@ void EmitX64::EmitVectorUnsignedSaturatedSub16(EmitContext& ctx, IR::Inst* inst) } void EmitX64::EmitVectorUnsignedSaturatedSub32(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedSaturated(code, ctx, inst); + EmitVectorUnsignedSaturated(code, ctx, inst); } void EmitX64::EmitVectorUnsignedSaturatedSub64(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedSaturated(code, ctx, inst); + EmitVectorUnsignedSaturated(code, ctx, inst); } } // namespace Dynarmic::Backend::X64 diff --git a/src/dynarmic/src/dynarmic/common/fp/fused.cpp b/src/dynarmic/src/dynarmic/common/fp/fused.cpp index a965575a5a..d16eb44791 100644 --- a/src/dynarmic/src/dynarmic/common/fp/fused.cpp +++ b/src/dynarmic/src/dynarmic/common/fp/fused.cpp @@ -35,7 +35,7 @@ FPUnpacked FusedMulAdd(FPUnpacked addend, FPUnpacked op1, FPUnpacked op2) { return std::make_tuple(exponent, value); }(); - if (product_value == 0) { + if (product_value == u128(0, 0)) { return addend; } @@ -55,13 +55,13 @@ FPUnpacked FusedMulAdd(FPUnpacked addend, FPUnpacked op1, FPUnpacked op2) { } // addend < product - const u128 result = product_value + StickyLogicalShiftRight(addend.mantissa, exp_diff - normalized_point_position); + const u128 result = product_value + StickyLogicalShiftRight(u128(addend.mantissa, 0), exp_diff - normalized_point_position); return ReduceMantissa(product_sign, product_exponent, result); } // Subtraction - const u128 addend_long = u128(addend.mantissa) << normalized_point_position; + const u128 addend_long = u128(addend.mantissa, 0) << normalized_point_position; bool result_sign; u128 result; diff --git a/src/dynarmic/src/dynarmic/common/u128.cpp b/src/dynarmic/src/dynarmic/common/u128.cpp index fb7de7a495..541e009b23 100644 --- a/src/dynarmic/src/dynarmic/common/u128.cpp +++ b/src/dynarmic/src/dynarmic/common/u128.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -137,7 +137,7 @@ u128 StickyLogicalShiftRight(u128 operand, int amount) { } if (operand.lower != 0 || operand.upper != 0) { - return u128(1); + return u128(1, 0); } return {}; } diff --git a/src/dynarmic/src/dynarmic/common/u128.h b/src/dynarmic/src/dynarmic/common/u128.h index 363c8dfec4..4fa842b3cd 100644 --- a/src/dynarmic/src/dynarmic/common/u128.h +++ b/src/dynarmic/src/dynarmic/common/u128.h @@ -22,22 +22,13 @@ struct u128 { u128(u128&&) = default; u128& operator=(const u128&) = default; u128& operator=(u128&&) = default; - - u128(u64 lower_, u64 upper_) - : lower(lower_), upper(upper_) {} - - template - /* implicit */ u128(T value) - : lower(value), upper(0) { - static_assert(std::is_integral_v); - static_assert(mcl::bitsizeof <= mcl::bitsizeof); - } + explicit u128(u64 lower_, u64 upper_) : lower(lower_), upper(upper_) {} u64 lower = 0; u64 upper = 0; template - bool Bit() const { + [[nodiscard]] inline bool Bit() const { static_assert(bit_position < 128); if constexpr (bit_position < 64) { return mcl::bit::get_bit(lower); diff --git a/src/dynarmic/src/dynarmic/ir/ir_emitter.h b/src/dynarmic/src/dynarmic/ir/ir_emitter.h index 37f7c18065..ed95c8b5be 100644 --- a/src/dynarmic/src/dynarmic/ir/ir_emitter.h +++ b/src/dynarmic/src/dynarmic/ir/ir_emitter.h @@ -228,7 +228,7 @@ public: } ResultAndCarry RotateRight(const U32& value_in, const U8& shift_amount, const U1& carry_in) { - const auto result = Inst(Opcode::RotateRight32, value_in, shift_amount, carry_in); + const auto result = Inst(Opcode::BitRotateRight32, value_in, shift_amount, carry_in); const auto carry_out = Inst(Opcode::GetCarryFromOp, result); return {result, carry_out}; } @@ -265,9 +265,9 @@ public: U32U64 RotateRight(const U32U64& value_in, const U8& shift_amount) { if (value_in.GetType() == Type::U32) { - return Inst(Opcode::RotateRight32, value_in, shift_amount, Imm1(0)); + return Inst(Opcode::BitRotateRight32, value_in, shift_amount, Imm1(0)); } else { - return Inst(Opcode::RotateRight64, value_in, shift_amount); + return Inst(Opcode::BitRotateRight64, value_in, shift_amount); } } diff --git a/src/dynarmic/src/dynarmic/ir/opcodes.h b/src/dynarmic/src/dynarmic/ir/opcodes.h index 5886eb6a20..cb0c2db8a4 100644 --- a/src/dynarmic/src/dynarmic/ir/opcodes.h +++ b/src/dynarmic/src/dynarmic/ir/opcodes.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -45,8 +45,8 @@ constexpr bool IsArithmeticShift(const Opcode op) noexcept { /// @brief Determines whether or not this instruction performs a logical shift. constexpr bool IsCircularShift(const Opcode op) noexcept { - return op == Opcode::RotateRight32 - || op == Opcode::RotateRight64 + return op == Opcode::BitRotateRight32 + || op == Opcode::BitRotateRight64 || op == Opcode::RotateRightExtended; } diff --git a/src/dynarmic/src/dynarmic/ir/opcodes.inc b/src/dynarmic/src/dynarmic/ir/opcodes.inc index b05220834d..6f57f278a3 100644 --- a/src/dynarmic/src/dynarmic/ir/opcodes.inc +++ b/src/dynarmic/src/dynarmic/ir/opcodes.inc @@ -46,8 +46,9 @@ OPCODE(LogicalShiftRight32, U32, U32, OPCODE(LogicalShiftRight64, U64, U64, U8 ) OPCODE(ArithmeticShiftRight32, U32, U32, U8, U1 ) OPCODE(ArithmeticShiftRight64, U64, U64, U8 ) -OPCODE(RotateRight32, U32, U32, U8, U1 ) -OPCODE(RotateRight64, U64, U64, U8 ) +// windows.h defines RotateRight64 and RotateRight32 +OPCODE(BitRotateRight32, U32, U32, U8, U1 ) +OPCODE(BitRotateRight64, U64, U64, U8 ) OPCODE(RotateRightExtended, U32, U32, U1 ) OPCODE(LogicalShiftLeftMasked32, U32, U32, U32 ) OPCODE(LogicalShiftLeftMasked64, U64, U64, U64 ) diff --git a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp index ee29081d4d..999d4c49bc 100644 --- a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp +++ b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp @@ -1072,12 +1072,12 @@ static void ConstantPropagation(IR::Block& block) { ReplaceUsesWith(inst, false, Safe::ArithmeticShiftRight(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); } break; - case Op::RotateRight32: + case Op::BitRotateRight32: if (FoldShifts(inst)) { ReplaceUsesWith(inst, true, mcl::bit::rotate_right(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); } break; - case Op::RotateRight64: + case Op::BitRotateRight64: if (FoldShifts(inst)) { ReplaceUsesWith(inst, false, mcl::bit::rotate_right(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); } From 7a8176f63f497375450e03e839fa4067a74043a7 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 02:53:51 +0200 Subject: [PATCH 06/68] [dynarmic] implement missing SSE3 implementations (#3301) Implementations for SSE3 CPUs (prescott) Instead of fixing some of the bugs with HostCall when paired with vectors, i'll simply remove as many host calls as I can within the most used vector instructions - then just minimize their usage to memory read/writes. Emitting the raw assembly code is faster than doing a HostCall, HostCalls are VERY expensive. So this is the desired output anyways. Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3301 Reviewed-by: crueter Reviewed-by: MaranBr Reviewed-by: Maufeat Co-authored-by: lizzie Co-committed-by: lizzie --- .../dynarmic/backend/x64/emit_x64_vector.cpp | 2337 ++++++++++------- src/dynarmic/tests/A64/a64.cpp | 99 + 2 files changed, 1447 insertions(+), 989 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp index a0fd944041..6f53580997 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp @@ -38,33 +38,21 @@ template static void EmitVectorOperation(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); (code.*fn)(xmm_a, xmm_b); ctx.reg_alloc.DefineValue(code, inst, xmm_a); } -template -static void EmitAVXVectorOperation(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - - (code.*fn)(xmm_a, xmm_a, xmm_b); - - ctx.reg_alloc.DefineValue(code, inst, xmm_a); -} - template static void EmitOneArgumentFallback(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Lambda lambda) { const auto fn = static_cast*>(lambda); constexpr u32 stack_space = 2 * 16; auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm arg1 = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const arg1 = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); @@ -86,8 +74,8 @@ static void EmitOneArgumentFallbackWithSaturation(BlockOfCode& code, EmitContext const auto fn = static_cast*>(lambda); constexpr u32 stack_space = 2 * 16; auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm arg1 = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const arg1 = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); @@ -111,9 +99,9 @@ static void EmitTwoArgumentFallbackWithSaturation(BlockOfCode& code, EmitContext const auto fn = static_cast*>(lambda); constexpr u32 stack_space = 3 * 16; auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm arg1 = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm arg2 = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const arg1 = ctx.reg_alloc.UseXmm(code, args[0]); + auto const arg2 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); @@ -139,9 +127,9 @@ static void EmitTwoArgumentFallbackWithSaturationAndImmediate(BlockOfCode& code, const auto fn = static_cast*>(lambda); constexpr u32 stack_space = 2 * 16; auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm arg1 = ctx.reg_alloc.UseXmm(code, args[0]); + auto const arg1 = ctx.reg_alloc.UseXmm(code, args[0]); const u8 arg2 = args[1].GetImmediateU8(); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); @@ -166,9 +154,9 @@ static void EmitTwoArgumentFallback(BlockOfCode& code, EmitContext& ctx, IR::Ins const auto fn = static_cast*>(lambda); constexpr u32 stack_space = 3 * 16; auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm arg1 = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm arg2 = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const arg1 = ctx.reg_alloc.UseXmm(code, args[0]); + auto const arg2 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); @@ -194,7 +182,7 @@ void EmitX64::EmitVectorGetElement8(EmitContext& ctx, IR::Inst* inst) { // TODO: DefineValue directly on Argument for index == 0 - const Xbyak::Xmm source = ctx.reg_alloc.UseXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseXmm(code, args[0]); const Xbyak::Reg32 dest = ctx.reg_alloc.ScratchGpr(code).cvt32(); if (code.HasHostFeature(HostFeature::SSE41)) { @@ -218,7 +206,7 @@ void EmitX64::EmitVectorGetElement16(EmitContext& ctx, IR::Inst* inst) { // TODO: DefineValue directly on Argument for index == 0 - const Xbyak::Xmm source = ctx.reg_alloc.UseXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseXmm(code, args[0]); const Xbyak::Reg32 dest = ctx.reg_alloc.ScratchGpr(code).cvt32(); code.pextrw(dest, source, index); ctx.reg_alloc.DefineValue(code, inst, dest); @@ -234,10 +222,10 @@ void EmitX64::EmitVectorGetElement32(EmitContext& ctx, IR::Inst* inst) { const Xbyak::Reg32 dest = ctx.reg_alloc.ScratchGpr(code).cvt32(); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm source = ctx.reg_alloc.UseXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseXmm(code, args[0]); code.pextrd(dest, source, index); } else { - const Xbyak::Xmm source = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pshufd(source, source, index); code.movd(dest, source); } @@ -253,7 +241,7 @@ void EmitX64::EmitVectorGetElement64(EmitContext& ctx, IR::Inst* inst) { if (index == 0) { // TODO: DefineValue directly on Argument for index == 0 const Xbyak::Reg64 dest = ctx.reg_alloc.ScratchGpr(code).cvt64(); - const Xbyak::Xmm source = ctx.reg_alloc.UseXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseXmm(code, args[0]); code.movq(dest, source); ctx.reg_alloc.DefineValue(code, inst, dest); return; @@ -262,10 +250,10 @@ void EmitX64::EmitVectorGetElement64(EmitContext& ctx, IR::Inst* inst) { const Xbyak::Reg64 dest = ctx.reg_alloc.ScratchGpr(code).cvt64(); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm source = ctx.reg_alloc.UseXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseXmm(code, args[0]); code.pextrq(dest, source, 1); } else { - const Xbyak::Xmm source = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const source = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.punpckhqdq(source, source); code.movq(dest, source); } @@ -277,7 +265,7 @@ void EmitX64::EmitVectorSetElement8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); - const Xbyak::Xmm source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { const Xbyak::Reg8 source_elem = ctx.reg_alloc.UseGpr(code, args[2]).cvt8(); @@ -310,7 +298,7 @@ void EmitX64::EmitVectorSetElement16(EmitContext& ctx, IR::Inst* inst) { ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); - const Xbyak::Xmm source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); const Xbyak::Reg16 source_elem = ctx.reg_alloc.UseGpr(code, args[2]).cvt16(); code.pinsrw(source_vector, source_elem.cvt32(), index); @@ -322,7 +310,7 @@ void EmitX64::EmitVectorSetElement32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); - const Xbyak::Xmm source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { const Xbyak::Reg32 source_elem = ctx.reg_alloc.UseGpr(code, args[2]).cvt32(); @@ -345,7 +333,7 @@ void EmitX64::EmitVectorSetElement64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); - const Xbyak::Xmm source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { const Xbyak::Reg64 source_elem = ctx.reg_alloc.UseGpr(code, args[2]); @@ -355,7 +343,7 @@ void EmitX64::EmitVectorSetElement64(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, source_vector); } else { const Xbyak::Reg64 source_elem = ctx.reg_alloc.UseGpr(code, args[2]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movq(tmp, source_elem); @@ -369,72 +357,53 @@ void EmitX64::EmitVectorSetElement64(EmitContext& ctx, IR::Inst* inst) { } } -static void VectorAbs8(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& data) { - if (code.HasHostFeature(HostFeature::SSSE3)) { - code.pabsb(data, data); - } else { - const Xbyak::Xmm temp = ctx.reg_alloc.ScratchXmm(code); - code.pxor(temp, temp); - code.psubb(temp, data); - code.pminub(data, temp); - } -} - -static void VectorAbs16(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& data) { - if (code.HasHostFeature(HostFeature::SSSE3)) { - code.pabsw(data, data); - } else { - const Xbyak::Xmm temp = ctx.reg_alloc.ScratchXmm(code); - code.pxor(temp, temp); - code.psubw(temp, data); - code.pmaxsw(data, temp); - } -} - -static void VectorAbs32(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& data) { - if (code.HasHostFeature(HostFeature::SSSE3)) { - code.pabsd(data, data); - } else { - const Xbyak::Xmm temp = ctx.reg_alloc.ScratchXmm(code); - code.movdqa(temp, data); - code.psrad(temp, 31); - code.pxor(data, temp); - code.psubd(data, temp); - } -} - -static void VectorAbs64(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& data) { - if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - code.vpabsq(data, data); - } else { - const Xbyak::Xmm temp = ctx.reg_alloc.ScratchXmm(code); - code.pshufd(temp, data, 0b11110101); - code.psrad(temp, 31); - code.pxor(data, temp); - code.psubq(data, temp); - } -} - static void EmitVectorAbs(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); - + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); switch (esize) { case 8: - VectorAbs8(code, ctx, data); + if (code.HasHostFeature(HostFeature::SSSE3)) { + code.pabsb(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.pxor(temp, temp); + code.psubb(temp, data); + code.pminub(data, temp); + } break; case 16: - VectorAbs16(code, ctx, data); + if (code.HasHostFeature(HostFeature::SSSE3)) { + code.pabsw(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.pxor(temp, temp); + code.psubw(temp, data); + code.pmaxsw(data, temp); + } break; case 32: - VectorAbs32(code, ctx, data); + if (code.HasHostFeature(HostFeature::SSSE3)) { + code.pabsd(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(temp, data); + code.psrad(temp, 31); + code.pxor(data, temp); + code.psubd(data, temp); + } break; case 64: - VectorAbs64(code, ctx, data); + if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { + code.vpabsq(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.pshufd(temp, data, 0b11110101); + code.psrad(temp, 31); + code.pxor(data, temp); + code.psubq(data, temp); + } break; } - ctx.reg_alloc.DefineValue(code, inst, data); } @@ -477,15 +446,15 @@ void EmitX64::EmitVectorAnd(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorAndNot(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const xmm_a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.pandn(xmm_b, xmm_a); ctx.reg_alloc.DefineValue(code, inst, xmm_b); } -static void ArithmeticShiftRightByte(EmitContext& ctx, BlockOfCode& code, const Xbyak::Xmm& result, u8 shift_amount) { +static void ArithmeticShiftRightByte(EmitContext& ctx, BlockOfCode& code, auto const& result, u8 shift_amount) { if (code.HasHostFeature(HostFeature::GFNI)) { const u64 shift_matrix = shift_amount < 8 ? (0x0102040810204080 << (shift_amount * 8)) | (0x8080808080808080 >> (64 - shift_amount * 8)) @@ -494,7 +463,7 @@ static void ArithmeticShiftRightByte(EmitContext& ctx, BlockOfCode& code, const return; } - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.punpckhbw(tmp, result); code.punpcklbw(result, result); @@ -506,7 +475,7 @@ static void ArithmeticShiftRightByte(EmitContext& ctx, BlockOfCode& code, const void EmitX64::EmitVectorArithmeticShiftRight8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); ArithmeticShiftRightByte(ctx, code, result, shift_amount); @@ -517,7 +486,7 @@ void EmitX64::EmitVectorArithmeticShiftRight8(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorArithmeticShiftRight16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psraw(result, shift_amount); @@ -528,7 +497,7 @@ void EmitX64::EmitVectorArithmeticShiftRight16(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorArithmeticShiftRight32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psrad(result, shift_amount); @@ -538,14 +507,14 @@ void EmitX64::EmitVectorArithmeticShiftRight32(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorArithmeticShiftRight64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = (std::min)(args[1].GetImmediateU8(), u8(63)); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { code.vpsraq(result, result, shift_amount); } else { - const Xbyak::Xmm tmp1 = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); const u64 sign_bit = 0x80000000'00000000u >> shift_amount; @@ -660,12 +629,12 @@ void EmitX64::EmitVectorArithmeticVShift64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastLower8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX2)) { code.vpbroadcastb(a, a); code.vmovq(a, a); } else if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pxor(tmp, tmp); code.pshufb(a, tmp); code.movq(a, a); @@ -678,7 +647,7 @@ void EmitX64::EmitVectorBroadcastLower8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastLower16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pshuflw(a, a, 0); @@ -687,7 +656,7 @@ void EmitX64::EmitVectorBroadcastLower16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastLower32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pshuflw(a, a, 0b01000100); @@ -696,11 +665,11 @@ void EmitX64::EmitVectorBroadcastLower32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcast8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX2)) { code.vpbroadcastb(a, a); } else if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pxor(tmp, tmp); code.pshufb(a, tmp); } else { @@ -713,7 +682,7 @@ void EmitX64::EmitVectorBroadcast8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcast16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX2)) { code.vpbroadcastw(a, a); } else { @@ -725,7 +694,7 @@ void EmitX64::EmitVectorBroadcast16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcast32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX2)) { code.vpbroadcastd(a, a); } else { @@ -736,7 +705,7 @@ void EmitX64::EmitVectorBroadcast32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcast64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX2)) { code.vpbroadcastq(a, a); } else { @@ -747,7 +716,7 @@ void EmitX64::EmitVectorBroadcast64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElementLower8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 16); @@ -758,7 +727,7 @@ void EmitX64::EmitVectorBroadcastElementLower8(EmitContext& ctx, IR::Inst* inst) code.vpbroadcastb(a, a); code.vmovq(a, a); } else if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pxor(tmp, tmp); code.pshufb(a, tmp); code.movq(a, a); @@ -771,7 +740,7 @@ void EmitX64::EmitVectorBroadcastElementLower8(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorBroadcastElementLower16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 8); @@ -784,7 +753,7 @@ void EmitX64::EmitVectorBroadcastElementLower16(EmitContext& ctx, IR::Inst* inst void EmitX64::EmitVectorBroadcastElementLower32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 4); @@ -800,7 +769,7 @@ void EmitX64::EmitVectorBroadcastElementLower32(EmitContext& ctx, IR::Inst* inst void EmitX64::EmitVectorBroadcastElement8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 16); @@ -810,7 +779,7 @@ void EmitX64::EmitVectorBroadcastElement8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::AVX2)) { code.vpbroadcastb(a, a); } else if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pxor(tmp, tmp); code.pshufb(a, tmp); @@ -824,7 +793,7 @@ void EmitX64::EmitVectorBroadcastElement8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 8); @@ -844,7 +813,7 @@ void EmitX64::EmitVectorBroadcastElement16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 4); @@ -856,7 +825,7 @@ void EmitX64::EmitVectorBroadcastElement32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); ASSERT(args[1].IsImmediate()); const u8 index = args[1].GetImmediateU8(); ASSERT(index < 2); @@ -1043,9 +1012,9 @@ void EmitX64::EmitVectorCountLeadingZeros32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveEven8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF)); code.pand(lhs, tmp); @@ -1057,11 +1026,11 @@ void EmitX64::EmitVectorDeinterleaveEven8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveEven16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm zero = ctx.reg_alloc.ScratchXmm(code); + auto const zero = ctx.reg_alloc.ScratchXmm(code); code.pxor(zero, zero); code.pblendw(lhs, zero, 0b10101010); @@ -1082,8 +1051,8 @@ void EmitX64::EmitVectorDeinterleaveEven16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveEven32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.shufps(lhs, rhs, 0b10001000); @@ -1092,8 +1061,8 @@ void EmitX64::EmitVectorDeinterleaveEven32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveEven64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.shufpd(lhs, rhs, 0b00); @@ -1102,16 +1071,16 @@ void EmitX64::EmitVectorDeinterleaveEven64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveEvenLower8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.punpcklbw(lhs, rhs); code.pshufb(lhs, code.Const(xword, 0x0D'09'05'01'0C'08'04'00, 0x8080808080808080)); } else { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.movdqa(tmp, code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF)); code.pand(lhs, tmp); @@ -1126,15 +1095,15 @@ void EmitX64::EmitVectorDeinterleaveEvenLower8(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorDeinterleaveEvenLower16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.punpcklwd(lhs, rhs); code.pshufb(lhs, code.Const(xword, 0x0B0A'0302'0908'0100, 0x8080'8080'8080'8080)); } else { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.pslld(lhs, 16); code.psrad(lhs, 16); @@ -1152,8 +1121,8 @@ void EmitX64::EmitVectorDeinterleaveEvenLower16(EmitContext& ctx, IR::Inst* inst void EmitX64::EmitVectorDeinterleaveEvenLower32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); if (code.HasHostFeature(HostFeature::SSE41)) { // copy bytes 0:3 of rhs to lhs, zero out upper 8 bytes @@ -1168,8 +1137,8 @@ void EmitX64::EmitVectorDeinterleaveEvenLower32(EmitContext& ctx, IR::Inst* inst void EmitX64::EmitVectorDeinterleaveOdd8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.psraw(lhs, 8); code.psraw(rhs, 8); @@ -1180,8 +1149,8 @@ void EmitX64::EmitVectorDeinterleaveOdd8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveOdd16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.psrad(lhs, 16); code.psrad(rhs, 16); @@ -1192,8 +1161,8 @@ void EmitX64::EmitVectorDeinterleaveOdd16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveOdd32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.shufps(lhs, rhs, 0b11011101); @@ -1202,8 +1171,8 @@ void EmitX64::EmitVectorDeinterleaveOdd32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveOdd64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.shufpd(lhs, rhs, 0b11); @@ -1212,15 +1181,15 @@ void EmitX64::EmitVectorDeinterleaveOdd64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorDeinterleaveOddLower8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.punpcklbw(lhs, rhs); code.pshufb(lhs, code.Const(xword, 0x0F'0B'07'03'0E'0A'06'02, 0x8080808080808080)); } else { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.psraw(lhs, 8); code.psraw(rhs, 8); @@ -1234,15 +1203,15 @@ void EmitX64::EmitVectorDeinterleaveOddLower8(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorDeinterleaveOddLower16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); code.punpcklwd(lhs, rhs); code.pshufb(lhs, code.Const(xword, 0x0F0E'0706'0D0C'0504, 0x8080'8080'8080'8080)); } else { - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.psrad(lhs, 16); code.psrad(rhs, 16); @@ -1258,17 +1227,17 @@ void EmitX64::EmitVectorDeinterleaveOddLower32(EmitContext& ctx, IR::Inst* inst) auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm lhs = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const lhs = ctx.reg_alloc.UseXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseScratchXmm(code, args[1]); // copy bytes 4:7 of lhs to bytes 0:3 of rhs, zero out upper 8 bytes code.insertps(rhs, lhs, 0b01001100); ctx.reg_alloc.DefineValue(code, inst, rhs); } else { - const Xbyak::Xmm lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm rhs = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm zero = ctx.reg_alloc.ScratchXmm(code); + auto const lhs = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const rhs = ctx.reg_alloc.UseXmm(code, args[1]); + auto const zero = ctx.reg_alloc.ScratchXmm(code); code.xorps(zero, zero); code.unpcklps(lhs, rhs); @@ -1302,9 +1271,9 @@ void EmitX64::EmitVectorEqual64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pcmpeqd(xmm_a, xmm_b); code.pshufd(tmp, xmm_a, 0b10110001); @@ -1317,9 +1286,9 @@ void EmitX64::EmitVectorEqual128(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pcmpeqq(xmm_a, xmm_b); code.pshufd(tmp, xmm_a, 0b01001110); @@ -1327,9 +1296,9 @@ void EmitX64::EmitVectorEqual128(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, xmm_a); } else { - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.pcmpeqd(xmm_a, xmm_b); code.pshufd(tmp, xmm_a, 0b10110001); @@ -1353,16 +1322,16 @@ void EmitX64::EmitVectorExtract(EmitContext& ctx, IR::Inst* inst) { } if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const xmm_a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.palignr(xmm_b, xmm_a, position / 8); ctx.reg_alloc.DefineValue(code, inst, xmm_b); return; } - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.psrldq(xmm_a, position / 8); code.pslldq(xmm_b, (128 - position) / 8); @@ -1374,13 +1343,13 @@ void EmitX64::EmitVectorExtract(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorExtractLower(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 position = args[2].GetImmediateU8(); ASSERT(position % 8 == 0); if (position != 0) { - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); code.punpcklqdq(xmm_a, xmm_b); code.psrldq(xmm_a, position / 8); @@ -1405,22 +1374,33 @@ void EmitX64::EmitVectorGreaterS32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorGreaterS64(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE42)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pcmpgtq); - return; + } else { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, code.Const(xword, 0x80000000, 0x80000000)); + code.pxor(tmp0, tmp2); + code.pxor(tmp1, tmp2); + code.movdqa(tmp2, tmp0); + code.pcmpeqd(tmp0, tmp1); + code.pcmpgtd(tmp2, tmp1); + code.pshufd(tmp1, tmp0, 245); + code.pshufd(tmp3, tmp2, 160); + code.pshufd(tmp0, tmp2, 245); + code.pand(tmp1, tmp3); + code.por(tmp0, tmp1); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - for (size_t i = 0; i < result.size(); ++i) { - result[i] = (a[i] > b[i]) ? ~u64(0) : 0; - } - }); } static void EmitVectorHalvingAddSigned(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, b); code.pand(tmp, a); @@ -1459,9 +1439,9 @@ void EmitX64::EmitVectorHalvingAddS32(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorHalvingAddUnsigned(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, b); @@ -1504,12 +1484,12 @@ void EmitX64::EmitVectorHalvingAddU32(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorHalvingSubSigned(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); switch (esize) { case 8: { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, code.Const(xword, 0x8080808080808080, 0x8080808080808080)); code.pxor(a, tmp); code.pxor(b, tmp); @@ -1518,7 +1498,7 @@ static void EmitVectorHalvingSubSigned(size_t esize, EmitContext& ctx, IR::Inst* break; } case 16: { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, code.Const(xword, 0x8000800080008000, 0x8000800080008000)); code.pxor(a, tmp); code.pxor(b, tmp); @@ -1552,8 +1532,8 @@ void EmitX64::EmitVectorHalvingSubS32(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorHalvingSubUnsigned(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); switch (esize) { case 8: @@ -1590,8 +1570,8 @@ void EmitX64::EmitVectorHalvingSubU32(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorInterleaveLower(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, int size) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); switch (size) { case 8: @@ -1630,8 +1610,8 @@ void EmitX64::EmitVectorInterleaveLower64(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorInterleaveUpper(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, int size) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); switch (size) { case 8: @@ -1670,7 +1650,7 @@ void EmitX64::EmitVectorInterleaveUpper64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftLeft8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); if (shift_amount == 0) { @@ -1696,7 +1676,7 @@ void EmitX64::EmitVectorLogicalShiftLeft8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftLeft16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psllw(result, shift_amount); @@ -1707,7 +1687,7 @@ void EmitX64::EmitVectorLogicalShiftLeft16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftLeft32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.pslld(result, shift_amount); @@ -1718,7 +1698,7 @@ void EmitX64::EmitVectorLogicalShiftLeft32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftLeft64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psllq(result, shift_amount); @@ -1729,7 +1709,7 @@ void EmitX64::EmitVectorLogicalShiftLeft64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftRight8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); if (shift_amount == 0) { @@ -1753,7 +1733,7 @@ void EmitX64::EmitVectorLogicalShiftRight8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftRight16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psrlw(result, shift_amount); @@ -1764,7 +1744,7 @@ void EmitX64::EmitVectorLogicalShiftRight16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftRight32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psrld(result, shift_amount); @@ -1775,7 +1755,7 @@ void EmitX64::EmitVectorLogicalShiftRight32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorLogicalShiftRight64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); const u8 shift_amount = args[1].GetImmediateU8(); code.psrlq(result, shift_amount); @@ -1783,41 +1763,12 @@ void EmitX64::EmitVectorLogicalShiftRight64(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, result); } -template -static void EmitVectorLogicalVShiftAVX2(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - static_assert(esize == 32 || esize == 64); - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); - - // store sign bit of lowest byte of each element of b to select left/right shift later - ICODE(vpsll)(xmm0, b, u8(esize - 8)); - - // sse/avx shifts are only positive, with dedicated left/right forms - shift by lowest byte of abs(b) - code.vpabsb(b, b); - code.vpand(b, b, code.BConst(xword, 0xFF)); - - // calculate shifts - ICODE(vpsllv)(result, a, b); - ICODE(vpsrlv)(a, a, b); - - // implicit argument: xmm0 (sign of lowest byte of b) - if (esize == 32) { - code.blendvps(result, a); - } else { - code.blendvpd(result, a); - } - ctx.reg_alloc.DefineValue(code, inst, result); -} - void EmitX64::EmitVectorLogicalVShift8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW | HostFeature::GFNI)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm left_shift = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const left_shift = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Opmask negative_mask = k1; code.pxor(tmp, tmp); @@ -1862,10 +1813,10 @@ void EmitX64::EmitVectorLogicalVShift16(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm left_shift = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm right_shift = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const left_shift = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const right_shift = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.vmovdqa32(tmp, code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF)); code.vpxord(right_shift, right_shift, right_shift); @@ -1886,18 +1837,87 @@ void EmitX64::EmitVectorLogicalVShift16(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitVectorLogicalVShift32(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX2)) { - EmitVectorLogicalVShiftAVX2<32>(code, ctx, inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); + auto const mask = ctx.reg_alloc.ScratchXmm(code); + // store sign bit of lowest byte of each element of b to select left/right shift later + code.vpslld(mask, b, u8(32 - 8)); + // sse/avx shifts are only positive, with dedicated left/right forms - shift by lowest byte of abs(b) + code.vpabsb(b, b); + code.vpand(b, b, code.BConst<32>(xword, 0xFF)); + // calculate shifts + code.vpsllvd(result, a, b); + code.vpsrlvd(a, a, b); + code.vblendvps(result, result, a, mask); + ctx.reg_alloc.DefineValue(code, inst, result); } else { - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), VShift); - }); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp5 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp6 = ctx.reg_alloc.ScratchXmm(code); + code.pxor(tmp3, tmp3); + code.movdqa(tmp2, tmp0); + code.psubb(tmp3, tmp1); + code.movdqa(tmp4, tmp2); + code.movdqa(tmp6, tmp2); + code.pminub(tmp3, tmp1); + code.pslld(tmp1, 24); + code.pand(tmp3, code.Const(xword, 0x000000ff'000000ff, 0x000000ff'000000ff)); + code.psrad(tmp1, 31); + code.pshuflw(tmp0, tmp3, 254); + code.pshuflw(tmp5, tmp3, 84); + code.psrld(tmp4, tmp0); + code.movdqa(tmp0, tmp2); + code.psrld(tmp0, tmp5); + code.punpcklqdq(tmp0, tmp4); + code.pshufd(tmp4, tmp3, 238); + code.pslld(tmp3, 23); + code.paddd(tmp3, code.Const(xword, 0x3F80'00003F80'0000, 0x3F80'00003F80'0000)); + code.pshuflw(tmp5, tmp4, 254); + code.pshuflw(tmp4, tmp4, 84); + code.psrld(tmp6, tmp5); + code.movdqa(tmp5, tmp2); + code.psrld(tmp5, tmp4); + code.pshufd(tmp4, tmp2, 245); + code.punpckhqdq(tmp5, tmp6); + code.cvttps2dq(tmp3, tmp3); + code.shufps(tmp0, tmp5, 204); + code.pmuludq(tmp2, tmp3); + code.pshufd(tmp3, tmp3, 245); + code.andps(tmp0, tmp1); + code.pmuludq(tmp3, tmp4); + code.pshufd(tmp2, tmp2, 232); + code.pshufd(tmp3, tmp3, 232); + code.punpckldq(tmp2, tmp3); + code.pandn(tmp1, tmp2); + code.orps(tmp0, tmp1); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } } void EmitX64::EmitVectorLogicalVShift64(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::AVX2)) { - EmitVectorLogicalVShiftAVX2<64>(code, ctx, inst); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); + auto const mask = ctx.reg_alloc.ScratchXmm(code); + // store sign bit of lowest byte of each element of b to select left/right shift later + code.vpsllq(mask, b, u8(64 - 8)); + // sse/avx shifts are only positive, with dedicated left/right forms - shift by lowest byte of abs(b) + code.vpabsb(b, b); + code.vpand(b, b, code.BConst<64>(xword, 0xFF)); + // calculate shifts + code.vpsllvq(result, a, b); + code.vpsrlvq(a, a, b); + code.vblendvpd(result, result, a, mask); + ctx.reg_alloc.DefineValue(code, inst, result); } else { EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { std::transform(a.begin(), a.end(), b.begin(), result.begin(), VShift); @@ -1912,28 +1932,11 @@ enum class MinMaxOperation { Max, }; -// Compute the minimum/maximum of two vectors of signed 8-bit integers, using only SSE2 instructons. -// The result of the operation is placed in operand a, while b is unmodified. -void FallbackMinMaxS8(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& a, const Xbyak::Xmm& b, MinMaxOperation op) { - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); - if(op == MinMaxOperation::Min) { - code.movdqa(c, b); - code.pcmpgtb(c, a); - } else { - code.movdqa(c, a); - code.pcmpgtb(c, b); - } - - code.pand(a, c); - code.pandn(c, b); - code.por(a, c); -} - // Compute the minimum/maximum of two vectors of unsigned 16-bit integers, using only SSE2 instructons. // The result of the operation is placed in operand a, while b is unmodified. -void FallbackMinMaxU16(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& a, const Xbyak::Xmm& b, MinMaxOperation op) { +void FallbackMinMaxU16(BlockOfCode& code, EmitContext& ctx, auto const& a, auto const& b, MinMaxOperation op) { if(op == MinMaxOperation::Min) { - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.psubusw(c, b); code.psubw(a, c); @@ -1945,8 +1948,8 @@ void FallbackMinMaxU16(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& a, // Compute the minimum/maximum of two vectors of signed 32-bit integers, using only SSE2 instructons. // The result of the operation is placed in operand a, while b is unmodified. -void FallbackMinMaxS32(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& a, const Xbyak::Xmm& b, MinMaxOperation op) { - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); +void FallbackMinMaxS32(BlockOfCode& code, EmitContext& ctx, auto const& a, auto const& b, MinMaxOperation op) { + auto const c = ctx.reg_alloc.ScratchXmm(code); if(op == MinMaxOperation::Min) { code.movdqa(c, b); code.pcmpgtd(c, a); @@ -1962,12 +1965,12 @@ void FallbackMinMaxS32(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& a, // Compute the minimum/maximum of two vectors of unsigned 32-bit integers, using only SSE2 instructons. // The result of the operation is placed in operand a, while b is unmodified. -void FallbackMinMaxU32(BlockOfCode& code, EmitContext& ctx, const Xbyak::Xmm& a, const Xbyak::Xmm& b, MinMaxOperation op) { - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); +void FallbackMinMaxU32(BlockOfCode& code, EmitContext& ctx, auto const& a, auto const& b, MinMaxOperation op) { + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, code.BConst<32>(xword, 0x80000000)); // bias a and b by XORing their sign bits, then use the signed comparison function - const Xbyak::Xmm d = ctx.reg_alloc.ScratchXmm(code); + auto const d = ctx.reg_alloc.ScratchXmm(code); if(op == MinMaxOperation::Min) { code.movdqa(d, a); code.pxor(d, c); @@ -1989,11 +1992,16 @@ void EmitX64::EmitVectorMaxS8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pmaxsb); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); - FallbackMinMaxS8(code, ctx, a, b, MinMaxOperation::Max); - ctx.reg_alloc.DefineValue(code, inst, a); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const c = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(c, a); + code.pcmpgtb(c, b); + code.pand(a, c); + code.pandn(c, b); + code.por(a, c); + ctx.reg_alloc.DefineValue(code, inst, a); } } @@ -2005,31 +2013,55 @@ void EmitX64::EmitVectorMaxS32(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pmaxsd); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); - FallbackMinMaxS32(code, ctx, a, b, MinMaxOperation::Max); - ctx.reg_alloc.DefineValue(code, inst, a); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, tmp0); + code.pcmpgtd(tmp2, tmp1); + code.pand(tmp0, tmp2); + code.pandn(tmp2, tmp1); + code.por(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } } void EmitX64::EmitVectorMaxS64(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - EmitAVXVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::vpmaxsq); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + code.vpmaxsq(xmm_a, xmm_a, xmm_b); + ctx.reg_alloc.DefineValue(code, inst, xmm_a); } else if (code.HasHostFeature(HostFeature::AVX)) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); code.vpcmpgtq(xmm0, y, x); code.pblendvb(x, y); - ctx.reg_alloc.DefineValue(code, inst, x); } else { - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::max)(x, y); }); - }); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp5 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, code.Const(xword, 0x8000'0000, 0x8000'0000)); + code.movdqa(tmp3, tmp1); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp0); + code.movdqa(tmp4, tmp2); + code.pcmpeqd(tmp2, tmp3); + code.pcmpgtd(tmp4, tmp3); + code.pshufd(tmp2, tmp2, 245); + code.pshufd(tmp5, tmp4, 160); + code.pshufd(tmp3, tmp4, 245); + code.pand(tmp2, tmp5); + code.por(tmp3, tmp2); + code.pand(tmp0, tmp3); + code.pandn(tmp3, tmp1); + code.por(tmp0, tmp3); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } } @@ -2041,11 +2073,11 @@ void EmitX64::EmitVectorMaxU16(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pmaxuw); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); FallbackMinMaxU16(code, ctx, a, b, MinMaxOperation::Max); - ctx.reg_alloc.DefineValue(code, inst, a); + ctx.reg_alloc.DefineValue(code, inst, a); } } @@ -2053,35 +2085,54 @@ void EmitX64::EmitVectorMaxU32(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pmaxud); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); FallbackMinMaxU32(code, ctx, a, b, MinMaxOperation::Max); - ctx.reg_alloc.DefineValue(code, inst, a); + ctx.reg_alloc.DefineValue(code, inst, a); } } void EmitX64::EmitVectorMaxU64(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - EmitAVXVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::vpmaxuq); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + code.vpmaxuq(xmm_a, xmm_a, xmm_b); + ctx.reg_alloc.DefineValue(code, inst, xmm_a); } else if (code.HasHostFeature(HostFeature::AVX)) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.vmovdqa(xmm0, code.Const(xword, 0x8000000000000000, 0x8000000000000000)); code.vpsubq(tmp, y, xmm0); code.vpsubq(xmm0, x, xmm0); code.vpcmpgtq(xmm0, tmp, xmm0); code.pblendvb(x, y); - ctx.reg_alloc.DefineValue(code, inst, x); } else { - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::max)(x, y); }); - }); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp5 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, code.Const(xword, 0x8000000080000000, 0x8000000080000000)); + code.movdqa(tmp3, tmp1); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp0); + code.movdqa(tmp4, tmp2); + code.pcmpeqd(tmp2, tmp3); + code.pcmpgtd(tmp4, tmp3); + code.pshufd(tmp2, tmp2, 245); + code.pshufd(tmp5, tmp4, 160); + code.pshufd(tmp3, tmp4, 245); + code.pand(tmp2, tmp5); + code.por(tmp3, tmp2); + code.pand(tmp0, tmp3); + code.pandn(tmp3, tmp1); + code.por(tmp0, tmp3); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } } @@ -2089,11 +2140,16 @@ void EmitX64::EmitVectorMinS8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pminsb); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); - FallbackMinMaxS8(code, ctx, a, b, MinMaxOperation::Min); - ctx.reg_alloc.DefineValue(code, inst, a); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const c = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(c, b); + code.pcmpgtb(c, a); + code.pand(a, c); + code.pandn(c, b); + code.por(a, c); + ctx.reg_alloc.DefineValue(code, inst, a); } } @@ -2105,31 +2161,51 @@ void EmitX64::EmitVectorMinS32(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pminsd); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); FallbackMinMaxS32(code, ctx, a, b, MinMaxOperation::Min); - ctx.reg_alloc.DefineValue(code, inst, a); + ctx.reg_alloc.DefineValue(code, inst, a); } } void EmitX64::EmitVectorMinS64(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - EmitAVXVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::vpminsq); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + code.vpminsq(xmm_a, xmm_a, xmm_b); + ctx.reg_alloc.DefineValue(code, inst, xmm_a); } else if (code.HasHostFeature(HostFeature::AVX)) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.vpcmpgtq(xmm0, y, x); code.pblendvb(y, x); - ctx.reg_alloc.DefineValue(code, inst, y); } else { - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::min)(x, y); }); - }); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp5 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, code.Const(xword, 0x8000'0000, 0x8000'0000)); + code.movdqa(tmp3, tmp1); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp0); + code.movdqa(tmp4, tmp2); + code.pcmpeqd(tmp2, tmp3); + code.pcmpgtd(tmp4, tmp3); + code.pshufd(tmp3, tmp2, 245); + code.pshufd(tmp5, tmp4, 160); + code.pshufd(tmp2, tmp4, 245); + code.pand(tmp3, tmp5); + code.por(tmp2, tmp3); + code.pand(tmp1, tmp2); + code.pandn(tmp2, tmp0); + code.por(tmp2, tmp1); + //code.movdqa(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp2); } } @@ -2141,11 +2217,11 @@ void EmitX64::EmitVectorMinU16(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pminuw); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); FallbackMinMaxU16(code, ctx, a, b, MinMaxOperation::Min); - ctx.reg_alloc.DefineValue(code, inst, a); + ctx.reg_alloc.DefineValue(code, inst, a); } } @@ -2153,57 +2229,93 @@ void EmitX64::EmitVectorMinU32(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pminud); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); FallbackMinMaxU32(code, ctx, a, b, MinMaxOperation::Min); - ctx.reg_alloc.DefineValue(code, inst, a); + ctx.reg_alloc.DefineValue(code, inst, a); } } void EmitX64::EmitVectorMinU64(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - EmitAVXVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::vpminuq); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + code.vpminuq(xmm_a, xmm_a, xmm_b); + ctx.reg_alloc.DefineValue(code, inst, xmm_a); } else if (code.HasHostFeature(HostFeature::AVX)) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.vmovdqa(xmm0, code.Const(xword, 0x8000000000000000, 0x8000000000000000)); code.vpsubq(tmp, y, xmm0); code.vpsubq(xmm0, x, xmm0); code.vpcmpgtq(xmm0, tmp, xmm0); code.pblendvb(y, x); - ctx.reg_alloc.DefineValue(code, inst, y); } else { - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::min)(x, y); }); - }); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp5 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, code.Const(xword, 0x8000000080000000, 0x8000000080000000)); + code.movdqa(tmp3, tmp1); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp0); + code.movdqa(tmp4, tmp2); + code.pcmpeqd(tmp2, tmp3); + code.pcmpgtd(tmp4, tmp3); + code.pshufd(tmp3, tmp2, 245); + code.pshufd(tmp5, tmp4, 160); + code.pshufd(tmp2, tmp4, 245); + code.pand(tmp3, tmp5); + code.por(tmp2, tmp3); + code.pand(tmp1, tmp2); + code.pandn(tmp2, tmp0); + code.por(tmp2, tmp1); + //code.movdqa(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp2); } } void EmitX64::EmitVectorMultiply8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp_a = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp_b = ctx.reg_alloc.ScratchXmm(code); - - // TODO: Optimize - code.movdqa(tmp_a, a); - code.movdqa(tmp_b, b); - code.pmullw(a, b); - code.psrlw(tmp_a, 8); - code.psrlw(tmp_b, 8); - code.pmullw(tmp_a, tmp_b); - code.pand(a, code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF)); - code.psllw(tmp_a, 8); - code.por(a, tmp_a); - - ctx.reg_alloc.DefineValue(code, inst, a); + if (code.HasHostFeature(HostFeature::AVX)) { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + code.vbroadcastss(tmp3, code.Const(dword, 0x00ff'00ff)); + code.vpmullw(tmp2, tmp1, tmp0); + code.vpandn(tmp0, tmp3, tmp0); + code.vpand(tmp2, tmp2, tmp3); + code.vpmaddubsw(tmp0, tmp1, tmp0); + code.vpsllw(tmp0, tmp0, 8); + code.vpor(tmp0, tmp2, tmp0); + ctx.reg_alloc.DefineValue(code, inst, tmp0); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, tmp0); + code.movdqa(tmp3, tmp1); + code.movdqa(tmp4, code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF)); + code.punpckhbw(tmp2, tmp2); + code.punpckhbw(tmp3, tmp3); + code.punpcklbw(tmp0, tmp0); + code.punpcklbw(tmp1, tmp1); + code.pmullw(tmp3, tmp2); + code.pmullw(tmp0, tmp1); + code.pand(tmp3, tmp4); + code.pand(tmp0, tmp4); + code.packuswb(tmp0, tmp3); + ctx.reg_alloc.DefineValue(code, inst, tmp0); + } } void EmitX64::EmitVectorMultiply16(EmitContext& ctx, IR::Inst* inst) { @@ -2214,31 +2326,32 @@ void EmitX64::EmitVectorMultiply32(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::pmulld); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - - code.movdqa(tmp, a); - code.psrlq(a, 32); - code.pmuludq(tmp, b); - code.psrlq(b, 32); - code.pmuludq(a, b); - code.pshufd(tmp, tmp, 0b00001000); - code.pshufd(b, a, 0b00001000); - code.punpckldq(tmp, b); - - ctx.reg_alloc.DefineValue(code, inst, tmp); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp, a); + code.psrlq(a, 32); + code.pmuludq(tmp, b); + code.psrlq(b, 32); + code.pmuludq(a, b); + code.pshufd(tmp, tmp, 0b00001000); + code.pshufd(b, a, 0b00001000); + code.punpckldq(tmp, b); + ctx.reg_alloc.DefineValue(code, inst, tmp); } } void EmitX64::EmitVectorMultiply64(EmitContext& ctx, IR::Inst* inst) { - if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512DQ)) { - EmitAVXVectorOperation(code, ctx, inst, &Xbyak::CodeGenerator::vpmullq); - } else if (code.HasHostFeature(HostFeature::SSE41)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512DQ)) { + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + code.vpmullq(xmm_a, xmm_a, xmm_b); + ctx.reg_alloc.DefineValue(code, inst, xmm_a); + } else if (code.HasHostFeature(HostFeature::SSE41)) { + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); const Xbyak::Reg64 tmp1 = ctx.reg_alloc.ScratchGpr(code); const Xbyak::Reg64 tmp2 = ctx.reg_alloc.ScratchGpr(code); @@ -2253,29 +2366,28 @@ void EmitX64::EmitVectorMultiply64(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, a); } else { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp1 = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp2 = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); - code.movdqa(tmp1, a); - code.movdqa(tmp2, a); - code.movdqa(tmp3, b); + code.movdqa(tmp1, a); + code.movdqa(tmp2, a); + code.movdqa(tmp3, b); - code.psrlq(tmp1, 32); - code.psrlq(tmp3, 32); + code.psrlq(tmp1, 32); + code.psrlq(tmp3, 32); - code.pmuludq(tmp2, b); - code.pmuludq(tmp3, a); - code.pmuludq(b, tmp1); + code.pmuludq(tmp2, b); + code.pmuludq(tmp3, a); + code.pmuludq(b, tmp1); - code.paddq(b, tmp3); - code.psllq(b, 32); - code.paddq(tmp2, b); + code.paddq(b, tmp3); + code.psllq(b, 32); + code.paddq(tmp2, b); - ctx.reg_alloc.DefineValue(code, inst, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp2); } } @@ -2307,15 +2419,15 @@ void EmitX64::EmitVectorNarrow16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmovwb(result, a); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); code.pand(a, code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF)); @@ -2328,13 +2440,13 @@ void EmitX64::EmitVectorNarrow16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorNarrow32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmovdw(result, a); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); if (code.HasHostFeature(HostFeature::SSE41)) { code.pblendw(a, zeros, 0b10101010); @@ -2352,15 +2464,15 @@ void EmitX64::EmitVectorNarrow64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmovqd(result, a); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); code.shufps(a, zeros, 0b00001000); @@ -2373,13 +2485,13 @@ void EmitX64::EmitVectorNot(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm operand = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); + auto const operand = ctx.reg_alloc.UseXmm(code, args[0]); code.vpternlogq(result, operand, operand, u8(~Tern::c)); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.ScratchXmm(code); code.pcmpeqw(xmm_b, xmm_b); code.pxor(xmm_a, xmm_b); ctx.reg_alloc.DefineValue(code, inst, xmm_a); @@ -2393,9 +2505,9 @@ void EmitX64::EmitVectorOr(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedAddLower8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.punpcklqdq(xmm_a, xmm_b); code.movdqa(tmp, xmm_a); @@ -2411,9 +2523,9 @@ void EmitX64::EmitVectorPairedAddLower8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedAddLower16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.punpcklqdq(xmm_a, xmm_b); if (code.HasHostFeature(HostFeature::SSSE3)) { @@ -2434,9 +2546,9 @@ void EmitX64::EmitVectorPairedAddLower16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedAddLower32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.punpcklqdq(xmm_a, xmm_b); if (code.HasHostFeature(HostFeature::SSSE3)) { @@ -2456,10 +2568,10 @@ void EmitX64::EmitVectorPairedAddLower32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedAdd8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm d = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const c = ctx.reg_alloc.ScratchXmm(code); + auto const d = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.movdqa(d, b); @@ -2478,17 +2590,17 @@ void EmitX64::EmitVectorPairedAdd16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); code.phaddw(a, b); ctx.reg_alloc.DefineValue(code, inst, a); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm d = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const c = ctx.reg_alloc.ScratchXmm(code); + auto const d = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.movdqa(d, b); @@ -2508,17 +2620,17 @@ void EmitX64::EmitVectorPairedAdd32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSSE3)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); code.phaddd(a, b); ctx.reg_alloc.DefineValue(code, inst, a); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm d = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const c = ctx.reg_alloc.ScratchXmm(code); + auto const d = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.movdqa(d, b); @@ -2535,9 +2647,9 @@ void EmitX64::EmitVectorPairedAdd32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedAdd64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.punpcklqdq(a, b); @@ -2550,8 +2662,8 @@ void EmitX64::EmitVectorPairedAdd64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedAddSignedWiden8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.psllw(a, 8); @@ -2565,8 +2677,8 @@ void EmitX64::EmitVectorPairedAddSignedWiden8(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorPairedAddSignedWiden16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.pslld(a, 16); @@ -2580,18 +2692,18 @@ void EmitX64::EmitVectorPairedAddSignedWiden16(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorPairedAddSignedWiden32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.vpsraq(c, a, 32); code.vpsllq(a, a, 32); code.vpsraq(a, a, 32); code.vpaddq(a, a, c); } else { - const Xbyak::Xmm tmp1 = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp2 = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.psllq(a, 32); @@ -2613,8 +2725,8 @@ void EmitX64::EmitVectorPairedAddSignedWiden32(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorPairedAddUnsignedWiden8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.psllw(a, 8); @@ -2628,8 +2740,8 @@ void EmitX64::EmitVectorPairedAddUnsignedWiden8(EmitContext& ctx, IR::Inst* inst void EmitX64::EmitVectorPairedAddUnsignedWiden16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.pslld(a, 16); @@ -2643,8 +2755,8 @@ void EmitX64::EmitVectorPairedAddUnsignedWiden16(EmitContext& ctx, IR::Inst* ins void EmitX64::EmitVectorPairedAddUnsignedWiden32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm c = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const c = ctx.reg_alloc.ScratchXmm(code); code.movdqa(c, a); code.psllq(a, 32); @@ -2658,14 +2770,10 @@ void EmitX64::EmitVectorPairedAddUnsignedWiden32(EmitContext& ctx, IR::Inst* ins template static void PairedOperation(VectorArray& result, const VectorArray& x, const VectorArray& y, Function fn) { const size_t range = x.size() / 2; - - for (size_t i = 0; i < range; i++) { + for (size_t i = 0; i < range; i++) result[i] = fn(x[2 * i], x[2 * i + 1]); - } - - for (size_t i = 0; i < range; i++) { + for (size_t i = 0; i < range; i++) result[range + i] = fn(y[2 * i], y[2 * i + 1]); - } } template @@ -2686,11 +2794,6 @@ static void PairedMax(VectorArray& result, const VectorArray& x, const Vec PairedOperation(result, x, y, [](auto a, auto b) { return (std::max)(a, b); }); } -template -static void PairedMin(VectorArray& result, const VectorArray& x, const VectorArray& y) { - PairedOperation(result, x, y, [](auto a, auto b) { return (std::min)(a, b); }); -} - template static void LowerPairedMax(VectorArray& result, const VectorArray& x, const VectorArray& y) { LowerPairedOperation(result, x, y, [](auto a, auto b) { return (std::max)(a, b); }); @@ -2705,19 +2808,16 @@ template static void EmitVectorPairedMinMax8(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, code.Const(xword, 0x0E'0C'0A'08'06'04'02'00, 0x0F'0D'0B'09'07'05'03'01)); code.pshufb(x, tmp); code.pshufb(y, tmp); - code.movaps(tmp, x); code.shufps(tmp, y, 0b01'00'01'00); - code.shufps(x, y, 0b11'10'11'10); - if constexpr (std::is_member_function_pointer_v) { (code.*fn)(x, tmp); } else { @@ -2730,21 +2830,17 @@ static void EmitVectorPairedMinMax8(BlockOfCode& code, EmitContext& ctx, IR::Ins template static void EmitVectorPairedMinMaxLower8(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.punpcklqdq(x, y); code.pshufb(x, code.Const(xword, 0x0E'0C'0A'08'06'04'02'00, 0x0F'0D'0B'09'07'05'03'01)); code.movhlps(y, x); code.movq(x, x); - if constexpr (std::is_member_function_pointer_v) { (code.*fn)(x, y); } else { fn(x, y); } - ctx.reg_alloc.DefineValue(code, inst, x); } @@ -2752,9 +2848,9 @@ template static void EmitVectorPairedMinMax16(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); // swap idxs 1 and 2 within 64-bit lanes so that both registers contain [even, odd, even, odd]-indexed pairs of elements code.pshuflw(x, x, 0b11'01'10'00); @@ -2780,63 +2876,31 @@ static void EmitVectorPairedMinMax16(BlockOfCode& code, EmitContext& ctx, IR::In ctx.reg_alloc.DefineValue(code, inst, x); } -template -static void EmitVectorPairedMinMaxLower16(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - - // swap idxs 1 and 2 so that both registers contain even then odd-indexed pairs of elements - code.pshuflw(x, x, 0b11'01'10'00); - code.pshuflw(y, y, 0b11'01'10'00); - - // move pairs of even/odd-indexed elements into one register each - - // tmp = x[0, 2], y[0, 2], 0s... - code.movaps(tmp, y); - code.insertps(tmp, x, 0b01001100); - // x = x[1, 3], y[1, 3], 0s... - code.insertps(x, y, 0b00011100); - - (code.*fn)(x, tmp); - - ctx.reg_alloc.DefineValue(code, inst, x); -} - -static void EmitVectorPairedMinMaxLower32(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, void (Xbyak::CodeGenerator::*fn)(const Xbyak::Xmm&, const Xbyak::Operand&)) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - - // tmp = x[1], y[1], 0, 0 - code.movaps(tmp, y); - code.insertps(tmp, x, 0b01001100); - // x = x[0], y[0], 0, 0 - code.insertps(x, y, 0b00011100); - - (code.*fn)(x, tmp); - - ctx.reg_alloc.DefineValue(code, inst, x); -} void EmitX64::EmitVectorPairedMaxS8(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp, code.Const(xword, 0x0E'0C'0A'08'06'04'02'00, 0x0F'0D'0B'09'07'05'03'01)); + code.pshufb(x, tmp); + code.pshufb(y, tmp); + code.movaps(tmp, x); + code.shufps(tmp, y, 0b01'00'01'00); + code.shufps(x, y, 0b11'10'11'10); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMax8(code, ctx, inst, &Xbyak::CodeGenerator::pmaxsb); - return; - } else if (code.HasHostFeature(HostFeature::SSSE3)) { - EmitVectorPairedMinMax8(code, ctx, inst, [&](const auto& lhs, const auto& rhs) { - FallbackMinMaxS8(code, ctx, lhs, rhs, MinMaxOperation::Max); - }); - return; + code.pmaxsb(x, tmp); + } else { + auto const a = x; + auto const b = tmp; + auto const c = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(c, a); + code.pcmpgtb(c, b); + code.pand(a, c); + code.pandn(c, b); + code.por(a, c); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - PairedMax(result, a, b); - }); + ctx.reg_alloc.DefineValue(code, inst, x); } void EmitX64::EmitVectorPairedMaxS16(EmitContext& ctx, IR::Inst* inst) { @@ -2846,9 +2910,9 @@ void EmitX64::EmitVectorPairedMaxS16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMaxS32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, x); code.shufps(tmp, y, 0b10001000); @@ -2866,12 +2930,24 @@ void EmitX64::EmitVectorPairedMaxS32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMaxU8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSSE3)) { EmitVectorPairedMinMax8(code, ctx, inst, &Xbyak::CodeGenerator::pmaxub); - return; + } else { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const constant_00ff = code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF); + code.movdqa(tmp2, constant_00ff); + code.movdqa(tmp3, tmp1); + code.pand(tmp3, tmp2); + code.pand(tmp2, tmp0); + code.packuswb(tmp2, tmp3); + code.psrlw(tmp1, 8); + code.psrlw(tmp0, 8); + code.packuswb(tmp0, tmp1); + code.pmaxub(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - PairedMax(result, a, b); - }); } void EmitX64::EmitVectorPairedMaxU16(EmitContext& ctx, IR::Inst* inst) { @@ -2887,9 +2963,9 @@ void EmitX64::EmitVectorPairedMaxU16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMaxU32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, x); code.shufps(tmp, y, 0b10001000); @@ -2907,14 +2983,15 @@ void EmitX64::EmitVectorPairedMaxU32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMinS8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorPairedMinMax8(code, ctx, inst, &Xbyak::CodeGenerator::pminsb); - } else if (code.HasHostFeature(HostFeature::SSSE3)) { - EmitVectorPairedMinMax8(code, ctx, inst, [&](const auto& lhs, const auto& rhs) { - FallbackMinMaxS8(code, ctx, lhs, rhs, MinMaxOperation::Min); - }); } else { - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - PairedMin(result, a, b); - }); + EmitVectorPairedMinMax8(code, ctx, inst, [&](const auto& a, const auto& b) { + auto const c = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(c, b); + code.pcmpgtb(c, a); + code.pand(a, c); + code.pandn(c, b); + code.por(a, c); + }); } } @@ -2925,9 +3002,9 @@ void EmitX64::EmitVectorPairedMinS16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMinS32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, x); code.shufps(tmp, y, 0b10001000); @@ -2943,12 +3020,25 @@ void EmitX64::EmitVectorPairedMinS32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMinU8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSSE3)) { EmitVectorPairedMinMax8(code, ctx, inst, &Xbyak::CodeGenerator::pminub); - return; + } else { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const constant_00ff = code.Const(xword, 0x00FF00FF00FF00FF, 0x00FF00FF00FF00FF); + code.movdqa(tmp2, tmp1); + code.psrlw(tmp2, 8); + code.movdqa(tmp3, tmp0); + code.psrlw(tmp3, 8); + code.packuswb(tmp3, tmp2); + code.movdqa(tmp2, constant_00ff); + code.pand(tmp1, tmp2); + code.pand(tmp0, tmp2); + code.packuswb(tmp0, tmp1); + code.pminub(tmp0, tmp3); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - PairedMin(result, a, b); - }); } void EmitX64::EmitVectorPairedMinU16(EmitContext& ctx, IR::Inst* inst) { @@ -2964,9 +3054,9 @@ void EmitX64::EmitVectorPairedMinU16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPairedMinU32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, x); code.shufps(tmp, y, 0b10001000); @@ -2982,41 +3072,88 @@ void EmitX64::EmitVectorPairedMinU32(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitVectorPairedMaxLowerS8(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower8(code, ctx, inst, &Xbyak::CodeGenerator::pmaxsb); - return; - } else if (code.HasHostFeature(HostFeature::SSSE3)) { - EmitVectorPairedMinMaxLower8(code, ctx, inst, [&](const auto& lhs, const auto& rhs) { - FallbackMinMaxS8(code, ctx, lhs, rhs, MinMaxOperation::Max); - }); - return; + code.punpcklqdq(x, y); + code.pshufb(x, code.Const(xword, 0x0E'0C'0A'08'06'04'02'00, 0x0F'0D'0B'09'07'05'03'01)); + code.movhlps(y, x); + code.movq(x, x); + code.pmaxsb(x, y); + } else { + auto const c = ctx.reg_alloc.ScratchXmm(code); + code.punpcklqdq(x, y); + code.pshufb(x, code.Const(xword, 0x0E'0C'0A'08'06'04'02'00, 0x0F'0D'0B'09'07'05'03'01)); + code.movhlps(y, x); + code.movq(x, x); + code.movdqa(c, x); + code.pcmpgtb(c, y); + code.pand(x, c); + code.pandn(c, y); + code.por(x, c); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMax(result, a, b); - }); + ctx.reg_alloc.DefineValue(code, inst, x); } void EmitX64::EmitVectorPairedMaxLowerS16(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower16(code, ctx, inst, &Xbyak::CodeGenerator::pmaxsw); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // swap idxs 1 and 2 so that both registers contain even then odd-indexed pairs of elements + code.pshuflw(x, x, 0b11'01'10'00); + code.pshuflw(y, y, 0b11'01'10'00); + // move pairs of even/odd-indexed elements into one register each + // tmp = x[0, 2], y[0, 2], 0s... + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[1, 3], y[1, 3], 0s... + code.insertps(x, y, 0b00011100); + code.pmaxsw(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + code.punpcklwd(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 232); + code.pshuflw(tmp1, tmp1, 216); + code.pshufd(tmp0, tmp0, 231); + code.pshuflw(tmp0, tmp0, 114); + code.pmaxsw(tmp0, tmp1); + code.movq(tmp0, tmp0); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMax(result, a, b); - }); } void EmitX64::EmitVectorPairedMaxLowerS32(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower32(code, ctx, inst, &Xbyak::CodeGenerator::pmaxsd); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // tmp = x[1], y[1], 0, 0 + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[0], y[0], 0, 0 + code.insertps(x, y, 0b00011100); + code.pmaxsd(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.punpckldq(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 238); + code.movdqa(tmp2, tmp0); + code.pcmpgtd(tmp2, tmp1); + code.pand(tmp0, tmp2); + code.pandn(tmp2, tmp1); + code.por(tmp2, tmp0); + code.movq(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMax(result, a, b); - }); } void EmitX64::EmitVectorPairedMaxLowerU8(EmitContext& ctx, IR::Inst* inst) { @@ -3031,63 +3168,143 @@ void EmitX64::EmitVectorPairedMaxLowerU8(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitVectorPairedMaxLowerU16(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower16(code, ctx, inst, &Xbyak::CodeGenerator::pmaxuw); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // swap idxs 1 and 2 so that both registers contain even then odd-indexed pairs of elements + code.pshuflw(x, x, 0b11'01'10'00); + code.pshuflw(y, y, 0b11'01'10'00); + // move pairs of even/odd-indexed elements into one register each + // tmp = x[0, 2], y[0, 2], 0s... + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[1, 3], y[1, 3], 0s... + code.insertps(x, y, 0b00011100); + code.pmaxuw(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + code.punpcklwd(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 232); + code.pshuflw(tmp1, tmp1, 216); + code.pshufd(tmp0, tmp0, 231); + code.pshuflw(tmp0, tmp0, 114); + code.psubusw(tmp0, tmp1); + code.paddw(tmp0, tmp1); + code.movq(tmp0, tmp0); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMax(result, a, b); - }); } void EmitX64::EmitVectorPairedMaxLowerU32(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower32(code, ctx, inst, &Xbyak::CodeGenerator::pmaxud); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // tmp = x[1], y[1], 0, 0 + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[0], y[0], 0, 0 + code.insertps(x, y, 0b00011100); + code.pmaxud(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + code.punpckldq(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 238); + code.movdqa(tmp2, code.Const(xword, 0x8000'00008000'0000, 0x8000'00008000'0000)); + code.movdqa(tmp3, tmp0); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp1); + code.pcmpgtd(tmp3, tmp2); + code.pand(tmp0, tmp3); + code.pandn(tmp3, tmp1); + code.por(tmp3, tmp0); + code.movq(tmp0, tmp3); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMax(result, a, b); - }); } void EmitX64::EmitVectorPairedMinLowerS8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { EmitVectorPairedMinMaxLower8(code, ctx, inst, &Xbyak::CodeGenerator::pminsb); - return; - } else if (code.HasHostFeature(HostFeature::SSSE3)) { - EmitVectorPairedMinMaxLower8(code, ctx, inst, [&](const auto& lhs, const auto& rhs) { - FallbackMinMaxS8(code, ctx, lhs, rhs, MinMaxOperation::Min); + } else { + EmitVectorPairedMinMaxLower8(code, ctx, inst, [&](const auto& a, const auto& b) { + auto const c = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(c, b); + code.pcmpgtb(c, a); + code.pand(a, c); + code.pandn(c, b); + code.por(a, c); }); - return; } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMin(result, a, b); - }); } void EmitX64::EmitVectorPairedMinLowerS16(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower16(code, ctx, inst, &Xbyak::CodeGenerator::pminsw); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // swap idxs 1 and 2 so that both registers contain even then odd-indexed pairs of elements + code.pshuflw(x, x, 0b11'01'10'00); + code.pshuflw(y, y, 0b11'01'10'00); + // move pairs of even/odd-indexed elements into one register each + // tmp = x[0, 2], y[0, 2], 0s... + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[1, 3], y[1, 3], 0s... + code.insertps(x, y, 0b00011100); + code.pminsw(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + code.punpcklwd(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 231); + code.pshuflw(tmp1, tmp1, 114); + code.pshufd(tmp0, tmp0, 232); + code.pshuflw(tmp0, tmp0, 216); + code.pminsw(tmp0, tmp1); + code.movq(tmp0, tmp0); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMin(result, a, b); - }); } void EmitX64::EmitVectorPairedMinLowerS32(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower32(code, ctx, inst, &Xbyak::CodeGenerator::pminsd); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // tmp = x[1], y[1], 0, 0 + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[0], y[0], 0, 0 + code.insertps(x, y, 0b00011100); + code.pminsd(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.punpckldq(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 238); + code.movdqa(tmp2, tmp0); + code.pcmpgtd(tmp2, tmp1); + code.pand(tmp1, tmp2); + code.pandn(tmp2, tmp0); + code.por(tmp2, tmp1); + code.movq(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMin(result, a, b); - }); } void EmitX64::EmitVectorPairedMinLowerU8(EmitContext& ctx, IR::Inst* inst) { @@ -3102,50 +3319,91 @@ void EmitX64::EmitVectorPairedMinLowerU8(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitVectorPairedMinLowerU16(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower16(code, ctx, inst, &Xbyak::CodeGenerator::pminuw); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // swap idxs 1 and 2 so that both registers contain even then odd-indexed pairs of elements + code.pshuflw(x, x, 0b11'01'10'00); + code.pshuflw(y, y, 0b11'01'10'00); + // move pairs of even/odd-indexed elements into one register each + // tmp = x[0, 2], y[0, 2], 0s... + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[1, 3], y[1, 3], 0s... + code.insertps(x, y, 0b00011100); + code.pminuw(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.punpcklwd(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 231); + code.pshuflw(tmp1, tmp1, 114); + code.pshufd(tmp0, tmp0, 232); + code.pshuflw(tmp0, tmp0, 216); + code.movdqa(tmp2, tmp1); + code.psubusw(tmp2, tmp0); + code.psubw(tmp1, tmp2); + code.movq(tmp0, tmp1); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMin(result, a, b); - }); } void EmitX64::EmitVectorPairedMinLowerU32(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - EmitVectorPairedMinMaxLower32(code, ctx, inst, &Xbyak::CodeGenerator::pminud); - return; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + // tmp = x[1], y[1], 0, 0 + code.movaps(tmp, y); + code.insertps(tmp, x, 0b01001100); + // x = x[0], y[0], 0, 0 + code.insertps(x, y, 0b00011100); + code.pminud(x, tmp); + ctx.reg_alloc.DefineValue(code, inst, x); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + code.punpckldq(tmp0, tmp1); + code.pshufd(tmp1, tmp0, 238); + code.movdqa(tmp2, code.Const(xword, 0x8000'00008000'0000, 0x8000'00008000'0000)); + code.movdqa(tmp3, tmp0); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp1); + code.pcmpgtd(tmp3, tmp2); + code.pand(tmp1, tmp3); + code.pandn(tmp3, tmp0); + code.por(tmp3, tmp1); + code.movq(tmp0, tmp3); + ctx.reg_alloc.DefineValue(code, inst, tmp0); } - - EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - LowerPairedMin(result, a, b); - }); } template static D PolynomialMultiply(T lhs, T rhs) { constexpr size_t bit_size = mcl::bitsizeof; const std::bitset operand(lhs); - D res = 0; - for (size_t i = 0; i < bit_size; i++) { - if (operand[i]) { + for (size_t i = 0; i < bit_size; i++) + if (operand[i]) res ^= rhs << i; - } - } - return res; } void EmitX64::EmitVectorPolynomialMultiply8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm alternate = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm mask = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); + auto const alternate = ctx.reg_alloc.ScratchXmm(code); + auto const mask = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Reg32 counter = ctx.reg_alloc.ScratchGpr(code).cvt32(); Xbyak::Label loop; @@ -3183,11 +3441,11 @@ void EmitX64::EmitVectorPolynomialMultiply8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorPolynomialMultiplyLong8(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm alternate = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm mask = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); + auto const alternate = ctx.reg_alloc.ScratchXmm(code); + auto const mask = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Reg32 counter = ctx.reg_alloc.ScratchGpr(code).cvt32(); Xbyak::Label loop; @@ -3229,8 +3487,8 @@ void EmitX64::EmitVectorPolynomialMultiplyLong8(EmitContext& ctx, IR::Inst* inst void EmitX64::EmitVectorPolynomialMultiplyLong64(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::PCLMULQDQ)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); code.pclmulqdq(xmm_a, xmm_b, 0x00); @@ -3260,7 +3518,7 @@ void EmitX64::EmitVectorPolynomialMultiplyLong64(EmitContext& ctx, IR::Inst* ins void EmitX64::EmitVectorPopulationCount(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::AVX512VL | HostFeature::AVX512BITALG)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpopcntb(data, data); @@ -3271,10 +3529,10 @@ void EmitX64::EmitVectorPopulationCount(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSSE3)) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm low_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm high_a = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp1 = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const low_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const high_a = ctx.reg_alloc.ScratchXmm(code); + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); code.movdqa(high_a, low_a); code.psrlw(high_a, 4); @@ -3303,12 +3561,12 @@ void EmitX64::EmitVectorPopulationCount(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorReverseBits(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::GFNI)) { code.gf2p8affineqb(data, code.Const(xword, 0x8040201008040201, 0x8040201008040201), 0); } else { - const Xbyak::Xmm high_nibble_reg = ctx.reg_alloc.ScratchXmm(code); + auto const high_nibble_reg = ctx.reg_alloc.ScratchXmm(code); code.movdqa(high_nibble_reg, code.Const(xword, 0xF0F0F0F0F0F0F0F0, 0xF0F0F0F0F0F0F0F0)); code.pand(high_nibble_reg, data); code.pxor(data, high_nibble_reg); @@ -3316,7 +3574,7 @@ void EmitX64::EmitVectorReverseBits(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSSE3)) { // High lookup - const Xbyak::Xmm high_reversed_reg = ctx.reg_alloc.ScratchXmm(code); + auto const high_reversed_reg = ctx.reg_alloc.ScratchXmm(code); code.movdqa(high_reversed_reg, code.Const(xword, 0xE060A020C0408000, 0xF070B030D0509010)); code.pshufb(high_reversed_reg, data); @@ -3350,8 +3608,8 @@ void EmitX64::EmitVectorReverseBits(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorReverseElementsInHalfGroups8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, data); code.psllw(tmp, 8); @@ -3363,13 +3621,13 @@ void EmitX64::EmitVectorReverseElementsInHalfGroups8(EmitContext& ctx, IR::Inst* void EmitX64::EmitVectorReverseElementsInWordGroups8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX)) { code.vpshufb(data, data, code.Const(xword, 0x0405060700010203, 0x0c0d0e0f08090a0b)); } else if (code.HasHostFeature(HostFeature::SSSE3)) { code.pshufb(data, code.Const(xword, 0x0405060700010203, 0x0c0d0e0f08090a0b)); } else { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, data); code.psllw(tmp, 8); code.psrlw(data, 8); @@ -3382,7 +3640,7 @@ void EmitX64::EmitVectorReverseElementsInWordGroups8(EmitContext& ctx, IR::Inst* void EmitX64::EmitVectorReverseElementsInWordGroups16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pshuflw(data, data, 0b10110001); code.pshufhw(data, data, 0b10110001); ctx.reg_alloc.DefineValue(code, inst, data); @@ -3390,13 +3648,13 @@ void EmitX64::EmitVectorReverseElementsInWordGroups16(EmitContext& ctx, IR::Inst void EmitX64::EmitVectorReverseElementsInLongGroups8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::AVX)) { code.vpshufb(data, data, code.Const(xword, 0x0001020304050607, 0x08090a0b0c0d0e0f)); } else if (code.HasHostFeature(HostFeature::SSSE3)) { code.pshufb(data, code.Const(xword, 0x0001020304050607, 0x08090a0b0c0d0e0f)); } else { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp, data); code.psllw(tmp, 8); code.psrlw(data, 8); @@ -3410,7 +3668,7 @@ void EmitX64::EmitVectorReverseElementsInLongGroups8(EmitContext& ctx, IR::Inst* void EmitX64::EmitVectorReverseElementsInLongGroups16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pshuflw(data, data, 0b00011011); code.pshufhw(data, data, 0b00011011); @@ -3421,7 +3679,7 @@ void EmitX64::EmitVectorReverseElementsInLongGroups16(EmitContext& ctx, IR::Inst void EmitX64::EmitVectorReverseElementsInLongGroups32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pshuflw(data, data, 0b01001110); code.pshufhw(data, data, 0b01001110); @@ -3432,8 +3690,8 @@ void EmitX64::EmitVectorReverseElementsInLongGroups32(EmitContext& ctx, IR::Inst void EmitX64::EmitVectorReduceAdd8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm temp = xmm0; + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const temp = xmm0; // Add upper elements to lower elements code.pshufd(temp, data, 0b01'00'11'10); @@ -3453,8 +3711,8 @@ void EmitX64::EmitVectorReduceAdd8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorReduceAdd16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm temp = xmm0; + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const temp = xmm0; if (code.HasHostFeature(HostFeature::SSSE3)) { code.pxor(temp, temp); @@ -3484,8 +3742,8 @@ void EmitX64::EmitVectorReduceAdd16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorReduceAdd32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm temp = xmm0; + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const temp = xmm0; // Add upper elements to lower elements(reversed) code.pshufd(temp, data, 0b00'01'10'11); @@ -3508,8 +3766,8 @@ void EmitX64::EmitVectorReduceAdd32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorReduceAdd64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm temp = xmm0; + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const temp = xmm0; // Add upper elements to lower elements code.pshufd(temp, data, 0b01'00'11'10); @@ -3524,8 +3782,8 @@ void EmitX64::EmitVectorReduceAdd64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorRotateWholeVectorRight(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm operand = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const operand = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); const u8 shift_amount = args[1].GetImmediateU8(); ASSERT(shift_amount % 32 == 0); const u8 shuffle_imm = std::rotr(0b11100100, shift_amount / 32 * 2); @@ -3538,12 +3796,12 @@ void EmitX64::EmitVectorRotateWholeVectorRight(EmitContext& ctx, IR::Inst* inst) static void EmitVectorRoundingHalvingAddSigned(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); switch (esize) { case 8: { - const Xbyak::Xmm vec_128 = ctx.reg_alloc.ScratchXmm(code); + auto const vec_128 = ctx.reg_alloc.ScratchXmm(code); code.movdqa(vec_128, code.Const(xword, 0x8080808080808080, 0x8080808080808080)); code.paddb(a, vec_128); @@ -3553,7 +3811,7 @@ static void EmitVectorRoundingHalvingAddSigned(size_t esize, EmitContext& ctx, I break; } case 16: { - const Xbyak::Xmm vec_32768 = ctx.reg_alloc.ScratchXmm(code); + auto const vec_32768 = ctx.reg_alloc.ScratchXmm(code); code.movdqa(vec_32768, code.Const(xword, 0x8000800080008000, 0x8000800080008000)); code.paddw(a, vec_32768); @@ -3563,7 +3821,7 @@ static void EmitVectorRoundingHalvingAddSigned(size_t esize, EmitContext& ctx, I break; } case 32: { - const Xbyak::Xmm tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp1, a); code.por(a, b); @@ -3603,9 +3861,9 @@ static void EmitVectorRoundingHalvingAddUnsigned(size_t esize, EmitContext& ctx, case 32: { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); code.movdqa(tmp1, a); @@ -3669,18 +3927,18 @@ static void EmitUnsignedRoundingShiftLeft(BlockOfCode& code, EmitContext& ctx, I static_assert(esize == 32 || esize == 64); auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm b = ctx.reg_alloc.UseXmm(code, args[1]); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const b = ctx.reg_alloc.UseXmm(code, args[1]); // positive values of b are left shifts, while negative values are (positive) rounding right shifts // only the lowest byte of each element is read as the shift amount // conveniently, the behavior of bit shifts greater than element width is the same in NEON and SSE/AVX - filled with zeros - const Xbyak::Xmm shift_amount = ctx.reg_alloc.ScratchXmm(code); + auto const shift_amount = ctx.reg_alloc.ScratchXmm(code); code.vpabsb(shift_amount, b); code.vpand(shift_amount, shift_amount, code.BConst(xword, 0xFF)); // if b is positive, do a normal left shift - const Xbyak::Xmm left_shift = ctx.reg_alloc.ScratchXmm(code); + auto const left_shift = ctx.reg_alloc.ScratchXmm(code); ICODE(vpsllv)(left_shift, a, shift_amount); // if b is negative, compute the rounding right shift @@ -3691,7 +3949,7 @@ static void EmitUnsignedRoundingShiftLeft(BlockOfCode& code, EmitContext& ctx, I // tmp = (a >> (b - 1)) & 1 // res = (a >> b) + tmp // to add the value of the last bit to be shifted off to the result of the right shift - const Xbyak::Xmm right_shift = ctx.reg_alloc.ScratchXmm(code); + auto const right_shift = ctx.reg_alloc.ScratchXmm(code); code.vmovdqa(xmm0, code.BConst(xword, 1)); // find value of last bit to be shifted off @@ -3775,12 +4033,12 @@ void EmitX64::EmitVectorRoundingShiftLeftU64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSignExtend8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pmovsxbw(a, a); ctx.reg_alloc.DefineValue(code, inst, a); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.pxor(result, result); code.punpcklbw(result, a); code.psraw(result, 8); @@ -3791,12 +4049,12 @@ void EmitX64::EmitVectorSignExtend8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSignExtend16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.pmovsxwd(a, a); ctx.reg_alloc.DefineValue(code, inst, a); } else { - const Xbyak::Xmm a = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.pxor(result, result); code.punpcklwd(result, a); code.psrad(result, 16); @@ -3806,12 +4064,12 @@ void EmitX64::EmitVectorSignExtend16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSignExtend32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { code.pmovsxdq(a, a); } else { - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); code.movaps(tmp, a); code.psrad(tmp, 31); @@ -3824,7 +4082,7 @@ void EmitX64::EmitVectorSignExtend32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSignExtend64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); const Xbyak::Reg64 gpr_tmp = ctx.reg_alloc.ScratchGpr(code); code.movq(gpr_tmp, data); @@ -3833,7 +4091,7 @@ void EmitX64::EmitVectorSignExtend64(EmitContext& ctx, IR::Inst* inst) { if (code.HasHostFeature(HostFeature::SSE41)) { code.pinsrq(data, gpr_tmp, 1); } else { - const Xbyak::Xmm xmm_tmp = ctx.reg_alloc.ScratchXmm(code); + auto const xmm_tmp = ctx.reg_alloc.ScratchXmm(code); code.movq(xmm_tmp, gpr_tmp); code.punpcklqdq(data, xmm_tmp); @@ -3844,9 +4102,9 @@ void EmitX64::EmitVectorSignExtend64(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorSignedAbsoluteDifference(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); // only signed 16-bit min/max are available below SSE4.1 if (code.HasHostFeature(HostFeature::SSE41) || esize == 16) { @@ -3912,11 +4170,11 @@ void EmitX64::EmitVectorSignedMultiply16(EmitContext& ctx, IR::Inst* inst) { const auto lower_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetLowerFromOp); auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); if (upper_inst) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { code.vpmulhw(result, x, y); } else { @@ -3928,7 +4186,7 @@ void EmitX64::EmitVectorSignedMultiply16(EmitContext& ctx, IR::Inst* inst) { } if (lower_inst) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { code.vpmullw(result, x, y); } else { @@ -3946,9 +4204,9 @@ void EmitX64::EmitVectorSignedMultiply32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (lower_inst && !upper_inst && code.HasHostFeature(HostFeature::AVX)) { - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmulld(result, x, y); @@ -3957,16 +4215,16 @@ void EmitX64::EmitVectorSignedMultiply32(EmitContext& ctx, IR::Inst* inst) { } if (code.HasHostFeature(HostFeature::AVX)) { - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); if (lower_inst) { - const Xbyak::Xmm lower_result = ctx.reg_alloc.ScratchXmm(code); + auto const lower_result = ctx.reg_alloc.ScratchXmm(code); code.vpmulld(lower_result, x, y); ctx.reg_alloc.DefineValue(code, lower_inst, lower_result); } - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmuldq(result, x, y); code.vpsrlq(x, x, 32); @@ -3978,12 +4236,12 @@ void EmitX64::EmitVectorSignedMultiply32(EmitContext& ctx, IR::Inst* inst) { return; } - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm sign_correction = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm upper_result = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm lower_result = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + auto const sign_correction = ctx.reg_alloc.ScratchXmm(code); + auto const upper_result = ctx.reg_alloc.ScratchXmm(code); + auto const lower_result = ctx.reg_alloc.ScratchXmm(code); // calculate sign correction code.movdqa(tmp, x); @@ -4026,7 +4284,7 @@ void EmitX64::EmitVectorSignedMultiply32(EmitContext& ctx, IR::Inst* inst) { static void EmitVectorSignedSaturatedAbs(size_t esize, BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const data = ctx.reg_alloc.UseScratchXmm(code, args[0]); const Xbyak::Reg32 bit = ctx.reg_alloc.ScratchGpr(code).cvt32(); // SSE absolute value functions return an unsigned result @@ -4038,21 +4296,34 @@ static void EmitVectorSignedSaturatedAbs(size_t esize, BlockOfCode& code, EmitCo // or shift in sign bits to create a mask of (msb == 1 ? -1 : 0), then add to the result vector switch (esize) { case 8: { - VectorAbs8(code, ctx, data); + if (code.HasHostFeature(HostFeature::SSSE3)) { + code.pabsb(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.pxor(temp, temp); + code.psubb(temp, data); + code.pminub(data, temp); + } code.pmovmskb(bit, data); - code.pminub(data, code.BConst<8>(xword, 0x7F)); break; } case 16: { - VectorAbs16(code, ctx, data); + if (code.HasHostFeature(HostFeature::SSSE3)) { + code.pabsw(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.pxor(temp, temp); + code.psubw(temp, data); + code.pmaxsw(data, temp); + } code.pmovmskb(bit, data); code.and_(bit, 0xAAAA); // toggle mask bits that aren't the msb of an int16 to 0 if (code.HasHostFeature(HostFeature::SSE41)) { code.pminuw(data, code.BConst<16>(xword, 0x7FFF)); } else { - const Xbyak::Xmm tmp = xmm0; + auto const tmp = xmm0; code.movdqa(tmp, data); code.psraw(data, 15); code.paddw(data, tmp); @@ -4060,13 +4331,21 @@ static void EmitVectorSignedSaturatedAbs(size_t esize, BlockOfCode& code, EmitCo break; } case 32: { - VectorAbs32(code, ctx, data); + if (code.HasHostFeature(HostFeature::SSSE3)) { + code.pabsd(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(temp, data); + code.psrad(temp, 31); + code.pxor(data, temp); + code.psubd(data, temp); + } code.movmskps(bit, data); if (code.HasHostFeature(HostFeature::SSE41)) { code.pminud(data, code.BConst<32>(xword, 0x7FFFFFFF)); } else { - const Xbyak::Xmm tmp = xmm0; + auto const tmp = xmm0; code.movdqa(tmp, data); code.psrad(data, 31); code.paddd(data, tmp); @@ -4074,10 +4353,18 @@ static void EmitVectorSignedSaturatedAbs(size_t esize, BlockOfCode& code, EmitCo break; } case 64: { - VectorAbs64(code, ctx, data); + if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { + code.vpabsq(data, data); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + code.pshufd(temp, data, 0b11110101); + code.psrad(temp, 31); + code.pxor(data, temp); + code.psubq(data, temp); + } code.movmskpd(bit, data); - const Xbyak::Xmm tmp = xmm0; + auto const tmp = xmm0; if (code.HasHostFeature(HostFeature::SSE42)) { // create a -1 mask if msb is set code.pxor(tmp, tmp); @@ -4119,13 +4406,13 @@ template static void EmitVectorSignedSaturatedAccumulateUnsigned(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); code.movdqa(xmm0, y); ctx.reg_alloc.Release(y); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); switch (bit_width) { case 8: @@ -4182,7 +4469,7 @@ static void EmitVectorSignedSaturatedAccumulateUnsigned(BlockOfCode& code, EmitC switch (bit_width) { case 8: if (code.HasHostFeature(HostFeature::AVX)) { - const Xbyak::Xmm tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); code.pcmpeqb(tmp2, tmp2); code.pxor(tmp, tmp); code.vpblendvb(xmm0, tmp, tmp2, xmm0); @@ -4262,10 +4549,10 @@ void EmitX64::EmitVectorSignedSaturatedAccumulateUnsigned64(EmitContext& ctx, IR template static void EmitVectorSignedSaturatedDoublingMultiply16(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm upper_tmp = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm lower_tmp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const upper_tmp = ctx.reg_alloc.ScratchXmm(code); + auto const lower_tmp = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { code.vpmulhw(upper_tmp, x, y); @@ -4284,7 +4571,7 @@ static void EmitVectorSignedSaturatedDoublingMultiply16(BlockOfCode& code, EmitC ctx.reg_alloc.Release(x); ctx.reg_alloc.Release(y); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { if constexpr (is_rounding) { @@ -4334,10 +4621,10 @@ void EmitVectorSignedSaturatedDoublingMultiply32(BlockOfCode& code, EmitContext& auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (code.HasHostFeature(HostFeature::AVX)) { - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm odds = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm even = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const odds = ctx.reg_alloc.ScratchXmm(code); + auto const even = ctx.reg_alloc.ScratchXmm(code); code.vpmuldq(odds, x, y); code.vpsrlq(x, x, 32); @@ -4350,7 +4637,7 @@ void EmitVectorSignedSaturatedDoublingMultiply32(BlockOfCode& code, EmitContext& code.vpaddq(odds, odds, odds); code.vpaddq(even, even, even); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); if constexpr (is_rounding) { code.vmovdqa(result, code.Const(xword, 0x0000000080000000, 0x0000000080000000)); @@ -4361,7 +4648,7 @@ void EmitVectorSignedSaturatedDoublingMultiply32(BlockOfCode& code, EmitContext& code.vpsrlq(result, odds, 32); code.vblendps(result, result, even, 0b1010); - const Xbyak::Xmm mask = ctx.reg_alloc.ScratchXmm(code); + auto const mask = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Reg32 bit = ctx.reg_alloc.ScratchGpr(code).cvt32(); code.vpcmpeqd(mask, result, code.Const(xword, 0x8000000080000000, 0x8000000080000000)); @@ -4376,11 +4663,11 @@ void EmitVectorSignedSaturatedDoublingMultiply32(BlockOfCode& code, EmitContext& return; } - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm sign_correction = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + auto const sign_correction = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); // calculate sign correction code.movdqa(tmp, x); @@ -4439,8 +4726,8 @@ void EmitX64::EmitVectorSignedSaturatedDoublingMultiplyHighRounding32(EmitContex void EmitX64::EmitVectorSignedSaturatedDoublingMultiplyLong16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.punpcklwd(x, x); code.punpcklwd(y, y); @@ -4465,8 +4752,8 @@ void EmitX64::EmitVectorSignedSaturatedDoublingMultiplyLong16(EmitContext& ctx, void EmitX64::EmitVectorSignedSaturatedDoublingMultiplyLong32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); if (code.HasHostFeature(HostFeature::AVX)) { code.vpmovsxdq(x, x); @@ -4517,10 +4804,10 @@ void EmitX64::EmitVectorSignedSaturatedDoublingMultiplyLong32(EmitContext& ctx, static void EmitVectorSignedSaturatedNarrowToSigned(size_t original_esize, BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm src = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm dest = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm reconstructed = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm sign = ctx.reg_alloc.ScratchXmm(code); + auto const src = ctx.reg_alloc.UseXmm(code, args[0]); + auto const dest = ctx.reg_alloc.ScratchXmm(code); + auto const reconstructed = ctx.reg_alloc.ScratchXmm(code); + auto const sign = ctx.reg_alloc.ScratchXmm(code); code.movdqa(dest, src); code.pxor(xmm0, xmm0); @@ -4577,9 +4864,9 @@ void EmitX64::EmitVectorSignedSaturatedNarrowToSigned64(EmitContext& ctx, IR::In static void EmitVectorSignedSaturatedNarrowToUnsigned(size_t original_esize, BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm src = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm dest = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm reconstructed = ctx.reg_alloc.ScratchXmm(code); + auto const src = ctx.reg_alloc.UseXmm(code, args[0]); + auto const dest = ctx.reg_alloc.ScratchXmm(code); + auto const reconstructed = ctx.reg_alloc.ScratchXmm(code); code.movdqa(dest, src); code.pxor(xmm0, xmm0); @@ -4647,9 +4934,9 @@ void EmitX64::EmitVectorSignedSaturatedNarrowToUnsigned64(EmitContext& ctx, IR:: static void EmitVectorSignedSaturatedNeg(size_t esize, BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm data = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm zero = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + auto const data = ctx.reg_alloc.UseXmm(code, args[0]); + auto const zero = ctx.reg_alloc.ScratchXmm(code); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Address mask = [esize, &code] { switch (esize) { case 8: @@ -4665,7 +4952,7 @@ static void EmitVectorSignedSaturatedNeg(size_t esize, BlockOfCode& code, EmitCo } }(); - const auto vector_equality = [esize, &code](const Xbyak::Xmm& x, const auto& y) { + const auto vector_equality = [esize, &code](auto const& x, const auto& y) { switch (esize) { case 8: code.pcmpeqb(x, y); @@ -4810,33 +5097,23 @@ void EmitX64::EmitVectorSignedSaturatedShiftLeft64(EmitContext& ctx, IR::Inst* i EmitTwoArgumentFallbackWithSaturation(code, ctx, inst, VectorSignedSaturatedShiftLeft); } -template> +template static bool VectorSignedSaturatedShiftLeftUnsigned(VectorArray& dst, const VectorArray& data, u8 shift_amount) { + using U = std::make_unsigned_t; static_assert(std::is_signed_v, "T must be signed."); - bool qc_flag = false; for (size_t i = 0; i < dst.size(); i++) { - const T element = data[i]; - const T shift = static_cast(shift_amount); - - if (element == 0) { - dst[i] = 0; - } else if (element < 0) { - dst[i] = 0; - qc_flag = true; - } else { - const U shifted = static_cast(element) << static_cast(shift); - const U shifted_test = shifted >> static_cast(shift); - - if (shifted_test != static_cast(element)) { - dst[i] = static_cast((std::numeric_limits::max)()); - qc_flag = true; - } else { - dst[i] = shifted; - } - } + auto const element = data[i]; + auto const shifted = U(element) << U(T(shift_amount)); + auto const shifted_test = shifted >> U(T(shift_amount)); + auto result = 0; + if (element > 0 && shifted_test != U(element)) + result = T((std::numeric_limits::max)()); + if (element > 0 && shifted_test == U(element)) + result = shifted; + qc_flag |= element < 0 || (element > 0 && shifted_test != U(element)); + dst[i] = result; } - return qc_flag; } @@ -4849,7 +5126,97 @@ void EmitX64::EmitVectorSignedSaturatedShiftLeftUnsigned16(EmitContext& ctx, IR: } void EmitX64::EmitVectorSignedSaturatedShiftLeftUnsigned32(EmitContext& ctx, IR::Inst* inst) { - EmitTwoArgumentFallbackWithSaturationAndImmediate(code, ctx, inst, VectorSignedSaturatedShiftLeftUnsigned); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + auto const imm8 = args[1].GetImmediateU8(); + if (code.HasHostFeature(HostFeature::AVX2)) { + auto const tmp_flag = ctx.reg_alloc.ScratchGpr(code); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + if (imm8 == 0) { + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.vpshufd(tmp1, tmp0, 85); + code.vpshufd(tmp2, tmp0, 238); + code.vpor(tmp1, tmp1, tmp2); + code.vpshufd(tmp2, tmp0, 255); + code.vpor(tmp2, tmp2, tmp0); + code.vpor(tmp1, tmp1, tmp2); + code.vmovd(tmp_flag.cvt32(), tmp1); + code.shr(tmp_flag.cvt32(), 31); + code.vpxor(tmp1, tmp1, tmp1); + code.vpmaxsd(tmp0, tmp0, tmp1); + } else { + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp4 = ctx.reg_alloc.ScratchXmm(code); + auto const cmp_value = u32(1ULL << 31) >> (imm8 - 1); + code.vpshufd(tmp1, tmp0, 238); + code.vpor(tmp1, tmp1, tmp0); + code.vpshufd(tmp2, tmp1, 85); + code.vpor(tmp1, tmp1, tmp2); + code.vmovd(tmp_flag.cvt32(), tmp1); + code.cmp(tmp_flag.cvt32(), cmp_value); + code.vpslld(tmp1, tmp0, imm8); + code.vpbroadcastd(tmp2, code.Const(dword, cmp_value - 2)); + code.vpbroadcastd(tmp3, code.Const(dword, cmp_value - 1)); + code.vpcmpgtd(tmp3, tmp0, tmp3); + code.vpcmpeqd(tmp4, tmp4, tmp4); + code.vpaddd(tmp0, tmp0, tmp4); + code.vpminud(tmp2, tmp0, tmp2); + code.vpcmpeqd(tmp0, tmp0, tmp2); + code.vblendvps(tmp0, tmp3, tmp1, tmp0); + code.setae(tmp_flag.cvt8()); + } + code.or_(code.byte[code.ABI_JIT_PTR + code.GetJitStateInfo().offsetof_fpsr_qc], tmp_flag.cvt8()); + ctx.reg_alloc.DefineValue(code, inst, tmp0); + } else { + auto const tmp_flag = ctx.reg_alloc.ScratchGpr(code); + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + if (imm8 == 0) { + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.pshufd(tmp1, tmp0, 85); + code.pshufd(tmp2, tmp0, 238); + code.por(tmp2, tmp1); + code.pshufd(tmp1, tmp0, 255); + code.por(tmp1, tmp0); + code.por(tmp1, tmp2); + code.movd(tmp_flag.cvt32(), tmp1); + code.shr(tmp_flag.cvt32(), 31); + code.pxor(tmp1, tmp1); + code.movdqa(tmp2, tmp0); + code.pcmpgtd(tmp2, tmp1); + code.pand(tmp0, tmp2); + } else { + auto const tmp1 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + u64 const cmp_value = u64(1ULL << 31) >> (imm8 - 1); + u64 const cmp_one = cmp_value - 1; + u64 const cmp_add = (cmp_value - 2) + 0x80000000; + code.pshufd(tmp1, tmp0, 238); + code.por(tmp1, tmp0); + code.pshufd(tmp2, tmp1, 85); + code.por(tmp2, tmp1); + code.movd(tmp_flag.cvt32(), tmp2); + code.cmp(tmp_flag.cvt32(), cmp_value); + code.movdqa(tmp1, tmp0); + code.pslld(tmp1, imm8); + code.movdqa(tmp2, tmp0); + code.pcmpgtd(tmp2, code.Const(xword, cmp_one | (cmp_one << 32), cmp_one | (cmp_one << 32))); + code.pcmpeqd(tmp3, tmp3); + code.paddd(tmp0, tmp3); + code.pxor(tmp0, code.Const(xword, 0x80000000'80000000, 0x80000000'80000000)); + code.pcmpgtd(tmp0, code.Const(xword, cmp_add | (cmp_add << 32), cmp_add | (cmp_add << 32))); + code.pand(tmp2, tmp0); + code.pandn(tmp0, tmp1); + code.por(tmp0, tmp2); + code.setae(tmp_flag.cvt8()); + } + code.or_(code.byte[code.ABI_JIT_PTR + code.GetJitStateInfo().offsetof_fpsr_qc], tmp_flag.cvt8()); + ctx.reg_alloc.DefineValue(code, inst, tmp0); +// EmitTwoArgumentFallbackWithSaturationAndImmediate(code, ctx, inst, VectorSignedSaturatedShiftLeftUnsigned); + } } void EmitX64::EmitVectorSignedSaturatedShiftLeftUnsigned64(EmitContext& ctx, IR::Inst* inst) { @@ -4887,7 +5254,7 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { const bool is_defaults_zero = inst->GetArg(0).IsZero(); if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW | HostFeature::AVX512VBMI)) { - const Xbyak::Xmm indicies = table_size <= 2 ? ctx.reg_alloc.UseXmm(code, args[2]) : ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const indicies = table_size <= 2 ? ctx.reg_alloc.UseXmm(code, args[2]) : ctx.reg_alloc.UseScratchXmm(code, args[2]); const u64 index_count = mcl::bit::replicate_element(static_cast(table_size * 8)); @@ -4895,43 +5262,43 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { switch (table_size) { case 1: { - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); if (is_defaults_zero) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpermb(result | k1 | T_z, indicies, xmm_table0); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpermb(result | k1, indicies, xmm_table0); ctx.reg_alloc.DefineValue(code, inst, result); } break; } case 2: { - const Xbyak::Xmm xmm_table0_lower = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table0_lower = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); code.vpunpcklqdq(xmm0, xmm_table0_lower, xmm_table0_upper); if (is_defaults_zero) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpermb(result | k1 | T_z, indicies, xmm0); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpermb(result | k1, indicies, xmm0); ctx.reg_alloc.DefineValue(code, inst, result); } break; } case 3: { - const Xbyak::Xmm xmm_table0_lower = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseXmm(code, table[2]); + auto const xmm_table0_lower = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table1 = ctx.reg_alloc.UseXmm(code, table[2]); code.vpunpcklqdq(xmm0, xmm_table0_lower, xmm_table0_upper); if (is_defaults_zero) { code.vpermi2b(indicies | k1 | T_z, xmm0, xmm_table1); ctx.reg_alloc.DefineValue(code, inst, indicies); } else { - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpermi2b(indicies, xmm0, xmm_table1); code.vmovdqu8(result | k1, indicies); ctx.reg_alloc.DefineValue(code, inst, result); @@ -4939,17 +5306,17 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { break; } case 4: { - const Xbyak::Xmm xmm_table0_lower = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[2]); - const Xbyak::Xmm xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); + auto const xmm_table0_lower = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[2]); + auto const xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); code.vpunpcklqdq(xmm0, xmm_table0_lower, xmm_table0_upper); code.vpunpcklqdq(xmm_table1, xmm_table1, xmm_table1_upper); if (is_defaults_zero) { code.vpermi2b(indicies | k1 | T_z, xmm0, xmm_table1); ctx.reg_alloc.DefineValue(code, inst, indicies); } else { - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpermi2b(indicies, xmm0, xmm_table1); code.vmovdqu8(result | k1, indicies); ctx.reg_alloc.DefineValue(code, inst, result); @@ -4972,9 +5339,9 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { }; if (code.HasHostFeature(HostFeature::SSSE3) && is_defaults_zero && table_size == 1) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.xorps(result, result); code.movsd(result, xmm_table0); @@ -4986,9 +5353,9 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { } if (code.HasHostFeature(HostFeature::SSSE3) && is_defaults_zero && table_size == 2) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); code.punpcklqdq(xmm_table0, xmm_table0_upper); code.paddusb(indicies, code.Const(xword, 0x7070707070707070, 0xFFFFFFFFFFFFFFFF)); @@ -4999,12 +5366,12 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { } if (code.HasHostFeature(HostFeature::SSE41) && table_size <= 2) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm defaults = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const defaults = ctx.reg_alloc.UseXmm(code, args[0]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); if (table_size == 2) { - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); code.punpcklqdq(xmm_table0, xmm_table0_upper); ctx.reg_alloc.Release(xmm_table0_upper); } @@ -5023,12 +5390,12 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { } if (code.HasHostFeature(HostFeature::SSE41) && is_defaults_zero) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[2]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[2]); { - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); code.punpcklqdq(xmm_table0, xmm_table0_upper); ctx.reg_alloc.Release(xmm_table0_upper); } @@ -5037,7 +5404,7 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { code.punpcklqdq(xmm_table1, xmm0); } else { ASSERT(table_size == 4); - const Xbyak::Xmm xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); + auto const xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); code.punpcklqdq(xmm_table1, xmm_table1_upper); ctx.reg_alloc.Release(xmm_table1_upper); } @@ -5058,18 +5425,18 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { } if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm defaults = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[2]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const defaults = ctx.reg_alloc.UseXmm(code, args[0]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[2]); { - const Xbyak::Xmm xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table0_upper = ctx.reg_alloc.UseXmm(code, table[1]); code.punpcklqdq(xmm_table0, xmm_table0_upper); ctx.reg_alloc.Release(xmm_table0_upper); } if (table_size == 4) { - const Xbyak::Xmm xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); + auto const xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); code.punpcklqdq(xmm_table1, xmm_table1_upper); ctx.reg_alloc.Release(xmm_table1_upper); } @@ -5098,37 +5465,31 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { const u32 stack_space = static_cast(6 * 8); ctx.reg_alloc.AllocStackSpace(code, stack_space + ABI_SHADOW_SPACE); for (size_t i = 0; i < table_size; ++i) { - const Xbyak::Xmm table_value = ctx.reg_alloc.UseXmm(code, table[i]); + auto const table_value = ctx.reg_alloc.UseXmm(code, table[i]); code.movq(qword[rsp + ABI_SHADOW_SPACE + i * 8], table_value); ctx.reg_alloc.Release(table_value); } - const Xbyak::Xmm defaults = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const defaults = ctx.reg_alloc.UseXmm(code, args[0]); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); - code.lea(code.ABI_PARAM1, ptr[rsp + ABI_SHADOW_SPACE]); code.lea(code.ABI_PARAM2, ptr[rsp + ABI_SHADOW_SPACE + 4 * 8]); code.lea(code.ABI_PARAM3, ptr[rsp + ABI_SHADOW_SPACE + 5 * 8]); code.mov(code.ABI_PARAM4.cvt32(), table_size); code.movq(qword[code.ABI_PARAM2], defaults); code.movq(qword[code.ABI_PARAM3], indicies); - - code.CallLambda( - [](const HalfVectorArray* table, HalfVectorArray& result, const HalfVectorArray& indicies, size_t table_size) { - for (size_t i = 0; i < result.size(); ++i) { - const size_t index = indicies[i] / table[0].size(); - const size_t elem = indicies[i] % table[0].size(); - if (index < table_size) { - result[i] = table[index][elem]; - } - } - }); - + code.CallLambda([](const HalfVectorArray* table, HalfVectorArray& result, const HalfVectorArray& indicies, size_t table_size) { + for (size_t i = 0; i < result.size(); ++i) { + const size_t index = indicies[i] / table[0].size(); + const size_t elem = indicies[i] % table[0].size(); + if (index < table_size) + result[i] = table[index][elem]; + } + }); code.movq(result, qword[rsp + ABI_SHADOW_SPACE + 4 * 8]); ctx.reg_alloc.ReleaseStackSpace(code, stack_space + ABI_SHADOW_SPACE); - ctx.reg_alloc.DefineValue(code, inst, result); } @@ -5142,14 +5503,14 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { const bool is_defaults_zero = !inst->GetArg(0).IsImmediate() && inst->GetArg(0).GetInst()->GetOpcode() == IR::Opcode::ZeroVector; if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW | HostFeature::AVX512VBMI) && table_size == 4) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); code.vpcmpub(k1, indicies, code.BConst<8>(xword, 2 * 16), CmpInt::LessThan); code.vpcmpub(k2, indicies, code.BConst<8>(xword, 4 * 16), CmpInt::LessThan); // Handle vector-table 0,1 - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table1 = ctx.reg_alloc.UseXmm(code, table[1]); code.vpermi2b(indicies | k1, xmm_table0, xmm_table1); @@ -5157,8 +5518,8 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.Release(xmm_table1); // Handle vector-table 2,3 - const Xbyak::Xmm xmm_table2 = ctx.reg_alloc.UseXmm(code, table[2]); - const Xbyak::Xmm xmm_table3 = ctx.reg_alloc.UseXmm(code, table[3]); + auto const xmm_table2 = ctx.reg_alloc.UseXmm(code, table[2]); + auto const xmm_table3 = ctx.reg_alloc.UseXmm(code, table[3]); code.kandnw(k1, k1, k2); code.vpermi2b(indicies | k1, xmm_table2, xmm_table3); @@ -5167,19 +5528,19 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { code.vmovdqu8(indicies | k2 | T_z, indicies); ctx.reg_alloc.DefineValue(code, inst, indicies); } else { - const Xbyak::Xmm defaults = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const defaults = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vmovdqu8(defaults | k2, indicies); ctx.reg_alloc.DefineValue(code, inst, defaults); } } else if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW | HostFeature::AVX512VBMI) && table_size == 3) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); code.vpcmpub(k1, indicies, code.BConst<8>(xword, 2 * 16), CmpInt::LessThan); code.vpcmpub(k2, indicies, code.BConst<8>(xword, 3 * 16), CmpInt::LessThan); // Handle vector-table 0,1 - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseXmm(code, table[1]); + auto const xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table1 = ctx.reg_alloc.UseXmm(code, table[1]); code.vpermi2b(indicies | k1, xmm_table0, xmm_table1); @@ -5187,7 +5548,7 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.Release(xmm_table1); // Handle vector-table 2 - const Xbyak::Xmm xmm_table2 = ctx.reg_alloc.UseXmm(code, table[2]); + auto const xmm_table2 = ctx.reg_alloc.UseXmm(code, table[2]); code.kandnw(k1, k1, k2); code.vpermb(indicies | k1, indicies, xmm_table2); @@ -5196,14 +5557,14 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { code.vmovdqu8(indicies | k2 | T_z, indicies); ctx.reg_alloc.DefineValue(code, inst, indicies); } else { - const Xbyak::Xmm defaults = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const defaults = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vmovdqu8(defaults | k2, indicies); ctx.reg_alloc.DefineValue(code, inst, defaults); } } else if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW | HostFeature::AVX512VBMI) && table_size == 2) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseXmm(code, table[1]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); + auto const xmm_table1 = ctx.reg_alloc.UseXmm(code, table[1]); code.vpcmpub(k1, indicies, code.BConst<8>(xword, 2 * 16), CmpInt::LessThan); @@ -5211,36 +5572,36 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { code.vpermi2b(indicies | k1 | T_z, xmm_table0, xmm_table1); ctx.reg_alloc.DefineValue(code, inst, indicies); } else { - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpermi2b(indicies, xmm_table0, xmm_table1); code.vmovdqu8(result | k1, indicies); ctx.reg_alloc.DefineValue(code, inst, result); } } else if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW | HostFeature::AVX512VBMI) && table_size == 1) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseXmm(code, table[0]); code.vpcmpub(k1, indicies, code.BConst<8>(xword, 1 * 16), CmpInt::LessThan); if (is_defaults_zero) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpermb(result | k1 | T_z, indicies, xmm_table0); ctx.reg_alloc.DefineValue(code, inst, result); } else { - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.vpermb(result | k1, indicies, xmm_table0); ctx.reg_alloc.DefineValue(code, inst, result); } } else if (code.HasHostFeature(HostFeature::SSSE3) && is_defaults_zero && table_size == 1) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); code.paddusb(indicies, code.Const(xword, 0x7070707070707070, 0x7070707070707070)); code.pshufb(xmm_table0, indicies); ctx.reg_alloc.DefineValue(code, inst, xmm_table0); } else if (code.HasHostFeature(HostFeature::SSE41) && table_size == 1) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm defaults = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const defaults = ctx.reg_alloc.UseXmm(code, args[0]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); if (code.HasHostFeature(HostFeature::AVX)) { code.vpaddusb(xmm0, indicies, code.Const(xword, 0x7070707070707070, 0x7070707070707070)); @@ -5253,9 +5614,9 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, xmm_table0); } else if (code.HasHostFeature(HostFeature::SSE41) && is_defaults_zero && table_size == 2) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); - const Xbyak::Xmm xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); - const Xbyak::Xmm xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[1]); + auto const indicies = ctx.reg_alloc.UseScratchXmm(code, args[2]); + auto const xmm_table0 = ctx.reg_alloc.UseScratchXmm(code, table[0]); + auto const xmm_table1 = ctx.reg_alloc.UseScratchXmm(code, table[1]); if (code.HasHostFeature(HostFeature::AVX)) { code.vpaddusb(xmm0, indicies, code.Const(xword, 0x7070707070707070, 0x7070707070707070)); @@ -5271,14 +5632,14 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, xmm_table0); return; } else if (code.HasHostFeature(HostFeature::AVX512_Ortho | HostFeature::AVX512BW)) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm masked = ctx.reg_alloc.ScratchXmm(code); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const masked = ctx.reg_alloc.ScratchXmm(code); code.vpandd(masked, indicies, code.Const(xword_b, 0xF0F0F0F0F0F0F0F0, 0xF0F0F0F0F0F0F0F0)); for (size_t i = 0; i < table_size; ++i) { - const Xbyak::Xmm xmm_table = ctx.reg_alloc.UseScratchXmm(code, table[i]); + auto const xmm_table = ctx.reg_alloc.UseScratchXmm(code, table[i]); const Xbyak::Opmask table_mask = k1; const u64 table_index = mcl::bit::replicate_element(i * 16); @@ -5295,15 +5656,15 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, result); } else if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm masked = ctx.reg_alloc.ScratchXmm(code); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const result = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const masked = ctx.reg_alloc.ScratchXmm(code); code.movaps(masked, code.Const(xword, 0xF0F0F0F0F0F0F0F0, 0xF0F0F0F0F0F0F0F0)); code.pand(masked, indicies); for (size_t i = 0; i < table_size; ++i) { - const Xbyak::Xmm xmm_table = ctx.reg_alloc.UseScratchXmm(code, table[i]); + auto const xmm_table = ctx.reg_alloc.UseScratchXmm(code, table[i]); const u64 table_index = mcl::bit::replicate_element(i * 16); @@ -5327,13 +5688,13 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { const u32 stack_space = static_cast((table_size + 2) * 16); ctx.reg_alloc.AllocStackSpace(code, stack_space + ABI_SHADOW_SPACE); for (size_t i = 0; i < table_size; ++i) { - const Xbyak::Xmm table_value = ctx.reg_alloc.UseXmm(code, table[i]); + auto const table_value = ctx.reg_alloc.UseXmm(code, table[i]); code.movaps(xword[rsp + ABI_SHADOW_SPACE + i * 16], table_value); ctx.reg_alloc.Release(table_value); } - const Xbyak::Xmm defaults = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm indicies = ctx.reg_alloc.UseXmm(code, args[2]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const defaults = ctx.reg_alloc.UseXmm(code, args[0]); + auto const indicies = ctx.reg_alloc.UseXmm(code, args[2]); + auto const result = ctx.reg_alloc.ScratchXmm(code); ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.HostCall(code, nullptr); code.lea(code.ABI_PARAM1, ptr[rsp + ABI_SHADOW_SPACE]); @@ -5360,8 +5721,8 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorTranspose8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm upper = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const upper = ctx.reg_alloc.UseScratchXmm(code, args[1]); const bool part = args[2].GetImmediateU1(); if (!part) { @@ -5379,8 +5740,8 @@ void EmitX64::EmitVectorTranspose8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorTranspose16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm upper = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const upper = ctx.reg_alloc.UseScratchXmm(code, args[1]); const bool part = args[2].GetImmediateU1(); if (!part) { @@ -5398,8 +5759,8 @@ void EmitX64::EmitVectorTranspose16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorTranspose32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm upper = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const upper = ctx.reg_alloc.UseXmm(code, args[1]); const bool part = args[2].GetImmediateU1(); code.shufps(lower, upper, !part ? 0b10001000 : 0b11011101); @@ -5411,8 +5772,8 @@ void EmitX64::EmitVectorTranspose32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorTranspose64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm upper = ctx.reg_alloc.UseXmm(code, args[1]); + auto const lower = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const upper = ctx.reg_alloc.UseXmm(code, args[1]); const bool part = args[2].GetImmediateU1(); code.shufpd(lower, upper, !part ? 0b00 : 0b11); @@ -5420,89 +5781,87 @@ void EmitX64::EmitVectorTranspose64(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, lower); } -static void EmitVectorUnsignedAbsoluteDifference(size_t esize, EmitContext& ctx, IR::Inst* inst, BlockOfCode& code) { + +void EmitX64::EmitVectorUnsignedAbsoluteDifference8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm temp = ctx.reg_alloc.ScratchXmm(code); - - switch (esize) { - case 8: { - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - + if (code.HasHostFeature(HostFeature::AVX)) { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.vpminub(tmp2, tmp0, tmp1); + code.vpmaxub(tmp0, tmp0, tmp1); + code.vpsubb(tmp0, tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.movdqa(temp, x); code.psubusb(temp, y); code.psubusb(y, x); code.por(temp, y); - break; + ctx.reg_alloc.DefineValue(code, inst, temp); } - case 16: { - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); +} +void EmitX64::EmitVectorUnsignedAbsoluteDifference16(EmitContext& ctx, IR::Inst* inst) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + if (code.HasHostFeature(HostFeature::AVX)) { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.vpminuw(tmp2, tmp0, tmp1); + code.vpmaxuw(tmp0, tmp0, tmp1); + code.vpsubw(tmp0, tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); + } else { + auto const temp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); code.movdqa(temp, x); code.psubusw(temp, y); code.psubusw(y, x); code.por(temp, y); - break; + ctx.reg_alloc.DefineValue(code, inst, temp); } - case 32: - // See https://stackoverflow.com/questions/3380785/compute-the-absolute-difference-between-unsigned-integers-using-sse/3527267#3527267 - if (code.HasHostFeature(HostFeature::SSE41)) { - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - - code.movdqa(temp, x); - code.pminud(x, y); - code.pmaxud(temp, y); - code.psubd(temp, x); - } else { - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - if (ctx.HasOptimization(OptimizationFlag::CodeSpeed)) { - // About 45 bytes - const Xbyak::Xmm temp_x = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm temp_y = ctx.reg_alloc.ScratchXmm(code); - code.pcmpeqd(temp, temp); - code.pslld(temp, 31); - code.movdqa(temp_x, x); - code.movdqa(temp_y, y); - code.paddd(temp_x, x); - code.paddd(temp_y, y); - code.pcmpgtd(temp_y, temp_x); - code.psubd(x, y); - code.pandn(temp, temp_y); - code.pxor(x, y); - code.psubd(x, y); - } else { - // Smaller code size - about 36 bytes - code.movdqa(temp, code.Const(xword, 0x8000000080000000, 0x8000000080000000)); - code.pxor(x, temp); - code.pxor(y, temp); - code.movdqa(temp, x); - code.psubd(temp, y); - code.pcmpgtd(y, x); - code.psrld(y, 1); - code.pxor(temp, y); - code.psubd(temp, y); - } - } - break; - } - - ctx.reg_alloc.DefineValue(code, inst, temp); -} - -void EmitX64::EmitVectorUnsignedAbsoluteDifference8(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedAbsoluteDifference(8, ctx, inst, code); -} - -void EmitX64::EmitVectorUnsignedAbsoluteDifference16(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedAbsoluteDifference(16, ctx, inst, code); } void EmitX64::EmitVectorUnsignedAbsoluteDifference32(EmitContext& ctx, IR::Inst* inst) { - EmitVectorUnsignedAbsoluteDifference(32, ctx, inst, code); + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + if (code.HasHostFeature(HostFeature::AVX)) { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + code.vpminud(tmp2, tmp0, tmp1); + code.vpmaxud(tmp0, tmp0, tmp1); + code.vpsubd(tmp0, tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp0); + } else if (code.HasHostFeature(HostFeature::SSE41)) { + // See https://stackoverflow.com/questions/3380785/compute-the-absolute-difference-between-unsigned-integers-using-sse/3527267#3527267 + auto const temp = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + code.movdqa(temp, x); + code.pminud(x, y); + code.pmaxud(temp, y); + code.psubd(temp, x); + ctx.reg_alloc.DefineValue(code, inst, temp); + } else { + auto const tmp0 = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const tmp1 = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp2 = ctx.reg_alloc.ScratchXmm(code); + auto const tmp3 = ctx.reg_alloc.ScratchXmm(code); + code.movdqa(tmp2, code.Const(xword, 0x8000'00008000'0000, 0x8000'00008000'0000)); + code.movdqa(tmp3, tmp1); + code.pxor(tmp3, tmp2); + code.pxor(tmp2, tmp0); + code.pcmpgtd(tmp2, tmp3); + code.psubd(tmp0, tmp1); + code.pxor(tmp0, tmp2); + code.psubd(tmp2, tmp0); + //code.movdqa(tmp0, tmp2); + ctx.reg_alloc.DefineValue(code, inst, tmp2); + } } void EmitX64::EmitVectorUnsignedMultiply16(EmitContext& ctx, IR::Inst* inst) { @@ -5510,11 +5869,11 @@ void EmitX64::EmitVectorUnsignedMultiply16(EmitContext& ctx, IR::Inst* inst) { const auto lower_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetLowerFromOp); auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); if (upper_inst) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { code.vpmulhuw(result, x, y); } else { @@ -5526,7 +5885,7 @@ void EmitX64::EmitVectorUnsignedMultiply16(EmitContext& ctx, IR::Inst* inst) { } if (lower_inst) { - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); if (code.HasHostFeature(HostFeature::AVX)) { code.vpmullw(result, x, y); } else { @@ -5544,24 +5903,24 @@ void EmitX64::EmitVectorUnsignedMultiply32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); if (lower_inst && !upper_inst && code.HasHostFeature(HostFeature::AVX)) { - const Xbyak::Xmm x = ctx.reg_alloc.UseXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const x = ctx.reg_alloc.UseXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseXmm(code, args[1]); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmulld(result, x, y); ctx.reg_alloc.DefineValue(code, lower_inst, result); } else if (code.HasHostFeature(HostFeature::AVX)) { - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); if (lower_inst) { - const Xbyak::Xmm lower_result = ctx.reg_alloc.ScratchXmm(code); + auto const lower_result = ctx.reg_alloc.ScratchXmm(code); code.vpmulld(lower_result, x, y); ctx.reg_alloc.DefineValue(code, lower_inst, lower_result); } - const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); + auto const result = ctx.reg_alloc.ScratchXmm(code); code.vpmuludq(result, x, y); code.vpsrlq(x, x, 32); @@ -5571,11 +5930,11 @@ void EmitX64::EmitVectorUnsignedMultiply32(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, upper_inst, result); } else { - const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm y = ctx.reg_alloc.UseScratchXmm(code, args[1]); - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - const Xbyak::Xmm upper_result = upper_inst ? ctx.reg_alloc.ScratchXmm(code) : Xbyak::Xmm{-1}; - const Xbyak::Xmm lower_result = lower_inst ? ctx.reg_alloc.ScratchXmm(code) : Xbyak::Xmm{-1}; + auto const x = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const y = ctx.reg_alloc.UseScratchXmm(code, args[1]); + auto const tmp = ctx.reg_alloc.ScratchXmm(code); + auto const upper_result = upper_inst ? ctx.reg_alloc.ScratchXmm(code) : Xbyak::Xmm{-1}; + auto const lower_result = lower_inst ? ctx.reg_alloc.ScratchXmm(code) : Xbyak::Xmm{-1}; // calculate unsigned multiply code.movdqa(tmp, x); @@ -5792,11 +6151,11 @@ void EmitX64::EmitVectorUnsignedSaturatedShiftLeft64(EmitContext& ctx, IR::Inst* void EmitX64::EmitVectorZeroExtend8(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { code.pmovzxbw(a, a); } else { - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); code.punpcklbw(a, zeros); } @@ -5805,11 +6164,11 @@ void EmitX64::EmitVectorZeroExtend8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorZeroExtend16(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { code.pmovzxwd(a, a); } else { - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); code.punpcklwd(a, zeros); } @@ -5818,11 +6177,11 @@ void EmitX64::EmitVectorZeroExtend16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorZeroExtend32(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); if (code.HasHostFeature(HostFeature::SSE41)) { code.pmovzxdq(a, a); } else { - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); code.punpckldq(a, zeros); } @@ -5831,8 +6190,8 @@ void EmitX64::EmitVectorZeroExtend32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorZeroExtend64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - const Xbyak::Xmm zeros = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const zeros = ctx.reg_alloc.ScratchXmm(code); code.pxor(zeros, zeros); code.punpcklqdq(a, zeros); ctx.reg_alloc.DefineValue(code, inst, a); @@ -5840,7 +6199,7 @@ void EmitX64::EmitVectorZeroExtend64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorZeroUpper(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - const Xbyak::Xmm a = ctx.reg_alloc.UseScratchXmm(code, args[0]); + auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); code.movq(a, a); // TODO: !IsLastUse @@ -5848,7 +6207,7 @@ void EmitX64::EmitVectorZeroUpper(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitZeroVector(EmitContext& ctx, IR::Inst* inst) { - const Xbyak::Xmm a = ctx.reg_alloc.ScratchXmm(code); + auto const a = ctx.reg_alloc.ScratchXmm(code); code.pxor(a, a); ctx.reg_alloc.DefineValue(code, inst, a); } diff --git a/src/dynarmic/tests/A64/a64.cpp b/src/dynarmic/tests/A64/a64.cpp index 4d4484e53e..e85986ea5a 100644 --- a/src/dynarmic/tests/A64/a64.cpp +++ b/src/dynarmic/tests/A64/a64.cpp @@ -415,6 +415,105 @@ TEST_CASE("A64: URSHL", "[a64]") { CHECK(jit.GetVector(9) == Vector{0x0000000000000002, 0x12db8b8280e0ba}); } +TEST_CASE("A64: SQSHLU", "[a64]") { + A64TestEnv env; + A64::UserConfig jit_user_config{}; + jit_user_config.callbacks = &env; + A64::Jit jit{jit_user_config}; + + oaknut::VectorCodeGenerator code{env.code_mem, nullptr}; + code.SQSHLU(V8.B16(), V0.B16(), 1); + code.SQSHLU(V9.H8(), V1.H8(), 2); + code.SQSHLU(V10.S4(), V2.S4(), 28); + code.SQSHLU(V11.D2(), V3.D2(), 4); + code.SQSHLU(V12.S4(), V0.S4(), 1); + code.SQSHLU(V13.S4(), V1.S4(), 3); + code.SQSHLU(V14.S4(), V2.S4(), 0); + code.SQSHLU(V15.S4(), V3.S4(), 0); + + jit.SetVector(0, Vector{0xffffffff'18ba6a6a, 0x7fffffff'943b954f}); + jit.SetVector(1, Vector{0x0000000b'0000000f, 0xffffffff'ffffffff}); + jit.SetVector(2, Vector{0x00000001'000000ff, 0x00000010'0000007f}); + jit.SetVector(3, Vector{0xffffffffffffffff, 0x96dc5c140705cd04}); + + env.ticks_left = env.code_mem.size(); + CheckedRun([&]() { jit.Run(); }); + + CHECK(jit.GetVector(8) == Vector{0x3000d4d4, 0xfe0000000076009e}); + CHECK(jit.GetVector(9) == Vector{0x2c0000003c, 0}); + CHECK(jit.GetVector(10) == Vector{0x10000000'ffffffff, 0xffffffff'ffffffff}); + CHECK(jit.GetVector(11) == Vector{0, 0}); + CHECK(jit.GetVector(12) == Vector{0x3174d4d4, 0xfffffffe00000000}); + CHECK(jit.GetVector(13) == Vector{0x5800000078, 0}); + CHECK(jit.GetVector(14) == Vector{0x1000000ff, 0x100000007f}); + CHECK(jit.GetVector(15) == Vector{0, 0x705cd04}); +} + +TEST_CASE("A64: SMIN", "[a64]") { + A64TestEnv env; + A64::UserConfig jit_user_config{}; + jit_user_config.callbacks = &env; + A64::Jit jit{jit_user_config}; + + oaknut::VectorCodeGenerator code{env.code_mem, nullptr}; + code.SMIN(V8.B16(), V0.B16(), V3.B16()); + code.SMIN(V9.H8(), V1.H8(), V2.H8()); + code.SMIN(V10.S4(), V2.S4(), V3.S4()); + code.SMIN(V11.S4(), V3.S4(), V3.S4()); + code.SMIN(V12.S4(), V0.S4(), V3.S4()); + code.SMIN(V13.S4(), V1.S4(), V2.S4()); + code.SMIN(V14.S4(), V2.S4(), V1.S4()); + code.SMIN(V15.S4(), V3.S4(), V0.S4()); + + jit.SetPC(0); + jit.SetVector(0, Vector{0xffffffff'18ba6a6a, 0x7fffffff'943b954f}); + jit.SetVector(1, Vector{0x0000000b'0000000f, 0xffffffff'ffffffff}); + jit.SetVector(2, Vector{0x00000001'000000ff, 0x00000010'0000007f}); + jit.SetVector(3, Vector{0xffffffff'ffffffff, 0x96dc5c14'0705cd04}); + + env.ticks_left = 4; + CheckedRun([&]() { jit.Run(); }); + + REQUIRE(jit.GetVector(8) == Vector{0xffffffffffbaffff, 0x96dcffff94059504}); + REQUIRE(jit.GetVector(9) == Vector{0x10000000f, 0xffffffffffffffff}); + REQUIRE(jit.GetVector(10) == Vector{0xffffffffffffffff, 0x96dc5c140000007f}); +} + +TEST_CASE("A64: SMINP", "[a64]") { + A64TestEnv env; + A64::UserConfig jit_user_config{}; + jit_user_config.callbacks = &env; + A64::Jit jit{jit_user_config}; + + oaknut::VectorCodeGenerator code{env.code_mem, nullptr}; + code.SMINP(V8.B16(), V0.B16(), V3.B16()); + code.SMINP(V9.H8(), V1.H8(), V2.H8()); + code.SMINP(V10.S4(), V2.S4(), V1.S4()); + code.SMINP(V11.S4(), V3.S4(), V3.S4()); + code.SMINP(V12.S4(), V0.S4(), V3.S4()); + code.SMINP(V13.S4(), V1.S4(), V2.S4()); + code.SMINP(V14.S4(), V2.S4(), V1.S4()); + code.SMINP(V15.S4(), V3.S4(), V0.S4()); + + jit.SetPC(0); + jit.SetVector(0, Vector{0xffffffff'18ba6a6a, 0x7fffffff'943b954f}); + jit.SetVector(1, Vector{0x0000000b'0000000f, 0xffffffff'ffffffff}); + jit.SetVector(2, Vector{0x00000001'000000ff, 0x00000010'0000007f}); + jit.SetVector(3, Vector{0xffffffff'ffffffff, 0x96dc5c14'0705cd04}); + + env.ticks_left = 4; + CheckedRun([&]() { jit.Run(); }); + + REQUIRE(jit.GetVector(8) == Vector{0xffff9495ffffba6a, 0x961405cdffffffff}); + REQUIRE(jit.GetVector(9) == Vector{0xffffffff00000000, 0}); + REQUIRE(jit.GetVector(10) == Vector{0x1000000001, 0xffffffff0000000b}); + REQUIRE(jit.GetVector(11) == Vector{0x96dc5c14ffffffff, 0x96dc5c14ffffffff}); + REQUIRE(jit.GetVector(12) == Vector{0x943b954fffffffff, 0x96dc5c14ffffffff}); + REQUIRE(jit.GetVector(13) == Vector{0xffffffff0000000b, 0x1000000001}); + REQUIRE(jit.GetVector(14) == Vector{0x1000000001, 0xffffffff0000000b}); + REQUIRE(jit.GetVector(15) == Vector{0x96dc5c14ffffffff, 0x943b954fffffffff}); +} + TEST_CASE("A64: XTN", "[a64]") { A64TestEnv env; A64::UserConfig jit_user_config{}; From 0b179517b338201a0f4ba8bea391e14c7fc27d52 Mon Sep 17 00:00:00 2001 From: wildcard Date: Tue, 31 Mar 2026 04:49:20 +0200 Subject: [PATCH 07/68] [vulkan] Fix Vulkan graphics pipeline crash when image descriptor count exceeds 64 (#3785) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3785 Reviewed-by: Lizzie Reviewed-by: MaranBr Co-authored-by: wildcard Co-committed-by: wildcard --- .../renderer_vulkan/vk_graphics_pipeline.cpp | 31 ++++++++++++------- .../renderer_vulkan/vk_graphics_pipeline.h | 3 +- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index e989bf6b31..75fbcaa968 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -49,7 +49,7 @@ using VideoCore::Surface::PixelFormatFromDepthFormat; using VideoCore::Surface::PixelFormatFromRenderTargetFormat; constexpr size_t NUM_STAGES = Maxwell::MaxShaderStage; -constexpr size_t MAX_IMAGE_ELEMENTS = 64; +constexpr size_t INLINE_IMAGE_ELEMENTS = 64; DescriptorLayoutBuilder MakeBuilder(const Device& device, std::span infos) { DescriptorLayoutBuilder builder{device}; @@ -264,7 +264,11 @@ GraphicsPipeline::GraphicsPipeline( stage_infos[stage] = *info; enabled_uniform_buffer_masks[stage] = info->constant_buffer_mask; std::ranges::copy(info->constant_buffer_used_sizes, uniform_buffer_sizes[stage].begin()); + num_image_elements += Shader::NumDescriptors(info->texture_buffer_descriptors); + num_image_elements += Shader::NumDescriptors(info->image_buffer_descriptors); num_textures += Shader::NumDescriptors(info->texture_descriptors); + num_image_elements += Shader::NumDescriptors(info->texture_descriptors); + num_image_elements += Shader::NumDescriptors(info->image_descriptors); } fragment_has_color0_output = stage_infos[NUM_STAGES - 1].stores_frag_color[0]; auto func{[this, shader_notify, &render_pass_cache, &descriptor_pool, pipeline_statistics] { @@ -310,10 +314,10 @@ void GraphicsPipeline::AddTransition(GraphicsPipeline* transition) { template bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { - std::array views; - std::array samplers; - size_t sampler_index{}; - size_t view_index{}; + small_vector views; + small_vector samplers; + views.reserve(num_image_elements); + samplers.reserve(num_textures); texture_cache.SynchronizeGraphicsDescriptors(); @@ -358,11 +362,11 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { const auto add_image{[&](const auto& desc, bool blacklist) LAMBDA_FORCEINLINE { for (u32 index = 0; index < desc.count; ++index) { const auto handle{read_handle(desc, index)}; - views[view_index++] = { + views.push_back({ .index = handle.first, .blacklist = blacklist, .id = {} - }; + }); } }}; if constexpr (Spec::has_texture_buffers) { @@ -378,10 +382,10 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { for (const auto& desc : info.texture_descriptors) { for (u32 index = 0; index < desc.count; ++index) { const auto handle{read_handle(desc, index)}; - views[view_index++] = {handle.first}; + views.push_back({handle.first}); VideoCommon::SamplerId sampler{texture_cache.GetGraphicsSamplerId(handle.second)}; - samplers[sampler_index++] = sampler; + samplers.push_back(sampler); } } if constexpr (Spec::has_images) { @@ -407,7 +411,9 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { if constexpr (Spec::enabled_stages[4]) { config_stage(4); } - texture_cache.FillGraphicsImageViews(std::span(views.data(), view_index)); + ASSERT(views.size() == num_image_elements); + ASSERT(samplers.size() == num_textures); + texture_cache.FillGraphicsImageViews(std::span(views.data(), views.size())); VideoCommon::ImageViewInOut* texture_buffer_it{views.data()}; const auto bind_stage_info{[&](size_t stage) LAMBDA_FORCEINLINE { @@ -501,7 +507,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { buffer_cache.any_buffer_uploaded = false; } texture_cache.UpdateRenderTargets(false); - texture_cache.CheckFeedbackLoop(views); + texture_cache.CheckFeedbackLoop(std::span{views.data(), + views.size()}); ConfigureDraw(rescaling, render_area); return true; @@ -987,7 +994,7 @@ void GraphicsPipeline::Validate() { num_images += Shader::NumDescriptors(info.texture_descriptors); num_images += Shader::NumDescriptors(info.image_descriptors); } - ASSERT(num_images <= MAX_IMAGE_ELEMENTS); + ASSERT(num_images == num_image_elements); } } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 34941d6e8d..1a41e50a36 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -159,6 +159,7 @@ private: std::array stage_infos; std::array enabled_uniform_buffer_masks{}; VideoCommon::UniformBufferSizes uniform_buffer_sizes{}; + size_t num_image_elements{}; u32 num_textures{}; bool fragment_has_color0_output{}; From 8e14f07a693b08a2e8a68a0da9c57fd88505ef22 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 05:20:58 +0200 Subject: [PATCH 08/68] [dynarmic] exclude %rbp from regalloc & have proper frame info (#3752) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3752 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- .../src/dynarmic/backend/x64/a32_emit_x64.cpp | 9 +++---- .../src/dynarmic/backend/x64/a64_emit_x64.cpp | 11 ++++----- .../backend/x64/exception_handler_windows.cpp | 24 +++++++++---------- .../src/dynarmic/backend/x64/reg_alloc.cpp | 3 ++- .../src/dynarmic/backend/x64/stack_layout.h | 9 ++++--- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp index 80f0f9cc2f..049a58432e 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp @@ -114,6 +114,8 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { // Start emitting. code.align(); const u8* const entrypoint = code.getCurr(); + code.mov(code.qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer)], rbp); + code.lea(rbp, code.ptr[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer) - 8]); EmitCondPrelude(ctx); @@ -146,15 +148,14 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { reg_alloc.AssertNoMoreUses(); - if (conf.enable_cycle_counting) { + if (conf.enable_cycle_counting) EmitAddCycles(block.CycleCount()); - } + code.mov(rbp, code.qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer)]); EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep()); code.int3(); - for (auto& deferred_emit : ctx.deferred_emits) { + for (auto& deferred_emit : ctx.deferred_emits) deferred_emit(); - } code.int3(); const size_t size = size_t(code.getCurr() - entrypoint); diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp index 832cfdcce2..7c43ea1ab2 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp @@ -88,6 +88,8 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) noexcept { // Start emitting. code.align(); const auto* const entrypoint = code.getCurr(); + code.mov(code.qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer)], rbp); + code.lea(rbp, code.ptr[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer) - 8]); DEBUG_ASSERT(block.GetCondition() == IR::Cond::AL); typedef void (EmitX64::*EmitHandlerFn)(EmitContext& context, IR::Inst* inst); @@ -139,16 +141,13 @@ finish_this_inst: } reg_alloc.AssertNoMoreUses(); - - if (conf.enable_cycle_counting) { + if (conf.enable_cycle_counting) EmitAddCycles(block.CycleCount()); - } + code.mov(rbp, code.qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer)]); EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep()); code.int3(); - - for (auto& deferred_emit : ctx.deferred_emits) { + for (auto& deferred_emit : ctx.deferred_emits) deferred_emit(); - } code.int3(); const size_t size = size_t(code.getCurr() - entrypoint); diff --git a/src/dynarmic/src/dynarmic/backend/x64/exception_handler_windows.cpp b/src/dynarmic/src/dynarmic/backend/x64/exception_handler_windows.cpp index 3ae553bccd..bae397ff2b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/exception_handler_windows.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/exception_handler_windows.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -176,7 +176,7 @@ struct ExceptionHandler::Impl final { code.align(16); const u8* exception_handler_without_cb = code.getCurr(); - code.mov(code.eax, static_cast(ExceptionContinueSearch)); + code.mov(code.eax, u32(ExceptionContinueSearch)); code.ret(); code.align(16); @@ -192,20 +192,18 @@ struct ExceptionHandler::Impl final { code.lea(code.rsp, code.ptr[code.rsp - 8]); code.mov(code.ABI_PARAM1, std::bit_cast(&cb)); code.mov(code.ABI_PARAM2, code.ABI_PARAM3); - code.CallLambda( - [](const std::function& cb_, PCONTEXT ctx) { - FakeCall fc = cb_(ctx->Rip); - - ctx->Rsp -= sizeof(u64); - *std::bit_cast(ctx->Rsp) = fc.ret_rip; - ctx->Rip = fc.call_rip; - }); + code.CallLambda([](const std::function& cb_, PCONTEXT ctx) { + FakeCall fc = cb_(ctx->Rip); + ctx->Rsp -= sizeof(u64); + *std::bit_cast(ctx->Rsp) = fc.ret_rip; + ctx->Rip = fc.call_rip; + }); code.add(code.rsp, 8); - code.mov(code.eax, static_cast(ExceptionContinueExecution)); + code.mov(code.eax, u32(ExceptionContinueExecution)); code.ret(); - exception_handler_without_cb_offset = static_cast(exception_handler_without_cb - code.getCode()); - exception_handler_with_cb_offset = static_cast(exception_handler_with_cb - code.getCode()); + exception_handler_without_cb_offset = ULONG(exception_handler_without_cb - code.getCode()); + exception_handler_with_cb_offset = ULONG(exception_handler_with_cb - code.getCode()); code.align(16); UNWIND_INFO* unwind_info = static_cast(code.AllocateFromCodeSpace(sizeof(UNWIND_INFO))); diff --git a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp index 5c5ed25131..2cfa14ae18 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp @@ -417,7 +417,8 @@ HostLoc RegAlloc::SelectARegister(std::bitset<32> desired_locations) const noexc // While R13 and R14 are technically available, we avoid allocating for them // at all costs, because theoretically skipping them is better than spilling // all over the place - i also fixes bugs with high reg pressure - } else if (i >= HostLoc::R13 && i <= HostLoc::R15) { + // %rbp must not be trashed, so skip it as well + } else if (i == HostLoc::RBP || (i >= HostLoc::R13 && i <= HostLoc::R15)) { // skip, do not touch // Intel recommends to reuse registers as soon as they're overwritable (DO NOT SPILL) } else if (loc_info.IsEmpty()) { diff --git a/src/dynarmic/src/dynarmic/backend/x64/stack_layout.h b/src/dynarmic/src/dynarmic/backend/x64/stack_layout.h index 50737f12eb..43a3fc7ab2 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/stack_layout.h +++ b/src/dynarmic/src/dynarmic/backend/x64/stack_layout.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -22,14 +22,13 @@ constexpr size_t SpillCount = 64; #endif struct alignas(16) StackLayout { + // Needs alignment for VMOV and XMM spills + alignas(16) std::array, SpillCount> spill; s64 cycles_remaining; s64 cycles_to_run; - - std::array, SpillCount> spill; - u32 save_host_MXCSR; - bool check_bit; + u64 abi_base_pointer; }; #ifdef _MSC_VER From cf7086de7cd0d4c37b02093a2cf7659c84f94e60 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 05:23:19 +0200 Subject: [PATCH 09/68] [dynarmic] avoid stable_vector<> reallocations for shared labels (#3717) this reduces some overhead due to frequent reallocations Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3717 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- .../src/dynarmic/backend/x64/a32_emit_x64.cpp | 10 +- .../src/dynarmic/backend/x64/a32_emit_x64.h | 5 +- .../src/dynarmic/backend/x64/a64_emit_x64.cpp | 10 +- .../src/dynarmic/backend/x64/a64_emit_x64.h | 5 +- .../src/dynarmic/backend/x64/emit_x64.cpp | 7 +- .../src/dynarmic/backend/x64/emit_x64.h | 22 +- .../backend/x64/emit_x64_floating_point.cpp | 22 +- .../backend/x64/emit_x64_memory.cpp.inc | 18 +- .../dynarmic/backend/x64/emit_x64_memory.h | 2 +- .../x64/emit_x64_vector_floating_point.cpp | 233 +++++++++--------- 10 files changed, 167 insertions(+), 167 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp index 049a58432e..bbbecada63 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp @@ -59,8 +59,10 @@ static Xbyak::Address MJitStateExtReg(A32::ExtReg reg) { UNREACHABLE(); } -A32EmitContext::A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block) - : EmitContext(reg_alloc, block), conf(conf) {} +A32EmitContext::A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) + : EmitContext(reg_alloc, block, shared_labels) + , conf(conf) +{} A32::LocationDescriptor A32EmitContext::Location() const { return A32::LocationDescriptor{block.Location()}; @@ -109,7 +111,8 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { gprs.reset(size_t(HostLoc::R14)); return gprs; }(), any_xmm); - A32EmitContext ctx{conf, reg_alloc, block}; + + A32EmitContext ctx{conf, reg_alloc, block, shared_labels}; // Start emitting. code.align(); @@ -168,6 +171,7 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { auto const bdesc = RegisterBlock(descriptor, entrypoint, size); code.DisableWriting(); + shared_labels.clear(); return bdesc; } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h index 5ec78ff50e..8e97dc7737 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -29,7 +29,7 @@ namespace Dynarmic::Backend::X64 { class RegAlloc; struct A32EmitContext final : public EmitContext { - A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block); + A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); A32::LocationDescriptor Location() const; A32::LocationDescriptor EndLocation() const; @@ -130,6 +130,7 @@ public: ankerl::unordered_dense::map, void (*)()> write_fallbacks; ankerl::unordered_dense::map, void (*)()> exclusive_write_fallbacks; ankerl::unordered_dense::set do_not_fastmem; + boost::container::stable_vector shared_labels; void (*memory_read_128)() = nullptr; // Dummy void (*memory_write_128)() = nullptr; // Dummy const void* terminal_handler_pop_rsb_hint; diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp index 7c43ea1ab2..8edeb29aed 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp @@ -37,8 +37,10 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; -A64EmitContext::A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block) - : EmitContext(reg_alloc, block), conf(conf) {} +A64EmitContext::A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) + : EmitContext(reg_alloc, block, shared_labels) + , conf(conf) +{} A64::LocationDescriptor A64EmitContext::Location() const { return A64::LocationDescriptor{block.Location()}; @@ -83,7 +85,8 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) noexcept { gprs.reset(size_t(HostLoc::R14)); return gprs; }(), any_xmm}; - A64EmitContext ctx{conf, reg_alloc, block}; + + A64EmitContext ctx{conf, reg_alloc, block, shared_labels}; // Start emitting. code.align(); @@ -160,6 +163,7 @@ finish_this_inst: auto bdesc = RegisterBlock(descriptor, entrypoint, size); code.DisableWriting(); + shared_labels.clear(); return bdesc; } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h index dd556e36ce..d57b1d81b9 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -27,7 +27,7 @@ namespace Dynarmic::Backend::X64 { struct A64EmitContext final : public EmitContext { - A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block); + A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); A64::LocationDescriptor Location() const; bool IsSingleStep() const; @@ -126,6 +126,7 @@ public: ankerl::unordered_dense::map, void (*)()> write_fallbacks; ankerl::unordered_dense::map, void (*)()> exclusive_write_fallbacks; ankerl::unordered_dense::set do_not_fastmem; + boost::container::stable_vector shared_labels; const void* terminal_handler_pop_rsb_hint = nullptr; const void* terminal_handler_fast_dispatch_hint = nullptr; FastDispatchEntry& (*fast_dispatch_table_lookup)(u64) = nullptr; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp index 4e515fef2f..4ed198e09f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp @@ -32,8 +32,11 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; -EmitContext::EmitContext(RegAlloc& reg_alloc, IR::Block& block) - : reg_alloc(reg_alloc), block(block) {} +EmitContext::EmitContext(RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) + : reg_alloc(reg_alloc) + , block(block) + , shared_labels(shared_labels) +{} EmitContext::~EmitContext() = default; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h index 301f4ffc89..619945e19a 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h @@ -16,11 +16,12 @@ #include #include -#include "dynarmic/mcl/bit.hpp" #include -#include "dynarmic/backend/x64/xbyak.h" +#include #include +#include "dynarmic/backend/x64/xbyak.h" +#include "dynarmic/mcl/bit.hpp" #include "dynarmic/backend/exception_handler.h" #include "dynarmic/backend/x64/reg_alloc.h" #include "dynarmic/common/fp/fpcr.h" @@ -52,24 +53,23 @@ using VectorArray = std::array> template using HalfVectorArray = std::array / 2>; +using SharedLabel = Xbyak::Label*; struct EmitContext { - EmitContext(RegAlloc& reg_alloc, IR::Block& block); + EmitContext(RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); virtual ~EmitContext(); virtual FP::FPCR FPCR(bool fpcr_controlled = true) const = 0; virtual bool HasOptimization(OptimizationFlag flag) const = 0; - RegAlloc& reg_alloc; - IR::Block& block; + [[nodiscard]] inline Xbyak::Label* GenSharedLabel() noexcept { + return &shared_labels.emplace_back(); + } std::vector> deferred_emits; + RegAlloc& reg_alloc; + IR::Block& block; + boost::container::stable_vector& shared_labels; }; -using SharedLabel = std::shared_ptr; - -inline SharedLabel GenSharedLabel() { - return std::make_shared(); -} - class EmitX64 { public: struct BlockDescriptor { diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp index d073991fbe..6a3ab005f3 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp @@ -136,7 +136,7 @@ void ForceToDefaultNaN(BlockOfCode& code, Xbyak::Xmm result) { template SharedLabel ProcessNaN(BlockOfCode& code, EmitContext& ctx, Xbyak::Xmm a) { - SharedLabel nan = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel nan = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); FCODE(ucomis)(a, a); code.jp(*nan, code.T_NEAR); @@ -251,7 +251,7 @@ template void FPTwoOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); - SharedLabel end = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(); Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]); @@ -304,7 +304,7 @@ void FPThreeOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Reg64 tmp = ctx.reg_alloc.ScratchGpr(code); - SharedLabel end = GenSharedLabel(), nan = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), nan = ctx.GenSharedLabel(); code.movaps(result, op1); if constexpr (std::is_member_function_pointer_v) { @@ -413,7 +413,7 @@ static void EmitFPMinMax(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, bo DenormalsAreZero(code, ctx, {result, operand}); - SharedLabel equal = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel equal = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); FCODE(ucomis)(result, operand); code.jz(*equal, code.T_NEAR); @@ -484,7 +484,7 @@ static inline void EmitFPMinMaxNumeric(BlockOfCode& code, EmitContext& ctx, IR:: } }; - SharedLabel end = GenSharedLabel(), z = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), z = ctx.GenSharedLabel(); FCODE(ucomis)(op1, op2); code.jz(*z, code.T_NEAR); @@ -632,7 +632,7 @@ static void EmitFPMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, bo } if (code.HasHostFeature(HostFeature::FMA | HostFeature::AVX)) { - SharedLabel fallback = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel fallback = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); const Xbyak::Xmm operand1 = ctx.reg_alloc.UseXmm(code, args[0]); const Xbyak::Xmm operand2 = ctx.reg_alloc.UseXmm(code, args[1]); @@ -843,7 +843,7 @@ static void EmitFPMulX(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Reg64 tmp = do_default_nan ? INVALID_REG : ctx.reg_alloc.ScratchGpr(code); - SharedLabel end = GenSharedLabel(), nan = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), nan = ctx.GenSharedLabel(); if (code.HasHostFeature(HostFeature::AVX)) { FCODE(vmuls)(result, op1, op2); @@ -981,7 +981,7 @@ static void EmitFPRecipStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* } if (code.HasHostFeature(HostFeature::FMA)) { - SharedLabel end = GenSharedLabel(), fallback = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), fallback = ctx.GenSharedLabel(); const Xbyak::Xmm operand1 = ctx.reg_alloc.UseXmm(code, args[0]); const Xbyak::Xmm operand2 = ctx.reg_alloc.UseXmm(code, args[1]); @@ -1129,7 +1129,7 @@ static void EmitFPRSqrtEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* i const Xbyak::Xmm value = ctx.reg_alloc.ScratchXmm(code); [[maybe_unused]] const Xbyak::Reg32 tmp = ctx.reg_alloc.ScratchGpr(code).cvt32(); - SharedLabel bad_values = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel bad_values = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); code.movaps(value, operand); @@ -1296,7 +1296,7 @@ static void EmitFPRSqrtStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* } if (code.HasHostFeature(HostFeature::FMA | HostFeature::AVX)) { - SharedLabel end = GenSharedLabel(), fallback = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), fallback = ctx.GenSharedLabel(); const Xbyak::Xmm operand1 = ctx.reg_alloc.UseXmm(code, args[0]); const Xbyak::Xmm operand2 = ctx.reg_alloc.UseXmm(code, args[1]); @@ -1641,7 +1641,7 @@ static void EmitFPToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { const Xbyak::Xmm scratch = ctx.reg_alloc.ScratchXmm(code); if (!unsigned_) { - SharedLabel saturate_max = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel saturate_max = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); ZeroIfNaN<64>(code, src, scratch); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc index 54fc595214..4fa14d504b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc @@ -86,7 +86,7 @@ void AxxEmitX64::EmitMemoryRead(AxxEmitContext& ctx, IR::Inst* inst) { const auto wrapped_fn = read_fallbacks[std::make_tuple(ordered, bitsize, vaddr.getIdx(), value_idx)]; - SharedLabel abort = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel abort = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); if (fastmem_marker) { // Use fastmem @@ -108,7 +108,7 @@ void AxxEmitX64::EmitMemoryRead(AxxEmitContext& ctx, IR::Inst* inst) { conf.recompile_on_fastmem_failure, }); - EmitCheckMemoryAbort(ctx, inst, end.get()); + EmitCheckMemoryAbort(ctx, inst, end); code.jmp(*end, code.T_NEAR); }); } else { @@ -120,7 +120,7 @@ void AxxEmitX64::EmitMemoryRead(AxxEmitContext& ctx, IR::Inst* inst) { ctx.deferred_emits.emplace_back([=, this, &ctx] { code.L(*abort); code.call(wrapped_fn); - EmitCheckMemoryAbort(ctx, inst, end.get()); + EmitCheckMemoryAbort(ctx, inst, end); code.jmp(*end, code.T_NEAR); }); } @@ -173,7 +173,7 @@ void AxxEmitX64::EmitMemoryWrite(AxxEmitContext& ctx, IR::Inst* inst) { const auto wrapped_fn = write_fallbacks[std::make_tuple(ordered, bitsize, vaddr.getIdx(), value_idx)]; - SharedLabel abort = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel abort = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); if (fastmem_marker) { // Use fastmem @@ -195,7 +195,7 @@ void AxxEmitX64::EmitMemoryWrite(AxxEmitContext& ctx, IR::Inst* inst) { conf.recompile_on_fastmem_failure, }); - EmitCheckMemoryAbort(ctx, inst, end.get()); + EmitCheckMemoryAbort(ctx, inst, end); code.jmp(*end, code.T_NEAR); }); } else { @@ -207,7 +207,7 @@ void AxxEmitX64::EmitMemoryWrite(AxxEmitContext& ctx, IR::Inst* inst) { ctx.deferred_emits.emplace_back([=, this, &ctx] { code.L(*abort); code.call(wrapped_fn); - EmitCheckMemoryAbort(ctx, inst, end.get()); + EmitCheckMemoryAbort(ctx, inst, end); code.jmp(*end, code.T_NEAR); }); } @@ -352,7 +352,7 @@ void AxxEmitX64::EmitExclusiveReadMemoryInline(AxxEmitContext& ctx, IR::Inst* in const auto fastmem_marker = ShouldFastmem(ctx, inst); if (fastmem_marker) { - SharedLabel abort = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel abort = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); bool require_abort_handling = false; const auto src_ptr = EmitFastmemVAddr(code, ctx, *abort, vaddr, require_abort_handling); @@ -427,7 +427,7 @@ void AxxEmitX64::EmitExclusiveWriteMemoryInline(AxxEmitContext& ctx, IR::Inst* i EmitExclusiveLock(code, conf, tmp, tmp2.cvt32()); - SharedLabel end = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(); code.mov(status, u32(1)); code.movzx(tmp.cvt32(), code.byte[code.ABI_JIT_PTR + offsetof(AxxJitState, exclusive_state)]); @@ -460,7 +460,7 @@ void AxxEmitX64::EmitExclusiveWriteMemoryInline(AxxEmitContext& ctx, IR::Inst* i const auto fastmem_marker = ShouldFastmem(ctx, inst); if (fastmem_marker) { - SharedLabel abort = GenSharedLabel(); + SharedLabel abort = ctx.GenSharedLabel(); bool require_abort_handling = false; const auto dest_ptr = EmitFastmemVAddr(code, ctx, *abort, vaddr, require_abort_handling, tmp); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index b354efcb51..3ac078f1d7 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -54,7 +54,7 @@ void EmitDetectMisalignedVAddr(BlockOfCode& code, EmitContext& ctx, size_t bitsi if (ctx.conf.only_detect_misalignment_via_page_table_on_page_boundary) { const u32 page_align_mask = static_cast(page_table_const_size - 1) & ~align_mask; - SharedLabel detect_boundary = GenSharedLabel(), resume = GenSharedLabel(); + SharedLabel detect_boundary = ctx.GenSharedLabel(), resume = ctx.GenSharedLabel(); code.jnz(*detect_boundary, code.T_NEAR); code.L(*resume); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index 70edfbd0bc..046ecc78d6 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -24,6 +24,7 @@ #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" +#include "dynarmic/common/fp/rounding_mode.h" #include "dynarmic/common/fp/util.h" #include "dynarmic/interface/optimization_flags.h" #include "dynarmic/ir/basic_block.h" @@ -93,7 +94,7 @@ void HandleNaNs(BlockOfCode& code, EmitContext& ctx, bool fpcr_controlled, std:: code.cmp(bitmask, 0); } - SharedLabel end = GenSharedLabel(), nan = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), nan = ctx.GenSharedLabel(); code.jnz(*nan, code.T_NEAR); code.L(*end); @@ -188,23 +189,6 @@ void ForceToDefaultNaN(BlockOfCode& code, FP::FPCR fpcr, Xbyak::Xmm result) { } } -template -void ZeroIfNaN(BlockOfCode& code, Xbyak::Xmm result) { - const Xbyak::Xmm nan_mask = xmm0; - if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { - constexpr u32 nan_to_zero = FixupLUT(FpFixup::PosZero, - FpFixup::PosZero); - FCODE(vfixupimmp)(result, result, code.BConst<32>(ptr_b, nan_to_zero), u8(0)); - } else if (code.HasHostFeature(HostFeature::AVX)) { - FCODE(vcmpordp)(nan_mask, result, result); - FCODE(vandp)(result, result, nan_mask); - } else { - code.movaps(nan_mask, result); - FCODE(cmpordp)(nan_mask, nan_mask); - code.andps(result, nan_mask); - } -} - template void DenormalsAreZero(BlockOfCode& code, FP::FPCR fpcr, std::initializer_list to_daz, Xbyak::Xmm tmp) { if (fpcr.FZ()) { @@ -1330,7 +1314,7 @@ void EmitFPVectorMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - SharedLabel end = GenSharedLabel(), fallback = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), fallback = ctx.GenSharedLabel(); MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { code.movaps(result, xmm_a); @@ -1603,7 +1587,7 @@ static void EmitRecipStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* in const Xbyak::Xmm operand2 = ctx.reg_alloc.UseXmm(code, args[1]); const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - SharedLabel end = GenSharedLabel(), fallback = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), fallback = ctx.GenSharedLabel(); MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { code.movaps(result, GetVectorOf(code)); @@ -1776,7 +1760,7 @@ static void EmitRSqrtEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* ins const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm value = ctx.reg_alloc.ScratchXmm(code); - SharedLabel bad_values = GenSharedLabel(), end = GenSharedLabel(); + SharedLabel bad_values = ctx.GenSharedLabel(), end = ctx.GenSharedLabel(); code.movaps(value, operand); @@ -1867,7 +1851,7 @@ static void EmitRSqrtStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* in const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm mask = ctx.reg_alloc.ScratchXmm(code); - SharedLabel end = GenSharedLabel(), fallback = GenSharedLabel(); + SharedLabel end = ctx.GenSharedLabel(), fallback = ctx.GenSharedLabel(); MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { code.vmovaps(result, GetVectorOf(code)); @@ -2004,120 +1988,123 @@ void EmitX64::EmitFPVectorToHalf32(EmitContext& ctx, IR::Inst* inst) { template void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { const size_t fbits = inst->GetArg(1).GetU8(); - const auto rounding = static_cast(inst->GetArg(2).GetU8()); + const auto rounding = FP::RoundingMode(inst->GetArg(2).GetU8()); [[maybe_unused]] const bool fpcr_controlled = inst->GetArg(3).GetU1(); - if constexpr (fsize != 16) { - if (code.HasHostFeature(HostFeature::SSE41) && rounding != FP::RoundingMode::ToNearest_TieAwayFromZero) { - auto args = ctx.reg_alloc.GetArgumentInfo(inst); - - const Xbyak::Xmm src = ctx.reg_alloc.UseScratchXmm(code, args[0]); - - MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { - const int round_imm = [&] { - switch (rounding) { - case FP::RoundingMode::ToNearest_TieEven: - default: - return 0b00; - case FP::RoundingMode::TowardsPlusInfinity: - return 0b10; - case FP::RoundingMode::TowardsMinusInfinity: - return 0b01; - case FP::RoundingMode::TowardsZero: - return 0b11; - } - }(); - - const auto perform_conversion = [&code, &ctx](const Xbyak::Xmm& src) { - // MSVC doesn't allow us to use a [&] capture, so we have to do this instead. - (void)ctx; - - if constexpr (fsize == 32) { - code.cvttps2dq(src, src); - } else { - if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { - code.vcvttpd2qq(src, src); - } else { - const Xbyak::Reg64 hi = ctx.reg_alloc.ScratchGpr(code); - const Xbyak::Reg64 lo = ctx.reg_alloc.ScratchGpr(code); - - code.cvttsd2si(lo, src); - code.punpckhqdq(src, src); - code.cvttsd2si(hi, src); - code.movq(src, lo); - code.pinsrq(src, hi, 1); - - ctx.reg_alloc.Release(hi); - ctx.reg_alloc.Release(lo); - } - } - }; - - if (fbits != 0) { - const u64 scale_factor = fsize == 32 - ? static_cast(fbits + 127) << 23 - : static_cast(fbits + 1023) << 52; - FCODE(mulp)(src, GetVectorOf(code, scale_factor)); + if (code.HasHostFeature(HostFeature::SSE41) && fsize != 16 && rounding != FP::RoundingMode::ToNearest_TieAwayFromZero) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + const Xbyak::Xmm src = ctx.reg_alloc.UseScratchXmm(code, args[0]); + MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { + const int round_imm = [&] { + switch (rounding) { + case FP::RoundingMode::ToNearest_TieEven: + default: + return 0b00; + case FP::RoundingMode::TowardsPlusInfinity: + return 0b10; + case FP::RoundingMode::TowardsMinusInfinity: + return 0b01; + case FP::RoundingMode::TowardsZero: + return 0b11; } + }(); + const auto perform_conversion = [&code, &ctx](const Xbyak::Xmm& src) { + // MSVC doesn't allow us to use a [&] capture, so we have to do this instead. + (void)ctx; - FCODE(roundp)(src, src, static_cast(round_imm)); - ZeroIfNaN(code, src); - - constexpr u64 float_upper_limit_signed = fsize == 32 ? 0x4f000000 : 0x43e0000000000000; - [[maybe_unused]] constexpr u64 float_upper_limit_unsigned = fsize == 32 ? 0x4f800000 : 0x43f0000000000000; - - if constexpr (unsigned_) { + if constexpr (fsize == 32) { + code.cvttps2dq(src, src); + } else { if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { - // Mask positive values - code.xorps(xmm0, xmm0); - FCODE(vcmpp)(k1, src, xmm0, Cmp::GreaterEqual_OQ); - - // Convert positive values to unsigned integers, write 0 anywhere else - // vcvttp*2u*q already saturates out-of-range values to (0xFFFF...) - if constexpr (fsize == 32) { - code.vcvttps2udq(src | k1 | T_z, src); - } else { - code.vcvttpd2uqq(src | k1 | T_z, src); - } + code.vcvttpd2qq(src, src); } else { - // Zero is minimum - code.xorps(xmm0, xmm0); - FCODE(cmplep)(xmm0, src); - FCODE(andp)(src, xmm0); + const Xbyak::Reg64 hi = ctx.reg_alloc.ScratchGpr(code); + const Xbyak::Reg64 lo = ctx.reg_alloc.ScratchGpr(code); - // Will we exceed unsigned range? - const Xbyak::Xmm exceed_unsigned = ctx.reg_alloc.ScratchXmm(code); - code.movaps(exceed_unsigned, GetVectorOf(code)); - FCODE(cmplep)(exceed_unsigned, src); + code.cvttsd2si(lo, src); + code.punpckhqdq(src, src); + code.cvttsd2si(hi, src); + code.movq(src, lo); + code.pinsrq(src, hi, 1); - // Will be exceed signed range? - const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); - code.movaps(tmp, GetVectorOf(code)); - code.movaps(xmm0, tmp); - FCODE(cmplep)(xmm0, src); - FCODE(andp)(tmp, xmm0); - FCODE(subp)(src, tmp); - perform_conversion(src); - ICODE(psll)(xmm0, u8(fsize - 1)); - FCODE(orp)(src, xmm0); + ctx.reg_alloc.Release(hi); + ctx.reg_alloc.Release(lo); + } + } + }; + if (fbits != 0) { + const u64 scale_factor = fsize == 32 + ? u64(fbits + 127) << 23 + : u64(fbits + 1023) << 52; + FCODE(mulp)(src, GetVectorOf(code, scale_factor)); + } - // Saturate to max - FCODE(orp)(src, exceed_unsigned); + FCODE(roundp)(src, src, u8(round_imm)); + const Xbyak::Xmm nan_mask = xmm0; + if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { + static constexpr u32 nan_to_zero = FixupLUT(FpFixup::PosZero, FpFixup::PosZero); + FCODE(vfixupimmp)(src, src, code.BConst<32>(ptr_b, nan_to_zero), u8(0)); + } else if (code.HasHostFeature(HostFeature::AVX)) { + FCODE(vcmpordp)(nan_mask, src, src); + FCODE(vandp)(src, src, nan_mask); + } else { + code.movaps(nan_mask, src); + FCODE(cmpordp)(nan_mask, nan_mask); + code.andps(src, nan_mask); + } + + constexpr u64 float_upper_limit_signed = fsize == 32 ? 0x4f000000 : 0x43e0000000000000; + [[maybe_unused]] constexpr u64 float_upper_limit_unsigned = fsize == 32 ? 0x4f800000 : 0x43f0000000000000; + + if constexpr (unsigned_) { + if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { + // Mask positive values + code.xorps(xmm0, xmm0); + FCODE(vcmpp)(k1, src, xmm0, Cmp::GreaterEqual_OQ); + + // Convert positive values to unsigned integers, write 0 anywhere else + // vcvttp*2u*q already saturates out-of-range values to (0xFFFF...) + if (fsize == 32) { + code.vcvttps2udq(src | k1 | T_z, src); + } else { + code.vcvttpd2uqq(src | k1 | T_z, src); } } else { - using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC - constexpr u64 integer_max = FPT((std::numeric_limits>>::max)()); - - code.movaps(xmm0, GetVectorOf(code)); + // Zero is minimum + code.xorps(xmm0, xmm0); FCODE(cmplep)(xmm0, src); - perform_conversion(src); - FCODE(blendvp)(src, GetVectorOf(code)); - } - }); + FCODE(andp)(src, xmm0); - ctx.reg_alloc.DefineValue(code, inst, src); - return; - } + // Will we exceed unsigned range? + const Xbyak::Xmm exceed_unsigned = ctx.reg_alloc.ScratchXmm(code); + code.movaps(exceed_unsigned, GetVectorOf(code)); + FCODE(cmplep)(exceed_unsigned, src); + + // Will be exceed signed range? + const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(code); + code.movaps(tmp, GetVectorOf(code)); + code.movaps(xmm0, tmp); + FCODE(cmplep)(xmm0, src); + FCODE(andp)(tmp, xmm0); + FCODE(subp)(src, tmp); + perform_conversion(src); + ICODE(psll)(xmm0, u8(fsize - 1)); + FCODE(orp)(src, xmm0); + + // Saturate to max + FCODE(orp)(src, exceed_unsigned); + } + } else { + using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC + constexpr u64 integer_max = FPT((std::numeric_limits>>::max)()); + code.movaps(xmm0, GetVectorOf(code)); + FCODE(cmplep)(xmm0, src); + perform_conversion(src); + FCODE(blendvp)(src, GetVectorOf(code)); + } + }); + ctx.reg_alloc.DefineValue(code, inst, src); + return; } using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC From e9f454106905bf535572c92993c5094450fad5a5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 05:23:43 +0200 Subject: [PATCH 10/68] [dynarmic] improve A32 translate loop (#3780) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3780 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- .../src/dynarmic/backend/x64/a32_emit_x64.cpp | 49 +++++++++++++------ src/dynarmic/src/dynarmic/ir/opcodes.inc | 5 ++ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp index bbbecada63..dd9e9e4a66 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp @@ -121,28 +121,49 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { code.lea(rbp, code.ptr[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer) - 8]); EmitCondPrelude(ctx); - - for (auto iter = block.instructions.begin(); iter != block.instructions.end(); ++iter) [[likely]] { - auto* inst = &*iter; - // Call the relevant Emit* member function. - switch (inst->GetOpcode()) { -#define OPCODE(name, type, ...) \ - case IR::Opcode::name: \ - A32EmitX64::Emit##name(ctx, inst); \ - break; -#define A32OPC(name, type, ...) \ - case IR::Opcode::A32##name: \ - A32EmitX64::EmitA32##name(ctx, inst);\ - break; + typedef void (EmitX64::*EmitHandlerFn)(EmitContext& context, IR::Inst* inst); + constexpr EmitHandlerFn opcode_handlers[] = { +#define OPCODE(name, type, ...) &EmitX64::Emit##name, +#define A32OPC(name, type, ...) +#define A64OPC(name, type, ...) +#include "dynarmic/ir/opcodes.inc" +#undef OPCODE +#undef A32OPC +#undef A64OPC + }; + typedef void (A32EmitX64::*A32EmitHandlerFn)(A32EmitContext& context, IR::Inst* inst); + constexpr A32EmitHandlerFn a32_handlers[] = { +#define OPCODE(...) +#define A32OPC(name, type, ...) &A32EmitX64::EmitA32##name, #define A64OPC(...) #include "dynarmic/ir/opcodes.inc" #undef OPCODE #undef A32OPC +#undef A64OPC + }; + + for (auto& inst : block.instructions) { + auto const opcode = inst.GetOpcode(); + // Call the relevant Emit* member function. + switch (opcode) { +#define OPCODE(name, type, ...) case IR::Opcode::name: goto opcode_branch; +#define A32OPC(name, type, ...) case IR::Opcode::A32##name: goto a32_branch; +#define A64OPC(name, type, ...) +#include "dynarmic/ir/opcodes.inc" +#undef OPCODE +#undef A32OPC #undef A64OPC default: UNREACHABLE(); } - reg_alloc.EndOfAllocScope(); +opcode_branch: + (this->*opcode_handlers[size_t(opcode)])(ctx, &inst); + goto finish_this_inst; +a32_branch: + // Update with FIRST A32 instruction + (this->*a32_handlers[size_t(opcode) - size_t(IR::Opcode::A32SetCheckBit)])(ctx, &inst); +finish_this_inst: + ctx.reg_alloc.EndOfAllocScope(); #ifndef NDEBUG if (conf.very_verbose_debugging_output) EmitVerboseDebuggingOutput(reg_alloc); diff --git a/src/dynarmic/src/dynarmic/ir/opcodes.inc b/src/dynarmic/src/dynarmic/ir/opcodes.inc index 6f57f278a3..b1ba5b2993 100644 --- a/src/dynarmic/src/dynarmic/ir/opcodes.inc +++ b/src/dynarmic/src/dynarmic/ir/opcodes.inc @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // First we list common shared opcodes // Since we give priority to A64 performance, we include them first, this is so we // can discard all A32 opcodes instead of having a "hole" in our checks @@ -710,6 +713,8 @@ A64OPC(ExclusiveWriteMemory32, U32, U64, A64OPC(ExclusiveWriteMemory64, U32, U64, U64, U64, AccType ) A64OPC(ExclusiveWriteMemory128, U32, U64, U64, U128, AccType ) +// Remember to update: +// - a32_emit_x64.cpp // A32 Context getters/setters A32OPC(SetCheckBit, Void, U1 ) From dd91b41a786a4d0402935f171f2f37e2e7ba5556 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 20:12:16 +0200 Subject: [PATCH 11/68] [core] remove parallel thread remnants that keep calling sysconf() everytime a memory object is created (#3804) pure spam of calls for _sysconf() Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3804 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- src/core/memory.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 5c57df424c..3a9ea308a8 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -45,11 +45,7 @@ static inline bool AddressSpaceContains(const Common::PageTable& table, const Co // from outside classes. This also allows modification to the internals of the memory // subsystem without needing to rebuild all files that make use of the memory interface. struct Memory::Impl { - explicit Impl(Core::System& system_) : system{system_} { - // Initialize thread count based on available cores for parallel memory operations - const unsigned int hw_concurrency = std::thread::hardware_concurrency(); - thread_count = (std::max)(2u, (std::min)(hw_concurrency, 8u)); // Limit to 8 threads max - } + explicit Impl(Core::System& system_) : system{system_} {} void SetCurrentPageTable(Kernel::KProcess& process) { current_page_table = &process.GetPageTable().GetImpl(); @@ -856,13 +852,7 @@ struct Memory::Impl { Tegra::MaxwellDeviceMemoryManager* gpu_device_memory{}; Common::PageTable* current_page_table = nullptr; - // Number of threads to use for parallel memory operations - unsigned int thread_count = 2; - - // Minimum size in bytes for which parallel processing is beneficial - //size_t PARALLEL_THRESHOLD = (L3 CACHE * NUM PHYSICAL CORES); // 64 KB - std::array - rasterizer_read_areas{}; + std::array rasterizer_read_areas{}; std::array rasterizer_write_areas{}; std::array, Core::Hardware::NUM_CPU_CORES> scratch_buffers{}; std::span gpu_dirty_managers; From ee2891c55e0386ae803aa4d09a4e3110db3143ef Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 20:12:41 +0200 Subject: [PATCH 12/68] [common] unify std::random_device (#3801) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3801 Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/CMakeLists.txt | 2 ++ src/common/random.cpp | 19 +++++++++++++++++++ src/common/random.h | 13 +++++++++++++ src/common/tiny_mt.h | 8 +------- src/common/uuid.cpp | 11 +++++------ src/core/file_sys/registered_cache.cpp | 7 ++----- .../board/nintendo/nx/k_system_control.cpp | 12 +++--------- .../board/nintendo/nx/k_system_control.h | 4 +++- src/core/hle/kernel/k_page_bitmap.h | 5 +++-- src/core/hle/kernel/k_thread.cpp | 9 ++++----- src/core/hle/service/mii/mii_util.h | 12 +++++++----- .../loader/deconstructed_rom_directory.cpp | 3 ++- src/core/loader/kip.cpp | 3 ++- src/core/loader/nro.cpp | 3 ++- src/frontend_common/settings_generator.cpp | 9 +++------ src/hid_core/frontend/input_converter.cpp | 19 +++++++++++-------- src/input_common/drivers/udp_client.cpp | 8 ++------ src/network/room.cpp | 4 +--- 18 files changed, 85 insertions(+), 66 deletions(-) create mode 100644 src/common/random.cpp create mode 100644 src/common/random.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 1ee4794272..98c1688441 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -134,6 +134,8 @@ add_library( typed_address.h uint128.h unique_function.h + random.cpp + random.h uuid.cpp uuid.h vector_math.h diff --git a/src/common/random.cpp b/src/common/random.cpp new file mode 100644 index 0000000000..d6865ee807 --- /dev/null +++ b/src/common/random.cpp @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include "common/random.h" + +static std::random_device g_random_device; + +namespace Common::Random { + [[nodiscard]] u32 Random32(u32 seed) noexcept { + return g_random_device(); + } + [[nodiscard]] u64 Random64(u64 seed) noexcept { + return g_random_device(); + } + [[nodiscard]] std::mt19937 GetMT19937() noexcept { + return std::mt19937(g_random_device()); + } +} diff --git a/src/common/random.h b/src/common/random.h new file mode 100644 index 0000000000..83210f6dc2 --- /dev/null +++ b/src/common/random.h @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include "common/common_types.h" + +namespace Common::Random { + [[nodiscard]] u32 Random32(u32 seed) noexcept; + [[nodiscard]] u64 Random64(u64 seed) noexcept; + [[nodiscard]] std::mt19937 GetMT19937() noexcept; +} diff --git a/src/common/tiny_mt.h b/src/common/tiny_mt.h index c9f9ed4a5d..4b556a33eb 100644 --- a/src/common/tiny_mt.h +++ b/src/common/tiny_mt.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -218,12 +218,6 @@ public: return t0; } - u64 GenerateRandomU64() { - const u32 lo = this->GenerateRandomU32(); - const u32 hi = this->GenerateRandomU32(); - return (u64{hi} << 32) | u64{lo}; - } - float GenerateRandomF32() { // Floats have 24 bits of mantissa. constexpr u32 MantissaBits = 24; diff --git a/src/common/uuid.cpp b/src/common/uuid.cpp index 8f0dba452c..d4a5733c26 100644 --- a/src/common/uuid.cpp +++ b/src/common/uuid.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,6 +13,7 @@ #include "common/assert.h" #include "common/tiny_mt.h" #include "common/uuid.h" +#include "common/random.h" namespace Common { @@ -175,21 +179,16 @@ u128 UUID::AsU128() const { } UUID UUID::MakeRandom() { - std::random_device device; - - return MakeRandomWithSeed(device()); + return MakeRandomWithSeed(Common::Random::Random32(0)); } UUID UUID::MakeRandomWithSeed(u32 seed) { // Create and initialize our RNG. TinyMT rng; rng.Initialize(seed); - UUID uuid; - // Populate the UUID with random bytes. rng.GenerateRandomBytes(uuid.uuid.data(), sizeof(UUID)); - return uuid; } diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index 61671ea333..af41820a36 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -12,6 +12,7 @@ #include "common/fs/path_util.h" #include "common/hex_util.h" #include "common/logging.h" +#include "common/random.h" #include "common/string_util.h" #include "core/crypto/key_manager.h" #include "core/file_sys/card_image.h" @@ -490,17 +491,13 @@ std::vector PlaceholderCache::List() const { } NcaID PlaceholderCache::Generate() { - std::random_device device; - std::mt19937 gen(device()); + auto gen = Common::Random::GetMT19937(); std::uniform_int_distribution distribution(1, (std::numeric_limits::max)()); - NcaID out{}; - const auto v1 = distribution(gen); const auto v2 = distribution(gen); std::memcpy(out.data(), &v1, sizeof(u64)); std::memcpy(out.data() + sizeof(u64), &v2, sizeof(u64)); - return out; } diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp index 1446653916..3343d1d282 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -7,6 +7,7 @@ #include #include "common/literals.h" +#include "common/random.h" #include "common/settings.h" #include "core/hle/kernel/board/nintendo/nx/k_system_control.h" @@ -201,15 +202,8 @@ u64 GenerateUniformRange(u64 min, u64 max, F f) { } // Anonymous namespace -u64 KSystemControl::GenerateRandomU64() { - std::random_device device; - std::mt19937 gen(device()); - std::uniform_int_distribution distribution(1, (std::numeric_limits::max)()); - return distribution(gen); -} - u64 KSystemControl::GenerateRandomRange(u64 min, u64 max) { - return GenerateUniformRange(min, max, GenerateRandomU64); + return GenerateUniformRange(min, max, Common::Random::GetMT19937()); } size_t KSystemControl::CalculateRequiredSecureMemorySize(size_t size, u32 pool) { diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.h b/src/core/hle/kernel/board/nintendo/nx/k_system_control.h index 60c5e58b73..41a25ba1c8 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.h +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -33,7 +36,6 @@ public: // Randomness. static u64 GenerateRandomRange(u64 min, u64 max); - static u64 GenerateRandomU64(); // Secure Memory. static size_t CalculateRequiredSecureMemorySize(size_t size, u32 pool); diff --git a/src/core/hle/kernel/k_page_bitmap.h b/src/core/hle/kernel/k_page_bitmap.h index fc21b81574..27bd682c5c 100644 --- a/src/core/hle/kernel/k_page_bitmap.h +++ b/src/core/hle/kernel/k_page_bitmap.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -14,6 +14,7 @@ #include "common/bit_util.h" #include "common/common_types.h" #include "common/tiny_mt.h" +#include "common/random.h" #include "core/hle/kernel/k_system_control.h" namespace Kernel { @@ -23,7 +24,7 @@ public: class RandomBitGenerator { public: RandomBitGenerator() { - m_rng.Initialize(static_cast(KSystemControl::GenerateRandomU64())); + m_rng.Initialize(u32(Common::Random::Random64(0))); } u64 SelectRandomBit(u64 bitmap) { diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 17bdb7b6fa..ea9b7eb114 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -20,6 +20,7 @@ #include "common/fiber.h" #include "common/logging.h" #include "common/settings.h" +#include "common/random.h" #include "core/core.h" #include "core/cpu_manager.h" #include "core/hardware_properties.h" @@ -45,8 +46,7 @@ namespace { constexpr inline s32 TerminatingThreadPriority = Kernel::Svc::SystemThreadPriorityHighest - 1; -static void ResetThreadContext32(Kernel::Svc::ThreadContext& ctx, u64 stack_top, u64 entry_point, - u64 arg) { +static void ResetThreadContext32(Kernel::Svc::ThreadContext& ctx, u64 stack_top, u64 entry_point, u64 arg) { ctx = {}; ctx.r[0] = arg; ctx.r[15] = entry_point; @@ -55,11 +55,10 @@ static void ResetThreadContext32(Kernel::Svc::ThreadContext& ctx, u64 stack_top, ctx.fpsr = 0; } -static void ResetThreadContext64(Kernel::Svc::ThreadContext& ctx, u64 stack_top, u64 entry_point, - u64 arg) { +static void ResetThreadContext64(Kernel::Svc::ThreadContext& ctx, u64 stack_top, u64 entry_point, u64 arg) { ctx = {}; ctx.r[0] = arg; - ctx.r[18] = Kernel::KSystemControl::GenerateRandomU64() | 1; + ctx.r[18] = Common::Random::Random64(0) | 1; ctx.pc = entry_point; ctx.sp = stack_top; ctx.fpcr = 0; diff --git a/src/core/hle/service/mii/mii_util.h b/src/core/hle/service/mii/mii_util.h index 3534fa31d5..2ef006765c 100644 --- a/src/core/hle/service/mii/mii_util.h +++ b/src/core/hle/service/mii/mii_util.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,6 +10,7 @@ #include #include "common/common_types.h" +#include "common/random.h" #include "common/swap.h" #include "common/uuid.h" #include "core/hle/service/mii/mii_types.h" @@ -65,11 +69,9 @@ public: template static T GetRandomValue(T min, T max) { - std::random_device device; - std::mt19937 gen(device()); - std::uniform_int_distribution distribution(static_cast(min), - static_cast(max)); - return static_cast(distribution(gen)); + std::uniform_int_distribution distribution{u64(min), u64(max)}; + auto gen = Common::Random::GetMT19937(); + return T(distribution(gen)); } template diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 4e0b119f21..2ea63e137e 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp @@ -6,6 +6,7 @@ #include #include "common/logging.h" +#include "common/random.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/content_archive.h" @@ -229,7 +230,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect // TODO: this is bad form of ASLR, it sucks size_t aslr_offset = ((::Settings::values.rng_seed_enabled.GetValue() ? ::Settings::values.rng_seed.GetValue() - : std::rand()) * 0x734287f27) & 0xfff000; + : Common::Random::Random64(0)) * 0x734287f27) & 0xfff000; // Setup the process code layout if (process.LoadFromMetadata(metadata, code_size, fastmem_base, aslr_offset, is_hbl).IsError()) { diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp index db6c98c5a3..81449ac8b8 100644 --- a/src/core/loader/kip.cpp +++ b/src/core/loader/kip.cpp @@ -6,6 +6,7 @@ #include #include "common/settings.h" +#include "common/random.h" #include "core/file_sys/kernel_executable.h" #include "core/file_sys/program_metadata.h" #include "core/hle/kernel/code_set.h" @@ -90,7 +91,7 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::KProcess& process, // TODO: this is bad form of ASLR, it sucks size_t aslr_offset = ((::Settings::values.rng_seed_enabled.GetValue() ? ::Settings::values.rng_seed.GetValue() - : std::rand()) * 0x734287f27) & 0xfff000; + : Common::Random::Random64(0)) * 0x734287f27) & 0xfff000; // Setup the process code layout if (process.LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), codeset.memory.size(), 0, aslr_offset, false).IsError()) { diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index b429aa9e80..e7c5ac01b1 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -11,6 +11,7 @@ #include "common/common_types.h" #include "common/logging.h" #include "common/settings.h" +#include "common/random.h" #include "common/swap.h" #include "core/core.h" #include "core/file_sys/control_metadata.h" @@ -243,7 +244,7 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process, // TODO: this is bad form of ASLR, it sucks size_t aslr_offset = ((::Settings::values.rng_seed_enabled.GetValue() ? ::Settings::values.rng_seed.GetValue() - : std::rand()) * 0x734287f27) & 0xfff000; + : Common::Random::Random64(0)) * 0x734287f27) & 0xfff000; // Setup the process code layout if (process diff --git a/src/frontend_common/settings_generator.cpp b/src/frontend_common/settings_generator.cpp index 46625656b1..2b1a0f35d7 100644 --- a/src/frontend_common/settings_generator.cpp +++ b/src/frontend_common/settings_generator.cpp @@ -4,22 +4,21 @@ #include #include #include "common/settings.h" +#include "common/random.h" #include "settings_generator.h" namespace FrontendCommon { void GenerateSettings() { - static std::random_device rd; - + auto gen = Common::Random::GetMT19937(); // Web Token if (Settings::values.eden_token.GetValue().empty()) { static constexpr const size_t token_length = 48; static constexpr const frozen::string token_set = "abcdefghijklmnopqrstuvwxyz"; static std::uniform_int_distribution token_dist(0, token_set.size() - 1); std::string result; - for (size_t i = 0; i < token_length; ++i) { - size_t idx = token_dist(rd); + size_t idx = token_dist(gen); result += token_set[idx]; } Settings::values.eden_token.SetValue(result); @@ -27,8 +26,6 @@ void GenerateSettings() { // Randomly generated number because, well, we fill the rest automagically ;) // Other serial parts are filled by Region_Index - std::random_device device; - std::mt19937 gen(device()); std::uniform_int_distribution distribution(1, (std::numeric_limits::max)()); if (Settings::values.serial_unit.GetValue() == 0) Settings::values.serial_unit.SetValue(distribution(gen)); diff --git a/src/hid_core/frontend/input_converter.cpp b/src/hid_core/frontend/input_converter.cpp index f245a3f769..0709f5c930 100644 --- a/src/hid_core/frontend/input_converter.cpp +++ b/src/hid_core/frontend/input_converter.cpp @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include +#include "common/random.h" #include "common/input.h" #include "hid_core/frontend/input_converter.h" @@ -119,15 +123,14 @@ Common::Input::MotionStatus TransformToMotion(const Common::Input::CallbackStatu .properties = properties, }; if (TransformToButton(callback).value) { - std::random_device device; - std::mt19937 gen(device()); std::uniform_int_distribution distribution(-5000, 5000); - status.accel.x.raw_value = static_cast(distribution(gen)) * 0.001f; - status.accel.y.raw_value = static_cast(distribution(gen)) * 0.001f; - status.accel.z.raw_value = static_cast(distribution(gen)) * 0.001f; - status.gyro.x.raw_value = static_cast(distribution(gen)) * 0.001f; - status.gyro.y.raw_value = static_cast(distribution(gen)) * 0.001f; - status.gyro.z.raw_value = static_cast(distribution(gen)) * 0.001f; + auto gen = Common::Random::GetMT19937(); + status.accel.x.raw_value = f32(distribution(gen)) * 0.001f; + status.accel.y.raw_value = f32(distribution(gen)) * 0.001f; + status.accel.z.raw_value = f32(distribution(gen)) * 0.001f; + status.gyro.x.raw_value = f32(distribution(gen)) * 0.001f; + status.gyro.y.raw_value = f32(distribution(gen)) * 0.001f; + status.gyro.z.raw_value = f32(distribution(gen)) * 0.001f; } break; } diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp index c930e19de3..fc216e3c9f 100644 --- a/src/input_common/drivers/udp_client.cpp +++ b/src/input_common/drivers/udp_client.cpp @@ -11,6 +11,7 @@ #include "common/logging.h" #include "common/param_package.h" +#include "common/random.h" #include "common/settings.h" #include "input_common/drivers/udp_client.h" #include "input_common/helpers/udp_protocol.h" @@ -31,7 +32,7 @@ public: explicit Socket(const std::string& host, u16 port, SocketCallback callback_) : callback(std::move(callback_)), timer(io_context), - socket(io_context, udp::endpoint(udp::v4(), 0)), client_id(GenerateRandomClientId()) { + socket(io_context, udp::endpoint(udp::v4(), 0)), client_id(Common::Random::Random32(0)) { boost::system::error_code ec{}; auto ipv4 = boost::asio::ip::make_address_v4(host, ec); if (ec.value() != boost::system::errc::success) { @@ -64,11 +65,6 @@ public: } private: - u32 GenerateRandomClientId() const { - std::random_device device; - return device(); - } - void HandleReceive(const boost::system::error_code&, std::size_t bytes_transferred) { if (auto type = Response::Validate(receive_buffer.data(), bytes_transferred)) { switch (*type) { diff --git a/src/network/room.cpp b/src/network/room.cpp index 7c257d2bd4..2069673bae 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -23,8 +23,6 @@ namespace Network { class Room::RoomImpl { public: - std::mt19937 random_gen; ///< Random number generator. Used for GenerateFakeIPAddress - ENetHost* server = nullptr; ///< Network interface. std::atomic state{State::Closed}; ///< Current state of the room. @@ -51,7 +49,7 @@ public: IPBanList ip_ban_list; ///< List of banned IP addresses mutable std::mutex ban_list_mutex; ///< Mutex for the ban lists - RoomImpl() : random_gen(std::random_device()()) {} + RoomImpl() {} /// Thread that receives and dispatches network packets std::optional room_thread; From c3afd2fabd329b9205e6106b7ae5e641e327f15e Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 20:15:14 +0200 Subject: [PATCH 13/68] [hle] fetch manager once in cmif wrapper (#3796) shouldn't need to fetch twice or thrice per response :) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3796 Reviewed-by: Maufeat Reviewed-by: MaranBr Co-authored-by: lizzie Co-committed-by: lizzie --- src/core/hle/service/cmif_serialization.h | 22 +++++++++++----------- src/core/hle/service/ipc_helpers.h | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/core/hle/service/cmif_serialization.h b/src/core/hle/service/cmif_serialization.h index 4d32c6cd6b..75461cc6be 100644 --- a/src/core/hle/service/cmif_serialization.h +++ b/src/core/hle/service/cmif_serialization.h @@ -438,20 +438,20 @@ void WriteOutArgument(bool is_domain, CallArguments& args, u8* raw_data, HLERequ template void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) { + const auto mgr = ctx.GetManager().get(); // Verify domain state. if constexpr (!Domain) { - const auto _mgr = ctx.GetManager(); - const bool _is_domain = _mgr ? _mgr->IsDomain() : false; - ASSERT_MSG(!_is_domain, - "Non-domain reply used on domain session\n" - "Service={} (TIPC={} CmdType={} Cmd=0x{:08X}\n" - "HasDomainHeader={} DomainHandlers={}\nDesc={}", - t.GetServiceName(), ctx.IsTipc(), - static_cast(ctx.GetCommandType()), static_cast(ctx.GetCommand()), - ctx.HasDomainMessageHeader(), _mgr ? static_cast(_mgr->DomainHandlerCount()) : 0u, - ctx.Description()); + const bool is_domain = mgr ? mgr->IsDomain() : false; + ASSERT_MSG(!is_domain, + "Non-domain reply used on domain session\n" + "Service={} (TIPC={} CmdType={} Cmd=0x{:08X}\n" + "HasDomainHeader={} DomainHandlers={}\nDesc={}", + t.GetServiceName(), ctx.IsTipc(), + u32(ctx.GetCommandType()), u32(ctx.GetCommand()), + ctx.HasDomainMessageHeader(), mgr ? u32(mgr->DomainHandlerCount()) : 0u, + ctx.Description()); } - const bool is_domain = Domain ? ctx.GetManager()->IsDomain() : false; + const bool is_domain = Domain ? mgr->IsDomain() : false; static_assert(ConstIfReference(), "Arguments taken by reference must be const"); using MethodArguments = std::tuple...>; diff --git a/src/core/hle/service/ipc_helpers.h b/src/core/hle/service/ipc_helpers.h index 4b02872fba..8aee17db8d 100644 --- a/src/core/hle/service/ipc_helpers.h +++ b/src/core/hle/service/ipc_helpers.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -78,32 +81,29 @@ public: memset(cmdbuf, 0, sizeof(u32) * IPC::COMMAND_BUFFER_LENGTH); IPC::CommandHeader header{}; + auto const mgr = ctx.GetManager().get(); // The entire size of the raw data section in u32 units, including the 16 bytes of mandatory // padding. - u32 raw_data_size = ctx.write_size = - ctx.IsTipc() ? normal_params_size - 1 : normal_params_size; + u32 raw_data_size = ctx.write_size = ctx.IsTipc() ? normal_params_size - 1 : normal_params_size; u32 num_handles_to_move{}; u32 num_domain_objects{}; - const bool always_move_handles{ - (static_cast(flags) & static_cast(Flags::AlwaysMoveHandles)) != 0}; - if (!ctx.GetManager()->IsDomain() || always_move_handles) { + const bool always_move_handles = (u32(flags) & u32(Flags::AlwaysMoveHandles)) != 0; + if (!mgr->IsDomain() || always_move_handles) { num_handles_to_move = num_objects_to_move; } else { num_domain_objects = num_objects_to_move; } - if (ctx.GetManager()->IsDomain()) { - raw_data_size += - static_cast(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects); + if (mgr->IsDomain()) { + raw_data_size += u32(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects); ctx.write_size += num_domain_objects; } if (ctx.IsTipc()) { header.type.Assign(ctx.GetCommandType()); } else { - raw_data_size += static_cast(sizeof(IPC::DataPayloadHeader) / sizeof(u32) + 4 + - normal_params_size); + raw_data_size += u32(sizeof(IPC::DataPayloadHeader) / sizeof(u32) + 4 + normal_params_size); } header.data_size.Assign(raw_data_size); @@ -126,7 +126,7 @@ public: if (!ctx.IsTipc()) { AlignWithPadding(); - if (ctx.GetManager()->IsDomain() && ctx.HasDomainMessageHeader()) { + if (mgr->IsDomain() && ctx.HasDomainMessageHeader()) { IPC::DomainMessageHeader domain_header{}; domain_header.num_objects = num_domain_objects; PushRaw(domain_header); From c0fbb2526d1ea9a0a270e1c88b80c5a13c03f7d6 Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 31 Mar 2026 21:13:50 +0200 Subject: [PATCH 14/68] [ci] Fix transifex workflow (#3805) Now should auto update Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3805 --- .github/workflows/translations.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml index 92bb1fdf5d..16ce4f1808 100644 --- a/.github/workflows/translations.yml +++ b/.github/workflows/translations.yml @@ -3,8 +3,7 @@ name: tx-pull on: # monday, wednesday, saturday at 2pm schedule: - cron: - - '0 14 * * 1,3,6' + cron: '0 14 * * 1,3,6' workflow_dispatch: jobs: @@ -59,4 +58,3 @@ jobs: -H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \ -H 'Content-Type: application/json' \ -d "@data.json" --fail - From 81a344f3dbd3cb549535c6486fd5269c5eacc528 Mon Sep 17 00:00:00 2001 From: xbzk Date: Tue, 31 Mar 2026 21:32:24 +0200 Subject: [PATCH 15/68] [android,addons] after a crash, launch button will wait for reloadGames to complete, and system will initialize after global config for proper firmware mounting (#3803) This fixes two problems: 1. After a crash, it was possible to launch a game before external content gets mounted. Now the button will wait for it to complete. 2. Directory initialization was init system before init globalconfig, so after a crash firmware was not being remounted (have you ever noticed fw version = N/A in device overlay, after fiddling with applets?) (this had been fixed in 3755, which was not thoroughly tested by cocoon dev) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3803 Reviewed-by: Lizzie Reviewed-by: CamilleLaVey Co-authored-by: xbzk Co-committed-by: xbzk --- .../fragments/GamePropertiesFragment.kt | 17 ++++ .../org/yuzu/yuzu_emu/model/GamesViewModel.kt | 63 ++++++------ .../yuzu_emu/utils/DirectoryInitialization.kt | 2 +- .../org/yuzu/yuzu_emu/utils/GameHelper.kt | 99 ++++++++++++++----- 4 files changed, 128 insertions(+), 53 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt index faa35bc3eb..c3dea79bae 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt @@ -36,6 +36,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGamePropertiesBinding import org.yuzu.yuzu_emu.features.DocumentProvider import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen +import org.yuzu.yuzu_emu.model.AddonViewModel import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.GameProperty import org.yuzu.yuzu_emu.model.GamesViewModel @@ -46,6 +47,7 @@ import org.yuzu.yuzu_emu.model.SubmenuProperty import org.yuzu.yuzu_emu.model.TaskState import org.yuzu.yuzu_emu.utils.DirectoryInitialization import org.yuzu.yuzu_emu.utils.FileUtil +import org.yuzu.yuzu_emu.utils.GameHelper import org.yuzu.yuzu_emu.utils.GameIconUtils import org.yuzu.yuzu_emu.utils.GpuDriverHelper import org.yuzu.yuzu_emu.utils.MemoryUtil @@ -61,6 +63,7 @@ class GamePropertiesFragment : Fragment() { private val homeViewModel: HomeViewModel by activityViewModels() private val gamesViewModel: GamesViewModel by activityViewModels() + private val addonViewModel: AddonViewModel by activityViewModels() private val driverViewModel: DriverViewModel by activityViewModels() private val args by navArgs() @@ -118,6 +121,20 @@ class GamePropertiesFragment : Fragment() { .show(childFragmentManager, LaunchGameDialogFragment.TAG) } + if (GameHelper.cachedGameList.isEmpty()) { + binding.buttonStart.isEnabled = false + viewLifecycleOwner.lifecycleScope.launch { + withContext(Dispatchers.IO) { + GameHelper.restoreContentForGame(args.game) + } + if (_binding == null) { + return@launch + } + addonViewModel.onAddonsViewStarted(args.game) + binding.buttonStart.isEnabled = true + } + } + reloadList() homeViewModel.openImportSaves.collect( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt index 39ff038034..1a63a3ad82 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt @@ -100,42 +100,45 @@ class GamesViewModel : ViewModel() { viewModelScope.launch { withContext(Dispatchers.IO) { - if (firstStartup) { - // Retrieve list of cached games - val storedGames = - PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) - .getStringSet(GameHelper.KEY_GAMES, emptySet()) - if (storedGames!!.isNotEmpty()) { - val deserializedGames = mutableSetOf() - storedGames.forEach { - val game: Game - try { - game = Json.decodeFromString(it) - } catch (e: Exception) { - // We don't care about any errors related to parsing the game cache - return@forEach - } + try { + if (firstStartup) { + // Retrieve list of cached games + val storedGames = + PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) + .getStringSet(GameHelper.KEY_GAMES, emptySet()) + if (storedGames!!.isNotEmpty()) { + val deserializedGames = mutableSetOf() + storedGames.forEach { + val game: Game + try { + game = Json.decodeFromString(it) + } catch (e: Exception) { + // We don't care about any errors related to parsing the game cache + return@forEach + } - val gameExists = - DocumentFile.fromSingleUri( - YuzuApplication.appContext, - Uri.parse(game.path) - )?.exists() - if (gameExists == true) { - deserializedGames.add(game) + val gameExists = + DocumentFile.fromSingleUri( + YuzuApplication.appContext, + Uri.parse(game.path) + )?.exists() + if (gameExists == true) { + deserializedGames.add(game) + } } + setGames(deserializedGames.toList()) } - setGames(deserializedGames.toList()) } - } - setGames(GameHelper.getGames()) - reloading.set(false) - _isReloading.value = false - _shouldScrollAfterReload.value = true + setGames(GameHelper.getGames()) + _shouldScrollAfterReload.value = true - if (directoriesChanged) { - setShouldSwapData(true) + if (directoriesChanged) { + setShouldSwapData(true) + } + } finally { + reloading.set(false) + _isReloading.value = false } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt index f47c60491b..f961c5e984 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt @@ -23,8 +23,8 @@ object DirectoryInitialization { fun start() { if (!areDirectoriesReady) { initializeInternalStorage() - NativeLibrary.initializeSystem(false) NativeConfig.initializeGlobalConfig() + NativeLibrary.initializeSystem(false) NativeLibrary.reloadProfiles() migrateSettings() areDirectoriesReady = true diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt index 4a3cf61daa..64e035afbe 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt @@ -8,9 +8,11 @@ package org.yuzu.yuzu_emu.utils import android.content.SharedPreferences import android.net.Uri +import android.provider.DocumentsContract import androidx.preference.PreferenceManager import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import java.io.File import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.model.Game @@ -49,29 +51,8 @@ object GameHelper { // Remove previous filesystem provider information so we can get up to date version info NativeLibrary.clearFilesystemProvider() - // Scan External Content directories and register all NSP/XCI files - val externalContentDirs = NativeConfig.getExternalContentDirs() - val uniqueExternalContentDirs = linkedSetOf() - externalContentDirs.forEach { externalDir -> - if (externalDir.isNotEmpty()) { - uniqueExternalContentDirs.add(externalDir) - } - } - val mountedContainerUris = mutableSetOf() - for (externalDir in uniqueExternalContentDirs) { - if (externalDir.isNotEmpty()) { - val externalDirUri = externalDir.toUri() - if (FileUtil.isTreeUriValid(externalDirUri)) { - scanContentContainersRecursive(FileUtil.listFiles(externalDirUri), 3) { - val containerUri = it.uri.toString() - if (mountedContainerUris.add(containerUri)) { - NativeLibrary.addFileToFilesystemProvider(containerUri) - } - } - } - } - } + mountExternalContentDirectories(mountedContainerUris) val badDirs = mutableListOf() gameDirs.forEachIndexed { index: Int, gameDir: GameDir -> @@ -115,6 +96,15 @@ object GameHelper { return games.toList() } + fun restoreContentForGame(game: Game) { + NativeLibrary.reloadKeys() + + val mountedContainerUris = mutableSetOf() + mountExternalContentDirectories(mountedContainerUris) + mountGameFolderContent(Uri.parse(game.path), mountedContainerUris) + NativeLibrary.addFileToFilesystemProvider(game.path) + } + // File extensions considered as external content, buuut should // be done better imo. private val externalContentExtensions = setOf("nsp", "xci") @@ -181,6 +171,71 @@ object GameHelper { } } + private fun mountExternalContentDirectories(mountedContainerUris: MutableSet) { + val uniqueExternalContentDirs = linkedSetOf() + NativeConfig.getExternalContentDirs().forEach { externalDir -> + if (externalDir.isNotEmpty()) { + uniqueExternalContentDirs.add(externalDir) + } + } + + for (externalDir in uniqueExternalContentDirs) { + val externalDirUri = externalDir.toUri() + if (FileUtil.isTreeUriValid(externalDirUri)) { + scanContentContainersRecursive(FileUtil.listFiles(externalDirUri), 3) { + val containerUri = it.uri.toString() + if (mountedContainerUris.add(containerUri)) { + NativeLibrary.addFileToFilesystemProvider(containerUri) + } + } + } + } + } + + private fun mountGameFolderContent(gameUri: Uri, mountedContainerUris: MutableSet) { + if (gameUri.scheme == "content") { + val parentUri = getParentDocumentUri(gameUri) ?: return + scanContentContainersRecursive(FileUtil.listFiles(parentUri), 1) { + val containerUri = it.uri.toString() + if (mountedContainerUris.add(containerUri)) { + NativeLibrary.addGameFolderFileToFilesystemProvider(containerUri) + } + } + return + } + + val gameFile = File(gameUri.path ?: gameUri.toString()) + val parentDir = gameFile.parentFile ?: return + parentDir.listFiles()?.forEach { sibling -> + if (!sibling.isFile) { + return@forEach + } + + val extension = sibling.extension.lowercase() + if (externalContentExtensions.contains(extension)) { + val containerUri = Uri.fromFile(sibling).toString() + if (mountedContainerUris.add(containerUri)) { + NativeLibrary.addGameFolderFileToFilesystemProvider(containerUri) + } + } + } + } + + private fun getParentDocumentUri(uri: Uri): Uri? { + return try { + val documentId = DocumentsContract.getDocumentId(uri) + val separatorIndex = documentId.lastIndexOf('/') + if (separatorIndex == -1) { + null + } else { + val parentDocumentId = documentId.substring(0, separatorIndex) + DocumentsContract.buildDocumentUriUsingTree(uri, parentDocumentId) + } + } catch (_: Exception) { + null + } + } + fun getGame( uri: Uri, addedToLibrary: Boolean, From b4a485e244a742ce7ae2960b25ae0ab67bb0f5f2 Mon Sep 17 00:00:00 2001 From: xbzk Date: Tue, 31 Mar 2026 21:59:57 +0200 Subject: [PATCH 16/68] [android, intent] Added proper ext content mount and game swap support for intent launch (#3755) Required so that frontends can launch a game while there is already one running (for CocoonFE usage) Fix for mounting external content was merged. This patch also fixes multiple reasons for infinite game "Shutting down..." issue (hope all, who knows...) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3755 Reviewed-by: CamilleLaVey Co-authored-by: xbzk Co-committed-by: xbzk --- .../yuzu_emu/activities/EmulationActivity.kt | 206 +++++++++++++++++- .../yuzu_emu/fragments/EmulationFragment.kt | 129 +++++++++-- 2 files changed, 307 insertions(+), 28 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 2764d7eac6..44290fd4b6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -25,6 +25,11 @@ import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.Build import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.navigation.NavOptions +import org.yuzu.yuzu_emu.fragments.EmulationFragment +import org.yuzu.yuzu_emu.utils.CustomSettingsHandler import android.util.Rational import android.view.InputDevice import android.view.KeyEvent @@ -87,6 +92,28 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager private val emulationViewModel: EmulationViewModel by viewModels() private var foregroundService: Intent? = null + private val mainHandler = Handler(Looper.getMainLooper()) + private var pendingRomSwapIntent: Intent? = null + private var isWaitingForRomSwapStop = false + private var romSwapNativeStopped = false + private var romSwapThreadStopped = false + private var romSwapGeneration = 0 + private var hasEmulationSession = processHasEmulationSession + private val romSwapStopTimeoutRunnable = Runnable { onRomSwapStopTimeout() } + + private fun onRomSwapStopTimeout() { + if (!isWaitingForRomSwapStop) { + return + } + Log.warning("[EmulationActivity] ROM swap stop timed out; retrying native stop and continuing to wait") + NativeLibrary.stopEmulation() + scheduleRomSwapStopTimeout() + } + + private fun scheduleRomSwapStopTimeout() { + mainHandler.removeCallbacks(romSwapStopTimeoutRunnable) + mainHandler.postDelayed(romSwapStopTimeoutRunnable, ROM_SWAP_STOP_TIMEOUT_MS) + } override fun attachBaseContext(base: Context) { super.attachBaseContext(YuzuApplication.applyLanguage(base)) @@ -128,9 +155,29 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager binding = ActivityEmulationBinding.inflate(layoutInflater) setContentView(binding.root) + val launchIntent = Intent(intent) + val shouldDeferLaunchForSwap = hasEmulationSession && isSwapIntent(launchIntent) + if (shouldDeferLaunchForSwap) { + Log.info("[EmulationActivity] onCreate detected existing session; deferring new game setup for swap") + emulationViewModel.setIsEmulationStopping(true) + emulationViewModel.setEmulationStopped(false) + } + val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment - navHostFragment.navController.setGraph(R.navigation.emulation_navigation, intent.extras) + val initialArgs = if (shouldDeferLaunchForSwap) { + Bundle(intent.extras ?: Bundle()).apply { + processSessionGame?.let { putParcelable("game", it) } + } + } else { + intent.extras + } + navHostFragment.navController.setGraph(R.navigation.emulation_navigation, initialArgs) + if (shouldDeferLaunchForSwap) { + mainHandler.post { + handleSwapIntent(launchIntent) + } + } isActivityRecreated = savedInstanceState != null @@ -210,6 +257,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager } override fun onDestroy() { + mainHandler.removeCallbacks(romSwapStopTimeoutRunnable) super.onDestroy() inputManager.unregisterInputDeviceListener(this) stopForegroundService(this) @@ -228,17 +276,123 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) - setIntent(intent) - - // Reset navigation graph with new intent data to recreate EmulationFragment - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment - navHostFragment.navController.setGraph(R.navigation.emulation_navigation, intent.extras) - + handleSwapIntent(intent) nfcReader.onNewIntent(intent) InputHandler.updateControllerData() } + private fun isSwapIntent(intent: Intent): Boolean { + return when { + intent.getBooleanExtra(EXTRA_OVERLAY_GAMELESS_EDIT_MODE, false) -> false + intent.action == CustomSettingsHandler.CUSTOM_CONFIG_ACTION -> true + intent.data != null -> true + else -> { + val extras = intent.extras + extras != null && + BundleCompat.getParcelable(extras, EXTRA_SELECTED_GAME, Game::class.java) != null + } + } + } + + private fun handleSwapIntent(intent: Intent) { + if (!isSwapIntent(intent)) { + return + } + + pendingRomSwapIntent = Intent(intent) + + if (!isWaitingForRomSwapStop) { + Log.info("[EmulationActivity] Begin ROM swap: data=${intent.data}") + isWaitingForRomSwapStop = true + romSwapNativeStopped = false + romSwapThreadStopped = false + romSwapGeneration += 1 + val thisSwapGeneration = romSwapGeneration + emulationViewModel.setIsEmulationStopping(true) + emulationViewModel.setEmulationStopped(false) + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment + val childFragmentManager = navHostFragment?.childFragmentManager + val stoppingFragmentForSwap = + (childFragmentManager?.primaryNavigationFragment as? EmulationFragment) ?: + childFragmentManager + ?.fragments + ?.asReversed() + ?.firstOrNull { + it is EmulationFragment && + it.isAdded && + it.view != null && + !it.isRemoving + } as? EmulationFragment + + val hasSessionForSwap = hasEmulationSession || stoppingFragmentForSwap != null + + if (!hasSessionForSwap) { + romSwapNativeStopped = true + romSwapThreadStopped = true + } else { + if (stoppingFragmentForSwap != null) { + stoppingFragmentForSwap.stopForRomSwap() + stoppingFragmentForSwap.notifyWhenEmulationThreadStops { + if (!isWaitingForRomSwapStop || romSwapGeneration != thisSwapGeneration) { + return@notifyWhenEmulationThreadStops + } + romSwapThreadStopped = true + Log.info("[EmulationActivity] ROM swap thread stop acknowledged") + launchPendingRomSwap(force = false) + } + } else { + Log.warning("[EmulationActivity] ROM swap stop target fragment not found; requesting native stop") + romSwapThreadStopped = true + NativeLibrary.stopEmulation() + } + + scheduleRomSwapStopTimeout() + } + } + + launchPendingRomSwap(force = false) + } + + private fun launchPendingRomSwap(force: Boolean) { + if (!isWaitingForRomSwapStop) { + return + } + if (!force && (!romSwapNativeStopped || !romSwapThreadStopped)) { + return + } + val swapIntent = pendingRomSwapIntent ?: return + Log.info("[EmulationActivity] Launching pending ROM swap: data=${swapIntent.data}") + pendingRomSwapIntent = null + isWaitingForRomSwapStop = false + romSwapNativeStopped = false + romSwapThreadStopped = false + mainHandler.removeCallbacks(romSwapStopTimeoutRunnable) + applyGameLaunchIntent(swapIntent) + } + + private fun applyGameLaunchIntent(intent: Intent) { + hasEmulationSession = true + processHasEmulationSession = true + emulationViewModel.setIsEmulationStopping(false) + emulationViewModel.setEmulationStopped(false) + setIntent(Intent(intent)) + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment + val navController = navHostFragment.navController + val startArgs = intent.extras?.let { Bundle(it) } ?: Bundle() + val navOptions = NavOptions.Builder() + .setPopUpTo(R.id.emulationFragment, true) + .build() + + runCatching { + navController.navigate(R.id.emulationFragment, startArgs, navOptions) + }.onFailure { + Log.warning("[EmulationActivity] ROM swap navigate fallback to setGraph: ${it.message}") + navController.setGraph(R.navigation.emulation_navigation, startArgs) + } + } + override fun dispatchKeyEvent(event: KeyEvent): Boolean { if (event.keyCode == KeyEvent.KEYCODE_VOLUME_UP || @@ -608,19 +762,48 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager } fun onEmulationStarted() { + if (Looper.myLooper() != Looper.getMainLooper()) { + mainHandler.post { onEmulationStarted() } + return + } + hasEmulationSession = true + processHasEmulationSession = true emulationViewModel.setEmulationStarted(true) + emulationViewModel.setIsEmulationStopping(false) + emulationViewModel.setEmulationStopped(false) NativeLibrary.playTimeManagerStart() } fun onEmulationStopped(status: Int) { - if (status == 0 && emulationViewModel.programChanged.value == -1) { + if (Looper.myLooper() != Looper.getMainLooper()) { + mainHandler.post { onEmulationStopped(status) } + return + } + hasEmulationSession = false + processHasEmulationSession = false + if (isWaitingForRomSwapStop) { + romSwapNativeStopped = true + Log.info("[EmulationActivity] ROM swap native stop acknowledged") + launchPendingRomSwap(force = false) + } else if (status == 0 && emulationViewModel.programChanged.value == -1) { + processSessionGame = null finish() + } else if (!isWaitingForRomSwapStop) { + processSessionGame = null } emulationViewModel.setEmulationStopped(true) } + fun updateSessionGame(game: Game?) { + processSessionGame = game + } + fun onProgramChanged(programIndex: Int) { + if (Looper.myLooper() != Looper.getMainLooper()) { + mainHandler.post { onProgramChanged(programIndex) } + return + } emulationViewModel.setProgramChanged(programIndex) } @@ -644,6 +827,11 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager companion object { const val EXTRA_SELECTED_GAME = "SelectedGame" const val EXTRA_OVERLAY_GAMELESS_EDIT_MODE = "overlayGamelessEditMode" + private const val ROM_SWAP_STOP_TIMEOUT_MS = 5000L + @Volatile + private var processHasEmulationSession = false + @Volatile + private var processSessionGame: Game? = null fun stopForegroundService(activity: Activity) { val startIntent = Intent(activity, ForegroundService::class.java) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 435fe5fe2c..b67bc6a9cc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -50,6 +50,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.findNavController +import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.navArgs import androidx.window.layout.FoldingFeature import androidx.window.layout.WindowInfoTracker @@ -135,6 +136,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private var intentGame: Game? = null private var isCustomSettingsIntent = false + private var isStoppingForRomSwap = false + private var deferGameSetupUntilStopCompletes = false private var perfStatsRunnable: Runnable? = null private var socRunnable: Runnable? = null @@ -238,6 +241,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + if (emulationViewModel.isEmulationStopping.value) { + deferGameSetupUntilStopCompletes = true + if (game == null) { + game = args.game ?: intentGame + } + return + } + finishGameSetup() } @@ -260,6 +271,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } game = gameToUse + emulationActivity?.updateSessionGame(gameToUse) } catch (e: Exception) { Log.error("[EmulationFragment] Error during game setup: ${e.message}") Toast.makeText( @@ -334,7 +346,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } emulationState = EmulationState(game!!.path) { - return@EmulationState driverViewModel.isInteractionAllowed.value + return@EmulationState driverViewModel.isInteractionAllowed.value && + !isStoppingForRomSwap } } @@ -890,8 +903,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } ) - GameIconUtils.loadGameIcon(game!!, binding.loadingImage) - binding.loadingTitle.text = game!!.title + game?.let { + GameIconUtils.loadGameIcon(it, binding.loadingImage) + binding.loadingTitle.text = it.title + } ?: run { + binding.loadingTitle.text = "" + } binding.loadingTitle.isSelected = true binding.loadingText.isSelected = true @@ -959,6 +976,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ViewUtils.showView(binding.loadingIndicator) ViewUtils.hideView(binding.inputContainer) ViewUtils.hideView(binding.showStatsOverlayText) + } else if (deferGameSetupUntilStopCompletes) { + if (!isAdded) { + return@collect + } + deferGameSetupUntilStopCompletes = false + finishGameSetup() } } emulationViewModel.drawerOpen.collect(viewLifecycleOwner) { @@ -995,26 +1018,24 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } driverViewModel.isInteractionAllowed.collect(viewLifecycleOwner) { - if (it && !NativeLibrary.isRunning() && !NativeLibrary.isPaused()) { - startEmulation() + if (it && + !isStoppingForRomSwap && + !NativeLibrary.isRunning() && + !NativeLibrary.isPaused() + ) { + if (!DirectoryInitialization.areDirectoriesReady) { + DirectoryInitialization.start() + } + + updateScreenLayout() + + emulationState.run(emulationActivity!!.isActivityRecreated) } } driverViewModel.onLaunchGame() } - private fun startEmulation(programIndex: Int = 0) { - if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) { - if (!DirectoryInitialization.areDirectoriesReady) { - DirectoryInitialization.start() - } - - updateScreenLayout() - - emulationState.run(emulationActivity!!.isActivityRecreated, programIndex) - } - } - override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val b = _binding ?: return @@ -1375,6 +1396,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { super.onDestroyView() amiiboLoadJob?.cancel() amiiboLoadJob = null + perfStatsRunnable?.let { perfStatsUpdateHandler.removeCallbacks(it) } + socRunnable?.let { socUpdateHandler.removeCallbacks(it) } + handler.removeCallbacksAndMessages(null) clearPausedFrame() _binding?.surfaceInputOverlay?.touchEventListener = null _binding = null @@ -1382,7 +1406,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } override fun onDetach() { - NativeLibrary.clearEmulationActivity() + if (!hasNewerEmulationFragment()) { + NativeLibrary.clearEmulationActivity() + } super.onDetach() } @@ -1840,10 +1866,74 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } override fun surfaceDestroyed(holder: SurfaceHolder) { - emulationState.clearSurface() + if (this::emulationState.isInitialized && !hasNewerEmulationFragment()) { + emulationState.clearSurface() + } emulationStarted = false } + private fun hasNewerEmulationFragment(): Boolean { + val activity = emulationActivity ?: return false + return try { + val navHostFragment = + activity.supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment + ?: return false + val currentFragment = navHostFragment.childFragmentManager.fragments + .filterIsInstance() + .firstOrNull() + currentFragment != null && currentFragment !== this + } catch (_: Exception) { + false + } + } + + // xbzk: called from EmulationActivity when a new game is loaded while this fragment is still active, + // to wait for the emulation thread to stop before allowing the ROM swap to proceed + fun notifyWhenEmulationThreadStops(onStopped: () -> Unit) { + if (!this::emulationState.isInitialized) { + onStopped() + return + } + val emuThread = runCatching { emulationState.emulationThread }.getOrNull() + if (emuThread == null || !emuThread.isAlive) { + onStopped() + return + } + Thread({ + runCatching { emuThread.join() } + Handler(Looper.getMainLooper()).post { + onStopped() + } + }, "RomSwapWait").start() + } + + // xbzk: called from EmulationActivity when a new game is loaded while this + // fragment is still active, to stop the current emulation before swapping the ROM + fun stopForRomSwap() { + if (isStoppingForRomSwap) { + return + } + isStoppingForRomSwap = true + clearPausedFrame() + emulationViewModel.setIsEmulationStopping(true) + _binding?.let { + binding.loadingText.setText(R.string.shutting_down) + ViewUtils.showView(binding.loadingIndicator) + ViewUtils.hideView(binding.inputContainer) + ViewUtils.hideView(binding.showStatsOverlayText) + } + if (this::emulationState.isInitialized) { + emulationState.stop() + if (NativeLibrary.isRunning() || NativeLibrary.isPaused()) { + Log.warning("[EmulationFragment] ROM swap stop fallback: forcing native stop request.") + NativeLibrary.stopEmulation() + } + } else { + NativeLibrary.stopEmulation() + } + NativeConfig.reloadGlobalConfig() + } + private fun showOverlayOptions() { val anchor = binding.inGameMenu.findViewById(R.id.menu_overlay_controls) val popup = PopupMenu(requireContext(), anchor) @@ -2134,6 +2224,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { state = State.STOPPED } else { Log.warning("[EmulationFragment] Stop called while already stopped.") + NativeLibrary.stopEmulation() } } From 21f9db1c272c5fd55aea2c9390535139a0782ba5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 31 Mar 2026 23:45:06 +0200 Subject: [PATCH 17/68] [android] fix crash due to ctor/dtor ordering for std::random_device being uninitialized when used in other static ctor/dtors (#3806) wow that's fucking horrible Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3806 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/random.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/common/random.cpp b/src/common/random.cpp index d6865ee807..d951881cd2 100644 --- a/src/common/random.cpp +++ b/src/common/random.cpp @@ -1,19 +1,22 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +#include #include #include "common/random.h" -static std::random_device g_random_device; - namespace Common::Random { + [[nodiscard]] static std::random_device& GetGlobalRandomDevice() noexcept { + static std::random_device g_random_device{}; + return g_random_device; + } [[nodiscard]] u32 Random32(u32 seed) noexcept { - return g_random_device(); + return GetGlobalRandomDevice()(); } [[nodiscard]] u64 Random64(u64 seed) noexcept { - return g_random_device(); + return GetGlobalRandomDevice()(); } [[nodiscard]] std::mt19937 GetMT19937() noexcept { - return std::mt19937(g_random_device()); + return std::mt19937(GetGlobalRandomDevice()()); } } From bb71ace365dbec17736ec45d3a80affd1e16e498 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 02:08:46 +0200 Subject: [PATCH 18/68] [cmake] switch nightly auto updater to forgejo (#3807) Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3807 --- CMakeModules/GenerateSCMRev.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 5b0adad8dd..947a4963ee 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -37,10 +37,10 @@ set(GIT_DESC ${BUILD_VERSION}) # Auto-updater metadata! Must somewhat mirror GitHub API endpoint if (NIGHTLY_BUILD) - set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com") - set(BUILD_AUTO_UPDATE_API "api.github.com") - set(BUILD_AUTO_UPDATE_API_PATH "/repos/") - set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly") + set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev") + set(BUILD_AUTO_UPDATE_API "git.eden-emu.dev") + set(BUILD_AUTO_UPDATE_API_PATH "/api/v1/repos/") + set(BUILD_AUTO_UPDATE_REPO "eden-ci/nightly") set(REPO_NAME "Eden Nightly") else() set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev") From 6e760148248801e986ec6d640621d1a3af97763a Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 02:09:56 +0200 Subject: [PATCH 19/68] [ci] Move workflows to `.forgejo` (#3808) Primarily to prevent mirrors from trying to run bogus actions. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3808 --- {.github => .forgejo}/ISSUE_TEMPLATE/blank_issue_template.yml | 0 {.github => .forgejo}/ISSUE_TEMPLATE/bug_report.yml | 0 {.github => .forgejo}/ISSUE_TEMPLATE/config.yml | 0 {.github => .forgejo}/ISSUE_TEMPLATE/feature_request.yml | 0 {.github => .forgejo}/workflows/license-header.yml | 0 {.github => .forgejo}/workflows/sources.yml | 0 {.github => .forgejo}/workflows/strings.yml | 0 {.github => .forgejo}/workflows/translations.yml | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {.github => .forgejo}/ISSUE_TEMPLATE/blank_issue_template.yml (100%) rename {.github => .forgejo}/ISSUE_TEMPLATE/bug_report.yml (100%) rename {.github => .forgejo}/ISSUE_TEMPLATE/config.yml (100%) rename {.github => .forgejo}/ISSUE_TEMPLATE/feature_request.yml (100%) rename {.github => .forgejo}/workflows/license-header.yml (100%) rename {.github => .forgejo}/workflows/sources.yml (100%) rename {.github => .forgejo}/workflows/strings.yml (100%) rename {.github => .forgejo}/workflows/translations.yml (100%) diff --git a/.github/ISSUE_TEMPLATE/blank_issue_template.yml b/.forgejo/ISSUE_TEMPLATE/blank_issue_template.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/blank_issue_template.yml rename to .forgejo/ISSUE_TEMPLATE/blank_issue_template.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.forgejo/ISSUE_TEMPLATE/bug_report.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/bug_report.yml rename to .forgejo/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.forgejo/ISSUE_TEMPLATE/config.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/config.yml rename to .forgejo/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.forgejo/ISSUE_TEMPLATE/feature_request.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/feature_request.yml rename to .forgejo/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/workflows/license-header.yml b/.forgejo/workflows/license-header.yml similarity index 100% rename from .github/workflows/license-header.yml rename to .forgejo/workflows/license-header.yml diff --git a/.github/workflows/sources.yml b/.forgejo/workflows/sources.yml similarity index 100% rename from .github/workflows/sources.yml rename to .forgejo/workflows/sources.yml diff --git a/.github/workflows/strings.yml b/.forgejo/workflows/strings.yml similarity index 100% rename from .github/workflows/strings.yml rename to .forgejo/workflows/strings.yml diff --git a/.github/workflows/translations.yml b/.forgejo/workflows/translations.yml similarity index 100% rename from .github/workflows/translations.yml rename to .forgejo/workflows/translations.yml From 82e374f66c2e7eb5374a5b9cb592985d1a92e649 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 1 Apr 2026 03:07:50 +0200 Subject: [PATCH 20/68] [meta] April Fools 2026 icon (#3802) art Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3802 Reviewed-by: MaranBr Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- dist/dev.eden_emu.eden.svg | 283 +++++------------- dist/eden.bmp | Bin 262282 -> 185482 bytes dist/eden.ico | Bin 343119 -> 324208 bytes dist/icon_variations/aprilfools2026.svg | 89 ++++++ dist/icon_variations/aprilfools2026_bgcolor | 1 + dist/qt_themes/default/icons/256x256/eden.png | Bin 35682 -> 15704 bytes .../res/drawable/ic_launcher_foreground.png | Bin 134584 -> 58463 bytes .../app/src/main/res/drawable/ic_yuzu.png | Bin 57729 -> 36160 bytes .../src/main/res/drawable/ic_yuzu_splash.png | Bin 52424 -> 24762 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 14132 -> 5163 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 9643 -> 3358 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 24263 -> 9677 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 35659 -> 15317 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 68697 -> 45266 bytes .../app/src/main/res/values/colors.xml | 2 +- 15 files changed, 162 insertions(+), 213 deletions(-) create mode 100644 dist/icon_variations/aprilfools2026.svg create mode 100644 dist/icon_variations/aprilfools2026_bgcolor diff --git a/dist/dev.eden_emu.eden.svg b/dist/dev.eden_emu.eden.svg index f88b52f625..7711945aa4 100644 --- a/dist/dev.eden_emu.eden.svg +++ b/dist/dev.eden_emu.eden.svg @@ -1,203 +1,21 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:current-layer="layer1" /> + + + + + + + + + + + + + + + diff --git a/dist/eden.bmp b/dist/eden.bmp index 888138ccf7ef548f52d69f6f3bcc55f4e14b55df..cffc04b308cb94d6031986856f7c7e2421a20996 100644 GIT binary patch literal 185482 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 z%0A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ⅆzHZrh@_NWI6P%DuLmHc`$Yv#%(%2 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 L&!sJEx%2~|uw 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 diff --git a/dist/icon_variations/aprilfools2026.svg b/dist/icon_variations/aprilfools2026.svg new file mode 100644 index 0000000000..7711945aa4 --- /dev/null +++ b/dist/icon_variations/aprilfools2026.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/icon_variations/aprilfools2026_bgcolor b/dist/icon_variations/aprilfools2026_bgcolor new file mode 100644 index 0000000000..fabebfa717 --- /dev/null +++ b/dist/icon_variations/aprilfools2026_bgcolor @@ -0,0 +1 @@ +#43fcfcff diff --git a/dist/qt_themes/default/icons/256x256/eden.png b/dist/qt_themes/default/icons/256x256/eden.png index 3c4bd566a10abb72cb76654324631a170d6fa471..d7286ac4c6e4f24119fccd3f42e1ce2ca7a7311e 100644 GIT binary patch literal 15704 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 _RPVr^j(m-t?*eweG*z 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 O0*Cgq_SNn^aqV9a{g1c+ literal 134584 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 x=&dKvqXhjfUanL?#sB&u4 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 z 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

D5TdiLgKMQG5H+|0kJg^1+ghU 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 literal 57729 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%0D)^S1AL)Y0xPpNaf96cw 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 VnWs}ZmZ+NhH+77)%e0Ws{|9k92TcF~ literal 52424 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 diff --git a/src/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 23bc2897c3a33f320ce1cf9d9af2c0dde01c3e0b..74c6677dd9507d693e89827b4ce2105a052dbc81 100644 GIT binary patch literal 5163 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 ZrY|XXXj*XK{--=aDaxtI)=8U({12rkw3Yw> diff --git a/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 1daa3c624f5c9af3f32d8131d6580864c24241ad..3f0023f573c96c192c9e35a71ef25d372180ec4c 100644 GIT binary patch literal 9677 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 literal 24263 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�-;3>wg9?U#*qvxG{%^y1)bjU+>mCZo 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 d>*YJNa9C&>TgirRX}6`e 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 literal 35659 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

bMf<@%^CoV|_xPhiy0iv}V}A$L zXbcVbo7!o*0sKPBKvjgJy-n z>iS-kxezAiTofGvxs=4fKcn1~aHL~+)Q|UiuC6N)!7Y#WeHh=-wlrk&_loFVPTG3S zp?1Q3!Qrdi8BS!m7a;;?M@FrIDQq5t(o|dYxi{u2XI-r^*F-)D^N{6*>9^OC=Nf4@a60d+S1` zqdU2MHFwWEOvk<;T1)6T%kP|&aMm!4lr<*iHwsT}t~+>%q7SBo5tU*@zB$G&IX20w z(aE&S*^)7&(;vq`!?KCQN;A*&X1!?==4PG?sMnWEFIO9zN@bPaaKwMCuP^kF5%smN zDTz72(R=v6%cQn&uS<(P}|V9 z>FwN)RD8R(md!j{T*R*M7xPBn4fL-I5UjC5Te6#Tt0 zs|Se;un^+OQi}im)u;7QCWqvvex&-kBpo_wh3M+5DU^}sxN20ydEk}4T2vP9(3oe& zSO=>1C_65CwIEJYr@!WNXzx#7>!YH0Lf4Exw!dS{{gQIqBy+zH>zt|LvjT9j(Lvgo z?`H&Lv_NRfKa)d&FOS}YpLtw>-ar3JH9VuWYW1jk1c`Ejpkr_J zu|ZQIXMycSaP9Y(-j-=Bc5NA=gvq}$xOdMShL?8r-Ut{ul{8nwt3pd|>&8jo-tb4p za;Db!bhFm>A8zuglYtbnNhSd=;r`CSnl|k6UvL38`~% zaJ^k9L68C2RTO%Rred-;7MB#yPQ>2>2<+ha<391{?a!wr@7M@|H4hK;`)T4)vRU?t z-NnNXVWbaMY7Y^JgxLjw0ZjmYyo;wdXhyz0|9z)vqneWK1047Gekg5&=wqIr$Ip@< zjU9Ok$gQ@JroF;POqwp8O5}{6-if}DW625AyUaRgV6Q}qD>h`*Q1c`_3E{x1qY2); z2;!Fkp#XaI0{McKQKYzwU(vbr%dyIgMYZX zb!GN50kgi7;O%6i9k8i$Bt8ln)s|1eWrCA)B zQXJdpw0qu97ryf7x!HcNH8Ok6TST|#??Dp9VeR|U{5(yZUCPTdG*YZncB zna`B##lvs57)TapNl>x92xkP{JAc#1RUT7L7A3PJUR9lITBkFEXGD~yy>7tiZ`34O zp2oBHD?a09amIJHnSj_`5zcnxPbce+?Q_$03+Ot+DA)sQb&|i6!D%=o6VaY6$FfE= z_8j*3L!{%o(32o#hcuCjs@;B07uYZ>YLbx@-+~ab`0XrDpK`bahs5{AR$^)ib7|cD z*B?jsc%ZyZ@sz@Eenu?LMEv-?Oi2Gd3 z(?`fP3FMCqO!>TX4N6GMsd&8K_1A;t#c4~Fbk7-xVj$Zjf{_!8l;jL}4*fu=zOEZO>HUowNd1x4L+%zmM z&^c3z5{%~}^kpP?iwe{D@oRK&s@yh?Hu9t$w?*qRi!lkGx`ggGIXr#_A8&PrT7=~V zvng<;$q#$1>d4w1;@i<)Hm}L14G#605hvi)CDEPr?KrZ`G@!msrtA2JB}_mN#4=nm zXK-=ho+_kLqowjjot#*so{S@zUIB4MRVl0LvJzd;fYVVcW1mY+>Ret9ssd`qcRi zM?{>w)Y|Q;zgw?5M;}LW-%!Cxw9-seoMPDWwZ(;WjCtdAWQ1p4acX*vej=ntB6|c( zYY%F*?!yO?#=A-m8m7B0Q zO2a`Q$jS3oM$#p zU%SmN;5#Imp_L0be zc`?uI!D8J(y(M1H^FBeTtiiLRTTs2U>5u6hI`4UNr{pSlb#wDMP;j_5qTzo0g#l}) z4;%`u(vKBv01NnXT=@G@Iy*jJ3^O3Yii>(!!?c&LgSdegqe@4bQB}696W4-IRUo(% zs?S;ws{uD@bduzvD3hqGRq`OQ;q1;hJ12=dQqX-W-CL{#^YJZdfeo6K;O;Ka%x55)>z;-2#iI~KNl^V8R( z7`z3pr8n=56s(P6wUHDQTjTHk+`x9xzM!szJ;g-nup!643`itM7GE&TItsnJJdlgB z*WyyFP*E*mu94dldW<5Q4T5#8s%{$C50gV-E!98V4InGa;zVyYb zZ;r?y;kaQ_H`3OQmIaKATl7=_f4c;db#2+3V`&s(%PA?!K#=$J{YK}+)O>0jG?eUeZCChQdPWS zfH{2m?DzedB`!=KKUt6tQl*Cws(#WFu#iH8DPakX#ez8jP#O*h9rl%zE8)KNhhwSys4BJx7@4wm|R_l211Ie+~vLnR~~p@xkHTy z5g_v8wIaIIl(hSItQYO%o#yUFI8+f>hE6=kJ^^tl4iw8r%P9!+PjEY}-?2KE9+Uds z?6Zd2I^|LGS%w!DOU*TW*Xq9JDwl_uiJSY)ZJpw@_a1)dOq|<#13cJ-ZqO3iI%F*_ zoO=7@G{}T5sxSlA%%~Vsu5!C?Hj&lBF%#N`j^(ZI2XCBigV9Yk`;0eqpR9RRx;=Kr zN&*ob;nJvPs7c;fv&PVLMrcrj!3bs{U*|%ibQnBF5^%q7VLhE89i70bcjJ!BpxA>Q z?vW3}KmW-2+X zx=N(dW6#1v{JF(Ru!tHQq1YACNi?FdOVSSIg00)5KED3(ioeG>tK59s1BS*j0L4>e zOpx$rzK0W6^CFMVg{yy;%U1K8-3cRFdwe+Nl=lZeh)XlMxTiLRfSf%uvPWV40JBCr zE=TFDmyaaDBS1O1>{4MXQf{EJ@N-+Wd&=_i_5w!=*yG>kr~ zwYXOS?C&~&#d9sZB6;apc5ff|yJ;u>lg`c7Mh#`g!nb@-#M1iQOje@d&ex9ordJ8i zdv9jj58uHtKjJPdZ|Z6#xpE6{LVZ+Rf}a~@M;LP}k-~1bCF542Db?~#EE}UE8(qwr z{491_w`((@1eL22*0RFn_)lW)ZG~>jGgA@XM8|Wq*43|!4{3*j$h-zMa8jC| zXelS@tYUihC%6JpmP5g2iJhgDL4wSFX>;&|izWYt{Vp#X`y!mQ5_1 zrF0#g=O&j2EoxAF;%3>CZzl`&!FwVgkGJ{LWg@Y!G>VoH#iTmx*d6MLk0bR*0SSsy zsny@&HR==Wf$E>g?Ok$>dN1Bxixr(;7G6a)(zH4C&aMwl>k-Vg2G&3Lg_gL*?_CrL zTDQDvyKV2TzZPW#_U;{;AOA&BrcHbykEynC!!6fmE2@JI$E{ZZA=Bj(XN|785bOTJ z5Pt@g^}p#Ei%2;%IzuWiWx|X^94G()D3e5J+hH;*v(}F=tbhSmN7XJYMP`a?p z%O%>Bj6Xduvd_LWoSX>D%%gl)c*GLk8L?kZB;cum(tvMFNG`3!m=~{DYCkk+ke_`p zRFJwxD2zWw1meW4pNbEf4#@QLAu=fOepD8HuKr@hf%SYH6uv0U7Ugreb@Mw^?|?E( z)SS+FE#D3=haRCy>B|;ulWeV?S>4!s(5=R6EBZrY8@Zs!*d~b?9I#S{bf8X%^$va^e zK!8sG=*Tt$Uz-LxKo+?wyk*w{sEbELC|Wl~@y zdxRK%A&6nl*>MMqj12}RYdvB}SYbt2#fld_lPl%*@p{dECi&apSl&I{?#}dk^U0YV zhjUN)B7c7Z{{+_A#GMeIjCOQ2#C^};H8A~kxAd)1tcJ&ZQXlM4M5&SO%zdcFW#RRO zKTJBG^HT#rRqXcEDJx%>BF#;WWqS?VezMAHh;p?ty<(;nKU=lyW^E72Pb%Wqyve`736$-_ z^{&a!t$|hqM((Jn<3(K8k)to~*k5QsdaNc+Io@U5?6P=}gHa|%I7F(b5w5&qI2aSi zxS+n0L5nqZ_y!6kXr*i3xv6G2;YjK;rz(F13xFz5V(ru^0P)t4qhx`Z0g{?sLslm= zt1A!55b3{_G936u?lIpzC2TVlBn+bT9M3V77ga(!X$G4}SH(8GiE{H;1D&gpSXp-I zga-i5vO7CUqHRftVw1CztHip%nsuGaQOLtVRki%{TM-nn#{G=kTcQ)tp2&yqTfvL` zP$K^N-&Ct2MYkN9-#gzrB8G_6(wf%VX2M z=COC`*y6=m>mQQONf*bup;iWf`Y&3JJT< z*eT)pq=-IIA~-qskakiG_jeqJMelAHonz1|q$K9m#rI%ARS#nJ--lZP*EITlvRQe~ z7|5&C*4TtTvKK|_<+Gl{^yQZR4n&P-IaD11QlKN!)zC9G!9^k=*c>1>%N<2>RxIQo zKCe;5IJ6;CFU>5`(}f9#PPUtjONVP_KeCOs&hLAAD7T>Ap!doD z*Fe267i<@(VP8H&U@5NjTvY&>tBI z1POx?f?nzkuBqkmx9ev4ZZKVvrkUp6bj#fK=$@k)>y>jPQFaRZD?iB_0HG=B0RRTz zAb?2xzH?VUOD_W|%-F^saKiDH{1tmZMSCx=((jt91>e3sT*J2gvY)XfGWBD${_x_r zIEFZ+!3Y5ZBme?&P>_Tl5QGlm6!ME%=_S=FnPZ9ym)7~D9V>xRb^cO)llH;ocQjjhycn5W&PvT#AM ztVDG<9-;-x&>*twlemiR!#0z3|H=M&%+iZ+DO5@;7B)V1iT+&jNZl6BA$LL@^21N? zgbepDV6KfHt9+5K>)a`aT+Q@U8e*#MpQO9$dpzN>V|a2)X%L+fuW$&-I1Tk{j)T5- z0okCzh9B_;6NHM+^kYhW=ITb&Cw<4d`2bDBC#v=!9MINk_A#47_y2py@6}WcsRY%s1UK#bnn)S_M4S{15~gJ|F-BAK}0! zY)5`9qZ5dwgBdxsHkk`+RrPvUet-KSK5306ZygkW@6he@apuLhp2(bTmIC>JR-5-g zPi;{EGY~=H)E3v#fK9l7=2{y3)z=fNXPY^&^{owf`o!1nqeVDg%C5LA&C6C(S3Y#D z2=h?o+aqirEB-RZR!-Yu|0rtGI060zr7-g^O7(LTunZS)2pSBK$qfOx=BS17%7Iqn zJdJhTN4*QF(93(u!%v5n^-1Vp?~weHv4pVeJE;$_l>Mj#j3|O^km0YL#}$r}yHiCe zAoHSH(_C>^eU(pE>(NDaZz*P6j=H({a`G<6n6!cN7#bjr=X|({I$34)?}XutpWuy& z_`nrJ1E-h)7k2X0x1H>&S8xz^rJgS zNNS5qIL2Oh$3<@yu{C}cl)s^RGV;VvOMM>qZayU~UR(G!vy&EU@zcGamhxWhK6Y{o zDgq-4Qf}ywT?@hrEzo6(h%~*s^>gNuM--8mEDygK1+2ceAbPB9eQ@e?VP)e<#X8VtSxl3q)KQ=1;2>fwIBl)IG{%Y zFQja2u-}Y7W!Ek3nqGUQ?Mx+W#HA3|O;p}xzm|f7T4+`WGad>Ouod~S5;|UsLiP^y zqrHE_2d2h#?zX#Ph-kT0pUZc$v4h%8KBb&9-X@E2DX&60zl0qoFiZdpe>$XCg^HWl zhU@GtPIFCul2nHuY;T{^b=S=;Wi4xWk8w++XRaZc&3Hg&&UV#YDmOQ@?C({kd4jm( zT~<7zOB!eeDxoJTXHDb$Yh6x4JX9p1KP0q6b)4n8)}EYVU!wO;iPD|ATqMKyO82F4 z7X6wAb}#jq(nMZDvXoz2f}^~fB49-B&yfP1MqOHBZOTWj5rq!xJLGRUyrSEPAKhJ_ z2V{3Qh|{7Ynedp0A|3w74&N`~h4Td*EnABN5 zOKI|a&WWpB@N4}-zupMQ009G*BLYj5NcK~QJPmWX`Gr3Gmj+6!Vz73&a#YaD|h=n=%baEtHiYhkti_3N(cg17Bnus!IcFUFz4L`RV?mEZ6uj>)%nW3@lrp9aU*`$u3&Rhid zIFs7o3g~}4KKK{RRO7{${`%r^5HTjQ!`vfLu~m6KJh1D5Pl^+aw3TjvxNdhsw{L3{fmg* zRZqm-ttF>z<9eC*wpz>^x4qI|=OqR`rc)bC!eqS04D3cK_KWp2Rcy|Du3k59fA&eG zm(z+)xAiJ1bR%8&2o*cA31x5*EvXR%qE;%q^UcAW0a9i)8JSnt=_}i}q1{*ijS? z5dF_f9__G0;oZCsn-Pb#*kJ8riBvj1(A4vfc35_3dP_goll021pCdP4bp(385s{wx zJ;S9Y{-e0HyiSy)5j>ra;4KxyMeIeMtg)|uOv9zXFw#uuwXHk_M@5>nT54v<<~LQG ztUEcbYSS)B19^MOmZJyFSB|)u8X?K0KS#n#tA-CqM-1{H59P&J)J1{!{@Umdv&_dG zK8n@D&eu)1F@TogJ(b30Y=$e`VEi|~cLx{_uFmtQ8eULmsaNG3 zXHoWx*a#{CG01?Gy!blCXnAOQdU<6=M%$b9sQVk0Jtro0aM`8WO!HdK--p_Le5 zUaL(shZM|V>Q$&z+j)jjJ*s;~`%dz1ARjVSpn+PrHVHDyQ%;)1d+;O1|JB*Rgg1DG zcq%9+@C$90QjgXpxY;Tv>K{*3az56iMW`d?ge!VL(dHmg&EeBcob)^IqL)8;j%A(X zB8Kn`eBuYlj=5A7p76;!5c!{r1_2XUq30)jnPVhXKT=oJHO8-nq#vJr?t751`E#BcaGh-$dizlE=zvA5D7T{ZvWjm-n*GWq&&_W8*$K!!~$Kh?u62^gONI&?3~8 zbO8SJJ$d5-jL>C86MuarlmiZEIED;9i|=_6U$K_4D&+F4f|~xgj%BiT-{Nj6MZdY$ z=LCF0XEB;?k<}+y_ysMO!{m~N(mbAiR&MfkBnc2EiC{2)SsVjK4qXKQi4-^A`=(D1O zf46`_sV$wPfz*VnsCBf1Qf$gw%|9*OHj>X;M@yHnT(=e@;fAZ~9XjUtwaH8u@19D5 z5iW)@yXE3OP1Jr`J8g`JMmysJk;}TS8e>&~!Z*>4a!GYnT7_G$>t-W}ZQpMgh zv(Sq>>bl3{#ZOovrXUYm;|{y<7WS1!QGyiVIiDziaYPQ0lC*Ugt}bFTjU+!z#>js` zsS*f-D3Kl_RZAn%jrR&?uiW8|6$L$7ObOf$DVV61 zK`~KO>r8dYNP3K+?Ys|HQ6EK7`ipq`KpgB8!xONSFX(g7aQRBmEknO-+i5c9kTJi`1=iShDS(TB2eUtR@2yhAGl<0ayd@He_$f8P08iEX$;)kJkXv){AbrBa`c zIflL55VJ~EKiK4k_+FP2E%1mvI45>%ISm!Xd_%C;K}ia1r(3SK8<)sag}+piZ$nSd zaT1A0`Y*c={XQinL59F>5EAhVc44vmLqAVVS3W~)R{vbwJsuo$cW*{Uwl$CB;)vHT zkb~)y?uz6p8ktJVGsG%Wf2twws~Wa&3X=X*M*n_n(4c6);FY#hw_bR;%nEYTzsWvI zH#|4M?;5N{@(r|o^T`tN2KF~x z*0w{mf(Lc@B9230Fu?Cn8e{n!RZ^$x0~MWLsx?2&wLHQMT*eg3M6IZ~Oup)-MMb0Q zd%5oJO35osQ$F@EcUOm_47)onqA-1rsc^?an4xB!b@un5fx&D>5KZDAX{=IA-_z2> zFX8#TZLQ_fD=Ua*%hS=&s6+C@UK+Lu{>4 zpWSF6`M?bc|B}T1=PsE6_2ABh&j#&g)xgTF)aOlqh#QW(Q7cZLO6|43 zNA@jxkFZRss`N;2`q13I_uVq+)K%IL4CVodBzL&Oj4$CN3I^b+T}K(-r2n4E8lqJR z_tC_(Oxoqr(cD2Dn@OS=Z4$Mx4$)ZjcQq}45WdEl&^cj3Zf?)FxrWq$6#1N~s`P{D zC!U0x=$Ex}{Yw~n|BMa$aKb~3D&;cUKYo$rKP?!S1> zCd>HmL_-@a0=#%U{j2 ztb5i|w$e`dG1tNaK8srLK^yG~7OAOjk~F~UnA(s}if~=DD58I-A187e3gQx$zys%y zf~NoAo&4jZK?9>W+~H35;qQ6k(_KgT_r@o0%=-I<+Vt}`4k-8ZH%rmm@6E1if^DQJ zL2@%C8w!bsrfW=mn=`?%!te#vUMm!&fk9Al0v^yQ3J+BkwU64{(EwfHLNRy`3toRs zCy0Gr0umrdWJMFoW6$7YN{R4o#xgn6`@PDwVcd1SEN&Tu){@6-ZZriESouY~$j@D{ zO{fTOK;%+$Au~0X--n$;;)0h^$$swds=X{yisUBk^t)VtNNG1-mrpENPgl8?Gz?Q= z;E!-YE>!#{b?uHlxQ$QZsFsZ{Sthv*eioLXf9?Hgfc^V-#q@`0prHhh!#v(Y#ZgrZ zreU}ToxDXexpwi%=lD?I)R>$3mM>^WziVg3~BLF0>tQESfY;sh`>AeJh`RuD+&`(pt}LhTr5% zY9lQha?w;U!oRS{9UOya{G%9)iDHV9jW0Qd8_!EYu2oPJ)7XaA=#J931%iP3^_(8| z6-Getf*S&OKA+}+hHBCl;~32*0=a>@9sBHQ*Z>=A=!ax__%9f#`DYmi3nz+86iwso zHKi^#W5j4_bd_Q5!(5gdWPLHOy|%%&>{<@&#|0{`Ohhm;DIF>@aQ~kU_^n_prbxbp z`xwf1($_me$nVp9ZU6IgT48O4Rs%c51Pa9X}R=>ldMJgwWBC@ zQg>+Rk7RsFZ~t@VZa!?x*ou9WN<%3UCPNA7qhTL!;j_F6&#?;uSvB051Nx$KKqi>T z3s>;~;o`11C+ERbDOK9WTeze;8-(m+Lpp*G_XXWKBM-%~D$YBn zyx$EvsL2#X1$do!&R5Y86-hxVG<^F1`X4{yBOLevXJ`eV@En_qc zrgWIl04LR4*oh2zn<0-l&VBei-tkhb;3Nbf5;D@i$Q=d=Oxv&xDrQqlS|cqIy@Z=? z0Cu1_3L+RLng{~8ic>&ewt#dn!WD1vjL(U4v`)&$rNv?zrd{BDIE`uuMq?C4+86cg z%TNnJTm-N2o2j$=Z=!eT0@sJ)l`zWB;jRX;H$TBxss&Ui?|1=wj9`Czs( z#9mA)lG02Ynsh$-sygb^R%r)ymqWN0ilY#If{g0C3a@#QC`uE>D*ba2JcY9k)f_tG`I!!ACD9PmNjFJj_|Q$T-1L3Zc>1S1AOYg!A|W{3bNS`xd%fke2& zfdsgJQE5C0UI6A|4=17%cEM8&m4}d3b>%!9hk{fQu84vK_J3fG&tDJtkMawoQ6H%m zw|4AP%SqP~H8t&%pLv&BH#JifzakXDtFaakUF@1(00g& zxS#e+B%=sBI2(XO@__OMb!{TiAZw#FASP=SmFbJEyGby^fkc?$ppWDM2X~{zFybx* z2o41P%SRTS0{Z_C!okRZfEhKRP$l&@Tu}3>c|<&4*Lra<+JRw*f}-H8bwK=u+_?jQ z4t^lq!8$0Y2oJWSER`e|XfXed_sP%z82BB(6g@;G+_JS-TH{vyN+s|6Irj3}C2L`Q zaa!Q=hVvqYe?&oep%M?lEi{ty;gY1uBy}?tVjuZBT4^OkCA8y8?1mr|A?=GQ)j!f; zH6ac*-i9LZM@LAsm=~!8S5-j+G^Wb90s(VY4R;FYixm*SNCa~-b%!hFDMh%fV}KG% z8`Z|xh?AVjTkst7sVQ>vvM;uR{zogf0RZ!|-}$H8VF!2ut->UJO)>0a>7y1 z(>_$;B7BDfF^-zh7%av-{sF;U8%TZ5I!P5FUoYd{OG6oz;d=5k91C5DVc( zZ83$HeQlq}|J57ky?BKg)ESW&spLEi3?p`<4VVXk0W@|B=u1TdLq#kU ze8e1t(^lIC?TFP&3l|C8T@Ik_y6Id8W3>tR5hZB;AFPf1y+}YJ9CQ)c_yn3^A0AlN zYK82VQb(ydKQ+ckETKAhhQYW2D^z5{AFc@FzPQQ0g2*NhmU>7B4L^%&@@p}H`bwE{ zaWQ~GXf1kC2l#zW)8zgy6-0G#n@3U+OcPU;2>#?~YxCBwSXW^@decc9go0LCHQXtn zFIqqkkcu0W2d&9uS*H#(?@exJzmRZKH$a+i2;d34K${FNl*Ni~R6yx?4;g)EB`WcF zb%)52{zTiMd8fxIUE;5Z1*jyw!YjPvac~D?E<)gm0vLqzoFH|k-ts;1KqfgU{hW3_ z`I@A6G_zIbX1t5W!xKx9;ndGR83VcC8osBlbV%47!+2+#->cRm5QApkE65tNG^y&ocF&UM(pJ8Vi_Dr2crU1x{255oaSq< zlYB*9A@;~;xfGW362xa^@SFnrf^$IckcMZNiHfva`B^(>uawzXX_GdFL-{P;KtMo- z4Dp35M*Tk*H1(#=G}4||b+h*IGMXGgU6d_!%lgD>SDs|VitTh=3`QoRxB>{k6nMh} z!I*{}TvId>2B|yF$cK1cMjPc$N&|CcN6z#yQhQNamz#rl59j~-hKm1>P@us94H^_` zKs7K*nXEOnPrxixq`jDlU-0bf>)w8i+i~O$i_QuoN+KsteNF25 zS_K3=K^(5pH4LRd$6?KCx5vLV`$whQu5eYyd)r_Pv)QQ>?-9G;1s4Q4cxGXXf4>H%@mo`2vKN<8yKB+l?n+0M%eHXPZ3I^wX?LE581OL zpKYcV!5fwF9L^d(rnSUHt}Ic!$s7=sq)gGQ4qu&zG}PdV zI#|lrzP?BQ8U+-CG`z-lD2tVRm3_1w2`kNAJ}y%xl0{pCts-9XdQS+M% z_IQQ#>L&7-o-H*+AC?C=a(_;9d z6~|x(zIO`fk3c5uNX1K};sK@8462myE@NfXW{bZXY>w5flwc^!OA)KBM*|c^jX!;u z--3P^Kz84g?n@z=p@@fc#nsp<#<= z5`lQHC5un+XMfh9A{%_at}&YbqquYjZecyG1VnDjJN2abe!{Dav?!TUX*gBJOZYlU&>UGNy#^ql!`z zZ^kW5LKA3T%O+%ByMR9P8!q!`F__j#c`{B|A1A$!E1Le{{VxBiUa{dT)E{_|{iCQu zpU@gI1nIva0R?ahzo2;W48htW=@WdZkFe^F;UP7peAopYPC^IyPs=u~05XsZ8dXI* zFtb`(OypbIB3gxN+ISIw6t-&7@FFiNL#|G%`~xV^*sks1b@)ksDE%sj#;wkXeRn?N ztkpf~h!{sbr1F@9&ipwaH_0iWKMq&$96Q7sx+jwC>y?Vu)M$Nb@bd%t$K@aDtYG@Q^=BKr$6L-6*EtdSY|H5KC1MfZsR)6SPuFGis_{;nt#nc*CP4i}($d`8FNpX7GWhvjg^b zzYD^8oa8~Ip`%pJvR9pEt{pW!X~2^`@W4d)!W+IQjyR-ZrBgtEG#pT2 zw8eapg3t=CFgXSE54?-B+=pArIiz#?7V*u~tG*u+H#)W9n-$VbCz zz(g4KBPO5=Uj+c%b_(c^$ty(TI*q4p#9B*jn9@06a7wv1 z4Jm>ih{;+wN2r^qHfqp#&VU(-z*nyzrn=OK?yD`;&W<6jxh;L;GxK*X+P`6Iy0JgCKF-XQkT1HbTw|ZZ@YQIEJ^|u}Ol6qt+9}wFj?x&}rx)-_y z#^qd=EAUhhgi}C&OF`rY7x?mioaTw*Ej^GradED${iMz24DAr@qONoquMv$KkiO=1 zi(k8dbdX>~2Q;QdoX)w`<1U3=YWwJ_Z79?Dhx}f5-CKk-QfF(u9agG}+2oCHVQp9f zMxroMP>J938{Q#ZO`4Y(>FFbGOBts5c!P^v4${fbOjk3PC3K(;)L5>I=~&5CzrHOvz9j*DetCy+k!Oi&!Y)-vTb3CWKg4>;kvpS) zjt|+N6`f#^Tvf483jlD!>DT^)ToX0TF@T#+Y%XwC`k5bmELr9{M zG=a9lxgXG9myZQDr14>P*NW&X>Rua<#6;aM{Cr{Bvdo$Bi=;bZpS%Kxag}F517qLU zT^#Z^@zU?(DGt#&?4cU$qG@XQ(|NCJpY5GDInVdit4ZUeD18PSv~X<(wMA1}@RbWF z17^7J_qfKs;x>h%t6ascwImh#xVO}%R!<~m=MZOhf;S~oG8&R`x2I`;$m8wT2neLR{R^jfU9oV2XWc>L7o z_0ludxTDrbwNRQEp?ktU$j^tqh0^#o1f)TO!UHg#JtV7S)Gvw29>4i%yXdHR_a_-) zPeY58H9K}WTr4wDoX*kZKVA2Aent*Bz?{a@=sNVG1pCWIeXyLzFwB(fU!IHz$1=?3 zY0#iYF1W!83sO)T&Cmhu_(x8+M%k7mq*%9Tggksg%n&oUE`FxHh@&4-9)|z#b34A$ zZdcYH#&Q74%WZTXMwbu%?=AN}#N>=$^=zTkUXt}sS%>l548MJy^Pay|0exmS4&W#8 zmR^X%wgoo-^d`^dzKS@zHv5xMzmfyAV`2`Srs`B3$B`F#Q2ndjErb#NsJ@C=UW~fVZH#Wv%sY>|0B?_P}9N zFVha%!ONucXu}oZ2|Ik?@pYZv`8$<4<2hd744>t* z4%-cSf&J9@&ys&%mxc%ga6_5_fAzXJg4(iC{}4awbGkGRC@Rg9#_FTA&RQ%lqMMW* z^^t&2c!cwOntR{^U6Ni|VObehIP;!kT4rBIJt!zHaYb=V zoRdQ`)@F2#3xB%q`Ge!X`t}ae=V`CC6GbqD79bUS5JEvH@D*k>K0i%cK7>T=qv(n@ za$VhQwXvb6Ycc;dvOyo6Si|@=`e|H=g1KHsTnzpe}V4E9D{f2Ig(?p_xD1 z9f`GVow$N$f+?FcP@STc(wd?SLa8u(oQdc^$%ny+;S@YVGwO~a+F}un2~RgZZ+Lu8 zhLlk+uBhBhUT(aKdZ@$|0RV5E0{VJMLL%Pa49;Sbdx6 z{>8#qD1{t@ZPE0QHqa!fP+eb6qFYM>CiJfAf+yO?Mgat`R%-T(foC5l~ zAxy(K&MOXy8*=0H#I(+_VUO-U+vvu^M88E(%5f8fP&S6}Q#0h&O+L9k#6pYReF=$fc3EUKF$hq+V6 z%QVZY{TUJJ<*FMzR|*BQxdlS;mMx3HZGY6*0ie|lW( zq5jb5bdfeCwzWJ!-fWnJMktdt=Jnw}vvf`Yea&HUG7|9?JFpSGrNLsH9Q3OGv(l%B zEo77771ao`O`MJuLN%kupRyF+Cr^WXl3Kc4^XJ5FZBf^k` zcX)t3{4-}zesNy6z&t;B>znCHv<~m9TwHNB^`fbikbX8L@RO(Qn5A`kGx391E%xIi_VG9n1gyZf*lqn*1@!r4 z+hKzld$AthQwPCfUqZu}i09ps{NrZ6+^P*%Z>SfvU$nc*1{zHp$&Lhkz~isvqx#&b z{Dq2%S;|e@Rda~{ReNIc#sU}XE$OjWjxj89y|3j~n>g}Q7}Xcokc9Vmh|`$Q4MeQe zQl4aKml6@1M+sEcfBHEyPA!$X`;F~>i6bNQ*G((kUvhbl(dK8x0pC`w(%^?|$j{Tb z0UO0GQB-a(vPq?->ROyOTzf8cm$u9Mum``P7Ys1M<6EA(`Rxh_00aaCT;YxYxF7(* zVxhPorMS)Vj1GEGux0rjZDL%myWjKm(E`;xN^jan=~NC@WFqD3m?gw2Vljq>^CqsL zZ4h$}Ia3?j>-Z1RFL1x^qqpc1W1?$QA^E+u3AeDB8L@bZTUbG##4t3{UOM)C*z+*; z_ShWfi;eEKEpN-*@2eIeo4iLK$Oquyv1Ee$jR@%TOdlg$;l;f;4{sMQq>J)=bH{Wg zG3ZgyRm-;b8H-ac#H7H4G6;by+~J=UEAh9Rvj4UP#95mnIAFysoW?40qmCjreNFO@ zA75qkOWpH{BD<9v-@KdlK$RWS&;vcF8;VdhbjfP#{^4Q~Pwrjow`+{&lc4Bu*D!nG zgc^R1x3+lmBuW&?q8x1eISvwk=vlvZC?I}=yf`T3rFk4_3~>oI&eyN;d7SeczI(mk z`Z(CI3%-!?9B-k(icFls5DpPrr9!$q_W3CTVrr*+h@E!xR@@Z7kA6>r^0>EjY*gxL z^{6x*M>Gn5<)0Ztg9-z=!i&w?PA#u4#qi$6_63KXhTUozPr`(jG?NpvA_cOY`lP|d>TJlt`{*&K24Ayz0gnSp%I6J~&K?wX{ z_zD%IL4yh}1W`B#Y0;Xi+|rotk~jHie2#Z#A1pX`?zg9^k22J@TeOy=^uM7ckLT{t z!w9!;x!dIw(Er{Y`&>CXusd%TH)KU$EwyW0$+t20hMWpr-K1=p7KKOjls@Rf4U@FB znoR}fQJM%rCK5UN54jQ7=k(_=c89+@i7rz!gQT-@kRiM8;+%P;w#H3vE=n!yC2J*m zCF+a9NX85F%KCJ+a)h>)^2mCFpXGAYhX>P>`X#o1eki4#XLOOX-lI%*wTpU6n~Ve4 zM1zs{tNP>^8Z@}VmqIXveYK0!QP*8cv$b(#%XGar{?y^s6;fT|PP|Q%uIhy$3RO6W zw?YqxQ$0=r{cR07U_}Nxaxm|an&=)Il#i#L1YVLJZ95;Z`FY{Jbw)si~Mp^mBFwtlVt^ZY;V@6*?&wF}bW8-vQ>8nP7oV!Nx%bC>PcB_DOVxC542(`3$UEV{ z8)QI0IKMcjfc`cTB)AwG$=TS@;EDvmM>}9jCEXo^f2pQ_&&`UYQZ_@nIrIfCy-vJea7)AY{srBpc?IQ!|=e1*2cp(Jup$RpnWbqug*T=cOyz%~#3QV+zM)5l9dg}=7Ra2#acWQN_06G}vg|AVA z*T9OJ7>;73;a*t_cLHy45WS=J)Yv&ACpi6H;n>>;k9w!|3RpILlC7h~%+rkwQGjk> zY=sA`u$9e&_=);P00b2(3h)347{a@ZjcRAhSeu&caqVDu(T&g}qrdLKGj-Lqp5}`s z>THCdGB<<`-U#?FSu>RZ^ebHPZ193VCL)keP^c2D_HmvnuAgs@oVMrlCF7K=7Z>q=M&0bvholg1X$9r_F!d)SCsXb3l4PtXZTP@td`dC0_kv|yXs$r56#p4RK`%FE{?d+j;CWRf$y z*pxp^>{KJQJLt=m`Gkxf89={W3|Zj?f4su?c#=4**3k}?yqVKB&3<*u_V)9G8U?-n z!K6m^^1%li)-tm7RjySSMG+)mfe$L+N!Vgf0NUX)Y}^Q!Fv%LFgm zSo1COM2K3>8gIGIhd7w;qcPf}N!cj(aX&JIQsg27OSm=rh>Oa8ZBpjR*v*l_SI2Gt zeEwS{-E)qoO%m(1Skp^*ffKoB*|$YTj|`w+*uyolo*d47#d__&X+}}A3{&!u$gj3# z%x!M}Q|&d4gIO5R84mQJdbEss(;hbyp zZq)4gB#&m*Th(op8Jy;yU|0HRL(FM7$byw0PcR09pu&vrSU3JaA8O4k<@44>`G zIr%Z&zNo=Q<>L2{qTC$+x{Z(PV~C5FuA=-B8yV}?>B7Us<>LaZoLPHDCbw%lkJYtc~!EOQ%j|uS_zkU zFb9`S%N~#DF`&bS01Ctf%;wSfo@euDk!|i`NuXKOR7^9vx~I5ii+1YMriEgGQm7_i z9-4DDRG3k&tXYE`Hp>d=(On&>Y?aIgPb@`eCgG!|spUk8lBCX3D_Qo~-t@a(uX)oi z{L-Hq+w`2##9h->0~7gu<2KERuIqSBWat7VGEk4r5SQ_viv}Hed!UO8BcpMl%?CbGB71YEm&Nia4o$O+e zaHtox+SxBe=U-0Dd?UK*#fk2yk_N>y5kpl_35&S`Gc;J?`C~&WqeoUi|M3Zt86NOK z3rxfU_BZ^E73K`D*UDRhyT8=!t;tpAwx8e2!dp0)3-}BD&+hXSDi(@#JbY`}!^P~! zWA_k&_%QFr4e^C|6U`m99kX~>T*&RDl%#aaHe+&D$KaoJcA+vy;Q!uc zVZa3^I$}Q+v0=>66I56xTJHuVy*7SU%fPKq4{dPQFWQszf%+UHmRizz3Pk`4Py~kf z4<3bwYn=irR1g$s+}9Xq*y$amt7^~(R8_o|+$!9@uR+Y)d-K!gIX#;icT2sBdSMau7vJC+jG^gpAQzdBMQc`!QV5Jff8Hp1Q8LC`6yIjP z4YeT^1_rk-x&9z4{v>Ks6SD$hwQNt&-?mT+%&_1H+HyL5qRdr0yWEArd3W;~gq>Pu z7DGH6O_`_!RD~y5r(3+?ZOkzmqX$B;jH;plh0q^)9GBg_1#kG_8dmV<7|k1u{$imi z$MT&!qF`5EW2>9 zfKrq`g7u?^?X!Raf(DJJaU{>9H|QFv%6;=COYefINzGzU#J#ig&Kf;)cGReI18AU9 zUyY%q)I+Sm0+i>QFvACS*=orO=y7exEGUlvEJj6+#Xwp@ETEn?oz9wh?c?u_;>+o6 zQ@*Y7evfT~W>wHzoa}U-yu}^S(dg)U-%*aHQm`0;)|iRSaHALnWvB9gaz66#fBGH0 zj5=tINi@>xWq!buOnRjWbpw@Iw!L0Yxg$zC+P zvxeVDzi`RnpOceOxm;GI71d0ZNj}2v&z~Dl>GkJHa z0Oe=?76cs(4Jyn?!&w~Vw|OadrFz0GUR7t9%UP?H9Ln%Y?GigXqwt%5<&rfv1+@Mc%Ee(9oBbL4ge(|76}` zK>z}=%E;q&G*1oD-gLfPR9x60zx9!-UxjC1ia#F{o*9vsr}R?tX*s{lORyK-NI@!! zAfSPu|D>Osz-31%12^zJzsLJ|ByM0GzEsMat6BDPnm%98N_B;wKKN|Zs3n`GRY~n| z(raIL7W#C(vN)x+(`sWh@8+Snk8?Ou_7{}VBP*aMeo+1JWDG|xuA&oFrS^i=Otq1- zXI`6}rP^##4o(VpOt>gXsR?ZRU)C$@h-l>n%JMt3D;w$tmrH~Uo zsD-Ehs%84+TXPkJ8rX(BkxZB2)K9Zr+g(&Ye`HaW(vZ9LBU%VhV&7q!+2u zlt5@F#UO-^N{jSzdEcLKJF{PQW}k06v-`|GyVGWFC48y7!KtWuJXUqmUZKO2$VSd3 z?e8m7jxMi?k@>PJ3L*h%0#m*zvwfl;^}j*oE?Lv*9Cn>veCZQTmWhAFVo7<{mVUP% zOU*6K>mGhdQ{Z64nxP@L49rss#GQTZ^JF#&gc35b>eccGmZZBF$Oj2?xXvkoGyFEg zrCW9LyD#7UMR%s|m@k{-FR^eZTE$Nq<_$bS3iy4`_sc=!j|mqVAF%LOi{uJW%D59&+pa~mESJg_EamIo21}qFCs)lp z3NohWu?c?nF>YoI?eF!B^)Yu$jYbBqCRG@PX8Nc2P(>q|S!%5rbZfep)H&{CB+2K0 zdcyI2Frv`YiqRfTL@53KP|;;ZdT1xVZ6O}D+7o|#q7HA%RSMcN-MqGk;%oipB(H~r zZrm!b{?pD@>21;x>#qe#HGLrMWJISt!&*n1EFaIPHR5r;0o$))+2covHTZDVEYjB_ z0ww!YcgF~I#i_CCKqIP>YTTF2lHqMRyBJ_PJRI42%leA5`5 zx5yL2ernsepe-&x`#o;&>ldSSa1a{$`kMM);83W8%AX;Mt*b}X;ZIq}4as{nqS6DX zWcX4l)=Tx^M<`fFiANpMN0?w8}`?Y>M_U?)HBi z2J1s0HeAieJ3wH>MfyKF#1jl?^W8{xq{Evz2 zi+zQ{w*`g2U7)jHhlN_l0ciL!vp6nQ%&&w_L#G*ZU05=QH^D{R&}CwJ1(CY+C1)ZC zcJ1d`p4*1~S=HUisewjS0{m6{1KBlA7YwNMK?KHJ=?FNFYc&s=vrl4Y7kUc%xO4g` z__Y%Yq3qRSF@ts9##nl^tAchbY;<91A`bz>KR?}6%C9R-ml+vZdosB6Io@NT;_3$WqBeE)?=_HP$04;NAASD}w)c0C76X?o z40MY8I2Xw(gJ&0uF#{lvZoo;K8(QP4t2;m5N~n&To5WRDsq}^Ul+SbvZ24Dj_~T~- zC%;uUJ=$nLJlMh-%HQQf)&yVtiqb?hXI=6&l};pYZ)7AVHX!7NvFeJMf|GkpZ5*rE)f7iKNKgJl8u z_2sZ!0Te>odub%`>}(j6x*DMQR1{}{ho-%Qu6uqc7m^?L@s(qf{WkZm7Q#soyl!kL z9^te~Y>Re@xSUO3jT_}~tP%Ov*#y`1ioSPew8%N;c0m?0Gz^9n`m6QgiMFe#;QTIP zc>22M;Tgrw3H*%TkL{pl*>j}iZ!cpu!Tc^!vMy@E(M<54=~&C!`Cy`@s@tugu+_@J zvUD=_Bo{7+snFQ%p86>QbX3Ttq77Mz~N*Sf;k>zWTlr8oQP%+^pJ2Bz$;oxC_M3Tyk*GNQ> zM?(%>h3s=<%4! z{0$4A=i2KT=o*dB%FY!Nu4*o}E9E>+Ote9NC8ms`nAQ|3N9o!J7j@tdNI&~bob_@6 z36S_jyqmki3PjL`#GH4N`KdGHF79=pYn(J0X3g3YdNo>nuG?VSgKEre!aVBRjD|5e z94-P?b@h{bWot5680c4s(p;{nTvg$wkLGTOVctquF)U4 z(}NxI-kst=!==7f(V-B1B%WG^s@J0Ec&*}Fc|F<_>1bwRU;(MpbC3NOIgTfL diff --git a/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 53ed9b9914ba3d1fe703407d2ce64c29e478959c..39f583b630ed585b5b55b48c45bdfcddb0700570 100644 GIT binary patch literal 45266 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%0DnbY=wZ9zQS!aDxBjZ0E`B@v$e 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

O)q+7lL2%`1dV zv!u5wC9Lo&9dIdiDqawGe_q)%HEKC2kDCcmxW=$+Wf9i$g!b<)Xb;U?9aRnJyp!z5 ze@?wf*gh68)b#WPoEstLAG;!{hX~Hf(MzVhdh|O$u9ro9kFHOAfXo)L1EdCS3p8+m z_+l#-v)|Oa>(qY?>^hyPqaGi1q;Hw&kFd%BiwBN2J&%E2BL7vK-j+srB)-(3fIFW^ zOiuODx9!6|Y>5kK!6Bd|DRx`zm}ApN=G6L1oK@22%2&{Pclw6B1K8O3Fkj@kMsKoF zM>Vb^6sXRj4Cx3g^`R~GS7wJwb0nZ-vnZ`tDvKUgtSC7I^L6{XReec$qMt@r^G!PL$?UnWd1YtG@CG5F1a<91fsH3SJ0Z&> zo@DBs99#XH2WMq*#xuQ=U)!nu^4otKhPU#Z73(aPw?ROXL-3mB+kQVk0f|;tO8^3%}SbI^4qwbf|vaso}mHzoI_8h@+&;HazQ(wO_JX^A>VbJzS|4 zb#<_W8dI)rsB9~L{EovAgzz?jYx#pE@#i$FMLCGz_Q_TsF>H60twW}4^s^~wH7ttnlGr8&fTpku5okhoW*-zOSrKl|Jc)t4`} zTVLcCyiK*@Rq>Is`7oZgy;E^w=dOO9R>1#l_)AxkkfgJpi^)mtvX#<^E7>nU0_wCC zo;H8~Lw`1)+gfg2z(qv+tAN(M%`#R6Lr3S*T#F*9RiZzFu-$>LUn^_Or3Q!#m^@FE z!{{+efa-Xdm^bqhr-q=DJU4oWlbLoc&@e};ypXoMvo}Lg>orU(@Jq^_L%iXU-ywY? z3|ruA$3*24>2Dll)5kr-e-&%Gp{s4&dGH5#Ge3Vkw33+F&gkiJai1oZkDKQX1+66sd{Lb7V~CvPQG>h767X z*uK*AokF@t{xhV5(@}V4cj?_LD<0W@5psnVpq@m!shn;_i%Y$cl5?l z(nmvQ-LN5p3T@Ma1{b;8;lJ+X&!G|TkR=s;66TIaT|<3Jr-AxD2hW+d`rLd#L~b6@ zO36dLu1dXZ-n`e?hRxGRSs3=*tf+wkZC)@Hgou83>(8;6enR1U(UE*83=~zSEW}kw zC8nxDJGm28CbJ*4=T!wruYE#Z<0F*#Yn0EErm=wnUz^{=AR(Lr(%*qX`rD3#n02K8 z?n_BU%2dGc1O`>i_48{o5Hr zxBt~}{=Yu;pKJABQ}dq-@?SQBEcu$)|K8&MA6^+0xSNZNm86&P`c&Q) QG1N#(a%!@b|CojRA12I0ga7~l literal 68697 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 HQ$iB}vIbw5 diff --git a/src/android/app/src/main/res/values/colors.xml b/src/android/app/src/main/res/values/colors.xml index 472567b323..ad3412ed27 100644 --- a/src/android/app/src/main/res/values/colors.xml +++ b/src/android/app/src/main/res/values/colors.xml @@ -1 +1 @@ -#1F143C +#43fcfcff From bcceced96de60fe2432f108db102abab9fd9b6b4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 1 Apr 2026 07:05:42 +0200 Subject: [PATCH 21/68] [dynarmic] fix GetDecoderTable() making the compiler nervous due to the big table that gets made into the stack (#3799) issue on stbale gcc debian Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3799 Co-authored-by: lizzie Co-committed-by: lizzie --- .../src/dynarmic/frontend/A32/decoder/arm.h | 28 +- .../src/dynarmic/frontend/A32/decoder/arm.inc | 579 +++--- .../src/dynarmic/frontend/A32/decoder/asimd.h | 46 +- .../dynarmic/frontend/A32/decoder/asimd.inc | 321 ++-- .../dynarmic/frontend/A32/decoder/thumb16.h | 8 +- .../dynarmic/frontend/A32/decoder/thumb32.h | 8 +- .../src/dynarmic/frontend/A32/decoder/vfp.h | 6 +- .../src/dynarmic/frontend/A64/decoder/a64.h | 40 +- .../src/dynarmic/frontend/A64/decoder/a64.inc | 1676 +++++++---------- tools/gendynarm.cpp | 1646 ++++++++++++++++ 10 files changed, 2746 insertions(+), 1612 deletions(-) create mode 100644 tools/gendynarm.cpp diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h index bbf128d797..1e3d368187 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.h @@ -36,25 +36,19 @@ inline size_t ToFastLookupIndexArm(u32 instruction) noexcept { } // namespace detail template -constexpr ArmDecodeTable GetArmDecodeTable() noexcept { - std::vector> list = { +static ArmDecodeTable GetArmDecodeTable() noexcept { + ArmDecodeTable table{}; + for (size_t i = 0; i < table.size(); ++i) { + // PLEASE HEAP ELLIDE + for (auto const& e : std::vector>{ #define INST(fn, name, bitstring) DYNARMIC_DECODER_GET_MATCHER(ArmMatcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)), #include "./arm.inc" #undef INST - }; - - // If a matcher has more bits in its mask it is more specific, so it should come first. - std::stable_sort(list.begin(), list.end(), [](const auto& matcher1, const auto& matcher2) { - return mcl::bit::count_ones(matcher1.GetMask()) > mcl::bit::count_ones(matcher2.GetMask()); - }); - - ArmDecodeTable table{}; - for (size_t i = 0; i < table.size(); ++i) { - for (auto matcher : list) { - const auto expect = detail::ToFastLookupIndexArm(matcher.GetExpected()); - const auto mask = detail::ToFastLookupIndexArm(matcher.GetMask()); + }) { + auto const expect = detail::ToFastLookupIndexArm(e.GetExpected()); + auto const mask = detail::ToFastLookupIndexArm(e.GetMask()); if ((i & mask) == expect) { - table[i].push_back(matcher); + table[i].push_back(e); } } } @@ -62,7 +56,7 @@ constexpr ArmDecodeTable GetArmDecodeTable() noexcept { } template -std::optional>> DecodeArm(u32 instruction) noexcept { +static std::optional>> DecodeArm(u32 instruction) noexcept { alignas(64) static const auto table = GetArmDecodeTable(); const auto matches_instruction = [instruction](const auto& matcher) { return matcher.Matches(instruction); @@ -73,7 +67,7 @@ std::optional>> DecodeArm(u32 instruc } template -std::optional GetNameARM(u32 inst) noexcept { +static std::optional GetNameARM(u32 inst) noexcept { std::vector>> list = { #define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(ArmMatcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, #include "./arm.inc" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.inc b/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.inc index 90995c4c05..07f7ce0154 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.inc +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/arm.inc @@ -1,316 +1,265 @@ -// Barrier instructions -INST(arm_DMB, "DMB", "1111010101111111111100000101oooo") // v7 -INST(arm_DSB, "DSB", "1111010101111111111100000100oooo") // v7 -INST(arm_ISB, "ISB", "1111010101111111111100000110oooo") // v7 +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later +// DO NOT REORDER -// Branch instructions -INST(arm_BLX_imm, "BLX (imm)", "1111101hvvvvvvvvvvvvvvvvvvvvvvvv") // v5 -INST(arm_BLX_reg, "BLX (reg)", "cccc000100101111111111110011mmmm") // v5 -INST(arm_B, "B", "cccc1010vvvvvvvvvvvvvvvvvvvvvvvv") // v1 -INST(arm_BL, "BL", "cccc1011vvvvvvvvvvvvvvvvvvvvvvvv") // v1 -INST(arm_BX, "BX", "cccc000100101111111111110001mmmm") // v4T -INST(arm_BXJ, "BXJ", "cccc000100101111111111110010mmmm") // v5J - -// CRC32 instructions -INST(arm_CRC32, "CRC32", "cccc00010zz0nnnndddd00000100mmmm") // v8 -INST(arm_CRC32C, "CRC32C", "cccc00010zz0nnnndddd00100100mmmm") // v8 - -// Coprocessor instructions -INST(arm_CDP, "CDP", "cccc1110ooooNNNNDDDDppppooo0MMMM") // v2 (CDP2: v5) -INST(arm_LDC, "LDC", "cccc110pudw1nnnnDDDDppppvvvvvvvv") // v2 (LDC2: v5) -INST(arm_MCR, "MCR", "cccc1110ooo0NNNNttttppppooo1MMMM") // v2 (MCR2: v5) -INST(arm_MCRR, "MCRR", "cccc11000100uuuuttttppppooooMMMM") // v5E (MCRR2: v6) -INST(arm_MRC, "MRC", "cccc1110ooo1NNNNttttppppooo1MMMM") // v2 (MRC2: v5) -INST(arm_MRRC, "MRRC", "cccc11000101uuuuttttppppooooMMMM") // v5E (MRRC2: v6) -INST(arm_STC, "STC", "cccc110pudw0nnnnDDDDppppvvvvvvvv") // v2 (STC2: v5) - -// Data Processing instructions -INST(arm_ADC_imm, "ADC (imm)", "cccc0010101Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_ADC_reg, "ADC (reg)", "cccc0000101Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_ADC_rsr, "ADC (rsr)", "cccc0000101Snnnnddddssss0rr1mmmm") // v1 -INST(arm_ADD_imm, "ADD (imm)", "cccc0010100Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_ADD_reg, "ADD (reg)", "cccc0000100Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_ADD_rsr, "ADD (rsr)", "cccc0000100Snnnnddddssss0rr1mmmm") // v1 -INST(arm_AND_imm, "AND (imm)", "cccc0010000Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_AND_reg, "AND (reg)", "cccc0000000Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_AND_rsr, "AND (rsr)", "cccc0000000Snnnnddddssss0rr1mmmm") // v1 -INST(arm_BIC_imm, "BIC (imm)", "cccc0011110Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_BIC_reg, "BIC (reg)", "cccc0001110Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_BIC_rsr, "BIC (rsr)", "cccc0001110Snnnnddddssss0rr1mmmm") // v1 -INST(arm_CMN_imm, "CMN (imm)", "cccc00110111nnnn0000rrrrvvvvvvvv") // v1 -INST(arm_CMN_reg, "CMN (reg)", "cccc00010111nnnn0000vvvvvrr0mmmm") // v1 -INST(arm_CMN_rsr, "CMN (rsr)", "cccc00010111nnnn0000ssss0rr1mmmm") // v1 -INST(arm_CMP_imm, "CMP (imm)", "cccc00110101nnnn0000rrrrvvvvvvvv") // v1 -INST(arm_CMP_reg, "CMP (reg)", "cccc00010101nnnn0000vvvvvrr0mmmm") // v1 -INST(arm_CMP_rsr, "CMP (rsr)", "cccc00010101nnnn0000ssss0rr1mmmm") // v1 -INST(arm_EOR_imm, "EOR (imm)", "cccc0010001Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_EOR_reg, "EOR (reg)", "cccc0000001Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_EOR_rsr, "EOR (rsr)", "cccc0000001Snnnnddddssss0rr1mmmm") // v1 -INST(arm_MOV_imm, "MOV (imm)", "cccc0011101S0000ddddrrrrvvvvvvvv") // v1 -INST(arm_MOV_reg, "MOV (reg)", "cccc0001101S0000ddddvvvvvrr0mmmm") // v1 -INST(arm_MOV_rsr, "MOV (rsr)", "cccc0001101S0000ddddssss0rr1mmmm") // v1 -INST(arm_MVN_imm, "MVN (imm)", "cccc0011111S0000ddddrrrrvvvvvvvv") // v1 -INST(arm_MVN_reg, "MVN (reg)", "cccc0001111S0000ddddvvvvvrr0mmmm") // v1 -INST(arm_MVN_rsr, "MVN (rsr)", "cccc0001111S0000ddddssss0rr1mmmm") // v1 -INST(arm_ORR_imm, "ORR (imm)", "cccc0011100Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_ORR_reg, "ORR (reg)", "cccc0001100Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_ORR_rsr, "ORR (rsr)", "cccc0001100Snnnnddddssss0rr1mmmm") // v1 -INST(arm_RSB_imm, "RSB (imm)", "cccc0010011Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_RSB_reg, "RSB (reg)", "cccc0000011Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_RSB_rsr, "RSB (rsr)", "cccc0000011Snnnnddddssss0rr1mmmm") // v1 -INST(arm_RSC_imm, "RSC (imm)", "cccc0010111Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_RSC_reg, "RSC (reg)", "cccc0000111Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_RSC_rsr, "RSC (rsr)", "cccc0000111Snnnnddddssss0rr1mmmm") // v1 -INST(arm_SBC_imm, "SBC (imm)", "cccc0010110Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_SBC_reg, "SBC (reg)", "cccc0000110Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_SBC_rsr, "SBC (rsr)", "cccc0000110Snnnnddddssss0rr1mmmm") // v1 -INST(arm_SUB_imm, "SUB (imm)", "cccc0010010Snnnnddddrrrrvvvvvvvv") // v1 -INST(arm_SUB_reg, "SUB (reg)", "cccc0000010Snnnnddddvvvvvrr0mmmm") // v1 -INST(arm_SUB_rsr, "SUB (rsr)", "cccc0000010Snnnnddddssss0rr1mmmm") // v1 -INST(arm_TEQ_imm, "TEQ (imm)", "cccc00110011nnnn0000rrrrvvvvvvvv") // v1 -INST(arm_TEQ_reg, "TEQ (reg)", "cccc00010011nnnn0000vvvvvrr0mmmm") // v1 -INST(arm_TEQ_rsr, "TEQ (rsr)", "cccc00010011nnnn0000ssss0rr1mmmm") // v1 -INST(arm_TST_imm, "TST (imm)", "cccc00110001nnnn0000rrrrvvvvvvvv") // v1 -INST(arm_TST_reg, "TST (reg)", "cccc00010001nnnn0000vvvvvrr0mmmm") // v1 -INST(arm_TST_rsr, "TST (rsr)", "cccc00010001nnnn0000ssss0rr1mmmm") // v1 - -// Exception Generating instructions -INST(arm_BKPT, "BKPT", "cccc00010010vvvvvvvvvvvv0111vvvv") // v5 -INST(arm_SVC, "SVC", "cccc1111vvvvvvvvvvvvvvvvvvvvvvvv") // v1 -INST(arm_UDF, "UDF", "111001111111------------1111----") - -// Extension instructions -INST(arm_SXTB, "SXTB", "cccc011010101111ddddrr000111mmmm") // v6 -INST(arm_SXTB16, "SXTB16", "cccc011010001111ddddrr000111mmmm") // v6 -INST(arm_SXTH, "SXTH", "cccc011010111111ddddrr000111mmmm") // v6 -INST(arm_SXTAB, "SXTAB", "cccc01101010nnnnddddrr000111mmmm") // v6 -INST(arm_SXTAB16, "SXTAB16", "cccc01101000nnnnddddrr000111mmmm") // v6 -INST(arm_SXTAH, "SXTAH", "cccc01101011nnnnddddrr000111mmmm") // v6 -INST(arm_UXTB, "UXTB", "cccc011011101111ddddrr000111mmmm") // v6 -INST(arm_UXTB16, "UXTB16", "cccc011011001111ddddrr000111mmmm") // v6 -INST(arm_UXTH, "UXTH", "cccc011011111111ddddrr000111mmmm") // v6 -INST(arm_UXTAB, "UXTAB", "cccc01101110nnnnddddrr000111mmmm") // v6 -INST(arm_UXTAB16, "UXTAB16", "cccc01101100nnnnddddrr000111mmmm") // v6 -INST(arm_UXTAH, "UXTAH", "cccc01101111nnnnddddrr000111mmmm") // v6 - -// Hint instructions -INST(arm_PLD_imm, "PLD (imm)", "11110101uz01nnnn1111iiiiiiiiiiii") // v5E for PLD; v7 for PLDW -INST(arm_PLD_reg, "PLD (reg)", "11110111uz01nnnn1111iiiiitt0mmmm") // v5E for PLD; v7 for PLDW -INST(arm_SEV, "SEV", "----0011001000001111000000000100") // v6K -INST(arm_SEVL, "SEVL", "----0011001000001111000000000101") // v8 -INST(arm_WFE, "WFE", "----0011001000001111000000000010") // v6K -INST(arm_WFI, "WFI", "----0011001000001111000000000011") // v6K -INST(arm_YIELD, "YIELD", "----0011001000001111000000000001") // v6K -INST(arm_NOP, "Reserved Hint", "----0011001000001111------------") -INST(arm_NOP, "Reserved Hint", "----001100100000111100000000----") - -// Synchronization Primitive instructions -INST(arm_CLREX, "CLREX", "11110101011111111111000000011111") // v6K -INST(arm_SWP, "SWP", "cccc00010000nnnntttt00001001uuuu") // v2S (v6: Deprecated) -INST(arm_SWPB, "SWPB", "cccc00010100nnnntttt00001001uuuu") // v2S (v6: Deprecated) -INST(arm_STL, "STL", "cccc00011000nnnn111111001001tttt") // v8 -INST(arm_STLEX, "STLEX", "cccc00011000nnnndddd11101001tttt") // v8 -INST(arm_STREX, "STREX", "cccc00011000nnnndddd11111001mmmm") // v6 -INST(arm_LDA, "LDA", "cccc00011001nnnndddd110010011111") // v8 -INST(arm_LDAEX, "LDAEX", "cccc00011001nnnndddd111010011111") // v8 -INST(arm_LDREX, "LDREX", "cccc00011001nnnndddd111110011111") // v6 -INST(arm_STLEXD, "STLEXD", "cccc00011010nnnndddd11101001mmmm") // v8 -INST(arm_STREXD, "STREXD", "cccc00011010nnnndddd11111001mmmm") // v6K -INST(arm_LDAEXD, "LDAEXD", "cccc00011011nnnndddd111010011111") // v8 -INST(arm_LDREXD, "LDREXD", "cccc00011011nnnndddd111110011111") // v6K -INST(arm_STLB, "STLB", "cccc00011100nnnn111111001001tttt") // v8 -INST(arm_STLEXB, "STLEXB", "cccc00011100nnnndddd11101001mmmm") // v8 -INST(arm_STREXB, "STREXB", "cccc00011100nnnndddd11111001mmmm") // v6K -INST(arm_LDAB, "LDAB", "cccc00011101nnnndddd110010011111") // v8 -INST(arm_LDAEXB, "LDAEXB", "cccc00011101nnnndddd111010011111") // v8 -INST(arm_LDREXB, "LDREXB", "cccc00011101nnnndddd111110011111") // v6K -INST(arm_STLH, "STLH", "cccc00011110nnnn111111001001mmmm") // v8 -INST(arm_STLEXH, "STLEXH", "cccc00011110nnnndddd11101001mmmm") // v8 -INST(arm_STREXH, "STREXH", "cccc00011110nnnndddd11111001mmmm") // v6K -INST(arm_LDAH, "LDAH", "cccc00011111nnnndddd110010011111") // v8 -INST(arm_LDAEXH, "LDAEXH", "cccc00011111nnnndddd111010011111") // v8 -INST(arm_LDREXH, "LDREXH", "cccc00011111nnnndddd111110011111") // v6K - -// Load/Store instructions -INST(arm_LDRBT, "LDRBT (A1)", "----0100-111--------------------") // v1 -INST(arm_LDRBT, "LDRBT (A2)", "----0110-111---------------0----") // v1 -INST(arm_LDRHT, "LDRHT (A1)", "----0000-111------------1011----") // v6T2 -INST(arm_LDRHT, "LDRHT (A1)", "----0000-1111111--------1011----") // v6T2 -INST(arm_LDRHT, "LDRHT (A2)", "----0000-011--------00001011----") // v6T2 -INST(arm_LDRSBT, "LDRSBT (A1)", "----0000-111------------1101----") // v6T2 -INST(arm_LDRSBT, "LDRSBT (A2)", "----0000-011--------00001101----") // v6T2 -INST(arm_LDRSHT, "LDRSHT (A1)", "----0000-111------------1111----") // v6T2 -INST(arm_LDRSHT, "LDRSHT (A2)", "----0000-011--------00001111----") // v6T2 -INST(arm_LDRT, "LDRT (A1)", "----0100-011--------------------") // v1 -INST(arm_LDRT, "LDRT (A2)", "----0110-011---------------0----") // v1 -INST(arm_STRBT, "STRBT (A1)", "----0100-110--------------------") // v1 -INST(arm_STRBT, "STRBT (A2)", "----0110-110---------------0----") // v1 -INST(arm_STRHT, "STRHT (A1)", "----0000-110------------1011----") // v6T2 -INST(arm_STRHT, "STRHT (A2)", "----0000-010--------00001011----") // v6T2 -INST(arm_STRT, "STRT (A1)", "----0100-010--------------------") // v1 -INST(arm_STRT, "STRT (A2)", "----0110-010---------------0----") // v1 -INST(arm_LDR_lit, "LDR (lit)", "cccc0101u0011111ttttvvvvvvvvvvvv") // v1 -INST(arm_LDR_imm, "LDR (imm)", "cccc010pu0w1nnnnttttvvvvvvvvvvvv") // v1 -INST(arm_LDR_reg, "LDR (reg)", "cccc011pu0w1nnnnttttvvvvvrr0mmmm") // v1 -INST(arm_LDRB_lit, "LDRB (lit)", "cccc0101u1011111ttttvvvvvvvvvvvv") // v1 -INST(arm_LDRB_imm, "LDRB (imm)", "cccc010pu1w1nnnnttttvvvvvvvvvvvv") // v1 -INST(arm_LDRB_reg, "LDRB (reg)", "cccc011pu1w1nnnnttttvvvvvrr0mmmm") // v1 -INST(arm_LDRD_lit, "LDRD (lit)", "cccc0001u1001111ttttvvvv1101vvvv") // v5E -INST(arm_LDRD_imm, "LDRD (imm)", "cccc000pu1w0nnnnttttvvvv1101vvvv") // v5E -INST(arm_LDRD_reg, "LDRD (reg)", "cccc000pu0w0nnnntttt00001101mmmm") // v5E -INST(arm_LDRH_lit, "LDRH (lit)", "cccc000pu1w11111ttttvvvv1011vvvv") // v4 -INST(arm_LDRH_imm, "LDRH (imm)", "cccc000pu1w1nnnnttttvvvv1011vvvv") // v4 -INST(arm_LDRH_reg, "LDRH (reg)", "cccc000pu0w1nnnntttt00001011mmmm") // v4 -INST(arm_LDRSB_lit, "LDRSB (lit)", "cccc0001u1011111ttttvvvv1101vvvv") // v4 -INST(arm_LDRSB_imm, "LDRSB (imm)", "cccc000pu1w1nnnnttttvvvv1101vvvv") // v4 -INST(arm_LDRSB_reg, "LDRSB (reg)", "cccc000pu0w1nnnntttt00001101mmmm") // v4 -INST(arm_LDRSH_lit, "LDRSH (lit)", "cccc0001u1011111ttttvvvv1111vvvv") // v4 -INST(arm_LDRSH_imm, "LDRSH (imm)", "cccc000pu1w1nnnnttttvvvv1111vvvv") // v4 -INST(arm_LDRSH_reg, "LDRSH (reg)", "cccc000pu0w1nnnntttt00001111mmmm") // v4 -INST(arm_STR_imm, "STR (imm)", "cccc010pu0w0nnnnttttvvvvvvvvvvvv") // v1 -INST(arm_STR_reg, "STR (reg)", "cccc011pu0w0nnnnttttvvvvvrr0mmmm") // v1 -INST(arm_STRB_imm, "STRB (imm)", "cccc010pu1w0nnnnttttvvvvvvvvvvvv") // v1 -INST(arm_STRB_reg, "STRB (reg)", "cccc011pu1w0nnnnttttvvvvvrr0mmmm") // v1 -INST(arm_STRD_imm, "STRD (imm)", "cccc000pu1w0nnnnttttvvvv1111vvvv") // v5E -INST(arm_STRD_reg, "STRD (reg)", "cccc000pu0w0nnnntttt00001111mmmm") // v5E -INST(arm_STRH_imm, "STRH (imm)", "cccc000pu1w0nnnnttttvvvv1011vvvv") // v4 -INST(arm_STRH_reg, "STRH (reg)", "cccc000pu0w0nnnntttt00001011mmmm") // v4 - -// Load/Store Multiple instructions -INST(arm_LDM, "LDM", "cccc100010w1nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_LDMDA, "LDMDA", "cccc100000w1nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_LDMDB, "LDMDB", "cccc100100w1nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_LDMIB, "LDMIB", "cccc100110w1nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_LDM_usr, "LDM (usr reg)", "----100--101--------------------") // v1 -INST(arm_LDM_eret, "LDM (exce ret)", "----100--1-1----1---------------") // v1 -INST(arm_STM, "STM", "cccc100010w0nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_STMDA, "STMDA", "cccc100000w0nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_STMDB, "STMDB", "cccc100100w0nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_STMIB, "STMIB", "cccc100110w0nnnnxxxxxxxxxxxxxxxx") // v1 -INST(arm_STM_usr, "STM (usr reg)", "----100--100--------------------") // v1 - -// Miscellaneous instructions -INST(arm_BFC, "BFC", "cccc0111110vvvvvddddvvvvv0011111") // v6T2 -INST(arm_BFI, "BFI", "cccc0111110vvvvvddddvvvvv001nnnn") // v6T2 -INST(arm_CLZ, "CLZ", "cccc000101101111dddd11110001mmmm") // v5 -INST(arm_MOVT, "MOVT", "cccc00110100vvvvddddvvvvvvvvvvvv") // v6T2 -INST(arm_MOVW, "MOVW", "cccc00110000vvvvddddvvvvvvvvvvvv") // v6T2 -INST(arm_NOP, "NOP", "----0011001000001111000000000000") // v6K -INST(arm_SBFX, "SBFX", "cccc0111101wwwwwddddvvvvv101nnnn") // v6T2 -INST(arm_SEL, "SEL", "cccc01101000nnnndddd11111011mmmm") // v6 -INST(arm_UBFX, "UBFX", "cccc0111111wwwwwddddvvvvv101nnnn") // v6T2 - -// Unsigned Sum of Absolute Differences instructions -INST(arm_USAD8, "USAD8", "cccc01111000dddd1111mmmm0001nnnn") // v6 -INST(arm_USADA8, "USADA8", "cccc01111000ddddaaaammmm0001nnnn") // v6 - -// Packing instructions -INST(arm_PKHBT, "PKHBT", "cccc01101000nnnnddddvvvvv001mmmm") // v6K -INST(arm_PKHTB, "PKHTB", "cccc01101000nnnnddddvvvvv101mmmm") // v6K - -// Reversal instructions -INST(arm_RBIT, "RBIT", "cccc011011111111dddd11110011mmmm") // v6T2 -INST(arm_REV, "REV", "cccc011010111111dddd11110011mmmm") // v6 -INST(arm_REV16, "REV16", "cccc011010111111dddd11111011mmmm") // v6 -INST(arm_REVSH, "REVSH", "cccc011011111111dddd11111011mmmm") // v6 - -// Saturation instructions -INST(arm_SSAT, "SSAT", "cccc0110101vvvvvddddvvvvvr01nnnn") // v6 -INST(arm_SSAT16, "SSAT16", "cccc01101010vvvvdddd11110011nnnn") // v6 -INST(arm_USAT, "USAT", "cccc0110111vvvvvddddvvvvvr01nnnn") // v6 -INST(arm_USAT16, "USAT16", "cccc01101110vvvvdddd11110011nnnn") // v6 - -// Divide instructions -INST(arm_SDIV, "SDIV", "cccc01110001dddd1111mmmm0001nnnn") // v7a -INST(arm_UDIV, "UDIV", "cccc01110011dddd1111mmmm0001nnnn") // v7a - -// Multiply (Normal) instructions -INST(arm_MLA, "MLA", "cccc0000001Sddddaaaammmm1001nnnn") // v2 -INST(arm_MLS, "MLS", "cccc00000110ddddaaaammmm1001nnnn") // v6T2 -INST(arm_MUL, "MUL", "cccc0000000Sdddd0000mmmm1001nnnn") // v2 - -// Multiply (Long) instructions -INST(arm_SMLAL, "SMLAL", "cccc0000111Sddddaaaammmm1001nnnn") // v3M -INST(arm_SMULL, "SMULL", "cccc0000110Sddddaaaammmm1001nnnn") // v3M -INST(arm_UMAAL, "UMAAL", "cccc00000100ddddaaaammmm1001nnnn") // v6 -INST(arm_UMLAL, "UMLAL", "cccc0000101Sddddaaaammmm1001nnnn") // v3M -INST(arm_UMULL, "UMULL", "cccc0000100Sddddaaaammmm1001nnnn") // v3M - -// Multiply (Halfword) instructions -INST(arm_SMLALxy, "SMLALXY", "cccc00010100ddddaaaammmm1xy0nnnn") // v5xP -INST(arm_SMLAxy, "SMLAXY", "cccc00010000ddddaaaammmm1xy0nnnn") // v5xP -INST(arm_SMULxy, "SMULXY", "cccc00010110dddd0000mmmm1xy0nnnn") // v5xP - -// Multiply (Word by Halfword) instructions -INST(arm_SMLAWy, "SMLAWY", "cccc00010010ddddaaaammmm1y00nnnn") // v5xP -INST(arm_SMULWy, "SMULWY", "cccc00010010dddd0000mmmm1y10nnnn") // v5xP - -// Multiply (Most Significant Word) instructions -INST(arm_SMMUL, "SMMUL", "cccc01110101dddd1111mmmm00R1nnnn") // v6 -INST(arm_SMMLA, "SMMLA", "cccc01110101ddddaaaammmm00R1nnnn") // v6 -INST(arm_SMMLS, "SMMLS", "cccc01110101ddddaaaammmm11R1nnnn") // v6 - -// Multiply (Dual) instructions -INST(arm_SMLAD, "SMLAD", "cccc01110000ddddaaaammmm00M1nnnn") // v6 -INST(arm_SMLALD, "SMLALD", "cccc01110100ddddaaaammmm00M1nnnn") // v6 -INST(arm_SMLSD, "SMLSD", "cccc01110000ddddaaaammmm01M1nnnn") // v6 -INST(arm_SMLSLD, "SMLSLD", "cccc01110100ddddaaaammmm01M1nnnn") // v6 -INST(arm_SMUAD, "SMUAD", "cccc01110000dddd1111mmmm00M1nnnn") // v6 -INST(arm_SMUSD, "SMUSD", "cccc01110000dddd1111mmmm01M1nnnn") // v6 - -// Parallel Add/Subtract (Modulo) instructions -INST(arm_SADD8, "SADD8", "cccc01100001nnnndddd11111001mmmm") // v6 -INST(arm_SADD16, "SADD16", "cccc01100001nnnndddd11110001mmmm") // v6 -INST(arm_SASX, "SASX", "cccc01100001nnnndddd11110011mmmm") // v6 -INST(arm_SSAX, "SSAX", "cccc01100001nnnndddd11110101mmmm") // v6 -INST(arm_SSUB8, "SSUB8", "cccc01100001nnnndddd11111111mmmm") // v6 -INST(arm_SSUB16, "SSUB16", "cccc01100001nnnndddd11110111mmmm") // v6 -INST(arm_UADD8, "UADD8", "cccc01100101nnnndddd11111001mmmm") // v6 -INST(arm_UADD16, "UADD16", "cccc01100101nnnndddd11110001mmmm") // v6 -INST(arm_UASX, "UASX", "cccc01100101nnnndddd11110011mmmm") // v6 -INST(arm_USAX, "USAX", "cccc01100101nnnndddd11110101mmmm") // v6 -INST(arm_USUB8, "USUB8", "cccc01100101nnnndddd11111111mmmm") // v6 -INST(arm_USUB16, "USUB16", "cccc01100101nnnndddd11110111mmmm") // v6 - -// Parallel Add/Subtract (Saturating) instructions -INST(arm_QADD8, "QADD8", "cccc01100010nnnndddd11111001mmmm") // v6 -INST(arm_QADD16, "QADD16", "cccc01100010nnnndddd11110001mmmm") // v6 -INST(arm_QASX, "QASX", "cccc01100010nnnndddd11110011mmmm") // v6 -INST(arm_QSAX, "QSAX", "cccc01100010nnnndddd11110101mmmm") // v6 -INST(arm_QSUB8, "QSUB8", "cccc01100010nnnndddd11111111mmmm") // v6 -INST(arm_QSUB16, "QSUB16", "cccc01100010nnnndddd11110111mmmm") // v6 -INST(arm_UQADD8, "UQADD8", "cccc01100110nnnndddd11111001mmmm") // v6 -INST(arm_UQADD16, "UQADD16", "cccc01100110nnnndddd11110001mmmm") // v6 -INST(arm_UQASX, "UQASX", "cccc01100110nnnndddd11110011mmmm") // v6 -INST(arm_UQSAX, "UQSAX", "cccc01100110nnnndddd11110101mmmm") // v6 -INST(arm_UQSUB8, "UQSUB8", "cccc01100110nnnndddd11111111mmmm") // v6 -INST(arm_UQSUB16, "UQSUB16", "cccc01100110nnnndddd11110111mmmm") // v6 - -// Parallel Add/Subtract (Halving) instructions -INST(arm_SHADD8, "SHADD8", "cccc01100011nnnndddd11111001mmmm") // v6 -INST(arm_SHADD16, "SHADD16", "cccc01100011nnnndddd11110001mmmm") // v6 -INST(arm_SHASX, "SHASX", "cccc01100011nnnndddd11110011mmmm") // v6 -INST(arm_SHSAX, "SHSAX", "cccc01100011nnnndddd11110101mmmm") // v6 -INST(arm_SHSUB8, "SHSUB8", "cccc01100011nnnndddd11111111mmmm") // v6 -INST(arm_SHSUB16, "SHSUB16", "cccc01100011nnnndddd11110111mmmm") // v6 -INST(arm_UHADD8, "UHADD8", "cccc01100111nnnndddd11111001mmmm") // v6 -INST(arm_UHADD16, "UHADD16", "cccc01100111nnnndddd11110001mmmm") // v6 -INST(arm_UHASX, "UHASX", "cccc01100111nnnndddd11110011mmmm") // v6 -INST(arm_UHSAX, "UHSAX", "cccc01100111nnnndddd11110101mmmm") // v6 -INST(arm_UHSUB8, "UHSUB8", "cccc01100111nnnndddd11111111mmmm") // v6 -INST(arm_UHSUB16, "UHSUB16", "cccc01100111nnnndddd11110111mmmm") // v6 - -// Saturated Add/Subtract instructions -INST(arm_QADD, "QADD", "cccc00010000nnnndddd00000101mmmm") // v5xP -INST(arm_QSUB, "QSUB", "cccc00010010nnnndddd00000101mmmm") // v5xP -INST(arm_QDADD, "QDADD", "cccc00010100nnnndddd00000101mmmm") // v5xP -INST(arm_QDSUB, "QDSUB", "cccc00010110nnnndddd00000101mmmm") // v5xP - -// Status Register Access instructions -INST(arm_CPS, "CPS", "111100010000---00000000---0-----") // v6 -INST(arm_SETEND, "SETEND", "1111000100000001000000e000000000") // v6 -INST(arm_MRS, "MRS", "cccc000100001111dddd000000000000") // v3 -INST(arm_MSR_imm, "MSR (imm)", "cccc00110010mmmm1111rrrrvvvvvvvv") // v3 -INST(arm_MSR_reg, "MSR (reg)", "cccc00010010mmmm111100000000nnnn") // v3 -INST(arm_RFE, "RFE", "1111100--0-1----0000101000000000") // v6 -INST(arm_SRS, "SRS", "1111100--1-0110100000101000-----") // v6 +INST(arm_CLREX, "CLREX", "11110101011111111111000000011111") +INST(arm_SETEND, "SETEND", "1111000100000001000000e000000000") +INST(arm_DMB, "DMB", "1111010101111111111100000101oooo") +INST(arm_DSB, "DSB", "1111010101111111111100000100oooo") +INST(arm_ISB, "ISB", "1111010101111111111100000110oooo") +INST(arm_SEV, "SEV", "----0011001000001111000000000100") +INST(arm_SEVL, "SEVL", "----0011001000001111000000000101") +INST(arm_WFE, "WFE", "----0011001000001111000000000010") +INST(arm_WFI, "WFI", "----0011001000001111000000000011") +INST(arm_YIELD, "YIELD", "----0011001000001111000000000001") +INST(arm_NOP, "NOP", "----0011001000001111000000000000") +INST(arm_RFE, "RFE", "1111100--0-1----0000101000000000") +INST(arm_BLX_reg, "BLX (reg)", "cccc000100101111111111110011mmmm") +INST(arm_BX, "BX", "cccc000100101111111111110001mmmm") +INST(arm_BXJ, "BXJ", "cccc000100101111111111110010mmmm") +INST(arm_NOP, "Reserved Hint", "----001100100000111100000000----") +INST(arm_MRS, "MRS", "cccc000100001111dddd000000000000") +INST(arm_SRS, "SRS", "1111100--1-0110100000101000-----") +INST(arm_CPS, "CPS", "111100010000---00000000---0-----") +INST(arm_STL, "STL", "cccc00011000nnnn111111001001tttt") +INST(arm_LDA, "LDA", "cccc00011001nnnndddd110010011111") +INST(arm_LDAEX, "LDAEX", "cccc00011001nnnndddd111010011111") +INST(arm_LDREX, "LDREX", "cccc00011001nnnndddd111110011111") +INST(arm_LDAEXD, "LDAEXD", "cccc00011011nnnndddd111010011111") +INST(arm_LDREXD, "LDREXD", "cccc00011011nnnndddd111110011111") +INST(arm_STLB, "STLB", "cccc00011100nnnn111111001001tttt") +INST(arm_LDAB, "LDAB", "cccc00011101nnnndddd110010011111") +INST(arm_LDAEXB, "LDAEXB", "cccc00011101nnnndddd111010011111") +INST(arm_LDREXB, "LDREXB", "cccc00011101nnnndddd111110011111") +INST(arm_STLH, "STLH", "cccc00011110nnnn111111001001mmmm") +INST(arm_LDAH, "LDAH", "cccc00011111nnnndddd110010011111") +INST(arm_LDAEXH, "LDAEXH", "cccc00011111nnnndddd111010011111") +INST(arm_LDREXH, "LDREXH", "cccc00011111nnnndddd111110011111") +INST(arm_CLZ, "CLZ", "cccc000101101111dddd11110001mmmm") +INST(arm_RBIT, "RBIT", "cccc011011111111dddd11110011mmmm") +INST(arm_REV, "REV", "cccc011010111111dddd11110011mmmm") +INST(arm_REV16, "REV16", "cccc011010111111dddd11111011mmmm") +INST(arm_REVSH, "REVSH", "cccc011011111111dddd11111011mmmm") +INST(arm_MSR_reg, "MSR (reg)", "cccc00010010mmmm111100000000nnnn") +INST(arm_SXTB, "SXTB", "cccc011010101111ddddrr000111mmmm") +INST(arm_SXTB16, "SXTB16", "cccc011010001111ddddrr000111mmmm") +INST(arm_SXTH, "SXTH", "cccc011010111111ddddrr000111mmmm") +INST(arm_UXTB, "UXTB", "cccc011011101111ddddrr000111mmmm") +INST(arm_UXTB16, "UXTB16", "cccc011011001111ddddrr000111mmmm") +INST(arm_UXTH, "UXTH", "cccc011011111111ddddrr000111mmmm") +INST(arm_UDF, "UDF", "111001111111------------1111----") +INST(arm_NOP, "Reserved Hint", "----0011001000001111------------") +INST(arm_SWP, "SWP", "cccc00010000nnnntttt00001001uuuu") +INST(arm_SWPB, "SWPB", "cccc00010100nnnntttt00001001uuuu") +INST(arm_STLEX, "STLEX", "cccc00011000nnnndddd11101001tttt") +INST(arm_STREX, "STREX", "cccc00011000nnnndddd11111001mmmm") +INST(arm_STLEXD, "STLEXD", "cccc00011010nnnndddd11101001mmmm") +INST(arm_STREXD, "STREXD", "cccc00011010nnnndddd11111001mmmm") +INST(arm_STLEXB, "STLEXB", "cccc00011100nnnndddd11101001mmmm") +INST(arm_STREXB, "STREXB", "cccc00011100nnnndddd11111001mmmm") +INST(arm_STLEXH, "STLEXH", "cccc00011110nnnndddd11101001mmmm") +INST(arm_STREXH, "STREXH", "cccc00011110nnnndddd11111001mmmm") +INST(arm_SEL, "SEL", "cccc01101000nnnndddd11111011mmmm") +INST(arm_USAD8, "USAD8", "cccc01111000dddd1111mmmm0001nnnn") +INST(arm_SSAT16, "SSAT16", "cccc01101010vvvvdddd11110011nnnn") +INST(arm_USAT16, "USAT16", "cccc01101110vvvvdddd11110011nnnn") +INST(arm_SDIV, "SDIV", "cccc01110001dddd1111mmmm0001nnnn") +INST(arm_UDIV, "UDIV", "cccc01110011dddd1111mmmm0001nnnn") +INST(arm_SADD8, "SADD8", "cccc01100001nnnndddd11111001mmmm") +INST(arm_SADD16, "SADD16", "cccc01100001nnnndddd11110001mmmm") +INST(arm_SASX, "SASX", "cccc01100001nnnndddd11110011mmmm") +INST(arm_SSAX, "SSAX", "cccc01100001nnnndddd11110101mmmm") +INST(arm_SSUB8, "SSUB8", "cccc01100001nnnndddd11111111mmmm") +INST(arm_SSUB16, "SSUB16", "cccc01100001nnnndddd11110111mmmm") +INST(arm_UADD8, "UADD8", "cccc01100101nnnndddd11111001mmmm") +INST(arm_UADD16, "UADD16", "cccc01100101nnnndddd11110001mmmm") +INST(arm_UASX, "UASX", "cccc01100101nnnndddd11110011mmmm") +INST(arm_USAX, "USAX", "cccc01100101nnnndddd11110101mmmm") +INST(arm_USUB8, "USUB8", "cccc01100101nnnndddd11111111mmmm") +INST(arm_USUB16, "USUB16", "cccc01100101nnnndddd11110111mmmm") +INST(arm_QADD8, "QADD8", "cccc01100010nnnndddd11111001mmmm") +INST(arm_QADD16, "QADD16", "cccc01100010nnnndddd11110001mmmm") +INST(arm_QASX, "QASX", "cccc01100010nnnndddd11110011mmmm") +INST(arm_QSAX, "QSAX", "cccc01100010nnnndddd11110101mmmm") +INST(arm_QSUB8, "QSUB8", "cccc01100010nnnndddd11111111mmmm") +INST(arm_QSUB16, "QSUB16", "cccc01100010nnnndddd11110111mmmm") +INST(arm_UQADD8, "UQADD8", "cccc01100110nnnndddd11111001mmmm") +INST(arm_UQADD16, "UQADD16", "cccc01100110nnnndddd11110001mmmm") +INST(arm_UQASX, "UQASX", "cccc01100110nnnndddd11110011mmmm") +INST(arm_UQSAX, "UQSAX", "cccc01100110nnnndddd11110101mmmm") +INST(arm_UQSUB8, "UQSUB8", "cccc01100110nnnndddd11111111mmmm") +INST(arm_UQSUB16, "UQSUB16", "cccc01100110nnnndddd11110111mmmm") +INST(arm_SHADD8, "SHADD8", "cccc01100011nnnndddd11111001mmmm") +INST(arm_SHADD16, "SHADD16", "cccc01100011nnnndddd11110001mmmm") +INST(arm_SHASX, "SHASX", "cccc01100011nnnndddd11110011mmmm") +INST(arm_SHSAX, "SHSAX", "cccc01100011nnnndddd11110101mmmm") +INST(arm_SHSUB8, "SHSUB8", "cccc01100011nnnndddd11111111mmmm") +INST(arm_SHSUB16, "SHSUB16", "cccc01100011nnnndddd11110111mmmm") +INST(arm_UHADD8, "UHADD8", "cccc01100111nnnndddd11111001mmmm") +INST(arm_UHADD16, "UHADD16", "cccc01100111nnnndddd11110001mmmm") +INST(arm_UHASX, "UHASX", "cccc01100111nnnndddd11110011mmmm") +INST(arm_UHSAX, "UHSAX", "cccc01100111nnnndddd11110101mmmm") +INST(arm_UHSUB8, "UHSUB8", "cccc01100111nnnndddd11111111mmmm") +INST(arm_UHSUB16, "UHSUB16", "cccc01100111nnnndddd11110111mmmm") +INST(arm_QADD, "QADD", "cccc00010000nnnndddd00000101mmmm") +INST(arm_QSUB, "QSUB", "cccc00010010nnnndddd00000101mmmm") +INST(arm_QDADD, "QDADD", "cccc00010100nnnndddd00000101mmmm") +INST(arm_QDSUB, "QDSUB", "cccc00010110nnnndddd00000101mmmm") +INST(arm_PLD_reg, "PLD (reg)", "11110111uz01nnnn1111iiiiitt0mmmm") +INST(arm_LDRHT, "LDRHT (A1)", "----0000-1111111--------1011----") +INST(arm_LDRHT, "LDRHT (A2)", "----0000-011--------00001011----") +INST(arm_LDRSBT, "LDRSBT (A2)", "----0000-011--------00001101----") +INST(arm_LDRSHT, "LDRSHT (A2)", "----0000-011--------00001111----") +INST(arm_STRHT, "STRHT (A2)", "----0000-010--------00001011----") +INST(arm_LDRD_lit, "LDRD (lit)", "cccc0001u1001111ttttvvvv1101vvvv") +INST(arm_LDRSB_lit, "LDRSB (lit)", "cccc0001u1011111ttttvvvv1101vvvv") +INST(arm_LDRSH_lit, "LDRSH (lit)", "cccc0001u1011111ttttvvvv1111vvvv") +INST(arm_MUL, "MUL", "cccc0000000Sdddd0000mmmm1001nnnn") +INST(arm_SMULWy, "SMULWY", "cccc00010010dddd0000mmmm1y10nnnn") +INST(arm_SMMUL, "SMMUL", "cccc01110101dddd1111mmmm00R1nnnn") +INST(arm_SMUAD, "SMUAD", "cccc01110000dddd1111mmmm00M1nnnn") +INST(arm_SMUSD, "SMUSD", "cccc01110000dddd1111mmmm01M1nnnn") +INST(arm_CRC32, "CRC32", "cccc00010zz0nnnndddd00000100mmmm") +INST(arm_CRC32C, "CRC32C", "cccc00010zz0nnnndddd00100100mmmm") +INST(arm_CMN_rsr, "CMN (rsr)", "cccc00010111nnnn0000ssss0rr1mmmm") +INST(arm_CMP_rsr, "CMP (rsr)", "cccc00010101nnnn0000ssss0rr1mmmm") +INST(arm_TEQ_rsr, "TEQ (rsr)", "cccc00010011nnnn0000ssss0rr1mmmm") +INST(arm_TST_rsr, "TST (rsr)", "cccc00010001nnnn0000ssss0rr1mmmm") +INST(arm_SXTAB, "SXTAB", "cccc01101010nnnnddddrr000111mmmm") +INST(arm_SXTAB16, "SXTAB16", "cccc01101000nnnnddddrr000111mmmm") +INST(arm_SXTAH, "SXTAH", "cccc01101011nnnnddddrr000111mmmm") +INST(arm_UXTAB, "UXTAB", "cccc01101110nnnnddddrr000111mmmm") +INST(arm_UXTAB16, "UXTAB16", "cccc01101100nnnnddddrr000111mmmm") +INST(arm_UXTAH, "UXTAH", "cccc01101111nnnnddddrr000111mmmm") +INST(arm_PLD_imm, "PLD (imm)", "11110101uz01nnnn1111iiiiiiiiiiii") +INST(arm_BFC, "BFC", "cccc0111110vvvvvddddvvvvv0011111") +INST(arm_SMULxy, "SMULXY", "cccc00010110dddd0000mmmm1xy0nnnn") +INST(arm_CMN_reg, "CMN (reg)", "cccc00010111nnnn0000vvvvvrr0mmmm") +INST(arm_CMP_reg, "CMP (reg)", "cccc00010101nnnn0000vvvvvrr0mmmm") +INST(arm_MOV_rsr, "MOV (rsr)", "cccc0001101S0000ddddssss0rr1mmmm") +INST(arm_MVN_rsr, "MVN (rsr)", "cccc0001111S0000ddddssss0rr1mmmm") +INST(arm_TEQ_reg, "TEQ (reg)", "cccc00010011nnnn0000vvvvvrr0mmmm") +INST(arm_TST_reg, "TST (reg)", "cccc00010001nnnn0000vvvvvrr0mmmm") +INST(arm_LDRD_reg, "LDRD (reg)", "cccc000pu0w0nnnntttt00001101mmmm") +INST(arm_LDRH_lit, "LDRH (lit)", "cccc000pu1w11111ttttvvvv1011vvvv") +INST(arm_LDRH_reg, "LDRH (reg)", "cccc000pu0w1nnnntttt00001011mmmm") +INST(arm_LDRSB_reg, "LDRSB (reg)", "cccc000pu0w1nnnntttt00001101mmmm") +INST(arm_LDRSH_reg, "LDRSH (reg)", "cccc000pu0w1nnnntttt00001111mmmm") +INST(arm_STRD_reg, "STRD (reg)", "cccc000pu0w0nnnntttt00001111mmmm") +INST(arm_STRH_reg, "STRH (reg)", "cccc000pu0w0nnnntttt00001011mmmm") +INST(arm_CMN_imm, "CMN (imm)", "cccc00110111nnnn0000rrrrvvvvvvvv") +INST(arm_CMP_imm, "CMP (imm)", "cccc00110101nnnn0000rrrrvvvvvvvv") +INST(arm_MOV_reg, "MOV (reg)", "cccc0001101S0000ddddvvvvvrr0mmmm") +INST(arm_MVN_reg, "MVN (reg)", "cccc0001111S0000ddddvvvvvrr0mmmm") +INST(arm_TEQ_imm, "TEQ (imm)", "cccc00110011nnnn0000rrrrvvvvvvvv") +INST(arm_TST_imm, "TST (imm)", "cccc00110001nnnn0000rrrrvvvvvvvv") +INST(arm_BKPT, "BKPT", "cccc00010010vvvvvvvvvvvv0111vvvv") +INST(arm_USADA8, "USADA8", "cccc01111000ddddaaaammmm0001nnnn") +INST(arm_MLS, "MLS", "cccc00000110ddddaaaammmm1001nnnn") +INST(arm_UMAAL, "UMAAL", "cccc00000100ddddaaaammmm1001nnnn") +INST(arm_MSR_imm, "MSR (imm)", "cccc00110010mmmm1111rrrrvvvvvvvv") +INST(arm_MOV_imm, "MOV (imm)", "cccc0011101S0000ddddrrrrvvvvvvvv") +INST(arm_MVN_imm, "MVN (imm)", "cccc0011111S0000ddddrrrrvvvvvvvv") +INST(arm_LDRHT, "LDRHT (A1)", "----0000-111------------1011----") +INST(arm_LDRSBT, "LDRSBT (A1)", "----0000-111------------1101----") +INST(arm_LDRSHT, "LDRSHT (A1)", "----0000-111------------1111----") +INST(arm_STRHT, "STRHT (A1)", "----0000-110------------1011----") +INST(arm_LDR_lit, "LDR (lit)", "cccc0101u0011111ttttvvvvvvvvvvvv") +INST(arm_LDRB_lit, "LDRB (lit)", "cccc0101u1011111ttttvvvvvvvvvvvv") +INST(arm_PKHBT, "PKHBT", "cccc01101000nnnnddddvvvvv001mmmm") +INST(arm_PKHTB, "PKHTB", "cccc01101000nnnnddddvvvvv101mmmm") +INST(arm_MLA, "MLA", "cccc0000001Sddddaaaammmm1001nnnn") +INST(arm_SMLAL, "SMLAL", "cccc0000111Sddddaaaammmm1001nnnn") +INST(arm_SMULL, "SMULL", "cccc0000110Sddddaaaammmm1001nnnn") +INST(arm_UMLAL, "UMLAL", "cccc0000101Sddddaaaammmm1001nnnn") +INST(arm_UMULL, "UMULL", "cccc0000100Sddddaaaammmm1001nnnn") +INST(arm_SMLAWy, "SMLAWY", "cccc00010010ddddaaaammmm1y00nnnn") +INST(arm_SMMLA, "SMMLA", "cccc01110101ddddaaaammmm00R1nnnn") +INST(arm_SMMLS, "SMMLS", "cccc01110101ddddaaaammmm11R1nnnn") +INST(arm_SMLAD, "SMLAD", "cccc01110000ddddaaaammmm00M1nnnn") +INST(arm_SMLALD, "SMLALD", "cccc01110100ddddaaaammmm00M1nnnn") +INST(arm_SMLSD, "SMLSD", "cccc01110000ddddaaaammmm01M1nnnn") +INST(arm_SMLSLD, "SMLSLD", "cccc01110100ddddaaaammmm01M1nnnn") +INST(arm_BFI, "BFI", "cccc0111110vvvvvddddvvvvv001nnnn") +INST(arm_SBFX, "SBFX", "cccc0111101wwwwwddddvvvvv101nnnn") +INST(arm_UBFX, "UBFX", "cccc0111111wwwwwddddvvvvv101nnnn") +INST(arm_SMLALxy, "SMLALXY", "cccc00010100ddddaaaammmm1xy0nnnn") +INST(arm_SMLAxy, "SMLAXY", "cccc00010000ddddaaaammmm1xy0nnnn") +INST(arm_ADC_rsr, "ADC (rsr)", "cccc0000101Snnnnddddssss0rr1mmmm") +INST(arm_ADD_rsr, "ADD (rsr)", "cccc0000100Snnnnddddssss0rr1mmmm") +INST(arm_AND_rsr, "AND (rsr)", "cccc0000000Snnnnddddssss0rr1mmmm") +INST(arm_BIC_rsr, "BIC (rsr)", "cccc0001110Snnnnddddssss0rr1mmmm") +INST(arm_EOR_rsr, "EOR (rsr)", "cccc0000001Snnnnddddssss0rr1mmmm") +INST(arm_ORR_rsr, "ORR (rsr)", "cccc0001100Snnnnddddssss0rr1mmmm") +INST(arm_RSB_rsr, "RSB (rsr)", "cccc0000011Snnnnddddssss0rr1mmmm") +INST(arm_RSC_rsr, "RSC (rsr)", "cccc0000111Snnnnddddssss0rr1mmmm") +INST(arm_SBC_rsr, "SBC (rsr)", "cccc0000110Snnnnddddssss0rr1mmmm") +INST(arm_SUB_rsr, "SUB (rsr)", "cccc0000010Snnnnddddssss0rr1mmmm") +INST(arm_LDRD_imm, "LDRD (imm)", "cccc000pu1w0nnnnttttvvvv1101vvvv") +INST(arm_LDRH_imm, "LDRH (imm)", "cccc000pu1w1nnnnttttvvvv1011vvvv") +INST(arm_LDRSB_imm, "LDRSB (imm)", "cccc000pu1w1nnnnttttvvvv1101vvvv") +INST(arm_LDRSH_imm, "LDRSH (imm)", "cccc000pu1w1nnnnttttvvvv1111vvvv") +INST(arm_STRD_imm, "STRD (imm)", "cccc000pu1w0nnnnttttvvvv1111vvvv") +INST(arm_STRH_imm, "STRH (imm)", "cccc000pu1w0nnnnttttvvvv1011vvvv") +INST(arm_SSAT, "SSAT", "cccc0110101vvvvvddddvvvvvr01nnnn") +INST(arm_USAT, "USAT", "cccc0110111vvvvvddddvvvvvr01nnnn") +INST(arm_MCRR, "MCRR", "cccc11000100uuuuttttppppooooMMMM") +INST(arm_MRRC, "MRRC", "cccc11000101uuuuttttppppooooMMMM") +INST(arm_ADC_reg, "ADC (reg)", "cccc0000101Snnnnddddvvvvvrr0mmmm") +INST(arm_ADD_reg, "ADD (reg)", "cccc0000100Snnnnddddvvvvvrr0mmmm") +INST(arm_AND_reg, "AND (reg)", "cccc0000000Snnnnddddvvvvvrr0mmmm") +INST(arm_BIC_reg, "BIC (reg)", "cccc0001110Snnnnddddvvvvvrr0mmmm") +INST(arm_EOR_reg, "EOR (reg)", "cccc0000001Snnnnddddvvvvvrr0mmmm") +INST(arm_ORR_reg, "ORR (reg)", "cccc0001100Snnnnddddvvvvvrr0mmmm") +INST(arm_RSB_reg, "RSB (reg)", "cccc0000011Snnnnddddvvvvvrr0mmmm") +INST(arm_RSC_reg, "RSC (reg)", "cccc0000111Snnnnddddvvvvvrr0mmmm") +INST(arm_SBC_reg, "SBC (reg)", "cccc0000110Snnnnddddvvvvvrr0mmmm") +INST(arm_SUB_reg, "SUB (reg)", "cccc0000010Snnnnddddvvvvvrr0mmmm") +INST(arm_LDRBT, "LDRBT (A2)", "----0110-111---------------0----") +INST(arm_LDRT, "LDRT (A2)", "----0110-011---------------0----") +INST(arm_STRBT, "STRBT (A2)", "----0110-110---------------0----") +INST(arm_STRT, "STRT (A2)", "----0110-010---------------0----") +INST(arm_MOVT, "MOVT", "cccc00110100vvvvddddvvvvvvvvvvvv") +INST(arm_MOVW, "MOVW", "cccc00110000vvvvddddvvvvvvvvvvvv") +INST(arm_BLX_imm, "BLX (imm)", "1111101hvvvvvvvvvvvvvvvvvvvvvvvv") +INST(arm_ADC_imm, "ADC (imm)", "cccc0010101Snnnnddddrrrrvvvvvvvv") +INST(arm_ADD_imm, "ADD (imm)", "cccc0010100Snnnnddddrrrrvvvvvvvv") +INST(arm_AND_imm, "AND (imm)", "cccc0010000Snnnnddddrrrrvvvvvvvv") +INST(arm_BIC_imm, "BIC (imm)", "cccc0011110Snnnnddddrrrrvvvvvvvv") +INST(arm_EOR_imm, "EOR (imm)", "cccc0010001Snnnnddddrrrrvvvvvvvv") +INST(arm_ORR_imm, "ORR (imm)", "cccc0011100Snnnnddddrrrrvvvvvvvv") +INST(arm_RSB_imm, "RSB (imm)", "cccc0010011Snnnnddddrrrrvvvvvvvv") +INST(arm_RSC_imm, "RSC (imm)", "cccc0010111Snnnnddddrrrrvvvvvvvv") +INST(arm_SBC_imm, "SBC (imm)", "cccc0010110Snnnnddddrrrrvvvvvvvv") +INST(arm_SUB_imm, "SUB (imm)", "cccc0010010Snnnnddddrrrrvvvvvvvv") +INST(arm_LDRBT, "LDRBT (A1)", "----0100-111--------------------") +INST(arm_LDRT, "LDRT (A1)", "----0100-011--------------------") +INST(arm_STRBT, "STRBT (A1)", "----0100-110--------------------") +INST(arm_STRT, "STRT (A1)", "----0100-010--------------------") +INST(arm_LDM, "LDM", "cccc100010w1nnnnxxxxxxxxxxxxxxxx") +INST(arm_LDMDA, "LDMDA", "cccc100000w1nnnnxxxxxxxxxxxxxxxx") +INST(arm_LDMDB, "LDMDB", "cccc100100w1nnnnxxxxxxxxxxxxxxxx") +INST(arm_LDMIB, "LDMIB", "cccc100110w1nnnnxxxxxxxxxxxxxxxx") +INST(arm_STM, "STM", "cccc100010w0nnnnxxxxxxxxxxxxxxxx") +INST(arm_STMDA, "STMDA", "cccc100000w0nnnnxxxxxxxxxxxxxxxx") +INST(arm_STMDB, "STMDB", "cccc100100w0nnnnxxxxxxxxxxxxxxxx") +INST(arm_STMIB, "STMIB", "cccc100110w0nnnnxxxxxxxxxxxxxxxx") +INST(arm_MCR, "MCR", "cccc1110ooo0NNNNttttppppooo1MMMM") +INST(arm_MRC, "MRC", "cccc1110ooo1NNNNttttppppooo1MMMM") +INST(arm_LDR_reg, "LDR (reg)", "cccc011pu0w1nnnnttttvvvvvrr0mmmm") +INST(arm_LDRB_reg, "LDRB (reg)", "cccc011pu1w1nnnnttttvvvvvrr0mmmm") +INST(arm_STR_reg, "STR (reg)", "cccc011pu0w0nnnnttttvvvvvrr0mmmm") +INST(arm_STRB_reg, "STRB (reg)", "cccc011pu1w0nnnnttttvvvvvrr0mmmm") +INST(arm_LDM_usr, "LDM (usr reg)", "----100--101--------------------") +INST(arm_LDM_eret, "LDM (exce ret)", "----100--1-1----1---------------") +INST(arm_STM_usr, "STM (usr reg)", "----100--100--------------------") +INST(arm_CDP, "CDP", "cccc1110ooooNNNNDDDDppppooo0MMMM") +INST(arm_LDR_imm, "LDR (imm)", "cccc010pu0w1nnnnttttvvvvvvvvvvvv") +INST(arm_LDRB_imm, "LDRB (imm)", "cccc010pu1w1nnnnttttvvvvvvvvvvvv") +INST(arm_STR_imm, "STR (imm)", "cccc010pu0w0nnnnttttvvvvvvvvvvvv") +INST(arm_STRB_imm, "STRB (imm)", "cccc010pu1w0nnnnttttvvvvvvvvvvvv") +INST(arm_B, "B", "cccc1010vvvvvvvvvvvvvvvvvvvvvvvv") +INST(arm_BL, "BL", "cccc1011vvvvvvvvvvvvvvvvvvvvvvvv") +INST(arm_LDC, "LDC", "cccc110pudw1nnnnDDDDppppvvvvvvvv") +INST(arm_STC, "STC", "cccc110pudw0nnnnDDDDppppvvvvvvvv") +INST(arm_SVC, "SVC", "cccc1111vvvvvvvvvvvvvvvvvvvvvvvv") \ No newline at end of file diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h index a16caedd87..2861b998ca 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.h @@ -27,50 +27,12 @@ template using ASIMDMatcher = Decoder::Matcher; template -std::vector> GetASIMDDecodeTable() noexcept { - std::vector>> table = { -#define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(ASIMDMatcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, +static std::optional>> DecodeASIMD(u32 instruction) noexcept { + alignas(64) static const auto table = std::array{ +#define INST(fn, name, bitstring) DYNARMIC_DECODER_GET_MATCHER(ASIMDMatcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)), #include "./asimd.inc" #undef INST }; - // Exceptions to the rule of thumb. - const std::set comes_first{ - "VBIC, VMOV, VMVN, VORR (immediate)", - "VEXT", - "VTBL", - "VTBX", - "VDUP (scalar)", - }; - const std::set comes_last{ - "VMLA (scalar)", - "VMLAL (scalar)", - "VQDMLAL/VQDMLSL (scalar)", - "VMUL (scalar)", - "VMULL (scalar)", - "VQDMULL (scalar)", - "VQDMULH (scalar)", - "VQRDMULH (scalar)", - }; - const auto sort_begin = std::stable_partition(table.begin(), table.end(), [&](const auto& e) { - return comes_first.count(e.first) > 0; - }); - const auto sort_end = std::stable_partition(table.begin(), table.end(), [&](const auto& e) { - return comes_last.count(e.first) == 0; - }); - // If a matcher has more bits in its mask it is more specific, so it should come first. - std::stable_sort(sort_begin, sort_end, [](const auto& a, const auto& b) { - return mcl::bit::count_ones(a.second.GetMask()) > mcl::bit::count_ones(b.second.GetMask()); - }); - std::vector> final_table; - std::transform(table.cbegin(), table.cend(), std::back_inserter(final_table), [](auto const& e) { - return e.second; - }); - return final_table; -} - -template -std::optional>> DecodeASIMD(u32 instruction) noexcept { - alignas(64) static const auto table = GetASIMDDecodeTable(); auto iter = std::find_if(table.begin(), table.end(), [instruction](const auto& matcher) { return matcher.Matches(instruction); }); @@ -78,7 +40,7 @@ std::optional>> DecodeASIMD(u32 ins } template -std::optional GetNameASIMD(u32 inst) noexcept { +static std::optional GetNameASIMD(u32 inst) noexcept { std::vector>> list = { #define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(ASIMDMatcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, #include "./asimd.inc" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.inc b/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.inc index d0dfd86752..def1a17866 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.inc +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/asimd.inc @@ -1,172 +1,151 @@ -// Three registers of the same length -INST(asimd_VHADD, "VHADD", "1111001U0Dzznnnndddd0000NQM0mmmm") // ASIMD -INST(asimd_VQADD, "VQADD", "1111001U0Dzznnnndddd0000NQM1mmmm") // ASIMD -INST(asimd_VRHADD, "VRHADD", "1111001U0Dzznnnndddd0001NQM0mmmm") // ASIMD -INST(asimd_VAND_reg, "VAND (register)", "111100100D00nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VBIC_reg, "VBIC (register)", "111100100D01nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VORR_reg, "VORR (register)", "111100100D10nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VORN_reg, "VORN (register)", "111100100D11nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VEOR_reg, "VEOR (register)", "111100110D00nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VBSL, "VBSL", "111100110D01nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VBIT, "VBIT", "111100110D10nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VBIF, "VBIF", "111100110D11nnnndddd0001NQM1mmmm") // ASIMD -INST(asimd_VHSUB, "VHSUB", "1111001U0Dzznnnndddd0010NQM0mmmm") // ASIMD -INST(asimd_VQSUB, "VQSUB", "1111001U0Dzznnnndddd0010NQM1mmmm") // ASIMD -INST(asimd_VCGT_reg, "VCGT (register)", "1111001U0Dzznnnndddd0011NQM0mmmm") // ASIMD -INST(asimd_VCGE_reg, "VCGE (register)", "1111001U0Dzznnnndddd0011NQM1mmmm") // ASIMD -INST(asimd_VSHL_reg, "VSHL (register)", "1111001U0Dzznnnndddd0100NQM0mmmm") // ASIMD -INST(asimd_VQSHL_reg, "VQSHL (register)", "1111001U0Dzznnnndddd0100NQM1mmmm") // ASIMD -INST(asimd_VRSHL, "VRSHL", "1111001U0Dzznnnndddd0101NQM0mmmm") // ASIMD -//INST(asimd_VQRSHL, "VQRSHL", "1111001U0-CC--------0101---1----") // ASIMD -INST(asimd_VMAX, "VMAX/VMIN (integer)", "1111001U0Dzznnnnmmmm0110NQMommmm") // ASIMD -INST(asimd_VABD, "VABD", "1111001U0Dzznnnndddd0111NQM0mmmm") // ASIMD -INST(asimd_VABA, "VABA", "1111001U0Dzznnnndddd0111NQM1mmmm") // ASIMD -INST(asimd_VADD_int, "VADD (integer)", "111100100Dzznnnndddd1000NQM0mmmm") // ASIMD -INST(asimd_VSUB_int, "VSUB (integer)", "111100110Dzznnnndddd1000NQM0mmmm") // ASIMD -INST(asimd_VTST, "VTST", "111100100Dzznnnndddd1000NQM1mmmm") // ASIMD -INST(asimd_VCEQ_reg, "VCEG (register)", "111100110Dzznnnndddd1000NQM1mmmm") // ASIMD -INST(asimd_VMLA, "VMLA/VMLS", "1111001o0Dzznnnndddd1001NQM0mmmm") // ASIMD -INST(asimd_VMUL, "VMUL", "1111001P0Dzznnnndddd1001NQM1mmmm") // ASIMD -INST(asimd_VPMAX_int, "VPMAX/VPMIN (integer)", "1111001U0Dzznnnndddd1010NQMommmm") // ASIMD -INST(v8_VMAXNM, "VMAXNM", "111100110D0znnnndddd1111NQM1mmmm") // v8 -INST(v8_VMINNM, "VMINNM", "111100110D1znnnndddd1111NQM1mmmm") // v8 -INST(asimd_VQDMULH, "VQDMULH", "111100100Dzznnnndddd1011NQM0mmmm") // ASIMD -INST(asimd_VQRDMULH, "VQRDMULH", "111100110Dzznnnndddd1011NQM0mmmm") // ASIMD -INST(asimd_VPADD, "VPADD", "111100100Dzznnnndddd1011NQM1mmmm") // ASIMD -INST(asimd_VFMA, "VFMA", "111100100D0znnnndddd1100NQM1mmmm") // ASIMD -INST(asimd_VFMS, "VFMS", "111100100D1znnnndddd1100NQM1mmmm") // ASIMD -INST(asimd_VADD_float, "VADD (floating-point)", "111100100D0znnnndddd1101NQM0mmmm") // ASIMD -INST(asimd_VSUB_float, "VSUB (floating-point)", "111100100D1znnnndddd1101NQM0mmmm") // ASIMD -INST(asimd_VPADD_float, "VPADD (floating-point)", "111100110D0znnnndddd1101NQM0mmmm") // ASIMD -INST(asimd_VABD_float, "VABD (floating-point)", "111100110D1znnnndddd1101NQM0mmmm") // ASIMD -INST(asimd_VMLA_float, "VMLA (floating-point)", "111100100D0znnnndddd1101NQM1mmmm") // ASIMD -INST(asimd_VMLS_float, "VMLS (floating-point)", "111100100D1znnnndddd1101NQM1mmmm") // ASIMD -INST(asimd_VMUL_float, "VMUL (floating-point)", "111100110D0znnnndddd1101NQM1mmmm") // ASIMD -INST(asimd_VCEQ_reg_float, "VCEQ (register)", "111100100D0znnnndddd1110NQM0mmmm") // ASIMD -INST(asimd_VCGE_reg_float, "VCGE (register)", "111100110D0znnnndddd1110NQM0mmmm") // ASIMD -INST(asimd_VCGT_reg_float, "VCGT (register)", "111100110D1znnnndddd1110NQM0mmmm") // ASIMD -INST(asimd_VACGE, "VACGE", "111100110Doznnnndddd1110NQM1mmmm") // ASIMD -INST(asimd_VMAX_float, "VMAX (floating-point)", "111100100D0znnnndddd1111NQM0mmmm") // ASIMD -INST(asimd_VMIN_float, "VMIN (floating-point)", "111100100D1znnnndddd1111NQM0mmmm") // ASIMD -INST(asimd_VPMAX_float, "VPMAX (floating-point)", "111100110D0znnnndddd1111NQM0mmmm") // ASIMD -INST(asimd_VPMIN_float, "VPMIN (floating-point)", "111100110D1znnnndddd1111NQM0mmmm") // ASIMD -INST(asimd_VRECPS, "VRECPS", "111100100D0znnnndddd1111NQM1mmmm") // ASIMD -INST(asimd_VRSQRTS, "VRSQRTS", "111100100D1znnnndddd1111NQM1mmmm") // ASIMD -INST(v8_SHA256H, "SHA256H", "111100110D00nnnndddd1100NQM0mmmm") // v8 -INST(v8_SHA256H2, "SHA256H2", "111100110D01nnnndddd1100NQM0mmmm") // v8 -INST(v8_SHA256SU1, "SHA256SU1", "111100110D10nnnndddd1100NQM0mmmm") // v8 +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later +// DO NOT REORDER -// Three registers of different lengths -INST(asimd_VADDL, "VADDL/VADDW", "1111001U1Dzznnnndddd000oN0M0mmmm") // ASIMD -INST(asimd_VSUBL, "VSUBL/VSUBW", "1111001U1Dzznnnndddd001oN0M0mmmm") // ASIMD -//INST(asimd_VADDHN, "VADDHN", "111100101-----------0100-0-0----") // ASIMD -//INST(asimd_VRADDHN, "VRADDHN", "111100111-----------0100-0-0----") // ASIMD -INST(asimd_VABAL, "VABAL", "1111001U1Dzznnnndddd0101N0M0mmmm") // ASIMD -//INST(asimd_VSUBHN, "VSUBHN", "111100101-----------0110-0-0----") // ASIMD -//INST(asimd_VRSUBHN, "VRSUBHN", "111100111-----------0110-0-0----") // ASIMD -INST(asimd_VABDL, "VABDL", "1111001U1Dzznnnndddd0111N0M0mmmm") // ASIMD -INST(asimd_VMLAL, "VMLAL/VMLSL", "1111001U1Dzznnnndddd10o0N0M0mmmm") // ASIMD -//INST(asimd_VQDMLAL, "VQDMLAL", "111100101-----------10-1-0-0----") // ASIMD -INST(asimd_VMULL, "VMULL", "1111001U1Dzznnnndddd11P0N0M0mmmm") // ASIMD -//INST(asimd_VQDMULL, "VQDMULL", "111100101-----------1101-0-0----") // ASIMD - -// Two registers and a scalar -INST(asimd_VMLA_scalar, "VMLA (scalar)", "1111001Q1Dzznnnndddd0o0FN1M0mmmm") // ASIMD -INST(asimd_VMLAL_scalar, "VMLAL (scalar)", "1111001U1dzznnnndddd0o10N1M0mmmm") // ASIMD -//INST(asimd_VQDMLAL_scalar, "VQDMLAL/VQDMLSL (scalar)", "111100101-BB--------0x11-1-0----") // ASIMD -INST(asimd_VMUL_scalar, "VMUL (scalar)", "1111001Q1Dzznnnndddd100FN1M0mmmm") // ASIMD -INST(asimd_VMULL_scalar, "VMULL (scalar)", "1111001U1Dzznnnndddd1010N1M0mmmm") // ASIMD -INST(asimd_VQDMULL_scalar, "VQDMULL (scalar)", "111100101Dzznnnndddd1011N1M0mmmm") // ASIMD -INST(asimd_VQDMULH_scalar, "VQDMULH (scalar)", "1111001Q1Dzznnnndddd1100N1M0mmmm") // ASIMD -INST(asimd_VQRDMULH_scalar, "VQRDMULH (scalar)", "1111001Q1Dzznnnndddd1101N1M0mmmm") // ASIMD - -// Two registers and a shift amount -INST(asimd_SHR, "SHR", "1111001U1Diiiiiidddd0000LQM1mmmm") // ASIMD -INST(asimd_SRA, "SRA", "1111001U1Diiiiiidddd0001LQM1mmmm") // ASIMD -INST(asimd_VRSHR, "VRSHR", "1111001U1Diiiiiidddd0010LQM1mmmm") // ASIMD -INST(asimd_VRSRA, "VRSRA", "1111001U1Diiiiiidddd0011LQM1mmmm") // ASIMD -INST(asimd_VSRI, "VSRI", "111100111Diiiiiidddd0100LQM1mmmm") // ASIMD -INST(asimd_VSHL, "VSHL", "111100101Diiiiiidddd0101LQM1mmmm") // ASIMD -INST(asimd_VSLI, "VSLI", "111100111Diiiiiidddd0101LQM1mmmm") // ASIMD -INST(asimd_VQSHL, "VQSHL" , "1111001U1Diiiiiidddd011oLQM1mmmm") // ASIMD -INST(asimd_VSHRN, "VSHRN", "111100101Diiiiiidddd100000M1mmmm") // ASIMD -INST(asimd_VRSHRN, "VRSHRN", "111100101Diiiiiidddd100001M1mmmm") // ASIMD -INST(asimd_VQSHRUN, "VQSHRUN", "111100111Diiiiiidddd100000M1mmmm") // ASIMD -INST(asimd_VQRSHRUN, "VQRSHRUN", "111100111Diiiiiidddd100001M1mmmm") // ASIMD -INST(asimd_VQSHRN, "VQSHRN", "1111001U1Diiiiiidddd100100M1mmmm") // ASIMD -INST(asimd_VQRSHRN, "VQRSHRN", "1111001U1Diiiiiidddd100101M1mmmm") // ASIMD -INST(asimd_VSHLL, "VSHLL", "1111001U1Diiiiiidddd101000M1mmmm") // ASIMD -INST(asimd_VCVT_fixed, "VCVT (fixed-point)", "1111001U1Diiiiiidddd111o0QM1mmmm") // ASIMD - -// Two registers, miscellaneous -INST(asimd_VREV, "VREV{16,32,64}", "111100111D11zz00dddd000ooQM0mmmm") // ASIMD -INST(asimd_VPADDL, "VPADDL", "111100111D11zz00dddd0010oQM0mmmm") // ASIMD -INST(asimd_VCLS, "VCLS", "111100111D11zz00dddd01000QM0mmmm") // ASIMD -INST(asimd_VCLZ, "VCLZ", "111100111D11zz00dddd01001QM0mmmm") // ASIMD -INST(asimd_VCNT, "VCNT", "111100111D11zz00dddd01010QM0mmmm") // ASIMD -INST(asimd_VMVN_reg, "VMVN_reg", "111100111D11zz00dddd01011QM0mmmm") // ASIMD -INST(asimd_VPADAL, "VPADAL", "111100111D11zz00dddd0110oQM0mmmm") // ASIMD -INST(asimd_VQABS, "VQABS", "111100111D11zz00dddd01110QM0mmmm") // ASIMD -INST(asimd_VQNEG, "VQNEG", "111100111D11zz00dddd01111QM0mmmm") // ASIMD -INST(asimd_VCGT_zero, "VCGT (zero)", "111100111D11zz01dddd0F000QM0mmmm") // ASIMD -INST(asimd_VCGE_zero, "VCGE (zero)", "111100111D11zz01dddd0F001QM0mmmm") // ASIMD -INST(asimd_VCEQ_zero, "VCEQ (zero)", "111100111D11zz01dddd0F010QM0mmmm") // ASIMD -INST(asimd_VCLE_zero, "VCLE (zero)", "111100111D11zz01dddd0F011QM0mmmm") // ASIMD -INST(asimd_VCLT_zero, "VCLT (zero)", "111100111D11zz01dddd0F100QM0mmmm") // ASIMD -INST(arm_UDF, "UNALLOCATED", "111100111-11--01----01101--0----") // v8 -INST(asimd_VABS, "VABS", "111100111D11zz01dddd0F110QM0mmmm") // ASIMD -INST(asimd_VNEG, "VNEG", "111100111D11zz01dddd0F111QM0mmmm") // ASIMD -INST(asimd_VSWP, "VSWP", "111100111D110010dddd00000QM0mmmm") // ASIMD -INST(arm_UDF, "UNALLOCATED", "111100111-11--10----00000--0----") // ASIMD -INST(asimd_VTRN, "VTRN", "111100111D11zz10dddd00001QM0mmmm") // ASIMD -INST(asimd_VUZP, "VUZP", "111100111D11zz10dddd00010QM0mmmm") // ASIMD -INST(asimd_VZIP, "VZIP", "111100111D11zz10dddd00011QM0mmmm") // ASIMD -INST(asimd_VMOVN, "VMOVN", "111100111D11zz10dddd001000M0mmmm") // ASIMD -INST(asimd_VQMOVUN, "VQMOVUN", "111100111D11zz10dddd001001M0mmmm") // ASIMD -INST(asimd_VQMOVN, "VQMOVN", "111100111D11zz10dddd00101oM0mmmm") // ASIMD -INST(asimd_VSHLL_max, "VSHLL_max", "111100111D11zz10dddd001100M0mmmm") // ASIMD -INST(v8_VRINTN, "VRINTN", "111100111D11zz10dddd01000QM0mmmm") // v8 -INST(v8_VRINTX, "VRINTX", "111100111D11zz10dddd01001QM0mmmm") // v8 -INST(v8_VRINTA, "VRINTA", "111100111D11zz10dddd01010QM0mmmm") // v8 -INST(v8_VRINTZ, "VRINTZ", "111100111D11zz10dddd01011QM0mmmm") // v8 -INST(v8_VRINTM, "VRINTM", "111100111D11zz10dddd01101QM0mmmm") // v8 -INST(v8_VRINTP, "VRINTP", "111100111D11zz10dddd01111QM0mmmm") // v8 -INST(asimd_VCVT_half, "VCVT (half-precision)", "111100111D11zz10dddd011o00M0mmmm") // ASIMD -INST(arm_UDF, "UNALLOCATED", "111100111-11--10----011-01-0----") // ASIMD -INST(v8_VCVTA, "VCVTA", "111100111D11zz11dddd0000oQM0mmmm") // v8 -INST(v8_VCVTN, "VCVTN", "111100111D11zz11dddd0001oQM0mmmm") // v8 -INST(v8_VCVTP, "VCVTP", "111100111D11zz11dddd0010oQM0mmmm") // v8 -INST(v8_VCVTM, "VCVTM", "111100111D11zz11dddd0011oQM0mmmm") // v8 -INST(asimd_VRECPE, "VRECPE", "111100111D11zz11dddd010F0QM0mmmm") // ASIMD -INST(asimd_VRSQRTE, "VRSQRTE", "111100111D11zz11dddd010F1QM0mmmm") // ASIMD -INST(asimd_VCVT_integer, "VCVT (integer)", "111100111D11zz11dddd011oUQM0mmmm") // ASIMD - -// Two registers, cryptography -INST(v8_AESE, "AESE", "111100111D11zz00dddd001100M0mmmm") // v8 -INST(v8_AESD, "AESD", "111100111D11zz00dddd001101M0mmmm") // v8 -INST(v8_AESMC, "AESMC", "111100111D11zz00dddd001110M0mmmm") // v8 -INST(v8_AESIMC, "AESIMC", "111100111D11zz00dddd001111M0mmmm") // v8 -INST(arm_UDF, "UNALLOCATED", "111100111-11--01----001010-0----") // v8 -INST(arm_UDF, "UNALLOCATED (SHA1H)", "111100111-11--01----001011-0----") // v8 -INST(arm_UDF, "UNALLOCATED (SHA1SU1)", "111100111-11--10----001110-0----") // v8 -INST(v8_SHA256SU0, "SHA256SU0", "111100111D11zz10dddd001111M0mmmm") // v8 - -// One register and modified immediate -INST(asimd_VMOV_imm, "VBIC, VMOV, VMVN, VORR (immediate)", "1111001a1D000bcdVVVVmmmm0Qo1efgh") // ASIMD - -// Miscellaneous -INST(asimd_VEXT, "VEXT", "111100101D11nnnnddddiiiiNQM0mmmm") // ASIMD -INST(asimd_VTBL, "VTBL", "111100111D11nnnndddd10zzN0M0mmmm") // ASIMD -INST(asimd_VTBX, "VTBX", "111100111D11nnnndddd10zzN1M0mmmm") // ASIMD -INST(asimd_VDUP_scalar, "VDUP (scalar)", "111100111D11iiiidddd11000QM0mmmm") // ASIMD -INST(arm_UDF, "UNALLOCATED", "111100111-11--------11-----0----") // ASIMD - -// Advanced SIMD load/store structures -INST(v8_VST_multiple, "VST{1-4} (multiple)", "111101000D00nnnnddddxxxxzzaammmm") // v8 -INST(v8_VLD_multiple, "VLD{1-4} (multiple)", "111101000D10nnnnddddxxxxzzaammmm") // v8 -INST(arm_UDF, "UNALLOCATED", "111101000--0--------1011--------") // v8 -INST(arm_UDF, "UNALLOCATED", "111101000--0--------11----------") // v8 -INST(arm_UDF, "UNALLOCATED", "111101001-00--------11----------") // v8 -INST(v8_VLD_all_lanes, "VLD{1-4} (all lanes)", "111101001D10nnnndddd11nnzzTammmm") // v8 -INST(v8_VST_single, "VST{1-4} (single)", "111101001D00nnnnddddzzNNaaaammmm") // v8 -INST(v8_VLD_single, "VLD{1-4} (single)", "111101001D10nnnnddddzzNNaaaammmm") // v8 +INST(asimd_VMOV_imm, "VBIC, VMOV, VMVN, VORR (immediate)", "1111001a1D000bcdVVVVmmmm0Qo1efgh") +INST(asimd_VEXT, "VEXT", "111100101D11nnnnddddiiiiNQM0mmmm") +INST(asimd_VTBL, "VTBL", "111100111D11nnnndddd10zzN0M0mmmm") +INST(asimd_VTBX, "VTBX", "111100111D11nnnndddd10zzN1M0mmmm") +INST(asimd_VDUP_scalar, "VDUP (scalar)", "111100111D11iiiidddd11000QM0mmmm") +INST(asimd_VSWP, "VSWP", "111100111D110010dddd00000QM0mmmm") +INST(asimd_VMOVN, "VMOVN", "111100111D11zz10dddd001000M0mmmm") +INST(asimd_VQMOVUN, "VQMOVUN", "111100111D11zz10dddd001001M0mmmm") +INST(asimd_VSHLL_max, "VSHLL_max", "111100111D11zz10dddd001100M0mmmm") +INST(v8_AESE, "AESE", "111100111D11zz00dddd001100M0mmmm") +INST(v8_AESD, "AESD", "111100111D11zz00dddd001101M0mmmm") +INST(v8_AESMC, "AESMC", "111100111D11zz00dddd001110M0mmmm") +INST(v8_AESIMC, "AESIMC", "111100111D11zz00dddd001111M0mmmm") +INST(arm_UDF, "UNALLOCATED", "111100111-11--01----001010-0----") +INST(arm_UDF, "UNALLOCATED (SHA1H)", "111100111-11--01----001011-0----") +INST(arm_UDF, "UNALLOCATED (SHA1SU1)", "111100111-11--10----001110-0----") +INST(v8_SHA256SU0, "SHA256SU0", "111100111D11zz10dddd001111M0mmmm") +INST(asimd_VCLS, "VCLS", "111100111D11zz00dddd01000QM0mmmm") +INST(asimd_VCLZ, "VCLZ", "111100111D11zz00dddd01001QM0mmmm") +INST(asimd_VCNT, "VCNT", "111100111D11zz00dddd01010QM0mmmm") +INST(asimd_VMVN_reg, "VMVN_reg", "111100111D11zz00dddd01011QM0mmmm") +INST(asimd_VQABS, "VQABS", "111100111D11zz00dddd01110QM0mmmm") +INST(asimd_VQNEG, "VQNEG", "111100111D11zz00dddd01111QM0mmmm") +INST(arm_UDF, "UNALLOCATED", "111100111-11--01----01101--0----") +INST(arm_UDF, "UNALLOCATED", "111100111-11--10----00000--0----") +INST(asimd_VTRN, "VTRN", "111100111D11zz10dddd00001QM0mmmm") +INST(asimd_VUZP, "VUZP", "111100111D11zz10dddd00010QM0mmmm") +INST(asimd_VZIP, "VZIP", "111100111D11zz10dddd00011QM0mmmm") +INST(asimd_VQMOVN, "VQMOVN", "111100111D11zz10dddd00101oM0mmmm") +INST(v8_VRINTN, "VRINTN", "111100111D11zz10dddd01000QM0mmmm") +INST(v8_VRINTX, "VRINTX", "111100111D11zz10dddd01001QM0mmmm") +INST(v8_VRINTA, "VRINTA", "111100111D11zz10dddd01010QM0mmmm") +INST(v8_VRINTZ, "VRINTZ", "111100111D11zz10dddd01011QM0mmmm") +INST(v8_VRINTM, "VRINTM", "111100111D11zz10dddd01101QM0mmmm") +INST(v8_VRINTP, "VRINTP", "111100111D11zz10dddd01111QM0mmmm") +INST(asimd_VCVT_half, "VCVT (half-precision)", "111100111D11zz10dddd011o00M0mmmm") +INST(arm_UDF, "UNALLOCATED", "111100111-11--10----011-01-0----") +INST(asimd_VPADDL, "VPADDL", "111100111D11zz00dddd0010oQM0mmmm") +INST(asimd_VPADAL, "VPADAL", "111100111D11zz00dddd0110oQM0mmmm") +INST(asimd_VCGT_zero, "VCGT (zero)", "111100111D11zz01dddd0F000QM0mmmm") +INST(asimd_VCGE_zero, "VCGE (zero)", "111100111D11zz01dddd0F001QM0mmmm") +INST(asimd_VCEQ_zero, "VCEQ (zero)", "111100111D11zz01dddd0F010QM0mmmm") +INST(asimd_VCLE_zero, "VCLE (zero)", "111100111D11zz01dddd0F011QM0mmmm") +INST(asimd_VCLT_zero, "VCLT (zero)", "111100111D11zz01dddd0F100QM0mmmm") +INST(asimd_VABS, "VABS", "111100111D11zz01dddd0F110QM0mmmm") +INST(asimd_VNEG, "VNEG", "111100111D11zz01dddd0F111QM0mmmm") +INST(v8_VCVTA, "VCVTA", "111100111D11zz11dddd0000oQM0mmmm") +INST(v8_VCVTN, "VCVTN", "111100111D11zz11dddd0001oQM0mmmm") +INST(v8_VCVTP, "VCVTP", "111100111D11zz11dddd0010oQM0mmmm") +INST(v8_VCVTM, "VCVTM", "111100111D11zz11dddd0011oQM0mmmm") +INST(asimd_VRECPE, "VRECPE", "111100111D11zz11dddd010F0QM0mmmm") +INST(asimd_VRSQRTE, "VRSQRTE", "111100111D11zz11dddd010F1QM0mmmm") +INST(asimd_VREV, "VREV{16,32,64}", "111100111D11zz00dddd000ooQM0mmmm") +INST(asimd_VCVT_integer, "VCVT (integer)", "111100111D11zz11dddd011oUQM0mmmm") +INST(asimd_VAND_reg, "VAND (register)", "111100100D00nnnndddd0001NQM1mmmm") +INST(asimd_VBIC_reg, "VBIC (register)", "111100100D01nnnndddd0001NQM1mmmm") +INST(asimd_VORR_reg, "VORR (register)", "111100100D10nnnndddd0001NQM1mmmm") +INST(asimd_VORN_reg, "VORN (register)", "111100100D11nnnndddd0001NQM1mmmm") +INST(asimd_VEOR_reg, "VEOR (register)", "111100110D00nnnndddd0001NQM1mmmm") +INST(asimd_VBSL, "VBSL", "111100110D01nnnndddd0001NQM1mmmm") +INST(asimd_VBIT, "VBIT", "111100110D10nnnndddd0001NQM1mmmm") +INST(asimd_VBIF, "VBIF", "111100110D11nnnndddd0001NQM1mmmm") +INST(v8_SHA256H, "SHA256H", "111100110D00nnnndddd1100NQM0mmmm") +INST(v8_SHA256H2, "SHA256H2", "111100110D01nnnndddd1100NQM0mmmm") +INST(v8_SHA256SU1, "SHA256SU1", "111100110D10nnnndddd1100NQM0mmmm") +INST(asimd_VSHRN, "VSHRN", "111100101Diiiiiidddd100000M1mmmm") +INST(asimd_VRSHRN, "VRSHRN", "111100101Diiiiiidddd100001M1mmmm") +INST(asimd_VQSHRUN, "VQSHRUN", "111100111Diiiiiidddd100000M1mmmm") +INST(asimd_VQRSHRUN, "VQRSHRUN", "111100111Diiiiiidddd100001M1mmmm") +INST(v8_VMAXNM, "VMAXNM", "111100110D0znnnndddd1111NQM1mmmm") +INST(v8_VMINNM, "VMINNM", "111100110D1znnnndddd1111NQM1mmmm") +INST(asimd_VFMA, "VFMA", "111100100D0znnnndddd1100NQM1mmmm") +INST(asimd_VFMS, "VFMS", "111100100D1znnnndddd1100NQM1mmmm") +INST(asimd_VADD_float, "VADD (floating-point)", "111100100D0znnnndddd1101NQM0mmmm") +INST(asimd_VSUB_float, "VSUB (floating-point)", "111100100D1znnnndddd1101NQM0mmmm") +INST(asimd_VPADD_float, "VPADD (floating-point)", "111100110D0znnnndddd1101NQM0mmmm") +INST(asimd_VABD_float, "VABD (floating-point)", "111100110D1znnnndddd1101NQM0mmmm") +INST(asimd_VMLA_float, "VMLA (floating-point)", "111100100D0znnnndddd1101NQM1mmmm") +INST(asimd_VMLS_float, "VMLS (floating-point)", "111100100D1znnnndddd1101NQM1mmmm") +INST(asimd_VMUL_float, "VMUL (floating-point)", "111100110D0znnnndddd1101NQM1mmmm") +INST(asimd_VCEQ_reg_float, "VCEQ (register)", "111100100D0znnnndddd1110NQM0mmmm") +INST(asimd_VCGE_reg_float, "VCGE (register)", "111100110D0znnnndddd1110NQM0mmmm") +INST(asimd_VCGT_reg_float, "VCGT (register)", "111100110D1znnnndddd1110NQM0mmmm") +INST(asimd_VMAX_float, "VMAX (floating-point)", "111100100D0znnnndddd1111NQM0mmmm") +INST(asimd_VMIN_float, "VMIN (floating-point)", "111100100D1znnnndddd1111NQM0mmmm") +INST(asimd_VPMAX_float, "VPMAX (floating-point)", "111100110D0znnnndddd1111NQM0mmmm") +INST(asimd_VPMIN_float, "VPMIN (floating-point)", "111100110D1znnnndddd1111NQM0mmmm") +INST(asimd_VRECPS, "VRECPS", "111100100D0znnnndddd1111NQM1mmmm") +INST(asimd_VRSQRTS, "VRSQRTS", "111100100D1znnnndddd1111NQM1mmmm") +INST(asimd_VQSHRN, "VQSHRN", "1111001U1Diiiiiidddd100100M1mmmm") +INST(asimd_VQRSHRN, "VQRSHRN", "1111001U1Diiiiiidddd100101M1mmmm") +INST(asimd_VSHLL, "VSHLL", "1111001U1Diiiiiidddd101000M1mmmm") +INST(asimd_VADD_int, "VADD (integer)", "111100100Dzznnnndddd1000NQM0mmmm") +INST(asimd_VSUB_int, "VSUB (integer)", "111100110Dzznnnndddd1000NQM0mmmm") +INST(asimd_VTST, "VTST", "111100100Dzznnnndddd1000NQM1mmmm") +INST(asimd_VCEQ_reg, "VCEG (register)", "111100110Dzznnnndddd1000NQM1mmmm") +INST(asimd_VQDMULH, "VQDMULH", "111100100Dzznnnndddd1011NQM0mmmm") +INST(asimd_VQRDMULH, "VQRDMULH", "111100110Dzznnnndddd1011NQM0mmmm") +INST(asimd_VPADD, "VPADD", "111100100Dzznnnndddd1011NQM1mmmm") +INST(asimd_VACGE, "VACGE", "111100110Doznnnndddd1110NQM1mmmm") +INST(asimd_VABAL, "VABAL", "1111001U1Dzznnnndddd0101N0M0mmmm") +INST(asimd_VABDL, "VABDL", "1111001U1Dzznnnndddd0111N0M0mmmm") +INST(asimd_VSRI, "VSRI", "111100111Diiiiiidddd0100LQM1mmmm") +INST(asimd_VSHL, "VSHL", "111100101Diiiiiidddd0101LQM1mmmm") +INST(asimd_VSLI, "VSLI", "111100111Diiiiiidddd0101LQM1mmmm") +INST(arm_UDF, "UNALLOCATED", "111100111-11--------11-----0----") +INST(arm_UDF, "UNALLOCATED", "111101000--0--------1011--------") +INST(asimd_VHADD, "VHADD", "1111001U0Dzznnnndddd0000NQM0mmmm") +INST(asimd_VQADD, "VQADD", "1111001U0Dzznnnndddd0000NQM1mmmm") +INST(asimd_VRHADD, "VRHADD", "1111001U0Dzznnnndddd0001NQM0mmmm") +INST(asimd_VHSUB, "VHSUB", "1111001U0Dzznnnndddd0010NQM0mmmm") +INST(asimd_VQSUB, "VQSUB", "1111001U0Dzznnnndddd0010NQM1mmmm") +INST(asimd_VCGT_reg, "VCGT (register)", "1111001U0Dzznnnndddd0011NQM0mmmm") +INST(asimd_VCGE_reg, "VCGE (register)", "1111001U0Dzznnnndddd0011NQM1mmmm") +INST(asimd_VSHL_reg, "VSHL (register)", "1111001U0Dzznnnndddd0100NQM0mmmm") +INST(asimd_VQSHL_reg, "VQSHL (register)", "1111001U0Dzznnnndddd0100NQM1mmmm") +INST(asimd_VRSHL, "VRSHL", "1111001U0Dzznnnndddd0101NQM0mmmm") +INST(asimd_VABD, "VABD", "1111001U0Dzznnnndddd0111NQM0mmmm") +INST(asimd_VABA, "VABA", "1111001U0Dzznnnndddd0111NQM1mmmm") +INST(asimd_VMLA, "VMLA/VMLS", "1111001o0Dzznnnndddd1001NQM0mmmm") +INST(asimd_VMUL, "VMUL", "1111001P0Dzznnnndddd1001NQM1mmmm") +INST(asimd_VADDL, "VADDL/VADDW", "1111001U1Dzznnnndddd000oN0M0mmmm") +INST(asimd_VSUBL, "VSUBL/VSUBW", "1111001U1Dzznnnndddd001oN0M0mmmm") +INST(asimd_VMLAL, "VMLAL/VMLSL", "1111001U1Dzznnnndddd10o0N0M0mmmm") +INST(asimd_VMULL, "VMULL", "1111001U1Dzznnnndddd11P0N0M0mmmm") +INST(asimd_SHR, "SHR", "1111001U1Diiiiiidddd0000LQM1mmmm") +INST(asimd_SRA, "SRA", "1111001U1Diiiiiidddd0001LQM1mmmm") +INST(asimd_VRSHR, "VRSHR", "1111001U1Diiiiiidddd0010LQM1mmmm") +INST(asimd_VRSRA, "VRSRA", "1111001U1Diiiiiidddd0011LQM1mmmm") +INST(asimd_VCVT_fixed, "VCVT (fixed-point)", "1111001U1Diiiiiidddd111o0QM1mmmm") +INST(arm_UDF, "UNALLOCATED", "111101001-00--------11----------") +INST(v8_VLD_all_lanes, "VLD{1-4} (all lanes)", "111101001D10nnnndddd11nnzzTammmm") +INST(asimd_VMAX, "VMAX/VMIN (integer)", "1111001U0Dzznnnnmmmm0110NQMommmm") +INST(asimd_VPMAX_int, "VPMAX/VPMIN (integer)", "1111001U0Dzznnnndddd1010NQMommmm") +INST(asimd_VQSHL, "VQSHL", "1111001U1Diiiiiidddd011oLQM1mmmm") +INST(arm_UDF, "UNALLOCATED", "111101000--0--------11----------") +INST(v8_VST_multiple, "VST{1-4} (multiple)", "111101000D00nnnnddddxxxxzzaammmm") +INST(v8_VLD_multiple, "VLD{1-4} (multiple)", "111101000D10nnnnddddxxxxzzaammmm") +INST(v8_VST_single, "VST{1-4} (single)", "111101001D00nnnnddddzzNNaaaammmm") +INST(v8_VLD_single, "VLD{1-4} (single)", "111101001D10nnnnddddzzNNaaaammmm") +INST(asimd_VMLA_scalar, "VMLA (scalar)", "1111001Q1Dzznnnndddd0o0FN1M0mmmm") +INST(asimd_VMLAL_scalar, "VMLAL (scalar)", "1111001U1dzznnnndddd0o10N1M0mmmm") +INST(asimd_VMUL_scalar, "VMUL (scalar)", "1111001Q1Dzznnnndddd100FN1M0mmmm") +INST(asimd_VMULL_scalar, "VMULL (scalar)", "1111001U1Dzznnnndddd1010N1M0mmmm") +INST(asimd_VQDMULL_scalar, "VQDMULL (scalar)", "111100101Dzznnnndddd1011N1M0mmmm") +INST(asimd_VQDMULH_scalar, "VQDMULH (scalar)", "1111001Q1Dzznnnndddd1100N1M0mmmm") +INST(asimd_VQRDMULH_scalar, "VQRDMULH (scalar)", "1111001Q1Dzznnnndddd1101N1M0mmmm") diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb16.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb16.h index 16b99ba5aa..eae296f59c 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb16.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb16.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -24,8 +24,8 @@ template using Thumb16Matcher = Decoder::Matcher; template -std::optional>> DecodeThumb16(u16 instruction) { - alignas(64) static const std::vector> table = { +static std::optional>> DecodeThumb16(u16 instruction) { + alignas(64) static const auto table = std::array{ #define INST(fn, name, bitstring) DYNARMIC_DECODER_GET_MATCHER(Thumb16Matcher, fn, name, Decoder::detail::StringToArray<16>(bitstring)), #include "./thumb16.inc" #undef INST @@ -37,7 +37,7 @@ std::optional>> DecodeThumb16(u16 } template -std::optional GetNameThumb16(u32 inst) noexcept { +static std::optional GetNameThumb16(u32 inst) noexcept { std::vector>> list = { #define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(Thumb16Matcher, fn, name, Decoder::detail::StringToArray<16>(bitstring)) }, #include "./thumb16.inc" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h index 19418de67c..d82aef73fa 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -23,8 +23,8 @@ template using Thumb32Matcher = Decoder::Matcher; template -std::optional>> DecodeThumb32(u32 instruction) { - alignas(64) static const std::vector> table = { +static std::optional>> DecodeThumb32(u32 instruction) { + alignas(64) static const auto table = std::array{ #define INST(fn, name, bitstring) DYNARMIC_DECODER_GET_MATCHER(Thumb32Matcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)), #include "./thumb32.inc" #undef INST @@ -36,7 +36,7 @@ std::optional>> DecodeThumb32(u32 } template -std::optional GetNameThumb32(u32 inst) noexcept { +static std::optional GetNameThumb32(u32 inst) noexcept { std::vector>> list = { #define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(Thumb32Matcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, #include "./thumb32.inc" diff --git a/src/dynarmic/src/dynarmic/frontend/A32/decoder/vfp.h b/src/dynarmic/src/dynarmic/frontend/A32/decoder/vfp.h index a346304a9a..f1728e452b 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/decoder/vfp.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/decoder/vfp.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -24,7 +24,7 @@ template using VFPMatcher = Decoder::Matcher; template -std::optional>> DecodeVFP(u32 instruction) { +static std::optional>> DecodeVFP(u32 instruction) { using Table = std::vector>; alignas(64) static const struct Tables { Table unconditional; @@ -52,7 +52,7 @@ std::optional>> DecodeVFP(u32 instruc } template -std::optional GetNameVFP(u32 inst) noexcept { +static std::optional GetNameVFP(u32 inst) noexcept { std::vector>> list = { #define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(VFPMatcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, #include "./vfp.inc" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h index eba9d73942..533a93f3aa 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h +++ b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.h @@ -36,33 +36,19 @@ inline size_t ToFastLookupIndex(u32 instruction) { } // namespace detail template -constexpr DecodeTable GetDecodeTable() { - std::vector>> list = { -#define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(Matcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, -#include "./a64.inc" -#undef INST - }; - // If a matcher has more bits in its mask it is more specific, so it should come first. - std::stable_sort(list.begin(), list.end(), [](const auto& a, const auto& b) { - // If a matcher has more bits in its mask it is more specific, so it should come first. - return mcl::bit::count_ones(a.second.GetMask()) > mcl::bit::count_ones(b.second.GetMask()); - }); - // Exceptions to the above rule of thumb. - std::stable_partition(list.begin(), list.end(), [&](const auto& e) { - return std::set{ - "MOVI, MVNI, ORR, BIC (vector, immediate)", - "FMOV (vector, immediate)", - "Unallocated SIMD modified immediate", - }.count(e.first) > 0; - }); +inline DecodeTable GetDecodeTable() { DecodeTable table{}; for (size_t i = 0; i < table.size(); ++i) { - for (auto const& e : list) { - const auto expect = detail::ToFastLookupIndex(e.second.GetExpected()); - const auto mask = detail::ToFastLookupIndex(e.second.GetMask()); - if ((i & mask) == expect) { - table[i].push_back(e.second); - } + // PLEASE HEAP ELLIDE + for (auto const& e : std::vector>{ +#define INST(fn, name, bitstring) DYNARMIC_DECODER_GET_MATCHER(Matcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)), +#include "./a64.inc" +#undef INST + }) { + const auto expect = detail::ToFastLookupIndex(e.GetExpected()); + const auto mask = detail::ToFastLookupIndex(e.GetMask()); + if ((i & mask) == expect) + table[i].push_back(e); } } return table; @@ -70,7 +56,7 @@ constexpr DecodeTable GetDecodeTable() { /// In practice it must always suceed, otherwise something else unrelated would have gone awry template -std::optional>> Decode(u32 instruction) { +inline std::optional>> Decode(u32 instruction) { alignas(64) static const auto table = GetDecodeTable(); const auto& subtable = table[detail::ToFastLookupIndex(instruction)]; auto iter = std::find_if(subtable.begin(), subtable.end(), [instruction](const auto& matcher) { @@ -82,7 +68,7 @@ std::optional>> Decode(u32 instruction) } template -std::optional GetName(u32 inst) noexcept { +inline std::optional GetName(u32 inst) noexcept { std::vector>> list = { #define INST(fn, name, bitstring) { name, DYNARMIC_DECODER_GET_MATCHER(Matcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)) }, #include "./a64.inc" diff --git a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.inc b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.inc index 23f8b71933..8a3fab7ac1 100644 --- a/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.inc +++ b/src/dynarmic/src/dynarmic/frontend/A64/decoder/a64.inc @@ -1,1029 +1,647 @@ -// Data processing - Immediate - PC relative addressing -INST(ADR, "ADR", "0ii10000iiiiiiiiiiiiiiiiiiiddddd") -INST(ADRP, "ADRP", "1ii10000iiiiiiiiiiiiiiiiiiiddddd") - -// Data processing - Immediate - Add/Sub (with tags) -//INST(ADDG, "ADDG", "1001000110iiiiii00IIIInnnnnddddd") // ARMv8.5 -//INST(SUBG, "SUBG", "1101000110iiiiii00IIIInnnnnddddd") // ARMv8.5 - -// Data processing - Immediate - Add/Sub -INST(ADD_imm, "ADD (immediate)", "z0010001ssiiiiiiiiiiiinnnnnddddd") -INST(ADDS_imm, "ADDS (immediate)", "z0110001ssiiiiiiiiiiiinnnnnddddd") -INST(SUB_imm, "SUB (immediate)", "z1010001ssiiiiiiiiiiiinnnnnddddd") -INST(SUBS_imm, "SUBS (immediate)", "z1110001ssiiiiiiiiiiiinnnnnddddd") - -// Data processing - Immediate - Logical -INST(AND_imm, "AND (immediate)", "z00100100Nrrrrrrssssssnnnnnddddd") -INST(ORR_imm, "ORR (immediate)", "z01100100Nrrrrrrssssssnnnnnddddd") -INST(EOR_imm, "EOR (immediate)", "z10100100Nrrrrrrssssssnnnnnddddd") -INST(ANDS_imm, "ANDS (immediate)", "z11100100Nrrrrrrssssssnnnnnddddd") - -// Data processing - Immediate - Move Wide -INST(MOVN, "MOVN", "z00100101ssiiiiiiiiiiiiiiiiddddd") -INST(MOVZ, "MOVZ", "z10100101ssiiiiiiiiiiiiiiiiddddd") -INST(MOVK, "MOVK", "z11100101ssiiiiiiiiiiiiiiiiddddd") - -// Data processing - Immediate - Bitfield -INST(SBFM, "SBFM", "z00100110Nrrrrrrssssssnnnnnddddd") -INST(BFM, "BFM", "z01100110Nrrrrrrssssssnnnnnddddd") -INST(UBFM, "UBFM", "z10100110Nrrrrrrssssssnnnnnddddd") -INST(ASR_1, "ASR (immediate, 32-bit)", "00010011000rrrrr011111nnnnnddddd") -INST(ASR_2, "ASR (immediate, 64-bit)", "1001001101rrrrrr111111nnnnnddddd") -INST(SXTB_1, "SXTB (32-bit)", "0001001100000000000111nnnnnddddd") -INST(SXTB_2, "SXTB (64-bit)", "1001001101000000000111nnnnnddddd") -INST(SXTH_1, "SXTH (32-bit)", "0001001100000000001111nnnnnddddd") -INST(SXTH_2, "SXTH (64-bit)", "1001001101000000001111nnnnnddddd") -INST(SXTW, "SXTW", "1001001101000000011111nnnnnddddd") - -// Data processing - Immediate - Extract -INST(EXTR, "EXTR", "z00100111N0mmmmmssssssnnnnnddddd") - -// Conditional branch -INST(B_cond, "B.cond", "01010100iiiiiiiiiiiiiiiiiii0cccc") - -// Exception generation -INST(SVC, "SVC", "11010100000iiiiiiiiiiiiiiii00001") -//INST(HVC, "HVC", "11010100000iiiiiiiiiiiiiiii00010") -//INST(SMC, "SMC", "11010100000iiiiiiiiiiiiiiii00011") -INST(BRK, "BRK", "11010100001iiiiiiiiiiiiiiii00000") -//INST(HLT, "HLT", "11010100010iiiiiiiiiiiiiiii00000") -//INST(DCPS1, "DCPS1", "11010100101iiiiiiiiiiiiiiii00001") -//INST(DCPS2, "DCPS2", "11010100101iiiiiiiiiiiiiiii00010") -//INST(DCPS3, "DCPS3", "11010100101iiiiiiiiiiiiiiii00011") - -// System -//INST(MSR_imm, "MSR (immediate)", "1101010100000ooo0100MMMMooo11111") -INST(HINT, "HINT", "11010101000000110010MMMMooo11111") -INST(NOP, "NOP", "11010101000000110010000000011111") -INST(YIELD, "YIELD", "11010101000000110010000000111111") -INST(WFE, "WFE", "11010101000000110010000001011111") -INST(WFI, "WFI", "11010101000000110010000001111111") -INST(SEV, "SEV", "11010101000000110010000010011111") -INST(SEVL, "SEVL", "11010101000000110010000010111111") -//INST(DGH, "DGH", "11010101000000110010000011011111") // v8.6 -//INST(WFET, "WFET", "110101010000001100010000000ddddd") // v8.7 -//INST(WFIT, "WFIT", "110101010000001100010000001ddddd") // v8.7 -//INST(XPAC_1, "XPACD, XPACI, XPACLRI", "110110101100000101000D11111ddddd") -//INST(XPAC_2, "XPACD, XPACI, XPACLRI", "11010101000000110010000011111111") -//INST(PACIA_1, "PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA", "110110101100000100Z000nnnnnddddd") -//INST(PACIA_2, "PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA", "1101010100000011001000-100-11111") -//INST(PACIB_1, "PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB", "110110101100000100Z001nnnnnddddd") -//INST(PACIB_2, "PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB", "1101010100000011001000-101-11111") -//INST(AUTIA_1, "AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIZA", "110110101100000100Z100nnnnnddddd") -//INST(AUTIA_2, "AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIZA", "1101010100000011001000-110-11111") -//INST(AUTIB_1, "AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZB", "110110101100000100Z101nnnnnddddd") -//INST(AUTIB_2, "AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZB", "1101010100000011001000-111-11111") -//INST(BTI, "BTI", "110101010000001100100100ii011111") // ARMv8.5 -//INST(ESB, "ESB", "11010101000000110010001000011111") -//INST(PSB, "PSB CSYNC", "11010101000000110010001000111111") -//INST(TSB, "TSB CSYNC", "11010101000000110010001001011111") // ARMv8.5 -//INST(CSDB, "CSDB", "11010101000000110010001010011111") -INST(CLREX, "CLREX", "11010101000000110011MMMM01011111") -INST(DSB, "DSB", "11010101000000110011MMMM10011111") -//INST(SSBB, "SSBB", "11010101000000110011000010011111") -//INST(PSSBB, "PSSBB", "11010101000000110011010010011111") -INST(DMB, "DMB", "11010101000000110011MMMM10111111") -INST(ISB, "ISB", "11010101000000110011MMMM11011111") -//INST(SB, "SB", "11010101000000110011000011111111") -//INST(SYS, "SYS", "1101010100001oooNNNNMMMMooottttt") -INST(MSR_reg, "MSR (register)", "110101010001poooNNNNMMMMooottttt") -//INST(SYSL, "SYSL", "1101010100101oooNNNNMMMMooottttt") -INST(MRS, "MRS", "110101010011poooNNNNMMMMooottttt") - -// System - Flag manipulation instructions -INST(CFINV, "CFINV", "11010101000000000100000000011111") // ARMv8.4 -INST(RMIF, "RMIF", "10111010000iiiiii00001nnnnn0IIII") // ARMv8.4 -//INST(SETF8, "SETF8", "0011101000000000000010nnnnn01101") // ARMv8.4 -//INST(SETF16, "SETF16", "0011101000000000010010nnnnn01101") // ARMv8.4 - -// System - Flag format instructions -INST(XAFlag, "XAFlag", "11010101000000000100000000111111") // ARMv8.5 -INST(AXFlag, "AXFlag", "11010101000000000100000001011111") // ARMv8.5 - -// SYS: Data Cache -INST(DC_IVAC, "DC IVAC", "110101010000100001110110001ttttt") -INST(DC_ISW, "DC ISW", "110101010000100001110110010ttttt") -INST(DC_CSW, "DC CSW", "110101010000100001111010010ttttt") -INST(DC_CISW, "DC CISW", "110101010000100001111110010ttttt") -INST(DC_ZVA, "DC ZVA", "110101010000101101110100001ttttt") -INST(DC_CVAC, "DC CVAC", "110101010000101101111010001ttttt") -INST(DC_CVAU, "DC CVAU", "110101010000101101111011001ttttt") -INST(DC_CVAP, "DC CVAP", "110101010000101101111100001ttttt") -INST(DC_CIVAC, "DC CIVAC", "110101010000101101111110001ttttt") - -// SYS: Instruction Cache -INST(IC_IALLU, "IC IALLU", "11010101000010000111010100011111") -INST(IC_IALLUIS, "IC IALLUIS", "11010101000010000111000100011111") -INST(IC_IVAU, "IC IVAU", "110101010000101101110101001ttttt") - -// Unconditional branch (Register) -INST(BLR, "BLR", "1101011000111111000000nnnnn00000") -INST(BR, "BR", "1101011000011111000000nnnnn00000") -//INST(DRPS, "DRPS", "11010110101111110000001111100000") -//INST(ERET, "ERET", "11010110100111110000001111100000") -INST(RET, "RET", "1101011001011111000000nnnnn00000") -//INST(BLRA, "BLRAA, BLRAAZ, BLRAB, BLRABZ", "1101011Z0011111100001Mnnnnnmmmmm") // ARMv8.3 -//INST(BRA, "BRAA, BRAAZ, BRAB, BRABZ", "1101011Z0001111100001Mnnnnnmmmmm") // ARMv8.3 -//INST(ERETA, "ERETAA, ERETAB", "110101101001111100001M1111111111") // ARMv8.3 -//INST(RETA, "RETAA, RETAB", "110101100101111100001M1111111111") // ARMv8.3 - -// Unconditional branch (immediate) -INST(B_uncond, "B", "000101iiiiiiiiiiiiiiiiiiiiiiiiii") -INST(BL, "BL", "100101iiiiiiiiiiiiiiiiiiiiiiiiii") - -// Compare and branch (immediate) -INST(CBZ, "CBZ", "z0110100iiiiiiiiiiiiiiiiiiittttt") -INST(CBNZ, "CBNZ", "z0110101iiiiiiiiiiiiiiiiiiittttt") -INST(TBZ, "TBZ", "b0110110bbbbbiiiiiiiiiiiiiittttt") -INST(TBNZ, "TBNZ", "b0110111bbbbbiiiiiiiiiiiiiittttt") - -// Loads and stores - Advanced SIMD Load/Store multiple structures -INST(STx_mult_1, "STx (multiple structures)", "0Q00110000000000oooozznnnnnttttt") -INST(STx_mult_2, "STx (multiple structures)", "0Q001100100mmmmmoooozznnnnnttttt") -INST(LDx_mult_1, "LDx (multiple structures)", "0Q00110001000000oooozznnnnnttttt") -INST(LDx_mult_2, "LDx (multiple structures)", "0Q001100110mmmmmoooozznnnnnttttt") - -// Loads and stores - Advanced SIMD Load/Store single structures -INST(ST1_sngl_1, "ST1 (single structure)", "0Q00110100000000oo0Szznnnnnttttt") -INST(ST1_sngl_2, "ST1 (single structure)", "0Q001101100mmmmmoo0Szznnnnnttttt") -INST(ST3_sngl_1, "ST3 (single structure)", "0Q00110100000000oo1Szznnnnnttttt") -INST(ST3_sngl_2, "ST3 (single structure)", "0Q001101100mmmmmoo1Szznnnnnttttt") -INST(ST2_sngl_1, "ST2 (single structure)", "0Q00110100100000oo0Szznnnnnttttt") -INST(ST2_sngl_2, "ST2 (single structure)", "0Q001101101mmmmmoo0Szznnnnnttttt") -INST(ST4_sngl_1, "ST4 (single structure)", "0Q00110100100000oo1Szznnnnnttttt") -INST(ST4_sngl_2, "ST4 (single structure)", "0Q001101101mmmmmoo1Szznnnnnttttt") -INST(LD1_sngl_1, "LD1 (single structure)", "0Q00110101000000oo0Szznnnnnttttt") -INST(LD1_sngl_2, "LD1 (single structure)", "0Q001101110mmmmmoo0Szznnnnnttttt") -INST(LD3_sngl_1, "LD3 (single structure)", "0Q00110101000000oo1Szznnnnnttttt") -INST(LD3_sngl_2, "LD3 (single structure)", "0Q001101110mmmmmoo1Szznnnnnttttt") -INST(LD1R_1, "LD1R", "0Q001101010000001100zznnnnnttttt") -INST(LD1R_2, "LD1R", "0Q001101110mmmmm1100zznnnnnttttt") -INST(LD3R_1, "LD3R", "0Q001101010000001110zznnnnnttttt") -INST(LD3R_2, "LD3R", "0Q001101110mmmmm1110zznnnnnttttt") -INST(LD2_sngl_1, "LD2 (single structure)", "0Q00110101100000oo0Szznnnnnttttt") -INST(LD2_sngl_2, "LD2 (single structure)", "0Q001101111mmmmmoo0Szznnnnnttttt") -INST(LD4_sngl_1, "LD4 (single structure)", "0Q00110101100000oo1Szznnnnnttttt") -INST(LD4_sngl_2, "LD4 (single structure)", "0Q001101111mmmmmoo1Szznnnnnttttt") -INST(LD2R_1, "LD2R", "0Q001101011000001100zznnnnnttttt") -INST(LD2R_2, "LD2R", "0Q001101111mmmmm1100zznnnnnttttt") -INST(LD4R_1, "LD4R", "0Q001101011000001110zznnnnnttttt") -INST(LD4R_2, "LD4R", "0Q001101111mmmmm1110zznnnnnttttt") - -// Loads and stores - Load/Store Exclusive -INST(STXR, "STXRB, STXRH, STXR", "zz001000000sssss011111nnnnnttttt") -INST(STLXR, "STLXRB, STLXRH, STLXR", "zz001000000sssss111111nnnnnttttt") -INST(STXP, "STXP", "1z001000001sssss0uuuuunnnnnttttt") -INST(STLXP, "STLXP", "1z001000001sssss1uuuuunnnnnttttt") -INST(LDXR, "LDXRB, LDXRH, LDXR", "zz00100001011111011111nnnnnttttt") -INST(LDAXR, "LDAXRB, LDAXRH, LDAXR", "zz00100001011111111111nnnnnttttt") -INST(LDXP, "LDXP", "1z001000011111110uuuuunnnnnttttt") -INST(LDAXP, "LDAXP", "1z001000011111111uuuuunnnnnttttt") -INST(STLLR, "STLLRB, STLLRH, STLLR", "zz00100010011111011111nnnnnttttt") -INST(STLR, "STLRB, STLRH, STLR", "zz00100010011111111111nnnnnttttt") -INST(LDLAR, "LDLARB, LDLARH, LDLAR", "zz00100011011111011111nnnnnttttt") -INST(LDAR, "LDARB, LDARH, LDAR", "zz00100011011111111111nnnnnttttt") -//INST(CASP, "CASP, CASPA, CASPAL, CASPL", "0z0010000L1sssssp11111nnnnnttttt") // ARMv8.1 -//INST(CASB, "CASB, CASAB, CASALB, CASLB", "000010001L1sssssp11111nnnnnttttt") // ARMv8.1 -//INST(CASH, "CASH, CASAH, CASALH, CASLH", "010010001L1sssssp11111nnnnnttttt") // ARMv8.1 -//INST(CAS, "CAS, CASA, CASAL, CASL", "1z0010001L1sssssp11111nnnnnttttt") // ARMv8.1 - -// Loads and stores - Load register (literal) -INST(LDR_lit_gen, "LDR (literal)", "0z011000iiiiiiiiiiiiiiiiiiittttt") -INST(LDRSW_lit, "LDRSW (literal)", "10011000iiiiiiiiiiiiiiiiiiittttt") -INST(PRFM_lit, "PRFM (literal)", "11011000iiiiiiiiiiiiiiiiiiittttt") -INST(LDR_lit_fpsimd, "LDR (literal, SIMD&FP)", "oo011100iiiiiiiiiiiiiiiiiiittttt") - -// Loads and stores - Load/Store no-allocate pair -INST(STNP_LDNP_gen, "STNP/LDNP", "o01010000Liiiiiiiuuuuunnnnnttttt") -INST(STNP_LDNP_fpsimd, "STNP/LDNP (SIMD&FP)", "oo1011000Liiiiiiiuuuuunnnnnttttt") - -// Loads and stores - Load/Store register pair -INST(STP_LDP_gen, "STP/LDP", "oo10100pwLiiiiiiiuuuuunnnnnttttt") -INST(UnallocatedEncoding, "", "--1010000-----------------------") -INST(STP_LDP_fpsimd, "STP/LDP (SIMD&FP)", "oo10110pwLiiiiiiiuuuuunnnnnttttt") -INST(UnallocatedEncoding, "", "--1011000-----------------------") - -// Loads and stores - Load/Store register (unscaled immediate) -INST(STURx_LDURx, "STURx/LDURx", "zz111000oo0iiiiiiiii00nnnnnttttt") -INST(UnallocatedEncoding, "", "111110001-0---------00----------") -INST(UnallocatedEncoding, "", "10111000110---------00----------") -INST(PRFM_imm, "PRFM (immediate)", "1111100110iiiiiiiiiiiinnnnnttttt") -INST(PRFM_unscaled_imm, "PRFM (unscaled offset)", "11111000100iiiiiiiii00nnnnnttttt") -INST(STUR_fpsimd, "STUR (SIMD&FP)", "zz111100o00iiiiiiiii00nnnnnttttt") -INST(LDUR_fpsimd, "LDUR (SIMD&FP)", "zz111100o10iiiiiiiii00nnnnnttttt") - -// Loads and stores - Load/Store register (immediate pre/post-indexed) -INST(STRx_LDRx_imm_1, "STRx/LDRx (immediate)", "zz111000oo0iiiiiiiiip1nnnnnttttt") -INST(STRx_LDRx_imm_2, "STRx/LDRx (immediate)", "zz111001ooiiiiiiiiiiiinnnnnttttt") -INST(UnallocatedEncoding, "", "111110001-0----------1----------") -INST(UnallocatedEncoding, "", "10111000110----------1----------") -INST(UnallocatedEncoding, "", "1111100111----------------------") -INST(UnallocatedEncoding, "", "1011100111----------------------") -INST(STR_imm_fpsimd_1, "STR (immediate, SIMD&FP)", "zz111100o00iiiiiiiiip1nnnnnttttt") -INST(STR_imm_fpsimd_2, "STR (immediate, SIMD&FP)", "zz111101o0iiiiiiiiiiiinnnnnttttt") -INST(LDR_imm_fpsimd_1, "LDR (immediate, SIMD&FP)", "zz111100o10iiiiiiiiip1nnnnnttttt") -INST(LDR_imm_fpsimd_2, "LDR (immediate, SIMD&FP)", "zz111101o1iiiiiiiiiiiinnnnnttttt") -//INST(STGP_1, "STGP (post-index)", "0110100010iiiiiiimmmmmnnnnnttttt") // ARMv8.5 -//INST(STGP_2, "STGP (pre-index)", "0110100110iiiiiiimmmmmnnnnnttttt") // ARMv8.5 -//INST(STGP_3, "STGP (signed-offset)", "0110100100iiiiiiimmmmmnnnnnttttt") // ARMv8.5 - -// Loads and stores - Load/Store register (unprivileged) -INST(STTRB, "STTRB", "00111000000iiiiiiiii10nnnnnttttt") -INST(LDTRB, "LDTRB", "00111000010iiiiiiiii10nnnnnttttt") -INST(LDTRSB, "LDTRSB", "00111000oo0iiiiiiiii10nnnnnttttt") -INST(STTRH, "STTRH", "01111000000iiiiiiiii10nnnnnttttt") -INST(LDTRH, "LDTRH", "01111000010iiiiiiiii10nnnnnttttt") -INST(LDTRSH, "LDTRSH", "01111000oo0iiiiiiiii10nnnnnttttt") -INST(STTR, "STTR", "zz111000000iiiiiiiii10nnnnnttttt") -INST(LDTR, "LDTR", "zz111000010iiiiiiiii10nnnnnttttt") -INST(LDTRSW, "LDTRSW", "10111000100iiiiiiiii10nnnnnttttt") - -// Loads and stores - Atomic memory options -//INST(LDADDB, "LDADDB, LDADDAB, LDADDALB, LDADDLB", "00111000AR1sssss000000nnnnnttttt") -//INST(LDCLRB, "LDCLRB, LDCLRAB, LDCLRALB, LDCLRLB", "00111000AR1sssss000100nnnnnttttt") -//INST(LDEORB, "LDEORB, LDEORAB, LDEORALB, LDEORLB", "00111000AR1sssss001000nnnnnttttt") -//INST(LDSETB, "LDSETB, LDSETAB, LDSETALB, LDSETLB", "00111000AR1sssss001100nnnnnttttt") -//INST(LDSMAXB, "LDSMAXB, LDSMAXAB, LDSMAXALB, LDSMAXLB", "00111000AR1sssss010000nnnnnttttt") -//INST(LDSMINB, "LDSMINB, LDSMINAB, LDSMINALB, LDSMINLB", "00111000AR1sssss010100nnnnnttttt") -//INST(LDUMAXB, "LDUMAXB, LDUMAXAB, LDUMAXALB, LDUMAXLB", "00111000AR1sssss011000nnnnnttttt") -//INST(LDUMINB, "LDUMINB, LDUMINAB, LDUMINALB, LDUMINLB", "00111000AR1sssss011100nnnnnttttt") -//INST(SWPB, "SWPB, SWPAB, SWPALB, SWPLB", "00111000AR1sssss100000nnnnnttttt") -//INST(LDAPRB, "LDAPRB", "0011100010111111110000nnnnnttttt") -//INST(LDADDH, "LDADDH, LDADDAH, LDADDALH, LDADDLH", "01111000AR1sssss000000nnnnnttttt") -//INST(LDCLRH, "LDCLRH, LDCLRAH, LDCLRALH, LDCLRLH", "01111000AR1sssss000100nnnnnttttt") -//INST(LDEORH, "LDEORH, LDEORAH, LDEORALH, LDEORLH", "01111000AR1sssss001000nnnnnttttt") -//INST(LDSETH, "LDSETH, LDSETAH, LDSETALH, LDSETLH", "01111000AR1sssss001100nnnnnttttt") -//INST(LDSMAXH, "LDSMAXH, LDSMAXAH, LDSMAXALH, LDSMAXLH", "01111000AR1sssss010000nnnnnttttt") -//INST(LDSMINH, "LDSMINH, LDSMINAH, LDSMINALH, LDSMINLH", "01111000AR1sssss010100nnnnnttttt") -//INST(LDUMAXH, "LDUMAXH, LDUMAXAH, LDUMAXALH, LDUMAXLH", "01111000AR1sssss011000nnnnnttttt") -//INST(LDUMINH, "LDUMINH, LDUMINAH, LDUMINALH, LDUMINLH", "01111000AR1sssss011100nnnnnttttt") -//INST(SWPH, "SWPH, SWPAH, SWPALH, SWPLH", "01111000AR1sssss100000nnnnnttttt") -//INST(LDAPRH, "LDAPRH", "0111100010111111110000nnnnnttttt") -//INST(LDADD, "LDADD, LDADDA, LDADDAL, LDADDL", "1-111000AR1sssss000000nnnnnttttt") -//INST(LDCLR, "LDCLR, LDCLRA, LDCLRAL, LDCLRL", "1-111000AR1sssss000100nnnnnttttt") -//INST(LDEOR, "LDEOR, LDEORA, LDEORAL, LDEORL", "1-111000AR1sssss001000nnnnnttttt") -//INST(LDSET, "LDSET, LDSETA, LDSETAL, LDSETL", "1-111000AR1sssss001100nnnnnttttt") -//INST(LDSMAX, "LDSMAX, LDSMAXA, LDSMAXAL, LDSMAXL", "1-111000AR1sssss010000nnnnnttttt") -//INST(LDSMIN, "LDSMIN, LDSMINA, LDSMINAL, LDSMINL", "1-111000AR1sssss010100nnnnnttttt") -//INST(LDUMAX, "LDUMAX, LDUMAXA, LDUMAXAL, LDUMAXL", "1-111000AR1sssss011000nnnnnttttt") -//INST(LDUMIN, "LDUMIN, LDUMINA, LDUMINAL, LDUMINL", "1-111000AR1sssss011100nnnnnttttt") -//INST(SWP, "SWP, SWPA, SWPAL, SWPL", "1-111000AR1sssss100000nnnnnttttt") -//INST(LDAPR, "LDAPR", "1-11100010111111110000nnnnnttttt") -//INST(LD64B, "LD64B", "1111100000111111110100nnnnnttttt") // v8.7 -//INST(ST64B, "ST64B", "1111100000111111100100nnnnnttttt") // v8.7 -//INST(ST64BV, "ST64BV", "11111000001sssss101100nnnnnttttt") // v8.7 -//INST(ST64BV0, "ST64BV0", "11111000001sssss101000nnnnnttttt") // v8.7 - -// Loads and stores - Load/Store register (register offset) -INST(STRx_reg, "STRx (register)", "zz111000o01mmmmmxxxS10nnnnnttttt") -INST(LDRx_reg, "LDRx (register)", "zz111000o11mmmmmxxxS10nnnnnttttt") -INST(STR_reg_fpsimd, "STR (register, SIMD&FP)", "zz111100o01mmmmmxxxS10nnnnnttttt") -INST(LDR_reg_fpsimd, "LDR (register, SIMD&FP)", "zz111100o11mmmmmxxxS10nnnnnttttt") - -// Loads and stores - Load/Store memory tags -//INST(STG_1, "STG (post-index)", "11011001001iiiiiiiii01nnnnn11111") // ARMv8.5 -//INST(STG_2, "STG (pre-index)", "11011001001iiiiiiiii11nnnnn11111") // ARMv8.5 -//INST(STG_3, "STG (signed-offset)", "11011001001iiiiiiiii10nnnnn11111") // ARMv8.5 -//INST(LDG, "LDG", "11011001011iiiiiiiii00nnnnnttttt") // ARMv8.5 -//INST(STZG_1, "STZG (post-index)", "11011001011iiiiiiiii01nnnnn11111") // ARMv8.5 -//INST(STZG_2, "STZG (pre-index)", "11011001011iiiiiiiii11nnnnn11111") // ARMv8.5 -//INST(STZG_3, "STZG (signed-offset)", "11011001011iiiiiiiii10nnnnn11111") // ARMv8.5 -//INST(ST2G_1, "ST2G (post-index)", "11011001101iiiiiiiii01nnnnn11111") // ARMv8.5 -//INST(ST2G_2, "ST2G (pre-index)", "11011001101iiiiiiiii11nnnnn11111") // ARMv8.5 -//INST(ST2G_3, "ST2G (signed-offset)", "11011001101iiiiiiiii10nnnnn11111") // ARMv8.5 -//INST(STGV, "STGV", "1101100110100000000000nnnnnttttt") // ARMv8.5 -//INST(STZ2G_1, "STZ2G (post-index)", "11011001111iiiiiiiii01nnnnn11111") // ARMv8.5 -//INST(STZ2G_2, "STZ2G (pre-index)", "11011001111iiiiiiiii11nnnnn11111") // ARMv8.5 -//INST(STZ2G_3, "STZ2G (signed-offset)", "11011001111iiiiiiiii10nnnnn11111") // ARMv8.5 -//INST(LDGV, "LDGV", "1101100111100000000000nnnnnttttt") // ARMv8.5 - -// Loads and stores - Load/Store register (pointer authentication) -//INST(LDRA, "LDRAA, LDRAB", "11111000MS1iiiiiiiiiW1nnnnnttttt") - -// Data Processing - Register - 2 source -INST(UDIV, "UDIV", "z0011010110mmmmm000010nnnnnddddd") -INST(SDIV, "SDIV", "z0011010110mmmmm000011nnnnnddddd") -INST(LSLV, "LSLV", "z0011010110mmmmm001000nnnnnddddd") -INST(LSRV, "LSRV", "z0011010110mmmmm001001nnnnnddddd") -INST(ASRV, "ASRV", "z0011010110mmmmm001010nnnnnddddd") -INST(RORV, "RORV", "z0011010110mmmmm001011nnnnnddddd") -INST(CRC32, "CRC32B, CRC32H, CRC32W, CRC32X", "z0011010110mmmmm0100zznnnnnddddd") -INST(CRC32C, "CRC32CB, CRC32CH, CRC32CW, CRC32CX", "z0011010110mmmmm0101zznnnnnddddd") -//INST(PACGA, "PACGA", "10011010110mmmmm001100nnnnnddddd") -//INST(SUBP, "SUBP", "10011010110mmmmm000000nnnnnddddd") // ARMv8.5 -//INST(IRG, "IRG", "10011010110mmmmm000100nnnnnddddd") // ARMv8.5 -//INST(GMI, "GMI", "10011010110mmmmm000101nnnnnddddd") // ARMv8.5 -//INST(SUBPS, "SUBPS", "10111010110mmmmm000000nnnnnddddd") // ARMv8.5 - -// Data Processing - Register - 1 source -INST(RBIT_int, "RBIT", "z101101011000000000000nnnnnddddd") -INST(REV16_int, "REV16", "z101101011000000000001nnnnnddddd") -INST(REV, "REV", "z10110101100000000001onnnnnddddd") -INST(CLZ_int, "CLZ", "z101101011000000000100nnnnnddddd") -INST(CLS_int, "CLS", "z101101011000000000101nnnnnddddd") -INST(REV32_int, "REV32", "1101101011000000000010nnnnnddddd") -//INST(PACDA, "PACDA, PACDZA", "110110101100000100Z010nnnnnddddd") -//INST(PACDB, "PACDB, PACDZB", "110110101100000100Z011nnnnnddddd") -//INST(AUTDA, "AUTDA, AUTDZA", "110110101100000100Z110nnnnnddddd") -//INST(AUTDB, "AUTDB, AUTDZB", "110110101100000100Z111nnnnnddddd") - -// Data Processing - Register - Logical (shifted register) -INST(AND_shift, "AND (shifted register)", "z0001010ss0mmmmmiiiiiinnnnnddddd") -INST(BIC_shift, "BIC (shifted register)", "z0001010ss1mmmmmiiiiiinnnnnddddd") -INST(ORR_shift, "ORR (shifted register)", "z0101010ss0mmmmmiiiiiinnnnnddddd") -INST(ORN_shift, "ORN (shifted register)", "z0101010ss1mmmmmiiiiiinnnnnddddd") -INST(EOR_shift, "EOR (shifted register)", "z1001010ss0mmmmmiiiiiinnnnnddddd") -INST(EON, "EON (shifted register)", "z1001010ss1mmmmmiiiiiinnnnnddddd") -INST(ANDS_shift, "ANDS (shifted register)", "z1101010ss0mmmmmiiiiiinnnnnddddd") -INST(BICS, "BICS (shifted register)", "z1101010ss1mmmmmiiiiiinnnnnddddd") - -// Data Processing - Register - Add/Sub (shifted register) -INST(ADD_shift, "ADD (shifted register)", "z0001011ss0mmmmmiiiiiinnnnnddddd") -INST(ADDS_shift, "ADDS (shifted register)", "z0101011ss0mmmmmiiiiiinnnnnddddd") -INST(SUB_shift, "SUB (shifted register)", "z1001011ss0mmmmmiiiiiinnnnnddddd") -INST(SUBS_shift, "SUBS (shifted register)", "z1101011ss0mmmmmiiiiiinnnnnddddd") - -// Data Processing - Register - Add/Sub (shifted register) -INST(ADD_ext, "ADD (extended register)", "z0001011001mmmmmxxxiiinnnnnddddd") -INST(ADDS_ext, "ADDS (extended register)", "z0101011001mmmmmxxxiiinnnnnddddd") -INST(SUB_ext, "SUB (extended register)", "z1001011001mmmmmxxxiiinnnnnddddd") -INST(SUBS_ext, "SUBS (extended register)", "z1101011001mmmmmxxxiiinnnnnddddd") - -// Data Processing - Register - Add/Sub (with carry) -INST(ADC, "ADC", "z0011010000mmmmm000000nnnnnddddd") -INST(ADCS, "ADCS", "z0111010000mmmmm000000nnnnnddddd") -INST(SBC, "SBC", "z1011010000mmmmm000000nnnnnddddd") -INST(SBCS, "SBCS", "z1111010000mmmmm000000nnnnnddddd") - -// Data Processing - Register - Conditional compare -INST(CCMN_reg, "CCMN (register)", "z0111010010mmmmmcccc00nnnnn0ffff") -INST(CCMP_reg, "CCMP (register)", "z1111010010mmmmmcccc00nnnnn0ffff") -INST(CCMN_imm, "CCMN (immediate)", "z0111010010iiiiicccc10nnnnn0ffff") -INST(CCMP_imm, "CCMP (immediate)", "z1111010010iiiiicccc10nnnnn0ffff") - -// Data Processing - Register - Conditional select -INST(CSEL, "CSEL", "z0011010100mmmmmcccc00nnnnnddddd") -INST(CSINC, "CSINC", "z0011010100mmmmmcccc01nnnnnddddd") -INST(CSINV, "CSINV", "z1011010100mmmmmcccc00nnnnnddddd") -INST(CSNEG, "CSNEG", "z1011010100mmmmmcccc01nnnnnddddd") - -// Data Processing - Register - 3 source -INST(MADD, "MADD", "z0011011000mmmmm0aaaaannnnnddddd") -INST(MSUB, "MSUB", "z0011011000mmmmm1aaaaannnnnddddd") -INST(SMADDL, "SMADDL", "10011011001mmmmm0aaaaannnnnddddd") -INST(SMSUBL, "SMSUBL", "10011011001mmmmm1aaaaannnnnddddd") -INST(SMULH, "SMULH", "10011011010mmmmm011111nnnnnddddd") -INST(UMADDL, "UMADDL", "10011011101mmmmm0aaaaannnnnddddd") -INST(UMSUBL, "UMSUBL", "10011011101mmmmm1aaaaannnnnddddd") -INST(UMULH, "UMULH", "10011011110mmmmm011111nnnnnddddd") - -// Data Processing - FP and SIMD - AES -INST(AESE, "AESE", "0100111000101000010010nnnnnddddd") -INST(AESD, "AESD", "0100111000101000010110nnnnnddddd") -INST(AESMC, "AESMC", "0100111000101000011010nnnnnddddd") -INST(AESIMC, "AESIMC", "0100111000101000011110nnnnnddddd") - -// Data Processing - FP and SIMD - SHA -INST(SHA1C, "SHA1C", "01011110000mmmmm000000nnnnnddddd") -INST(SHA1P, "SHA1P", "01011110000mmmmm000100nnnnnddddd") -INST(SHA1M, "SHA1M", "01011110000mmmmm001000nnnnnddddd") -INST(SHA1SU0, "SHA1SU0", "01011110000mmmmm001100nnnnnddddd") -INST(SHA256H, "SHA256H", "01011110000mmmmm010000nnnnnddddd") -INST(SHA256H2, "SHA256H2", "01011110000mmmmm010100nnnnnddddd") -INST(SHA256SU1, "SHA256SU1", "01011110000mmmmm011000nnnnnddddd") -INST(SHA1H, "SHA1H", "0101111000101000000010nnnnnddddd") -INST(SHA1SU1, "SHA1SU1", "0101111000101000000110nnnnnddddd") -INST(SHA256SU0, "SHA256SU0", "0101111000101000001010nnnnnddddd") - -// Data Processing - FP and SIMD - Scalar copy -INST(DUP_elt_1, "DUP (element)", "01011110000iiiii000001nnnnnddddd") - -// Data Processing - FP and SIMD - Scalar three -//INST(FMULX_vec_1, "FMULX", "01011110010mmmmm000111nnnnnddddd") -INST(FMULX_vec_2, "FMULX", "010111100z1mmmmm110111nnnnnddddd") -INST(FCMEQ_reg_1, "FCMEQ (register)", "01011110010mmmmm001001nnnnnddddd") -INST(FCMEQ_reg_2, "FCMEQ (register)", "010111100z1mmmmm111001nnnnnddddd") -INST(FRECPS_1, "FRECPS", "01011110010mmmmm001111nnnnnddddd") -INST(FRECPS_2, "FRECPS", "010111100z1mmmmm111111nnnnnddddd") -INST(FRSQRTS_1, "FRSQRTS", "01011110110mmmmm001111nnnnnddddd") -INST(FRSQRTS_2, "FRSQRTS", "010111101z1mmmmm111111nnnnnddddd") -//INST(FCMGE_reg_1, "FCMGE (register)", "01111110010mmmmm001001nnnnnddddd") -INST(FCMGE_reg_2, "FCMGE (register)", "011111100z1mmmmm111001nnnnnddddd") -//INST(FACGE_1, "FACGE", "01111110010mmmmm001011nnnnnddddd") -INST(FACGE_2, "FACGE", "011111100z1mmmmm111011nnnnnddddd") -//INST(FABD_1, "FABD", "01111110110mmmmm000101nnnnnddddd") -INST(FABD_2, "FABD", "011111101z1mmmmm110101nnnnnddddd") -//INST(FCMGT_reg_1, "FCMGT (register)", "01111110110mmmmm001001nnnnnddddd") -INST(FCMGT_reg_2, "FCMGT (register)", "011111101z1mmmmm111001nnnnnddddd") -//INST(FACGT_1, "FACGT", "01111110110mmmmm001011nnnnnddddd") -INST(FACGT_2, "FACGT", "011111101z1mmmmm111011nnnnnddddd") - -// Data Processing - FP and SIMD - Scalar two register misc -//INST(FCVTNS_1, "FCVTNS (vector)", "0101111001111001101010nnnnnddddd") -INST(FCVTNS_2, "FCVTNS (vector)", "010111100z100001101010nnnnnddddd") -//INST(FCVTMS_1, "FCVTMS (vector)", "0101111001111001101110nnnnnddddd") -INST(FCVTMS_2, "FCVTMS (vector)", "010111100z100001101110nnnnnddddd") -//INST(FCVTAS_1, "FCVTAS (vector)", "0101111001111001110010nnnnnddddd") -INST(FCVTAS_2, "FCVTAS (vector)", "010111100z100001110010nnnnnddddd") -//INST(SCVTF_int_1, "SCVTF (vector, integer)", "0101111001111001110110nnnnnddddd") -INST(SCVTF_int_2, "SCVTF (vector, integer)", "010111100z100001110110nnnnnddddd") -//INST(FCMGT_zero_1, "FCMGT (zero)", "0101111011111000110010nnnnnddddd") -INST(FCMGT_zero_2, "FCMGT (zero)", "010111101z100000110010nnnnnddddd") -INST(FCMEQ_zero_1, "FCMEQ (zero)", "0101111011111000110110nnnnnddddd") -INST(FCMEQ_zero_2, "FCMEQ (zero)", "010111101z100000110110nnnnnddddd") -//INST(FCMLT_1, "FCMLT (zero)", "0101111011111000111010nnnnnddddd") -INST(FCMLT_2, "FCMLT (zero)", "010111101z100000111010nnnnnddddd") -//INST(FCVTPS_1, "FCVTPS (vector)", "0101111011111001101010nnnnnddddd") -INST(FCVTPS_2, "FCVTPS (vector)", "010111101z100001101010nnnnnddddd") -//INST(FCVTZS_int_1, "FCVTZS (vector, integer)", "0101111011111001101110nnnnnddddd") -INST(FCVTZS_int_2, "FCVTZS (vector, integer)", "010111101z100001101110nnnnnddddd") -INST(FRECPE_1, "FRECPE", "0101111011111001110110nnnnnddddd") -INST(FRECPE_2, "FRECPE", "010111101z100001110110nnnnnddddd") -INST(FRECPX_1, "FRECPX", "0101111011111001111110nnnnnddddd") -INST(FRECPX_2, "FRECPX", "010111101z100001111110nnnnnddddd") -//INST(FCVTNU_1, "FCVTNU (vector)", "0111111001111001101010nnnnnddddd") -INST(FCVTNU_2, "FCVTNU (vector)", "011111100z100001101010nnnnnddddd") -//INST(FCVTMU_1, "FCVTMU (vector)", "0111111001111001101110nnnnnddddd") -INST(FCVTMU_2, "FCVTMU (vector)", "011111100z100001101110nnnnnddddd") -//INST(FCVTAU_1, "FCVTAU (vector)", "0111111001111001110010nnnnnddddd") -INST(FCVTAU_2, "FCVTAU (vector)", "011111100z100001110010nnnnnddddd") -//INST(UCVTF_int_1, "UCVTF (vector, integer)", "0111111001111001110110nnnnnddddd") -INST(UCVTF_int_2, "UCVTF (vector, integer)", "011111100z100001110110nnnnnddddd") -//INST(FCMGE_zero_1, "FCMGE (zero)", "0111111011111000110010nnnnnddddd") -INST(FCMGE_zero_2, "FCMGE (zero)", "011111101z100000110010nnnnnddddd") -//INST(FCMLE_1, "FCMLE (zero)", "0111111011111000110110nnnnnddddd") -INST(FCMLE_2, "FCMLE (zero)", "011111101z100000110110nnnnnddddd") -//INST(FCVTPU_1, "FCVTPU (vector)", "0111111011111001101010nnnnnddddd") -INST(FCVTPU_2, "FCVTPU (vector)", "011111101z100001101010nnnnnddddd") -//INST(FCVTZU_int_1, "FCVTZU (vector, integer)", "0111111011111001101110nnnnnddddd") -INST(FCVTZU_int_2, "FCVTZU (vector, integer)", "011111101z100001101110nnnnnddddd") -INST(FRSQRTE_1, "FRSQRTE", "0111111011111001110110nnnnnddddd") -INST(FRSQRTE_2, "FRSQRTE", "011111101z100001110110nnnnnddddd") - -// Data Processing - FP and SIMD - Scalar three same extra -//INST(SQRDMLAH_vec_1, "SQRDMLAH (vector)", "01111110zz0mmmmm100001nnnnnddddd") -//INST(SQRDMLAH_vec_2, "SQRDMLAH (vector)", "0Q101110zz0mmmmm100001nnnnnddddd") -//INST(SQRDMLSH_vec_1, "SQRDMLSH (vector)", "01111110zz0mmmmm100011nnnnnddddd") -//INST(SQRDMLSH_vec_2, "SQRDMLSH (vector)", "0Q101110zz0mmmmm100011nnnnnddddd") - -// Data Processing - FP and SIMD - Scalar two-register misc -INST(SUQADD_1, "SUQADD", "01011110zz100000001110nnnnnddddd") -INST(SQABS_1, "SQABS", "01011110zz100000011110nnnnnddddd") -INST(CMGT_zero_1, "CMGT (zero)", "01011110zz100000100010nnnnnddddd") -INST(CMEQ_zero_1, "CMEQ (zero)", "01011110zz100000100110nnnnnddddd") -INST(CMLT_1, "CMLT (zero)", "01011110zz100000101010nnnnnddddd") -INST(ABS_1, "ABS", "01011110zz100000101110nnnnnddddd") -INST(SQXTN_1, "SQXTN, SQXTN2", "01011110zz100001010010nnnnnddddd") -INST(USQADD_1, "USQADD", "01111110zz100000001110nnnnnddddd") -INST(SQNEG_1, "SQNEG", "01111110zz100000011110nnnnnddddd") -INST(CMGE_zero_1, "CMGE (zero)", "01111110zz100000100010nnnnnddddd") -INST(CMLE_1, "CMLE (zero)", "01111110zz100000100110nnnnnddddd") -INST(NEG_1, "NEG (vector)", "01111110zz100000101110nnnnnddddd") -INST(SQXTUN_1, "SQXTUN, SQXTUN2", "01111110zz100001001010nnnnnddddd") -INST(UQXTN_1, "UQXTN, UQXTN2", "01111110zz100001010010nnnnnddddd") -INST(FCVTXN_1, "FCVTXN, FCVTXN2", "011111100z100001011010nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Scalar pairwise -INST(ADDP_pair, "ADDP (scalar)", "01011110zz110001101110nnnnnddddd") -//INST(FMAXNMP_pair_1, "FMAXNMP (scalar)", "0101111000110000110010nnnnnddddd") -INST(FMAXNMP_pair_2, "FMAXNMP (scalar)", "011111100z110000110010nnnnnddddd") -//INST(FADDP_pair_1, "FADDP (scalar)", "0101111000110000110110nnnnnddddd") -INST(FADDP_pair_2, "FADDP (scalar)", "011111100z110000110110nnnnnddddd") -//INST(FMAXP_pair_1, "FMAXP (scalar)", "0101111000110000111110nnnnnddddd") -INST(FMAXP_pair_2, "FMAXP (scalar)", "011111100z110000111110nnnnnddddd") -//INST(FMINNMP_pair_1, "FMINNMP (scalar)", "0101111010110000110010nnnnnddddd") -INST(FMINNMP_pair_2, "FMINNMP (scalar)", "011111101z110000110010nnnnnddddd") -//INST(FMINP_pair_1, "FMINP (scalar)", "0101111010110000111110nnnnnddddd") -INST(FMINP_pair_2, "FMINP (scalar)", "011111101z110000111110nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Scalar three different -//INST(SQDMLAL_vec_1, "SQDMLAL, SQDMLAL2 (vector)", "01011110zz1mmmmm100100nnnnnddddd") -//INST(SQDMLSL_vec_1, "SQDMLSL, SQDMLSL2 (vector)", "01011110zz1mmmmm101100nnnnnddddd") -//INST(SQDMULL_vec_1, "SQDMULL, SQDMULL2 (vector)", "01011110zz1mmmmm110100nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Scalar three same -INST(SQADD_1, "SQADD", "01011110zz1mmmmm000011nnnnnddddd") -INST(SQSUB_1, "SQSUB", "01011110zz1mmmmm001011nnnnnddddd") -INST(CMGT_reg_1, "CMGT (register)", "01011110zz1mmmmm001101nnnnnddddd") -INST(CMGE_reg_1, "CMGE (register)", "01011110zz1mmmmm001111nnnnnddddd") -INST(SSHL_1, "SSHL", "01011110zz1mmmmm010001nnnnnddddd") -INST(SQSHL_reg_1, "SQSHL (register)", "01011110zz1mmmmm010011nnnnnddddd") -INST(SRSHL_1, "SRSHL", "01011110zz1mmmmm010101nnnnnddddd") -//INST(SQRSHL_1, "SQRSHL", "01011110zz1mmmmm010111nnnnnddddd") -INST(ADD_1, "ADD (vector)", "01011110zz1mmmmm100001nnnnnddddd") -INST(CMTST_1, "CMTST", "01011110zz1mmmmm100011nnnnnddddd") -INST(SQDMULH_vec_1, "SQDMULH (vector)", "01011110zz1mmmmm101101nnnnnddddd") -INST(UQADD_1, "UQADD", "01111110zz1mmmmm000011nnnnnddddd") -INST(UQSUB_1, "UQSUB", "01111110zz1mmmmm001011nnnnnddddd") -INST(CMHI_1, "CMHI (register)", "01111110zz1mmmmm001101nnnnnddddd") -INST(CMHS_1, "CMHS (register)", "01111110zz1mmmmm001111nnnnnddddd") -INST(USHL_1, "USHL", "01111110zz1mmmmm010001nnnnnddddd") -INST(UQSHL_reg_1, "UQSHL (register)", "01111110zz1mmmmm010011nnnnnddddd") -INST(URSHL_1, "URSHL", "01111110zz1mmmmm010101nnnnnddddd") -//INST(UQRSHL_1, "UQRSHL", "01111110zz1mmmmm010111nnnnnddddd") -INST(SUB_1, "SUB (vector)", "01111110zz1mmmmm100001nnnnnddddd") -INST(CMEQ_reg_1, "CMEQ (register)", "01111110zz1mmmmm100011nnnnnddddd") -INST(SQRDMULH_vec_1, "SQRDMULH (vector)", "01111110zz1mmmmm101101nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Scalar shift by immediate -INST(SSHR_1, "SSHR", "010111110IIIIiii000001nnnnnddddd") -INST(SSRA_1, "SSRA", "010111110IIIIiii000101nnnnnddddd") -INST(SRSHR_1, "SRSHR", "010111110IIIIiii001001nnnnnddddd") -INST(SRSRA_1, "SRSRA", "010111110IIIIiii001101nnnnnddddd") -INST(SHL_1, "SHL", "010111110IIIIiii010101nnnnnddddd") -INST(SQSHL_imm_1, "SQSHL (immediate)", "010111110IIIIiii011101nnnnnddddd") -INST(SQSHRN_1, "SQSHRN, SQSHRN2", "010111110IIIIiii100101nnnnnddddd") -//INST(SQRSHRN_1, "SQRSHRN, SQRSHRN2", "010111110IIIIiii100111nnnnnddddd") -INST(SCVTF_fix_1, "SCVTF (vector, fixed-point)", "010111110IIIIiii111001nnnnnddddd") -INST(FCVTZS_fix_1, "FCVTZS (vector, fixed-point)", "010111110IIIIiii111111nnnnnddddd") -INST(USHR_1, "USHR", "011111110IIIIiii000001nnnnnddddd") -INST(USRA_1, "USRA", "011111110IIIIiii000101nnnnnddddd") -INST(URSHR_1, "URSHR", "011111110IIIIiii001001nnnnnddddd") -INST(URSRA_1, "URSRA", "011111110IIIIiii001101nnnnnddddd") -INST(SRI_1, "SRI", "011111110IIIIiii010001nnnnnddddd") -INST(SLI_1, "SLI", "011111110IIIIiii010101nnnnnddddd") -INST(SQSHLU_1, "SQSHLU", "011111110IIIIiii011001nnnnnddddd") -INST(UQSHL_imm_1, "UQSHL (immediate)", "011111110IIIIiii011101nnnnnddddd") -INST(SQSHRUN_1, "SQSHRUN, SQSHRUN2", "011111110IIIIiii100001nnnnnddddd") -//INST(SQRSHRUN_1, "SQRSHRUN, SQRSHRUN2", "011111110IIIIiii100011nnnnnddddd") -INST(UQSHRN_1, "UQSHRN, UQSHRN2", "011111110IIIIiii100101nnnnnddddd") -//INST(UQRSHRN_1, "UQRSHRN, UQRSHRN2", "011111110IIIIiii100111nnnnnddddd") -INST(UCVTF_fix_1, "UCVTF (vector, fixed-point)", "011111110IIIIiii111001nnnnnddddd") -INST(FCVTZU_fix_1, "FCVTZU (vector, fixed-point)", "011111110IIIIiii111111nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Scalar x indexed element -//INST(SQDMLAL_elt_1, "SQDMLAL, SQDMLAL2 (by element)", "01011111zzLMmmmm0011H0nnnnnddddd") -//INST(SQDMLSL_elt_1, "SQDMLSL, SQDMLSL2 (by element)", "01011111zzLMmmmm0111H0nnnnnddddd") -INST(SQDMULL_elt_1, "SQDMULL, SQDMULL2 (by element)", "01011111zzLMmmmm1011H0nnnnnddddd") -INST(SQDMULH_elt_1, "SQDMULH (by element)", "01011111zzLMmmmm1100H0nnnnnddddd") -INST(SQRDMULH_elt_1, "SQRDMULH (by element)", "01011111zzLMmmmm1101H0nnnnnddddd") -INST(FMLA_elt_1, "FMLA (by element)", "0101111100LMmmmm0001H0nnnnnddddd") -INST(FMLA_elt_2, "FMLA (by element)", "010111111zLMmmmm0001H0nnnnnddddd") -INST(FMLS_elt_1, "FMLS (by element)", "0101111100LMmmmm0101H0nnnnnddddd") -INST(FMLS_elt_2, "FMLS (by element)", "010111111zLMmmmm0101H0nnnnnddddd") -//INST(FMUL_elt_1, "FMUL (by element)", "0101111100LMmmmm1001H0nnnnnddddd") -INST(FMUL_elt_2, "FMUL (by element)", "010111111zLMmmmm1001H0nnnnnddddd") -//INST(SQRDMLAH_elt_1, "SQRDMLAH (by element)", "01111111zzLMmmmm1101H0nnnnnddddd") -//INST(SQRDMLSH_elt_1, "SQRDMLSH (by element)", "01111111zzLMmmmm1111H0nnnnnddddd") -//INST(FMULX_elt_1, "FMULX (by element)", "0111111100LMmmmm1001H0nnnnnddddd") -INST(FMULX_elt_2, "FMULX (by element)", "011111111zLMmmmm1001H0nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Table Lookup -INST(TBL, "TBL", "0Q001110000mmmmm0LL000nnnnnddddd") -INST(TBX, "TBX", "0Q001110000mmmmm0LL100nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Permute -INST(UZP1, "UZP1", "0Q001110zz0mmmmm000110nnnnnddddd") -INST(TRN1, "TRN1", "0Q001110zz0mmmmm001010nnnnnddddd") -INST(ZIP1, "ZIP1", "0Q001110zz0mmmmm001110nnnnnddddd") -INST(UZP2, "UZP2", "0Q001110zz0mmmmm010110nnnnnddddd") -INST(TRN2, "TRN2", "0Q001110zz0mmmmm011010nnnnnddddd") -INST(ZIP2, "ZIP2", "0Q001110zz0mmmmm011110nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Extract -INST(EXT, "EXT", "0Q101110000mmmmm0iiii0nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Copy -INST(DUP_elt_2, "DUP (element)", "0Q001110000iiiii000001nnnnnddddd") -INST(DUP_gen, "DUP (general)", "0Q001110000iiiii000011nnnnnddddd") -INST(SMOV, "SMOV", "0Q001110000iiiii001011nnnnnddddd") -INST(UMOV, "UMOV", "0Q001110000iiiii001111nnnnnddddd") -INST(INS_gen, "INS (general)", "01001110000iiiii000111nnnnnddddd") -INST(INS_elt, "INS (element)", "01101110000iiiii0iiii1nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Three same -//INST(FMULX_vec_3, "FMULX", "0Q001110010mmmmm000111nnnnnddddd") -INST(FCMEQ_reg_3, "FCMEQ (register)", "0Q001110010mmmmm001001nnnnnddddd") -INST(FRECPS_3, "FRECPS", "0Q001110010mmmmm001111nnnnnddddd") -INST(FRSQRTS_3, "FRSQRTS", "0Q001110110mmmmm001111nnnnnddddd") -//INST(FCMGE_reg_3, "FCMGE (register)", "0Q101110010mmmmm001001nnnnnddddd") -//INST(FACGE_3, "FACGE", "0Q101110010mmmmm001011nnnnnddddd") -//INST(FABD_3, "FABD", "0Q101110110mmmmm000101nnnnnddddd") -//INST(FCMGT_reg_3, "FCMGT (register)", "0Q101110110mmmmm001001nnnnnddddd") -//INST(FACGT_3, "FACGT", "0Q101110110mmmmm001011nnnnnddddd") -//INST(FMAXNM_1, "FMAXNM (vector)", "0Q001110010mmmmm000001nnnnnddddd") -INST(FMLA_vec_1, "FMLA (vector)", "0Q001110010mmmmm000011nnnnnddddd") -//INST(FADD_1, "FADD (vector)", "0Q001110010mmmmm000101nnnnnddddd") -//INST(FMAX_1, "FMAX (vector)", "0Q001110010mmmmm001101nnnnnddddd") -//INST(FMINNM_1, "FMINNM (vector)", "0Q001110110mmmmm000001nnnnnddddd") -INST(FMLS_vec_1, "FMLS (vector)", "0Q001110110mmmmm000011nnnnnddddd") -//INST(FSUB_1, "FSUB (vector)", "0Q001110110mmmmm000101nnnnnddddd") -//INST(FMIN_1, "FMIN (vector)", "0Q001110110mmmmm001101nnnnnddddd") -//INST(FMAXNMP_vec_1, "FMAXNMP (vector)", "0Q101110010mmmmm000001nnnnnddddd") -//INST(FADDP_vec_1, "FADDP (vector)", "0Q101110010mmmmm000101nnnnnddddd") -//INST(FMUL_vec_1, "FMUL (vector)", "0Q101110010mmmmm000111nnnnnddddd") -//INST(FMAXP_vec_1, "FMAXP (vector)", "0Q101110010mmmmm001101nnnnnddddd") -//INST(FDIV_1, "FDIV (vector)", "0Q101110010mmmmm001111nnnnnddddd") -//INST(FMINNMP_vec_1, "FMINNMP (vector)", "0Q101110110mmmmm000001nnnnnddddd") -//INST(FMINP_vec_1, "FMINP (vector)", "0Q101110110mmmmm001101nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Three same extra -//INST(SMMLA_vec, "SMMLA", "01001110100mmmmm101001nnnnnddddd") // v8.6 -//INST(UMMLA_vec, "UMMLA", "01101110100mmmmm101001nnnnnddddd") // v8.6 -//INST(USMMLA_vec, "USMMLA", "01001110100mmmmm101011nnnnnddddd") // v8.6 -//INST(SUDOT_element, "SUDOT (by element)", "0Q00111100LMmmmm1111H0nnnnnddddd") // v8.6 -//INST(USDOT_element, "USDOT (by_element)", "0Q00111110LMmmmm1111H0nnnnnddddd") // v8.6 -//INST(USDOT_vec, "USDOT (vector)", "0Q001110100mmmmm100111nnnnnddddd") // v8.6 -INST(SDOT_vec, "SDOT (vector)", "0Q001110zz0mmmmm100101nnnnnddddd") -INST(UDOT_vec, "UDOT (vector)", "0Q101110zz0mmmmm100101nnnnnddddd") -INST(FCMLA_vec, "FCMLA", "0Q101110zz0mmmmm110rr1nnnnnddddd") -INST(FCADD_vec, "FCADD", "0Q101110zz0mmmmm111r01nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD Two-register misc -INST(REV64_asimd, "REV64", "0Q001110zz100000000010nnnnnddddd") -INST(REV16_asimd, "REV16 (vector)", "0Q001110zz100000000110nnnnnddddd") -INST(SADDLP, "SADDLP", "0Q001110zz100000001010nnnnnddddd") -INST(SUQADD_2, "SUQADD", "0Q001110zz100000001110nnnnnddddd") -INST(CLS_asimd, "CLS (vector)", "0Q001110zz100000010010nnnnnddddd") -INST(CNT, "CNT", "0Q001110zz100000010110nnnnnddddd") -INST(SADALP, "SADALP", "0Q001110zz100000011010nnnnnddddd") -INST(SQABS_2, "SQABS", "0Q001110zz100000011110nnnnnddddd") -INST(CMGT_zero_2, "CMGT (zero)", "0Q001110zz100000100010nnnnnddddd") -INST(CMEQ_zero_2, "CMEQ (zero)", "0Q001110zz100000100110nnnnnddddd") -INST(CMLT_2, "CMLT (zero)", "0Q001110zz100000101010nnnnnddddd") -INST(ABS_2, "ABS", "0Q001110zz100000101110nnnnnddddd") -INST(XTN, "XTN, XTN2", "0Q001110zz100001001010nnnnnddddd") -INST(SQXTN_2, "SQXTN, SQXTN2", "0Q001110zz100001010010nnnnnddddd") -INST(FCVTN, "FCVTN, FCVTN2", "0Q0011100z100001011010nnnnnddddd") -INST(FCVTL, "FCVTL, FCVTL2", "0Q0011100z100001011110nnnnnddddd") -INST(FRINTN_1, "FRINTN (vector)", "0Q00111001111001100010nnnnnddddd") -INST(FRINTN_2, "FRINTN (vector)", "0Q0011100z100001100010nnnnnddddd") -INST(FRINTM_1, "FRINTM (vector)", "0Q00111001111001100110nnnnnddddd") -INST(FRINTM_2, "FRINTM (vector)", "0Q0011100z100001100110nnnnnddddd") -//INST(FCVTNS_3, "FCVTNS (vector)", "0Q00111001111001101010nnnnnddddd") -INST(FCVTNS_4, "FCVTNS (vector)", "0Q0011100z100001101010nnnnnddddd") -//INST(FCVTMS_3, "FCVTMS (vector)", "0Q00111001111001101110nnnnnddddd") -INST(FCVTMS_4, "FCVTMS (vector)", "0Q0011100z100001101110nnnnnddddd") -//INST(FCVTAS_3, "FCVTAS (vector)", "0Q00111001111001110010nnnnnddddd") -INST(FCVTAS_4, "FCVTAS (vector)", "0Q0011100z100001110010nnnnnddddd") -//INST(SCVTF_int_3, "SCVTF (vector, integer)", "0Q00111001111001110110nnnnnddddd") -INST(SCVTF_int_4, "SCVTF (vector, integer)", "0Q0011100z100001110110nnnnnddddd") -//INST(FCMGT_zero_3, "FCMGT (zero)", "0Q00111011111000110010nnnnnddddd") -INST(FCMGT_zero_4, "FCMGT (zero)", "0Q0011101z100000110010nnnnnddddd") -INST(FCMEQ_zero_3, "FCMEQ (zero)", "0Q00111011111000110110nnnnnddddd") -INST(FCMEQ_zero_4, "FCMEQ (zero)", "0Q0011101z100000110110nnnnnddddd") -//INST(FCMLT_3, "FCMLT (zero)", "0Q00111011111000111010nnnnnddddd") -INST(FCMLT_4, "FCMLT (zero)", "0Q0011101z100000111010nnnnnddddd") -INST(FABS_1, "FABS (vector)", "0Q00111011111000111110nnnnnddddd") -INST(FABS_2, "FABS (vector)", "0Q0011101z100000111110nnnnnddddd") -INST(FRINTP_1, "FRINTP (vector)", "0Q00111011111001100010nnnnnddddd") -INST(FRINTP_2, "FRINTP (vector)", "0Q0011101z100001100010nnnnnddddd") -INST(FRINTZ_1, "FRINTZ (vector)", "0Q00111011111001100110nnnnnddddd") -INST(FRINTZ_2, "FRINTZ (vector)", "0Q0011101z100001100110nnnnnddddd") -//INST(FCVTPS_3, "FCVTPS (vector)", "0Q00111011111001101010nnnnnddddd") -INST(FCVTPS_4, "FCVTPS (vector)", "0Q0011101z100001101010nnnnnddddd") -//INST(FCVTZS_int_3, "FCVTZS (vector, integer)", "0Q00111011111001101110nnnnnddddd") -INST(FCVTZS_int_4, "FCVTZS (vector, integer)", "0Q0011101z100001101110nnnnnddddd") -INST(URECPE, "URECPE", "0Q0011101z100001110010nnnnnddddd") -INST(FRECPE_3, "FRECPE", "0Q00111011111001110110nnnnnddddd") -INST(FRECPE_4, "FRECPE", "0Q0011101z100001110110nnnnnddddd") -INST(REV32_asimd, "REV32 (vector)", "0Q101110zz100000000010nnnnnddddd") -INST(UADDLP, "UADDLP", "0Q101110zz100000001010nnnnnddddd") -INST(USQADD_2, "USQADD", "0Q101110zz100000001110nnnnnddddd") -INST(CLZ_asimd, "CLZ (vector)", "0Q101110zz100000010010nnnnnddddd") -INST(UADALP, "UADALP", "0Q101110zz100000011010nnnnnddddd") -INST(SQNEG_2, "SQNEG", "0Q101110zz100000011110nnnnnddddd") -INST(CMGE_zero_2, "CMGE (zero)", "0Q101110zz100000100010nnnnnddddd") -INST(CMLE_2, "CMLE (zero)", "0Q101110zz100000100110nnnnnddddd") -INST(NEG_2, "NEG (vector)", "0Q101110zz100000101110nnnnnddddd") -INST(SQXTUN_2, "SQXTUN, SQXTUN2", "0Q101110zz100001001010nnnnnddddd") -INST(SHLL, "SHLL, SHLL2", "0Q101110zz100001001110nnnnnddddd") -INST(UQXTN_2, "UQXTN, UQXTN2", "0Q101110zz100001010010nnnnnddddd") -INST(FCVTXN_2, "FCVTXN, FCVTXN2", "0Q1011100z100001011010nnnnnddddd") -INST(FRINTA_1, "FRINTA (vector)", "0Q10111001111001100010nnnnnddddd") -INST(FRINTA_2, "FRINTA (vector)", "0Q1011100z100001100010nnnnnddddd") -INST(FRINTX_1, "FRINTX (vector)", "0Q10111001111001100110nnnnnddddd") -INST(FRINTX_2, "FRINTX (vector)", "0Q1011100z100001100110nnnnnddddd") -//INST(FCVTNU_3, "FCVTNU (vector)", "0Q10111001111001101010nnnnnddddd") -INST(FCVTNU_4, "FCVTNU (vector)", "0Q1011100z100001101010nnnnnddddd") -//INST(FCVTMU_3, "FCVTMU (vector)", "0Q10111001111001101110nnnnnddddd") -INST(FCVTMU_4, "FCVTMU (vector)", "0Q1011100z100001101110nnnnnddddd") -//INST(FCVTAU_3, "FCVTAU (vector)", "0Q10111001111001110010nnnnnddddd") -INST(FCVTAU_4, "FCVTAU (vector)", "0Q1011100z100001110010nnnnnddddd") -//INST(UCVTF_int_3, "UCVTF (vector, integer)", "0Q10111001111001110110nnnnnddddd") -INST(UCVTF_int_4, "UCVTF (vector, integer)", "0Q1011100z100001110110nnnnnddddd") -INST(NOT, "NOT", "0Q10111000100000010110nnnnnddddd") -INST(RBIT_asimd, "RBIT (vector)", "0Q10111001100000010110nnnnnddddd") -INST(FNEG_1, "FNEG (vector)", "0Q10111011111000111110nnnnnddddd") -INST(FNEG_2, "FNEG (vector)", "0Q1011101z100000111110nnnnnddddd") -INST(FRINTI_1, "FRINTI (vector)", "0Q10111011111001100110nnnnnddddd") -INST(FRINTI_2, "FRINTI (vector)", "0Q1011101z100001100110nnnnnddddd") -//INST(FCMGE_zero_3, "FCMGE (zero)", "0Q10111011111000110010nnnnnddddd") -INST(FCMGE_zero_4, "FCMGE (zero)", "0Q1011101z100000110010nnnnnddddd") -//INST(FCMLE_3, "FCMLE (zero)", "0Q10111011111000110110nnnnnddddd") -INST(FCMLE_4, "FCMLE (zero)", "0Q1011101z100000110110nnnnnddddd") -//INST(FCVTPU_3, "FCVTPU (vector)", "0Q10111011111001101010nnnnnddddd") -INST(FCVTPU_4, "FCVTPU (vector)", "0Q1011101z100001101010nnnnnddddd") -//INST(FCVTZU_int_3, "FCVTZU (vector, integer)", "0Q10111011111001101110nnnnnddddd") -INST(FCVTZU_int_4, "FCVTZU (vector, integer)", "0Q1011101z100001101110nnnnnddddd") -INST(URSQRTE, "URSQRTE", "0Q1011101z100001110010nnnnnddddd") -INST(FRSQRTE_3, "FRSQRTE", "0Q10111011111001110110nnnnnddddd") -INST(FRSQRTE_4, "FRSQRTE", "0Q1011101z100001110110nnnnnddddd") -//INST(FSQRT_1, "FSQRT (vector)", "0Q10111011111001111110nnnnnddddd") -INST(FSQRT_2, "FSQRT (vector)", "0Q1011101z100001111110nnnnnddddd") -//INST(FRINT32X_1, "FRINT32X (vector)", "0Q1011100z100001111110nnnnnddddd") // ARMv8.5 -//INST(FRINT64X_1, "FRINT64X (vector)", "0Q1011100z100001111010nnnnnddddd") // ARMv8.5 -//INST(FRINT32Z_1, "FRINT32Z (vector)", "0Q0011100z100001111010nnnnnddddd") // ARMv8.5 -//INST(FRINT64Z_1, "FRINT64Z (vector)", "0Q0011100z100001111110nnnnnddddd") // ARMv8.5 - -// Data Processing - FP and SIMD - SIMD across lanes -INST(SADDLV, "SADDLV", "0Q001110zz110000001110nnnnnddddd") -INST(SMAXV, "SMAXV", "0Q001110zz110000101010nnnnnddddd") -INST(SMINV, "SMINV", "0Q001110zz110001101010nnnnnddddd") -INST(ADDV, "ADDV", "0Q001110zz110001101110nnnnnddddd") -//INST(FMAXNMV_1, "FMAXNMV", "0Q00111000110000110010nnnnnddddd") -INST(FMAXNMV_2, "FMAXNMV", "0Q1011100z110000110010nnnnnddddd") -//INST(FMAXV_1, "FMAXV", "0Q00111000110000111110nnnnnddddd") -INST(FMAXV_2, "FMAXV", "0Q1011100z110000111110nnnnnddddd") -//INST(FMINNMV_1, "FMINNMV", "0Q00111010110000110010nnnnnddddd") -INST(FMINNMV_2, "FMINNMV", "0Q1011101z110000110010nnnnnddddd") -//INST(FMINV_1, "FMINV", "0Q00111010110000111110nnnnnddddd") -INST(FMINV_2, "FMINV", "0Q1011101z110000111110nnnnnddddd") -INST(UADDLV, "UADDLV", "0Q101110zz110000001110nnnnnddddd") -INST(UMAXV, "UMAXV", "0Q101110zz110000101010nnnnnddddd") -INST(UMINV, "UMINV", "0Q101110zz110001101010nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD three different -INST(SADDL, "SADDL, SADDL2", "0Q001110zz1mmmmm000000nnnnnddddd") -INST(SADDW, "SADDW, SADDW2", "0Q001110zz1mmmmm000100nnnnnddddd") -INST(SSUBL, "SSUBL, SSUBL2", "0Q001110zz1mmmmm001000nnnnnddddd") -INST(SSUBW, "SSUBW, SSUBW2", "0Q001110zz1mmmmm001100nnnnnddddd") -INST(ADDHN, "ADDHN, ADDHN2", "0Q001110zz1mmmmm010000nnnnnddddd") -INST(SABAL, "SABAL, SABAL2", "0Q001110zz1mmmmm010100nnnnnddddd") -INST(SUBHN, "SUBHN, SUBHN2", "0Q001110zz1mmmmm011000nnnnnddddd") -INST(SABDL, "SABDL, SABDL2", "0Q001110zz1mmmmm011100nnnnnddddd") -INST(SMLAL_vec, "SMLAL, SMLAL2 (vector)", "0Q001110zz1mmmmm100000nnnnnddddd") -INST(SMLSL_vec, "SMLSL, SMLSL2 (vector)", "0Q001110zz1mmmmm101000nnnnnddddd") -INST(SMULL_vec, "SMULL, SMULL2 (vector)", "0Q001110zz1mmmmm110000nnnnnddddd") -INST(PMULL, "PMULL, PMULL2", "0Q001110zz1mmmmm111000nnnnnddddd") -INST(UADDL, "UADDL, UADDL2", "0Q101110zz1mmmmm000000nnnnnddddd") -INST(UADDW, "UADDW, UADDW2", "0Q101110zz1mmmmm000100nnnnnddddd") -INST(USUBL, "USUBL, USUBL2", "0Q101110zz1mmmmm001000nnnnnddddd") -INST(USUBW, "USUBW, USUBW2", "0Q101110zz1mmmmm001100nnnnnddddd") -INST(RADDHN, "RADDHN, RADDHN2", "0Q101110zz1mmmmm010000nnnnnddddd") -INST(UABAL, "UABAL, UABAL2", "0Q101110zz1mmmmm010100nnnnnddddd") -INST(RSUBHN, "RSUBHN, RSUBHN2", "0Q101110zz1mmmmm011000nnnnnddddd") -INST(UABDL, "UABDL, UABDL2", "0Q101110zz1mmmmm011100nnnnnddddd") -INST(UMLAL_vec, "UMLAL, UMLAL2 (vector)", "0Q101110zz1mmmmm100000nnnnnddddd") -INST(UMLSL_vec, "UMLSL, UMLSL2 (vector)", "0Q101110zz1mmmmm101000nnnnnddddd") -INST(UMULL_vec, "UMULL, UMULL2 (vector)", "0Q101110zz1mmmmm110000nnnnnddddd") -//INST(SQDMLAL_vec_2, "SQDMLAL, SQDMLAL2 (vector)", "0Q001110zz1mmmmm100100nnnnnddddd") -//INST(SQDMLSL_vec_2, "SQDMLSL, SQDMLSL2 (vector)", "0Q001110zz1mmmmm101100nnnnnddddd") -INST(SQDMULL_vec_2, "SQDMULL, SQDMULL2 (vector)", "0Q001110zz1mmmmm110100nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD three same -INST(SHADD, "SHADD", "0Q001110zz1mmmmm000001nnnnnddddd") -INST(SQADD_2, "SQADD", "0Q001110zz1mmmmm000011nnnnnddddd") -INST(SRHADD, "SRHADD", "0Q001110zz1mmmmm000101nnnnnddddd") -INST(SHSUB, "SHSUB", "0Q001110zz1mmmmm001001nnnnnddddd") -INST(SQSUB_2, "SQSUB", "0Q001110zz1mmmmm001011nnnnnddddd") -INST(CMGT_reg_2, "CMGT (register)", "0Q001110zz1mmmmm001101nnnnnddddd") -INST(CMGE_reg_2, "CMGE (register)", "0Q001110zz1mmmmm001111nnnnnddddd") -INST(SSHL_2, "SSHL", "0Q001110zz1mmmmm010001nnnnnddddd") -INST(SQSHL_reg_2, "SQSHL (register)", "0Q001110zz1mmmmm010011nnnnnddddd") -INST(SRSHL_2, "SRSHL", "0Q001110zz1mmmmm010101nnnnnddddd") -//INST(SQRSHL_2, "SQRSHL", "0Q001110zz1mmmmm010111nnnnnddddd") -INST(SMAX, "SMAX", "0Q001110zz1mmmmm011001nnnnnddddd") -INST(SMIN, "SMIN", "0Q001110zz1mmmmm011011nnnnnddddd") -INST(SABD, "SABD", "0Q001110zz1mmmmm011101nnnnnddddd") -INST(SABA, "SABA", "0Q001110zz1mmmmm011111nnnnnddddd") -INST(ADD_vector, "ADD (vector)", "0Q001110zz1mmmmm100001nnnnnddddd") -INST(CMTST_2, "CMTST", "0Q001110zz1mmmmm100011nnnnnddddd") -INST(MLA_vec, "MLA (vector)", "0Q001110zz1mmmmm100101nnnnnddddd") -INST(MUL_vec, "MUL (vector)", "0Q001110zz1mmmmm100111nnnnnddddd") -INST(SMAXP, "SMAXP", "0Q001110zz1mmmmm101001nnnnnddddd") -INST(SMINP, "SMINP", "0Q001110zz1mmmmm101011nnnnnddddd") -INST(SQDMULH_vec_2, "SQDMULH (vector)", "0Q001110zz1mmmmm101101nnnnnddddd") -INST(ADDP_vec, "ADDP (vector)", "0Q001110zz1mmmmm101111nnnnnddddd") -INST(FMAXNM_2, "FMAXNM (vector)", "0Q0011100z1mmmmm110001nnnnnddddd") -INST(FMLA_vec_2, "FMLA (vector)", "0Q0011100z1mmmmm110011nnnnnddddd") -INST(FADD_2, "FADD (vector)", "0Q0011100z1mmmmm110101nnnnnddddd") -INST(FMAX_2, "FMAX (vector)", "0Q0011100z1mmmmm111101nnnnnddddd") -INST(FMULX_vec_4, "FMULX", "0Q0011100z1mmmmm110111nnnnnddddd") -INST(FCMEQ_reg_4, "FCMEQ (register)", "0Q0011100z1mmmmm111001nnnnnddddd") -//INST(FMLAL_vec_1, "FMLAL, FMLAL2 (vector)", "0Q0011100z1mmmmm111011nnnnnddddd") -INST(FRECPS_4, "FRECPS", "0Q0011100z1mmmmm111111nnnnnddddd") -INST(AND_asimd, "AND (vector)", "0Q001110001mmmmm000111nnnnnddddd") -INST(BIC_asimd_reg, "BIC (vector, register)", "0Q001110011mmmmm000111nnnnnddddd") -INST(FMINNM_2, "FMINNM (vector)", "0Q0011101z1mmmmm110001nnnnnddddd") -INST(FMLS_vec_2, "FMLS (vector)", "0Q0011101z1mmmmm110011nnnnnddddd") -INST(FSUB_2, "FSUB (vector)", "0Q0011101z1mmmmm110101nnnnnddddd") -//INST(FMLSL_vec_1, "FMLSL, FMLSL2 (vector)", "0Q0011101z1mmmmm111011nnnnnddddd") -INST(FMIN_2, "FMIN (vector)", "0Q0011101z1mmmmm111101nnnnnddddd") -INST(FRSQRTS_4, "FRSQRTS", "0Q0011101z1mmmmm111111nnnnnddddd") -INST(ORR_asimd_reg, "ORR (vector, register)", "0Q001110101mmmmm000111nnnnnddddd") -INST(ORN_asimd, "ORN (vector)", "0Q001110111mmmmm000111nnnnnddddd") -INST(UHADD, "UHADD", "0Q101110zz1mmmmm000001nnnnnddddd") -INST(UQADD_2, "UQADD", "0Q101110zz1mmmmm000011nnnnnddddd") -INST(URHADD, "URHADD", "0Q101110zz1mmmmm000101nnnnnddddd") -INST(UHSUB, "UHSUB", "0Q101110zz1mmmmm001001nnnnnddddd") -INST(UQSUB_2, "UQSUB", "0Q101110zz1mmmmm001011nnnnnddddd") -INST(CMHI_2, "CMHI (register)", "0Q101110zz1mmmmm001101nnnnnddddd") -INST(CMHS_2, "CMHS (register)", "0Q101110zz1mmmmm001111nnnnnddddd") -INST(USHL_2, "USHL", "0Q101110zz1mmmmm010001nnnnnddddd") -INST(UQSHL_reg_2, "UQSHL (register)", "0Q101110zz1mmmmm010011nnnnnddddd") -INST(URSHL_2, "URSHL", "0Q101110zz1mmmmm010101nnnnnddddd") -//INST(UQRSHL_2, "UQRSHL", "0Q101110zz1mmmmm010111nnnnnddddd") -INST(UMAX, "UMAX", "0Q101110zz1mmmmm011001nnnnnddddd") -INST(UMIN, "UMIN", "0Q101110zz1mmmmm011011nnnnnddddd") -INST(UABD, "UABD", "0Q101110zz1mmmmm011101nnnnnddddd") -INST(UABA, "UABA", "0Q101110zz1mmmmm011111nnnnnddddd") -INST(SUB_2, "SUB (vector)", "0Q101110zz1mmmmm100001nnnnnddddd") -INST(CMEQ_reg_2, "CMEQ (register)", "0Q101110zz1mmmmm100011nnnnnddddd") -INST(MLS_vec, "MLS (vector)", "0Q101110zz1mmmmm100101nnnnnddddd") -INST(PMUL, "PMUL", "0Q101110zz1mmmmm100111nnnnnddddd") -INST(UMAXP, "UMAXP", "0Q101110zz1mmmmm101001nnnnnddddd") -INST(UMINP, "UMINP", "0Q101110zz1mmmmm101011nnnnnddddd") -INST(SQRDMULH_vec_2, "SQRDMULH (vector)", "0Q101110zz1mmmmm101101nnnnnddddd") -INST(FMAXNMP_vec_2, "FMAXNMP (vector)", "0Q1011100z1mmmmm110001nnnnnddddd") -//INST(FMLAL_vec_2, "FMLAL, FMLAL2 (vector)", "0Q1011100z1mmmmm110011nnnnnddddd") -INST(FADDP_vec_2, "FADDP (vector)", "0Q1011100z1mmmmm110101nnnnnddddd") -INST(FMUL_vec_2, "FMUL (vector)", "0Q1011100z1mmmmm110111nnnnnddddd") -INST(FCMGE_reg_4, "FCMGE (register)", "0Q1011100z1mmmmm111001nnnnnddddd") -INST(FACGE_4, "FACGE", "0Q1011100z1mmmmm111011nnnnnddddd") -INST(FMAXP_vec_2, "FMAXP (vector)", "0Q1011100z1mmmmm111101nnnnnddddd") -INST(FDIV_2, "FDIV (vector)", "0Q1011100z1mmmmm111111nnnnnddddd") -INST(EOR_asimd, "EOR (vector)", "0Q101110001mmmmm000111nnnnnddddd") -INST(BSL, "BSL", "0Q101110011mmmmm000111nnnnnddddd") -INST(FMINNMP_vec_2, "FMINNMP (vector)", "0Q1011101z1mmmmm110001nnnnnddddd") -//INST(FMLSL_vec_2, "FMLSL, FMLSL2 (vector)", "0Q1011101z1mmmmm110011nnnnnddddd") -INST(FABD_4, "FABD", "0Q1011101z1mmmmm110101nnnnnddddd") -INST(FCMGT_reg_4, "FCMGT (register)", "0Q1011101z1mmmmm111001nnnnnddddd") -INST(FACGT_4, "FACGT", "0Q1011101z1mmmmm111011nnnnnddddd") -INST(FMINP_vec_2, "FMINP (vector)", "0Q1011101z1mmmmm111101nnnnnddddd") -INST(BIT, "BIT", "0Q101110101mmmmm000111nnnnnddddd") -INST(BIF, "BIF", "0Q101110111mmmmm000111nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD modified immediate -INST(MOVI, "MOVI, MVNI, ORR, BIC (vector, immediate)", "0Qo0111100000abcmmmm01defghddddd") -INST(FMOV_2, "FMOV (vector, immediate)", "0Qo0111100000abc111101defghddddd") -INST(FMOV_3, "FMOV (vector, immediate)", "0Q00111100000abc111111defghddddd") -INST(UnallocatedEncoding, "Unallocated SIMD modified immediate", "0--0111100000-------11----------") - -// Data Processing - FP and SIMD - SIMD Shift by immediate -INST(SSHR_2, "SSHR", "0Q0011110IIIIiii000001nnnnnddddd") -INST(SSRA_2, "SSRA", "0Q0011110IIIIiii000101nnnnnddddd") -INST(SRSHR_2, "SRSHR", "0Q0011110IIIIiii001001nnnnnddddd") -INST(SRSRA_2, "SRSRA", "0Q0011110IIIIiii001101nnnnnddddd") -INST(SHL_2, "SHL", "0Q0011110IIIIiii010101nnnnnddddd") -INST(SQSHL_imm_2, "SQSHL (immediate)", "0Q0011110IIIIiii011101nnnnnddddd") -INST(SHRN, "SHRN, SHRN2", "0Q0011110IIIIiii100001nnnnnddddd") -INST(RSHRN, "RSHRN, RSHRN2", "0Q0011110IIIIiii100011nnnnnddddd") -INST(SQSHRN_2, "SQSHRN, SQSHRN2", "0Q0011110IIIIiii100101nnnnnddddd") -INST(SQRSHRN_2, "SQRSHRN, SQRSHRN2", "0Q0011110IIIIiii100111nnnnnddddd") -INST(SSHLL, "SSHLL, SSHLL2", "0Q0011110IIIIiii101001nnnnnddddd") -INST(SCVTF_fix_2, "SCVTF (vector, fixed-point)", "0Q0011110IIIIiii111001nnnnnddddd") -INST(FCVTZS_fix_2, "FCVTZS (vector, fixed-point)", "0Q0011110IIIIiii111111nnnnnddddd") -INST(USHR_2, "USHR", "0Q1011110IIIIiii000001nnnnnddddd") -INST(USRA_2, "USRA", "0Q1011110IIIIiii000101nnnnnddddd") -INST(URSHR_2, "URSHR", "0Q1011110IIIIiii001001nnnnnddddd") -INST(URSRA_2, "URSRA", "0Q1011110IIIIiii001101nnnnnddddd") -INST(SRI_2, "SRI", "0Q1011110IIIIiii010001nnnnnddddd") -INST(SLI_2, "SLI", "0Q1011110IIIIiii010101nnnnnddddd") -INST(SQSHLU_2, "SQSHLU", "0Q1011110IIIIiii011001nnnnnddddd") -INST(UQSHL_imm_2, "UQSHL (immediate)", "0Q1011110IIIIiii011101nnnnnddddd") -INST(SQSHRUN_2, "SQSHRUN, SQSHRUN2", "0Q1011110IIIIiii100001nnnnnddddd") -INST(SQRSHRUN_2, "SQRSHRUN, SQRSHRUN2", "0Q1011110IIIIiii100011nnnnnddddd") -INST(UQSHRN_2, "UQSHRN, UQSHRN2", "0Q1011110IIIIiii100101nnnnnddddd") -INST(UQRSHRN_2, "UQRSHRN, UQRSHRN2", "0Q1011110IIIIiii100111nnnnnddddd") -INST(USHLL, "USHLL, USHLL2", "0Q1011110IIIIiii101001nnnnnddddd") -INST(UCVTF_fix_2, "UCVTF (vector, fixed-point)", "0Q1011110IIIIiii111001nnnnnddddd") -INST(FCVTZU_fix_2, "FCVTZU (vector, fixed-point)", "0Q1011110IIIIiii111111nnnnnddddd") - -// Data Processing - FP and SIMD - SIMD vector x indexed element -INST(SMLAL_elt, "SMLAL, SMLAL2 (by element)", "0Q001111zzLMmmmm0010H0nnnnnddddd") -//INST(SQDMLAL_elt_2, "SQDMLAL, SQDMLAL2 (by element)", "0Q001111zzLMmmmm0011H0nnnnnddddd") -INST(SMLSL_elt, "SMLSL, SMLSL2 (by element)", "0Q001111zzLMmmmm0110H0nnnnnddddd") -//INST(SQDMLSL_elt_2, "SQDMLSL, SQDMLSL2 (by element)", "0Q001111zzLMmmmm0111H0nnnnnddddd") -INST(MUL_elt, "MUL (by element)", "0Q001111zzLMmmmm1000H0nnnnnddddd") -INST(SMULL_elt, "SMULL, SMULL2 (by element)", "0Q001111zzLMmmmm1010H0nnnnnddddd") -INST(SQDMULL_elt_2, "SQDMULL, SQDMULL2 (by element)", "0Q001111zzLMmmmm1011H0nnnnnddddd") -INST(SQDMULH_elt_2, "SQDMULH (by element)", "0Q001111zzLMmmmm1100H0nnnnnddddd") -INST(SQRDMULH_elt_2, "SQRDMULH (by element)", "0Q001111zzLMmmmm1101H0nnnnnddddd") -INST(SDOT_elt, "SDOT (by element)", "0Q001111zzLMmmmm1110H0nnnnnddddd") -INST(FMLA_elt_3, "FMLA (by element)", "0Q00111100LMmmmm0001H0nnnnnddddd") -INST(FMLA_elt_4, "FMLA (by element)", "0Q0011111zLMmmmm0001H0nnnnnddddd") -INST(FMLS_elt_3, "FMLS (by element)", "0Q00111100LMmmmm0101H0nnnnnddddd") -INST(FMLS_elt_4, "FMLS (by element)", "0Q0011111zLMmmmm0101H0nnnnnddddd") -//INST(FMUL_elt_3, "FMUL (by element)", "0Q00111100LMmmmm1001H0nnnnnddddd") -INST(FMUL_elt_4, "FMUL (by element)", "0Q0011111zLMmmmm1001H0nnnnnddddd") -//INST(FMLAL_elt_1, "FMLAL, FMLAL2 (by element)", "0Q0011111zLMmmmm0000H0nnnnnddddd") -//INST(FMLAL_elt_2, "FMLAL, FMLAL2 (by element)", "0Q1011111zLMmmmm1000H0nnnnnddddd") -//INST(FMLSL_elt_1, "FMLSL, FMLSL2 (by element)", "0Q0011111zLMmmmm0100H0nnnnnddddd") -//INST(FMLSL_elt_2, "FMLSL, FMLSL2 (by element)", "0Q1011111zLMmmmm1100H0nnnnnddddd") -INST(MLA_elt, "MLA (by element)", "0Q101111zzLMmmmm0000H0nnnnnddddd") -INST(UMLAL_elt, "UMLAL, UMLAL2 (by element)", "0Q101111zzLMmmmm0010H0nnnnnddddd") -INST(MLS_elt, "MLS (by element)", "0Q101111zzLMmmmm0100H0nnnnnddddd") -INST(UMLSL_elt, "UMLSL, UMLSL2 (by element)", "0Q101111zzLMmmmm0110H0nnnnnddddd") -INST(UMULL_elt, "UMULL, UMULL2 (by element)", "0Q101111zzLMmmmm1010H0nnnnnddddd") -//INST(SQRDMLAH_elt_2, "SQRDMLAH (by element)", "0Q101111zzLMmmmm1101H0nnnnnddddd") -INST(UDOT_elt, "UDOT (by element)", "0Q101111zzLMmmmm1110H0nnnnnddddd") -//INST(SQRDMLSH_elt_2, "SQRDMLSH (by element)", "0Q101111zzLMmmmm1111H0nnnnnddddd") -//INST(FMULX_elt_3, "FMULX (by element)", "0Q10111100LMmmmm1001H0nnnnnddddd") -INST(FMULX_elt_4, "FMULX (by element)", "0Q1011111zLMmmmm1001H0nnnnnddddd") -INST(FCMLA_elt, "FCMLA (by element)", "0Q101111zzLMmmmm0rr1H0nnnnnddddd") - -// Data Processing - FP and SIMD - Cryptographic three register -INST(SM3TT1A, "SM3TT1A", "11001110010mmmmm10ii00nnnnnddddd") -INST(SM3TT1B, "SM3TT1B", "11001110010mmmmm10ii01nnnnnddddd") -INST(SM3TT2A, "SM3TT2A", "11001110010mmmmm10ii10nnnnnddddd") -INST(SM3TT2B, "SM3TT2B", "11001110010mmmmm10ii11nnnnnddddd") - -// Data Processing - FP and SIMD - SHA512 three register -INST(SHA512H, "SHA512H", "11001110011mmmmm100000nnnnnddddd") -INST(SHA512H2, "SHA512H2", "11001110011mmmmm100001nnnnnddddd") -INST(SHA512SU1, "SHA512SU1", "11001110011mmmmm100010nnnnnddddd") -INST(RAX1, "RAX1", "11001110011mmmmm100011nnnnnddddd") -INST(SM3PARTW1, "SM3PARTW1", "11001110011mmmmm110000nnnnnddddd") -INST(SM3PARTW2, "SM3PARTW2", "11001110011mmmmm110001nnnnnddddd") -INST(SM4EKEY, "SM4EKEY", "11001110011mmmmm110010nnnnnddddd") -INST(XAR, "XAR", "11001110100mmmmmiiiiiinnnnnddddd") - -// Data Processing - FP and SIMD - Cryptographic four register -INST(EOR3, "EOR3", "11001110000mmmmm0aaaaannnnnddddd") -INST(BCAX, "BCAX", "11001110001mmmmm0aaaaannnnnddddd") -INST(SM3SS1, "SM3SS1", "11001110010mmmmm0aaaaannnnnddddd") - -// Data Processing - FP and SIMD - SHA512 two register -INST(SHA512SU0, "SHA512SU0", "1100111011000000100000nnnnnddddd") -INST(SM4E, "SM4E", "1100111011000000100001nnnnnddddd") - -// Data Processing - FP and SIMD - Conversion between floating point and fixed point -INST(SCVTF_float_fix, "SCVTF (scalar, fixed-point)", "z0011110yy000010ppppppnnnnnddddd") -INST(UCVTF_float_fix, "UCVTF (scalar, fixed-point)", "z0011110yy000011ppppppnnnnnddddd") -INST(FCVTZS_float_fix, "FCVTZS (scalar, fixed-point)", "z0011110yy011000ppppppnnnnnddddd") -INST(FCVTZU_float_fix, "FCVTZU (scalar, fixed-point)", "z0011110yy011001ppppppnnnnnddddd") - -// Data Processing - FP and SIMD - Conversion between floating point and integer -INST(FCVTNS_float, "FCVTNS (scalar)", "z0011110yy100000000000nnnnnddddd") -INST(FCVTNU_float, "FCVTNU (scalar)", "z0011110yy100001000000nnnnnddddd") -INST(SCVTF_float_int, "SCVTF (scalar, integer)", "z0011110yy100010000000nnnnnddddd") -INST(UCVTF_float_int, "UCVTF (scalar, integer)", "z0011110yy100011000000nnnnnddddd") -INST(FCVTAS_float, "FCVTAS (scalar)", "z0011110yy100100000000nnnnnddddd") -INST(FCVTAU_float, "FCVTAU (scalar)", "z0011110yy100101000000nnnnnddddd") -INST(FMOV_float_gen, "FMOV (general)", "z0011110yy10r11o000000nnnnnddddd") -INST(FCVTPS_float, "FCVTPS (scalar)", "z0011110yy101000000000nnnnnddddd") -INST(FCVTPU_float, "FCVTPU (scalar)", "z0011110yy101001000000nnnnnddddd") -INST(FCVTMS_float, "FCVTMS (scalar)", "z0011110yy110000000000nnnnnddddd") -INST(FCVTMU_float, "FCVTMU (scalar)", "z0011110yy110001000000nnnnnddddd") -INST(FCVTZS_float_int, "FCVTZS (scalar, integer)", "z0011110yy111000000000nnnnnddddd") -INST(FCVTZU_float_int, "FCVTZU (scalar, integer)", "z0011110yy111001000000nnnnnddddd") -//INST(FJCVTZS, "FJCVTZS", "0001111001111110000000nnnnnddddd") - -// Data Processing - FP and SIMD - Floating point data processing -INST(FMOV_float, "FMOV (register)", "00011110yy100000010000nnnnnddddd") -INST(FABS_float, "FABS (scalar)", "00011110yy100000110000nnnnnddddd") -INST(FNEG_float, "FNEG (scalar)", "00011110yy100001010000nnnnnddddd") -INST(FSQRT_float, "FSQRT (scalar)", "00011110yy100001110000nnnnnddddd") -INST(FCVT_float, "FCVT", "00011110yy10001oo10000nnnnnddddd") -INST(FRINTN_float, "FRINTN (scalar)", "00011110yy100100010000nnnnnddddd") -INST(FRINTP_float, "FRINTP (scalar)", "00011110yy100100110000nnnnnddddd") -INST(FRINTM_float, "FRINTM (scalar)", "00011110yy100101010000nnnnnddddd") -INST(FRINTZ_float, "FRINTZ (scalar)", "00011110yy100101110000nnnnnddddd") -INST(FRINTA_float, "FRINTA (scalar)", "00011110yy100110010000nnnnnddddd") -INST(FRINTX_float, "FRINTX (scalar)", "00011110yy100111010000nnnnnddddd") -INST(FRINTI_float, "FRINTI (scalar)", "00011110yy100111110000nnnnnddddd") -//INST(FRINT32X_float, "FRINT32X (scalar)", "00011110yy101000110000nnnnnddddd") // ARMv8.5 -//INST(FRINT64X_float, "FRINT64X (scalar)", "00011110yy101001110000nnnnnddddd") // ARMv8.5 -//INST(FRINT32Z_float, "FRINT32Z (scalar)", "00011110yy101000010000nnnnnddddd") // ARMv8.5 -//INST(FRINT64Z_float, "FRINT64Z (scalar)", "00011110yy101001010000nnnnnddddd") // ARMv8.5 - -// Data Processing - FP and SIMD - Floating point compare -INST(FCMP_float, "FCMP", "00011110yy1mmmmm001000nnnnn0o000") -INST(FCMPE_float, "FCMPE", "00011110yy1mmmmm001000nnnnn1o000") - -// Data Processing - FP and SIMD - Floating point immediate -INST(FMOV_float_imm, "FMOV (scalar, immediate)", "00011110yy1iiiiiiii10000000ddddd") - -// Data Processing - FP and SIMD - Floating point conditional compare -INST(FCCMP_float, "FCCMP", "00011110yy1mmmmmcccc01nnnnn0ffff") -INST(FCCMPE_float, "FCCMPE", "00011110yy1mmmmmcccc01nnnnn1ffff") - -// Data Processing - FP and SIMD - Floating point data processing two register -INST(FMUL_float, "FMUL (scalar)", "00011110yy1mmmmm000010nnnnnddddd") -INST(FDIV_float, "FDIV (scalar)", "00011110yy1mmmmm000110nnnnnddddd") -INST(FADD_float, "FADD (scalar)", "00011110yy1mmmmm001010nnnnnddddd") -INST(FSUB_float, "FSUB (scalar)", "00011110yy1mmmmm001110nnnnnddddd") -INST(FMAX_float, "FMAX (scalar)", "00011110yy1mmmmm010010nnnnnddddd") -INST(FMIN_float, "FMIN (scalar)", "00011110yy1mmmmm010110nnnnnddddd") -INST(FMAXNM_float, "FMAXNM (scalar)", "00011110yy1mmmmm011010nnnnnddddd") -INST(FMINNM_float, "FMINNM (scalar)", "00011110yy1mmmmm011110nnnnnddddd") -INST(FNMUL_float, "FNMUL (scalar)", "00011110yy1mmmmm100010nnnnnddddd") - -// Data Processing - FP and SIMD - Floating point conditional select -INST(FCSEL_float, "FCSEL", "00011110yy1mmmmmcccc11nnnnnddddd") - -// Data Processing - FP and SIMD - Floating point data processing three register -INST(FMADD_float, "FMADD", "00011111yy0mmmmm0aaaaannnnnddddd") -INST(FMSUB_float, "FMSUB", "00011111yy0mmmmm1aaaaannnnnddddd") -INST(FNMADD_float, "FNMADD", "00011111yy1mmmmm0aaaaannnnnddddd") -INST(FNMSUB_float, "FNMSUB", "00011111yy1mmmmm1aaaaannnnnddddd") - -// BFloat16 -//INST(BFCVT, "BFCVT", "0001111001100011010000nnnnnddddd") // v8.6 -//INST(BFCVTN, "BFCVTN{2}", "0Q00111010100001011010nnnnnddddd") // v8.6 -//INST(BFDOT_element, "BFDOT (by element)", "0Q00111101LMmmmm1111H0nnnnnddddd") // v8.6 -//INST(BFDOT_vec, "BFDOT (vector)", "0Q101110010mmmmm111111nnnnnddddd") // v8.6 -//INST(BFMLALX_element, "BFMLALX (by element)", "0Q00111111LMmmmm1111H0nnnnnddddd") // v8.6 -//INST(BFMLALX_vector, "BFMLALX (vector)", "0Q101110110mmmmm111111nnnnnddddd") // v8.6 -//INST(BFMMLA, "BFMMLA", "01101110010mmmmm111011nnnnnddddd") // v8.6 +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later +// DO NOT REORDER + +INST(FMOV_3, "FMOV (vector, immediate)", "0Q00111100000abc111111defghddddd") +INST(FMOV_2, "FMOV (vector, immediate)", "0Qo0111100000abc111101defghddddd") +INST(MOVI, "MOVI, MVNI, ORR, BIC (vector, immediate)", "0Qo0111100000abcmmmm01defghddddd") +INST(UnallocatedEncoding, "Unallocated SIMD modified immediate", "0--0111100000-------11----------") +INST(NOP, "NOP", "11010101000000110010000000011111") +INST(YIELD, "YIELD", "11010101000000110010000000111111") +INST(WFE, "WFE", "11010101000000110010000001011111") +INST(WFI, "WFI", "11010101000000110010000001111111") +INST(SEV, "SEV", "11010101000000110010000010011111") +INST(SEVL, "SEVL", "11010101000000110010000010111111") +INST(CFINV, "CFINV", "11010101000000000100000000011111") +INST(XAFlag, "XAFlag", "11010101000000000100000000111111") +INST(AXFlag, "AXFlag", "11010101000000000100000001011111") +INST(IC_IALLU, "IC IALLU", "11010101000010000111010100011111") +INST(IC_IALLUIS, "IC IALLUIS", "11010101000010000111000100011111") +INST(CLREX, "CLREX", "11010101000000110011MMMM01011111") +INST(DSB, "DSB", "11010101000000110011MMMM10011111") +INST(DMB, "DMB", "11010101000000110011MMMM10111111") +INST(ISB, "ISB", "11010101000000110011MMMM11011111") +INST(DC_IVAC, "DC IVAC", "110101010000100001110110001ttttt") +INST(DC_ISW, "DC ISW", "110101010000100001110110010ttttt") +INST(DC_CSW, "DC CSW", "110101010000100001111010010ttttt") +INST(DC_CISW, "DC CISW", "110101010000100001111110010ttttt") +INST(DC_ZVA, "DC ZVA", "110101010000101101110100001ttttt") +INST(DC_CVAC, "DC CVAC", "110101010000101101111010001ttttt") +INST(DC_CVAU, "DC CVAU", "110101010000101101111011001ttttt") +INST(DC_CVAP, "DC CVAP", "110101010000101101111100001ttttt") +INST(DC_CIVAC, "DC CIVAC", "110101010000101101111110001ttttt") +INST(IC_IVAU, "IC IVAU", "110101010000101101110101001ttttt") +INST(BLR, "BLR", "1101011000111111000000nnnnn00000") +INST(BR, "BR", "1101011000011111000000nnnnn00000") +INST(RET, "RET", "1101011001011111000000nnnnn00000") +INST(HINT, "HINT", "11010101000000110010MMMMooo11111") +INST(SXTB_1, "SXTB (32-bit)", "0001001100000000000111nnnnnddddd") +INST(SXTB_2, "SXTB (64-bit)", "1001001101000000000111nnnnnddddd") +INST(SXTH_1, "SXTH (32-bit)", "0001001100000000001111nnnnnddddd") +INST(SXTH_2, "SXTH (64-bit)", "1001001101000000001111nnnnnddddd") +INST(SXTW, "SXTW", "1001001101000000011111nnnnnddddd") +INST(REV32_int, "REV32", "1101101011000000000010nnnnnddddd") +INST(AESE, "AESE", "0100111000101000010010nnnnnddddd") +INST(AESD, "AESD", "0100111000101000010110nnnnnddddd") +INST(AESMC, "AESMC", "0100111000101000011010nnnnnddddd") +INST(AESIMC, "AESIMC", "0100111000101000011110nnnnnddddd") +INST(SHA1H, "SHA1H", "0101111000101000000010nnnnnddddd") +INST(SHA1SU1, "SHA1SU1", "0101111000101000000110nnnnnddddd") +INST(SHA256SU0, "SHA256SU0", "0101111000101000001010nnnnnddddd") +INST(FCMEQ_zero_1, "FCMEQ (zero)", "0101111011111000110110nnnnnddddd") +INST(FRECPE_1, "FRECPE", "0101111011111001110110nnnnnddddd") +INST(FRECPX_1, "FRECPX", "0101111011111001111110nnnnnddddd") +INST(FRSQRTE_1, "FRSQRTE", "0111111011111001110110nnnnnddddd") +INST(SHA512SU0, "SHA512SU0", "1100111011000000100000nnnnnddddd") +INST(SM4E, "SM4E", "1100111011000000100001nnnnnddddd") +INST(RBIT_int, "RBIT", "z101101011000000000000nnnnnddddd") +INST(REV16_int, "REV16", "z101101011000000000001nnnnnddddd") +INST(CLZ_int, "CLZ", "z101101011000000000100nnnnnddddd") +INST(CLS_int, "CLS", "z101101011000000000101nnnnnddddd") +INST(FCVTNS_2, "FCVTNS (vector)", "010111100z100001101010nnnnnddddd") +INST(FCVTMS_2, "FCVTMS (vector)", "010111100z100001101110nnnnnddddd") +INST(FCVTAS_2, "FCVTAS (vector)", "010111100z100001110010nnnnnddddd") +INST(SCVTF_int_2, "SCVTF (vector, integer)", "010111100z100001110110nnnnnddddd") +INST(FCMGT_zero_2, "FCMGT (zero)", "010111101z100000110010nnnnnddddd") +INST(FCMEQ_zero_2, "FCMEQ (zero)", "010111101z100000110110nnnnnddddd") +INST(FCMLT_2, "FCMLT (zero)", "010111101z100000111010nnnnnddddd") +INST(FCVTPS_2, "FCVTPS (vector)", "010111101z100001101010nnnnnddddd") +INST(FCVTZS_int_2, "FCVTZS (vector, integer)", "010111101z100001101110nnnnnddddd") +INST(FRECPE_2, "FRECPE", "010111101z100001110110nnnnnddddd") +INST(FRECPX_2, "FRECPX", "010111101z100001111110nnnnnddddd") +INST(FCVTNU_2, "FCVTNU (vector)", "011111100z100001101010nnnnnddddd") +INST(FCVTMU_2, "FCVTMU (vector)", "011111100z100001101110nnnnnddddd") +INST(FCVTAU_2, "FCVTAU (vector)", "011111100z100001110010nnnnnddddd") +INST(UCVTF_int_2, "UCVTF (vector, integer)", "011111100z100001110110nnnnnddddd") +INST(FCMGE_zero_2, "FCMGE (zero)", "011111101z100000110010nnnnnddddd") +INST(FCMLE_2, "FCMLE (zero)", "011111101z100000110110nnnnnddddd") +INST(FCVTPU_2, "FCVTPU (vector)", "011111101z100001101010nnnnnddddd") +INST(FCVTZU_int_2, "FCVTZU (vector, integer)", "011111101z100001101110nnnnnddddd") +INST(FRSQRTE_2, "FRSQRTE", "011111101z100001110110nnnnnddddd") +INST(FCVTXN_1, "FCVTXN, FCVTXN2", "011111100z100001011010nnnnnddddd") +INST(FMAXNMP_pair_2, "FMAXNMP (scalar)", "011111100z110000110010nnnnnddddd") +INST(FADDP_pair_2, "FADDP (scalar)", "011111100z110000110110nnnnnddddd") +INST(FMAXP_pair_2, "FMAXP (scalar)", "011111100z110000111110nnnnnddddd") +INST(FMINNMP_pair_2, "FMINNMP (scalar)", "011111101z110000110010nnnnnddddd") +INST(FMINP_pair_2, "FMINP (scalar)", "011111101z110000111110nnnnnddddd") +INST(FRINTN_1, "FRINTN (vector)", "0Q00111001111001100010nnnnnddddd") +INST(FRINTM_1, "FRINTM (vector)", "0Q00111001111001100110nnnnnddddd") +INST(FCMEQ_zero_3, "FCMEQ (zero)", "0Q00111011111000110110nnnnnddddd") +INST(FABS_1, "FABS (vector)", "0Q00111011111000111110nnnnnddddd") +INST(FRINTP_1, "FRINTP (vector)", "0Q00111011111001100010nnnnnddddd") +INST(FRINTZ_1, "FRINTZ (vector)", "0Q00111011111001100110nnnnnddddd") +INST(FRECPE_3, "FRECPE", "0Q00111011111001110110nnnnnddddd") +INST(FRINTA_1, "FRINTA (vector)", "0Q10111001111001100010nnnnnddddd") +INST(FRINTX_1, "FRINTX (vector)", "0Q10111001111001100110nnnnnddddd") +INST(NOT, "NOT", "0Q10111000100000010110nnnnnddddd") +INST(RBIT_asimd, "RBIT (vector)", "0Q10111001100000010110nnnnnddddd") +INST(FNEG_1, "FNEG (vector)", "0Q10111011111000111110nnnnnddddd") +INST(FRINTI_1, "FRINTI (vector)", "0Q10111011111001100110nnnnnddddd") +INST(FRSQRTE_3, "FRSQRTE", "0Q10111011111001110110nnnnnddddd") +INST(LDXR, "LDXRB, LDXRH, LDXR", "zz00100001011111011111nnnnnttttt") +INST(LDAXR, "LDAXRB, LDAXRH, LDAXR", "zz00100001011111111111nnnnnttttt") +INST(STLLR, "STLLRB, STLLRH, STLLR", "zz00100010011111011111nnnnnttttt") +INST(STLR, "STLRB, STLRH, STLR", "zz00100010011111111111nnnnnttttt") +INST(LDLAR, "LDLARB, LDLARH, LDLAR", "zz00100011011111011111nnnnnttttt") +INST(LDAR, "LDARB, LDARH, LDAR", "zz00100011011111111111nnnnnttttt") +INST(REV, "REV", "z10110101100000000001onnnnnddddd") +INST(SUQADD_1, "SUQADD", "01011110zz100000001110nnnnnddddd") +INST(SQABS_1, "SQABS", "01011110zz100000011110nnnnnddddd") +INST(CMGT_zero_1, "CMGT (zero)", "01011110zz100000100010nnnnnddddd") +INST(CMEQ_zero_1, "CMEQ (zero)", "01011110zz100000100110nnnnnddddd") +INST(CMLT_1, "CMLT (zero)", "01011110zz100000101010nnnnnddddd") +INST(ABS_1, "ABS", "01011110zz100000101110nnnnnddddd") +INST(SQXTN_1, "SQXTN, SQXTN2", "01011110zz100001010010nnnnnddddd") +INST(USQADD_1, "USQADD", "01111110zz100000001110nnnnnddddd") +INST(SQNEG_1, "SQNEG", "01111110zz100000011110nnnnnddddd") +INST(CMGE_zero_1, "CMGE (zero)", "01111110zz100000100010nnnnnddddd") +INST(CMLE_1, "CMLE (zero)", "01111110zz100000100110nnnnnddddd") +INST(NEG_1, "NEG (vector)", "01111110zz100000101110nnnnnddddd") +INST(SQXTUN_1, "SQXTUN, SQXTUN2", "01111110zz100001001010nnnnnddddd") +INST(UQXTN_1, "UQXTN, UQXTN2", "01111110zz100001010010nnnnnddddd") +INST(ADDP_pair, "ADDP (scalar)", "01011110zz110001101110nnnnnddddd") +INST(FCVTN, "FCVTN, FCVTN2", "0Q0011100z100001011010nnnnnddddd") +INST(FCVTL, "FCVTL, FCVTL2", "0Q0011100z100001011110nnnnnddddd") +INST(FRINTN_2, "FRINTN (vector)", "0Q0011100z100001100010nnnnnddddd") +INST(FRINTM_2, "FRINTM (vector)", "0Q0011100z100001100110nnnnnddddd") +INST(FCVTNS_4, "FCVTNS (vector)", "0Q0011100z100001101010nnnnnddddd") +INST(FCVTMS_4, "FCVTMS (vector)", "0Q0011100z100001101110nnnnnddddd") +INST(FCVTAS_4, "FCVTAS (vector)", "0Q0011100z100001110010nnnnnddddd") +INST(SCVTF_int_4, "SCVTF (vector, integer)", "0Q0011100z100001110110nnnnnddddd") +INST(FCMGT_zero_4, "FCMGT (zero)", "0Q0011101z100000110010nnnnnddddd") +INST(FCMEQ_zero_4, "FCMEQ (zero)", "0Q0011101z100000110110nnnnnddddd") +INST(FCMLT_4, "FCMLT (zero)", "0Q0011101z100000111010nnnnnddddd") +INST(FABS_2, "FABS (vector)", "0Q0011101z100000111110nnnnnddddd") +INST(FRINTP_2, "FRINTP (vector)", "0Q0011101z100001100010nnnnnddddd") +INST(FRINTZ_2, "FRINTZ (vector)", "0Q0011101z100001100110nnnnnddddd") +INST(FCVTPS_4, "FCVTPS (vector)", "0Q0011101z100001101010nnnnnddddd") +INST(FCVTZS_int_4, "FCVTZS (vector, integer)", "0Q0011101z100001101110nnnnnddddd") +INST(URECPE, "URECPE", "0Q0011101z100001110010nnnnnddddd") +INST(FRECPE_4, "FRECPE", "0Q0011101z100001110110nnnnnddddd") +INST(FCVTXN_2, "FCVTXN, FCVTXN2", "0Q1011100z100001011010nnnnnddddd") +INST(FRINTA_2, "FRINTA (vector)", "0Q1011100z100001100010nnnnnddddd") +INST(FRINTX_2, "FRINTX (vector)", "0Q1011100z100001100110nnnnnddddd") +INST(FCVTNU_4, "FCVTNU (vector)", "0Q1011100z100001101010nnnnnddddd") +INST(FCVTMU_4, "FCVTMU (vector)", "0Q1011100z100001101110nnnnnddddd") +INST(FCVTAU_4, "FCVTAU (vector)", "0Q1011100z100001110010nnnnnddddd") +INST(UCVTF_int_4, "UCVTF (vector, integer)", "0Q1011100z100001110110nnnnnddddd") +INST(FNEG_2, "FNEG (vector)", "0Q1011101z100000111110nnnnnddddd") +INST(FRINTI_2, "FRINTI (vector)", "0Q1011101z100001100110nnnnnddddd") +INST(FCMGE_zero_4, "FCMGE (zero)", "0Q1011101z100000110010nnnnnddddd") +INST(FCMLE_4, "FCMLE (zero)", "0Q1011101z100000110110nnnnnddddd") +INST(FCVTPU_4, "FCVTPU (vector)", "0Q1011101z100001101010nnnnnddddd") +INST(FCVTZU_int_4, "FCVTZU (vector, integer)", "0Q1011101z100001101110nnnnnddddd") +INST(URSQRTE, "URSQRTE", "0Q1011101z100001110010nnnnnddddd") +INST(FRSQRTE_4, "FRSQRTE", "0Q1011101z100001110110nnnnnddddd") +INST(FSQRT_2, "FSQRT (vector)", "0Q1011101z100001111110nnnnnddddd") +INST(FMAXNMV_2, "FMAXNMV", "0Q1011100z110000110010nnnnnddddd") +INST(FMAXV_2, "FMAXV", "0Q1011100z110000111110nnnnnddddd") +INST(FMINNMV_2, "FMINNMV", "0Q1011101z110000110010nnnnnddddd") +INST(FMINV_2, "FMINV", "0Q1011101z110000111110nnnnnddddd") +INST(FMOV_float, "FMOV (register)", "00011110yy100000010000nnnnnddddd") +INST(FABS_float, "FABS (scalar)", "00011110yy100000110000nnnnnddddd") +INST(FNEG_float, "FNEG (scalar)", "00011110yy100001010000nnnnnddddd") +INST(FSQRT_float, "FSQRT (scalar)", "00011110yy100001110000nnnnnddddd") +INST(FRINTN_float, "FRINTN (scalar)", "00011110yy100100010000nnnnnddddd") +INST(FRINTP_float, "FRINTP (scalar)", "00011110yy100100110000nnnnnddddd") +INST(FRINTM_float, "FRINTM (scalar)", "00011110yy100101010000nnnnnddddd") +INST(FRINTZ_float, "FRINTZ (scalar)", "00011110yy100101110000nnnnnddddd") +INST(FRINTA_float, "FRINTA (scalar)", "00011110yy100110010000nnnnnddddd") +INST(FRINTX_float, "FRINTX (scalar)", "00011110yy100111010000nnnnnddddd") +INST(FRINTI_float, "FRINTI (scalar)", "00011110yy100111110000nnnnnddddd") +INST(LD1R_1, "LD1R", "0Q001101010000001100zznnnnnttttt") +INST(LD3R_1, "LD3R", "0Q001101010000001110zznnnnnttttt") +INST(LD2R_1, "LD2R", "0Q001101011000001100zznnnnnttttt") +INST(LD4R_1, "LD4R", "0Q001101011000001110zznnnnnttttt") +INST(REV64_asimd, "REV64", "0Q001110zz100000000010nnnnnddddd") +INST(REV16_asimd, "REV16 (vector)", "0Q001110zz100000000110nnnnnddddd") +INST(SADDLP, "SADDLP", "0Q001110zz100000001010nnnnnddddd") +INST(SUQADD_2, "SUQADD", "0Q001110zz100000001110nnnnnddddd") +INST(CLS_asimd, "CLS (vector)", "0Q001110zz100000010010nnnnnddddd") +INST(CNT, "CNT", "0Q001110zz100000010110nnnnnddddd") +INST(SADALP, "SADALP", "0Q001110zz100000011010nnnnnddddd") +INST(SQABS_2, "SQABS", "0Q001110zz100000011110nnnnnddddd") +INST(CMGT_zero_2, "CMGT (zero)", "0Q001110zz100000100010nnnnnddddd") +INST(CMEQ_zero_2, "CMEQ (zero)", "0Q001110zz100000100110nnnnnddddd") +INST(CMLT_2, "CMLT (zero)", "0Q001110zz100000101010nnnnnddddd") +INST(ABS_2, "ABS", "0Q001110zz100000101110nnnnnddddd") +INST(XTN, "XTN, XTN2", "0Q001110zz100001001010nnnnnddddd") +INST(SQXTN_2, "SQXTN, SQXTN2", "0Q001110zz100001010010nnnnnddddd") +INST(REV32_asimd, "REV32 (vector)", "0Q101110zz100000000010nnnnnddddd") +INST(UADDLP, "UADDLP", "0Q101110zz100000001010nnnnnddddd") +INST(USQADD_2, "USQADD", "0Q101110zz100000001110nnnnnddddd") +INST(CLZ_asimd, "CLZ (vector)", "0Q101110zz100000010010nnnnnddddd") +INST(UADALP, "UADALP", "0Q101110zz100000011010nnnnnddddd") +INST(SQNEG_2, "SQNEG", "0Q101110zz100000011110nnnnnddddd") +INST(CMGE_zero_2, "CMGE (zero)", "0Q101110zz100000100010nnnnnddddd") +INST(CMLE_2, "CMLE (zero)", "0Q101110zz100000100110nnnnnddddd") +INST(NEG_2, "NEG (vector)", "0Q101110zz100000101110nnnnnddddd") +INST(SQXTUN_2, "SQXTUN, SQXTUN2", "0Q101110zz100001001010nnnnnddddd") +INST(SHLL, "SHLL, SHLL2", "0Q101110zz100001001110nnnnnddddd") +INST(UQXTN_2, "UQXTN, UQXTN2", "0Q101110zz100001010010nnnnnddddd") +INST(SADDLV, "SADDLV", "0Q001110zz110000001110nnnnnddddd") +INST(SMAXV, "SMAXV", "0Q001110zz110000101010nnnnnddddd") +INST(SMINV, "SMINV", "0Q001110zz110001101010nnnnnddddd") +INST(ADDV, "ADDV", "0Q001110zz110001101110nnnnnddddd") +INST(UADDLV, "UADDLV", "0Q101110zz110000001110nnnnnddddd") +INST(UMAXV, "UMAXV", "0Q101110zz110000101010nnnnnddddd") +INST(UMINV, "UMINV", "0Q101110zz110001101010nnnnnddddd") +INST(FCVTNS_float, "FCVTNS (scalar)", "z0011110yy100000000000nnnnnddddd") +INST(FCVTNU_float, "FCVTNU (scalar)", "z0011110yy100001000000nnnnnddddd") +INST(SCVTF_float_int, "SCVTF (scalar, integer)", "z0011110yy100010000000nnnnnddddd") +INST(UCVTF_float_int, "UCVTF (scalar, integer)", "z0011110yy100011000000nnnnnddddd") +INST(FCVTAS_float, "FCVTAS (scalar)", "z0011110yy100100000000nnnnnddddd") +INST(FCVTAU_float, "FCVTAU (scalar)", "z0011110yy100101000000nnnnnddddd") +INST(FCVTPS_float, "FCVTPS (scalar)", "z0011110yy101000000000nnnnnddddd") +INST(FCVTPU_float, "FCVTPU (scalar)", "z0011110yy101001000000nnnnnddddd") +INST(FCVTMS_float, "FCVTMS (scalar)", "z0011110yy110000000000nnnnnddddd") +INST(FCVTMU_float, "FCVTMU (scalar)", "z0011110yy110001000000nnnnnddddd") +INST(FCVTZS_float_int, "FCVTZS (scalar, integer)", "z0011110yy111000000000nnnnnddddd") +INST(FCVTZU_float_int, "FCVTZU (scalar, integer)", "z0011110yy111001000000nnnnnddddd") +INST(FCMP_float, "FCMP", "00011110yy1mmmmm001000nnnnn0o000") +INST(FCMPE_float, "FCMPE", "00011110yy1mmmmm001000nnnnn1o000") +INST(FCVT_float, "FCVT", "00011110yy10001oo10000nnnnnddddd") +INST(ASR_1, "ASR (immediate, 32-bit)", "00010011000rrrrr011111nnnnnddddd") +INST(RMIF, "RMIF", "10111010000iiiiii00001nnnnn0IIII") +INST(SMULH, "SMULH", "10011011010mmmmm011111nnnnnddddd") +INST(UMULH, "UMULH", "10011011110mmmmm011111nnnnnddddd") +INST(SHA1C, "SHA1C", "01011110000mmmmm000000nnnnnddddd") +INST(SHA1P, "SHA1P", "01011110000mmmmm000100nnnnnddddd") +INST(SHA1M, "SHA1M", "01011110000mmmmm001000nnnnnddddd") +INST(SHA1SU0, "SHA1SU0", "01011110000mmmmm001100nnnnnddddd") +INST(SHA256H, "SHA256H", "01011110000mmmmm010000nnnnnddddd") +INST(SHA256H2, "SHA256H2", "01011110000mmmmm010100nnnnnddddd") +INST(SHA256SU1, "SHA256SU1", "01011110000mmmmm011000nnnnnddddd") +INST(DUP_elt_1, "DUP (element)", "01011110000iiiii000001nnnnnddddd") +INST(FCMEQ_reg_1, "FCMEQ (register)", "01011110010mmmmm001001nnnnnddddd") +INST(FRECPS_1, "FRECPS", "01011110010mmmmm001111nnnnnddddd") +INST(FRSQRTS_1, "FRSQRTS", "01011110110mmmmm001111nnnnnddddd") +INST(INS_gen, "INS (general)", "01001110000iiiii000111nnnnnddddd") +INST(SHA512H, "SHA512H", "11001110011mmmmm100000nnnnnddddd") +INST(SHA512H2, "SHA512H2", "11001110011mmmmm100001nnnnnddddd") +INST(SHA512SU1, "SHA512SU1", "11001110011mmmmm100010nnnnnddddd") +INST(RAX1, "RAX1", "11001110011mmmmm100011nnnnnddddd") +INST(SM3PARTW1, "SM3PARTW1", "11001110011mmmmm110000nnnnnddddd") +INST(SM3PARTW2, "SM3PARTW2", "11001110011mmmmm110001nnnnnddddd") +INST(SM4EKEY, "SM4EKEY", "11001110011mmmmm110010nnnnnddddd") +INST(FMOV_float_gen, "FMOV (general)", "z0011110yy10r11o000000nnnnnddddd") +INST(FMOV_float_imm, "FMOV (scalar, immediate)", "00011110yy1iiiiiiii10000000ddddd") +INST(ASR_2, "ASR (immediate, 64-bit)", "1001001101rrrrrr111111nnnnnddddd") +INST(SVC, "SVC", "11010100000iiiiiiiiiiiiiiii00001") +INST(BRK, "BRK", "11010100001iiiiiiiiiiiiiiii00000") +INST(ST1_sngl_1, "ST1 (single structure)", "0Q00110100000000oo0Szznnnnnttttt") +INST(ST3_sngl_1, "ST3 (single structure)", "0Q00110100000000oo1Szznnnnnttttt") +INST(ST2_sngl_1, "ST2 (single structure)", "0Q00110100100000oo0Szznnnnnttttt") +INST(ST4_sngl_1, "ST4 (single structure)", "0Q00110100100000oo1Szznnnnnttttt") +INST(LD1_sngl_1, "LD1 (single structure)", "0Q00110101000000oo0Szznnnnnttttt") +INST(LD3_sngl_1, "LD3 (single structure)", "0Q00110101000000oo1Szznnnnnttttt") +INST(LD2_sngl_1, "LD2 (single structure)", "0Q00110101100000oo0Szznnnnnttttt") +INST(LD4_sngl_1, "LD4 (single structure)", "0Q00110101100000oo1Szznnnnnttttt") +INST(LDXP, "LDXP", "1z001000011111110uuuuunnnnnttttt") +INST(LDAXP, "LDAXP", "1z001000011111111uuuuunnnnnttttt") +INST(UDIV, "UDIV", "z0011010110mmmmm000010nnnnnddddd") +INST(SDIV, "SDIV", "z0011010110mmmmm000011nnnnnddddd") +INST(LSLV, "LSLV", "z0011010110mmmmm001000nnnnnddddd") +INST(LSRV, "LSRV", "z0011010110mmmmm001001nnnnnddddd") +INST(ASRV, "ASRV", "z0011010110mmmmm001010nnnnnddddd") +INST(RORV, "RORV", "z0011010110mmmmm001011nnnnnddddd") +INST(ADC, "ADC", "z0011010000mmmmm000000nnnnnddddd") +INST(ADCS, "ADCS", "z0111010000mmmmm000000nnnnnddddd") +INST(SBC, "SBC", "z1011010000mmmmm000000nnnnnddddd") +INST(SBCS, "SBCS", "z1111010000mmmmm000000nnnnnddddd") +INST(FMULX_vec_2, "FMULX", "010111100z1mmmmm110111nnnnnddddd") +INST(FCMEQ_reg_2, "FCMEQ (register)", "010111100z1mmmmm111001nnnnnddddd") +INST(FRECPS_2, "FRECPS", "010111100z1mmmmm111111nnnnnddddd") +INST(FRSQRTS_2, "FRSQRTS", "010111101z1mmmmm111111nnnnnddddd") +INST(FCMGE_reg_2, "FCMGE (register)", "011111100z1mmmmm111001nnnnnddddd") +INST(FACGE_2, "FACGE", "011111100z1mmmmm111011nnnnnddddd") +INST(FABD_2, "FABD", "011111101z1mmmmm110101nnnnnddddd") +INST(FCMGT_reg_2, "FCMGT (register)", "011111101z1mmmmm111001nnnnnddddd") +INST(FACGT_2, "FACGT", "011111101z1mmmmm111011nnnnnddddd") +INST(DUP_elt_2, "DUP (element)", "0Q001110000iiiii000001nnnnnddddd") +INST(DUP_gen, "DUP (general)", "0Q001110000iiiii000011nnnnnddddd") +INST(SMOV, "SMOV", "0Q001110000iiiii001011nnnnnddddd") +INST(UMOV, "UMOV", "0Q001110000iiiii001111nnnnnddddd") +INST(FCMEQ_reg_3, "FCMEQ (register)", "0Q001110010mmmmm001001nnnnnddddd") +INST(FRECPS_3, "FRECPS", "0Q001110010mmmmm001111nnnnnddddd") +INST(FRSQRTS_3, "FRSQRTS", "0Q001110110mmmmm001111nnnnnddddd") +INST(FMLA_vec_1, "FMLA (vector)", "0Q001110010mmmmm000011nnnnnddddd") +INST(FMLS_vec_1, "FMLS (vector)", "0Q001110110mmmmm000011nnnnnddddd") +INST(AND_asimd, "AND (vector)", "0Q001110001mmmmm000111nnnnnddddd") +INST(BIC_asimd_reg, "BIC (vector, register)", "0Q001110011mmmmm000111nnnnnddddd") +INST(ORR_asimd_reg, "ORR (vector, register)", "0Q001110101mmmmm000111nnnnnddddd") +INST(ORN_asimd, "ORN (vector)", "0Q001110111mmmmm000111nnnnnddddd") +INST(EOR_asimd, "EOR (vector)", "0Q101110001mmmmm000111nnnnnddddd") +INST(BSL, "BSL", "0Q101110011mmmmm000111nnnnnddddd") +INST(BIT, "BIT", "0Q101110101mmmmm000111nnnnnddddd") +INST(BIF, "BIF", "0Q101110111mmmmm000111nnnnnddddd") +INST(STx_mult_1, "STx (multiple structures)", "0Q00110000000000oooozznnnnnttttt") +INST(LDx_mult_1, "LDx (multiple structures)", "0Q00110001000000oooozznnnnnttttt") +INST(STXR, "STXRB, STXRH, STXR", "zz001000000sssss011111nnnnnttttt") +INST(STLXR, "STLXRB, STLXRH, STLXR", "zz001000000sssss111111nnnnnttttt") +INST(SQADD_1, "SQADD", "01011110zz1mmmmm000011nnnnnddddd") +INST(SQSUB_1, "SQSUB", "01011110zz1mmmmm001011nnnnnddddd") +INST(CMGT_reg_1, "CMGT (register)", "01011110zz1mmmmm001101nnnnnddddd") +INST(CMGE_reg_1, "CMGE (register)", "01011110zz1mmmmm001111nnnnnddddd") +INST(SSHL_1, "SSHL", "01011110zz1mmmmm010001nnnnnddddd") +INST(SQSHL_reg_1, "SQSHL (register)", "01011110zz1mmmmm010011nnnnnddddd") +INST(SRSHL_1, "SRSHL", "01011110zz1mmmmm010101nnnnnddddd") +INST(ADD_1, "ADD (vector)", "01011110zz1mmmmm100001nnnnnddddd") +INST(CMTST_1, "CMTST", "01011110zz1mmmmm100011nnnnnddddd") +INST(SQDMULH_vec_1, "SQDMULH (vector)", "01011110zz1mmmmm101101nnnnnddddd") +INST(UQADD_1, "UQADD", "01111110zz1mmmmm000011nnnnnddddd") +INST(UQSUB_1, "UQSUB", "01111110zz1mmmmm001011nnnnnddddd") +INST(CMHI_1, "CMHI (register)", "01111110zz1mmmmm001101nnnnnddddd") +INST(CMHS_1, "CMHS (register)", "01111110zz1mmmmm001111nnnnnddddd") +INST(USHL_1, "USHL", "01111110zz1mmmmm010001nnnnnddddd") +INST(UQSHL_reg_1, "UQSHL (register)", "01111110zz1mmmmm010011nnnnnddddd") +INST(URSHL_1, "URSHL", "01111110zz1mmmmm010101nnnnnddddd") +INST(SUB_1, "SUB (vector)", "01111110zz1mmmmm100001nnnnnddddd") +INST(CMEQ_reg_1, "CMEQ (register)", "01111110zz1mmmmm100011nnnnnddddd") +INST(SQRDMULH_vec_1, "SQRDMULH (vector)", "01111110zz1mmmmm101101nnnnnddddd") +INST(SSHR_1, "SSHR", "010111110IIIIiii000001nnnnnddddd") +INST(SSRA_1, "SSRA", "010111110IIIIiii000101nnnnnddddd") +INST(SRSHR_1, "SRSHR", "010111110IIIIiii001001nnnnnddddd") +INST(SRSRA_1, "SRSRA", "010111110IIIIiii001101nnnnnddddd") +INST(SHL_1, "SHL", "010111110IIIIiii010101nnnnnddddd") +INST(SQSHL_imm_1, "SQSHL (immediate)", "010111110IIIIiii011101nnnnnddddd") +INST(SQSHRN_1, "SQSHRN, SQSHRN2", "010111110IIIIiii100101nnnnnddddd") +INST(SCVTF_fix_1, "SCVTF (vector, fixed-point)", "010111110IIIIiii111001nnnnnddddd") +INST(FCVTZS_fix_1, "FCVTZS (vector, fixed-point)", "010111110IIIIiii111111nnnnnddddd") +INST(USHR_1, "USHR", "011111110IIIIiii000001nnnnnddddd") +INST(USRA_1, "USRA", "011111110IIIIiii000101nnnnnddddd") +INST(URSHR_1, "URSHR", "011111110IIIIiii001001nnnnnddddd") +INST(URSRA_1, "URSRA", "011111110IIIIiii001101nnnnnddddd") +INST(SRI_1, "SRI", "011111110IIIIiii010001nnnnnddddd") +INST(SLI_1, "SLI", "011111110IIIIiii010101nnnnnddddd") +INST(SQSHLU_1, "SQSHLU", "011111110IIIIiii011001nnnnnddddd") +INST(UQSHL_imm_1, "UQSHL (immediate)", "011111110IIIIiii011101nnnnnddddd") +INST(SQSHRUN_1, "SQSHRUN, SQSHRUN2", "011111110IIIIiii100001nnnnnddddd") +INST(UQSHRN_1, "UQSHRN, UQSHRN2", "011111110IIIIiii100101nnnnnddddd") +INST(UCVTF_fix_1, "UCVTF (vector, fixed-point)", "011111110IIIIiii111001nnnnnddddd") +INST(FCVTZU_fix_1, "FCVTZU (vector, fixed-point)", "011111110IIIIiii111111nnnnnddddd") +INST(FMLA_elt_1, "FMLA (by element)", "0101111100LMmmmm0001H0nnnnnddddd") +INST(FMLS_elt_1, "FMLS (by element)", "0101111100LMmmmm0101H0nnnnnddddd") +INST(FMAXNM_2, "FMAXNM (vector)", "0Q0011100z1mmmmm110001nnnnnddddd") +INST(FMLA_vec_2, "FMLA (vector)", "0Q0011100z1mmmmm110011nnnnnddddd") +INST(FADD_2, "FADD (vector)", "0Q0011100z1mmmmm110101nnnnnddddd") +INST(FMAX_2, "FMAX (vector)", "0Q0011100z1mmmmm111101nnnnnddddd") +INST(FMULX_vec_4, "FMULX", "0Q0011100z1mmmmm110111nnnnnddddd") +INST(FCMEQ_reg_4, "FCMEQ (register)", "0Q0011100z1mmmmm111001nnnnnddddd") +INST(FRECPS_4, "FRECPS", "0Q0011100z1mmmmm111111nnnnnddddd") +INST(FMINNM_2, "FMINNM (vector)", "0Q0011101z1mmmmm110001nnnnnddddd") +INST(FMLS_vec_2, "FMLS (vector)", "0Q0011101z1mmmmm110011nnnnnddddd") +INST(FSUB_2, "FSUB (vector)", "0Q0011101z1mmmmm110101nnnnnddddd") +INST(FMIN_2, "FMIN (vector)", "0Q0011101z1mmmmm111101nnnnnddddd") +INST(FRSQRTS_4, "FRSQRTS", "0Q0011101z1mmmmm111111nnnnnddddd") +INST(FMAXNMP_vec_2, "FMAXNMP (vector)", "0Q1011100z1mmmmm110001nnnnnddddd") +INST(FADDP_vec_2, "FADDP (vector)", "0Q1011100z1mmmmm110101nnnnnddddd") +INST(FMUL_vec_2, "FMUL (vector)", "0Q1011100z1mmmmm110111nnnnnddddd") +INST(FCMGE_reg_4, "FCMGE (register)", "0Q1011100z1mmmmm111001nnnnnddddd") +INST(FACGE_4, "FACGE", "0Q1011100z1mmmmm111011nnnnnddddd") +INST(FMAXP_vec_2, "FMAXP (vector)", "0Q1011100z1mmmmm111101nnnnnddddd") +INST(FDIV_2, "FDIV (vector)", "0Q1011100z1mmmmm111111nnnnnddddd") +INST(FMINNMP_vec_2, "FMINNMP (vector)", "0Q1011101z1mmmmm110001nnnnnddddd") +INST(FABD_4, "FABD", "0Q1011101z1mmmmm110101nnnnnddddd") +INST(FCMGT_reg_4, "FCMGT (register)", "0Q1011101z1mmmmm111001nnnnnddddd") +INST(FACGT_4, "FACGT", "0Q1011101z1mmmmm111011nnnnnddddd") +INST(FMINP_vec_2, "FMINP (vector)", "0Q1011101z1mmmmm111101nnnnnddddd") +INST(SM3TT1A, "SM3TT1A", "11001110010mmmmm10ii00nnnnnddddd") +INST(SM3TT1B, "SM3TT1B", "11001110010mmmmm10ii01nnnnnddddd") +INST(SM3TT2A, "SM3TT2A", "11001110010mmmmm10ii10nnnnnddddd") +INST(SM3TT2B, "SM3TT2B", "11001110010mmmmm10ii11nnnnnddddd") +INST(FMUL_float, "FMUL (scalar)", "00011110yy1mmmmm000010nnnnnddddd") +INST(FDIV_float, "FDIV (scalar)", "00011110yy1mmmmm000110nnnnnddddd") +INST(FADD_float, "FADD (scalar)", "00011110yy1mmmmm001010nnnnnddddd") +INST(FSUB_float, "FSUB (scalar)", "00011110yy1mmmmm001110nnnnnddddd") +INST(FMAX_float, "FMAX (scalar)", "00011110yy1mmmmm010010nnnnnddddd") +INST(FMIN_float, "FMIN (scalar)", "00011110yy1mmmmm010110nnnnnddddd") +INST(FMAXNM_float, "FMAXNM (scalar)", "00011110yy1mmmmm011010nnnnnddddd") +INST(FMINNM_float, "FMINNM (scalar)", "00011110yy1mmmmm011110nnnnnddddd") +INST(FNMUL_float, "FNMUL (scalar)", "00011110yy1mmmmm100010nnnnnddddd") +INST(LD1R_2, "LD1R", "0Q001101110mmmmm1100zznnnnnttttt") +INST(LD3R_2, "LD3R", "0Q001101110mmmmm1110zznnnnnttttt") +INST(LD2R_2, "LD2R", "0Q001101111mmmmm1100zznnnnnttttt") +INST(LD4R_2, "LD4R", "0Q001101111mmmmm1110zznnnnnttttt") +INST(CRC32, "CRC32B, CRC32H, CRC32W, CRC32X", "z0011010110mmmmm0100zznnnnnddddd") +INST(CRC32C, "CRC32CB, CRC32CH, CRC32CW, CRC32CX", "z0011010110mmmmm0101zznnnnnddddd") +INST(FMLA_elt_2, "FMLA (by element)", "010111111zLMmmmm0001H0nnnnnddddd") +INST(FMLS_elt_2, "FMLS (by element)", "010111111zLMmmmm0101H0nnnnnddddd") +INST(FMUL_elt_2, "FMUL (by element)", "010111111zLMmmmm1001H0nnnnnddddd") +INST(FMULX_elt_2, "FMULX (by element)", "011111111zLMmmmm1001H0nnnnnddddd") +INST(TBL, "TBL", "0Q001110000mmmmm0LL000nnnnnddddd") +INST(TBX, "TBX", "0Q001110000mmmmm0LL100nnnnnddddd") +INST(UZP1, "UZP1", "0Q001110zz0mmmmm000110nnnnnddddd") +INST(TRN1, "TRN1", "0Q001110zz0mmmmm001010nnnnnddddd") +INST(ZIP1, "ZIP1", "0Q001110zz0mmmmm001110nnnnnddddd") +INST(UZP2, "UZP2", "0Q001110zz0mmmmm010110nnnnnddddd") +INST(TRN2, "TRN2", "0Q001110zz0mmmmm011010nnnnnddddd") +INST(ZIP2, "ZIP2", "0Q001110zz0mmmmm011110nnnnnddddd") +INST(SDOT_vec, "SDOT (vector)", "0Q001110zz0mmmmm100101nnnnnddddd") +INST(UDOT_vec, "UDOT (vector)", "0Q101110zz0mmmmm100101nnnnnddddd") +INST(SADDL, "SADDL, SADDL2", "0Q001110zz1mmmmm000000nnnnnddddd") +INST(SADDW, "SADDW, SADDW2", "0Q001110zz1mmmmm000100nnnnnddddd") +INST(SSUBL, "SSUBL, SSUBL2", "0Q001110zz1mmmmm001000nnnnnddddd") +INST(SSUBW, "SSUBW, SSUBW2", "0Q001110zz1mmmmm001100nnnnnddddd") +INST(ADDHN, "ADDHN, ADDHN2", "0Q001110zz1mmmmm010000nnnnnddddd") +INST(SABAL, "SABAL, SABAL2", "0Q001110zz1mmmmm010100nnnnnddddd") +INST(SUBHN, "SUBHN, SUBHN2", "0Q001110zz1mmmmm011000nnnnnddddd") +INST(SABDL, "SABDL, SABDL2", "0Q001110zz1mmmmm011100nnnnnddddd") +INST(SMLAL_vec, "SMLAL, SMLAL2 (vector)", "0Q001110zz1mmmmm100000nnnnnddddd") +INST(SMLSL_vec, "SMLSL, SMLSL2 (vector)", "0Q001110zz1mmmmm101000nnnnnddddd") +INST(SMULL_vec, "SMULL, SMULL2 (vector)", "0Q001110zz1mmmmm110000nnnnnddddd") +INST(PMULL, "PMULL, PMULL2", "0Q001110zz1mmmmm111000nnnnnddddd") +INST(UADDL, "UADDL, UADDL2", "0Q101110zz1mmmmm000000nnnnnddddd") +INST(UADDW, "UADDW, UADDW2", "0Q101110zz1mmmmm000100nnnnnddddd") +INST(USUBL, "USUBL, USUBL2", "0Q101110zz1mmmmm001000nnnnnddddd") +INST(USUBW, "USUBW, USUBW2", "0Q101110zz1mmmmm001100nnnnnddddd") +INST(RADDHN, "RADDHN, RADDHN2", "0Q101110zz1mmmmm010000nnnnnddddd") +INST(UABAL, "UABAL, UABAL2", "0Q101110zz1mmmmm010100nnnnnddddd") +INST(RSUBHN, "RSUBHN, RSUBHN2", "0Q101110zz1mmmmm011000nnnnnddddd") +INST(UABDL, "UABDL, UABDL2", "0Q101110zz1mmmmm011100nnnnnddddd") +INST(UMLAL_vec, "UMLAL, UMLAL2 (vector)", "0Q101110zz1mmmmm100000nnnnnddddd") +INST(UMLSL_vec, "UMLSL, UMLSL2 (vector)", "0Q101110zz1mmmmm101000nnnnnddddd") +INST(UMULL_vec, "UMULL, UMULL2 (vector)", "0Q101110zz1mmmmm110000nnnnnddddd") +INST(SQDMULL_vec_2, "SQDMULL, SQDMULL2 (vector)", "0Q001110zz1mmmmm110100nnnnnddddd") +INST(SHADD, "SHADD", "0Q001110zz1mmmmm000001nnnnnddddd") +INST(SQADD_2, "SQADD", "0Q001110zz1mmmmm000011nnnnnddddd") +INST(SRHADD, "SRHADD", "0Q001110zz1mmmmm000101nnnnnddddd") +INST(SHSUB, "SHSUB", "0Q001110zz1mmmmm001001nnnnnddddd") +INST(SQSUB_2, "SQSUB", "0Q001110zz1mmmmm001011nnnnnddddd") +INST(CMGT_reg_2, "CMGT (register)", "0Q001110zz1mmmmm001101nnnnnddddd") +INST(CMGE_reg_2, "CMGE (register)", "0Q001110zz1mmmmm001111nnnnnddddd") +INST(SSHL_2, "SSHL", "0Q001110zz1mmmmm010001nnnnnddddd") +INST(SQSHL_reg_2, "SQSHL (register)", "0Q001110zz1mmmmm010011nnnnnddddd") +INST(SRSHL_2, "SRSHL", "0Q001110zz1mmmmm010101nnnnnddddd") +INST(SMAX, "SMAX", "0Q001110zz1mmmmm011001nnnnnddddd") +INST(SMIN, "SMIN", "0Q001110zz1mmmmm011011nnnnnddddd") +INST(SABD, "SABD", "0Q001110zz1mmmmm011101nnnnnddddd") +INST(SABA, "SABA", "0Q001110zz1mmmmm011111nnnnnddddd") +INST(ADD_vector, "ADD (vector)", "0Q001110zz1mmmmm100001nnnnnddddd") +INST(CMTST_2, "CMTST", "0Q001110zz1mmmmm100011nnnnnddddd") +INST(MLA_vec, "MLA (vector)", "0Q001110zz1mmmmm100101nnnnnddddd") +INST(MUL_vec, "MUL (vector)", "0Q001110zz1mmmmm100111nnnnnddddd") +INST(SMAXP, "SMAXP", "0Q001110zz1mmmmm101001nnnnnddddd") +INST(SMINP, "SMINP", "0Q001110zz1mmmmm101011nnnnnddddd") +INST(SQDMULH_vec_2, "SQDMULH (vector)", "0Q001110zz1mmmmm101101nnnnnddddd") +INST(ADDP_vec, "ADDP (vector)", "0Q001110zz1mmmmm101111nnnnnddddd") +INST(UHADD, "UHADD", "0Q101110zz1mmmmm000001nnnnnddddd") +INST(UQADD_2, "UQADD", "0Q101110zz1mmmmm000011nnnnnddddd") +INST(URHADD, "URHADD", "0Q101110zz1mmmmm000101nnnnnddddd") +INST(UHSUB, "UHSUB", "0Q101110zz1mmmmm001001nnnnnddddd") +INST(UQSUB_2, "UQSUB", "0Q101110zz1mmmmm001011nnnnnddddd") +INST(CMHI_2, "CMHI (register)", "0Q101110zz1mmmmm001101nnnnnddddd") +INST(CMHS_2, "CMHS (register)", "0Q101110zz1mmmmm001111nnnnnddddd") +INST(USHL_2, "USHL", "0Q101110zz1mmmmm010001nnnnnddddd") +INST(UQSHL_reg_2, "UQSHL (register)", "0Q101110zz1mmmmm010011nnnnnddddd") +INST(URSHL_2, "URSHL", "0Q101110zz1mmmmm010101nnnnnddddd") +INST(UMAX, "UMAX", "0Q101110zz1mmmmm011001nnnnnddddd") +INST(UMIN, "UMIN", "0Q101110zz1mmmmm011011nnnnnddddd") +INST(UABD, "UABD", "0Q101110zz1mmmmm011101nnnnnddddd") +INST(UABA, "UABA", "0Q101110zz1mmmmm011111nnnnnddddd") +INST(SUB_2, "SUB (vector)", "0Q101110zz1mmmmm100001nnnnnddddd") +INST(CMEQ_reg_2, "CMEQ (register)", "0Q101110zz1mmmmm100011nnnnnddddd") +INST(MLS_vec, "MLS (vector)", "0Q101110zz1mmmmm100101nnnnnddddd") +INST(PMUL, "PMUL", "0Q101110zz1mmmmm100111nnnnnddddd") +INST(UMAXP, "UMAXP", "0Q101110zz1mmmmm101001nnnnnddddd") +INST(UMINP, "UMINP", "0Q101110zz1mmmmm101011nnnnnddddd") +INST(SQRDMULH_vec_2, "SQRDMULH (vector)", "0Q101110zz1mmmmm101101nnnnnddddd") +INST(SSHR_2, "SSHR", "0Q0011110IIIIiii000001nnnnnddddd") +INST(SSRA_2, "SSRA", "0Q0011110IIIIiii000101nnnnnddddd") +INST(SRSHR_2, "SRSHR", "0Q0011110IIIIiii001001nnnnnddddd") +INST(SRSRA_2, "SRSRA", "0Q0011110IIIIiii001101nnnnnddddd") +INST(SHL_2, "SHL", "0Q0011110IIIIiii010101nnnnnddddd") +INST(SQSHL_imm_2, "SQSHL (immediate)", "0Q0011110IIIIiii011101nnnnnddddd") +INST(SHRN, "SHRN, SHRN2", "0Q0011110IIIIiii100001nnnnnddddd") +INST(RSHRN, "RSHRN, RSHRN2", "0Q0011110IIIIiii100011nnnnnddddd") +INST(SQSHRN_2, "SQSHRN, SQSHRN2", "0Q0011110IIIIiii100101nnnnnddddd") +INST(SQRSHRN_2, "SQRSHRN, SQRSHRN2", "0Q0011110IIIIiii100111nnnnnddddd") +INST(SSHLL, "SSHLL, SSHLL2", "0Q0011110IIIIiii101001nnnnnddddd") +INST(SCVTF_fix_2, "SCVTF (vector, fixed-point)", "0Q0011110IIIIiii111001nnnnnddddd") +INST(FCVTZS_fix_2, "FCVTZS (vector, fixed-point)", "0Q0011110IIIIiii111111nnnnnddddd") +INST(USHR_2, "USHR", "0Q1011110IIIIiii000001nnnnnddddd") +INST(USRA_2, "USRA", "0Q1011110IIIIiii000101nnnnnddddd") +INST(URSHR_2, "URSHR", "0Q1011110IIIIiii001001nnnnnddddd") +INST(URSRA_2, "URSRA", "0Q1011110IIIIiii001101nnnnnddddd") +INST(SRI_2, "SRI", "0Q1011110IIIIiii010001nnnnnddddd") +INST(SLI_2, "SLI", "0Q1011110IIIIiii010101nnnnnddddd") +INST(SQSHLU_2, "SQSHLU", "0Q1011110IIIIiii011001nnnnnddddd") +INST(UQSHL_imm_2, "UQSHL (immediate)", "0Q1011110IIIIiii011101nnnnnddddd") +INST(SQSHRUN_2, "SQSHRUN, SQSHRUN2", "0Q1011110IIIIiii100001nnnnnddddd") +INST(SQRSHRUN_2, "SQRSHRUN, SQRSHRUN2", "0Q1011110IIIIiii100011nnnnnddddd") +INST(UQSHRN_2, "UQSHRN, UQSHRN2", "0Q1011110IIIIiii100101nnnnnddddd") +INST(UQRSHRN_2, "UQRSHRN, UQRSHRN2", "0Q1011110IIIIiii100111nnnnnddddd") +INST(USHLL, "USHLL, USHLL2", "0Q1011110IIIIiii101001nnnnnddddd") +INST(UCVTF_fix_2, "UCVTF (vector, fixed-point)", "0Q1011110IIIIiii111001nnnnnddddd") +INST(FCVTZU_fix_2, "FCVTZU (vector, fixed-point)", "0Q1011110IIIIiii111111nnnnnddddd") +INST(FMLA_elt_3, "FMLA (by element)", "0Q00111100LMmmmm0001H0nnnnnddddd") +INST(FMLS_elt_3, "FMLS (by element)", "0Q00111100LMmmmm0101H0nnnnnddddd") +INST(UnallocatedEncoding, "", "10111000110---------00----------") +INST(PRFM_unscaled_imm, "PRFM (unscaled offset)", "11111000100iiiiiiiii00nnnnnttttt") +INST(STTRB, "STTRB", "00111000000iiiiiiiii10nnnnnttttt") +INST(LDTRB, "LDTRB", "00111000010iiiiiiiii10nnnnnttttt") +INST(STTRH, "STTRH", "01111000000iiiiiiiii10nnnnnttttt") +INST(LDTRH, "LDTRH", "01111000010iiiiiiiii10nnnnnttttt") +INST(LDTRSW, "LDTRSW", "10111000100iiiiiiiii10nnnnnttttt") +INST(CCMN_reg, "CCMN (register)", "z0111010010mmmmmcccc00nnnnn0ffff") +INST(CCMP_reg, "CCMP (register)", "z1111010010mmmmmcccc00nnnnn0ffff") +INST(CCMN_imm, "CCMN (immediate)", "z0111010010iiiiicccc10nnnnn0ffff") +INST(CCMP_imm, "CCMP (immediate)", "z1111010010iiiiicccc10nnnnn0ffff") +INST(SQDMULL_elt_1, "SQDMULL, SQDMULL2 (by element)", "01011111zzLMmmmm1011H0nnnnnddddd") +INST(SQDMULH_elt_1, "SQDMULH (by element)", "01011111zzLMmmmm1100H0nnnnnddddd") +INST(SQRDMULH_elt_1, "SQRDMULH (by element)", "01011111zzLMmmmm1101H0nnnnnddddd") +INST(INS_elt, "INS (element)", "01101110000iiiii0iiii1nnnnnddddd") +INST(FCADD_vec, "FCADD", "0Q101110zz0mmmmm111r01nnnnnddddd") +INST(FMLA_elt_4, "FMLA (by element)", "0Q0011111zLMmmmm0001H0nnnnnddddd") +INST(FMLS_elt_4, "FMLS (by element)", "0Q0011111zLMmmmm0101H0nnnnnddddd") +INST(FMUL_elt_4, "FMUL (by element)", "0Q0011111zLMmmmm1001H0nnnnnddddd") +INST(FMULX_elt_4, "FMULX (by element)", "0Q1011111zLMmmmm1001H0nnnnnddddd") +INST(SCVTF_float_fix, "SCVTF (scalar, fixed-point)", "z0011110yy000010ppppppnnnnnddddd") +INST(UCVTF_float_fix, "UCVTF (scalar, fixed-point)", "z0011110yy000011ppppppnnnnnddddd") +INST(FCVTZS_float_fix, "FCVTZS (scalar, fixed-point)", "z0011110yy011000ppppppnnnnnddddd") +INST(FCVTZU_float_fix, "FCVTZU (scalar, fixed-point)", "z0011110yy011001ppppppnnnnnddddd") +INST(MSR_reg, "MSR (register)", "110101010001poooNNNNMMMMooottttt") +INST(MRS, "MRS", "110101010011poooNNNNMMMMooottttt") +INST(UnallocatedEncoding, "", "111110001-0---------00----------") +INST(UnallocatedEncoding, "", "10111000110----------1----------") +INST(CSEL, "CSEL", "z0011010100mmmmmcccc00nnnnnddddd") +INST(CSINC, "CSINC", "z0011010100mmmmmcccc01nnnnnddddd") +INST(CSINV, "CSINV", "z1011010100mmmmmcccc00nnnnnddddd") +INST(CSNEG, "CSNEG", "z1011010100mmmmmcccc01nnnnnddddd") +INST(SMADDL, "SMADDL", "10011011001mmmmm0aaaaannnnnddddd") +INST(SMSUBL, "SMSUBL", "10011011001mmmmm1aaaaannnnnddddd") +INST(UMADDL, "UMADDL", "10011011101mmmmm0aaaaannnnnddddd") +INST(UMSUBL, "UMSUBL", "10011011101mmmmm1aaaaannnnnddddd") +INST(EXT, "EXT", "0Q101110000mmmmm0iiii0nnnnnddddd") +INST(FCMLA_vec, "FCMLA", "0Q101110zz0mmmmm110rr1nnnnnddddd") +INST(SMLAL_elt, "SMLAL, SMLAL2 (by element)", "0Q001111zzLMmmmm0010H0nnnnnddddd") +INST(SMLSL_elt, "SMLSL, SMLSL2 (by element)", "0Q001111zzLMmmmm0110H0nnnnnddddd") +INST(MUL_elt, "MUL (by element)", "0Q001111zzLMmmmm1000H0nnnnnddddd") +INST(SMULL_elt, "SMULL, SMULL2 (by element)", "0Q001111zzLMmmmm1010H0nnnnnddddd") +INST(SQDMULL_elt_2, "SQDMULL, SQDMULL2 (by element)", "0Q001111zzLMmmmm1011H0nnnnnddddd") +INST(SQDMULH_elt_2, "SQDMULH (by element)", "0Q001111zzLMmmmm1100H0nnnnnddddd") +INST(SQRDMULH_elt_2, "SQRDMULH (by element)", "0Q001111zzLMmmmm1101H0nnnnnddddd") +INST(SDOT_elt, "SDOT (by element)", "0Q001111zzLMmmmm1110H0nnnnnddddd") +INST(MLA_elt, "MLA (by element)", "0Q101111zzLMmmmm0000H0nnnnnddddd") +INST(UMLAL_elt, "UMLAL, UMLAL2 (by element)", "0Q101111zzLMmmmm0010H0nnnnnddddd") +INST(MLS_elt, "MLS (by element)", "0Q101111zzLMmmmm0100H0nnnnnddddd") +INST(UMLSL_elt, "UMLSL, UMLSL2 (by element)", "0Q101111zzLMmmmm0110H0nnnnnddddd") +INST(UMULL_elt, "UMULL, UMULL2 (by element)", "0Q101111zzLMmmmm1010H0nnnnnddddd") +INST(UDOT_elt, "UDOT (by element)", "0Q101111zzLMmmmm1110H0nnnnnddddd") +INST(EOR3, "EOR3", "11001110000mmmmm0aaaaannnnnddddd") +INST(BCAX, "BCAX", "11001110001mmmmm0aaaaannnnnddddd") +INST(SM3SS1, "SM3SS1", "11001110010mmmmm0aaaaannnnnddddd") +INST(FCCMP_float, "FCCMP", "00011110yy1mmmmmcccc01nnnnn0ffff") +INST(FCCMPE_float, "FCCMPE", "00011110yy1mmmmmcccc01nnnnn1ffff") +INST(ST1_sngl_2, "ST1 (single structure)", "0Q001101100mmmmmoo0Szznnnnnttttt") +INST(ST3_sngl_2, "ST3 (single structure)", "0Q001101100mmmmmoo1Szznnnnnttttt") +INST(ST2_sngl_2, "ST2 (single structure)", "0Q001101101mmmmmoo0Szznnnnnttttt") +INST(ST4_sngl_2, "ST4 (single structure)", "0Q001101101mmmmmoo1Szznnnnnttttt") +INST(LD1_sngl_2, "LD1 (single structure)", "0Q001101110mmmmmoo0Szznnnnnttttt") +INST(LD3_sngl_2, "LD3 (single structure)", "0Q001101110mmmmmoo1Szznnnnnttttt") +INST(LD2_sngl_2, "LD2 (single structure)", "0Q001101111mmmmmoo0Szznnnnnttttt") +INST(LD4_sngl_2, "LD4 (single structure)", "0Q001101111mmmmmoo1Szznnnnnttttt") +INST(STXP, "STXP", "1z001000001sssss0uuuuunnnnnttttt") +INST(STLXP, "STLXP", "1z001000001sssss1uuuuunnnnnttttt") +INST(UnallocatedEncoding, "", "111110001-0----------1----------") +INST(LDTRSB, "LDTRSB", "00111000oo0iiiiiiiii10nnnnnttttt") +INST(LDTRSH, "LDTRSH", "01111000oo0iiiiiiiii10nnnnnttttt") +INST(STTR, "STTR", "zz111000000iiiiiiiii10nnnnnttttt") +INST(LDTR, "LDTR", "zz111000010iiiiiiiii10nnnnnttttt") +INST(MADD, "MADD", "z0011011000mmmmm0aaaaannnnnddddd") +INST(MSUB, "MSUB", "z0011011000mmmmm1aaaaannnnnddddd") +INST(XAR, "XAR", "11001110100mmmmmiiiiiinnnnnddddd") +INST(FCSEL_float, "FCSEL", "00011110yy1mmmmmcccc11nnnnnddddd") +INST(STx_mult_2, "STx (multiple structures)", "0Q001100100mmmmmoooozznnnnnttttt") +INST(LDx_mult_2, "LDx (multiple structures)", "0Q001100110mmmmmoooozznnnnnttttt") +INST(PRFM_imm, "PRFM (immediate)", "1111100110iiiiiiiiiiiinnnnnttttt") +INST(STUR_fpsimd, "STUR (SIMD&FP)", "zz111100o00iiiiiiiii00nnnnnttttt") +INST(LDUR_fpsimd, "LDUR (SIMD&FP)", "zz111100o10iiiiiiiii00nnnnnttttt") +INST(UnallocatedEncoding, "", "1111100111----------------------") +INST(UnallocatedEncoding, "", "1011100111----------------------") +INST(STRx_reg, "STRx (register)", "zz111000o01mmmmmxxxS10nnnnnttttt") +INST(LDRx_reg, "LDRx (register)", "zz111000o11mmmmmxxxS10nnnnnttttt") +INST(STR_reg_fpsimd, "STR (register, SIMD&FP)", "zz111100o01mmmmmxxxS10nnnnnttttt") +INST(LDR_reg_fpsimd, "LDR (register, SIMD&FP)", "zz111100o11mmmmmxxxS10nnnnnttttt") +INST(ADD_ext, "ADD (extended register)", "z0001011001mmmmmxxxiiinnnnnddddd") +INST(ADDS_ext, "ADDS (extended register)", "z0101011001mmmmmxxxiiinnnnnddddd") +INST(SUB_ext, "SUB (extended register)", "z1001011001mmmmmxxxiiinnnnnddddd") +INST(SUBS_ext, "SUBS (extended register)", "z1101011001mmmmmxxxiiinnnnnddddd") +INST(FCMLA_elt, "FCMLA (by element)", "0Q101111zzLMmmmm0rr1H0nnnnnddddd") +INST(FMADD_float, "FMADD", "00011111yy0mmmmm0aaaaannnnnddddd") +INST(FMSUB_float, "FMSUB", "00011111yy0mmmmm1aaaaannnnnddddd") +INST(FNMADD_float, "FNMADD", "00011111yy1mmmmm0aaaaannnnnddddd") +INST(FNMSUB_float, "FNMSUB", "00011111yy1mmmmm1aaaaannnnnddddd") +INST(EXTR, "EXTR", "z00100111N0mmmmmssssssnnnnnddddd") +INST(B_cond, "B.cond", "01010100iiiiiiiiiiiiiiiiiii0cccc") +INST(STURx_LDURx, "STURx/LDURx", "zz111000oo0iiiiiiiii00nnnnnttttt") +INST(STR_imm_fpsimd_1, "STR (immediate, SIMD&FP)", "zz111100o00iiiiiiiiip1nnnnnttttt") +INST(LDR_imm_fpsimd_1, "LDR (immediate, SIMD&FP)", "zz111100o10iiiiiiiiip1nnnnnttttt") +INST(AND_imm, "AND (immediate)", "z00100100Nrrrrrrssssssnnnnnddddd") +INST(ORR_imm, "ORR (immediate)", "z01100100Nrrrrrrssssssnnnnnddddd") +INST(EOR_imm, "EOR (immediate)", "z10100100Nrrrrrrssssssnnnnnddddd") +INST(ANDS_imm, "ANDS (immediate)", "z11100100Nrrrrrrssssssnnnnnddddd") +INST(MOVN, "MOVN", "z00100101ssiiiiiiiiiiiiiiiiddddd") +INST(MOVZ, "MOVZ", "z10100101ssiiiiiiiiiiiiiiiiddddd") +INST(MOVK, "MOVK", "z11100101ssiiiiiiiiiiiiiiiiddddd") +INST(SBFM, "SBFM", "z00100110Nrrrrrrssssssnnnnnddddd") +INST(BFM, "BFM", "z01100110Nrrrrrrssssssnnnnnddddd") +INST(UBFM, "UBFM", "z10100110Nrrrrrrssssssnnnnnddddd") +INST(LDRSW_lit, "LDRSW (literal)", "10011000iiiiiiiiiiiiiiiiiiittttt") +INST(PRFM_lit, "PRFM (literal)", "11011000iiiiiiiiiiiiiiiiiiittttt") +INST(STNP_LDNP_gen, "STNP/LDNP", "o01010000Liiiiiiiuuuuunnnnnttttt") +INST(STRx_LDRx_imm_1, "STRx/LDRx (immediate)", "zz111000oo0iiiiiiiiip1nnnnnttttt") +INST(AND_shift, "AND (shifted register)", "z0001010ss0mmmmmiiiiiinnnnnddddd") +INST(BIC_shift, "BIC (shifted register)", "z0001010ss1mmmmmiiiiiinnnnnddddd") +INST(ORR_shift, "ORR (shifted register)", "z0101010ss0mmmmmiiiiiinnnnnddddd") +INST(ORN_shift, "ORN (shifted register)", "z0101010ss1mmmmmiiiiiinnnnnddddd") +INST(EOR_shift, "EOR (shifted register)", "z1001010ss0mmmmmiiiiiinnnnnddddd") +INST(EON, "EON (shifted register)", "z1001010ss1mmmmmiiiiiinnnnnddddd") +INST(ANDS_shift, "ANDS (shifted register)", "z1101010ss0mmmmmiiiiiinnnnnddddd") +INST(BICS, "BICS (shifted register)", "z1101010ss1mmmmmiiiiiinnnnnddddd") +INST(ADD_shift, "ADD (shifted register)", "z0001011ss0mmmmmiiiiiinnnnnddddd") +INST(ADDS_shift, "ADDS (shifted register)", "z0101011ss0mmmmmiiiiiinnnnnddddd") +INST(SUB_shift, "SUB (shifted register)", "z1001011ss0mmmmmiiiiiinnnnnddddd") +INST(SUBS_shift, "SUBS (shifted register)", "z1101011ss0mmmmmiiiiiinnnnnddddd") +INST(ADD_imm, "ADD (immediate)", "z0010001ssiiiiiiiiiiiinnnnnddddd") +INST(ADDS_imm, "ADDS (immediate)", "z0110001ssiiiiiiiiiiiinnnnnddddd") +INST(SUB_imm, "SUB (immediate)", "z1010001ssiiiiiiiiiiiinnnnnddddd") +INST(SUBS_imm, "SUBS (immediate)", "z1110001ssiiiiiiiiiiiinnnnnddddd") +INST(CBZ, "CBZ", "z0110100iiiiiiiiiiiiiiiiiiittttt") +INST(CBNZ, "CBNZ", "z0110101iiiiiiiiiiiiiiiiiiittttt") +INST(TBZ, "TBZ", "b0110110bbbbbiiiiiiiiiiiiiittttt") +INST(TBNZ, "TBNZ", "b0110111bbbbbiiiiiiiiiiiiiittttt") +INST(LDR_lit_gen, "LDR (literal)", "0z011000iiiiiiiiiiiiiiiiiiittttt") +INST(STNP_LDNP_fpsimd, "STNP/LDNP (SIMD&FP)", "oo1011000Liiiiiiiuuuuunnnnnttttt") +INST(UnallocatedEncoding, "", "--1010000-----------------------") +INST(UnallocatedEncoding, "", "--1011000-----------------------") +INST(STR_imm_fpsimd_2, "STR (immediate, SIMD&FP)", "zz111101o0iiiiiiiiiiiinnnnnttttt") +INST(LDR_imm_fpsimd_2, "LDR (immediate, SIMD&FP)", "zz111101o1iiiiiiiiiiiinnnnnttttt") +INST(ADR, "ADR", "0ii10000iiiiiiiiiiiiiiiiiiiddddd") +INST(ADRP, "ADRP", "1ii10000iiiiiiiiiiiiiiiiiiiddddd") +INST(B_uncond, "B", "000101iiiiiiiiiiiiiiiiiiiiiiiiii") +INST(BL, "BL", "100101iiiiiiiiiiiiiiiiiiiiiiiiii") +INST(LDR_lit_fpsimd, "LDR (literal, SIMD&FP)", "oo011100iiiiiiiiiiiiiiiiiiittttt") +INST(STRx_LDRx_imm_2, "STRx/LDRx (immediate)", "zz111001ooiiiiiiiiiiiinnnnnttttt") +INST(STP_LDP_gen, "STP/LDP", "oo10100pwLiiiiiiiuuuuunnnnnttttt") +INST(STP_LDP_fpsimd, "STP/LDP (SIMD&FP)", "oo10110pwLiiiiiiiuuuuunnnnnttttt") diff --git a/tools/gendynarm.cpp b/tools/gendynarm.cpp new file mode 100644 index 0000000000..3d1588e7e8 --- /dev/null +++ b/tools/gendynarm.cpp @@ -0,0 +1,1646 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +namespace mcl { +template +constexpr std::size_t bitsizeof = CHAR_BIT * sizeof(T); +} +namespace mcl::bit { +template +inline size_t count_ones(T x) { + return std::bitset>(x).count(); +} +} +template +inline consteval std::array StringToArray(const char (&str)[N + 1]) { + std::array result{}; + for (size_t i = 0; i < N; i++) { + result[i] = str[i]; + } + return result; +} +using opcode_type = uint32_t; +constexpr size_t opcode_bitsize = mcl::bitsizeof; +static opcode_type GetMaskAndExpect(std::string bitstring) { + const auto one = opcode_type(1); + opcode_type mask = 0; + for (size_t i = 0; i < opcode_bitsize; i++) { + const size_t bit_position = opcode_bitsize - i - 1; + switch (bitstring[i]) { + case '0': mask |= one << bit_position; break; + case '1': mask |= one << bit_position; break; + default: break; + } + } + return mask; +} +struct SortingInfo { + const char *first; + uint32_t second; + const char *inst_final; +}; +int main(int argc, char *argv[]) { + auto which = std::string{argv[1]}; + std::printf( +"// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project\n" +"// SPDX-License-Identifier: GPL-3.0-or-later\n" +"// DO NOT REORDER\n"); + if (which == "-arm") { + std::vector list = { +#define INST(fn, name, bitstring) { name, GetMaskAndExpect(bitstring), "INST(" #fn ", " #name ", " #bitstring ")" }, +// Barrier instructions +INST(arm_DMB, "DMB", "1111010101111111111100000101oooo") // v7 +INST(arm_DSB, "DSB", "1111010101111111111100000100oooo") // v7 +INST(arm_ISB, "ISB", "1111010101111111111100000110oooo") // v7 + +// Branch instructions +INST(arm_BLX_imm, "BLX (imm)", "1111101hvvvvvvvvvvvvvvvvvvvvvvvv") // v5 +INST(arm_BLX_reg, "BLX (reg)", "cccc000100101111111111110011mmmm") // v5 +INST(arm_B, "B", "cccc1010vvvvvvvvvvvvvvvvvvvvvvvv") // v1 +INST(arm_BL, "BL", "cccc1011vvvvvvvvvvvvvvvvvvvvvvvv") // v1 +INST(arm_BX, "BX", "cccc000100101111111111110001mmmm") // v4T +INST(arm_BXJ, "BXJ", "cccc000100101111111111110010mmmm") // v5J + +// CRC32 instructions +INST(arm_CRC32, "CRC32", "cccc00010zz0nnnndddd00000100mmmm") // v8 +INST(arm_CRC32C, "CRC32C", "cccc00010zz0nnnndddd00100100mmmm") // v8 + +// Coprocessor instructions +INST(arm_CDP, "CDP", "cccc1110ooooNNNNDDDDppppooo0MMMM") // v2 (CDP2: v5) +INST(arm_LDC, "LDC", "cccc110pudw1nnnnDDDDppppvvvvvvvv") // v2 (LDC2: v5) +INST(arm_MCR, "MCR", "cccc1110ooo0NNNNttttppppooo1MMMM") // v2 (MCR2: v5) +INST(arm_MCRR, "MCRR", "cccc11000100uuuuttttppppooooMMMM") // v5E (MCRR2: v6) +INST(arm_MRC, "MRC", "cccc1110ooo1NNNNttttppppooo1MMMM") // v2 (MRC2: v5) +INST(arm_MRRC, "MRRC", "cccc11000101uuuuttttppppooooMMMM") // v5E (MRRC2: v6) +INST(arm_STC, "STC", "cccc110pudw0nnnnDDDDppppvvvvvvvv") // v2 (STC2: v5) + +// Data Processing instructions +INST(arm_ADC_imm, "ADC (imm)", "cccc0010101Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_ADC_reg, "ADC (reg)", "cccc0000101Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_ADC_rsr, "ADC (rsr)", "cccc0000101Snnnnddddssss0rr1mmmm") // v1 +INST(arm_ADD_imm, "ADD (imm)", "cccc0010100Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_ADD_reg, "ADD (reg)", "cccc0000100Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_ADD_rsr, "ADD (rsr)", "cccc0000100Snnnnddddssss0rr1mmmm") // v1 +INST(arm_AND_imm, "AND (imm)", "cccc0010000Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_AND_reg, "AND (reg)", "cccc0000000Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_AND_rsr, "AND (rsr)", "cccc0000000Snnnnddddssss0rr1mmmm") // v1 +INST(arm_BIC_imm, "BIC (imm)", "cccc0011110Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_BIC_reg, "BIC (reg)", "cccc0001110Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_BIC_rsr, "BIC (rsr)", "cccc0001110Snnnnddddssss0rr1mmmm") // v1 +INST(arm_CMN_imm, "CMN (imm)", "cccc00110111nnnn0000rrrrvvvvvvvv") // v1 +INST(arm_CMN_reg, "CMN (reg)", "cccc00010111nnnn0000vvvvvrr0mmmm") // v1 +INST(arm_CMN_rsr, "CMN (rsr)", "cccc00010111nnnn0000ssss0rr1mmmm") // v1 +INST(arm_CMP_imm, "CMP (imm)", "cccc00110101nnnn0000rrrrvvvvvvvv") // v1 +INST(arm_CMP_reg, "CMP (reg)", "cccc00010101nnnn0000vvvvvrr0mmmm") // v1 +INST(arm_CMP_rsr, "CMP (rsr)", "cccc00010101nnnn0000ssss0rr1mmmm") // v1 +INST(arm_EOR_imm, "EOR (imm)", "cccc0010001Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_EOR_reg, "EOR (reg)", "cccc0000001Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_EOR_rsr, "EOR (rsr)", "cccc0000001Snnnnddddssss0rr1mmmm") // v1 +INST(arm_MOV_imm, "MOV (imm)", "cccc0011101S0000ddddrrrrvvvvvvvv") // v1 +INST(arm_MOV_reg, "MOV (reg)", "cccc0001101S0000ddddvvvvvrr0mmmm") // v1 +INST(arm_MOV_rsr, "MOV (rsr)", "cccc0001101S0000ddddssss0rr1mmmm") // v1 +INST(arm_MVN_imm, "MVN (imm)", "cccc0011111S0000ddddrrrrvvvvvvvv") // v1 +INST(arm_MVN_reg, "MVN (reg)", "cccc0001111S0000ddddvvvvvrr0mmmm") // v1 +INST(arm_MVN_rsr, "MVN (rsr)", "cccc0001111S0000ddddssss0rr1mmmm") // v1 +INST(arm_ORR_imm, "ORR (imm)", "cccc0011100Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_ORR_reg, "ORR (reg)", "cccc0001100Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_ORR_rsr, "ORR (rsr)", "cccc0001100Snnnnddddssss0rr1mmmm") // v1 +INST(arm_RSB_imm, "RSB (imm)", "cccc0010011Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_RSB_reg, "RSB (reg)", "cccc0000011Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_RSB_rsr, "RSB (rsr)", "cccc0000011Snnnnddddssss0rr1mmmm") // v1 +INST(arm_RSC_imm, "RSC (imm)", "cccc0010111Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_RSC_reg, "RSC (reg)", "cccc0000111Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_RSC_rsr, "RSC (rsr)", "cccc0000111Snnnnddddssss0rr1mmmm") // v1 +INST(arm_SBC_imm, "SBC (imm)", "cccc0010110Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_SBC_reg, "SBC (reg)", "cccc0000110Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_SBC_rsr, "SBC (rsr)", "cccc0000110Snnnnddddssss0rr1mmmm") // v1 +INST(arm_SUB_imm, "SUB (imm)", "cccc0010010Snnnnddddrrrrvvvvvvvv") // v1 +INST(arm_SUB_reg, "SUB (reg)", "cccc0000010Snnnnddddvvvvvrr0mmmm") // v1 +INST(arm_SUB_rsr, "SUB (rsr)", "cccc0000010Snnnnddddssss0rr1mmmm") // v1 +INST(arm_TEQ_imm, "TEQ (imm)", "cccc00110011nnnn0000rrrrvvvvvvvv") // v1 +INST(arm_TEQ_reg, "TEQ (reg)", "cccc00010011nnnn0000vvvvvrr0mmmm") // v1 +INST(arm_TEQ_rsr, "TEQ (rsr)", "cccc00010011nnnn0000ssss0rr1mmmm") // v1 +INST(arm_TST_imm, "TST (imm)", "cccc00110001nnnn0000rrrrvvvvvvvv") // v1 +INST(arm_TST_reg, "TST (reg)", "cccc00010001nnnn0000vvvvvrr0mmmm") // v1 +INST(arm_TST_rsr, "TST (rsr)", "cccc00010001nnnn0000ssss0rr1mmmm") // v1 + +// Exception Generating instructions +INST(arm_BKPT, "BKPT", "cccc00010010vvvvvvvvvvvv0111vvvv") // v5 +INST(arm_SVC, "SVC", "cccc1111vvvvvvvvvvvvvvvvvvvvvvvv") // v1 +INST(arm_UDF, "UDF", "111001111111------------1111----") + +// Extension instructions +INST(arm_SXTB, "SXTB", "cccc011010101111ddddrr000111mmmm") // v6 +INST(arm_SXTB16, "SXTB16", "cccc011010001111ddddrr000111mmmm") // v6 +INST(arm_SXTH, "SXTH", "cccc011010111111ddddrr000111mmmm") // v6 +INST(arm_SXTAB, "SXTAB", "cccc01101010nnnnddddrr000111mmmm") // v6 +INST(arm_SXTAB16, "SXTAB16", "cccc01101000nnnnddddrr000111mmmm") // v6 +INST(arm_SXTAH, "SXTAH", "cccc01101011nnnnddddrr000111mmmm") // v6 +INST(arm_UXTB, "UXTB", "cccc011011101111ddddrr000111mmmm") // v6 +INST(arm_UXTB16, "UXTB16", "cccc011011001111ddddrr000111mmmm") // v6 +INST(arm_UXTH, "UXTH", "cccc011011111111ddddrr000111mmmm") // v6 +INST(arm_UXTAB, "UXTAB", "cccc01101110nnnnddddrr000111mmmm") // v6 +INST(arm_UXTAB16, "UXTAB16", "cccc01101100nnnnddddrr000111mmmm") // v6 +INST(arm_UXTAH, "UXTAH", "cccc01101111nnnnddddrr000111mmmm") // v6 + +// Hint instructions +INST(arm_PLD_imm, "PLD (imm)", "11110101uz01nnnn1111iiiiiiiiiiii") // v5E for PLD; v7 for PLDW +INST(arm_PLD_reg, "PLD (reg)", "11110111uz01nnnn1111iiiiitt0mmmm") // v5E for PLD; v7 for PLDW +INST(arm_SEV, "SEV", "----0011001000001111000000000100") // v6K +INST(arm_SEVL, "SEVL", "----0011001000001111000000000101") // v8 +INST(arm_WFE, "WFE", "----0011001000001111000000000010") // v6K +INST(arm_WFI, "WFI", "----0011001000001111000000000011") // v6K +INST(arm_YIELD, "YIELD", "----0011001000001111000000000001") // v6K +INST(arm_NOP, "Reserved Hint", "----0011001000001111------------") +INST(arm_NOP, "Reserved Hint", "----001100100000111100000000----") + +// Synchronization Primitive instructions +INST(arm_CLREX, "CLREX", "11110101011111111111000000011111") // v6K +INST(arm_SWP, "SWP", "cccc00010000nnnntttt00001001uuuu") // v2S (v6: Deprecated) +INST(arm_SWPB, "SWPB", "cccc00010100nnnntttt00001001uuuu") // v2S (v6: Deprecated) +INST(arm_STL, "STL", "cccc00011000nnnn111111001001tttt") // v8 +INST(arm_STLEX, "STLEX", "cccc00011000nnnndddd11101001tttt") // v8 +INST(arm_STREX, "STREX", "cccc00011000nnnndddd11111001mmmm") // v6 +INST(arm_LDA, "LDA", "cccc00011001nnnndddd110010011111") // v8 +INST(arm_LDAEX, "LDAEX", "cccc00011001nnnndddd111010011111") // v8 +INST(arm_LDREX, "LDREX", "cccc00011001nnnndddd111110011111") // v6 +INST(arm_STLEXD, "STLEXD", "cccc00011010nnnndddd11101001mmmm") // v8 +INST(arm_STREXD, "STREXD", "cccc00011010nnnndddd11111001mmmm") // v6K +INST(arm_LDAEXD, "LDAEXD", "cccc00011011nnnndddd111010011111") // v8 +INST(arm_LDREXD, "LDREXD", "cccc00011011nnnndddd111110011111") // v6K +INST(arm_STLB, "STLB", "cccc00011100nnnn111111001001tttt") // v8 +INST(arm_STLEXB, "STLEXB", "cccc00011100nnnndddd11101001mmmm") // v8 +INST(arm_STREXB, "STREXB", "cccc00011100nnnndddd11111001mmmm") // v6K +INST(arm_LDAB, "LDAB", "cccc00011101nnnndddd110010011111") // v8 +INST(arm_LDAEXB, "LDAEXB", "cccc00011101nnnndddd111010011111") // v8 +INST(arm_LDREXB, "LDREXB", "cccc00011101nnnndddd111110011111") // v6K +INST(arm_STLH, "STLH", "cccc00011110nnnn111111001001mmmm") // v8 +INST(arm_STLEXH, "STLEXH", "cccc00011110nnnndddd11101001mmmm") // v8 +INST(arm_STREXH, "STREXH", "cccc00011110nnnndddd11111001mmmm") // v6K +INST(arm_LDAH, "LDAH", "cccc00011111nnnndddd110010011111") // v8 +INST(arm_LDAEXH, "LDAEXH", "cccc00011111nnnndddd111010011111") // v8 +INST(arm_LDREXH, "LDREXH", "cccc00011111nnnndddd111110011111") // v6K + +// Load/Store instructions +INST(arm_LDRBT, "LDRBT (A1)", "----0100-111--------------------") // v1 +INST(arm_LDRBT, "LDRBT (A2)", "----0110-111---------------0----") // v1 +INST(arm_LDRHT, "LDRHT (A1)", "----0000-111------------1011----") // v6T2 +INST(arm_LDRHT, "LDRHT (A1)", "----0000-1111111--------1011----") // v6T2 +INST(arm_LDRHT, "LDRHT (A2)", "----0000-011--------00001011----") // v6T2 +INST(arm_LDRSBT, "LDRSBT (A1)", "----0000-111------------1101----") // v6T2 +INST(arm_LDRSBT, "LDRSBT (A2)", "----0000-011--------00001101----") // v6T2 +INST(arm_LDRSHT, "LDRSHT (A1)", "----0000-111------------1111----") // v6T2 +INST(arm_LDRSHT, "LDRSHT (A2)", "----0000-011--------00001111----") // v6T2 +INST(arm_LDRT, "LDRT (A1)", "----0100-011--------------------") // v1 +INST(arm_LDRT, "LDRT (A2)", "----0110-011---------------0----") // v1 +INST(arm_STRBT, "STRBT (A1)", "----0100-110--------------------") // v1 +INST(arm_STRBT, "STRBT (A2)", "----0110-110---------------0----") // v1 +INST(arm_STRHT, "STRHT (A1)", "----0000-110------------1011----") // v6T2 +INST(arm_STRHT, "STRHT (A2)", "----0000-010--------00001011----") // v6T2 +INST(arm_STRT, "STRT (A1)", "----0100-010--------------------") // v1 +INST(arm_STRT, "STRT (A2)", "----0110-010---------------0----") // v1 +INST(arm_LDR_lit, "LDR (lit)", "cccc0101u0011111ttttvvvvvvvvvvvv") // v1 +INST(arm_LDR_imm, "LDR (imm)", "cccc010pu0w1nnnnttttvvvvvvvvvvvv") // v1 +INST(arm_LDR_reg, "LDR (reg)", "cccc011pu0w1nnnnttttvvvvvrr0mmmm") // v1 +INST(arm_LDRB_lit, "LDRB (lit)", "cccc0101u1011111ttttvvvvvvvvvvvv") // v1 +INST(arm_LDRB_imm, "LDRB (imm)", "cccc010pu1w1nnnnttttvvvvvvvvvvvv") // v1 +INST(arm_LDRB_reg, "LDRB (reg)", "cccc011pu1w1nnnnttttvvvvvrr0mmmm") // v1 +INST(arm_LDRD_lit, "LDRD (lit)", "cccc0001u1001111ttttvvvv1101vvvv") // v5E +INST(arm_LDRD_imm, "LDRD (imm)", "cccc000pu1w0nnnnttttvvvv1101vvvv") // v5E +INST(arm_LDRD_reg, "LDRD (reg)", "cccc000pu0w0nnnntttt00001101mmmm") // v5E +INST(arm_LDRH_lit, "LDRH (lit)", "cccc000pu1w11111ttttvvvv1011vvvv") // v4 +INST(arm_LDRH_imm, "LDRH (imm)", "cccc000pu1w1nnnnttttvvvv1011vvvv") // v4 +INST(arm_LDRH_reg, "LDRH (reg)", "cccc000pu0w1nnnntttt00001011mmmm") // v4 +INST(arm_LDRSB_lit, "LDRSB (lit)", "cccc0001u1011111ttttvvvv1101vvvv") // v4 +INST(arm_LDRSB_imm, "LDRSB (imm)", "cccc000pu1w1nnnnttttvvvv1101vvvv") // v4 +INST(arm_LDRSB_reg, "LDRSB (reg)", "cccc000pu0w1nnnntttt00001101mmmm") // v4 +INST(arm_LDRSH_lit, "LDRSH (lit)", "cccc0001u1011111ttttvvvv1111vvvv") // v4 +INST(arm_LDRSH_imm, "LDRSH (imm)", "cccc000pu1w1nnnnttttvvvv1111vvvv") // v4 +INST(arm_LDRSH_reg, "LDRSH (reg)", "cccc000pu0w1nnnntttt00001111mmmm") // v4 +INST(arm_STR_imm, "STR (imm)", "cccc010pu0w0nnnnttttvvvvvvvvvvvv") // v1 +INST(arm_STR_reg, "STR (reg)", "cccc011pu0w0nnnnttttvvvvvrr0mmmm") // v1 +INST(arm_STRB_imm, "STRB (imm)", "cccc010pu1w0nnnnttttvvvvvvvvvvvv") // v1 +INST(arm_STRB_reg, "STRB (reg)", "cccc011pu1w0nnnnttttvvvvvrr0mmmm") // v1 +INST(arm_STRD_imm, "STRD (imm)", "cccc000pu1w0nnnnttttvvvv1111vvvv") // v5E +INST(arm_STRD_reg, "STRD (reg)", "cccc000pu0w0nnnntttt00001111mmmm") // v5E +INST(arm_STRH_imm, "STRH (imm)", "cccc000pu1w0nnnnttttvvvv1011vvvv") // v4 +INST(arm_STRH_reg, "STRH (reg)", "cccc000pu0w0nnnntttt00001011mmmm") // v4 + +// Load/Store Multiple instructions +INST(arm_LDM, "LDM", "cccc100010w1nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_LDMDA, "LDMDA", "cccc100000w1nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_LDMDB, "LDMDB", "cccc100100w1nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_LDMIB, "LDMIB", "cccc100110w1nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_LDM_usr, "LDM (usr reg)", "----100--101--------------------") // v1 +INST(arm_LDM_eret, "LDM (exce ret)", "----100--1-1----1---------------") // v1 +INST(arm_STM, "STM", "cccc100010w0nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_STMDA, "STMDA", "cccc100000w0nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_STMDB, "STMDB", "cccc100100w0nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_STMIB, "STMIB", "cccc100110w0nnnnxxxxxxxxxxxxxxxx") // v1 +INST(arm_STM_usr, "STM (usr reg)", "----100--100--------------------") // v1 + +// Miscellaneous instructions +INST(arm_BFC, "BFC", "cccc0111110vvvvvddddvvvvv0011111") // v6T2 +INST(arm_BFI, "BFI", "cccc0111110vvvvvddddvvvvv001nnnn") // v6T2 +INST(arm_CLZ, "CLZ", "cccc000101101111dddd11110001mmmm") // v5 +INST(arm_MOVT, "MOVT", "cccc00110100vvvvddddvvvvvvvvvvvv") // v6T2 +INST(arm_MOVW, "MOVW", "cccc00110000vvvvddddvvvvvvvvvvvv") // v6T2 +INST(arm_NOP, "NOP", "----0011001000001111000000000000") // v6K +INST(arm_SBFX, "SBFX", "cccc0111101wwwwwddddvvvvv101nnnn") // v6T2 +INST(arm_SEL, "SEL", "cccc01101000nnnndddd11111011mmmm") // v6 +INST(arm_UBFX, "UBFX", "cccc0111111wwwwwddddvvvvv101nnnn") // v6T2 + +// Unsigned Sum of Absolute Differences instructions +INST(arm_USAD8, "USAD8", "cccc01111000dddd1111mmmm0001nnnn") // v6 +INST(arm_USADA8, "USADA8", "cccc01111000ddddaaaammmm0001nnnn") // v6 + +// Packing instructions +INST(arm_PKHBT, "PKHBT", "cccc01101000nnnnddddvvvvv001mmmm") // v6K +INST(arm_PKHTB, "PKHTB", "cccc01101000nnnnddddvvvvv101mmmm") // v6K + +// Reversal instructions +INST(arm_RBIT, "RBIT", "cccc011011111111dddd11110011mmmm") // v6T2 +INST(arm_REV, "REV", "cccc011010111111dddd11110011mmmm") // v6 +INST(arm_REV16, "REV16", "cccc011010111111dddd11111011mmmm") // v6 +INST(arm_REVSH, "REVSH", "cccc011011111111dddd11111011mmmm") // v6 + +// Saturation instructions +INST(arm_SSAT, "SSAT", "cccc0110101vvvvvddddvvvvvr01nnnn") // v6 +INST(arm_SSAT16, "SSAT16", "cccc01101010vvvvdddd11110011nnnn") // v6 +INST(arm_USAT, "USAT", "cccc0110111vvvvvddddvvvvvr01nnnn") // v6 +INST(arm_USAT16, "USAT16", "cccc01101110vvvvdddd11110011nnnn") // v6 + +// Divide instructions +INST(arm_SDIV, "SDIV", "cccc01110001dddd1111mmmm0001nnnn") // v7a +INST(arm_UDIV, "UDIV", "cccc01110011dddd1111mmmm0001nnnn") // v7a + +// Multiply (Normal) instructions +INST(arm_MLA, "MLA", "cccc0000001Sddddaaaammmm1001nnnn") // v2 +INST(arm_MLS, "MLS", "cccc00000110ddddaaaammmm1001nnnn") // v6T2 +INST(arm_MUL, "MUL", "cccc0000000Sdddd0000mmmm1001nnnn") // v2 + +// Multiply (Long) instructions +INST(arm_SMLAL, "SMLAL", "cccc0000111Sddddaaaammmm1001nnnn") // v3M +INST(arm_SMULL, "SMULL", "cccc0000110Sddddaaaammmm1001nnnn") // v3M +INST(arm_UMAAL, "UMAAL", "cccc00000100ddddaaaammmm1001nnnn") // v6 +INST(arm_UMLAL, "UMLAL", "cccc0000101Sddddaaaammmm1001nnnn") // v3M +INST(arm_UMULL, "UMULL", "cccc0000100Sddddaaaammmm1001nnnn") // v3M + +// Multiply (Halfword) instructions +INST(arm_SMLALxy, "SMLALXY", "cccc00010100ddddaaaammmm1xy0nnnn") // v5xP +INST(arm_SMLAxy, "SMLAXY", "cccc00010000ddddaaaammmm1xy0nnnn") // v5xP +INST(arm_SMULxy, "SMULXY", "cccc00010110dddd0000mmmm1xy0nnnn") // v5xP + +// Multiply (Word by Halfword) instructions +INST(arm_SMLAWy, "SMLAWY", "cccc00010010ddddaaaammmm1y00nnnn") // v5xP +INST(arm_SMULWy, "SMULWY", "cccc00010010dddd0000mmmm1y10nnnn") // v5xP + +// Multiply (Most Significant Word) instructions +INST(arm_SMMUL, "SMMUL", "cccc01110101dddd1111mmmm00R1nnnn") // v6 +INST(arm_SMMLA, "SMMLA", "cccc01110101ddddaaaammmm00R1nnnn") // v6 +INST(arm_SMMLS, "SMMLS", "cccc01110101ddddaaaammmm11R1nnnn") // v6 + +// Multiply (Dual) instructions +INST(arm_SMLAD, "SMLAD", "cccc01110000ddddaaaammmm00M1nnnn") // v6 +INST(arm_SMLALD, "SMLALD", "cccc01110100ddddaaaammmm00M1nnnn") // v6 +INST(arm_SMLSD, "SMLSD", "cccc01110000ddddaaaammmm01M1nnnn") // v6 +INST(arm_SMLSLD, "SMLSLD", "cccc01110100ddddaaaammmm01M1nnnn") // v6 +INST(arm_SMUAD, "SMUAD", "cccc01110000dddd1111mmmm00M1nnnn") // v6 +INST(arm_SMUSD, "SMUSD", "cccc01110000dddd1111mmmm01M1nnnn") // v6 + +// Parallel Add/Subtract (Modulo) instructions +INST(arm_SADD8, "SADD8", "cccc01100001nnnndddd11111001mmmm") // v6 +INST(arm_SADD16, "SADD16", "cccc01100001nnnndddd11110001mmmm") // v6 +INST(arm_SASX, "SASX", "cccc01100001nnnndddd11110011mmmm") // v6 +INST(arm_SSAX, "SSAX", "cccc01100001nnnndddd11110101mmmm") // v6 +INST(arm_SSUB8, "SSUB8", "cccc01100001nnnndddd11111111mmmm") // v6 +INST(arm_SSUB16, "SSUB16", "cccc01100001nnnndddd11110111mmmm") // v6 +INST(arm_UADD8, "UADD8", "cccc01100101nnnndddd11111001mmmm") // v6 +INST(arm_UADD16, "UADD16", "cccc01100101nnnndddd11110001mmmm") // v6 +INST(arm_UASX, "UASX", "cccc01100101nnnndddd11110011mmmm") // v6 +INST(arm_USAX, "USAX", "cccc01100101nnnndddd11110101mmmm") // v6 +INST(arm_USUB8, "USUB8", "cccc01100101nnnndddd11111111mmmm") // v6 +INST(arm_USUB16, "USUB16", "cccc01100101nnnndddd11110111mmmm") // v6 + +// Parallel Add/Subtract (Saturating) instructions +INST(arm_QADD8, "QADD8", "cccc01100010nnnndddd11111001mmmm") // v6 +INST(arm_QADD16, "QADD16", "cccc01100010nnnndddd11110001mmmm") // v6 +INST(arm_QASX, "QASX", "cccc01100010nnnndddd11110011mmmm") // v6 +INST(arm_QSAX, "QSAX", "cccc01100010nnnndddd11110101mmmm") // v6 +INST(arm_QSUB8, "QSUB8", "cccc01100010nnnndddd11111111mmmm") // v6 +INST(arm_QSUB16, "QSUB16", "cccc01100010nnnndddd11110111mmmm") // v6 +INST(arm_UQADD8, "UQADD8", "cccc01100110nnnndddd11111001mmmm") // v6 +INST(arm_UQADD16, "UQADD16", "cccc01100110nnnndddd11110001mmmm") // v6 +INST(arm_UQASX, "UQASX", "cccc01100110nnnndddd11110011mmmm") // v6 +INST(arm_UQSAX, "UQSAX", "cccc01100110nnnndddd11110101mmmm") // v6 +INST(arm_UQSUB8, "UQSUB8", "cccc01100110nnnndddd11111111mmmm") // v6 +INST(arm_UQSUB16, "UQSUB16", "cccc01100110nnnndddd11110111mmmm") // v6 + +// Parallel Add/Subtract (Halving) instructions +INST(arm_SHADD8, "SHADD8", "cccc01100011nnnndddd11111001mmmm") // v6 +INST(arm_SHADD16, "SHADD16", "cccc01100011nnnndddd11110001mmmm") // v6 +INST(arm_SHASX, "SHASX", "cccc01100011nnnndddd11110011mmmm") // v6 +INST(arm_SHSAX, "SHSAX", "cccc01100011nnnndddd11110101mmmm") // v6 +INST(arm_SHSUB8, "SHSUB8", "cccc01100011nnnndddd11111111mmmm") // v6 +INST(arm_SHSUB16, "SHSUB16", "cccc01100011nnnndddd11110111mmmm") // v6 +INST(arm_UHADD8, "UHADD8", "cccc01100111nnnndddd11111001mmmm") // v6 +INST(arm_UHADD16, "UHADD16", "cccc01100111nnnndddd11110001mmmm") // v6 +INST(arm_UHASX, "UHASX", "cccc01100111nnnndddd11110011mmmm") // v6 +INST(arm_UHSAX, "UHSAX", "cccc01100111nnnndddd11110101mmmm") // v6 +INST(arm_UHSUB8, "UHSUB8", "cccc01100111nnnndddd11111111mmmm") // v6 +INST(arm_UHSUB16, "UHSUB16", "cccc01100111nnnndddd11110111mmmm") // v6 + +// Saturated Add/Subtract instructions +INST(arm_QADD, "QADD", "cccc00010000nnnndddd00000101mmmm") // v5xP +INST(arm_QSUB, "QSUB", "cccc00010010nnnndddd00000101mmmm") // v5xP +INST(arm_QDADD, "QDADD", "cccc00010100nnnndddd00000101mmmm") // v5xP +INST(arm_QDSUB, "QDSUB", "cccc00010110nnnndddd00000101mmmm") // v5xP + +// Status Register Access instructions +INST(arm_CPS, "CPS", "111100010000---00000000---0-----") // v6 +INST(arm_SETEND, "SETEND", "1111000100000001000000e000000000") // v6 +INST(arm_MRS, "MRS", "cccc000100001111dddd000000000000") // v3 +INST(arm_MSR_imm, "MSR (imm)", "cccc00110010mmmm1111rrrrvvvvvvvv") // v3 +INST(arm_MSR_reg, "MSR (reg)", "cccc00010010mmmm111100000000nnnn") // v3 +INST(arm_RFE, "RFE", "1111100--0-1----0000101000000000") // v6 +INST(arm_SRS, "SRS", "1111100--1-0110100000101000-----") // v6 +#undef INST + }; + // If a matcher has more bits in its mask it is more specific, so it should come first. + std::stable_sort(list.begin(), list.end(), [](const auto& matcher1, const auto& matcher2) { + return mcl::bit::count_ones(matcher1.second) > mcl::bit::count_ones(matcher2.second); + }); + for (auto const& e : list) + printf("%s\n", e.inst_final); + } else if (which == "-asimd") { + std::vector table = { +#define INST(fn, name, bitstring) { name, GetMaskAndExpect(bitstring), "INST(" #fn ", " #name ", " #bitstring ")" }, +// Three registers of the same length +INST(asimd_VHADD, "VHADD", "1111001U0Dzznnnndddd0000NQM0mmmm") // ASIMD +INST(asimd_VQADD, "VQADD", "1111001U0Dzznnnndddd0000NQM1mmmm") // ASIMD +INST(asimd_VRHADD, "VRHADD", "1111001U0Dzznnnndddd0001NQM0mmmm") // ASIMD +INST(asimd_VAND_reg, "VAND (register)", "111100100D00nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VBIC_reg, "VBIC (register)", "111100100D01nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VORR_reg, "VORR (register)", "111100100D10nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VORN_reg, "VORN (register)", "111100100D11nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VEOR_reg, "VEOR (register)", "111100110D00nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VBSL, "VBSL", "111100110D01nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VBIT, "VBIT", "111100110D10nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VBIF, "VBIF", "111100110D11nnnndddd0001NQM1mmmm") // ASIMD +INST(asimd_VHSUB, "VHSUB", "1111001U0Dzznnnndddd0010NQM0mmmm") // ASIMD +INST(asimd_VQSUB, "VQSUB", "1111001U0Dzznnnndddd0010NQM1mmmm") // ASIMD +INST(asimd_VCGT_reg, "VCGT (register)", "1111001U0Dzznnnndddd0011NQM0mmmm") // ASIMD +INST(asimd_VCGE_reg, "VCGE (register)", "1111001U0Dzznnnndddd0011NQM1mmmm") // ASIMD +INST(asimd_VSHL_reg, "VSHL (register)", "1111001U0Dzznnnndddd0100NQM0mmmm") // ASIMD +INST(asimd_VQSHL_reg, "VQSHL (register)", "1111001U0Dzznnnndddd0100NQM1mmmm") // ASIMD +INST(asimd_VRSHL, "VRSHL", "1111001U0Dzznnnndddd0101NQM0mmmm") // ASIMD +//INST(asimd_VQRSHL, "VQRSHL", "1111001U0-CC--------0101---1----") // ASIMD +INST(asimd_VMAX, "VMAX/VMIN (integer)", "1111001U0Dzznnnnmmmm0110NQMommmm") // ASIMD +INST(asimd_VABD, "VABD", "1111001U0Dzznnnndddd0111NQM0mmmm") // ASIMD +INST(asimd_VABA, "VABA", "1111001U0Dzznnnndddd0111NQM1mmmm") // ASIMD +INST(asimd_VADD_int, "VADD (integer)", "111100100Dzznnnndddd1000NQM0mmmm") // ASIMD +INST(asimd_VSUB_int, "VSUB (integer)", "111100110Dzznnnndddd1000NQM0mmmm") // ASIMD +INST(asimd_VTST, "VTST", "111100100Dzznnnndddd1000NQM1mmmm") // ASIMD +INST(asimd_VCEQ_reg, "VCEG (register)", "111100110Dzznnnndddd1000NQM1mmmm") // ASIMD +INST(asimd_VMLA, "VMLA/VMLS", "1111001o0Dzznnnndddd1001NQM0mmmm") // ASIMD +INST(asimd_VMUL, "VMUL", "1111001P0Dzznnnndddd1001NQM1mmmm") // ASIMD +INST(asimd_VPMAX_int, "VPMAX/VPMIN (integer)", "1111001U0Dzznnnndddd1010NQMommmm") // ASIMD +INST(v8_VMAXNM, "VMAXNM", "111100110D0znnnndddd1111NQM1mmmm") // v8 +INST(v8_VMINNM, "VMINNM", "111100110D1znnnndddd1111NQM1mmmm") // v8 +INST(asimd_VQDMULH, "VQDMULH", "111100100Dzznnnndddd1011NQM0mmmm") // ASIMD +INST(asimd_VQRDMULH, "VQRDMULH", "111100110Dzznnnndddd1011NQM0mmmm") // ASIMD +INST(asimd_VPADD, "VPADD", "111100100Dzznnnndddd1011NQM1mmmm") // ASIMD +INST(asimd_VFMA, "VFMA", "111100100D0znnnndddd1100NQM1mmmm") // ASIMD +INST(asimd_VFMS, "VFMS", "111100100D1znnnndddd1100NQM1mmmm") // ASIMD +INST(asimd_VADD_float, "VADD (floating-point)", "111100100D0znnnndddd1101NQM0mmmm") // ASIMD +INST(asimd_VSUB_float, "VSUB (floating-point)", "111100100D1znnnndddd1101NQM0mmmm") // ASIMD +INST(asimd_VPADD_float, "VPADD (floating-point)", "111100110D0znnnndddd1101NQM0mmmm") // ASIMD +INST(asimd_VABD_float, "VABD (floating-point)", "111100110D1znnnndddd1101NQM0mmmm") // ASIMD +INST(asimd_VMLA_float, "VMLA (floating-point)", "111100100D0znnnndddd1101NQM1mmmm") // ASIMD +INST(asimd_VMLS_float, "VMLS (floating-point)", "111100100D1znnnndddd1101NQM1mmmm") // ASIMD +INST(asimd_VMUL_float, "VMUL (floating-point)", "111100110D0znnnndddd1101NQM1mmmm") // ASIMD +INST(asimd_VCEQ_reg_float, "VCEQ (register)", "111100100D0znnnndddd1110NQM0mmmm") // ASIMD +INST(asimd_VCGE_reg_float, "VCGE (register)", "111100110D0znnnndddd1110NQM0mmmm") // ASIMD +INST(asimd_VCGT_reg_float, "VCGT (register)", "111100110D1znnnndddd1110NQM0mmmm") // ASIMD +INST(asimd_VACGE, "VACGE", "111100110Doznnnndddd1110NQM1mmmm") // ASIMD +INST(asimd_VMAX_float, "VMAX (floating-point)", "111100100D0znnnndddd1111NQM0mmmm") // ASIMD +INST(asimd_VMIN_float, "VMIN (floating-point)", "111100100D1znnnndddd1111NQM0mmmm") // ASIMD +INST(asimd_VPMAX_float, "VPMAX (floating-point)", "111100110D0znnnndddd1111NQM0mmmm") // ASIMD +INST(asimd_VPMIN_float, "VPMIN (floating-point)", "111100110D1znnnndddd1111NQM0mmmm") // ASIMD +INST(asimd_VRECPS, "VRECPS", "111100100D0znnnndddd1111NQM1mmmm") // ASIMD +INST(asimd_VRSQRTS, "VRSQRTS", "111100100D1znnnndddd1111NQM1mmmm") // ASIMD +INST(v8_SHA256H, "SHA256H", "111100110D00nnnndddd1100NQM0mmmm") // v8 +INST(v8_SHA256H2, "SHA256H2", "111100110D01nnnndddd1100NQM0mmmm") // v8 +INST(v8_SHA256SU1, "SHA256SU1", "111100110D10nnnndddd1100NQM0mmmm") // v8 + +// Three registers of different lengths +INST(asimd_VADDL, "VADDL/VADDW", "1111001U1Dzznnnndddd000oN0M0mmmm") // ASIMD +INST(asimd_VSUBL, "VSUBL/VSUBW", "1111001U1Dzznnnndddd001oN0M0mmmm") // ASIMD +//INST(asimd_VADDHN, "VADDHN", "111100101-----------0100-0-0----") // ASIMD +//INST(asimd_VRADDHN, "VRADDHN", "111100111-----------0100-0-0----") // ASIMD +INST(asimd_VABAL, "VABAL", "1111001U1Dzznnnndddd0101N0M0mmmm") // ASIMD +//INST(asimd_VSUBHN, "VSUBHN", "111100101-----------0110-0-0----") // ASIMD +//INST(asimd_VRSUBHN, "VRSUBHN", "111100111-----------0110-0-0----") // ASIMD +INST(asimd_VABDL, "VABDL", "1111001U1Dzznnnndddd0111N0M0mmmm") // ASIMD +INST(asimd_VMLAL, "VMLAL/VMLSL", "1111001U1Dzznnnndddd10o0N0M0mmmm") // ASIMD +//INST(asimd_VQDMLAL, "VQDMLAL", "111100101-----------10-1-0-0----") // ASIMD +INST(asimd_VMULL, "VMULL", "1111001U1Dzznnnndddd11P0N0M0mmmm") // ASIMD +//INST(asimd_VQDMULL, "VQDMULL", "111100101-----------1101-0-0----") // ASIMD + +// Two registers and a scalar +INST(asimd_VMLA_scalar, "VMLA (scalar)", "1111001Q1Dzznnnndddd0o0FN1M0mmmm") // ASIMD +INST(asimd_VMLAL_scalar, "VMLAL (scalar)", "1111001U1dzznnnndddd0o10N1M0mmmm") // ASIMD +//INST(asimd_VQDMLAL_scalar, "VQDMLAL/VQDMLSL (scalar)", "111100101-BB--------0x11-1-0----") // ASIMD +INST(asimd_VMUL_scalar, "VMUL (scalar)", "1111001Q1Dzznnnndddd100FN1M0mmmm") // ASIMD +INST(asimd_VMULL_scalar, "VMULL (scalar)", "1111001U1Dzznnnndddd1010N1M0mmmm") // ASIMD +INST(asimd_VQDMULL_scalar, "VQDMULL (scalar)", "111100101Dzznnnndddd1011N1M0mmmm") // ASIMD +INST(asimd_VQDMULH_scalar, "VQDMULH (scalar)", "1111001Q1Dzznnnndddd1100N1M0mmmm") // ASIMD +INST(asimd_VQRDMULH_scalar, "VQRDMULH (scalar)", "1111001Q1Dzznnnndddd1101N1M0mmmm") // ASIMD + +// Two registers and a shift amount +INST(asimd_SHR, "SHR", "1111001U1Diiiiiidddd0000LQM1mmmm") // ASIMD +INST(asimd_SRA, "SRA", "1111001U1Diiiiiidddd0001LQM1mmmm") // ASIMD +INST(asimd_VRSHR, "VRSHR", "1111001U1Diiiiiidddd0010LQM1mmmm") // ASIMD +INST(asimd_VRSRA, "VRSRA", "1111001U1Diiiiiidddd0011LQM1mmmm") // ASIMD +INST(asimd_VSRI, "VSRI", "111100111Diiiiiidddd0100LQM1mmmm") // ASIMD +INST(asimd_VSHL, "VSHL", "111100101Diiiiiidddd0101LQM1mmmm") // ASIMD +INST(asimd_VSLI, "VSLI", "111100111Diiiiiidddd0101LQM1mmmm") // ASIMD +INST(asimd_VQSHL, "VQSHL" , "1111001U1Diiiiiidddd011oLQM1mmmm") // ASIMD +INST(asimd_VSHRN, "VSHRN", "111100101Diiiiiidddd100000M1mmmm") // ASIMD +INST(asimd_VRSHRN, "VRSHRN", "111100101Diiiiiidddd100001M1mmmm") // ASIMD +INST(asimd_VQSHRUN, "VQSHRUN", "111100111Diiiiiidddd100000M1mmmm") // ASIMD +INST(asimd_VQRSHRUN, "VQRSHRUN", "111100111Diiiiiidddd100001M1mmmm") // ASIMD +INST(asimd_VQSHRN, "VQSHRN", "1111001U1Diiiiiidddd100100M1mmmm") // ASIMD +INST(asimd_VQRSHRN, "VQRSHRN", "1111001U1Diiiiiidddd100101M1mmmm") // ASIMD +INST(asimd_VSHLL, "VSHLL", "1111001U1Diiiiiidddd101000M1mmmm") // ASIMD +INST(asimd_VCVT_fixed, "VCVT (fixed-point)", "1111001U1Diiiiiidddd111o0QM1mmmm") // ASIMD + +// Two registers, miscellaneous +INST(asimd_VREV, "VREV{16,32,64}", "111100111D11zz00dddd000ooQM0mmmm") // ASIMD +INST(asimd_VPADDL, "VPADDL", "111100111D11zz00dddd0010oQM0mmmm") // ASIMD +INST(asimd_VCLS, "VCLS", "111100111D11zz00dddd01000QM0mmmm") // ASIMD +INST(asimd_VCLZ, "VCLZ", "111100111D11zz00dddd01001QM0mmmm") // ASIMD +INST(asimd_VCNT, "VCNT", "111100111D11zz00dddd01010QM0mmmm") // ASIMD +INST(asimd_VMVN_reg, "VMVN_reg", "111100111D11zz00dddd01011QM0mmmm") // ASIMD +INST(asimd_VPADAL, "VPADAL", "111100111D11zz00dddd0110oQM0mmmm") // ASIMD +INST(asimd_VQABS, "VQABS", "111100111D11zz00dddd01110QM0mmmm") // ASIMD +INST(asimd_VQNEG, "VQNEG", "111100111D11zz00dddd01111QM0mmmm") // ASIMD +INST(asimd_VCGT_zero, "VCGT (zero)", "111100111D11zz01dddd0F000QM0mmmm") // ASIMD +INST(asimd_VCGE_zero, "VCGE (zero)", "111100111D11zz01dddd0F001QM0mmmm") // ASIMD +INST(asimd_VCEQ_zero, "VCEQ (zero)", "111100111D11zz01dddd0F010QM0mmmm") // ASIMD +INST(asimd_VCLE_zero, "VCLE (zero)", "111100111D11zz01dddd0F011QM0mmmm") // ASIMD +INST(asimd_VCLT_zero, "VCLT (zero)", "111100111D11zz01dddd0F100QM0mmmm") // ASIMD +INST(arm_UDF, "UNALLOCATED", "111100111-11--01----01101--0----") // v8 +INST(asimd_VABS, "VABS", "111100111D11zz01dddd0F110QM0mmmm") // ASIMD +INST(asimd_VNEG, "VNEG", "111100111D11zz01dddd0F111QM0mmmm") // ASIMD +INST(asimd_VSWP, "VSWP", "111100111D110010dddd00000QM0mmmm") // ASIMD +INST(arm_UDF, "UNALLOCATED", "111100111-11--10----00000--0----") // ASIMD +INST(asimd_VTRN, "VTRN", "111100111D11zz10dddd00001QM0mmmm") // ASIMD +INST(asimd_VUZP, "VUZP", "111100111D11zz10dddd00010QM0mmmm") // ASIMD +INST(asimd_VZIP, "VZIP", "111100111D11zz10dddd00011QM0mmmm") // ASIMD +INST(asimd_VMOVN, "VMOVN", "111100111D11zz10dddd001000M0mmmm") // ASIMD +INST(asimd_VQMOVUN, "VQMOVUN", "111100111D11zz10dddd001001M0mmmm") // ASIMD +INST(asimd_VQMOVN, "VQMOVN", "111100111D11zz10dddd00101oM0mmmm") // ASIMD +INST(asimd_VSHLL_max, "VSHLL_max", "111100111D11zz10dddd001100M0mmmm") // ASIMD +INST(v8_VRINTN, "VRINTN", "111100111D11zz10dddd01000QM0mmmm") // v8 +INST(v8_VRINTX, "VRINTX", "111100111D11zz10dddd01001QM0mmmm") // v8 +INST(v8_VRINTA, "VRINTA", "111100111D11zz10dddd01010QM0mmmm") // v8 +INST(v8_VRINTZ, "VRINTZ", "111100111D11zz10dddd01011QM0mmmm") // v8 +INST(v8_VRINTM, "VRINTM", "111100111D11zz10dddd01101QM0mmmm") // v8 +INST(v8_VRINTP, "VRINTP", "111100111D11zz10dddd01111QM0mmmm") // v8 +INST(asimd_VCVT_half, "VCVT (half-precision)", "111100111D11zz10dddd011o00M0mmmm") // ASIMD +INST(arm_UDF, "UNALLOCATED", "111100111-11--10----011-01-0----") // ASIMD +INST(v8_VCVTA, "VCVTA", "111100111D11zz11dddd0000oQM0mmmm") // v8 +INST(v8_VCVTN, "VCVTN", "111100111D11zz11dddd0001oQM0mmmm") // v8 +INST(v8_VCVTP, "VCVTP", "111100111D11zz11dddd0010oQM0mmmm") // v8 +INST(v8_VCVTM, "VCVTM", "111100111D11zz11dddd0011oQM0mmmm") // v8 +INST(asimd_VRECPE, "VRECPE", "111100111D11zz11dddd010F0QM0mmmm") // ASIMD +INST(asimd_VRSQRTE, "VRSQRTE", "111100111D11zz11dddd010F1QM0mmmm") // ASIMD +INST(asimd_VCVT_integer, "VCVT (integer)", "111100111D11zz11dddd011oUQM0mmmm") // ASIMD + +// Two registers, cryptography +INST(v8_AESE, "AESE", "111100111D11zz00dddd001100M0mmmm") // v8 +INST(v8_AESD, "AESD", "111100111D11zz00dddd001101M0mmmm") // v8 +INST(v8_AESMC, "AESMC", "111100111D11zz00dddd001110M0mmmm") // v8 +INST(v8_AESIMC, "AESIMC", "111100111D11zz00dddd001111M0mmmm") // v8 +INST(arm_UDF, "UNALLOCATED", "111100111-11--01----001010-0----") // v8 +INST(arm_UDF, "UNALLOCATED (SHA1H)", "111100111-11--01----001011-0----") // v8 +INST(arm_UDF, "UNALLOCATED (SHA1SU1)", "111100111-11--10----001110-0----") // v8 +INST(v8_SHA256SU0, "SHA256SU0", "111100111D11zz10dddd001111M0mmmm") // v8 + +// One register and modified immediate +INST(asimd_VMOV_imm, "VBIC, VMOV, VMVN, VORR (immediate)", "1111001a1D000bcdVVVVmmmm0Qo1efgh") // ASIMD + +// Miscellaneous +INST(asimd_VEXT, "VEXT", "111100101D11nnnnddddiiiiNQM0mmmm") // ASIMD +INST(asimd_VTBL, "VTBL", "111100111D11nnnndddd10zzN0M0mmmm") // ASIMD +INST(asimd_VTBX, "VTBX", "111100111D11nnnndddd10zzN1M0mmmm") // ASIMD +INST(asimd_VDUP_scalar, "VDUP (scalar)", "111100111D11iiiidddd11000QM0mmmm") // ASIMD +INST(arm_UDF, "UNALLOCATED", "111100111-11--------11-----0----") // ASIMD + +// Advanced SIMD load/store structures +INST(v8_VST_multiple, "VST{1-4} (multiple)", "111101000D00nnnnddddxxxxzzaammmm") // v8 +INST(v8_VLD_multiple, "VLD{1-4} (multiple)", "111101000D10nnnnddddxxxxzzaammmm") // v8 +INST(arm_UDF, "UNALLOCATED", "111101000--0--------1011--------") // v8 +INST(arm_UDF, "UNALLOCATED", "111101000--0--------11----------") // v8 +INST(arm_UDF, "UNALLOCATED", "111101001-00--------11----------") // v8 +INST(v8_VLD_all_lanes, "VLD{1-4} (all lanes)", "111101001D10nnnndddd11nnzzTammmm") // v8 +INST(v8_VST_single, "VST{1-4} (single)", "111101001D00nnnnddddzzNNaaaammmm") // v8 +INST(v8_VLD_single, "VLD{1-4} (single)", "111101001D10nnnnddddzzNNaaaammmm") // v8 +#undef INST + }; + // Exceptions to the rule of thumb. + const std::set comes_first{ + "VBIC, VMOV, VMVN, VORR (immediate)", + "VEXT", + "VTBL", + "VTBX", + "VDUP (scalar)", + }; + const std::set comes_last{ + "VMLA (scalar)", + "VMLAL (scalar)", + "VQDMLAL/VQDMLSL (scalar)", + "VMUL (scalar)", + "VMULL (scalar)", + "VQDMULL (scalar)", + "VQDMULH (scalar)", + "VQRDMULH (scalar)", + }; + const auto sort_begin = std::stable_partition(table.begin(), table.end(), [&](const auto& e) { + return comes_first.count(e.first) > 0; + }); + const auto sort_end = std::stable_partition(table.begin(), table.end(), [&](const auto& e) { + return comes_last.count(e.first) == 0; + }); + // If a matcher has more bits in its mask it is more specific, so it should come first. + std::stable_sort(sort_begin, sort_end, [](const auto& a, const auto& b) { + return mcl::bit::count_ones(a.second) > mcl::bit::count_ones(b.second); + }); + for (auto const& e : table) + printf("%s\n", e.inst_final); + } else if (which == "-a64") { + std::vector list = { +#define INST(fn, name, bitstring) { name, GetMaskAndExpect(bitstring), "INST(" #fn ", " #name ", " #bitstring ")" }, +// Data processing - Immediate - PC relative addressing +INST(ADR, "ADR", "0ii10000iiiiiiiiiiiiiiiiiiiddddd") +INST(ADRP, "ADRP", "1ii10000iiiiiiiiiiiiiiiiiiiddddd") + +// Data processing - Immediate - Add/Sub (with tags) +//INST(ADDG, "ADDG", "1001000110iiiiii00IIIInnnnnddddd") // ARMv8.5 +//INST(SUBG, "SUBG", "1101000110iiiiii00IIIInnnnnddddd") // ARMv8.5 + +// Data processing - Immediate - Add/Sub +INST(ADD_imm, "ADD (immediate)", "z0010001ssiiiiiiiiiiiinnnnnddddd") +INST(ADDS_imm, "ADDS (immediate)", "z0110001ssiiiiiiiiiiiinnnnnddddd") +INST(SUB_imm, "SUB (immediate)", "z1010001ssiiiiiiiiiiiinnnnnddddd") +INST(SUBS_imm, "SUBS (immediate)", "z1110001ssiiiiiiiiiiiinnnnnddddd") + +// Data processing - Immediate - Logical +INST(AND_imm, "AND (immediate)", "z00100100Nrrrrrrssssssnnnnnddddd") +INST(ORR_imm, "ORR (immediate)", "z01100100Nrrrrrrssssssnnnnnddddd") +INST(EOR_imm, "EOR (immediate)", "z10100100Nrrrrrrssssssnnnnnddddd") +INST(ANDS_imm, "ANDS (immediate)", "z11100100Nrrrrrrssssssnnnnnddddd") + +// Data processing - Immediate - Move Wide +INST(MOVN, "MOVN", "z00100101ssiiiiiiiiiiiiiiiiddddd") +INST(MOVZ, "MOVZ", "z10100101ssiiiiiiiiiiiiiiiiddddd") +INST(MOVK, "MOVK", "z11100101ssiiiiiiiiiiiiiiiiddddd") + +// Data processing - Immediate - Bitfield +INST(SBFM, "SBFM", "z00100110Nrrrrrrssssssnnnnnddddd") +INST(BFM, "BFM", "z01100110Nrrrrrrssssssnnnnnddddd") +INST(UBFM, "UBFM", "z10100110Nrrrrrrssssssnnnnnddddd") +INST(ASR_1, "ASR (immediate, 32-bit)", "00010011000rrrrr011111nnnnnddddd") +INST(ASR_2, "ASR (immediate, 64-bit)", "1001001101rrrrrr111111nnnnnddddd") +INST(SXTB_1, "SXTB (32-bit)", "0001001100000000000111nnnnnddddd") +INST(SXTB_2, "SXTB (64-bit)", "1001001101000000000111nnnnnddddd") +INST(SXTH_1, "SXTH (32-bit)", "0001001100000000001111nnnnnddddd") +INST(SXTH_2, "SXTH (64-bit)", "1001001101000000001111nnnnnddddd") +INST(SXTW, "SXTW", "1001001101000000011111nnnnnddddd") + +// Data processing - Immediate - Extract +INST(EXTR, "EXTR", "z00100111N0mmmmmssssssnnnnnddddd") + +// Conditional branch +INST(B_cond, "B.cond", "01010100iiiiiiiiiiiiiiiiiii0cccc") + +// Exception generation +INST(SVC, "SVC", "11010100000iiiiiiiiiiiiiiii00001") +//INST(HVC, "HVC", "11010100000iiiiiiiiiiiiiiii00010") +//INST(SMC, "SMC", "11010100000iiiiiiiiiiiiiiii00011") +INST(BRK, "BRK", "11010100001iiiiiiiiiiiiiiii00000") +//INST(HLT, "HLT", "11010100010iiiiiiiiiiiiiiii00000") +//INST(DCPS1, "DCPS1", "11010100101iiiiiiiiiiiiiiii00001") +//INST(DCPS2, "DCPS2", "11010100101iiiiiiiiiiiiiiii00010") +//INST(DCPS3, "DCPS3", "11010100101iiiiiiiiiiiiiiii00011") + +// System +//INST(MSR_imm, "MSR (immediate)", "1101010100000ooo0100MMMMooo11111") +INST(HINT, "HINT", "11010101000000110010MMMMooo11111") +INST(NOP, "NOP", "11010101000000110010000000011111") +INST(YIELD, "YIELD", "11010101000000110010000000111111") +INST(WFE, "WFE", "11010101000000110010000001011111") +INST(WFI, "WFI", "11010101000000110010000001111111") +INST(SEV, "SEV", "11010101000000110010000010011111") +INST(SEVL, "SEVL", "11010101000000110010000010111111") +//INST(DGH, "DGH", "11010101000000110010000011011111") // v8.6 +//INST(WFET, "WFET", "110101010000001100010000000ddddd") // v8.7 +//INST(WFIT, "WFIT", "110101010000001100010000001ddddd") // v8.7 +//INST(XPAC_1, "XPACD, XPACI, XPACLRI", "110110101100000101000D11111ddddd") +//INST(XPAC_2, "XPACD, XPACI, XPACLRI", "11010101000000110010000011111111") +//INST(PACIA_1, "PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA", "110110101100000100Z000nnnnnddddd") +//INST(PACIA_2, "PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA", "1101010100000011001000-100-11111") +//INST(PACIB_1, "PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB", "110110101100000100Z001nnnnnddddd") +//INST(PACIB_2, "PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB", "1101010100000011001000-101-11111") +//INST(AUTIA_1, "AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIZA", "110110101100000100Z100nnnnnddddd") +//INST(AUTIA_2, "AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIZA", "1101010100000011001000-110-11111") +//INST(AUTIB_1, "AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZB", "110110101100000100Z101nnnnnddddd") +//INST(AUTIB_2, "AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZB", "1101010100000011001000-111-11111") +//INST(BTI, "BTI", "110101010000001100100100ii011111") // ARMv8.5 +//INST(ESB, "ESB", "11010101000000110010001000011111") +//INST(PSB, "PSB CSYNC", "11010101000000110010001000111111") +//INST(TSB, "TSB CSYNC", "11010101000000110010001001011111") // ARMv8.5 +//INST(CSDB, "CSDB", "11010101000000110010001010011111") +INST(CLREX, "CLREX", "11010101000000110011MMMM01011111") +INST(DSB, "DSB", "11010101000000110011MMMM10011111") +//INST(SSBB, "SSBB", "11010101000000110011000010011111") +//INST(PSSBB, "PSSBB", "11010101000000110011010010011111") +INST(DMB, "DMB", "11010101000000110011MMMM10111111") +INST(ISB, "ISB", "11010101000000110011MMMM11011111") +//INST(SB, "SB", "11010101000000110011000011111111") +//INST(SYS, "SYS", "1101010100001oooNNNNMMMMooottttt") +INST(MSR_reg, "MSR (register)", "110101010001poooNNNNMMMMooottttt") +//INST(SYSL, "SYSL", "1101010100101oooNNNNMMMMooottttt") +INST(MRS, "MRS", "110101010011poooNNNNMMMMooottttt") + +// System - Flag manipulation instructions +INST(CFINV, "CFINV", "11010101000000000100000000011111") // ARMv8.4 +INST(RMIF, "RMIF", "10111010000iiiiii00001nnnnn0IIII") // ARMv8.4 +//INST(SETF8, "SETF8", "0011101000000000000010nnnnn01101") // ARMv8.4 +//INST(SETF16, "SETF16", "0011101000000000010010nnnnn01101") // ARMv8.4 + +// System - Flag format instructions +INST(XAFlag, "XAFlag", "11010101000000000100000000111111") // ARMv8.5 +INST(AXFlag, "AXFlag", "11010101000000000100000001011111") // ARMv8.5 + +// SYS: Data Cache +INST(DC_IVAC, "DC IVAC", "110101010000100001110110001ttttt") +INST(DC_ISW, "DC ISW", "110101010000100001110110010ttttt") +INST(DC_CSW, "DC CSW", "110101010000100001111010010ttttt") +INST(DC_CISW, "DC CISW", "110101010000100001111110010ttttt") +INST(DC_ZVA, "DC ZVA", "110101010000101101110100001ttttt") +INST(DC_CVAC, "DC CVAC", "110101010000101101111010001ttttt") +INST(DC_CVAU, "DC CVAU", "110101010000101101111011001ttttt") +INST(DC_CVAP, "DC CVAP", "110101010000101101111100001ttttt") +INST(DC_CIVAC, "DC CIVAC", "110101010000101101111110001ttttt") + +// SYS: Instruction Cache +INST(IC_IALLU, "IC IALLU", "11010101000010000111010100011111") +INST(IC_IALLUIS, "IC IALLUIS", "11010101000010000111000100011111") +INST(IC_IVAU, "IC IVAU", "110101010000101101110101001ttttt") + +// Unconditional branch (Register) +INST(BLR, "BLR", "1101011000111111000000nnnnn00000") +INST(BR, "BR", "1101011000011111000000nnnnn00000") +//INST(DRPS, "DRPS", "11010110101111110000001111100000") +//INST(ERET, "ERET", "11010110100111110000001111100000") +INST(RET, "RET", "1101011001011111000000nnnnn00000") +//INST(BLRA, "BLRAA, BLRAAZ, BLRAB, BLRABZ", "1101011Z0011111100001Mnnnnnmmmmm") // ARMv8.3 +//INST(BRA, "BRAA, BRAAZ, BRAB, BRABZ", "1101011Z0001111100001Mnnnnnmmmmm") // ARMv8.3 +//INST(ERETA, "ERETAA, ERETAB", "110101101001111100001M1111111111") // ARMv8.3 +//INST(RETA, "RETAA, RETAB", "110101100101111100001M1111111111") // ARMv8.3 + +// Unconditional branch (immediate) +INST(B_uncond, "B", "000101iiiiiiiiiiiiiiiiiiiiiiiiii") +INST(BL, "BL", "100101iiiiiiiiiiiiiiiiiiiiiiiiii") + +// Compare and branch (immediate) +INST(CBZ, "CBZ", "z0110100iiiiiiiiiiiiiiiiiiittttt") +INST(CBNZ, "CBNZ", "z0110101iiiiiiiiiiiiiiiiiiittttt") +INST(TBZ, "TBZ", "b0110110bbbbbiiiiiiiiiiiiiittttt") +INST(TBNZ, "TBNZ", "b0110111bbbbbiiiiiiiiiiiiiittttt") + +// Loads and stores - Advanced SIMD Load/Store multiple structures +INST(STx_mult_1, "STx (multiple structures)", "0Q00110000000000oooozznnnnnttttt") +INST(STx_mult_2, "STx (multiple structures)", "0Q001100100mmmmmoooozznnnnnttttt") +INST(LDx_mult_1, "LDx (multiple structures)", "0Q00110001000000oooozznnnnnttttt") +INST(LDx_mult_2, "LDx (multiple structures)", "0Q001100110mmmmmoooozznnnnnttttt") + +// Loads and stores - Advanced SIMD Load/Store single structures +INST(ST1_sngl_1, "ST1 (single structure)", "0Q00110100000000oo0Szznnnnnttttt") +INST(ST1_sngl_2, "ST1 (single structure)", "0Q001101100mmmmmoo0Szznnnnnttttt") +INST(ST3_sngl_1, "ST3 (single structure)", "0Q00110100000000oo1Szznnnnnttttt") +INST(ST3_sngl_2, "ST3 (single structure)", "0Q001101100mmmmmoo1Szznnnnnttttt") +INST(ST2_sngl_1, "ST2 (single structure)", "0Q00110100100000oo0Szznnnnnttttt") +INST(ST2_sngl_2, "ST2 (single structure)", "0Q001101101mmmmmoo0Szznnnnnttttt") +INST(ST4_sngl_1, "ST4 (single structure)", "0Q00110100100000oo1Szznnnnnttttt") +INST(ST4_sngl_2, "ST4 (single structure)", "0Q001101101mmmmmoo1Szznnnnnttttt") +INST(LD1_sngl_1, "LD1 (single structure)", "0Q00110101000000oo0Szznnnnnttttt") +INST(LD1_sngl_2, "LD1 (single structure)", "0Q001101110mmmmmoo0Szznnnnnttttt") +INST(LD3_sngl_1, "LD3 (single structure)", "0Q00110101000000oo1Szznnnnnttttt") +INST(LD3_sngl_2, "LD3 (single structure)", "0Q001101110mmmmmoo1Szznnnnnttttt") +INST(LD1R_1, "LD1R", "0Q001101010000001100zznnnnnttttt") +INST(LD1R_2, "LD1R", "0Q001101110mmmmm1100zznnnnnttttt") +INST(LD3R_1, "LD3R", "0Q001101010000001110zznnnnnttttt") +INST(LD3R_2, "LD3R", "0Q001101110mmmmm1110zznnnnnttttt") +INST(LD2_sngl_1, "LD2 (single structure)", "0Q00110101100000oo0Szznnnnnttttt") +INST(LD2_sngl_2, "LD2 (single structure)", "0Q001101111mmmmmoo0Szznnnnnttttt") +INST(LD4_sngl_1, "LD4 (single structure)", "0Q00110101100000oo1Szznnnnnttttt") +INST(LD4_sngl_2, "LD4 (single structure)", "0Q001101111mmmmmoo1Szznnnnnttttt") +INST(LD2R_1, "LD2R", "0Q001101011000001100zznnnnnttttt") +INST(LD2R_2, "LD2R", "0Q001101111mmmmm1100zznnnnnttttt") +INST(LD4R_1, "LD4R", "0Q001101011000001110zznnnnnttttt") +INST(LD4R_2, "LD4R", "0Q001101111mmmmm1110zznnnnnttttt") + +// Loads and stores - Load/Store Exclusive +INST(STXR, "STXRB, STXRH, STXR", "zz001000000sssss011111nnnnnttttt") +INST(STLXR, "STLXRB, STLXRH, STLXR", "zz001000000sssss111111nnnnnttttt") +INST(STXP, "STXP", "1z001000001sssss0uuuuunnnnnttttt") +INST(STLXP, "STLXP", "1z001000001sssss1uuuuunnnnnttttt") +INST(LDXR, "LDXRB, LDXRH, LDXR", "zz00100001011111011111nnnnnttttt") +INST(LDAXR, "LDAXRB, LDAXRH, LDAXR", "zz00100001011111111111nnnnnttttt") +INST(LDXP, "LDXP", "1z001000011111110uuuuunnnnnttttt") +INST(LDAXP, "LDAXP", "1z001000011111111uuuuunnnnnttttt") +INST(STLLR, "STLLRB, STLLRH, STLLR", "zz00100010011111011111nnnnnttttt") +INST(STLR, "STLRB, STLRH, STLR", "zz00100010011111111111nnnnnttttt") +INST(LDLAR, "LDLARB, LDLARH, LDLAR", "zz00100011011111011111nnnnnttttt") +INST(LDAR, "LDARB, LDARH, LDAR", "zz00100011011111111111nnnnnttttt") +//INST(CASP, "CASP, CASPA, CASPAL, CASPL", "0z0010000L1sssssp11111nnnnnttttt") // ARMv8.1 +//INST(CASB, "CASB, CASAB, CASALB, CASLB", "000010001L1sssssp11111nnnnnttttt") // ARMv8.1 +//INST(CASH, "CASH, CASAH, CASALH, CASLH", "010010001L1sssssp11111nnnnnttttt") // ARMv8.1 +//INST(CAS, "CAS, CASA, CASAL, CASL", "1z0010001L1sssssp11111nnnnnttttt") // ARMv8.1 + +// Loads and stores - Load register (literal) +INST(LDR_lit_gen, "LDR (literal)", "0z011000iiiiiiiiiiiiiiiiiiittttt") +INST(LDRSW_lit, "LDRSW (literal)", "10011000iiiiiiiiiiiiiiiiiiittttt") +INST(PRFM_lit, "PRFM (literal)", "11011000iiiiiiiiiiiiiiiiiiittttt") +INST(LDR_lit_fpsimd, "LDR (literal, SIMD&FP)", "oo011100iiiiiiiiiiiiiiiiiiittttt") + +// Loads and stores - Load/Store no-allocate pair +INST(STNP_LDNP_gen, "STNP/LDNP", "o01010000Liiiiiiiuuuuunnnnnttttt") +INST(STNP_LDNP_fpsimd, "STNP/LDNP (SIMD&FP)", "oo1011000Liiiiiiiuuuuunnnnnttttt") + +// Loads and stores - Load/Store register pair +INST(STP_LDP_gen, "STP/LDP", "oo10100pwLiiiiiiiuuuuunnnnnttttt") +INST(UnallocatedEncoding, "", "--1010000-----------------------") +INST(STP_LDP_fpsimd, "STP/LDP (SIMD&FP)", "oo10110pwLiiiiiiiuuuuunnnnnttttt") +INST(UnallocatedEncoding, "", "--1011000-----------------------") + +// Loads and stores - Load/Store register (unscaled immediate) +INST(STURx_LDURx, "STURx/LDURx", "zz111000oo0iiiiiiiii00nnnnnttttt") +INST(UnallocatedEncoding, "", "111110001-0---------00----------") +INST(UnallocatedEncoding, "", "10111000110---------00----------") +INST(PRFM_imm, "PRFM (immediate)", "1111100110iiiiiiiiiiiinnnnnttttt") +INST(PRFM_unscaled_imm, "PRFM (unscaled offset)", "11111000100iiiiiiiii00nnnnnttttt") +INST(STUR_fpsimd, "STUR (SIMD&FP)", "zz111100o00iiiiiiiii00nnnnnttttt") +INST(LDUR_fpsimd, "LDUR (SIMD&FP)", "zz111100o10iiiiiiiii00nnnnnttttt") + +// Loads and stores - Load/Store register (immediate pre/post-indexed) +INST(STRx_LDRx_imm_1, "STRx/LDRx (immediate)", "zz111000oo0iiiiiiiiip1nnnnnttttt") +INST(STRx_LDRx_imm_2, "STRx/LDRx (immediate)", "zz111001ooiiiiiiiiiiiinnnnnttttt") +INST(UnallocatedEncoding, "", "111110001-0----------1----------") +INST(UnallocatedEncoding, "", "10111000110----------1----------") +INST(UnallocatedEncoding, "", "1111100111----------------------") +INST(UnallocatedEncoding, "", "1011100111----------------------") +INST(STR_imm_fpsimd_1, "STR (immediate, SIMD&FP)", "zz111100o00iiiiiiiiip1nnnnnttttt") +INST(STR_imm_fpsimd_2, "STR (immediate, SIMD&FP)", "zz111101o0iiiiiiiiiiiinnnnnttttt") +INST(LDR_imm_fpsimd_1, "LDR (immediate, SIMD&FP)", "zz111100o10iiiiiiiiip1nnnnnttttt") +INST(LDR_imm_fpsimd_2, "LDR (immediate, SIMD&FP)", "zz111101o1iiiiiiiiiiiinnnnnttttt") +//INST(STGP_1, "STGP (post-index)", "0110100010iiiiiiimmmmmnnnnnttttt") // ARMv8.5 +//INST(STGP_2, "STGP (pre-index)", "0110100110iiiiiiimmmmmnnnnnttttt") // ARMv8.5 +//INST(STGP_3, "STGP (signed-offset)", "0110100100iiiiiiimmmmmnnnnnttttt") // ARMv8.5 + +// Loads and stores - Load/Store register (unprivileged) +INST(STTRB, "STTRB", "00111000000iiiiiiiii10nnnnnttttt") +INST(LDTRB, "LDTRB", "00111000010iiiiiiiii10nnnnnttttt") +INST(LDTRSB, "LDTRSB", "00111000oo0iiiiiiiii10nnnnnttttt") +INST(STTRH, "STTRH", "01111000000iiiiiiiii10nnnnnttttt") +INST(LDTRH, "LDTRH", "01111000010iiiiiiiii10nnnnnttttt") +INST(LDTRSH, "LDTRSH", "01111000oo0iiiiiiiii10nnnnnttttt") +INST(STTR, "STTR", "zz111000000iiiiiiiii10nnnnnttttt") +INST(LDTR, "LDTR", "zz111000010iiiiiiiii10nnnnnttttt") +INST(LDTRSW, "LDTRSW", "10111000100iiiiiiiii10nnnnnttttt") + +// Loads and stores - Atomic memory options +//INST(LDADDB, "LDADDB, LDADDAB, LDADDALB, LDADDLB", "00111000AR1sssss000000nnnnnttttt") +//INST(LDCLRB, "LDCLRB, LDCLRAB, LDCLRALB, LDCLRLB", "00111000AR1sssss000100nnnnnttttt") +//INST(LDEORB, "LDEORB, LDEORAB, LDEORALB, LDEORLB", "00111000AR1sssss001000nnnnnttttt") +//INST(LDSETB, "LDSETB, LDSETAB, LDSETALB, LDSETLB", "00111000AR1sssss001100nnnnnttttt") +//INST(LDSMAXB, "LDSMAXB, LDSMAXAB, LDSMAXALB, LDSMAXLB", "00111000AR1sssss010000nnnnnttttt") +//INST(LDSMINB, "LDSMINB, LDSMINAB, LDSMINALB, LDSMINLB", "00111000AR1sssss010100nnnnnttttt") +//INST(LDUMAXB, "LDUMAXB, LDUMAXAB, LDUMAXALB, LDUMAXLB", "00111000AR1sssss011000nnnnnttttt") +//INST(LDUMINB, "LDUMINB, LDUMINAB, LDUMINALB, LDUMINLB", "00111000AR1sssss011100nnnnnttttt") +//INST(SWPB, "SWPB, SWPAB, SWPALB, SWPLB", "00111000AR1sssss100000nnnnnttttt") +//INST(LDAPRB, "LDAPRB", "0011100010111111110000nnnnnttttt") +//INST(LDADDH, "LDADDH, LDADDAH, LDADDALH, LDADDLH", "01111000AR1sssss000000nnnnnttttt") +//INST(LDCLRH, "LDCLRH, LDCLRAH, LDCLRALH, LDCLRLH", "01111000AR1sssss000100nnnnnttttt") +//INST(LDEORH, "LDEORH, LDEORAH, LDEORALH, LDEORLH", "01111000AR1sssss001000nnnnnttttt") +//INST(LDSETH, "LDSETH, LDSETAH, LDSETALH, LDSETLH", "01111000AR1sssss001100nnnnnttttt") +//INST(LDSMAXH, "LDSMAXH, LDSMAXAH, LDSMAXALH, LDSMAXLH", "01111000AR1sssss010000nnnnnttttt") +//INST(LDSMINH, "LDSMINH, LDSMINAH, LDSMINALH, LDSMINLH", "01111000AR1sssss010100nnnnnttttt") +//INST(LDUMAXH, "LDUMAXH, LDUMAXAH, LDUMAXALH, LDUMAXLH", "01111000AR1sssss011000nnnnnttttt") +//INST(LDUMINH, "LDUMINH, LDUMINAH, LDUMINALH, LDUMINLH", "01111000AR1sssss011100nnnnnttttt") +//INST(SWPH, "SWPH, SWPAH, SWPALH, SWPLH", "01111000AR1sssss100000nnnnnttttt") +//INST(LDAPRH, "LDAPRH", "0111100010111111110000nnnnnttttt") +//INST(LDADD, "LDADD, LDADDA, LDADDAL, LDADDL", "1-111000AR1sssss000000nnnnnttttt") +//INST(LDCLR, "LDCLR, LDCLRA, LDCLRAL, LDCLRL", "1-111000AR1sssss000100nnnnnttttt") +//INST(LDEOR, "LDEOR, LDEORA, LDEORAL, LDEORL", "1-111000AR1sssss001000nnnnnttttt") +//INST(LDSET, "LDSET, LDSETA, LDSETAL, LDSETL", "1-111000AR1sssss001100nnnnnttttt") +//INST(LDSMAX, "LDSMAX, LDSMAXA, LDSMAXAL, LDSMAXL", "1-111000AR1sssss010000nnnnnttttt") +//INST(LDSMIN, "LDSMIN, LDSMINA, LDSMINAL, LDSMINL", "1-111000AR1sssss010100nnnnnttttt") +//INST(LDUMAX, "LDUMAX, LDUMAXA, LDUMAXAL, LDUMAXL", "1-111000AR1sssss011000nnnnnttttt") +//INST(LDUMIN, "LDUMIN, LDUMINA, LDUMINAL, LDUMINL", "1-111000AR1sssss011100nnnnnttttt") +//INST(SWP, "SWP, SWPA, SWPAL, SWPL", "1-111000AR1sssss100000nnnnnttttt") +//INST(LDAPR, "LDAPR", "1-11100010111111110000nnnnnttttt") +//INST(LD64B, "LD64B", "1111100000111111110100nnnnnttttt") // v8.7 +//INST(ST64B, "ST64B", "1111100000111111100100nnnnnttttt") // v8.7 +//INST(ST64BV, "ST64BV", "11111000001sssss101100nnnnnttttt") // v8.7 +//INST(ST64BV0, "ST64BV0", "11111000001sssss101000nnnnnttttt") // v8.7 + +// Loads and stores - Load/Store register (register offset) +INST(STRx_reg, "STRx (register)", "zz111000o01mmmmmxxxS10nnnnnttttt") +INST(LDRx_reg, "LDRx (register)", "zz111000o11mmmmmxxxS10nnnnnttttt") +INST(STR_reg_fpsimd, "STR (register, SIMD&FP)", "zz111100o01mmmmmxxxS10nnnnnttttt") +INST(LDR_reg_fpsimd, "LDR (register, SIMD&FP)", "zz111100o11mmmmmxxxS10nnnnnttttt") + +// Loads and stores - Load/Store memory tags +//INST(STG_1, "STG (post-index)", "11011001001iiiiiiiii01nnnnn11111") // ARMv8.5 +//INST(STG_2, "STG (pre-index)", "11011001001iiiiiiiii11nnnnn11111") // ARMv8.5 +//INST(STG_3, "STG (signed-offset)", "11011001001iiiiiiiii10nnnnn11111") // ARMv8.5 +//INST(LDG, "LDG", "11011001011iiiiiiiii00nnnnnttttt") // ARMv8.5 +//INST(STZG_1, "STZG (post-index)", "11011001011iiiiiiiii01nnnnn11111") // ARMv8.5 +//INST(STZG_2, "STZG (pre-index)", "11011001011iiiiiiiii11nnnnn11111") // ARMv8.5 +//INST(STZG_3, "STZG (signed-offset)", "11011001011iiiiiiiii10nnnnn11111") // ARMv8.5 +//INST(ST2G_1, "ST2G (post-index)", "11011001101iiiiiiiii01nnnnn11111") // ARMv8.5 +//INST(ST2G_2, "ST2G (pre-index)", "11011001101iiiiiiiii11nnnnn11111") // ARMv8.5 +//INST(ST2G_3, "ST2G (signed-offset)", "11011001101iiiiiiiii10nnnnn11111") // ARMv8.5 +//INST(STGV, "STGV", "1101100110100000000000nnnnnttttt") // ARMv8.5 +//INST(STZ2G_1, "STZ2G (post-index)", "11011001111iiiiiiiii01nnnnn11111") // ARMv8.5 +//INST(STZ2G_2, "STZ2G (pre-index)", "11011001111iiiiiiiii11nnnnn11111") // ARMv8.5 +//INST(STZ2G_3, "STZ2G (signed-offset)", "11011001111iiiiiiiii10nnnnn11111") // ARMv8.5 +//INST(LDGV, "LDGV", "1101100111100000000000nnnnnttttt") // ARMv8.5 + +// Loads and stores - Load/Store register (pointer authentication) +//INST(LDRA, "LDRAA, LDRAB", "11111000MS1iiiiiiiiiW1nnnnnttttt") + +// Data Processing - Register - 2 source +INST(UDIV, "UDIV", "z0011010110mmmmm000010nnnnnddddd") +INST(SDIV, "SDIV", "z0011010110mmmmm000011nnnnnddddd") +INST(LSLV, "LSLV", "z0011010110mmmmm001000nnnnnddddd") +INST(LSRV, "LSRV", "z0011010110mmmmm001001nnnnnddddd") +INST(ASRV, "ASRV", "z0011010110mmmmm001010nnnnnddddd") +INST(RORV, "RORV", "z0011010110mmmmm001011nnnnnddddd") +INST(CRC32, "CRC32B, CRC32H, CRC32W, CRC32X", "z0011010110mmmmm0100zznnnnnddddd") +INST(CRC32C, "CRC32CB, CRC32CH, CRC32CW, CRC32CX", "z0011010110mmmmm0101zznnnnnddddd") +//INST(PACGA, "PACGA", "10011010110mmmmm001100nnnnnddddd") +//INST(SUBP, "SUBP", "10011010110mmmmm000000nnnnnddddd") // ARMv8.5 +//INST(IRG, "IRG", "10011010110mmmmm000100nnnnnddddd") // ARMv8.5 +//INST(GMI, "GMI", "10011010110mmmmm000101nnnnnddddd") // ARMv8.5 +//INST(SUBPS, "SUBPS", "10111010110mmmmm000000nnnnnddddd") // ARMv8.5 + +// Data Processing - Register - 1 source +INST(RBIT_int, "RBIT", "z101101011000000000000nnnnnddddd") +INST(REV16_int, "REV16", "z101101011000000000001nnnnnddddd") +INST(REV, "REV", "z10110101100000000001onnnnnddddd") +INST(CLZ_int, "CLZ", "z101101011000000000100nnnnnddddd") +INST(CLS_int, "CLS", "z101101011000000000101nnnnnddddd") +INST(REV32_int, "REV32", "1101101011000000000010nnnnnddddd") +//INST(PACDA, "PACDA, PACDZA", "110110101100000100Z010nnnnnddddd") +//INST(PACDB, "PACDB, PACDZB", "110110101100000100Z011nnnnnddddd") +//INST(AUTDA, "AUTDA, AUTDZA", "110110101100000100Z110nnnnnddddd") +//INST(AUTDB, "AUTDB, AUTDZB", "110110101100000100Z111nnnnnddddd") + +// Data Processing - Register - Logical (shifted register) +INST(AND_shift, "AND (shifted register)", "z0001010ss0mmmmmiiiiiinnnnnddddd") +INST(BIC_shift, "BIC (shifted register)", "z0001010ss1mmmmmiiiiiinnnnnddddd") +INST(ORR_shift, "ORR (shifted register)", "z0101010ss0mmmmmiiiiiinnnnnddddd") +INST(ORN_shift, "ORN (shifted register)", "z0101010ss1mmmmmiiiiiinnnnnddddd") +INST(EOR_shift, "EOR (shifted register)", "z1001010ss0mmmmmiiiiiinnnnnddddd") +INST(EON, "EON (shifted register)", "z1001010ss1mmmmmiiiiiinnnnnddddd") +INST(ANDS_shift, "ANDS (shifted register)", "z1101010ss0mmmmmiiiiiinnnnnddddd") +INST(BICS, "BICS (shifted register)", "z1101010ss1mmmmmiiiiiinnnnnddddd") + +// Data Processing - Register - Add/Sub (shifted register) +INST(ADD_shift, "ADD (shifted register)", "z0001011ss0mmmmmiiiiiinnnnnddddd") +INST(ADDS_shift, "ADDS (shifted register)", "z0101011ss0mmmmmiiiiiinnnnnddddd") +INST(SUB_shift, "SUB (shifted register)", "z1001011ss0mmmmmiiiiiinnnnnddddd") +INST(SUBS_shift, "SUBS (shifted register)", "z1101011ss0mmmmmiiiiiinnnnnddddd") + +// Data Processing - Register - Add/Sub (shifted register) +INST(ADD_ext, "ADD (extended register)", "z0001011001mmmmmxxxiiinnnnnddddd") +INST(ADDS_ext, "ADDS (extended register)", "z0101011001mmmmmxxxiiinnnnnddddd") +INST(SUB_ext, "SUB (extended register)", "z1001011001mmmmmxxxiiinnnnnddddd") +INST(SUBS_ext, "SUBS (extended register)", "z1101011001mmmmmxxxiiinnnnnddddd") + +// Data Processing - Register - Add/Sub (with carry) +INST(ADC, "ADC", "z0011010000mmmmm000000nnnnnddddd") +INST(ADCS, "ADCS", "z0111010000mmmmm000000nnnnnddddd") +INST(SBC, "SBC", "z1011010000mmmmm000000nnnnnddddd") +INST(SBCS, "SBCS", "z1111010000mmmmm000000nnnnnddddd") + +// Data Processing - Register - Conditional compare +INST(CCMN_reg, "CCMN (register)", "z0111010010mmmmmcccc00nnnnn0ffff") +INST(CCMP_reg, "CCMP (register)", "z1111010010mmmmmcccc00nnnnn0ffff") +INST(CCMN_imm, "CCMN (immediate)", "z0111010010iiiiicccc10nnnnn0ffff") +INST(CCMP_imm, "CCMP (immediate)", "z1111010010iiiiicccc10nnnnn0ffff") + +// Data Processing - Register - Conditional select +INST(CSEL, "CSEL", "z0011010100mmmmmcccc00nnnnnddddd") +INST(CSINC, "CSINC", "z0011010100mmmmmcccc01nnnnnddddd") +INST(CSINV, "CSINV", "z1011010100mmmmmcccc00nnnnnddddd") +INST(CSNEG, "CSNEG", "z1011010100mmmmmcccc01nnnnnddddd") + +// Data Processing - Register - 3 source +INST(MADD, "MADD", "z0011011000mmmmm0aaaaannnnnddddd") +INST(MSUB, "MSUB", "z0011011000mmmmm1aaaaannnnnddddd") +INST(SMADDL, "SMADDL", "10011011001mmmmm0aaaaannnnnddddd") +INST(SMSUBL, "SMSUBL", "10011011001mmmmm1aaaaannnnnddddd") +INST(SMULH, "SMULH", "10011011010mmmmm011111nnnnnddddd") +INST(UMADDL, "UMADDL", "10011011101mmmmm0aaaaannnnnddddd") +INST(UMSUBL, "UMSUBL", "10011011101mmmmm1aaaaannnnnddddd") +INST(UMULH, "UMULH", "10011011110mmmmm011111nnnnnddddd") + +// Data Processing - FP and SIMD - AES +INST(AESE, "AESE", "0100111000101000010010nnnnnddddd") +INST(AESD, "AESD", "0100111000101000010110nnnnnddddd") +INST(AESMC, "AESMC", "0100111000101000011010nnnnnddddd") +INST(AESIMC, "AESIMC", "0100111000101000011110nnnnnddddd") + +// Data Processing - FP and SIMD - SHA +INST(SHA1C, "SHA1C", "01011110000mmmmm000000nnnnnddddd") +INST(SHA1P, "SHA1P", "01011110000mmmmm000100nnnnnddddd") +INST(SHA1M, "SHA1M", "01011110000mmmmm001000nnnnnddddd") +INST(SHA1SU0, "SHA1SU0", "01011110000mmmmm001100nnnnnddddd") +INST(SHA256H, "SHA256H", "01011110000mmmmm010000nnnnnddddd") +INST(SHA256H2, "SHA256H2", "01011110000mmmmm010100nnnnnddddd") +INST(SHA256SU1, "SHA256SU1", "01011110000mmmmm011000nnnnnddddd") +INST(SHA1H, "SHA1H", "0101111000101000000010nnnnnddddd") +INST(SHA1SU1, "SHA1SU1", "0101111000101000000110nnnnnddddd") +INST(SHA256SU0, "SHA256SU0", "0101111000101000001010nnnnnddddd") + +// Data Processing - FP and SIMD - Scalar copy +INST(DUP_elt_1, "DUP (element)", "01011110000iiiii000001nnnnnddddd") + +// Data Processing - FP and SIMD - Scalar three +//INST(FMULX_vec_1, "FMULX", "01011110010mmmmm000111nnnnnddddd") +INST(FMULX_vec_2, "FMULX", "010111100z1mmmmm110111nnnnnddddd") +INST(FCMEQ_reg_1, "FCMEQ (register)", "01011110010mmmmm001001nnnnnddddd") +INST(FCMEQ_reg_2, "FCMEQ (register)", "010111100z1mmmmm111001nnnnnddddd") +INST(FRECPS_1, "FRECPS", "01011110010mmmmm001111nnnnnddddd") +INST(FRECPS_2, "FRECPS", "010111100z1mmmmm111111nnnnnddddd") +INST(FRSQRTS_1, "FRSQRTS", "01011110110mmmmm001111nnnnnddddd") +INST(FRSQRTS_2, "FRSQRTS", "010111101z1mmmmm111111nnnnnddddd") +//INST(FCMGE_reg_1, "FCMGE (register)", "01111110010mmmmm001001nnnnnddddd") +INST(FCMGE_reg_2, "FCMGE (register)", "011111100z1mmmmm111001nnnnnddddd") +//INST(FACGE_1, "FACGE", "01111110010mmmmm001011nnnnnddddd") +INST(FACGE_2, "FACGE", "011111100z1mmmmm111011nnnnnddddd") +//INST(FABD_1, "FABD", "01111110110mmmmm000101nnnnnddddd") +INST(FABD_2, "FABD", "011111101z1mmmmm110101nnnnnddddd") +//INST(FCMGT_reg_1, "FCMGT (register)", "01111110110mmmmm001001nnnnnddddd") +INST(FCMGT_reg_2, "FCMGT (register)", "011111101z1mmmmm111001nnnnnddddd") +//INST(FACGT_1, "FACGT", "01111110110mmmmm001011nnnnnddddd") +INST(FACGT_2, "FACGT", "011111101z1mmmmm111011nnnnnddddd") + +// Data Processing - FP and SIMD - Scalar two register misc +//INST(FCVTNS_1, "FCVTNS (vector)", "0101111001111001101010nnnnnddddd") +INST(FCVTNS_2, "FCVTNS (vector)", "010111100z100001101010nnnnnddddd") +//INST(FCVTMS_1, "FCVTMS (vector)", "0101111001111001101110nnnnnddddd") +INST(FCVTMS_2, "FCVTMS (vector)", "010111100z100001101110nnnnnddddd") +//INST(FCVTAS_1, "FCVTAS (vector)", "0101111001111001110010nnnnnddddd") +INST(FCVTAS_2, "FCVTAS (vector)", "010111100z100001110010nnnnnddddd") +//INST(SCVTF_int_1, "SCVTF (vector, integer)", "0101111001111001110110nnnnnddddd") +INST(SCVTF_int_2, "SCVTF (vector, integer)", "010111100z100001110110nnnnnddddd") +//INST(FCMGT_zero_1, "FCMGT (zero)", "0101111011111000110010nnnnnddddd") +INST(FCMGT_zero_2, "FCMGT (zero)", "010111101z100000110010nnnnnddddd") +INST(FCMEQ_zero_1, "FCMEQ (zero)", "0101111011111000110110nnnnnddddd") +INST(FCMEQ_zero_2, "FCMEQ (zero)", "010111101z100000110110nnnnnddddd") +//INST(FCMLT_1, "FCMLT (zero)", "0101111011111000111010nnnnnddddd") +INST(FCMLT_2, "FCMLT (zero)", "010111101z100000111010nnnnnddddd") +//INST(FCVTPS_1, "FCVTPS (vector)", "0101111011111001101010nnnnnddddd") +INST(FCVTPS_2, "FCVTPS (vector)", "010111101z100001101010nnnnnddddd") +//INST(FCVTZS_int_1, "FCVTZS (vector, integer)", "0101111011111001101110nnnnnddddd") +INST(FCVTZS_int_2, "FCVTZS (vector, integer)", "010111101z100001101110nnnnnddddd") +INST(FRECPE_1, "FRECPE", "0101111011111001110110nnnnnddddd") +INST(FRECPE_2, "FRECPE", "010111101z100001110110nnnnnddddd") +INST(FRECPX_1, "FRECPX", "0101111011111001111110nnnnnddddd") +INST(FRECPX_2, "FRECPX", "010111101z100001111110nnnnnddddd") +//INST(FCVTNU_1, "FCVTNU (vector)", "0111111001111001101010nnnnnddddd") +INST(FCVTNU_2, "FCVTNU (vector)", "011111100z100001101010nnnnnddddd") +//INST(FCVTMU_1, "FCVTMU (vector)", "0111111001111001101110nnnnnddddd") +INST(FCVTMU_2, "FCVTMU (vector)", "011111100z100001101110nnnnnddddd") +//INST(FCVTAU_1, "FCVTAU (vector)", "0111111001111001110010nnnnnddddd") +INST(FCVTAU_2, "FCVTAU (vector)", "011111100z100001110010nnnnnddddd") +//INST(UCVTF_int_1, "UCVTF (vector, integer)", "0111111001111001110110nnnnnddddd") +INST(UCVTF_int_2, "UCVTF (vector, integer)", "011111100z100001110110nnnnnddddd") +//INST(FCMGE_zero_1, "FCMGE (zero)", "0111111011111000110010nnnnnddddd") +INST(FCMGE_zero_2, "FCMGE (zero)", "011111101z100000110010nnnnnddddd") +//INST(FCMLE_1, "FCMLE (zero)", "0111111011111000110110nnnnnddddd") +INST(FCMLE_2, "FCMLE (zero)", "011111101z100000110110nnnnnddddd") +//INST(FCVTPU_1, "FCVTPU (vector)", "0111111011111001101010nnnnnddddd") +INST(FCVTPU_2, "FCVTPU (vector)", "011111101z100001101010nnnnnddddd") +//INST(FCVTZU_int_1, "FCVTZU (vector, integer)", "0111111011111001101110nnnnnddddd") +INST(FCVTZU_int_2, "FCVTZU (vector, integer)", "011111101z100001101110nnnnnddddd") +INST(FRSQRTE_1, "FRSQRTE", "0111111011111001110110nnnnnddddd") +INST(FRSQRTE_2, "FRSQRTE", "011111101z100001110110nnnnnddddd") + +// Data Processing - FP and SIMD - Scalar three same extra +//INST(SQRDMLAH_vec_1, "SQRDMLAH (vector)", "01111110zz0mmmmm100001nnnnnddddd") +//INST(SQRDMLAH_vec_2, "SQRDMLAH (vector)", "0Q101110zz0mmmmm100001nnnnnddddd") +//INST(SQRDMLSH_vec_1, "SQRDMLSH (vector)", "01111110zz0mmmmm100011nnnnnddddd") +//INST(SQRDMLSH_vec_2, "SQRDMLSH (vector)", "0Q101110zz0mmmmm100011nnnnnddddd") + +// Data Processing - FP and SIMD - Scalar two-register misc +INST(SUQADD_1, "SUQADD", "01011110zz100000001110nnnnnddddd") +INST(SQABS_1, "SQABS", "01011110zz100000011110nnnnnddddd") +INST(CMGT_zero_1, "CMGT (zero)", "01011110zz100000100010nnnnnddddd") +INST(CMEQ_zero_1, "CMEQ (zero)", "01011110zz100000100110nnnnnddddd") +INST(CMLT_1, "CMLT (zero)", "01011110zz100000101010nnnnnddddd") +INST(ABS_1, "ABS", "01011110zz100000101110nnnnnddddd") +INST(SQXTN_1, "SQXTN, SQXTN2", "01011110zz100001010010nnnnnddddd") +INST(USQADD_1, "USQADD", "01111110zz100000001110nnnnnddddd") +INST(SQNEG_1, "SQNEG", "01111110zz100000011110nnnnnddddd") +INST(CMGE_zero_1, "CMGE (zero)", "01111110zz100000100010nnnnnddddd") +INST(CMLE_1, "CMLE (zero)", "01111110zz100000100110nnnnnddddd") +INST(NEG_1, "NEG (vector)", "01111110zz100000101110nnnnnddddd") +INST(SQXTUN_1, "SQXTUN, SQXTUN2", "01111110zz100001001010nnnnnddddd") +INST(UQXTN_1, "UQXTN, UQXTN2", "01111110zz100001010010nnnnnddddd") +INST(FCVTXN_1, "FCVTXN, FCVTXN2", "011111100z100001011010nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Scalar pairwise +INST(ADDP_pair, "ADDP (scalar)", "01011110zz110001101110nnnnnddddd") +//INST(FMAXNMP_pair_1, "FMAXNMP (scalar)", "0101111000110000110010nnnnnddddd") +INST(FMAXNMP_pair_2, "FMAXNMP (scalar)", "011111100z110000110010nnnnnddddd") +//INST(FADDP_pair_1, "FADDP (scalar)", "0101111000110000110110nnnnnddddd") +INST(FADDP_pair_2, "FADDP (scalar)", "011111100z110000110110nnnnnddddd") +//INST(FMAXP_pair_1, "FMAXP (scalar)", "0101111000110000111110nnnnnddddd") +INST(FMAXP_pair_2, "FMAXP (scalar)", "011111100z110000111110nnnnnddddd") +//INST(FMINNMP_pair_1, "FMINNMP (scalar)", "0101111010110000110010nnnnnddddd") +INST(FMINNMP_pair_2, "FMINNMP (scalar)", "011111101z110000110010nnnnnddddd") +//INST(FMINP_pair_1, "FMINP (scalar)", "0101111010110000111110nnnnnddddd") +INST(FMINP_pair_2, "FMINP (scalar)", "011111101z110000111110nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Scalar three different +//INST(SQDMLAL_vec_1, "SQDMLAL, SQDMLAL2 (vector)", "01011110zz1mmmmm100100nnnnnddddd") +//INST(SQDMLSL_vec_1, "SQDMLSL, SQDMLSL2 (vector)", "01011110zz1mmmmm101100nnnnnddddd") +//INST(SQDMULL_vec_1, "SQDMULL, SQDMULL2 (vector)", "01011110zz1mmmmm110100nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Scalar three same +INST(SQADD_1, "SQADD", "01011110zz1mmmmm000011nnnnnddddd") +INST(SQSUB_1, "SQSUB", "01011110zz1mmmmm001011nnnnnddddd") +INST(CMGT_reg_1, "CMGT (register)", "01011110zz1mmmmm001101nnnnnddddd") +INST(CMGE_reg_1, "CMGE (register)", "01011110zz1mmmmm001111nnnnnddddd") +INST(SSHL_1, "SSHL", "01011110zz1mmmmm010001nnnnnddddd") +INST(SQSHL_reg_1, "SQSHL (register)", "01011110zz1mmmmm010011nnnnnddddd") +INST(SRSHL_1, "SRSHL", "01011110zz1mmmmm010101nnnnnddddd") +//INST(SQRSHL_1, "SQRSHL", "01011110zz1mmmmm010111nnnnnddddd") +INST(ADD_1, "ADD (vector)", "01011110zz1mmmmm100001nnnnnddddd") +INST(CMTST_1, "CMTST", "01011110zz1mmmmm100011nnnnnddddd") +INST(SQDMULH_vec_1, "SQDMULH (vector)", "01011110zz1mmmmm101101nnnnnddddd") +INST(UQADD_1, "UQADD", "01111110zz1mmmmm000011nnnnnddddd") +INST(UQSUB_1, "UQSUB", "01111110zz1mmmmm001011nnnnnddddd") +INST(CMHI_1, "CMHI (register)", "01111110zz1mmmmm001101nnnnnddddd") +INST(CMHS_1, "CMHS (register)", "01111110zz1mmmmm001111nnnnnddddd") +INST(USHL_1, "USHL", "01111110zz1mmmmm010001nnnnnddddd") +INST(UQSHL_reg_1, "UQSHL (register)", "01111110zz1mmmmm010011nnnnnddddd") +INST(URSHL_1, "URSHL", "01111110zz1mmmmm010101nnnnnddddd") +//INST(UQRSHL_1, "UQRSHL", "01111110zz1mmmmm010111nnnnnddddd") +INST(SUB_1, "SUB (vector)", "01111110zz1mmmmm100001nnnnnddddd") +INST(CMEQ_reg_1, "CMEQ (register)", "01111110zz1mmmmm100011nnnnnddddd") +INST(SQRDMULH_vec_1, "SQRDMULH (vector)", "01111110zz1mmmmm101101nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Scalar shift by immediate +INST(SSHR_1, "SSHR", "010111110IIIIiii000001nnnnnddddd") +INST(SSRA_1, "SSRA", "010111110IIIIiii000101nnnnnddddd") +INST(SRSHR_1, "SRSHR", "010111110IIIIiii001001nnnnnddddd") +INST(SRSRA_1, "SRSRA", "010111110IIIIiii001101nnnnnddddd") +INST(SHL_1, "SHL", "010111110IIIIiii010101nnnnnddddd") +INST(SQSHL_imm_1, "SQSHL (immediate)", "010111110IIIIiii011101nnnnnddddd") +INST(SQSHRN_1, "SQSHRN, SQSHRN2", "010111110IIIIiii100101nnnnnddddd") +//INST(SQRSHRN_1, "SQRSHRN, SQRSHRN2", "010111110IIIIiii100111nnnnnddddd") +INST(SCVTF_fix_1, "SCVTF (vector, fixed-point)", "010111110IIIIiii111001nnnnnddddd") +INST(FCVTZS_fix_1, "FCVTZS (vector, fixed-point)", "010111110IIIIiii111111nnnnnddddd") +INST(USHR_1, "USHR", "011111110IIIIiii000001nnnnnddddd") +INST(USRA_1, "USRA", "011111110IIIIiii000101nnnnnddddd") +INST(URSHR_1, "URSHR", "011111110IIIIiii001001nnnnnddddd") +INST(URSRA_1, "URSRA", "011111110IIIIiii001101nnnnnddddd") +INST(SRI_1, "SRI", "011111110IIIIiii010001nnnnnddddd") +INST(SLI_1, "SLI", "011111110IIIIiii010101nnnnnddddd") +INST(SQSHLU_1, "SQSHLU", "011111110IIIIiii011001nnnnnddddd") +INST(UQSHL_imm_1, "UQSHL (immediate)", "011111110IIIIiii011101nnnnnddddd") +INST(SQSHRUN_1, "SQSHRUN, SQSHRUN2", "011111110IIIIiii100001nnnnnddddd") +//INST(SQRSHRUN_1, "SQRSHRUN, SQRSHRUN2", "011111110IIIIiii100011nnnnnddddd") +INST(UQSHRN_1, "UQSHRN, UQSHRN2", "011111110IIIIiii100101nnnnnddddd") +//INST(UQRSHRN_1, "UQRSHRN, UQRSHRN2", "011111110IIIIiii100111nnnnnddddd") +INST(UCVTF_fix_1, "UCVTF (vector, fixed-point)", "011111110IIIIiii111001nnnnnddddd") +INST(FCVTZU_fix_1, "FCVTZU (vector, fixed-point)", "011111110IIIIiii111111nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Scalar x indexed element +//INST(SQDMLAL_elt_1, "SQDMLAL, SQDMLAL2 (by element)", "01011111zzLMmmmm0011H0nnnnnddddd") +//INST(SQDMLSL_elt_1, "SQDMLSL, SQDMLSL2 (by element)", "01011111zzLMmmmm0111H0nnnnnddddd") +INST(SQDMULL_elt_1, "SQDMULL, SQDMULL2 (by element)", "01011111zzLMmmmm1011H0nnnnnddddd") +INST(SQDMULH_elt_1, "SQDMULH (by element)", "01011111zzLMmmmm1100H0nnnnnddddd") +INST(SQRDMULH_elt_1, "SQRDMULH (by element)", "01011111zzLMmmmm1101H0nnnnnddddd") +INST(FMLA_elt_1, "FMLA (by element)", "0101111100LMmmmm0001H0nnnnnddddd") +INST(FMLA_elt_2, "FMLA (by element)", "010111111zLMmmmm0001H0nnnnnddddd") +INST(FMLS_elt_1, "FMLS (by element)", "0101111100LMmmmm0101H0nnnnnddddd") +INST(FMLS_elt_2, "FMLS (by element)", "010111111zLMmmmm0101H0nnnnnddddd") +//INST(FMUL_elt_1, "FMUL (by element)", "0101111100LMmmmm1001H0nnnnnddddd") +INST(FMUL_elt_2, "FMUL (by element)", "010111111zLMmmmm1001H0nnnnnddddd") +//INST(SQRDMLAH_elt_1, "SQRDMLAH (by element)", "01111111zzLMmmmm1101H0nnnnnddddd") +//INST(SQRDMLSH_elt_1, "SQRDMLSH (by element)", "01111111zzLMmmmm1111H0nnnnnddddd") +//INST(FMULX_elt_1, "FMULX (by element)", "0111111100LMmmmm1001H0nnnnnddddd") +INST(FMULX_elt_2, "FMULX (by element)", "011111111zLMmmmm1001H0nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Table Lookup +INST(TBL, "TBL", "0Q001110000mmmmm0LL000nnnnnddddd") +INST(TBX, "TBX", "0Q001110000mmmmm0LL100nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Permute +INST(UZP1, "UZP1", "0Q001110zz0mmmmm000110nnnnnddddd") +INST(TRN1, "TRN1", "0Q001110zz0mmmmm001010nnnnnddddd") +INST(ZIP1, "ZIP1", "0Q001110zz0mmmmm001110nnnnnddddd") +INST(UZP2, "UZP2", "0Q001110zz0mmmmm010110nnnnnddddd") +INST(TRN2, "TRN2", "0Q001110zz0mmmmm011010nnnnnddddd") +INST(ZIP2, "ZIP2", "0Q001110zz0mmmmm011110nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Extract +INST(EXT, "EXT", "0Q101110000mmmmm0iiii0nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Copy +INST(DUP_elt_2, "DUP (element)", "0Q001110000iiiii000001nnnnnddddd") +INST(DUP_gen, "DUP (general)", "0Q001110000iiiii000011nnnnnddddd") +INST(SMOV, "SMOV", "0Q001110000iiiii001011nnnnnddddd") +INST(UMOV, "UMOV", "0Q001110000iiiii001111nnnnnddddd") +INST(INS_gen, "INS (general)", "01001110000iiiii000111nnnnnddddd") +INST(INS_elt, "INS (element)", "01101110000iiiii0iiii1nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Three same +//INST(FMULX_vec_3, "FMULX", "0Q001110010mmmmm000111nnnnnddddd") +INST(FCMEQ_reg_3, "FCMEQ (register)", "0Q001110010mmmmm001001nnnnnddddd") +INST(FRECPS_3, "FRECPS", "0Q001110010mmmmm001111nnnnnddddd") +INST(FRSQRTS_3, "FRSQRTS", "0Q001110110mmmmm001111nnnnnddddd") +//INST(FCMGE_reg_3, "FCMGE (register)", "0Q101110010mmmmm001001nnnnnddddd") +//INST(FACGE_3, "FACGE", "0Q101110010mmmmm001011nnnnnddddd") +//INST(FABD_3, "FABD", "0Q101110110mmmmm000101nnnnnddddd") +//INST(FCMGT_reg_3, "FCMGT (register)", "0Q101110110mmmmm001001nnnnnddddd") +//INST(FACGT_3, "FACGT", "0Q101110110mmmmm001011nnnnnddddd") +//INST(FMAXNM_1, "FMAXNM (vector)", "0Q001110010mmmmm000001nnnnnddddd") +INST(FMLA_vec_1, "FMLA (vector)", "0Q001110010mmmmm000011nnnnnddddd") +//INST(FADD_1, "FADD (vector)", "0Q001110010mmmmm000101nnnnnddddd") +//INST(FMAX_1, "FMAX (vector)", "0Q001110010mmmmm001101nnnnnddddd") +//INST(FMINNM_1, "FMINNM (vector)", "0Q001110110mmmmm000001nnnnnddddd") +INST(FMLS_vec_1, "FMLS (vector)", "0Q001110110mmmmm000011nnnnnddddd") +//INST(FSUB_1, "FSUB (vector)", "0Q001110110mmmmm000101nnnnnddddd") +//INST(FMIN_1, "FMIN (vector)", "0Q001110110mmmmm001101nnnnnddddd") +//INST(FMAXNMP_vec_1, "FMAXNMP (vector)", "0Q101110010mmmmm000001nnnnnddddd") +//INST(FADDP_vec_1, "FADDP (vector)", "0Q101110010mmmmm000101nnnnnddddd") +//INST(FMUL_vec_1, "FMUL (vector)", "0Q101110010mmmmm000111nnnnnddddd") +//INST(FMAXP_vec_1, "FMAXP (vector)", "0Q101110010mmmmm001101nnnnnddddd") +//INST(FDIV_1, "FDIV (vector)", "0Q101110010mmmmm001111nnnnnddddd") +//INST(FMINNMP_vec_1, "FMINNMP (vector)", "0Q101110110mmmmm000001nnnnnddddd") +//INST(FMINP_vec_1, "FMINP (vector)", "0Q101110110mmmmm001101nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Three same extra +//INST(SMMLA_vec, "SMMLA", "01001110100mmmmm101001nnnnnddddd") // v8.6 +//INST(UMMLA_vec, "UMMLA", "01101110100mmmmm101001nnnnnddddd") // v8.6 +//INST(USMMLA_vec, "USMMLA", "01001110100mmmmm101011nnnnnddddd") // v8.6 +//INST(SUDOT_element, "SUDOT (by element)", "0Q00111100LMmmmm1111H0nnnnnddddd") // v8.6 +//INST(USDOT_element, "USDOT (by_element)", "0Q00111110LMmmmm1111H0nnnnnddddd") // v8.6 +//INST(USDOT_vec, "USDOT (vector)", "0Q001110100mmmmm100111nnnnnddddd") // v8.6 +INST(SDOT_vec, "SDOT (vector)", "0Q001110zz0mmmmm100101nnnnnddddd") +INST(UDOT_vec, "UDOT (vector)", "0Q101110zz0mmmmm100101nnnnnddddd") +INST(FCMLA_vec, "FCMLA", "0Q101110zz0mmmmm110rr1nnnnnddddd") +INST(FCADD_vec, "FCADD", "0Q101110zz0mmmmm111r01nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD Two-register misc +INST(REV64_asimd, "REV64", "0Q001110zz100000000010nnnnnddddd") +INST(REV16_asimd, "REV16 (vector)", "0Q001110zz100000000110nnnnnddddd") +INST(SADDLP, "SADDLP", "0Q001110zz100000001010nnnnnddddd") +INST(SUQADD_2, "SUQADD", "0Q001110zz100000001110nnnnnddddd") +INST(CLS_asimd, "CLS (vector)", "0Q001110zz100000010010nnnnnddddd") +INST(CNT, "CNT", "0Q001110zz100000010110nnnnnddddd") +INST(SADALP, "SADALP", "0Q001110zz100000011010nnnnnddddd") +INST(SQABS_2, "SQABS", "0Q001110zz100000011110nnnnnddddd") +INST(CMGT_zero_2, "CMGT (zero)", "0Q001110zz100000100010nnnnnddddd") +INST(CMEQ_zero_2, "CMEQ (zero)", "0Q001110zz100000100110nnnnnddddd") +INST(CMLT_2, "CMLT (zero)", "0Q001110zz100000101010nnnnnddddd") +INST(ABS_2, "ABS", "0Q001110zz100000101110nnnnnddddd") +INST(XTN, "XTN, XTN2", "0Q001110zz100001001010nnnnnddddd") +INST(SQXTN_2, "SQXTN, SQXTN2", "0Q001110zz100001010010nnnnnddddd") +INST(FCVTN, "FCVTN, FCVTN2", "0Q0011100z100001011010nnnnnddddd") +INST(FCVTL, "FCVTL, FCVTL2", "0Q0011100z100001011110nnnnnddddd") +INST(FRINTN_1, "FRINTN (vector)", "0Q00111001111001100010nnnnnddddd") +INST(FRINTN_2, "FRINTN (vector)", "0Q0011100z100001100010nnnnnddddd") +INST(FRINTM_1, "FRINTM (vector)", "0Q00111001111001100110nnnnnddddd") +INST(FRINTM_2, "FRINTM (vector)", "0Q0011100z100001100110nnnnnddddd") +//INST(FCVTNS_3, "FCVTNS (vector)", "0Q00111001111001101010nnnnnddddd") +INST(FCVTNS_4, "FCVTNS (vector)", "0Q0011100z100001101010nnnnnddddd") +//INST(FCVTMS_3, "FCVTMS (vector)", "0Q00111001111001101110nnnnnddddd") +INST(FCVTMS_4, "FCVTMS (vector)", "0Q0011100z100001101110nnnnnddddd") +//INST(FCVTAS_3, "FCVTAS (vector)", "0Q00111001111001110010nnnnnddddd") +INST(FCVTAS_4, "FCVTAS (vector)", "0Q0011100z100001110010nnnnnddddd") +//INST(SCVTF_int_3, "SCVTF (vector, integer)", "0Q00111001111001110110nnnnnddddd") +INST(SCVTF_int_4, "SCVTF (vector, integer)", "0Q0011100z100001110110nnnnnddddd") +//INST(FCMGT_zero_3, "FCMGT (zero)", "0Q00111011111000110010nnnnnddddd") +INST(FCMGT_zero_4, "FCMGT (zero)", "0Q0011101z100000110010nnnnnddddd") +INST(FCMEQ_zero_3, "FCMEQ (zero)", "0Q00111011111000110110nnnnnddddd") +INST(FCMEQ_zero_4, "FCMEQ (zero)", "0Q0011101z100000110110nnnnnddddd") +//INST(FCMLT_3, "FCMLT (zero)", "0Q00111011111000111010nnnnnddddd") +INST(FCMLT_4, "FCMLT (zero)", "0Q0011101z100000111010nnnnnddddd") +INST(FABS_1, "FABS (vector)", "0Q00111011111000111110nnnnnddddd") +INST(FABS_2, "FABS (vector)", "0Q0011101z100000111110nnnnnddddd") +INST(FRINTP_1, "FRINTP (vector)", "0Q00111011111001100010nnnnnddddd") +INST(FRINTP_2, "FRINTP (vector)", "0Q0011101z100001100010nnnnnddddd") +INST(FRINTZ_1, "FRINTZ (vector)", "0Q00111011111001100110nnnnnddddd") +INST(FRINTZ_2, "FRINTZ (vector)", "0Q0011101z100001100110nnnnnddddd") +//INST(FCVTPS_3, "FCVTPS (vector)", "0Q00111011111001101010nnnnnddddd") +INST(FCVTPS_4, "FCVTPS (vector)", "0Q0011101z100001101010nnnnnddddd") +//INST(FCVTZS_int_3, "FCVTZS (vector, integer)", "0Q00111011111001101110nnnnnddddd") +INST(FCVTZS_int_4, "FCVTZS (vector, integer)", "0Q0011101z100001101110nnnnnddddd") +INST(URECPE, "URECPE", "0Q0011101z100001110010nnnnnddddd") +INST(FRECPE_3, "FRECPE", "0Q00111011111001110110nnnnnddddd") +INST(FRECPE_4, "FRECPE", "0Q0011101z100001110110nnnnnddddd") +INST(REV32_asimd, "REV32 (vector)", "0Q101110zz100000000010nnnnnddddd") +INST(UADDLP, "UADDLP", "0Q101110zz100000001010nnnnnddddd") +INST(USQADD_2, "USQADD", "0Q101110zz100000001110nnnnnddddd") +INST(CLZ_asimd, "CLZ (vector)", "0Q101110zz100000010010nnnnnddddd") +INST(UADALP, "UADALP", "0Q101110zz100000011010nnnnnddddd") +INST(SQNEG_2, "SQNEG", "0Q101110zz100000011110nnnnnddddd") +INST(CMGE_zero_2, "CMGE (zero)", "0Q101110zz100000100010nnnnnddddd") +INST(CMLE_2, "CMLE (zero)", "0Q101110zz100000100110nnnnnddddd") +INST(NEG_2, "NEG (vector)", "0Q101110zz100000101110nnnnnddddd") +INST(SQXTUN_2, "SQXTUN, SQXTUN2", "0Q101110zz100001001010nnnnnddddd") +INST(SHLL, "SHLL, SHLL2", "0Q101110zz100001001110nnnnnddddd") +INST(UQXTN_2, "UQXTN, UQXTN2", "0Q101110zz100001010010nnnnnddddd") +INST(FCVTXN_2, "FCVTXN, FCVTXN2", "0Q1011100z100001011010nnnnnddddd") +INST(FRINTA_1, "FRINTA (vector)", "0Q10111001111001100010nnnnnddddd") +INST(FRINTA_2, "FRINTA (vector)", "0Q1011100z100001100010nnnnnddddd") +INST(FRINTX_1, "FRINTX (vector)", "0Q10111001111001100110nnnnnddddd") +INST(FRINTX_2, "FRINTX (vector)", "0Q1011100z100001100110nnnnnddddd") +//INST(FCVTNU_3, "FCVTNU (vector)", "0Q10111001111001101010nnnnnddddd") +INST(FCVTNU_4, "FCVTNU (vector)", "0Q1011100z100001101010nnnnnddddd") +//INST(FCVTMU_3, "FCVTMU (vector)", "0Q10111001111001101110nnnnnddddd") +INST(FCVTMU_4, "FCVTMU (vector)", "0Q1011100z100001101110nnnnnddddd") +//INST(FCVTAU_3, "FCVTAU (vector)", "0Q10111001111001110010nnnnnddddd") +INST(FCVTAU_4, "FCVTAU (vector)", "0Q1011100z100001110010nnnnnddddd") +//INST(UCVTF_int_3, "UCVTF (vector, integer)", "0Q10111001111001110110nnnnnddddd") +INST(UCVTF_int_4, "UCVTF (vector, integer)", "0Q1011100z100001110110nnnnnddddd") +INST(NOT, "NOT", "0Q10111000100000010110nnnnnddddd") +INST(RBIT_asimd, "RBIT (vector)", "0Q10111001100000010110nnnnnddddd") +INST(FNEG_1, "FNEG (vector)", "0Q10111011111000111110nnnnnddddd") +INST(FNEG_2, "FNEG (vector)", "0Q1011101z100000111110nnnnnddddd") +INST(FRINTI_1, "FRINTI (vector)", "0Q10111011111001100110nnnnnddddd") +INST(FRINTI_2, "FRINTI (vector)", "0Q1011101z100001100110nnnnnddddd") +//INST(FCMGE_zero_3, "FCMGE (zero)", "0Q10111011111000110010nnnnnddddd") +INST(FCMGE_zero_4, "FCMGE (zero)", "0Q1011101z100000110010nnnnnddddd") +//INST(FCMLE_3, "FCMLE (zero)", "0Q10111011111000110110nnnnnddddd") +INST(FCMLE_4, "FCMLE (zero)", "0Q1011101z100000110110nnnnnddddd") +//INST(FCVTPU_3, "FCVTPU (vector)", "0Q10111011111001101010nnnnnddddd") +INST(FCVTPU_4, "FCVTPU (vector)", "0Q1011101z100001101010nnnnnddddd") +//INST(FCVTZU_int_3, "FCVTZU (vector, integer)", "0Q10111011111001101110nnnnnddddd") +INST(FCVTZU_int_4, "FCVTZU (vector, integer)", "0Q1011101z100001101110nnnnnddddd") +INST(URSQRTE, "URSQRTE", "0Q1011101z100001110010nnnnnddddd") +INST(FRSQRTE_3, "FRSQRTE", "0Q10111011111001110110nnnnnddddd") +INST(FRSQRTE_4, "FRSQRTE", "0Q1011101z100001110110nnnnnddddd") +//INST(FSQRT_1, "FSQRT (vector)", "0Q10111011111001111110nnnnnddddd") +INST(FSQRT_2, "FSQRT (vector)", "0Q1011101z100001111110nnnnnddddd") +//INST(FRINT32X_1, "FRINT32X (vector)", "0Q1011100z100001111110nnnnnddddd") // ARMv8.5 +//INST(FRINT64X_1, "FRINT64X (vector)", "0Q1011100z100001111010nnnnnddddd") // ARMv8.5 +//INST(FRINT32Z_1, "FRINT32Z (vector)", "0Q0011100z100001111010nnnnnddddd") // ARMv8.5 +//INST(FRINT64Z_1, "FRINT64Z (vector)", "0Q0011100z100001111110nnnnnddddd") // ARMv8.5 + +// Data Processing - FP and SIMD - SIMD across lanes +INST(SADDLV, "SADDLV", "0Q001110zz110000001110nnnnnddddd") +INST(SMAXV, "SMAXV", "0Q001110zz110000101010nnnnnddddd") +INST(SMINV, "SMINV", "0Q001110zz110001101010nnnnnddddd") +INST(ADDV, "ADDV", "0Q001110zz110001101110nnnnnddddd") +//INST(FMAXNMV_1, "FMAXNMV", "0Q00111000110000110010nnnnnddddd") +INST(FMAXNMV_2, "FMAXNMV", "0Q1011100z110000110010nnnnnddddd") +//INST(FMAXV_1, "FMAXV", "0Q00111000110000111110nnnnnddddd") +INST(FMAXV_2, "FMAXV", "0Q1011100z110000111110nnnnnddddd") +//INST(FMINNMV_1, "FMINNMV", "0Q00111010110000110010nnnnnddddd") +INST(FMINNMV_2, "FMINNMV", "0Q1011101z110000110010nnnnnddddd") +//INST(FMINV_1, "FMINV", "0Q00111010110000111110nnnnnddddd") +INST(FMINV_2, "FMINV", "0Q1011101z110000111110nnnnnddddd") +INST(UADDLV, "UADDLV", "0Q101110zz110000001110nnnnnddddd") +INST(UMAXV, "UMAXV", "0Q101110zz110000101010nnnnnddddd") +INST(UMINV, "UMINV", "0Q101110zz110001101010nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD three different +INST(SADDL, "SADDL, SADDL2", "0Q001110zz1mmmmm000000nnnnnddddd") +INST(SADDW, "SADDW, SADDW2", "0Q001110zz1mmmmm000100nnnnnddddd") +INST(SSUBL, "SSUBL, SSUBL2", "0Q001110zz1mmmmm001000nnnnnddddd") +INST(SSUBW, "SSUBW, SSUBW2", "0Q001110zz1mmmmm001100nnnnnddddd") +INST(ADDHN, "ADDHN, ADDHN2", "0Q001110zz1mmmmm010000nnnnnddddd") +INST(SABAL, "SABAL, SABAL2", "0Q001110zz1mmmmm010100nnnnnddddd") +INST(SUBHN, "SUBHN, SUBHN2", "0Q001110zz1mmmmm011000nnnnnddddd") +INST(SABDL, "SABDL, SABDL2", "0Q001110zz1mmmmm011100nnnnnddddd") +INST(SMLAL_vec, "SMLAL, SMLAL2 (vector)", "0Q001110zz1mmmmm100000nnnnnddddd") +INST(SMLSL_vec, "SMLSL, SMLSL2 (vector)", "0Q001110zz1mmmmm101000nnnnnddddd") +INST(SMULL_vec, "SMULL, SMULL2 (vector)", "0Q001110zz1mmmmm110000nnnnnddddd") +INST(PMULL, "PMULL, PMULL2", "0Q001110zz1mmmmm111000nnnnnddddd") +INST(UADDL, "UADDL, UADDL2", "0Q101110zz1mmmmm000000nnnnnddddd") +INST(UADDW, "UADDW, UADDW2", "0Q101110zz1mmmmm000100nnnnnddddd") +INST(USUBL, "USUBL, USUBL2", "0Q101110zz1mmmmm001000nnnnnddddd") +INST(USUBW, "USUBW, USUBW2", "0Q101110zz1mmmmm001100nnnnnddddd") +INST(RADDHN, "RADDHN, RADDHN2", "0Q101110zz1mmmmm010000nnnnnddddd") +INST(UABAL, "UABAL, UABAL2", "0Q101110zz1mmmmm010100nnnnnddddd") +INST(RSUBHN, "RSUBHN, RSUBHN2", "0Q101110zz1mmmmm011000nnnnnddddd") +INST(UABDL, "UABDL, UABDL2", "0Q101110zz1mmmmm011100nnnnnddddd") +INST(UMLAL_vec, "UMLAL, UMLAL2 (vector)", "0Q101110zz1mmmmm100000nnnnnddddd") +INST(UMLSL_vec, "UMLSL, UMLSL2 (vector)", "0Q101110zz1mmmmm101000nnnnnddddd") +INST(UMULL_vec, "UMULL, UMULL2 (vector)", "0Q101110zz1mmmmm110000nnnnnddddd") +//INST(SQDMLAL_vec_2, "SQDMLAL, SQDMLAL2 (vector)", "0Q001110zz1mmmmm100100nnnnnddddd") +//INST(SQDMLSL_vec_2, "SQDMLSL, SQDMLSL2 (vector)", "0Q001110zz1mmmmm101100nnnnnddddd") +INST(SQDMULL_vec_2, "SQDMULL, SQDMULL2 (vector)", "0Q001110zz1mmmmm110100nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD three same +INST(SHADD, "SHADD", "0Q001110zz1mmmmm000001nnnnnddddd") +INST(SQADD_2, "SQADD", "0Q001110zz1mmmmm000011nnnnnddddd") +INST(SRHADD, "SRHADD", "0Q001110zz1mmmmm000101nnnnnddddd") +INST(SHSUB, "SHSUB", "0Q001110zz1mmmmm001001nnnnnddddd") +INST(SQSUB_2, "SQSUB", "0Q001110zz1mmmmm001011nnnnnddddd") +INST(CMGT_reg_2, "CMGT (register)", "0Q001110zz1mmmmm001101nnnnnddddd") +INST(CMGE_reg_2, "CMGE (register)", "0Q001110zz1mmmmm001111nnnnnddddd") +INST(SSHL_2, "SSHL", "0Q001110zz1mmmmm010001nnnnnddddd") +INST(SQSHL_reg_2, "SQSHL (register)", "0Q001110zz1mmmmm010011nnnnnddddd") +INST(SRSHL_2, "SRSHL", "0Q001110zz1mmmmm010101nnnnnddddd") +//INST(SQRSHL_2, "SQRSHL", "0Q001110zz1mmmmm010111nnnnnddddd") +INST(SMAX, "SMAX", "0Q001110zz1mmmmm011001nnnnnddddd") +INST(SMIN, "SMIN", "0Q001110zz1mmmmm011011nnnnnddddd") +INST(SABD, "SABD", "0Q001110zz1mmmmm011101nnnnnddddd") +INST(SABA, "SABA", "0Q001110zz1mmmmm011111nnnnnddddd") +INST(ADD_vector, "ADD (vector)", "0Q001110zz1mmmmm100001nnnnnddddd") +INST(CMTST_2, "CMTST", "0Q001110zz1mmmmm100011nnnnnddddd") +INST(MLA_vec, "MLA (vector)", "0Q001110zz1mmmmm100101nnnnnddddd") +INST(MUL_vec, "MUL (vector)", "0Q001110zz1mmmmm100111nnnnnddddd") +INST(SMAXP, "SMAXP", "0Q001110zz1mmmmm101001nnnnnddddd") +INST(SMINP, "SMINP", "0Q001110zz1mmmmm101011nnnnnddddd") +INST(SQDMULH_vec_2, "SQDMULH (vector)", "0Q001110zz1mmmmm101101nnnnnddddd") +INST(ADDP_vec, "ADDP (vector)", "0Q001110zz1mmmmm101111nnnnnddddd") +INST(FMAXNM_2, "FMAXNM (vector)", "0Q0011100z1mmmmm110001nnnnnddddd") +INST(FMLA_vec_2, "FMLA (vector)", "0Q0011100z1mmmmm110011nnnnnddddd") +INST(FADD_2, "FADD (vector)", "0Q0011100z1mmmmm110101nnnnnddddd") +INST(FMAX_2, "FMAX (vector)", "0Q0011100z1mmmmm111101nnnnnddddd") +INST(FMULX_vec_4, "FMULX", "0Q0011100z1mmmmm110111nnnnnddddd") +INST(FCMEQ_reg_4, "FCMEQ (register)", "0Q0011100z1mmmmm111001nnnnnddddd") +//INST(FMLAL_vec_1, "FMLAL, FMLAL2 (vector)", "0Q0011100z1mmmmm111011nnnnnddddd") +INST(FRECPS_4, "FRECPS", "0Q0011100z1mmmmm111111nnnnnddddd") +INST(AND_asimd, "AND (vector)", "0Q001110001mmmmm000111nnnnnddddd") +INST(BIC_asimd_reg, "BIC (vector, register)", "0Q001110011mmmmm000111nnnnnddddd") +INST(FMINNM_2, "FMINNM (vector)", "0Q0011101z1mmmmm110001nnnnnddddd") +INST(FMLS_vec_2, "FMLS (vector)", "0Q0011101z1mmmmm110011nnnnnddddd") +INST(FSUB_2, "FSUB (vector)", "0Q0011101z1mmmmm110101nnnnnddddd") +//INST(FMLSL_vec_1, "FMLSL, FMLSL2 (vector)", "0Q0011101z1mmmmm111011nnnnnddddd") +INST(FMIN_2, "FMIN (vector)", "0Q0011101z1mmmmm111101nnnnnddddd") +INST(FRSQRTS_4, "FRSQRTS", "0Q0011101z1mmmmm111111nnnnnddddd") +INST(ORR_asimd_reg, "ORR (vector, register)", "0Q001110101mmmmm000111nnnnnddddd") +INST(ORN_asimd, "ORN (vector)", "0Q001110111mmmmm000111nnnnnddddd") +INST(UHADD, "UHADD", "0Q101110zz1mmmmm000001nnnnnddddd") +INST(UQADD_2, "UQADD", "0Q101110zz1mmmmm000011nnnnnddddd") +INST(URHADD, "URHADD", "0Q101110zz1mmmmm000101nnnnnddddd") +INST(UHSUB, "UHSUB", "0Q101110zz1mmmmm001001nnnnnddddd") +INST(UQSUB_2, "UQSUB", "0Q101110zz1mmmmm001011nnnnnddddd") +INST(CMHI_2, "CMHI (register)", "0Q101110zz1mmmmm001101nnnnnddddd") +INST(CMHS_2, "CMHS (register)", "0Q101110zz1mmmmm001111nnnnnddddd") +INST(USHL_2, "USHL", "0Q101110zz1mmmmm010001nnnnnddddd") +INST(UQSHL_reg_2, "UQSHL (register)", "0Q101110zz1mmmmm010011nnnnnddddd") +INST(URSHL_2, "URSHL", "0Q101110zz1mmmmm010101nnnnnddddd") +//INST(UQRSHL_2, "UQRSHL", "0Q101110zz1mmmmm010111nnnnnddddd") +INST(UMAX, "UMAX", "0Q101110zz1mmmmm011001nnnnnddddd") +INST(UMIN, "UMIN", "0Q101110zz1mmmmm011011nnnnnddddd") +INST(UABD, "UABD", "0Q101110zz1mmmmm011101nnnnnddddd") +INST(UABA, "UABA", "0Q101110zz1mmmmm011111nnnnnddddd") +INST(SUB_2, "SUB (vector)", "0Q101110zz1mmmmm100001nnnnnddddd") +INST(CMEQ_reg_2, "CMEQ (register)", "0Q101110zz1mmmmm100011nnnnnddddd") +INST(MLS_vec, "MLS (vector)", "0Q101110zz1mmmmm100101nnnnnddddd") +INST(PMUL, "PMUL", "0Q101110zz1mmmmm100111nnnnnddddd") +INST(UMAXP, "UMAXP", "0Q101110zz1mmmmm101001nnnnnddddd") +INST(UMINP, "UMINP", "0Q101110zz1mmmmm101011nnnnnddddd") +INST(SQRDMULH_vec_2, "SQRDMULH (vector)", "0Q101110zz1mmmmm101101nnnnnddddd") +INST(FMAXNMP_vec_2, "FMAXNMP (vector)", "0Q1011100z1mmmmm110001nnnnnddddd") +//INST(FMLAL_vec_2, "FMLAL, FMLAL2 (vector)", "0Q1011100z1mmmmm110011nnnnnddddd") +INST(FADDP_vec_2, "FADDP (vector)", "0Q1011100z1mmmmm110101nnnnnddddd") +INST(FMUL_vec_2, "FMUL (vector)", "0Q1011100z1mmmmm110111nnnnnddddd") +INST(FCMGE_reg_4, "FCMGE (register)", "0Q1011100z1mmmmm111001nnnnnddddd") +INST(FACGE_4, "FACGE", "0Q1011100z1mmmmm111011nnnnnddddd") +INST(FMAXP_vec_2, "FMAXP (vector)", "0Q1011100z1mmmmm111101nnnnnddddd") +INST(FDIV_2, "FDIV (vector)", "0Q1011100z1mmmmm111111nnnnnddddd") +INST(EOR_asimd, "EOR (vector)", "0Q101110001mmmmm000111nnnnnddddd") +INST(BSL, "BSL", "0Q101110011mmmmm000111nnnnnddddd") +INST(FMINNMP_vec_2, "FMINNMP (vector)", "0Q1011101z1mmmmm110001nnnnnddddd") +//INST(FMLSL_vec_2, "FMLSL, FMLSL2 (vector)", "0Q1011101z1mmmmm110011nnnnnddddd") +INST(FABD_4, "FABD", "0Q1011101z1mmmmm110101nnnnnddddd") +INST(FCMGT_reg_4, "FCMGT (register)", "0Q1011101z1mmmmm111001nnnnnddddd") +INST(FACGT_4, "FACGT", "0Q1011101z1mmmmm111011nnnnnddddd") +INST(FMINP_vec_2, "FMINP (vector)", "0Q1011101z1mmmmm111101nnnnnddddd") +INST(BIT, "BIT", "0Q101110101mmmmm000111nnnnnddddd") +INST(BIF, "BIF", "0Q101110111mmmmm000111nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD modified immediate +INST(MOVI, "MOVI, MVNI, ORR, BIC (vector, immediate)", "0Qo0111100000abcmmmm01defghddddd") +INST(FMOV_2, "FMOV (vector, immediate)", "0Qo0111100000abc111101defghddddd") +INST(FMOV_3, "FMOV (vector, immediate)", "0Q00111100000abc111111defghddddd") +INST(UnallocatedEncoding, "Unallocated SIMD modified immediate", "0--0111100000-------11----------") + +// Data Processing - FP and SIMD - SIMD Shift by immediate +INST(SSHR_2, "SSHR", "0Q0011110IIIIiii000001nnnnnddddd") +INST(SSRA_2, "SSRA", "0Q0011110IIIIiii000101nnnnnddddd") +INST(SRSHR_2, "SRSHR", "0Q0011110IIIIiii001001nnnnnddddd") +INST(SRSRA_2, "SRSRA", "0Q0011110IIIIiii001101nnnnnddddd") +INST(SHL_2, "SHL", "0Q0011110IIIIiii010101nnnnnddddd") +INST(SQSHL_imm_2, "SQSHL (immediate)", "0Q0011110IIIIiii011101nnnnnddddd") +INST(SHRN, "SHRN, SHRN2", "0Q0011110IIIIiii100001nnnnnddddd") +INST(RSHRN, "RSHRN, RSHRN2", "0Q0011110IIIIiii100011nnnnnddddd") +INST(SQSHRN_2, "SQSHRN, SQSHRN2", "0Q0011110IIIIiii100101nnnnnddddd") +INST(SQRSHRN_2, "SQRSHRN, SQRSHRN2", "0Q0011110IIIIiii100111nnnnnddddd") +INST(SSHLL, "SSHLL, SSHLL2", "0Q0011110IIIIiii101001nnnnnddddd") +INST(SCVTF_fix_2, "SCVTF (vector, fixed-point)", "0Q0011110IIIIiii111001nnnnnddddd") +INST(FCVTZS_fix_2, "FCVTZS (vector, fixed-point)", "0Q0011110IIIIiii111111nnnnnddddd") +INST(USHR_2, "USHR", "0Q1011110IIIIiii000001nnnnnddddd") +INST(USRA_2, "USRA", "0Q1011110IIIIiii000101nnnnnddddd") +INST(URSHR_2, "URSHR", "0Q1011110IIIIiii001001nnnnnddddd") +INST(URSRA_2, "URSRA", "0Q1011110IIIIiii001101nnnnnddddd") +INST(SRI_2, "SRI", "0Q1011110IIIIiii010001nnnnnddddd") +INST(SLI_2, "SLI", "0Q1011110IIIIiii010101nnnnnddddd") +INST(SQSHLU_2, "SQSHLU", "0Q1011110IIIIiii011001nnnnnddddd") +INST(UQSHL_imm_2, "UQSHL (immediate)", "0Q1011110IIIIiii011101nnnnnddddd") +INST(SQSHRUN_2, "SQSHRUN, SQSHRUN2", "0Q1011110IIIIiii100001nnnnnddddd") +INST(SQRSHRUN_2, "SQRSHRUN, SQRSHRUN2", "0Q1011110IIIIiii100011nnnnnddddd") +INST(UQSHRN_2, "UQSHRN, UQSHRN2", "0Q1011110IIIIiii100101nnnnnddddd") +INST(UQRSHRN_2, "UQRSHRN, UQRSHRN2", "0Q1011110IIIIiii100111nnnnnddddd") +INST(USHLL, "USHLL, USHLL2", "0Q1011110IIIIiii101001nnnnnddddd") +INST(UCVTF_fix_2, "UCVTF (vector, fixed-point)", "0Q1011110IIIIiii111001nnnnnddddd") +INST(FCVTZU_fix_2, "FCVTZU (vector, fixed-point)", "0Q1011110IIIIiii111111nnnnnddddd") + +// Data Processing - FP and SIMD - SIMD vector x indexed element +INST(SMLAL_elt, "SMLAL, SMLAL2 (by element)", "0Q001111zzLMmmmm0010H0nnnnnddddd") +//INST(SQDMLAL_elt_2, "SQDMLAL, SQDMLAL2 (by element)", "0Q001111zzLMmmmm0011H0nnnnnddddd") +INST(SMLSL_elt, "SMLSL, SMLSL2 (by element)", "0Q001111zzLMmmmm0110H0nnnnnddddd") +//INST(SQDMLSL_elt_2, "SQDMLSL, SQDMLSL2 (by element)", "0Q001111zzLMmmmm0111H0nnnnnddddd") +INST(MUL_elt, "MUL (by element)", "0Q001111zzLMmmmm1000H0nnnnnddddd") +INST(SMULL_elt, "SMULL, SMULL2 (by element)", "0Q001111zzLMmmmm1010H0nnnnnddddd") +INST(SQDMULL_elt_2, "SQDMULL, SQDMULL2 (by element)", "0Q001111zzLMmmmm1011H0nnnnnddddd") +INST(SQDMULH_elt_2, "SQDMULH (by element)", "0Q001111zzLMmmmm1100H0nnnnnddddd") +INST(SQRDMULH_elt_2, "SQRDMULH (by element)", "0Q001111zzLMmmmm1101H0nnnnnddddd") +INST(SDOT_elt, "SDOT (by element)", "0Q001111zzLMmmmm1110H0nnnnnddddd") +INST(FMLA_elt_3, "FMLA (by element)", "0Q00111100LMmmmm0001H0nnnnnddddd") +INST(FMLA_elt_4, "FMLA (by element)", "0Q0011111zLMmmmm0001H0nnnnnddddd") +INST(FMLS_elt_3, "FMLS (by element)", "0Q00111100LMmmmm0101H0nnnnnddddd") +INST(FMLS_elt_4, "FMLS (by element)", "0Q0011111zLMmmmm0101H0nnnnnddddd") +//INST(FMUL_elt_3, "FMUL (by element)", "0Q00111100LMmmmm1001H0nnnnnddddd") +INST(FMUL_elt_4, "FMUL (by element)", "0Q0011111zLMmmmm1001H0nnnnnddddd") +//INST(FMLAL_elt_1, "FMLAL, FMLAL2 (by element)", "0Q0011111zLMmmmm0000H0nnnnnddddd") +//INST(FMLAL_elt_2, "FMLAL, FMLAL2 (by element)", "0Q1011111zLMmmmm1000H0nnnnnddddd") +//INST(FMLSL_elt_1, "FMLSL, FMLSL2 (by element)", "0Q0011111zLMmmmm0100H0nnnnnddddd") +//INST(FMLSL_elt_2, "FMLSL, FMLSL2 (by element)", "0Q1011111zLMmmmm1100H0nnnnnddddd") +INST(MLA_elt, "MLA (by element)", "0Q101111zzLMmmmm0000H0nnnnnddddd") +INST(UMLAL_elt, "UMLAL, UMLAL2 (by element)", "0Q101111zzLMmmmm0010H0nnnnnddddd") +INST(MLS_elt, "MLS (by element)", "0Q101111zzLMmmmm0100H0nnnnnddddd") +INST(UMLSL_elt, "UMLSL, UMLSL2 (by element)", "0Q101111zzLMmmmm0110H0nnnnnddddd") +INST(UMULL_elt, "UMULL, UMULL2 (by element)", "0Q101111zzLMmmmm1010H0nnnnnddddd") +//INST(SQRDMLAH_elt_2, "SQRDMLAH (by element)", "0Q101111zzLMmmmm1101H0nnnnnddddd") +INST(UDOT_elt, "UDOT (by element)", "0Q101111zzLMmmmm1110H0nnnnnddddd") +//INST(SQRDMLSH_elt_2, "SQRDMLSH (by element)", "0Q101111zzLMmmmm1111H0nnnnnddddd") +//INST(FMULX_elt_3, "FMULX (by element)", "0Q10111100LMmmmm1001H0nnnnnddddd") +INST(FMULX_elt_4, "FMULX (by element)", "0Q1011111zLMmmmm1001H0nnnnnddddd") +INST(FCMLA_elt, "FCMLA (by element)", "0Q101111zzLMmmmm0rr1H0nnnnnddddd") + +// Data Processing - FP and SIMD - Cryptographic three register +INST(SM3TT1A, "SM3TT1A", "11001110010mmmmm10ii00nnnnnddddd") +INST(SM3TT1B, "SM3TT1B", "11001110010mmmmm10ii01nnnnnddddd") +INST(SM3TT2A, "SM3TT2A", "11001110010mmmmm10ii10nnnnnddddd") +INST(SM3TT2B, "SM3TT2B", "11001110010mmmmm10ii11nnnnnddddd") + +// Data Processing - FP and SIMD - SHA512 three register +INST(SHA512H, "SHA512H", "11001110011mmmmm100000nnnnnddddd") +INST(SHA512H2, "SHA512H2", "11001110011mmmmm100001nnnnnddddd") +INST(SHA512SU1, "SHA512SU1", "11001110011mmmmm100010nnnnnddddd") +INST(RAX1, "RAX1", "11001110011mmmmm100011nnnnnddddd") +INST(SM3PARTW1, "SM3PARTW1", "11001110011mmmmm110000nnnnnddddd") +INST(SM3PARTW2, "SM3PARTW2", "11001110011mmmmm110001nnnnnddddd") +INST(SM4EKEY, "SM4EKEY", "11001110011mmmmm110010nnnnnddddd") +INST(XAR, "XAR", "11001110100mmmmmiiiiiinnnnnddddd") + +// Data Processing - FP and SIMD - Cryptographic four register +INST(EOR3, "EOR3", "11001110000mmmmm0aaaaannnnnddddd") +INST(BCAX, "BCAX", "11001110001mmmmm0aaaaannnnnddddd") +INST(SM3SS1, "SM3SS1", "11001110010mmmmm0aaaaannnnnddddd") + +// Data Processing - FP and SIMD - SHA512 two register +INST(SHA512SU0, "SHA512SU0", "1100111011000000100000nnnnnddddd") +INST(SM4E, "SM4E", "1100111011000000100001nnnnnddddd") + +// Data Processing - FP and SIMD - Conversion between floating point and fixed point +INST(SCVTF_float_fix, "SCVTF (scalar, fixed-point)", "z0011110yy000010ppppppnnnnnddddd") +INST(UCVTF_float_fix, "UCVTF (scalar, fixed-point)", "z0011110yy000011ppppppnnnnnddddd") +INST(FCVTZS_float_fix, "FCVTZS (scalar, fixed-point)", "z0011110yy011000ppppppnnnnnddddd") +INST(FCVTZU_float_fix, "FCVTZU (scalar, fixed-point)", "z0011110yy011001ppppppnnnnnddddd") + +// Data Processing - FP and SIMD - Conversion between floating point and integer +INST(FCVTNS_float, "FCVTNS (scalar)", "z0011110yy100000000000nnnnnddddd") +INST(FCVTNU_float, "FCVTNU (scalar)", "z0011110yy100001000000nnnnnddddd") +INST(SCVTF_float_int, "SCVTF (scalar, integer)", "z0011110yy100010000000nnnnnddddd") +INST(UCVTF_float_int, "UCVTF (scalar, integer)", "z0011110yy100011000000nnnnnddddd") +INST(FCVTAS_float, "FCVTAS (scalar)", "z0011110yy100100000000nnnnnddddd") +INST(FCVTAU_float, "FCVTAU (scalar)", "z0011110yy100101000000nnnnnddddd") +INST(FMOV_float_gen, "FMOV (general)", "z0011110yy10r11o000000nnnnnddddd") +INST(FCVTPS_float, "FCVTPS (scalar)", "z0011110yy101000000000nnnnnddddd") +INST(FCVTPU_float, "FCVTPU (scalar)", "z0011110yy101001000000nnnnnddddd") +INST(FCVTMS_float, "FCVTMS (scalar)", "z0011110yy110000000000nnnnnddddd") +INST(FCVTMU_float, "FCVTMU (scalar)", "z0011110yy110001000000nnnnnddddd") +INST(FCVTZS_float_int, "FCVTZS (scalar, integer)", "z0011110yy111000000000nnnnnddddd") +INST(FCVTZU_float_int, "FCVTZU (scalar, integer)", "z0011110yy111001000000nnnnnddddd") +//INST(FJCVTZS, "FJCVTZS", "0001111001111110000000nnnnnddddd") + +// Data Processing - FP and SIMD - Floating point data processing +INST(FMOV_float, "FMOV (register)", "00011110yy100000010000nnnnnddddd") +INST(FABS_float, "FABS (scalar)", "00011110yy100000110000nnnnnddddd") +INST(FNEG_float, "FNEG (scalar)", "00011110yy100001010000nnnnnddddd") +INST(FSQRT_float, "FSQRT (scalar)", "00011110yy100001110000nnnnnddddd") +INST(FCVT_float, "FCVT", "00011110yy10001oo10000nnnnnddddd") +INST(FRINTN_float, "FRINTN (scalar)", "00011110yy100100010000nnnnnddddd") +INST(FRINTP_float, "FRINTP (scalar)", "00011110yy100100110000nnnnnddddd") +INST(FRINTM_float, "FRINTM (scalar)", "00011110yy100101010000nnnnnddddd") +INST(FRINTZ_float, "FRINTZ (scalar)", "00011110yy100101110000nnnnnddddd") +INST(FRINTA_float, "FRINTA (scalar)", "00011110yy100110010000nnnnnddddd") +INST(FRINTX_float, "FRINTX (scalar)", "00011110yy100111010000nnnnnddddd") +INST(FRINTI_float, "FRINTI (scalar)", "00011110yy100111110000nnnnnddddd") +//INST(FRINT32X_float, "FRINT32X (scalar)", "00011110yy101000110000nnnnnddddd") // ARMv8.5 +//INST(FRINT64X_float, "FRINT64X (scalar)", "00011110yy101001110000nnnnnddddd") // ARMv8.5 +//INST(FRINT32Z_float, "FRINT32Z (scalar)", "00011110yy101000010000nnnnnddddd") // ARMv8.5 +//INST(FRINT64Z_float, "FRINT64Z (scalar)", "00011110yy101001010000nnnnnddddd") // ARMv8.5 + +// Data Processing - FP and SIMD - Floating point compare +INST(FCMP_float, "FCMP", "00011110yy1mmmmm001000nnnnn0o000") +INST(FCMPE_float, "FCMPE", "00011110yy1mmmmm001000nnnnn1o000") + +// Data Processing - FP and SIMD - Floating point immediate +INST(FMOV_float_imm, "FMOV (scalar, immediate)", "00011110yy1iiiiiiii10000000ddddd") + +// Data Processing - FP and SIMD - Floating point conditional compare +INST(FCCMP_float, "FCCMP", "00011110yy1mmmmmcccc01nnnnn0ffff") +INST(FCCMPE_float, "FCCMPE", "00011110yy1mmmmmcccc01nnnnn1ffff") + +// Data Processing - FP and SIMD - Floating point data processing two register +INST(FMUL_float, "FMUL (scalar)", "00011110yy1mmmmm000010nnnnnddddd") +INST(FDIV_float, "FDIV (scalar)", "00011110yy1mmmmm000110nnnnnddddd") +INST(FADD_float, "FADD (scalar)", "00011110yy1mmmmm001010nnnnnddddd") +INST(FSUB_float, "FSUB (scalar)", "00011110yy1mmmmm001110nnnnnddddd") +INST(FMAX_float, "FMAX (scalar)", "00011110yy1mmmmm010010nnnnnddddd") +INST(FMIN_float, "FMIN (scalar)", "00011110yy1mmmmm010110nnnnnddddd") +INST(FMAXNM_float, "FMAXNM (scalar)", "00011110yy1mmmmm011010nnnnnddddd") +INST(FMINNM_float, "FMINNM (scalar)", "00011110yy1mmmmm011110nnnnnddddd") +INST(FNMUL_float, "FNMUL (scalar)", "00011110yy1mmmmm100010nnnnnddddd") + +// Data Processing - FP and SIMD - Floating point conditional select +INST(FCSEL_float, "FCSEL", "00011110yy1mmmmmcccc11nnnnnddddd") + +// Data Processing - FP and SIMD - Floating point data processing three register +INST(FMADD_float, "FMADD", "00011111yy0mmmmm0aaaaannnnnddddd") +INST(FMSUB_float, "FMSUB", "00011111yy0mmmmm1aaaaannnnnddddd") +INST(FNMADD_float, "FNMADD", "00011111yy1mmmmm0aaaaannnnnddddd") +INST(FNMSUB_float, "FNMSUB", "00011111yy1mmmmm1aaaaannnnnddddd") + +// BFloat16 +//INST(BFCVT, "BFCVT", "0001111001100011010000nnnnnddddd") // v8.6 +//INST(BFCVTN, "BFCVTN{2}", "0Q00111010100001011010nnnnnddddd") // v8.6 +//INST(BFDOT_element, "BFDOT (by element)", "0Q00111101LMmmmm1111H0nnnnnddddd") // v8.6 +//INST(BFDOT_vec, "BFDOT (vector)", "0Q101110010mmmmm111111nnnnnddddd") // v8.6 +//INST(BFMLALX_element, "BFMLALX (by element)", "0Q00111111LMmmmm1111H0nnnnnddddd") // v8.6 +//INST(BFMLALX_vector, "BFMLALX (vector)", "0Q101110110mmmmm111111nnnnnddddd") // v8.6 +//INST(BFMMLA, "BFMMLA", "01101110010mmmmm111011nnnnnddddd") // v8.6 +#undef INST + }; + // If a matcher has more bits in its mask it is more specific, so it should come first. + std::stable_sort(list.begin(), list.end(), [](const auto& a, const auto& b) { + // If a matcher has more bits in its mask it is more specific, so it should come first. + return mcl::bit::count_ones(a.second) > mcl::bit::count_ones(b.second); + }); + // Exceptions to the above rule of thumb. + std::stable_partition(list.begin(), list.end(), [&](const auto& e) { + return std::set{ + "MOVI, MVNI, ORR, BIC (vector, immediate)", + "FMOV (vector, immediate)", + "Unallocated SIMD modified immediate", + }.count(e.first) > 0; + }); + for (auto const& e : list) + printf("%s\n", e.inst_final); + } + return 0; +} + From cae70c30fa19b65d483c882e7ad3488653b96e96 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 1 Apr 2026 07:26:46 +0200 Subject: [PATCH 22/68] [dynarmic] fix GCC 12.2 complaints for regalloc.h (#3812) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3812 Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp | 4 ++-- src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp index 47d83f2362..a92648cd44 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp @@ -316,8 +316,8 @@ int RegAlloc::RealizeReadImpl(const IR::Value& value) { return current_location->index; } - ASSERT(!ValueInfo(*current_location).realized); - ASSERT(ValueInfo(*current_location).locked); + ASSERT(!bool(ValueInfo(*current_location).realized)); + ASSERT(bool(ValueInfo(*current_location).locked)); if constexpr (required_kind == HostLoc::Kind::Gpr) { const int new_location_index = AllocateRegister(gprs, gpr_order); diff --git a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h index 8b872a0e9c..746d6b723f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h +++ b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h @@ -50,7 +50,7 @@ public: } inline void ReadLock() noexcept { ASSERT(size_t(is_being_used_count) + 1 < (std::numeric_limits::max)()); - ASSERT(!is_scratch); + ASSERT(!bool(is_scratch)); is_being_used_count++; } inline void WriteLock() noexcept { From 3ce5463d2df67346f0139a5d5e2223e5daa47502 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 08:10:39 +0200 Subject: [PATCH 23/68] [cmake] Remove shader dir regeneration (#3813) We ***do not*** support BSD make. Period. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3813 --- src/video_core/host_shaders/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 668f939546..60b399ccba 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -118,8 +118,6 @@ if (NOT GLSLANG_ERROR STREQUAL "") set(QUIET_FLAG "") endif() -# Shader files must depend on their directory otherwise *BSD make will spontaneously combust -file(MAKE_DIRECTORY "${SHADER_DIR}") foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) get_filename_component(FILENAME ${SOURCE_FILE} NAME) string(REPLACE "." "_" SHADER_NAME ${FILENAME}) @@ -135,7 +133,6 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) ${SOURCE_FILE} DEPENDS ${INPUT_FILE} - ${SHADER_DIR} # HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified ) set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE}) @@ -151,8 +148,6 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} MAIN_DEPENDENCY ${SOURCE_FILE} - DEPENDS - ${SHADER_DIR} ) set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) endif() @@ -172,7 +167,6 @@ foreach(FILEPATH IN ITEMS ${FIDELITYFX_FILES}) ${SOURCE_FILE} DEPENDS ${INPUT_FILE} - ${SHADER_DIR} # HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified ) set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE}) From 79f29abcba91bd835cb05b4635874c829fe5233c Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 21:02:20 +0200 Subject: [PATCH 24/68] [core] Fix renderdoc API garbage (#3816) Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3816 --- src/core/tools/renderdoc.cpp | 8 +++++--- src/core/tools/renderdoc.h | 4 +--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/tools/renderdoc.cpp b/src/core/tools/renderdoc.cpp index 5fab291fe5..4d91956902 100644 --- a/src/core/tools/renderdoc.cpp +++ b/src/core/tools/renderdoc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -51,10 +51,12 @@ void RenderdocAPI::ToggleCapture() { if (!rdoc_api) [[unlikely]] { return; } + + auto* api = static_cast(rdoc_api); if (!is_capturing) { - rdoc_api->StartFrameCapture(NULL, NULL); + api->StartFrameCapture(NULL, NULL); } else { - rdoc_api->EndFrameCapture(NULL, NULL); + api->EndFrameCapture(NULL, NULL); } is_capturing = !is_capturing; } diff --git a/src/core/tools/renderdoc.h b/src/core/tools/renderdoc.h index 689b0a383a..1f72bef320 100644 --- a/src/core/tools/renderdoc.h +++ b/src/core/tools/renderdoc.h @@ -6,8 +6,6 @@ #pragma once -struct RENDERDOC_API_1_7_0; - namespace Tools { class RenderdocAPI { @@ -18,7 +16,7 @@ public: void ToggleCapture(); private: - RENDERDOC_API_1_7_0* rdoc_api{}; + void* rdoc_api{}; bool is_capturing{false}; }; From 9ace6742d7ee764c6a5bc38b21fff7cf874f4f1f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 1 Apr 2026 21:59:37 +0200 Subject: [PATCH 25/68] [docs] update multiplayer section with metaserver info (#3722) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3722 Reviewed-by: DraVee Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- docs/Deps.md | 2 +- docs/user/Multiplayer.md | 50 ++++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/docs/Deps.md b/docs/Deps.md index a34e838534..80caf1685f 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -334,7 +334,7 @@ pacman -Syuu --needed --noconfirm $packages

HaikuOS ```sh -pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel +pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel ``` [Caveats](./Caveats.md#haikuos). diff --git a/docs/user/Multiplayer.md b/docs/user/Multiplayer.md index a501ba1d02..57c4495f46 100644 --- a/docs/user/Multiplayer.md +++ b/docs/user/Multiplayer.md @@ -56,7 +56,7 @@ Use this when you need to connect to a multiplayer room for LDN functionality in - Multiplayer Options Configured in Eden Settings - Network Access -## Steps +### Steps There are 2 primary methods that you can use to connect to an existing room, depending on how the room is hosted. - Joining a Public Lobby @@ -70,7 +70,7 @@ There are 2 primary methods that you can use to connect to an existing room, dep -### Joining a Public Lobby +## Joining a Public Lobby 1. Open Eden and navigate to *Multiplayer → Browse Public Game Lobby*. 2. The **Public Room Browser** will now open and display a list of publicly accessible rooms. Find one you want to connect to and double click it. @@ -90,7 +90,7 @@ If the hoster has not made the lobby public, or you don't want to find it in the --- -# Hosting a Multiplayer Room +## Hosting a Multiplayer Room Use this guide for when you want to host a multiplayer lobby to play with others in Eden. In order to have someone access the room from outside your local network, see the *Access Your Multiplayer Room Externally* section for next steps. **Click [Here](https://evilperson1337.notion.site/Hosting-a-Multiplayer-Room-2c357c2edaf6819481dbe8a99926cea2) for a version of this guide with images & visual elements.** @@ -100,7 +100,7 @@ Use this guide for when you want to host a multiplayer lobby to play with others - Network Access - Ability to allow programs through the firewall on your device. -## Steps +### Steps 1. Open Eden and navigate to *Emulation → Multiplayer → Create Room.* 2. Fill out the following information in the popup dialog box. @@ -120,7 +120,7 @@ Use this guide for when you want to host a multiplayer lobby to play with others --- -# Access Your Multiplayer Room Externally +## Access Your Multiplayer Room Externally Quite often the person with whom you want to play is located off of your internal network (LAN). If you want to host a room and play with them you will need to get your devices to communicate with each other. This guide will go over your options on how to do this so that you can play together. **Click [Here](https://evilperson1337.notion.site/Access-Your-Multiplayer-Room-Externally-2c357c2edaf681c0ab2ce2ee624d809d) for a version of this guide with images & visual elements.** @@ -129,9 +129,9 @@ Quite often the person with whom you want to play is located off of your interna - Eden set up and Functioning - Network Access -## Options +### Options -### Port Forwarding +#### Port Forwarding - **Difficulty Level**: High @@ -148,8 +148,9 @@ The process works by creating a static mapping—often called a “port-forward For our purposes we would pick the port we want to expose (*e.g. 24872*) and we would access our router's configuration and create a port-forward rule to send the traffic from an external connection to your local machine over our specified port (*24872)*. The exact way to do so, varies greatly by router manufacturer - and sometimes require contacting your ISP to do so depending on your agreement. You can look up your router on [*portforward.com*](https://portforward.com/router.htm) which may have instructions on how to do so for your specific equipment. If it is not there, you will have to use Google/ChatGPT to determine the steps for your equipment. +Remember you can't have one port open for multiple devices at the same time - you must only host from one device (or do more convoluted networking which we will not cover here). -### Use a Tunnelling Service +#### Use a Tunnelling Service - **Difficulty Level**: Easy