Files
Ryujinx-greemdev/src/ARMeilleure/Translation/Dominance.cs
Evan Husted b2aad0a0fc v1.2.73 (#231)
Significant changes include LDN functionality from @Vudjun (no more
separate build!) and an XCI trimmer from @amurgshere.

Merged PRs in this release (in the order they were merged): 
#183, #150, #105, #160, #188, #98, #158, #13, #216, #73, #217, #122,
#228, #65, #226, #236, #247, #243, #249, #242, #260, #273, #272, #262,
#259, #241

## Versioning:
There now exists "stable" (release branch) and ["canary" (master
branch)](https://github.com/GreemDev/Ryujinx-Canary/releases) versions.
Instead of everyone using the same emulator, getting updates for every
code change, you now *opt-in* to the more frequent updates by using the
Canary version. Use stable and you'll get about an update a week, but
that update will be MUCH more significant as it's the entire previous
week's changes & PR merges.

## LDN
LDN functionality is now merged! Use
[this](https://github.com/GreemDev/Ryujinx/wiki/Multiplayer%E2%80%90(LDN%E2%80%90Local%E2%80%90Wireless)%E2%80%90Guide)
to get started.
Please note that LDN is only for local wireless; **this is not a
Nintendo Switch Online emulation feature**.

## UI
  - Added an XCI trimmer (#105).
- You can use this feature to trim dead bytes & the embedded firmware
out of your dumped XCIs, to make them smaller.
- If you right-click an XCI and the trim button it is greyed out, that
means your XCI is already as small as possible.
  - Fix for fullscreen not being really fullscreen (#150)
  - Fix window sizing calculations when Show Title Bar is enabled (#247)
- The "Install/Uninstall file types" buttons will be enabled/disabled
depending on which one you contextually need; install will be clickable
when they aren't installed, and vice versa.
- Fix for showing default config screen when swapping players in
controller settings (#122)
- Command-line argument to prevent update checking `--hide-updates`
(#272)
  - # RPC: 
    - Added a LOT of game images to Discord RPC.
    - Play time will now show the time unit hours at a maximum.

## Localization
- Update outdated/incorrect & added missing translations for zh-TW
(#158)
  - Add many missing locale strings to all languages (#160)
  - Update & improve Korean translation (#226)
  - Minor fixes & add missing translations to Spanish translation (#242)

## Headless
- Added `ignore-controller-applet` as an option you can configure via
headless command-line options.

## Graphics Backend
  - ### Vulkan
    - fix divide-by-zero when recovering from missed draw (#235) 
      - fixes crash in 'Baldo: The Guardian Owls' opening cutscene
    
## Horizon
- fix crash that occurs when launching an NSP forwarder generated by
Nro2Nsp (#237)

# Nerd Zone
Slightly more technical information. If you don't understand what's
under here, no worry.

- Updater now uses the release's Tag Name instead of its Name for
version checking.
- Baked in value change logging into ReactiveObject.
- Split ConfigurationState into 3, smaller partial classes of the same
name.
- Specify if the current version is Canary in the version log line

---------

Co-authored-by: James Duarte <GarnetSunset@users.noreply.github.com>
Co-authored-by: Luke Warner <65521430+LukeWarnut@users.noreply.github.com>
Co-authored-by: TheToid <amurgshere@gmail.com>
Co-authored-by: GabCoolGuy <gabrielfreville@proton.me>
Co-authored-by: Kekschen <52585984+Kek5chen@users.noreply.github.com>
Co-authored-by: WilliamWsyHK <WilliamWsyHK@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jacobwasbeast <38381609+Jacobwasbeast@users.noreply.github.com>
Co-authored-by: Piplup <100526773+piplup55@users.noreply.github.com>
Co-authored-by: Vladimir Sokolov <tehnicalmailone@gmail.com>
Co-authored-by: Jonas Henriksson <gr3ger@gmail.com>
Co-authored-by: Vudjun <Vudjun@users.noreply.github.com>
Co-authored-by: extherian <extherian@gmail.com>
Co-authored-by: Hack茶ん <120134269+Hackjjang@users.noreply.github.com>
Co-authored-by: EmulationEnjoyer <144477224+EmulationEnjoyer@users.noreply.github.com>
Co-authored-by: Nicola <61830443+nicola02nb@users.noreply.github.com>
Co-authored-by: jzumaran <juan.zumaran@gitz.cl>
Co-authored-by: Pitchoune <yrigaud@icloud.com>
Co-authored-by: Narugakuruga <31060534+Narugakuruga@users.noreply.github.com>
2024-11-19 08:33:32 -06:00

96 lines
3.0 KiB
C#

using ARMeilleure.IntermediateRepresentation;
using System.Diagnostics;
namespace ARMeilleure.Translation
{
static class Dominance
{
// Those methods are an implementation of the algorithms on "A Simple, Fast Dominance Algorithm".
// https://www.cs.rice.edu/~keith/EMBED/dom.pdf
public static void FindDominators(ControlFlowGraph cfg)
{
BasicBlock Intersect(BasicBlock block1, BasicBlock block2)
{
while (block1 != block2)
{
while (cfg.PostOrderMap[block1.Index] < cfg.PostOrderMap[block2.Index])
{
block1 = block1.ImmediateDominator;
}
while (cfg.PostOrderMap[block2.Index] < cfg.PostOrderMap[block1.Index])
{
block2 = block2.ImmediateDominator;
}
}
return block1;
}
cfg.Entry.ImmediateDominator = cfg.Entry;
Debug.Assert(cfg.Entry == cfg.PostOrderBlocks[^1]);
bool modified;
do
{
modified = false;
for (int blkIndex = cfg.PostOrderBlocks.Length - 2; blkIndex >= 0; blkIndex--)
{
BasicBlock block = cfg.PostOrderBlocks[blkIndex];
BasicBlock newIDom = null;
foreach (BasicBlock predecessor in block.Predecessors)
{
if (predecessor.ImmediateDominator != null)
{
if (newIDom != null)
{
newIDom = Intersect(predecessor, newIDom);
}
else
{
newIDom = predecessor;
}
}
}
if (block.ImmediateDominator != newIDom)
{
block.ImmediateDominator = newIDom;
modified = true;
}
}
}
while (modified);
}
public static void FindDominanceFrontiers(ControlFlowGraph cfg)
{
for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext)
{
if (block.Predecessors.Count < 2)
{
continue;
}
for (int pBlkIndex = 0; pBlkIndex < block.Predecessors.Count; pBlkIndex++)
{
BasicBlock current = block.Predecessors[pBlkIndex];
while (current != block.ImmediateDominator)
{
current.DominanceFrontiers.Add(block);
current = current.ImmediateDominator;
}
}
}
}
}
}