Update Bits.cs

This commit is contained in:
LDj3SNuD 2018-08-15 02:24:46 +02:00 committed by GitHub
commit 22e96c6711
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -14,14 +14,13 @@ namespace Ryujinx.Tests.Cpu.Tester.Types
public Bits(bool[] values) => bits = new BitArray(values); public Bits(bool[] values) => bits = new BitArray(values);
public Bits(byte[] bytes) => bits = new BitArray(bytes); public Bits(byte[] bytes) => bits = new BitArray(bytes);
public Bits(Bits bits) => this.bits = new BitArray(bits.bits); public Bits(Bits bits) => this.bits = new BitArray(bits.bits); // Clone: deep copy.
public Bits(int length) => bits = new BitArray(length); public Bits(int length) => bits = new BitArray(length);
public Bits(int length, bool defaultValue) => bits = new BitArray(length, defaultValue); public Bits(int length, bool defaultValue) => bits = new BitArray(length, defaultValue);
private Bits(BitArray bitArray) => bits = new BitArray(bitArray); private Bits(BitArray bitArray) => bits = new BitArray(bitArray);
public Bits(ulong value) => bits = new BitArray(BitConverter.GetBytes(value)); public Bits(ulong value) => bits = new BitArray(BitConverter.GetBytes(value));
public Bits(uint value) => bits = new BitArray(BitConverter.GetBytes(value)); public Bits(uint value) => bits = new BitArray(BitConverter.GetBytes(value));
public Bits(ushort value) => bits = new BitArray(BitConverter.GetBytes(value)); public Bits(BigInteger value) => bits = new BitArray(value.ToByteArray());
public Bits(byte value) => bits = new BitArray(new byte[1] {value});
private BitArray ToBitArray() => new BitArray(bits); private BitArray ToBitArray() => new BitArray(bits);
public ulong ToUInt64() public ulong ToUInt64()
@ -40,21 +39,21 @@ namespace Ryujinx.Tests.Cpu.Tester.Types
return BitConverter.ToUInt32(dst,0); return BitConverter.ToUInt32(dst,0);
} }
public ushort ToUInt16() public BigInteger ToBigInteger()
{ {
byte[] dst = new byte[2]; if (bits.Count != 64 &&
bits.Count != 32 &&
bits.Count != 16 &&
bits.Count != 8)
{
throw new InvalidOperationException();
}
byte[] dst = new byte[bits.Count / 8];
bits.CopyTo(dst, 0); bits.CopyTo(dst, 0);
return BitConverter.ToUInt16(dst,0); return new BigInteger(dst);
}
public byte ToByte()
{
byte[] dst = new byte[1];
bits.CopyTo(dst, 0);
return dst[0];
} }
public bool this[int index] // ASL: "<>". public bool this[int index] // ASL: "<>".
@ -101,7 +100,7 @@ namespace Ryujinx.Tests.Cpu.Tester.Types
} }
public bool IsReadOnly { get => false; } // Mutable. public bool IsReadOnly { get => false; } // Mutable.
public int Count { get => bits.Count; } public int Count { get => bits.Count; } // Not resizable.
public bool IsSynchronized { get => bits.IsSynchronized; } public bool IsSynchronized { get => bits.IsSynchronized; }
public object SyncRoot { get => bits.SyncRoot; } public object SyncRoot { get => bits.SyncRoot; }
public Bits And(Bits value) => new Bits(new BitArray(this.bits).And(value.bits)); // Immutable. public Bits And(Bits value) => new Bits(new BitArray(this.bits).And(value.bits)); // Immutable.
@ -180,17 +179,7 @@ namespace Ryujinx.Tests.Cpu.Tester.Types
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
BigInteger dst; BigInteger dst = left.ToBigInteger() + right;
switch (left.Count)
{
case 8: dst = left.ToByte() + right; break;
case 16: dst = left.ToUInt16() + right; break;
case 32: dst = left.ToUInt32() + right; break;
case 64: dst = left.ToUInt64() + right; break;
default: throw new ArgumentOutOfRangeException();
}
return dst.SubBigInteger(left.Count - 1, 0); return dst.SubBigInteger(left.Count - 1, 0);
} }
@ -203,20 +192,10 @@ namespace Ryujinx.Tests.Cpu.Tester.Types
if (left.Count != right.Count) if (left.Count != right.Count)
{ {
throw new ArgumentException(); throw new InvalidOperationException();
} }
BigInteger dst; BigInteger dst = left.ToBigInteger() + right.ToBigInteger();
switch (left.Count)
{
case 8: dst = left.ToByte() + (BigInteger)right.ToByte(); break;
case 16: dst = left.ToUInt16() + (BigInteger)right.ToUInt16(); break;
case 32: dst = left.ToUInt32() + (BigInteger)right.ToUInt32(); break;
case 64: dst = left.ToUInt64() + (BigInteger)right.ToUInt64(); break;
default: throw new ArgumentOutOfRangeException();
}
return dst.SubBigInteger(left.Count - 1, 0); return dst.SubBigInteger(left.Count - 1, 0);
} }
@ -229,20 +208,10 @@ namespace Ryujinx.Tests.Cpu.Tester.Types
if (left.Count != right.Count) if (left.Count != right.Count)
{ {
throw new ArgumentException(); throw new InvalidOperationException();
} }
BigInteger dst; BigInteger dst = left.ToBigInteger() - right.ToBigInteger();
switch (left.Count)
{
case 8: dst = left.ToByte() - (BigInteger)right.ToByte(); break;
case 16: dst = left.ToUInt16() - (BigInteger)right.ToUInt16(); break;
case 32: dst = left.ToUInt32() - (BigInteger)right.ToUInt32(); break;
case 64: dst = left.ToUInt64() - (BigInteger)right.ToUInt64(); break;
default: throw new ArgumentOutOfRangeException();
}
return dst.SubBigInteger(left.Count - 1, 0); return dst.SubBigInteger(left.Count - 1, 0);
} }