Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
105c9712c1 | ||
|
4d804ed45e | ||
|
4a27d29412 |
13
.github/workflows/build.yml
vendored
13
.github/workflows/build.yml
vendored
@@ -5,13 +5,12 @@ on:
|
|||||||
inputs: {}
|
inputs: {}
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
paths:
|
paths-ignore:
|
||||||
- '!.github/**'
|
- '.github/**'
|
||||||
- '!*.yml'
|
- '*.yml'
|
||||||
- '!*.json'
|
- '*.json'
|
||||||
- '!*.config'
|
- '*.config'
|
||||||
- '!README.md'
|
- 'README.md'
|
||||||
- '.github/workflows/*.yml'
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: pr-checks-${{ github.event.number }}
|
group: pr-checks-${{ github.event.number }}
|
||||||
|
12
.github/workflows/pr_triage.yml
vendored
12
.github/workflows/pr_triage.yml
vendored
@@ -1,13 +1,16 @@
|
|||||||
name: "Pull Request Triage"
|
name: "Pull Request Triage"
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
|
types: [opened, ready_for_review]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
triage:
|
triage:
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Update labels based on changes
|
- name: Update labels based on changes
|
||||||
uses: actions/labeler@v4
|
uses: actions/labeler@v4
|
||||||
@@ -19,40 +22,33 @@ jobs:
|
|||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/audio.yml'
|
configuration-path: '.github/assign/audio.yml'
|
||||||
if: github.event.action == 'opened'
|
|
||||||
|
|
||||||
- name: Auto Assign [CPU]
|
- name: Auto Assign [CPU]
|
||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/cpu.yml'
|
configuration-path: '.github/assign/cpu.yml'
|
||||||
if: github.event.action == 'opened'
|
|
||||||
|
|
||||||
- name: Auto Assign [GPU]
|
- name: Auto Assign [GPU]
|
||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/gpu.yml'
|
configuration-path: '.github/assign/gpu.yml'
|
||||||
if: github.event.action == 'opened'
|
|
||||||
|
|
||||||
- name: Auto Assign [GUI]
|
- name: Auto Assign [GUI]
|
||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/gui.yml'
|
configuration-path: '.github/assign/gui.yml'
|
||||||
if: github.event.action == 'opened'
|
|
||||||
|
|
||||||
- name: Auto Assign [Horizon]
|
- name: Auto Assign [Horizon]
|
||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/horizon.yml'
|
configuration-path: '.github/assign/horizon.yml'
|
||||||
if: github.event.action == 'opened'
|
|
||||||
|
|
||||||
- name: Auto Assign [Infra]
|
- name: Auto Assign [Infra]
|
||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/infra.yml'
|
configuration-path: '.github/assign/infra.yml'
|
||||||
if: github.event.action == 'opened'
|
|
||||||
|
|
||||||
- name: Auto Assign [Global]
|
- name: Auto Assign [Global]
|
||||||
uses: kentaro-m/auto-assign-action@v1.2.5
|
uses: kentaro-m/auto-assign-action@v1.2.5
|
||||||
with:
|
with:
|
||||||
configuration-path: '.github/assign/global.yml'
|
configuration-path: '.github/assign/global.yml'
|
||||||
if: github.event.action == 'opened'
|
|
@@ -165,7 +165,7 @@ namespace ARMeilleure.Instructions
|
|||||||
{
|
{
|
||||||
Operand m = GetVecA32(op.Vm >> 1);
|
Operand m = GetVecA32(op.Vm >> 1);
|
||||||
|
|
||||||
Operand toConvert = InstEmitSimdHelper32Arm64.EmitExtractScalar(context, m, op.Vm, doubleSize);
|
Operand toConvert = InstEmitSimdHelper32Arm64.EmitExtractScalar(context, m, op.Vm, true);
|
||||||
|
|
||||||
Intrinsic inst = (unsigned ? Intrinsic.Arm64FcvtzuGp : Intrinsic.Arm64FcvtzsGp) | Intrinsic.Arm64VDouble;
|
Intrinsic inst = (unsigned ? Intrinsic.Arm64FcvtzuGp : Intrinsic.Arm64FcvtzsGp) | Intrinsic.Arm64VDouble;
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ namespace ARMeilleure.Instructions
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
InstEmitSimdHelper32Arm64.EmitScalarUnaryOpF32(context, unsigned ? Intrinsic.Arm64FcvtzuS : Intrinsic.Arm64FcvtzsS);
|
InstEmitSimdHelper32Arm64.EmitScalarUnaryOpF32(context, unsigned ? Intrinsic.Arm64FcvtzuS : Intrinsic.Arm64FcvtzsS, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!roundWithFpscr && Optimizations.UseSse41)
|
else if (!roundWithFpscr && Optimizations.UseSse41)
|
||||||
@@ -260,28 +260,64 @@ namespace ARMeilleure.Instructions
|
|||||||
|
|
||||||
if (Optimizations.UseAdvSimd)
|
if (Optimizations.UseAdvSimd)
|
||||||
{
|
{
|
||||||
if (unsigned)
|
bool doubleSize = floatSize == OperandType.FP64;
|
||||||
|
|
||||||
|
if (doubleSize)
|
||||||
{
|
{
|
||||||
inst = rm switch {
|
Operand m = GetVecA32(op.Vm >> 1);
|
||||||
0b00 => Intrinsic.Arm64FcvtauS,
|
|
||||||
0b01 => Intrinsic.Arm64FcvtnuS,
|
Operand toConvert = InstEmitSimdHelper32Arm64.EmitExtractScalar(context, m, op.Vm, true);
|
||||||
0b10 => Intrinsic.Arm64FcvtpuS,
|
|
||||||
0b11 => Intrinsic.Arm64FcvtmuS,
|
if (unsigned)
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(rm))
|
{
|
||||||
};
|
inst = rm switch {
|
||||||
|
0b00 => Intrinsic.Arm64FcvtauGp,
|
||||||
|
0b01 => Intrinsic.Arm64FcvtnuGp,
|
||||||
|
0b10 => Intrinsic.Arm64FcvtpuGp,
|
||||||
|
0b11 => Intrinsic.Arm64FcvtmuGp,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(rm))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inst = rm switch {
|
||||||
|
0b00 => Intrinsic.Arm64FcvtasGp,
|
||||||
|
0b01 => Intrinsic.Arm64FcvtnsGp,
|
||||||
|
0b10 => Intrinsic.Arm64FcvtpsGp,
|
||||||
|
0b11 => Intrinsic.Arm64FcvtmsGp,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(rm))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Operand asInteger = context.AddIntrinsicInt(inst | Intrinsic.Arm64VDouble, toConvert);
|
||||||
|
|
||||||
|
InsertScalar(context, op.Vd, asInteger);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
inst = rm switch {
|
if (unsigned)
|
||||||
0b00 => Intrinsic.Arm64FcvtasS,
|
{
|
||||||
0b01 => Intrinsic.Arm64FcvtnsS,
|
inst = rm switch {
|
||||||
0b10 => Intrinsic.Arm64FcvtpsS,
|
0b00 => Intrinsic.Arm64FcvtauS,
|
||||||
0b11 => Intrinsic.Arm64FcvtmsS,
|
0b01 => Intrinsic.Arm64FcvtnuS,
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(rm))
|
0b10 => Intrinsic.Arm64FcvtpuS,
|
||||||
};
|
0b11 => Intrinsic.Arm64FcvtmuS,
|
||||||
}
|
_ => throw new ArgumentOutOfRangeException(nameof(rm))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inst = rm switch {
|
||||||
|
0b00 => Intrinsic.Arm64FcvtasS,
|
||||||
|
0b01 => Intrinsic.Arm64FcvtnsS,
|
||||||
|
0b10 => Intrinsic.Arm64FcvtpsS,
|
||||||
|
0b11 => Intrinsic.Arm64FcvtmsS,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(rm))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
InstEmitSimdHelper32Arm64.EmitScalarUnaryOpF32(context, inst);
|
InstEmitSimdHelper32Arm64.EmitScalarUnaryOpF32(context, inst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (Optimizations.UseSse41)
|
else if (Optimizations.UseSse41)
|
||||||
{
|
{
|
||||||
|
@@ -192,11 +192,10 @@ namespace ARMeilleure.Instructions
|
|||||||
EmitVectorTernaryOpSimd32(context, (d, n, m) => context.AddIntrinsic(inst, d, n, m));
|
EmitVectorTernaryOpSimd32(context, (d, n, m) => context.AddIntrinsic(inst, d, n, m));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EmitScalarUnaryOpSimd32(ArmEmitterContext context, Func1I scalarFunc)
|
public static void EmitScalarUnaryOpSimd32(ArmEmitterContext context, Func1I scalarFunc, bool doubleSize)
|
||||||
{
|
{
|
||||||
OpCode32SimdS op = (OpCode32SimdS)context.CurrOp;
|
OpCode32SimdS op = (OpCode32SimdS)context.CurrOp;
|
||||||
|
|
||||||
bool doubleSize = (op.Size & 1) != 0;
|
|
||||||
int shift = doubleSize ? 1 : 2;
|
int shift = doubleSize ? 1 : 2;
|
||||||
Operand m = GetVecA32(op.Vm >> shift);
|
Operand m = GetVecA32(op.Vm >> shift);
|
||||||
Operand d = GetVecA32(op.Vd >> shift);
|
Operand d = GetVecA32(op.Vd >> shift);
|
||||||
@@ -215,8 +214,13 @@ namespace ARMeilleure.Instructions
|
|||||||
{
|
{
|
||||||
OpCode32SimdS op = (OpCode32SimdS)context.CurrOp;
|
OpCode32SimdS op = (OpCode32SimdS)context.CurrOp;
|
||||||
|
|
||||||
inst |= ((op.Size & 1) != 0 ? Intrinsic.Arm64VDouble : Intrinsic.Arm64VFloat) | Intrinsic.Arm64V128;
|
EmitScalarUnaryOpF32(context, inst, (op.Size & 1) != 0);
|
||||||
EmitScalarUnaryOpSimd32(context, (m) => (inst == 0) ? m : context.AddIntrinsic(inst, m));
|
}
|
||||||
|
|
||||||
|
public static void EmitScalarUnaryOpF32(ArmEmitterContext context, Intrinsic inst, bool doubleSize)
|
||||||
|
{
|
||||||
|
inst |= (doubleSize ? Intrinsic.Arm64VDouble : Intrinsic.Arm64VFloat) | Intrinsic.Arm64V128;
|
||||||
|
EmitScalarUnaryOpSimd32(context, (m) => (inst == 0) ? m : context.AddIntrinsic(inst, m), doubleSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EmitScalarBinaryOpSimd32(ArmEmitterContext context, Func2I scalarFunc)
|
public static void EmitScalarBinaryOpSimd32(ArmEmitterContext context, Func2I scalarFunc)
|
||||||
|
@@ -30,7 +30,7 @@ namespace ARMeilleure.Translation.PTC
|
|||||||
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
||||||
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
||||||
|
|
||||||
private const uint InternalVersion = 5281; //! To be incremented manually for each change to the ARMeilleure project.
|
private const uint InternalVersion = 5292; //! To be incremented manually for each change to the ARMeilleure project.
|
||||||
|
|
||||||
private const string ActualDir = "0";
|
private const string ActualDir = "0";
|
||||||
private const string BackupDir = "1";
|
private const string BackupDir = "1";
|
||||||
|
@@ -154,7 +154,7 @@ namespace Ryujinx.HLE.HOS
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static DirectoryInfo FindTitleDir(DirectoryInfo contentsDir, string titleId)
|
private static DirectoryInfo FindTitleDir(DirectoryInfo contentsDir, string titleId)
|
||||||
=> contentsDir.EnumerateDirectories($"{titleId}*", DirEnumOptions).FirstOrDefault();
|
=> contentsDir.EnumerateDirectories(titleId, DirEnumOptions).FirstOrDefault();
|
||||||
|
|
||||||
private static void AddModsFromDirectory(ModCache mods, DirectoryInfo dir, string titleId)
|
private static void AddModsFromDirectory(ModCache mods, DirectoryInfo dir, string titleId)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user