use_docked_mode_texts_map = {
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index be53b71393..53b0d1638b 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -130,6 +130,8 @@ add_library(video_core STATIC
renderer_vulkan/present/present_push_constants.h
renderer_vulkan/present/smaa.cpp
renderer_vulkan/present/smaa.h
+ renderer_vulkan/present/sgsr.cpp
+ renderer_vulkan/present/sgsr.h
renderer_vulkan/present/util.cpp
renderer_vulkan/present/util.h
renderer_vulkan/present/window_adapt_pass.cpp
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 60e0e8449b..0d8d37ec0c 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -754,7 +754,7 @@ void BufferCache::BindHostIndexBuffer() {
}
}
if constexpr (HAS_FULL_INDEX_AND_PRIMITIVE_SUPPORT) {
- const u32 new_offset = offset + draw_state.index_buffer.first * draw_state.index_buffer.FormatSizeInBytes();
+ const u32 new_offset = offset + draw_state.index_buffer.first * u32(draw_state.index_buffer.FormatSizeInBytes());
runtime.BindIndexBuffer(buffer, new_offset, size);
} else {
buffer.MarkUsage(offset, size);
@@ -1252,8 +1252,7 @@ void BufferCache
::UpdateIndexBuffer() {
const GPUVAddr gpu_addr_end = index_buffer_ref.EndAddress();
const std::optional device_addr = gpu_memory->GpuToCpuAddress(gpu_addr_begin);
const u32 address_size = static_cast(gpu_addr_end - gpu_addr_begin);
- const u32 draw_size =
- (index_buffer_ref.count + index_buffer_ref.first) * index_buffer_ref.FormatSizeInBytes();
+ const u32 draw_size = (index_buffer_ref.count + index_buffer_ref.first) * u32(index_buffer_ref.FormatSizeInBytes());
const u32 size = (std::min)(address_size, draw_size);
if (size == 0 || !device_addr) {
channel_state->index_buffer = NULL_BINDING;
diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp
index 3844a8e2f9..8a7798e035 100644
--- a/src/video_core/dma_pusher.cpp
+++ b/src/video_core/dma_pusher.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
@@ -26,7 +26,7 @@ constexpr u32 MacroRegistersStart = 0xE00;
DmaPusher::DmaPusher(Core::System& system_, GPU& gpu_, MemoryManager& memory_manager_,
Control::ChannelState& channel_state_)
: gpu{gpu_}, system{system_}, memory_manager{memory_manager_}, puller{gpu_, memory_manager_,
- *this, channel_state_}, signal_sync{false}, synced{false} {}
+ *this, channel_state_}, signal_sync{false}, synced{true} {}
DmaPusher::~DmaPusher() = default;
@@ -181,12 +181,12 @@ void DmaPusher::CallMethod(u32 argument) const {
});
} else {
auto subchannel = subchannels[dma_state.subchannel];
- if (!subchannel->execution_mask[dma_state.method]) {
- subchannel->method_sink.emplace_back(dma_state.method, argument);
- } else {
+ if (subchannel->execution_mask[dma_state.method]) {
subchannel->ConsumeSink();
subchannel->current_dma_segment = dma_state.dma_get + dma_state.dma_word_offset;
subchannel->CallMethod(dma_state.method, argument, dma_state.is_last_call);
+ } else {
+ subchannel->method_sink.emplace_back(dma_state.method, argument);
}
}
}
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index 9aaa99f7ff..7cf351e458 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -270,31 +270,20 @@ u32 Maxwell3D::GetMaxCurrentVertices() {
size_t Maxwell3D::EstimateIndexBufferSize() {
GPUVAddr start_address = regs.index_buffer.StartAddress();
GPUVAddr end_address = regs.index_buffer.EndAddress();
- static constexpr std::array max_sizes = {(std::numeric_limits::max)(),
- (std::numeric_limits::max)(),
- (std::numeric_limits::max)()};
- const size_t byte_size = regs.index_buffer.FormatSizeInBytes();
- const size_t log2_byte_size = Common::Log2Ceil64(byte_size);
- const size_t cap{GetMaxCurrentVertices() * 4 * byte_size};
- const size_t lower_cap =
- std::min(static_cast(end_address - start_address), cap);
- return std::min(
- memory_manager.GetMemoryLayoutSize(start_address, byte_size * max_sizes[log2_byte_size]) /
- byte_size,
- lower_cap);
+ auto const byte_size = regs.index_buffer.FormatSizeInBytes();
+ auto const max_size = 1ull << (byte_size * CHAR_BIT);
+ auto const upper_cap = GetMaxCurrentVertices() * 4 * byte_size;
+ auto const lower_cap = std::min(size_t(end_address - start_address), upper_cap);
+ return std::min(memory_manager.GetMemoryLayoutSize(start_address, byte_size * max_size) / byte_size, lower_cap);
}
u32 Maxwell3D::ProcessShadowRam(u32 method, u32 argument) {
// Keep track of the register value in shadow_state when requested.
- const auto control = shadow_state.shadow_ram_control;
- if (control == Regs::ShadowRamControl::Track ||
- control == Regs::ShadowRamControl::TrackWithFilter) {
- shadow_state.reg_array[method] = argument;
- return argument;
- }
- if (control == Regs::ShadowRamControl::Replay) {
+ auto const c = shadow_state.shadow_ram_control;
+ if (c == Regs::ShadowRamControl::Track || c == Regs::ShadowRamControl::TrackWithFilter)
+ return shadow_state.reg_array[method] = argument;
+ else if (c == Regs::ShadowRamControl::Replay)
return shadow_state.reg_array[method];
- }
return argument;
}
@@ -317,10 +306,8 @@ void Maxwell3D::ConsumeSinkImpl() {
void Maxwell3D::ProcessDirtyRegisters(u32 method, u32 argument) {
regs.reg_array[method] = argument;
-
- for (const auto& table : dirty.tables) {
+ for (auto const& table : dirty.tables)
dirty.flags[table[method]] = true;
- }
}
void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argument, bool is_last_call) {
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 3ac79e0eb8..864ee27fb6 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -2215,7 +2215,7 @@ public:
u32 first;
u32 count;
- unsigned FormatSizeInBytes() const {
+ size_t FormatSizeInBytes() const {
switch (format) {
case IndexFormat::UnsignedByte:
return 1;
@@ -2224,7 +2224,7 @@ public:
case IndexFormat::UnsignedInt:
return 4;
}
- ASSERT(false);
+ UNREACHABLE();
return 1;
}
@@ -3148,9 +3148,9 @@ public:
}
struct DirtyState {
- using Flags = std::bitset<(std::numeric_limits::max)()>;
+ using Flags = std::bitset<(std::numeric_limits::max)() + 1>;
using Table = std::array;
- using Tables = std::array;
+ using Tables = std::array, 2>;
Flags flags;
Tables tables{};
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h
index e4c4329e81..b9f5e1a9c0 100644
--- a/src/video_core/fence_manager.h
+++ b/src/video_core/fence_manager.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 2020 yuzu Emulator Project
@@ -76,9 +76,9 @@ public:
TryReleasePendingFences();
}
const bool should_flush = ShouldFlush();
- const bool delay_fence = Settings::IsGPULevelHigh() || (Settings::IsGPULevelMedium() && should_flush);
+ const bool delay_fence = Settings::values.antiflicker.GetValue() || !Settings::IsGPULevelLow();
CommitAsyncFlushes();
- TFence new_fence = CreateFence(!should_flush);
+ TFence new_fence = CreateFence(!should_flush && !delay_fence);
if constexpr (can_async_check) {
guard.lock();
}
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index 5f4054212f..391ca4ef5f 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -303,26 +303,25 @@ struct GPU::Impl {
free_swap_counters.pop_front();
}
}
- const auto wait_fence =
- RequestSyncOperation([this, current_request_counter, &layers, &fences, num_fences] {
- auto& syncpoint_manager = host1x.GetSyncpointManager();
- if (num_fences == 0) {
- renderer->Composite(layers);
- }
- const auto executer = [this, current_request_counter, layers_copy = layers]() {
- {
- std::unique_lock lk(request_swap_mutex);
- if (--request_swap_counters[current_request_counter] != 0) {
- return;
- }
- free_swap_counters.push_back(current_request_counter);
+ const auto wait_fence = RequestSyncOperation([this, current_request_counter, &layers, &fences, num_fences] {
+ auto& syncpoint_manager = host1x.GetSyncpointManager();
+ if (num_fences == 0) {
+ renderer->Composite(layers);
+ }
+ const auto executer = [this, current_request_counter, layers_copy = layers]() {
+ {
+ std::unique_lock lk(request_swap_mutex);
+ if (--request_swap_counters[current_request_counter] != 0) {
+ return;
}
- renderer->Composite(layers_copy);
- };
- for (size_t i = 0; i < num_fences; i++) {
- syncpoint_manager.RegisterGuestAction(fences[i].id, fences[i].value, executer);
+ free_swap_counters.push_back(current_request_counter);
}
- });
+ renderer->Composite(layers_copy);
+ };
+ for (size_t i = 0; i < num_fences; i++) {
+ syncpoint_manager.RegisterGuestAction(fences[i].id, fences[i].value, executer);
+ }
+ });
gpu_thread.TickGPU();
WaitForSyncOperation(wait_fence);
}
diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt
index 60b399ccba..9e8d76b104 100644
--- a/src/video_core/host_shaders/CMakeLists.txt
+++ b/src/video_core/host_shaders/CMakeLists.txt
@@ -76,6 +76,11 @@ set(SHADER_FILES
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_quad_indexed.comp
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_turbo_mode.comp
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_uint8.comp
+
+ # Snapdragon Game Super Resolution
+ ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader.vert
+ ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader_mobile.frag
+ ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader_mobile_edge_direction.frag
)
if (PLATFORM_HAIKU)
@@ -90,7 +95,7 @@ if ("${GLSLANGVALIDATOR}" STREQUAL "GLSLANGVALIDATOR-NOTFOUND")
message(FATAL_ERROR "Required program `glslangValidator` not found.")
endif()
-set(GLSL_FLAGS "")
+set(GLSL_FLAGS "-DUseUniformBlock=1")
set(SPIR_V_VERSION "spirv1.3")
set(QUIET_FLAG "--quiet")
diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert
new file mode 100644
index 0000000000..0d2a935a9d
--- /dev/null
+++ b/src/video_core/host_shaders/sgsr1_shader.vert
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#version 450
+
+layout(push_constant) uniform constants {
+ vec2 scale;
+ vec2 size;
+ vec2 resize_factor;
+ float edge_sharpness;
+};
+layout(location = 0) out highp vec2 texcoord;
+
+void main() {
+ float x = float((gl_VertexIndex & 1) << 2);
+ float y = float((gl_VertexIndex & 2) << 1);
+ gl_Position = vec4(x - 1.0f, y - 1.0f, 0.0, 1.0f) * vec4(sign(resize_factor), 1.f, 1.f);
+ texcoord = vec2(x, y) * abs(resize_factor) * 0.5;
+}
diff --git a/src/video_core/host_shaders/sgsr1_shader_mobile.frag b/src/video_core/host_shaders/sgsr1_shader_mobile.frag
new file mode 100644
index 0000000000..2e62d60af3
--- /dev/null
+++ b/src/video_core/host_shaders/sgsr1_shader_mobile.frag
@@ -0,0 +1,82 @@
+// SPDX-FileCopyrightText: Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserved.
+// SPDX-License-Identifier: BSD-3-Clause
+
+#version 460 core
+
+precision highp float;
+precision highp int;
+
+// Operation modes: RGBA -> 1, RGBY -> 3, LERP -> 4
+#define OPERATION_MODE 1
+#define EDGE_THRESHOLD (8.0 / 255.0)
+
+layout(push_constant) uniform constants {
+ vec2 scale;
+ vec2 size;
+ vec2 resize_factor;
+ float edge_sharpness;
+};
+layout(set = 0, binding = 0) uniform sampler2D sampler0;
+layout(location=0) in vec2 texcoord;
+layout(location=0) out vec4 frag_color;
+
+vec4 weightY(vec4 dx, vec4 dy, vec4 std) {
+ vec4 x = ((dx * dx) + (dy * dy)) * 0.55f + std;
+ return (x - 1.f) * (x - 4.f) * 3.8125f; // approx. of (x - 1) * (x - 4)^3
+}
+
+void main() {
+ vec4 color = textureLod(sampler0, texcoord.xy, 0.0f);
+ // image coord
+ vec2 icoord = (texcoord * size + vec2(-0.5f, 0.5f));
+ vec2 icoord_pixel = floor(icoord);
+ vec2 coord = icoord_pixel * scale;
+ vec2 pl = icoord - icoord_pixel;
+ // left: 0, right: 1, upDown: 2
+ mat3x4 dg = mat3x4(
+ textureGather(sampler0, coord, 1),
+ textureGather(sampler0, coord + vec2(2.f * scale.x, 0.0f), 1),
+ vec4(
+ textureGather(sampler0, coord + vec2(scale.x, -scale.y), 1).wz,
+ textureGather(sampler0, coord + vec2(scale.x, +scale.y), 1).yx
+ )
+ );
+ float edgeVote = abs(dg[0].z - dg[0].y) + abs(color.y - dg[0].y) + abs(color.y - dg[0].z);
+ if (edgeVote > EDGE_THRESHOLD) {
+ float mean = (dg[0].y + dg[0].z + dg[1].x + dg[1].w) * 0.25f;
+ dg = dg - mean;
+ vec4 sum = abs(dg[0]) + abs(dg[1]) + abs(dg[2]);
+ float std = 2.181818f / (sum.x + sum.y + sum.z + sum.w);
+ mat2x4 w = mat2x4(
+ weightY(
+ pl.xxxx + vec4(+1.0f, +0.0f, +0.0f, +1.0f),
+ pl.yyyy + vec4(-1.0f, -1.0f, +0.0f, +0.0f),
+ clamp(abs(dg[0]) * std, 0.0f, 1.0f)
+ ) + weightY(
+ pl.xxxx + vec4(-1.0f, -2.0f, -2.0f, -1.0f),
+ pl.yyyy + vec4(-1.0f, -1.0f, +0.0f, +0.0f),
+ clamp(abs(dg[1]) * std, 0.0f, 1.0f)
+ ) + weightY(
+ pl.xxxx + vec4(+0.0f, -1.0f, -1.0f, +0.0f),
+ pl.yyyy + vec4(+1.0f, +1.0f, -2.0f, -2.0f),
+ clamp(abs(dg[2]) * std, 0.0f, 1.0f)
+ ),
+ dg[0] + dg[1] + dg[2]
+ );
+ // compute final y with bounds
+ vec2 yb = vec2(
+ min(min(dg[0].y, dg[0].z), min(dg[1].x, dg[1].w)), // min
+ max(max(dg[0].y, dg[0].z), max(dg[1].x, dg[1].w)) // max
+ );
+ vec2 fvy = vec2(
+ w[0].x + w[0].y + w[0].z + w[0].w,
+ w[1].x + w[1].y + w[1].z + w[1].w
+ );
+ float fy = clamp((fvy.y / fvy.x) * edge_sharpness, yb[0], yb[1]);
+ // Smooth high contrast input
+ float dy = clamp(fy - color.y + mean, -23.0f / 255.0f, 23.0f / 255.0f);
+ color = clamp(color + dy, 0.0f, 1.0f);
+ }
+ color.w = 1.0f; //assume alpha channel is not used
+ frag_color.xyzw = color;
+}
\ No newline at end of file
diff --git a/src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag b/src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag
new file mode 100644
index 0000000000..10a8ff8e00
--- /dev/null
+++ b/src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag
@@ -0,0 +1,115 @@
+// SPDX-FileCopyrightText: Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserved.
+// SPDX-License-Identifier: BSD-3-Clause
+
+#version 460 core
+
+//precision float;
+//precision int;
+
+// Operation modes: RGBA -> 1, RGBY -> 3, LERP -> 4
+#define OperationMode 1
+#define EdgeThreshold 8.0/255.0
+
+layout( push_constant ) uniform constants {
+ vec4 ViewportInfo[1];
+ vec2 ResizeFactor;
+ float EdgeSharpness;
+};
+layout(set = 0, binding = 0) uniform sampler2D ps0;
+layout(location=0) in vec2 in_TEXCOORD0;
+layout(location=0) out vec4 out_Target0;
+
+float fastLanczos2(float x) {
+ float wA = x-4.0;
+ float wB = x*wA-wA;
+ wA *= wA;
+ return wB*wA;
+}
+
+vec2 weightY(float dx, float dy, float c, vec3 data) {
+ float std = data.x;
+ vec2 dir = data.yz;
+ float edgeDis = ((dx*dir.y)+(dy*dir.x));
+ float x = (((dx*dx)+(dy*dy))+((edgeDis*edgeDis)*((clamp(((c*c)*std),0.0,1.0)*0.7)+-1.0)));
+ float w = fastLanczos2(x);
+ return vec2(w, w * c);
+}
+
+vec2 edgeDirection(vec4 left, vec4 right) {
+ vec2 dir;
+ float RxLz = (right.x + (-left.z));
+ float RwLy = (right.w + (-left.y));
+ vec2 delta;
+ delta.x = (RxLz + RwLy);
+ delta.y = (RxLz + (-RwLy));
+ float lengthInv = inversesqrt((delta.x * delta.x+ 3.075740e-05) + (delta.y * delta.y));
+ dir.x = (delta.x * lengthInv);
+ dir.y = (delta.y * lengthInv);
+ return dir;
+}
+
+void main() {
+ vec4 color;
+ if(OperationMode == 1)
+ color.xyz = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyz;
+ else
+ color.xyzw = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyzw;
+
+ if ( OperationMode!=4) {
+ vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5));
+ vec2 imgCoordPixel = floor(imgCoord);
+ vec2 coord = (imgCoordPixel*ViewportInfo[0].xy);
+ vec2 pl = imgCoord - imgCoordPixel;
+ vec4 left = textureGather(ps0, coord, OperationMode);
+ float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ;
+ if(edgeVote > EdgeThreshold) {
+ coord.x += ViewportInfo[0].x;
+
+ vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0);
+ vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode);
+ vec4 upDown;
+ vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y);
+ upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz;
+ vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y);
+ upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx;
+
+ float mean = (left.y+left.z+right.x+right.w)*0.25;
+ left = left - vec4(mean);
+ right = right - vec4(mean);
+ upDown = upDown - vec4(mean);
+ color.w =color[OperationMode] - mean;
+
+ float sum = (((((abs(left.x)+abs(left.y))+abs(left.z))+abs(left.w))+(((abs(right.x)+abs(right.y))+abs(right.z))+abs(right.w)))+(((abs(upDown.x)+abs(upDown.y))+abs(upDown.z))+abs(upDown.w)));
+ float sumMean = 1.014185e+01/sum;
+ float std = (sumMean*sumMean);
+
+ vec3 data = vec3(std, edgeDirection(left, right));
+ vec2 aWY = weightY(pl.x, pl.y+1.0, upDown.x,data);
+ aWY += weightY(pl.x-1.0, pl.y+1.0, upDown.y,data);
+ aWY += weightY(pl.x-1.0, pl.y-2.0, upDown.z,data);
+ aWY += weightY(pl.x, pl.y-2.0, upDown.w,data);
+ aWY += weightY(pl.x+1.0, pl.y-1.0, left.x,data);
+ aWY += weightY(pl.x, pl.y-1.0, left.y,data);
+ aWY += weightY(pl.x, pl.y, left.z,data);
+ aWY += weightY(pl.x+1.0, pl.y, left.w,data);
+ aWY += weightY(pl.x-1.0, pl.y-1.0, right.x,data);
+ aWY += weightY(pl.x-2.0, pl.y-1.0, right.y,data);
+ aWY += weightY(pl.x-2.0, pl.y, right.z,data);
+ aWY += weightY(pl.x-1.0, pl.y, right.w,data);
+
+ float finalY = aWY.y/aWY.x;
+ float maxY = max(max(left.y,left.z),max(right.x,right.w));
+ float minY = min(min(left.y,left.z),min(right.x,right.w));
+ float deltaY = clamp(EdgeSharpness*finalY, minY, maxY) -color.w;
+
+ //smooth high contrast input
+ deltaY = clamp(deltaY, -23.0 / 255.0, 23.0 / 255.0);
+
+ color.x = clamp((color.x+deltaY),0.0,1.0);
+ color.y = clamp((color.y+deltaY),0.0,1.0);
+ color.z = clamp((color.z+deltaY),0.0,1.0);
+ }
+ }
+ color.w = 1.0; //assume alpha channel is not used
+ out_Target0.xyzw = color;
+}
\ No newline at end of file
diff --git a/src/video_core/renderer_opengl/gl_blit_screen.cpp b/src/video_core/renderer_opengl/gl_blit_screen.cpp
index 4b75e1b949..23e5eb7481 100644
--- a/src/video_core/renderer_opengl/gl_blit_screen.cpp
+++ b/src/video_core/renderer_opengl/gl_blit_screen.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 2024 Torzu Emulator Project
@@ -115,6 +115,8 @@ void BlitScreen::CreateWindowAdapt() {
window_adapt = MakeMmpx(device);
break;
case Settings::ScalingFilter::Fsr:
+ case Settings::ScalingFilter::Sgsr:
+ case Settings::ScalingFilter::SgsrEdge:
case Settings::ScalingFilter::Bilinear:
default:
window_adapt = MakeBilinear(device);
diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp
index b462c672cc..e20473d2af 100644
--- a/src/video_core/renderer_vulkan/present/layer.cpp
+++ b/src/video_core/renderer_vulkan/present/layer.cpp
@@ -15,6 +15,7 @@
#include "common/settings.h"
#include "video_core/framebuffer_config.h"
#include "video_core/renderer_vulkan/present/fsr.h"
+#include "video_core/renderer_vulkan/present/sgsr.h"
#include "video_core/renderer_vulkan/present/fxaa.h"
#include "video_core/renderer_vulkan/present/layer.h"
#include "video_core/renderer_vulkan/present/present_push_constants.h"
@@ -63,7 +64,11 @@ Layer::Layer(const Device& device_, MemoryAllocator& memory_allocator_, Schedule
CreateDescriptorPool();
CreateDescriptorSets(layout);
if (filters.get_scaling_filter() == Settings::ScalingFilter::Fsr) {
- fsr.emplace(device, memory_allocator, image_count, output_size);
+ sr_filter.emplace(device, memory_allocator, image_count, output_size);
+ } else if (filters.get_scaling_filter() == Settings::ScalingFilter::Sgsr) {
+ sr_filter.emplace(device, memory_allocator, image_count, output_size, false);
+ } else if (filters.get_scaling_filter() == Settings::ScalingFilter::SgsrEdge) {
+ sr_filter.emplace(device, memory_allocator, image_count, output_size, true);
}
}
@@ -114,9 +119,12 @@ void Layer::ConfigureDraw(PresentPushConstants* out_push_constants,
.height = scaled_height,
};
- if (fsr) {
+ if (auto* fsr = std::get_if(&sr_filter)) {
source_image_view = fsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect);
crop_rect = {0, 0, 1, 1};
+ } else if (auto* sgsr = std::get_if(&sr_filter)) {
+ source_image_view = sgsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect);
+ crop_rect = {0, 0, 1, 1};
}
SetMatrixData(*out_push_constants, layout);
diff --git a/src/video_core/renderer_vulkan/present/layer.h b/src/video_core/renderer_vulkan/present/layer.h
index d38b81823e..47a6a69218 100644
--- a/src/video_core/renderer_vulkan/present/layer.h
+++ b/src/video_core/renderer_vulkan/present/layer.h
@@ -13,6 +13,7 @@
#include "video_core/host1x/gpu_device_memory_manager.h"
#include "video_core/vulkan_common/vulkan_wrapper.h"
#include "video_core/renderer_vulkan/present/fsr.h"
+#include "video_core/renderer_vulkan/present/sgsr.h"
#include "video_core/renderer_vulkan/present/fxaa.h"
#include "video_core/renderer_vulkan/present/smaa.h"
@@ -95,7 +96,7 @@ private:
Settings::AntiAliasing anti_alias_setting{};
std::variant anti_alias{};
- std::optional fsr{};
+ std::variant sr_filter{};
std::vector resource_ticks{};
};
diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp
new file mode 100644
index 0000000000..4175190690
--- /dev/null
+++ b/src/video_core/renderer_vulkan/present/sgsr.cpp
@@ -0,0 +1,143 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/common_types.h"
+#include "common/div_ceil.h"
+#include "common/settings.h"
+
+//#include "video_core/sgsr.h"
+#include "video_core/host_shaders/sgsr1_shader_mobile_frag_spv.h"
+#include "video_core/host_shaders/sgsr1_shader_mobile_edge_direction_frag_spv.h"
+#include "video_core/host_shaders/sgsr1_shader_vert_spv.h"
+#include "video_core/renderer_vulkan/present/sgsr.h"
+#include "video_core/renderer_vulkan/present/util.h"
+#include "video_core/renderer_vulkan/vk_scheduler.h"
+#include "video_core/renderer_vulkan/vk_shader_util.h"
+#include "video_core/vulkan_common/vulkan_device.h"
+
+namespace Vulkan {
+
+using PushConstants = std::array;
+
+SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir)
+ : m_device{device}
+ , m_memory_allocator{memory_allocator}
+ , m_image_count{image_count}
+ , m_extent{extent}
+ , m_edge_dir{edge_dir}
+{
+ // Not finished yet initializing at ctor time?
+ m_dynamic_images.resize(m_image_count);
+ for (auto& images : m_dynamic_images) {
+ images.image = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT);
+ images.image_view = CreateWrappedImageView(m_device, images.image, VK_FORMAT_R16G16B16A16_SFLOAT);
+ }
+
+ m_renderpass = CreateWrappedRenderPass(m_device, VK_FORMAT_R16G16B16A16_SFLOAT);
+ for (auto& images : m_dynamic_images)
+ images.framebuffer = CreateWrappedFramebuffer(m_device, m_renderpass, images.image_view, m_extent);
+
+ m_sampler = CreateBilinearSampler(m_device);
+ m_vert_shader = BuildShader(m_device, SGSR1_SHADER_VERT_SPV);
+ m_stage_shader = m_edge_dir
+ ? BuildShader(m_device, SGSR1_SHADER_MOBILE_EDGE_DIRECTION_FRAG_SPV)
+ : BuildShader(m_device, SGSR1_SHADER_MOBILE_FRAG_SPV);
+ // 2 descriptors, 2 descriptor sets per invocation
+ m_descriptor_pool = CreateWrappedDescriptorPool(m_device, m_image_count, m_image_count);
+ m_descriptor_set_layout = CreateWrappedDescriptorSetLayout(m_device, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER});
+
+ VkDescriptorSetLayout layout = *m_descriptor_set_layout;
+ for (auto& images : m_dynamic_images)
+ images.descriptor_sets = CreateWrappedDescriptorSets(m_descriptor_pool, layout);
+
+ const VkPushConstantRange range{
+ .stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
+ .offset = 0,
+ .size = sizeof(PushConstants),
+ };
+ VkPipelineLayoutCreateInfo ci{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
+ .setLayoutCount = 1,
+ .pSetLayouts = m_descriptor_set_layout.address(),
+ .pushConstantRangeCount = 1,
+ .pPushConstantRanges = &range,
+ };
+ m_pipeline_layout = m_device.GetLogical().CreatePipelineLayout(ci);
+ m_stage_pipeline = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader));
+}
+
+void SGSR::UpdateDescriptorSets(VkImageView image_view, size_t image_index) {
+ Images& images = m_dynamic_images[image_index];
+ std::vector image_infos;
+ std::vector updates;
+ image_infos.reserve(1);
+ updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, image_view, images.descriptor_sets[0], 0));
+ m_device.GetLogical().UpdateDescriptorSets(updates, {});
+}
+
+void SGSR::UploadImages(Scheduler& scheduler) {
+ if (!m_images_ready) {
+ scheduler.Record([&](vk::CommandBuffer cmdbuf) {
+ for (auto& image : m_dynamic_images)
+ ClearColorImage(cmdbuf, *image.image);
+ });
+ scheduler.Finish();
+ m_images_ready = true;
+ }
+}
+
+VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect) {
+ Images& images = m_dynamic_images[image_index];
+ auto const output_image = *images.image;
+ auto const descriptor_set = images.descriptor_sets[0];
+ auto const framebuffer = *images.framebuffer;
+ auto const pipeline = *m_stage_pipeline;
+
+ VkPipelineLayout layout = *m_pipeline_layout;
+ VkRenderPass renderpass = *m_renderpass;
+ VkExtent2D extent = m_extent;
+
+ const f32 input_image_width = f32(input_image_extent.width);
+ const f32 input_image_height = f32(input_image_extent.height);
+ const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width;
+ const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height;
+ // expected [0, 2]
+ const f32 sharpening = f32(Settings::values.fsr_sharpening_slider.GetValue()) / 100.0f;
+
+ // p = (tex * viewport) / input = [0,n] (normalized texcoords)
+ // p * input = [0,1024], [0,768]
+ // layout( push_constant ) uniform constants {
+ // highp vec4 ViewportInfo[1];
+ // highp vec2 ResizeFactor;
+ // highp float EdgeSharpness;
+ // };
+ PushConstants viewport_con{};
+ viewport_con[0] = std::bit_cast(std::abs(1.f / viewport_width));
+ viewport_con[1] = std::bit_cast(std::abs(1.f / viewport_height));
+ viewport_con[2] = std::bit_cast(std::abs(viewport_width));
+ viewport_con[3] = std::bit_cast(std::abs(viewport_height));
+ viewport_con[4] = std::bit_cast(viewport_width / input_image_width);
+ viewport_con[5] = std::bit_cast(viewport_height / input_image_height);
+ viewport_con[6] = std::bit_cast(sharpening);
+
+ UploadImages(scheduler);
+ UpdateDescriptorSets(source_image_view, image_index);
+
+ scheduler.RequestOutsideRenderPassOperationContext();
+ scheduler.Record([=](vk::CommandBuffer cmdbuf) {
+ TransitionImageLayout(cmdbuf, source_image, VK_IMAGE_LAYOUT_GENERAL);
+ TransitionImageLayout(cmdbuf, output_image, VK_IMAGE_LAYOUT_GENERAL);
+ BeginRenderPass(cmdbuf, renderpass, framebuffer, extent);
+ cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+ cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set, {});
+ cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con);
+ cmdbuf.Draw(3, 1, 0, 0);
+ cmdbuf.EndRenderPass();
+ TransitionImageLayout(cmdbuf, output_image, VK_IMAGE_LAYOUT_GENERAL);
+ });
+ return *images.image_view;
+}
+
+} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/present/sgsr.h b/src/video_core/renderer_vulkan/present/sgsr.h
new file mode 100644
index 0000000000..67b25be75d
--- /dev/null
+++ b/src/video_core/renderer_vulkan/present/sgsr.h
@@ -0,0 +1,50 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "common/math_util.h"
+#include "video_core/vulkan_common/vulkan_memory_allocator.h"
+#include "video_core/vulkan_common/vulkan_wrapper.h"
+
+namespace Vulkan {
+
+class Device;
+class Scheduler;
+
+class SGSR {
+public:
+ static constexpr size_t SGSR_STAGE_COUNT = 1;
+ explicit SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir);
+ VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect);
+private:
+ void Initialize();
+ void UploadImages(Scheduler& scheduler);
+ void UpdateDescriptorSets(VkImageView image_view, size_t image_index);
+
+ const Device& m_device;
+ MemoryAllocator& m_memory_allocator;
+ const size_t m_image_count;
+ const VkExtent2D m_extent;
+
+ vk::DescriptorPool m_descriptor_pool;
+ vk::DescriptorSetLayout m_descriptor_set_layout;
+ vk::PipelineLayout m_pipeline_layout;
+ vk::ShaderModule m_vert_shader;
+ vk::ShaderModule m_stage_shader;
+ vk::Pipeline m_stage_pipeline;
+ vk::RenderPass m_renderpass;
+ vk::Sampler m_sampler;
+
+ struct Images {
+ vk::DescriptorSets descriptor_sets;
+ vk::Image image;
+ vk::ImageView image_view;
+ vk::Framebuffer framebuffer;
+ };
+ std::vector m_dynamic_images;
+ bool m_images_ready{};
+ bool m_edge_dir{};
+};
+
+} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
index 75a8c3bf91..57f096db79 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
@@ -77,6 +77,8 @@ void BlitScreen::SetWindowAdaptPass() {
window_adapt = MakeMmpx(device, swapchain_view_format);
break;
case Settings::ScalingFilter::Fsr:
+ case Settings::ScalingFilter::Sgsr:
+ case Settings::ScalingFilter::SgsrEdge:
case Settings::ScalingFilter::Bilinear:
default:
window_adapt = MakeBilinear(device, swapchain_view_format);
diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp
index fdaf9baacc..abad831b69 100644
--- a/src/video_core/renderer_vulkan/vk_scheduler.cpp
+++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp
@@ -59,7 +59,57 @@ Scheduler::Scheduler(const Device& device_, StateTracker& state_tracker_)
AcquireNewChunk();
AllocateWorkerCommandBuffer();
- worker_thread = std::jthread([this](std::stop_token token) { WorkerThread(token); });
+ worker_thread = std::jthread([this](std::stop_token stop_token) {
+ Common::SetCurrentThreadName("VulkanWorker");
+ const auto TryPopQueue{[this](auto& work) -> bool {
+ if (work_queue.empty()) {
+ return false;
+ }
+
+ work = std::move(work_queue.front());
+ work_queue.pop();
+ event_cv.notify_all();
+ return true;
+ }};
+
+ while (!stop_token.stop_requested()) {
+ std::unique_ptr work;
+
+ {
+ std::unique_lock lk{queue_mutex};
+
+ // Wait for work.
+ event_cv.wait(lk, stop_token, [&] { return TryPopQueue(work); });
+
+ // If we've been asked to stop, we're done.
+ if (stop_token.stop_requested()) {
+ return;
+ }
+
+ // Exchange lock ownership so that we take the execution lock before
+ // the queue lock goes out of scope. This allows us to force execution
+ // to complete in the next step.
+ std::exchange(lk, std::unique_lock{execution_mutex});
+
+ // Perform the work, tracking whether the chunk was a submission
+ // before executing.
+ const bool has_submit = work->HasSubmit();
+ work->ExecuteAll(current_cmdbuf, current_upload_cmdbuf);
+
+ // If the chunk was a submission, reallocate the command buffer.
+ if (has_submit) {
+ AllocateWorkerCommandBuffer();
+ }
+ }
+
+ {
+ std::scoped_lock rl{reserve_mutex};
+
+ // Recycle the chunk back to the reserve.
+ chunk_reserve.emplace_back(std::move(work));
+ }
+ }
+ });
}
Scheduler::~Scheduler() = default;
@@ -187,59 +237,6 @@ bool Scheduler::UpdateRescaling(bool is_rescaling) {
return true;
}
-void Scheduler::WorkerThread(std::stop_token stop_token) {
- Common::SetCurrentThreadName("VulkanWorker");
-
- const auto TryPopQueue{[this](auto& work) -> bool {
- if (work_queue.empty()) {
- return false;
- }
-
- work = std::move(work_queue.front());
- work_queue.pop();
- event_cv.notify_all();
- return true;
- }};
-
- while (!stop_token.stop_requested()) {
- std::unique_ptr work;
-
- {
- std::unique_lock lk{queue_mutex};
-
- // Wait for work.
- event_cv.wait(lk, stop_token, [&] { return TryPopQueue(work); });
-
- // If we've been asked to stop, we're done.
- if (stop_token.stop_requested()) {
- return;
- }
-
- // Exchange lock ownership so that we take the execution lock before
- // the queue lock goes out of scope. This allows us to force execution
- // to complete in the next step.
- std::exchange(lk, std::unique_lock{execution_mutex});
-
- // Perform the work, tracking whether the chunk was a submission
- // before executing.
- const bool has_submit = work->HasSubmit();
- work->ExecuteAll(current_cmdbuf, current_upload_cmdbuf);
-
- // If the chunk was a submission, reallocate the command buffer.
- if (has_submit) {
- AllocateWorkerCommandBuffer();
- }
- }
-
- {
- std::scoped_lock rl{reserve_mutex};
-
- // Recycle the chunk back to the reserve.
- chunk_reserve.emplace_back(std::move(work));
- }
- }
-}
-
void Scheduler::AllocateWorkerCommandBuffer() {
current_cmdbuf = vk::CommandBuffer(command_pool->Commit(), device.GetDispatchLoader());
current_cmdbuf.Begin({
diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h
index 0709c3a370..fc11be7c0e 100644
--- a/src/video_core/renderer_vulkan/vk_scheduler.h
+++ b/src/video_core/renderer_vulkan/vk_scheduler.h
@@ -251,8 +251,6 @@ private:
bool needs_state_enable_refresh = false;
};
- void WorkerThread(std::stop_token stop_token);
-
void AllocateWorkerCommandBuffer();
u64 SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_semaphore);
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp
index 3f4dd89c7e..a7b7c46f39 100644
--- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp
+++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp
@@ -24,11 +24,8 @@ using namespace Dirty;
using namespace VideoCommon::Dirty;
using Tegra::Engines::Maxwell3D;
using Regs = Maxwell3D::Regs;
-using Tables = Maxwell3D::DirtyState::Tables;
-using Table = Maxwell3D::DirtyState::Table;
-using Flags = Maxwell3D::DirtyState::Flags;
-Flags MakeInvalidationFlags() {
+Maxwell3D::DirtyState::Flags MakeInvalidationFlags() {
static constexpr int INVALIDATION_FLAGS[]{
Viewports,
Scissors,
@@ -68,7 +65,7 @@ Flags MakeInvalidationFlags() {
LineStippleEnable,
LineStippleParams,
};
- Flags flags{};
+ Maxwell3D::DirtyState::Flags flags{};
for (const int flag : INVALIDATION_FLAGS) {
flags[flag] = true;
}
@@ -84,7 +81,7 @@ Flags MakeInvalidationFlags() {
return flags;
}
-void SetupDirtyViewports(Tables& tables) {
+void SetupDirtyViewports(Maxwell3D::DirtyState::Tables& tables) {
FillBlock(tables[0], OFF(viewport_transform), NUM(viewport_transform), Viewports);
FillBlock(tables[0], OFF(viewports), NUM(viewports), Viewports);
FillBlock(tables[1], OFF(surface_clip), NUM(surface_clip), Viewports);
@@ -92,26 +89,26 @@ void SetupDirtyViewports(Tables& tables) {
tables[1][OFF(window_origin)] = Viewports;
}
-void SetupDirtyScissors(Tables& tables) {
+void SetupDirtyScissors(Maxwell3D::DirtyState::Tables& tables) {
FillBlock(tables[0], OFF(scissor_test), NUM(scissor_test), Scissors);
}
-void SetupDirtyDepthBias(Tables& tables) {
+void SetupDirtyDepthBias(Maxwell3D::DirtyState::Tables& tables) {
auto& table = tables[0];
table[OFF(depth_bias)] = DepthBias;
table[OFF(depth_bias_clamp)] = DepthBias;
table[OFF(slope_scale_depth_bias)] = DepthBias;
}
-void SetupDirtyBlendConstants(Tables& tables) {
+void SetupDirtyBlendConstants(Maxwell3D::DirtyState::Tables& tables) {
FillBlock(tables[0], OFF(blend_color), NUM(blend_color), BlendConstants);
}
-void SetupDirtyDepthBounds(Tables& tables) {
+void SetupDirtyDepthBounds(Maxwell3D::DirtyState::Tables& tables) {
FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds);
}
-void SetupDirtyStencilProperties(Tables& tables) {
+void SetupDirtyStencilProperties(Maxwell3D::DirtyState::Tables& tables) {
const auto setup = [&](size_t position, u8 flag) {
tables[0][position] = flag;
tables[1][position] = StencilProperties;
@@ -125,18 +122,18 @@ void SetupDirtyStencilProperties(Tables& tables) {
setup(OFF(stencil_back_func_mask), StencilCompare);
}
-void SetupDirtyLineWidth(Tables& tables) {
+void SetupDirtyLineWidth(Maxwell3D::DirtyState::Tables& tables) {
tables[0][OFF(line_width_smooth)] = LineWidth;
tables[0][OFF(line_width_aliased)] = LineWidth;
}
-void SetupDirtyCullMode(Tables& tables) {
+void SetupDirtyCullMode(Maxwell3D::DirtyState::Tables& tables) {
auto& table = tables[0];
table[OFF(gl_cull_face)] = CullMode;
table[OFF(gl_cull_test_enabled)] = CullMode;
}
-void SetupDirtyStateEnable(Tables& tables) {
+void SetupDirtyStateEnable(Maxwell3D::DirtyState::Tables& tables) {
const auto setup = [&](size_t position, u8 flag) {
tables[0][position] = flag;
tables[1][position] = StateEnable;
@@ -157,17 +154,17 @@ void SetupDirtyStateEnable(Tables& tables) {
setup(OFF(anti_alias_alpha_control.alpha_to_one), AlphaToOneEnable);
}
-void SetupDirtyDepthCompareOp(Tables& tables) {
+void SetupDirtyDepthCompareOp(Maxwell3D::DirtyState::Tables& tables) {
tables[0][OFF(depth_test_func)] = DepthCompareOp;
}
-void SetupDirtyFrontFace(Tables& tables) {
+void SetupDirtyFrontFace(Maxwell3D::DirtyState::Tables& tables) {
auto& table = tables[0];
table[OFF(gl_front_face)] = FrontFace;
table[OFF(window_origin)] = FrontFace;
}
-void SetupDirtyStencilOp(Tables& tables) {
+void SetupDirtyStencilOp(Maxwell3D::DirtyState::Tables& tables) {
auto& table = tables[0];
table[OFF(stencil_front_op.fail)] = StencilOp;
table[OFF(stencil_front_op.zfail)] = StencilOp;
@@ -182,7 +179,7 @@ void SetupDirtyStencilOp(Tables& tables) {
tables[1][OFF(stencil_two_side_enable)] = StencilOp;
}
-void SetupDirtyBlending(Tables& tables) {
+void SetupDirtyBlending(Maxwell3D::DirtyState::Tables& tables) {
tables[0][OFF(color_mask_common)] = Blending;
tables[1][OFF(color_mask_common)] = ColorMask;
tables[0][OFF(blend_per_target_enabled)] = Blending;
@@ -196,11 +193,11 @@ void SetupDirtyBlending(Tables& tables) {
FillBlock(tables[1], OFF(blend_per_target), NUM(blend_per_target), BlendEquations);
}
-void SetupDirtySpecialOps(Tables& tables) {
+void SetupDirtySpecialOps(Maxwell3D::DirtyState::Tables& tables) {
tables[0][OFF(logic_op.op)] = LogicOp;
}
-void SetupDirtyViewportSwizzles(Tables& tables) {
+void SetupDirtyViewportSwizzles(Maxwell3D::DirtyState::Tables& tables) {
static constexpr size_t swizzle_offset = 6;
for (size_t index = 0; index < Regs::NumViewports; ++index) {
tables[1][OFF(viewport_transform) + index * NUM(viewport_transform[0]) + swizzle_offset] =
@@ -208,7 +205,7 @@ void SetupDirtyViewportSwizzles(Tables& tables) {
}
}
-void SetupDirtyVertexAttributes(Tables& tables) {
+void SetupDirtyVertexAttributes(Maxwell3D::DirtyState::Tables& tables) {
for (size_t i = 0; i < Regs::NumVertexAttributes; ++i) {
const size_t offset = OFF(vertex_attrib_format) + i * NUM(vertex_attrib_format[0]);
FillBlock(tables[0], offset, NUM(vertex_attrib_format[0]), VertexAttribute0 + i);
@@ -216,7 +213,7 @@ void SetupDirtyVertexAttributes(Tables& tables) {
FillBlock(tables[1], OFF(vertex_attrib_format), Regs::NumVertexAttributes, VertexInput);
}
-void SetupDirtyVertexBindings(Tables& tables) {
+void SetupDirtyVertexBindings(Maxwell3D::DirtyState::Tables& tables) {
// Do NOT include stride here, it's implicit in VertexBuffer
static constexpr size_t divisor_offset = 3;
for (size_t i = 0; i < Regs::NumVertexArrays; ++i) {
@@ -228,7 +225,7 @@ void SetupDirtyVertexBindings(Tables& tables) {
}
}
-void SetupRasterModes(Tables &tables) {
+void SetupRasterModes(Maxwell3D::DirtyState::Tables &tables) {
auto& table = tables[0];
table[OFF(line_stipple_params)] = LineStippleParams;
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 5a1c680830..cb6b5b0a94 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -128,6 +128,7 @@ void TextureCache::RunGarbageCollector() {
if (num_iterations == 0) {
return true;
}
+ --num_iterations;
auto& image = slot_images[image_id];
if (True(image.flags & ImageFlagBits::IsDecoding)) {
return false;
@@ -136,7 +137,6 @@ void TextureCache
::RunGarbageCollector() {
if ((!aggressive_mode && True(image.flags & ImageFlagBits::CostlyLoad)) || (!high_priority_mode && must_download)) {
return false;
}
- --num_iterations;
if (must_download) {
auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes);
const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info));
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index 344cbe2406..f294403397 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -221,7 +221,7 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) {
// FSR needs a reversed slider and a 0.5 multiplier
return builder.BuildWidget(
setting, apply_funcs, ConfigurationShared::RequestType::ReverseSlider, true,
- 0.5f, nullptr, tr("%", "FSR sharpening percentage (e.g. 50%)"));
+ 0.5f, nullptr, tr("%", "FSR/SGSR sharpening percentage (e.g. 50%)"));
} else {
return builder.BuildWidget(setting, apply_funcs);
}
diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp
index 4d5a3c43f9..5d60bd3a8f 100644
--- a/src/yuzu/main_window.cpp
+++ b/src/yuzu/main_window.cpp
@@ -4164,8 +4164,7 @@ void MainWindow::UpdateAPIText() {
void MainWindow::UpdateFilterText() {
const auto filter = Settings::values.scaling_filter.GetValue();
const auto filter_text = ConfigurationShared::scaling_filter_texts_map.find(filter)->second;
- filter_status_button->setText(filter == Settings::ScalingFilter::Fsr ? tr("FSR")
- : filter_text.toUpper());
+ filter_status_button->setText(filter_text.toUpper());
}
void MainWindow::UpdateAAText() {
diff --git a/tools/README.md b/tools/README.md
index ee82c708b0..367a00f246 100644
--- a/tools/README.md
+++ b/tools/README.md
@@ -6,7 +6,13 @@ Tools for Eden and other subprojects. When adding new scripts please use `#!/bin
- [CPMUtil Scripts](./cpm)
-## Eden
+## Binaries
+
+- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code (emitted into STDOUT).
+- `maxwell-disas`: Dumb raw Maxwell dissasembler.
+- `maxwell-ir`: Dump generated IR of Maxwell shaders.
+
+## Scripts
- `generate_converters.py`: Generates converters for given formats of textures (C++ helper).
- `svc_generator.py`: Generates the files `src/core/hle/kernel/svc.cpp` and `src/core/hle/kernel/svc.h` based off prototypes.
diff --git a/tools/maxwell-disas/CMakeLists.txt b/tools/maxwell-disas/CMakeLists.txt
new file mode 100644
index 0000000000..2595d45a35
--- /dev/null
+++ b/tools/maxwell-disas/CMakeLists.txt
@@ -0,0 +1,11 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+add_executable(maxwell-disas
+ main.cpp
+)
+target_link_libraries(maxwell-disas PRIVATE common shader_recompiler Threads::Threads)
+target_include_directories(maxwell-disas PRIVATE ${CMAKE_SOURCE_DIR}/src)
+if(UNIX AND NOT APPLE)
+ install(TARGETS maxwell-disas)
+endif()
+create_target_directory_groups(maxwell-disas)
diff --git a/tools/maxwell-disas/file_environment.h b/tools/maxwell-disas/file_environment.h
new file mode 100644
index 0000000000..cf190806e4
--- /dev/null
+++ b/tools/maxwell-disas/file_environment.h
@@ -0,0 +1,60 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include
+#include
+#include "shader_recompiler/environment.h"
+
+class FileEnvironment final : public Shader::Environment {
+public:
+ FileEnvironment() = default;
+ ~FileEnvironment() override = default;
+ FileEnvironment& operator=(FileEnvironment&&) noexcept = default;
+ FileEnvironment(FileEnvironment&&) noexcept = default;
+ FileEnvironment& operator=(const FileEnvironment&) = delete;
+ FileEnvironment(const FileEnvironment&) = delete;
+ void Deserialize(std::ifstream& file) {}
+ [[nodiscard]] u64 ReadInstruction(u32 address) override {
+ if (address < read_lowest || address > read_highest) {
+ std::printf("cant read %08x\n", address);
+ std::abort();
+ }
+ return code[(address - read_lowest) / sizeof(u64)];
+ }
+ [[nodiscard]] u32 ReadCbufValue(u32 cbuf_index, u32 cbuf_offset) override { return 0; }
+ [[nodiscard]] Shader::TextureType ReadTextureType(u32 handle) override {
+ auto const it{texture_types.find(handle)};
+ return it->second;
+ }
+ [[nodiscard]] Shader::TexturePixelFormat ReadTexturePixelFormat(u32 handle) override {
+ auto const it{texture_pixel_formats.find(handle)};
+ return it->second;
+ }
+ [[nodiscard]] bool IsTexturePixelFormatInteger(u32 handle) override { return true; }
+ [[nodiscard]] u32 ReadViewportTransformState() override { return viewport_transform_state; }
+ [[nodiscard]] u32 LocalMemorySize() const override { return local_memory_size; }
+ [[nodiscard]] u32 SharedMemorySize() const override { return shared_memory_size; }
+ [[nodiscard]] u32 TextureBoundBuffer() const override { return texture_bound; }
+ [[nodiscard]] std::array WorkgroupSize() const override { return workgroup_size; }
+ [[nodiscard]] std::optional GetReplaceConstBuffer(u32 bank, u32 offset) override {
+ auto const it = cbuf_replacements.find((u64(bank) << 32) | u64(offset));
+ return it != cbuf_replacements.end() ? std::optional{it->second} : std::nullopt;
+ }
+ [[nodiscard]] bool HasHLEMacroState() const override { return cbuf_replacements.size() != 0; }
+ void Dump(u64 pipeline_hash, u64 shader_hash) override {}
+ std::vector code;
+ std::unordered_map texture_types;
+ std::unordered_map texture_pixel_formats;
+ std::unordered_map cbuf_values;
+ std::unordered_map cbuf_replacements;
+ std::array workgroup_size{};
+ u32 local_memory_size{};
+ u32 shared_memory_size{};
+ u32 texture_bound{};
+ u32 read_lowest{};
+ u32 read_highest{};
+ u32 initial_offset{};
+ u32 viewport_transform_state = 1;
+};
diff --git a/tools/maxwell-disas/generated.cpp b/tools/maxwell-disas/generated.cpp
new file mode 100644
index 0000000000..687209558d
--- /dev/null
+++ b/tools/maxwell-disas/generated.cpp
@@ -0,0 +1,641 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include
+#include
+#include
+namespace Shader::Maxwell {
+std::string DissasemblyFormat(uint64_t inst) {
+ std::string s{};
+ if(((inst>>48)&0xfff8ULL)==0x5c58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSWZADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c68ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c68ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c90ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"RRO "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c90ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"RRO "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5080ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"MUFU "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c88ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCHK "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c88ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCHK "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c38ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c38ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c18ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISCADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c18ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISCADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c20ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c20ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFE "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFE "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5bf0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFI "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4bf0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFI "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x53f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFI "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c28ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c28ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5bf8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cf8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5be0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5be0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c30ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FLO "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c30ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FLO "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c08ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"POPC "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c08ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"POPC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cb8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ce0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ce0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ce0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ce0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5c98ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"MOV "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4c98ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"MOV "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ca0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SEL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ca0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SEL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHFL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHFL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHFL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHFL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5ce8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"P2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4ce8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"P2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5cf0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"R2P "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4cf0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"R2P "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5098ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CSET "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5098ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CSET "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50a0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CSETP ";
+ if(((inst>>48)&0xfff8ULL)==0x50a0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CSETP ";
+ if(((inst>>48)&0xfff8ULL)==0x5088ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PSET "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5088ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PSET "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5090ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PSETP ";
+ if(((inst>>48)&0xfff8ULL)==0x5090ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PSETP ";
+ if(((inst>>48)&0xfff8ULL)==0xeea0ULL)return s+"STP ";
+ if(((inst>>48)&0xfff8ULL)==0xdf58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TMML "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TMML "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TMML "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TMML "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXQ "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xdf40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DEPBAR ";
+ if(((inst>>48)&0xfff8ULL)==0xf0f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DEPBAR ";
+ if(((inst>>48)&0xfff8ULL)==0xf0f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DEPBAR ";
+ if(((inst>>48)&0xfff8ULL)==0xefa0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"AL2P "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefa0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"AL2P "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefd8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ALD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefd8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ALD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefd8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ALD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefd8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ALD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeff0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"AST ";
+ if(((inst>>48)&0xfff8ULL)==0xeff0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"AST ";
+ if(((inst>>48)&0xfff8ULL)==0xeff0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"AST ";
+ if(((inst>>48)&0xfff8ULL)==0xeff0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"AST ";
+ if(((inst>>48)&0xfff8ULL)==0xfbe0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"OUT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xebe0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"OUT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefe8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PIXLD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefe8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PIXLD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefe8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PIXLD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef90ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef90ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef90ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef90ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeed0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDG "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeed0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDG "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeec8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDG "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeec8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDG "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDL "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDL "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LDS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5bd0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LEA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x4bd0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LEA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5bd8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LEA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeed8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"STG "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeed8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"STG "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"STL "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"STL "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"STS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"STS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xebf8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"RED ";
+ if(((inst>>48)&0xfff8ULL)==0xebf8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"RED ";
+ if(((inst>>48)&0xfff8ULL)==0xef80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLL ";
+ if(((inst>>48)&0xfff8ULL)==0xef80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLL ";
+ if(((inst>>48)&0xfff8ULL)==0xef80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLL "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xef80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLL "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xebe8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLT ";
+ if(((inst>>48)&0xfff8ULL)==0xebf0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLT ";
+ if(((inst>>48)&0xfff8ULL)==0xebf0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTLT ";
+ if(((inst>>48)&0xfff8ULL)==0xef98ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"MEMBAR ";
+ if(((inst>>48)&0xfff8ULL)==0xeb10ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SULD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb18ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SULD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SULD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb08ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SULD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb30ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUST "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb38ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUST "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb20ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUST "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb28ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUST "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SURED "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb58ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SURED "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SURED "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeb48ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SURED "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xea70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xea60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xea68ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xead0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeac0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xeac8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0f8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SYNC ";
+ if(((inst>>48)&0xfff8ULL)==0x50b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"NOP ";
+ if(((inst>>48)&0xfff8ULL)==0x50b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"NOP ";
+ if(((inst>>48)&0xfff8ULL)==0xf0c8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"S2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+std::string(SpecialRegGetName((inst&0xfffffff)>>0x14));
+ if(((inst>>48)&0xfff8ULL)==0x50c8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CS2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+std::string(SpecialRegGetName((inst&0xfffffff)>>0x14));
+ if(((inst>>48)&0xfff8ULL)==0xf0b8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"B2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0b8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"B2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0b8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"B2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0c0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"R2B "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50d0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LEPC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xf0a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BAR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x50e0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VOTE ";
+ if(((inst>>48)&0xfff8ULL)==0x50d8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VOTE "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0xefd0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISBERD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x0ULL)return s+"HFMA2 ";
+ if(((inst>>48)&0xfff8ULL)==0x0ULL)return s+"HSET2 ";
+ if(((inst>>48)&0xfff8ULL)==0x0ULL)return s+"HSET2 ";
+ if(((inst>>48)&0xfff8ULL)==0x0ULL)return s+"HADD2 ";
+ if(((inst>>48)&0xfff8ULL)==0x0ULL)return s+"HMUL2 ";
+ if(((inst>>48)&0xfff8ULL)==0x5d20ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HSETP2 "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff8ULL)==0x5d20ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HSETP2 "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3858ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5ba0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4ba0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x53a0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3868ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3860ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5bb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5bb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4bb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4bb0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3890ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"RRO "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3888ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCHK "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5370ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3870ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3880ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3850ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3838ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMUL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3810ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5cc0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4cc0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3818ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISCADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3820ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFE "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x36f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BFI "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3828ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3848ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x36f8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38f8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SHF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3840ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3830ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FLO "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b50ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5340ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5b40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4b40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5340ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3808ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"POPC "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"F2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38b8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2F "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38e0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38e0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"I2I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x3898ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"MOV "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x100ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"MOV32I "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38a0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SEL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x5bc0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PRMT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x4bc0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PRMT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0x53c0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PRMT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38e8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"P2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38e8ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"P2R "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x38f0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"R2P "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0xf6e0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"OUT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef8ULL)==0x36d0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LEA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xeef0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xeef0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xeef0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xeef0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xeef0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xeef0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xee60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xee70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xee70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xee70ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe240ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BRA ";
+ if(((inst>>48)&0xfff0ULL)==0xe240ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BRA ";
+ if(((inst>>48)&0xfff0ULL)==0xe250ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BRX "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe250ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BRX "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe210ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"JMP ";
+ if(((inst>>48)&0xfff0ULL)==0xe210ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"JMP ";
+ if(((inst>>48)&0xfff0ULL)==0xe200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"JMX "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"JMX "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe260ULL)return s+"CAL ";
+ if(((inst>>48)&0xfff0ULL)==0xe260ULL)return s+"CAL ";
+ if(((inst>>48)&0xfff0ULL)==0xe270ULL)return s+"PRET ";
+ if(((inst>>48)&0xfff0ULL)==0xe270ULL)return s+"PRET ";
+ if(((inst>>48)&0xfff0ULL)==0xe220ULL)return s+"JCAL ";
+ if(((inst>>48)&0xfff0ULL)==0xe220ULL)return s+"JCAL ";
+ if(((inst>>48)&0xfff0ULL)==0xe290ULL)return s+"SSY ";
+ if(((inst>>48)&0xfff0ULL)==0xe290ULL)return s+"SSY ";
+ if(((inst>>48)&0xfff0ULL)==0xe280ULL)return s+"PLONGJMP ";
+ if(((inst>>48)&0xfff0ULL)==0xe280ULL)return s+"PLONGJMP ";
+ if(((inst>>48)&0xfff0ULL)==0xe2a0ULL)return s+"PBK ";
+ if(((inst>>48)&0xfff0ULL)==0xe2a0ULL)return s+"PBK ";
+ if(((inst>>48)&0xfff0ULL)==0xe2b0ULL)return s+"PCNT ";
+ if(((inst>>48)&0xfff0ULL)==0xe2b0ULL)return s+"PCNT ";
+ if(((inst>>48)&0xfff0ULL)==0xe320ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"RET ";
+ if(((inst>>48)&0xfff0ULL)==0xe310ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LONGJMP ";
+ if(((inst>>48)&0xfff0ULL)==0xe330ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"KIL ";
+ if(((inst>>48)&0xfff0ULL)==0xe340ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"BRK ";
+ if(((inst>>48)&0xfff0ULL)==0xe350ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CONT ";
+ if(((inst>>48)&0xfff0ULL)==0xe300ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"EXIT ";
+ if(((inst>>48)&0xfff0ULL)==0xe230ULL)return s+"PEXIT ";
+ if(((inst>>48)&0xfff0ULL)==0xe370ULL)return s+"SAM ";
+ if(((inst>>48)&0xfff0ULL)==0xe380ULL)return s+"RAM ";
+ if(((inst>>48)&0xfff0ULL)==0xe3a0ULL)return s+"BPT ";
+ if(((inst>>48)&0xfff0ULL)==0xe360ULL)return s+"RTT ";
+ if(((inst>>48)&0xfff0ULL)==0xe390ULL)return s+"IDE ";
+ if(((inst>>48)&0xfff0ULL)==0xe390ULL)return s+"IDE ";
+ if(((inst>>48)&0xfff0ULL)==0xe2e0ULL)return s+"SETCRSPTR "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe2c0ULL)return s+"GETCRSPTR "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe2f0ULL)return s+"SETLMEMBASE "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfff0ULL)==0xe2d0ULL)return s+"GETLMEMBASE "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x36a0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FCMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x36b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x36b0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3670ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3680ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3680ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x38c0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3650ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3650ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3650ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3650ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3660ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3660ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3660ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3660ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISETP "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3640ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x3640ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ICMP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfef0ULL)==0x36c0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"PRMT "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xee40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xee40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xee40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xee40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xee40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xee40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xef60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTL ";
+ if(((inst>>48)&0xffe0ULL)==0xef60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTL ";
+ if(((inst>>48)&0xffe0ULL)==0xef60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTL "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xef60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTL "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xffe0ULL)==0xef60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTL ";
+ if(((inst>>48)&0xffe0ULL)==0xef60ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"CCTL ";
+ if(((inst>>48)&0xffc0ULL)==0x5b00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"XMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xde80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xde80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xdf00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD4S "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xdf80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD4S "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xdec0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xdec0ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xde00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xde00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xde40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xde40ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TXD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xee00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xee00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xee00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xee00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xee00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xee00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xeb80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xea00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xffc0ULL)==0xea80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"SUATOM "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5980ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x4980ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5180ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5900ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5900ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x4900ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x4900ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x4a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5a80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMADSP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x4a80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMADSP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5280ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMADSP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfec0ULL)==0x3600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"XMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfec0ULL)==0x3600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"XMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5100ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"XMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff80ULL)==0x5000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x3280ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FFMA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x1e00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FMUL32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x4800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x4800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0xe000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IPA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xe000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IPA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xe000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IPA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xe000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IPA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x3200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x3200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"DSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x3400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x3480ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMADSP "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x1f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMUL32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5f00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VABSDIFF "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5700ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHL "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0x5600ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSHR "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xff00ULL)==0xdc00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xdd00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xed00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xed00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOM "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xec00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xff00ULL)==0xec00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ATOMS "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HSET2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HSET2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HSET2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HSET2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HADD2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HADD2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HMUL2 ";
+ if(((inst>>48)&0xfe80ULL)==0x80ULL)return s+"HMUL2 ";
+ if(((inst>>48)&0xfe80ULL)==0x7e00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HSETP2 "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x7e00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HSETP2 "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x7e80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HSETP2 "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe80ULL)==0x7e80ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HSETP2 "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x1c00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IADD32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4e00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"XMAD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x3a00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VMNMX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x4000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VSET "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xd800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEXS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xd800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEXS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xd000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEXS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xd000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEXS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xda00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLDS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xda00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLDS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xd200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLDS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0xd200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLDS "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x0ULL)return s+"HMUL2_32I ";
+ if(((inst>>48)&0xfe00ULL)==0x0ULL)return s+"HADD2_32I ";
+ if(((inst>>48)&0xfe00ULL)==0x2800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HFMA2_32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x2800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HFMA2_32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0xc00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FFMA32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0xc00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FFMA32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"FADD32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x1000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"IMAD32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x1400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ISCADD32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP32I "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x400ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfe00ULL)==0x200ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x3c00ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LOP3 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x2000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"VADD "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xfc00ULL)==0x1800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LEA "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xf880ULL)==0x0ULL)return s+"HFMA2 ";
+ if(((inst>>48)&0xf880ULL)==0x0ULL)return s+"HFMA2 ";
+ if(((inst>>48)&0xf880ULL)==0x6080ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"HFMA2 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" ";
+ if(((inst>>48)&0xf800ULL)==0xc000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xf800ULL)==0xc000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TEX "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xf800ULL)==0xc800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xf800ULL)==0xc800ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"TLD4 "+"R"+std::to_string((inst&0xff)>>0x0)+" "+"R"+std::to_string((inst&0xffff)>>0x8)+" "+"R"+std::to_string((inst&0xfffffff)>>0x14)+" ";
+ if(((inst>>48)&0xe000ULL)==0x8000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xe000ULL)==0x8000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"LD "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xe000ULL)==0xa000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ST "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ if(((inst>>48)&0xe000ULL)==0xa000ULL)return s+(((inst&0x7ffff)>>0x10)?"":"!")+"ST "+"R"+std::to_string((inst&0xff)>>0x0)+" ";
+ return "?";}
+}
diff --git a/tools/maxwell-disas/main.cpp b/tools/maxwell-disas/main.cpp
new file mode 100644
index 0000000000..0feee75824
--- /dev/null
+++ b/tools/maxwell-disas/main.cpp
@@ -0,0 +1,221 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/assert.h"
+#include
+#include
+#include
+
+enum class Opcode {
+#define INST(name, cute, encode) name,
+#include "shader_recompiler/frontend/maxwell/maxwell.inc"
+#undef INST
+};
+
+consteval std::pair MaskValueFromEncoding(const char data[20]) noexcept {
+ u64 mask = 0, value = 0, bit = u64(1) << 63;
+ for (int i = 0; i < 20; ++i)
+ switch (data[i]) {
+ case '0':
+ mask |= bit;
+ bit >>= 1;
+ break;
+ case '1':
+ mask |= bit;
+ value |= bit;
+ bit >>= 1;
+ break;
+ case '-':
+ bit >>= 1;
+ break;
+ default:
+ break;
+ }
+ return { mask, value };
+}
+
+Opcode Decode(u64 insn) {
+#define INST(name, cute, encode) \
+ if (auto const p = MaskValueFromEncoding(encode); (insn & p.first) == p.second) \
+ return Opcode::name;
+#include "shader_recompiler/frontend/maxwell/maxwell.inc"
+#undef INST
+ ASSERT_MSG(false, "Invalid insn 0x{:016x}", insn);
+ return Opcode::NOP;
+}
+
+const char* NameOf(Opcode opcode) {
+ constexpr const char* NAME_TABLE[] = {
+#define INST(name, cute, encode) cute,
+#include "shader_recompiler/frontend/maxwell/maxwell.inc"
+#undef INST
+ };
+ ASSERT_MSG(size_t(opcode) < sizeof(NAME_TABLE) / sizeof(NAME_TABLE[0]), "Invalid opcode with raw value {}", int(opcode));
+ return NAME_TABLE[size_t(opcode)];
+}
+
+namespace Shader::Maxwell {
+std::string_view SpecialRegGetName(size_t i) {
+ switch (i) {
+ case 0: return "SR_LANEID";
+ case 1: return "SR_CLOCK";
+ case 2: return "SR_VIRTCFG";
+ case 3: return "SR_VIRTID";
+ case 4: return "SR_PM0";
+ case 5: return "SR_PM1";
+ case 6: return "SR_PM2";
+ case 7: return "SR_PM3";
+ case 8: return "SR_PM4";
+ case 9: return "SR_PM5";
+ case 10: return "SR_PM6";
+ case 11: return "SR_PM7";
+ case 12: return "SR_?";
+ case 13: return "SR_?";
+ case 14: return "SR_?";
+ case 15: return "SR_ORDERING_TICKET";
+ case 16: return "SR_PRIM_TYPE";
+ case 17: return "SR_INVOCATION_ID";
+ case 18: return "SR_Y_DIRECTION";
+ case 19: return "SR_THREAD_KILL";
+ case 20: return "SM_SHADER_TYPE";
+ case 21: return "SR_DIRECTCBEWRITEADDRESSLOW";
+ case 22: return "SR_DIRECTCBEWRITEADDRESSHIGH";
+ case 23: return "SR_DIRECTCBEWRITEENABLED";
+ case 24: return "SR_MACHINE_ID_0";
+ case 25: return "SR_MACHINE_ID_1";
+ case 26: return "SR_MACHINE_ID_2";
+ case 27: return "SR_MACHINE_ID_3";
+ case 28: return "SR_AFFINITY";
+ case 29: return "SR_INVOCATION_INFO";
+ case 30: return "SR_WSCALEFACTOR_XY";
+ case 31: return "SR_WSCALEFACTOR_Z";
+ case 32: return "SR_TID";
+ case 33: return "SR_TID_X";
+ case 34: return "SR_TID_Y";
+ case 35: return "SR_TID_Z";
+ case 36: return "SR_CTA_PARAM";
+ case 37: return "SR_CTAID_X";
+ case 38: return "SR_CTAID_Y";
+ case 39: return "SR_CTAID_Z";
+ case 40: return "SR_NTID";
+ case 41: return "SR_CirQueueIncrMinusOne";
+ case 42: return "SR_NLATC";
+ case 43: return "SR_?";
+ case 44: return "SR_SM_SPA_VERSION";
+ case 45: return "SR_MULTIPASSSHADERINFO";
+ case 46: return "SR_LWINHI";
+ case 47: return "SR_SWINHI";
+ case 48: return "SR_SWINLO";
+ case 49: return "SR_SWINSZ";
+ case 50: return "SR_SMEMSZ";
+ case 51: return "SR_SMEMBANKS";
+ case 52: return "SR_LWINLO";
+ case 53: return "SR_LWINSZ";
+ case 54: return "SR_LMEMLOSZ";
+ case 55: return "SR_LMEMHIOFF";
+ case 56: return "SR_EQMASK";
+ case 57: return "SR_LTMASK";
+ case 58: return "SR_LEMASK";
+ case 59: return "SR_GTMASK";
+ case 60: return "SR_GEMASK";
+ case 61: return "SR_REGALLOC";
+ case 62: return "SR_BARRIERALLOC";
+ case 63: return "SR_?";
+ case 64: return "SR_GLOBALERRORSTATUS";
+ case 65: return "SR_?";
+ case 66: return "SR_WARPERRORSTATUS";
+ case 67: return "SR_WARPERRORSTATUSCLEAR";
+ case 68: return "SR_?";
+ case 69: return "SR_?";
+ case 70: return "SR_?";
+ case 71: return "SR_?";
+ case 72: return "SR_PM_HI0";
+ case 73: return "SR_PM_HI1";
+ case 74: return "SR_PM_HI2";
+ case 75: return "SR_PM_HI3";
+ case 76: return "SR_PM_HI4";
+ case 77: return "SR_PM_HI5";
+ case 78: return "SR_PM_HI6";
+ case 79: return "SR_PM_HI7";
+ case 80: return "SR_CLOCKLO";
+ case 81: return "SR_CLOCKHI";
+ case 82: return "SR_GLOBALTIMERLO";
+ case 83: return "SR_GLOBALTIMERHI";
+ case 84: return "SR_?";
+ case 85: return "SR_?";
+ case 86: return "SR_?";
+ case 87: return "SR_?";
+ case 88: return "SR_?";
+ case 89: return "SR_?";
+ case 90: return "SR_?";
+ case 91: return "SR_?";
+ case 92: return "SR_?";
+ case 93: return "SR_?";
+ case 94: return "SR_?";
+ case 95: return "SR_?";
+ case 96: return "SR_HWTASKID";
+ case 97: return "SR_CIRCULARQUEUEENTRYINDEX";
+ case 98: return "SR_CIRCULARQUEUEENTRYADDRESSLOW";
+ case 99: return "SR_CIRCULARQUEUEENTRYADDRESSHIGH";
+ default: return "SR_??"; }
+}
+}
+#include "generated.cpp"
+
+int DisasReferenceImpl(int argc, char *argv[]) {
+ std::vector code;
+ FILE *fp = fopen(argv[1], "rb");
+ if (fp != NULL) {
+ struct stat st;
+ fstat(fileno(fp), &st);
+ auto const words = (size_t(st.st_size) / sizeof(uint64_t));
+ code.resize(words + 1);
+ fread(code.data(), sizeof(uint64_t), words, fp);
+ fclose(fp);
+ }
+ for (size_t i = 0; i < code.size(); ++i) {
+ printf("%016lx\t%-40s\n", code[i]
+ , Shader::Maxwell::DissasemblyFormat(code[i]).data()
+ );
+ }
+ return EXIT_SUCCESS;
+}
+
+int DisasShaderRecompilerImpl(int argc, char *argv[]) {
+ std::vector code;
+ FILE *fp = fopen(argv[1], "rb");
+ if (fp != NULL) {
+ struct stat st;
+ fstat(fileno(fp), &st);
+ auto const words = (size_t(st.st_size) / sizeof(u64));
+ code.resize(words + 1);
+ fread(code.data(), sizeof(u64), words, fp);
+ fclose(fp);
+ }
+
+ for (size_t i = 0; i < code.size(); ++i) {
+ auto const opcode = Decode(code[i]);
+ printf("%016lx\t%s\n", code[i], NameOf(opcode));
+ }
+ return EXIT_SUCCESS;
+}
+
+int main(int argc, char *argv[]) {
+ if (argc < 2) {
+ printf(
+ "usage: %s [input file] [-n/i]\n"
+ "Specify -n to use a disassembler that is NOT tied to the shader recompiler\n"
+ "aka. a reference disassembler\n"
+ , argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ //DumpProgram
+
+ if (argc >= 3) {
+ if (::strcmp(argv[2], "-n") == 0 || ::strcmp(argv[2], "--new") == 0) {
+ return DisasReferenceImpl(argc, argv);
+ }
+ }
+ return DisasShaderRecompilerImpl(argc, argv);
+}
diff --git a/tools/maxwell-ir/CMakeLists.txt b/tools/maxwell-ir/CMakeLists.txt
new file mode 100644
index 0000000000..45441dcae1
--- /dev/null
+++ b/tools/maxwell-ir/CMakeLists.txt
@@ -0,0 +1,9 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+add_executable(maxwell-ir main.cpp)
+target_link_libraries(maxwell-ir PRIVATE common shader_recompiler Threads::Threads)
+target_include_directories(maxwell-ir PRIVATE ${CMAKE_SOURCE_DIR}/src)
+if(UNIX AND NOT APPLE)
+ install(TARGETS maxwell-ir)
+endif()
+create_target_directory_groups(maxwell-ir)
diff --git a/tools/maxwell-ir/main.cpp b/tools/maxwell-ir/main.cpp
new file mode 100644
index 0000000000..66aeaeac40
--- /dev/null
+++ b/tools/maxwell-ir/main.cpp
@@ -0,0 +1,59 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include
+#include
+#include
+
+#include "shader_recompiler/frontend/ir/basic_block.h"
+#include "shader_recompiler/frontend/maxwell/control_flow.h"
+#include "shader_recompiler/frontend/maxwell/translate_program.h"
+#include "shader_recompiler/host_translate_info.h"
+#include "shader_recompiler/object_pool.h"
+#include "../maxwell-disas/file_environment.h"
+
+int IrShaderRecompilerImpl(int argc, char *argv[]) {
+ size_t cfg_offset = 0;
+
+ Shader::ObjectPool inst_pool;
+ Shader::ObjectPool block_pool;
+ Shader::ObjectPool cfg_blocks;
+ FileEnvironment env;
+
+ FILE *fp = fopen(argv[1], "rb");
+ if (fp != NULL) {
+ struct stat st;
+ fstat(fileno(fp), &st);
+ auto const words = (st.st_size / sizeof(u64));
+ env.code.resize(words + 1);
+ fread(env.code.data(), sizeof(u64), words, fp);
+ fclose(fp);
+ }
+
+ env.read_highest = env.read_lowest + env.code.size() * sizeof(u64);
+
+ Shader::Maxwell::Flow::CFG cfg(env, cfg_blocks, cfg_offset);
+
+ Shader::HostTranslateInfo host_info;
+ host_info.support_float64 = true;
+ host_info.support_float16 = true;
+ host_info.support_int64 = true;
+ host_info.needs_demote_reorder = true;
+ host_info.support_snorm_render_buffer = true;
+ host_info.support_viewport_index_layer = true;
+ host_info.support_geometry_shader_passthrough = true;
+ host_info.support_conditional_barrier = true;
+ host_info.min_ssbo_alignment = 0;
+ auto program = Shader::Maxwell::TranslateProgram(inst_pool, block_pool, env, cfg, host_info);
+ auto const dumped_ir = Shader::IR::DumpProgram(program);
+ std::printf("%s\n", dumped_ir.c_str());
+ return EXIT_SUCCESS;
+}
+
+int main(int argc, char *argv[]) {
+ if (argc < 2) {
+ printf("usage: %s [input file]\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+ return IrShaderRecompilerImpl(argc, argv);
+}
diff --git a/tools/maxwell-spirv/CMakeLists.txt b/tools/maxwell-spirv/CMakeLists.txt
new file mode 100644
index 0000000000..819373712e
--- /dev/null
+++ b/tools/maxwell-spirv/CMakeLists.txt
@@ -0,0 +1,13 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+add_executable(maxwell-spirv
+ main.cpp
+ spirv_recompiler_impl.cpp
+ spirv_reference_impl.cpp
+)
+target_link_libraries(maxwell-spirv PRIVATE common shader_recompiler Threads::Threads)
+target_include_directories(maxwell-spirv PRIVATE ${CMAKE_SOURCE_DIR}/src)
+if(UNIX AND NOT APPLE)
+ install(TARGETS maxwell-spirv)
+endif()
+create_target_directory_groups(maxwell-spirv)
diff --git a/tools/maxwell-spirv/main.cpp b/tools/maxwell-spirv/main.cpp
new file mode 100644
index 0000000000..f9245d436e
--- /dev/null
+++ b/tools/maxwell-spirv/main.cpp
@@ -0,0 +1,26 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include
+#include
+#include
+
+int SpirvReferenceImpl(int argc, char *argv[]);
+int SpirvShaderRecompilerImpl(int argc, char *argv[]);
+
+int main(int argc, char *argv[]) {
+ if (argc < 2) {
+ printf("usage: %s [input file]\n"
+ "Specify -n to use a recompiler that is NOT tied to the shader recompiler\n"
+ "aka. a reference recompiler\n"
+ "RAW SPIRV CODE WILL BE SENT TO STDOUT!\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+ if (argc >= 3) {
+ if (::strcmp(argv[2], "-n") == 0
+ || ::strcmp(argv[2], "--new") == 0) {
+ return SpirvReferenceImpl(argc, argv);
+ }
+ }
+ return SpirvShaderRecompilerImpl(argc, argv);
+}
diff --git a/tools/maxwell-spirv/spirv_recompiler_impl.cpp b/tools/maxwell-spirv/spirv_recompiler_impl.cpp
new file mode 100644
index 0000000000..55830abe39
--- /dev/null
+++ b/tools/maxwell-spirv/spirv_recompiler_impl.cpp
@@ -0,0 +1,67 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include
+#include
+#include "shader_recompiler/backend/spirv/emit_spirv.h"
+#include "shader_recompiler/environment.h"
+#include "shader_recompiler/frontend/maxwell/control_flow.h"
+#include "shader_recompiler/frontend/maxwell/translate_program.h"
+#include "shader_recompiler/host_translate_info.h"
+#include "shader_recompiler/object_pool.h"
+#include "shader_recompiler/profile.h"
+#include "shader_recompiler/runtime_info.h"
+
+#include "../maxwell-disas/file_environment.h"
+
+int SpirvShaderRecompilerImpl(int argc, char *argv[]) {
+ if (argc != 2) {
+ printf("usage: %s [input file] [-n]\n"
+ "RAW SPIRV CODE WILL BE SENT TO STDOUT!\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ size_t cfg_offset = 0;
+
+ Shader::ObjectPool inst_pool;
+ Shader::ObjectPool block_pool;
+ Shader::ObjectPool cfg_blocks;
+ FileEnvironment env;
+
+ FILE *fp = fopen(argv[1], "rb");
+ if (fp != NULL) {
+ struct stat st;
+ fstat(fileno(fp), &st);
+ auto const words = (st.st_size / sizeof(u64));
+ env.code.resize(words + 1);
+ fread(env.code.data(), sizeof(u64), words, fp);
+ fclose(fp);
+ }
+
+ env.read_highest = env.read_lowest + env.code.size() * sizeof(u64);
+
+ Shader::Maxwell::Flow::CFG cfg(env, cfg_blocks, cfg_offset);
+
+ Shader::HostTranslateInfo host_info;
+ host_info.support_float64 = true;
+ host_info.support_float16 = true;
+ host_info.support_int64 = true;
+ host_info.needs_demote_reorder = true;
+ host_info.support_snorm_render_buffer = true;
+ host_info.support_viewport_index_layer = true;
+ host_info.support_geometry_shader_passthrough = true;
+ host_info.support_conditional_barrier = true;
+ host_info.min_ssbo_alignment = 0;
+ auto program = Shader::Maxwell::TranslateProgram(inst_pool, block_pool, env, cfg, host_info);
+
+ // IR::Program TranslateProgram(ObjectPool& inst_pool, ObjectPool& block_pool,
+ // Environment& env, Flow::CFG& cfg, const HostTranslateInfo& host_info)
+ // std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_info,
+ // IR::Program& program, Bindings& bindings, bool optimize)
+ Shader::Profile profile{};
+ Shader::RuntimeInfo runtime_info;
+ auto const spirv_pgm = Shader::Backend::SPIRV::EmitSPIRV(profile, program, true);
+ fwrite(spirv_pgm.data(), sizeof(u64), spirv_pgm.size(), stdout);
+
+ return EXIT_SUCCESS;
+}
diff --git a/tools/maxwell-spirv/spirv_reference_impl.cpp b/tools/maxwell-spirv/spirv_reference_impl.cpp
new file mode 100644
index 0000000000..db4d0994e4
--- /dev/null
+++ b/tools/maxwell-spirv/spirv_reference_impl.cpp
@@ -0,0 +1,15 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/bit_field.h"
+#include "common/common_types.h"
+#include "spirv/unified1/spirv.hpp11"
+#include
+#include
+#include
+#include
+
+int ReferenceImpl(int argc, char *argv[]) {
+ //todo
+ return EXIT_SUCCESS;
+}