mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-01-07 15:08:22 +01:00
Merge remote-tracking branch 'tilkax/master'
This commit is contained in:
commit
b4aa01ccf4
14 changed files with 497 additions and 116 deletions
|
|
@ -98,6 +98,19 @@ void IREmitter::SetVFlag(const IR::Value& value) {
|
|||
Inst(IR::Opcode::SetVFlag, {value});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::Pack2x32To1x64(const IR::Value& lo, const IR::Value& hi)
|
||||
{
|
||||
return Inst(IR::Opcode::Pack2x32To1x64, {lo, hi});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::LeastSignificantWord(const IR::Value& value) {
|
||||
return Inst(IR::Opcode::LeastSignificantWord, {value});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::MostSignificantWord(const IR::Value& value) {
|
||||
return Inst(IR::Opcode::MostSignificantWord, {value});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::LeastSignificantHalf(const IR::Value& value) {
|
||||
return Inst(IR::Opcode::LeastSignificantHalf, {value});
|
||||
}
|
||||
|
|
@ -114,6 +127,10 @@ IR::Value IREmitter::IsZero(const IR::Value& value) {
|
|||
return Inst(IR::Opcode::IsZero, {value});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::IsZero64(const IR::Value& value) {
|
||||
return Inst(IR::Opcode::IsZero64, {value});
|
||||
}
|
||||
|
||||
IREmitter::ResultAndCarry IREmitter::LogicalShiftLeft(const IR::Value& value_in, const IR::Value& shift_amount, const IR::Value& carry_in) {
|
||||
auto result = Inst(IR::Opcode::LogicalShiftLeft, {value_in, shift_amount, carry_in});
|
||||
auto carry_out = Inst(IR::Opcode::GetCarryFromOp, {result});
|
||||
|
|
@ -155,6 +172,10 @@ IR::Value IREmitter::Add(const IR::Value& a, const IR::Value& b) {
|
|||
return Inst(IR::Opcode::AddWithCarry, {a, b, Imm1(0)});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::Add64(const IR::Value& a, const IR::Value& b) {
|
||||
return Inst(IR::Opcode::Add64, {a, b});
|
||||
}
|
||||
|
||||
IREmitter::ResultAndCarryAndOverflow IREmitter::SubWithCarry(const IR::Value& a, const IR::Value& b, const IR::Value& carry_in) {
|
||||
// This is equivalent to AddWithCarry(a, Not(b), carry_in).
|
||||
auto result = Inst(IR::Opcode::SubWithCarry, {a, b, carry_in});
|
||||
|
|
@ -167,6 +188,28 @@ IR::Value IREmitter::Sub(const IR::Value& a, const IR::Value& b) {
|
|||
return Inst(IR::Opcode::SubWithCarry, {a, b, Imm1(1)});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::Mul(const IR::Value& a, const IR::Value& b) {
|
||||
return Inst(IR::Opcode::Mul, {a, b});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::Mul64(const IR::Value& a, const IR::Value& b) {
|
||||
return Inst(IR::Opcode::Mul64, {a, b});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::SignedMulHi(const IR::Value& a, const IR::Value& b) {
|
||||
auto a64 = ZeroExtendWordToLong(a);
|
||||
auto b64 = ZeroExtendWordToLong(b);
|
||||
auto product64 = Mul64(a64, b64);
|
||||
return LogicalShiftRight(product64, Imm8(32), Imm8(0)).result;
|
||||
}
|
||||
|
||||
IR::Value IREmitter::UnsignedMulHi(const IR::Value& a, const IR::Value& b) {
|
||||
auto a64 = SignExtendWordToLong(a);
|
||||
auto b64 = SignExtendWordToLong(b);
|
||||
auto product64 = Mul64(a64, b64);
|
||||
return LogicalShiftRight(product64, Imm8(32), Imm8(0)).result;
|
||||
}
|
||||
|
||||
IR::Value IREmitter::And(const IR::Value& a, const IR::Value& b) {
|
||||
return Inst(IR::Opcode::And, {a, b});
|
||||
}
|
||||
|
|
@ -183,6 +226,10 @@ IR::Value IREmitter::Not(const IR::Value& a) {
|
|||
return Inst(IR::Opcode::Not, {a});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::SignExtendWordToLong(const IR::Value& a) {
|
||||
return Inst(IR::Opcode::SignExtendWordToLong, {a});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::SignExtendHalfToWord(const IR::Value& a) {
|
||||
return Inst(IR::Opcode::SignExtendHalfToWord, {a});
|
||||
}
|
||||
|
|
@ -191,6 +238,10 @@ IR::Value IREmitter::SignExtendByteToWord(const IR::Value& a) {
|
|||
return Inst(IR::Opcode::SignExtendByteToWord, {a});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::ZeroExtendWordToLong(const IR::Value& a) {
|
||||
return Inst(IR::Opcode::ZeroExtendWordToLong, {a});
|
||||
}
|
||||
|
||||
IR::Value IREmitter::ZeroExtendHalfToWord(const IR::Value& a) {
|
||||
return Inst(IR::Opcode::ZeroExtendHalfToWord, {a});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,10 +54,14 @@ public:
|
|||
void SetCFlag(const IR::Value& value);
|
||||
void SetVFlag(const IR::Value& value);
|
||||
|
||||
IR::Value Pack2x32To1x64(const IR::Value& lo, const IR::Value& hi);
|
||||
IR::Value LeastSignificantWord(const IR::Value& value);
|
||||
IR::Value MostSignificantWord(const IR::Value& value);
|
||||
IR::Value LeastSignificantHalf(const IR::Value& value);
|
||||
IR::Value LeastSignificantByte(const IR::Value& value);
|
||||
IR::Value MostSignificantBit(const IR::Value& value);
|
||||
IR::Value IsZero(const IR::Value& value);
|
||||
IR::Value IsZero64(const IR::Value& value);
|
||||
|
||||
ResultAndCarry LogicalShiftLeft(const IR::Value& value_in, const IR::Value& shift_amount, const IR::Value& carry_in);
|
||||
ResultAndCarry LogicalShiftRight(const IR::Value& value_in, const IR::Value& shift_amount, const IR::Value& carry_in);
|
||||
|
|
@ -66,14 +70,21 @@ public:
|
|||
ResultAndCarry RotateRightExtended(const IR::Value& value_in, const IR::Value& carry_in);
|
||||
ResultAndCarryAndOverflow AddWithCarry(const IR::Value& a, const IR::Value& b, const IR::Value& carry_in);
|
||||
IR::Value Add(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value Add64(const IR::Value& a, const IR::Value& b);
|
||||
ResultAndCarryAndOverflow SubWithCarry(const IR::Value& a, const IR::Value& b, const IR::Value& carry_in);
|
||||
IR::Value Sub(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value Mul(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value Mul64(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value SignedMulHi(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value UnsignedMulHi(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value And(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value Eor(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value Or(const IR::Value& a, const IR::Value& b);
|
||||
IR::Value Not(const IR::Value& a);
|
||||
IR::Value SignExtendWordToLong(const IR::Value& a);
|
||||
IR::Value SignExtendHalfToWord(const IR::Value& a);
|
||||
IR::Value SignExtendByteToWord(const IR::Value& a);
|
||||
IR::Value ZeroExtendWordToLong(const IR::Value& a);
|
||||
IR::Value ZeroExtendHalfToWord(const IR::Value& a);
|
||||
IR::Value ZeroExtendByteToWord(const IR::Value& a);
|
||||
IR::Value ByteReverseWord(const IR::Value& a);
|
||||
|
|
|
|||
|
|
@ -22,10 +22,14 @@ OPCODE(GetCarryFromOp, T::U1, T::U32
|
|||
OPCODE(GetOverflowFromOp, T::U1, T::U32 )
|
||||
|
||||
// Calculations
|
||||
OPCODE(Pack2x32To1x64, T::U64, T::U32, T::U32 )
|
||||
OPCODE(LeastSignificantWord, T::U32, T::U64 )
|
||||
OPCODE(MostSignificantWord, T::U32, T::U64 )
|
||||
OPCODE(LeastSignificantHalf, T::U16, T::U32 )
|
||||
OPCODE(LeastSignificantByte, T::U8, T::U32 )
|
||||
OPCODE(MostSignificantBit, T::U1, T::U32 )
|
||||
OPCODE(IsZero, T::U1, T::U32 )
|
||||
OPCODE(IsZero64, T::U1, T::U64 )
|
||||
OPCODE(LogicalShiftLeft, T::U32, T::U32, T::U8, T::U1 )
|
||||
OPCODE(LogicalShiftRight, T::U32, T::U32, T::U8, T::U1 )
|
||||
OPCODE(ArithmeticShiftRight, T::U32, T::U32, T::U8, T::U1 )
|
||||
|
|
@ -33,12 +37,17 @@ OPCODE(RotateRight, T::U32, T::U32, T::U8,
|
|||
OPCODE(RotateRightExtended, T::U32, T::U32, T::U1 )
|
||||
OPCODE(AddWithCarry, T::U32, T::U32, T::U32, T::U1 )
|
||||
OPCODE(SubWithCarry, T::U32, T::U32, T::U32, T::U1 )
|
||||
OPCODE(Add64, T::U64, T::U64, T::U64 )
|
||||
OPCODE(Mul, T::U32, T::U32, T::U32 )
|
||||
OPCODE(Mul64, T::U64, T::U64, T::U64 )
|
||||
OPCODE(And, T::U32, T::U32, T::U32 )
|
||||
OPCODE(Eor, T::U32, T::U32, T::U32 )
|
||||
OPCODE(Or, T::U32, T::U32, T::U32 )
|
||||
OPCODE(Not, T::U32, T::U32 )
|
||||
OPCODE(SignExtendWordToLong, T::U64, T::U32 )
|
||||
OPCODE(SignExtendHalfToWord, T::U32, T::U16 )
|
||||
OPCODE(SignExtendByteToWord, T::U32, T::U8 )
|
||||
OPCODE(ZeroExtendWordToLong, T::U64, T::U32 )
|
||||
OPCODE(ZeroExtendHalfToWord, T::U32, T::U16 )
|
||||
OPCODE(ZeroExtendByteToWord, T::U32, T::U8 )
|
||||
OPCODE(ByteReverseWord, T::U32, T::U32 )
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue