mirror of
https://github.com/citra-emu/citra.git
synced 2024-11-25 07:40:13 +00:00
ARM/Decoder: Fill out more instructions
This commit is contained in:
parent
8ee5ba3e8f
commit
6eddd09f30
@ -195,18 +195,18 @@ static const std::array<Instruction, 221> arm_instruction_table = {{
|
|||||||
{ "UDF", MakeMatcher<0>("111001111111------------1111----", &Visitor::UDF) }, // all
|
{ "UDF", MakeMatcher<0>("111001111111------------1111----", &Visitor::UDF) }, // all
|
||||||
|
|
||||||
// Extension instructions
|
// Extension instructions
|
||||||
{ "SXTB", MakeMatcher<0>("----011010101111------000111----", &Visitor::SXTB) }, // ARMv6
|
{ "SXTB", MakeMatcher<4>("cccc011010101111ddddrr000111mmmm", &Visitor::SXTB) }, // ARMv6
|
||||||
{ "SXTB16", MakeMatcher<0>("----011010001111------000111----", &Visitor::SXTB16) }, // ARMv6
|
{ "SXTB16", MakeMatcher<4>("cccc011010001111ddddrr000111mmmm", &Visitor::SXTB16) }, // ARMv6
|
||||||
{ "SXTH", MakeMatcher<0>("----011010111111------000111----", &Visitor::SXTH) }, // ARMv6
|
{ "SXTH", MakeMatcher<4>("cccc011010111111ddddrr000111mmmm", &Visitor::SXTH) }, // ARMv6
|
||||||
{ "SXTAB", MakeMatcher<0>("----01101010----------000111----", &Visitor::SXTAB) }, // ARMv6
|
{ "SXTAB", MakeMatcher<5>("cccc01101010nnnnddddrr000111mmmm", &Visitor::SXTAB) }, // ARMv6
|
||||||
{ "SXTAB16", MakeMatcher<0>("----01101000----------000111----", &Visitor::SXTAB16) }, // ARMv6
|
{ "SXTAB16", MakeMatcher<5>("cccc01101000nnnnddddrr000111mmmm", &Visitor::SXTAB16) }, // ARMv6
|
||||||
{ "SXTAH", MakeMatcher<0>("----01101011----------000111----", &Visitor::SXTAH) }, // ARMv6
|
{ "SXTAH", MakeMatcher<5>("cccc01101011nnnnddddrr000111mmmm", &Visitor::SXTAH) }, // ARMv6
|
||||||
{ "UXTB", MakeMatcher<0>("----011011101111------000111----", &Visitor::UXTB) }, // ARMv6
|
{ "UXTB", MakeMatcher<4>("cccc011011101111ddddrr000111mmmm", &Visitor::UXTB) }, // ARMv6
|
||||||
{ "UXTB16", MakeMatcher<0>("----011011001111------000111----", &Visitor::UXTB16) }, // ARMv6
|
{ "UXTB16", MakeMatcher<4>("cccc011011001111ddddrr000111mmmm", &Visitor::UXTB16) }, // ARMv6
|
||||||
{ "UXTH", MakeMatcher<0>("----011011111111------000111----", &Visitor::UXTH) }, // ARMv6
|
{ "UXTH", MakeMatcher<4>("cccc011011111111ddddrr000111mmmm", &Visitor::UXTH) }, // ARMv6
|
||||||
{ "UXTAB", MakeMatcher<0>("----01101110----------000111----", &Visitor::UXTAB) }, // ARMv6
|
{ "UXTAB", MakeMatcher<5>("cccc01101110nnnnddddrr000111mmmm", &Visitor::UXTAB) }, // ARMv6
|
||||||
{ "UXTAB16", MakeMatcher<0>("----01101100----------000111----", &Visitor::UXTAB16) }, // ARMv6
|
{ "UXTAB16", MakeMatcher<5>("cccc01101100nnnnddddrr000111mmmm", &Visitor::UXTAB16) }, // ARMv6
|
||||||
{ "UXTAH", MakeMatcher<0>("----01101111----------000111----", &Visitor::UXTAH) }, // ARMv6
|
{ "UXTAH", MakeMatcher<5>("cccc01101111nnnnddddrr000111mmmm", &Visitor::UXTAH) }, // ARMv6
|
||||||
|
|
||||||
// Hint instructions
|
// Hint instructions
|
||||||
{ "PLD", MakeMatcher<0>("111101---101----1111------------", &Visitor::PLD) }, // ARMv5E
|
{ "PLD", MakeMatcher<0>("111101---101----1111------------", &Visitor::PLD) }, // ARMv5E
|
||||||
@ -274,109 +274,109 @@ static const std::array<Instruction, 221> arm_instruction_table = {{
|
|||||||
{ "STM (usr reg)", MakeMatcher<0>("----100--100--------------------", &Visitor::STM_usr) }, // all
|
{ "STM (usr reg)", MakeMatcher<0>("----100--100--------------------", &Visitor::STM_usr) }, // all
|
||||||
|
|
||||||
// Miscellaneous instructions
|
// Miscellaneous instructions
|
||||||
{ "CLZ", MakeMatcher<0>("----000101101111----11110001----", &Visitor::CLZ) }, // ARMv5
|
{ "CLZ", MakeMatcher<3>("cccc000101101111dddd11110001mmmm", &Visitor::CLZ) }, // ARMv5
|
||||||
{ "NOP", MakeMatcher<0>("----001100100000111100000000----", &Visitor::NOP) }, // ARMv6K
|
{ "NOP", MakeMatcher<0>("----001100100000111100000000----", &Visitor::NOP) }, // ARMv6K
|
||||||
{ "SEL", MakeMatcher<0>("----01101000--------11111011----", &Visitor::SEL) }, // ARMv6
|
{ "SEL", MakeMatcher<4>("cccc01101000nnnndddd11111011mmmm", &Visitor::SEL) }, // ARMv6
|
||||||
|
|
||||||
// Unsigned Sum of Absolute Differences instructions
|
// Unsigned Sum of Absolute Differences instructions
|
||||||
{ "USAD8", MakeMatcher<0>("----01111000----1111----0001----", &Visitor::USAD8) }, // ARMv6
|
{ "USAD8", MakeMatcher<4>("cccc01111000dddd1111mmmm0001nnnn", &Visitor::USAD8) }, // ARMv6
|
||||||
{ "USADA8", MakeMatcher<0>("----01111000------------0001----", &Visitor::USADA8) }, // ARMv6
|
{ "USADA8", MakeMatcher<5>("cccc01111000ddddaaaammmm0001nnnn", &Visitor::USADA8) }, // ARMv6
|
||||||
|
|
||||||
// Packing instructions
|
// Packing instructions
|
||||||
{ "PKHBT", MakeMatcher<5>("cccc01101000nnnnddddvvvvv001mmmm", &Visitor::PKHBT) }, // ARMv6K
|
{ "PKHBT", MakeMatcher<5>("cccc01101000nnnnddddvvvvv001mmmm", &Visitor::PKHBT) }, // ARMv6K
|
||||||
{ "PKHTB", MakeMatcher<5>("cccc01101000nnnnddddvvvvv101mmmm", &Visitor::PKHTB) }, // ARMv6K
|
{ "PKHTB", MakeMatcher<5>("cccc01101000nnnnddddvvvvv101mmmm", &Visitor::PKHTB) }, // ARMv6K
|
||||||
|
|
||||||
// Reversal instructions
|
// Reversal instructions
|
||||||
{ "REV", MakeMatcher<0>("----011010111111----11110011----", &Visitor::REV) }, // ARMv6
|
{ "REV", MakeMatcher<3>("cccc011010111111dddd11110011mmmm", &Visitor::REV) }, // ARMv6
|
||||||
{ "REV16", MakeMatcher<0>("----011010111111----11111011----", &Visitor::REV16) }, // ARMv6
|
{ "REV16", MakeMatcher<3>("cccc011010111111dddd11111011mmmm", &Visitor::REV16) }, // ARMv6
|
||||||
{ "REVSH", MakeMatcher<0>("----011011111111----11111011----", &Visitor::REVSH) }, // ARMv6
|
{ "REVSH", MakeMatcher<3>("cccc011011111111dddd11111011mmmm", &Visitor::REVSH) }, // ARMv6
|
||||||
|
|
||||||
// Saturation instructions
|
// Saturation instructions
|
||||||
{ "SSAT", MakeMatcher<0>("----0110101---------------01----", &Visitor::SSAT) }, // ARMv6
|
{ "SSAT", MakeMatcher<6>("cccc0110101vvvvvddddvvvvvr01nnnn", &Visitor::SSAT) }, // ARMv6
|
||||||
{ "SSAT16", MakeMatcher<0>("----01101010--------11110011----", &Visitor::SSAT16) }, // ARMv6
|
{ "SSAT16", MakeMatcher<4>("cccc01101010vvvvdddd11110011nnnn", &Visitor::SSAT16) }, // ARMv6
|
||||||
{ "USAT", MakeMatcher<0>("----0110111---------------01----", &Visitor::USAT) }, // ARMv6
|
{ "USAT", MakeMatcher<6>("cccc0110111vvvvvddddvvvvvr01nnnn", &Visitor::USAT) }, // ARMv6
|
||||||
{ "USAT16", MakeMatcher<0>("----01101110--------11110011----", &Visitor::USAT16) }, // ARMv6
|
{ "USAT16", MakeMatcher<4>("cccc01101110vvvvdddd11110011nnnn", &Visitor::USAT16) }, // ARMv6
|
||||||
|
|
||||||
// Multiply (Normal) instructions
|
// Multiply (Normal) instructions
|
||||||
{ "MLA", MakeMatcher<0>("----0000001-------------1001----", &Visitor::MLA) }, // ARMv2
|
{ "MLA", MakeMatcher<6>("cccc0000001Sddddaaaammmm1001nnnn", &Visitor::MLA) }, // ARMv2
|
||||||
{ "MUL", MakeMatcher<0>("----0000000-----0000----1001----", &Visitor::MUL) }, // ARMv2
|
{ "MUL", MakeMatcher<5>("cccc0000000Sdddd0000mmmm1001nnnn", &Visitor::MUL) }, // ARMv2
|
||||||
|
|
||||||
// Multiply (Long) instructions
|
// Multiply (Long) instructions
|
||||||
{ "SMLAL", MakeMatcher<0>("----0000111-------------1001----", &Visitor::SMLAL) }, // ARMv3M
|
{ "SMLAL", MakeMatcher<6>("cccc0000111Sddddaaaammmm1001nnnn", &Visitor::SMLAL) }, // ARMv3M
|
||||||
{ "SMULL", MakeMatcher<0>("----0000110-------------1001----", &Visitor::SMULL) }, // ARMv3M
|
{ "SMULL", MakeMatcher<6>("cccc0000110Sddddaaaammmm1001nnnn", &Visitor::SMULL) }, // ARMv3M
|
||||||
{ "UMAAL", MakeMatcher<0>("----00000100------------1001----", &Visitor::UMAAL) }, // ARMv6
|
{ "UMAAL", MakeMatcher<5>("cccc00000100ddddaaaammmm1001nnnn", &Visitor::UMAAL) }, // ARMv6
|
||||||
{ "UMLAL", MakeMatcher<0>("----0000101-------------1001----", &Visitor::UMLAL) }, // ARMv3M
|
{ "UMLAL", MakeMatcher<6>("cccc0000101Sddddaaaammmm1001nnnn", &Visitor::UMLAL) }, // ARMv3M
|
||||||
{ "UMULL", MakeMatcher<0>("----0000100-------------1001----", &Visitor::UMULL) }, // ARMv3M
|
{ "UMULL", MakeMatcher<6>("cccc0000100Sddddaaaammmm1001nnnn", &Visitor::UMULL) }, // ARMv3M
|
||||||
|
|
||||||
// Multiply (Halfword) instructions
|
// Multiply (Halfword) instructions
|
||||||
{ "SMLALXY", MakeMatcher<0>("----00010100------------1--0----", &Visitor::SMLALxy) }, // ARMv5xP
|
{ "SMLALXY", MakeMatcher<7>("cccc00010100ddddaaaammmm1xy0nnnn", &Visitor::SMLALxy) }, // ARMv5xP
|
||||||
{ "SMLAXY", MakeMatcher<0>("----00010000------------1--0----", &Visitor::SMLAxy) }, // ARMv5xP
|
{ "SMLAXY", MakeMatcher<7>("cccc00010000ddddaaaammmm1xy0nnnn", &Visitor::SMLAxy) }, // ARMv5xP
|
||||||
{ "SMULXY", MakeMatcher<0>("----00010110----0000----1--0----", &Visitor::SMULxy) }, // ARMv5xP
|
{ "SMULXY", MakeMatcher<6>("cccc00010110dddd0000mmmm1xy0nnnn", &Visitor::SMULxy) }, // ARMv5xP
|
||||||
|
|
||||||
// Multiply (Word by Halfword) instructions
|
// Multiply (Word by Halfword) instructions
|
||||||
{ "SMLAWY", MakeMatcher<0>("----00010010------------1-00----", &Visitor::SMLAWy) }, // ARMv5xP
|
{ "SMLAWY", MakeMatcher<6>("cccc00010010ddddaaaammmm1y00nnnn", &Visitor::SMLAWy) }, // ARMv5xP
|
||||||
{ "SMULWY", MakeMatcher<0>("----00010010----0000----1-10----", &Visitor::SMULWy) }, // ARMv5xP
|
{ "SMULWY", MakeMatcher<5>("cccc00010010dddd0000mmmm1y10nnnn", &Visitor::SMULWy) }, // ARMv5xP
|
||||||
|
|
||||||
// Multiply (Most Significant Word) instructions
|
// Multiply (Most Significant Word) instructions
|
||||||
{ "SMMUL", MakeMatcher<0>("----01110101----1111----00-1----", &Visitor::SMMUL) }, // ARMv6
|
{ "SMMUL", MakeMatcher<5>("cccc01110101dddd1111mmmm00R1nnnn", &Visitor::SMMUL) }, // ARMv6
|
||||||
{ "SMMLA", MakeMatcher<0>("----01110101------------00-1----", &Visitor::SMMLA) }, // ARMv6
|
{ "SMMLA", MakeMatcher<6>("cccc01110101ddddaaaammmm00R1nnnn", &Visitor::SMMLA) }, // ARMv6
|
||||||
{ "SMMLS", MakeMatcher<0>("----01110101------------11-1----", &Visitor::SMMLS) }, // ARMv6
|
{ "SMMLS", MakeMatcher<6>("cccc01110101ddddaaaammmm11R1nnnn", &Visitor::SMMLS) }, // ARMv6
|
||||||
|
|
||||||
// Multiply (Dual) instructions
|
// Multiply (Dual) instructions
|
||||||
{ "SMLAD", MakeMatcher<0>("----01110000------------00-1----", &Visitor::SMLAD) }, // ARMv6
|
{ "SMLAD", MakeMatcher<6>("cccc01110000ddddaaaammmm00M1nnnn", &Visitor::SMLAD) }, // ARMv6
|
||||||
{ "SMLALD", MakeMatcher<0>("----01110100------------00-1----", &Visitor::SMLALD) }, // ARMv6
|
{ "SMLALD", MakeMatcher<6>("cccc01110100ddddaaaammmm00M1nnnn", &Visitor::SMLALD) }, // ARMv6
|
||||||
{ "SMLSD", MakeMatcher<0>("----01110000------------01-1----", &Visitor::SMLSD) }, // ARMv6
|
{ "SMLSD", MakeMatcher<6>("cccc01110000ddddaaaammmm01M1nnnn", &Visitor::SMLSD) }, // ARMv6
|
||||||
{ "SMLSLD", MakeMatcher<0>("----01110100------------01-1----", &Visitor::SMLSLD) }, // ARMv6
|
{ "SMLSLD", MakeMatcher<6>("cccc01110100ddddaaaammmm01M1nnnn", &Visitor::SMLSLD) }, // ARMv6
|
||||||
{ "SMUAD", MakeMatcher<0>("----01110000----1111----00-1----", &Visitor::SMUAD) }, // ARMv6
|
{ "SMUAD", MakeMatcher<5>("cccc01110000dddd1111mmmm00M1nnnn", &Visitor::SMUAD) }, // ARMv6
|
||||||
{ "SMUSD", MakeMatcher<0>("----01110000----1111----01-1----", &Visitor::SMUSD) }, // ARMv6
|
{ "SMUSD", MakeMatcher<5>("cccc01110000dddd1111mmmm01M1nnnn", &Visitor::SMUSD) }, // ARMv6
|
||||||
|
|
||||||
// Parallel Add/Subtract (Modulo) instructions
|
// Parallel Add/Subtract (Modulo) instructions
|
||||||
{ "SADD8", MakeMatcher<0>("----01100001--------11111001----", &Visitor::SADD8) }, // ARMv6
|
{ "SADD8", MakeMatcher<4>("cccc01100001nnnndddd11111001mmmm", &Visitor::SADD8) }, // ARMv6
|
||||||
{ "SADD16", MakeMatcher<0>("----01100001--------11110001----", &Visitor::SADD16) }, // ARMv6
|
{ "SADD16", MakeMatcher<4>("cccc01100001nnnndddd11110001mmmm", &Visitor::SADD16) }, // ARMv6
|
||||||
{ "SASX", MakeMatcher<0>("----01100001--------11110011----", &Visitor::SASX) }, // ARMv6
|
{ "SASX", MakeMatcher<4>("cccc01100001nnnndddd11110011mmmm", &Visitor::SASX) }, // ARMv6
|
||||||
{ "SSAX", MakeMatcher<0>("----01100001--------11110101----", &Visitor::SSAX) }, // ARMv6
|
{ "SSAX", MakeMatcher<4>("cccc01100001nnnndddd11110101mmmm", &Visitor::SSAX) }, // ARMv6
|
||||||
{ "SSUB8", MakeMatcher<0>("----01100001--------11111111----", &Visitor::SSUB8) }, // ARMv6
|
{ "SSUB8", MakeMatcher<4>("cccc01100001nnnndddd11111111mmmm", &Visitor::SSUB8) }, // ARMv6
|
||||||
{ "SSUB16", MakeMatcher<0>("----01100001--------11110111----", &Visitor::SSUB16) }, // ARMv6
|
{ "SSUB16", MakeMatcher<4>("cccc01100001nnnndddd11110111mmmm", &Visitor::SSUB16) }, // ARMv6
|
||||||
{ "UADD8", MakeMatcher<0>("----01100101--------11111001----", &Visitor::UADD8) }, // ARMv6
|
{ "UADD8", MakeMatcher<4>("cccc01100101nnnndddd11111001mmmm", &Visitor::UADD8) }, // ARMv6
|
||||||
{ "UADD16", MakeMatcher<0>("----01100101--------11110001----", &Visitor::UADD16) }, // ARMv6
|
{ "UADD16", MakeMatcher<4>("cccc01100101nnnndddd11110001mmmm", &Visitor::UADD16) }, // ARMv6
|
||||||
{ "UASX", MakeMatcher<0>("----01100101--------11110011----", &Visitor::UASX) }, // ARMv6
|
{ "UASX", MakeMatcher<4>("cccc01100101nnnndddd11110011mmmm", &Visitor::UASX) }, // ARMv6
|
||||||
{ "USAX", MakeMatcher<0>("----01100101--------11110101----", &Visitor::USAX) }, // ARMv6
|
{ "USAX", MakeMatcher<4>("cccc01100101nnnndddd11110101mmmm", &Visitor::USAX) }, // ARMv6
|
||||||
{ "USUB8", MakeMatcher<0>("----01100101--------11111111----", &Visitor::USUB8) }, // ARMv6
|
{ "USUB8", MakeMatcher<4>("cccc01100101nnnndddd11111111mmmm", &Visitor::USUB8) }, // ARMv6
|
||||||
{ "USUB16", MakeMatcher<0>("----01100101--------11110111----", &Visitor::USUB16) }, // ARMv6
|
{ "USUB16", MakeMatcher<4>("cccc01100101nnnndddd11110111mmmm", &Visitor::USUB16) }, // ARMv6
|
||||||
|
|
||||||
// Parallel Add/Subtract (Saturating) instructions
|
// Parallel Add/Subtract (Saturating) instructions
|
||||||
{ "QADD8", MakeMatcher<0>("----01100010--------11111001----", &Visitor::QADD8) }, // ARMv6
|
{ "QADD8", MakeMatcher<4>("cccc01100010nnnndddd11111001mmmm", &Visitor::QADD8) }, // ARMv6
|
||||||
{ "QADD16", MakeMatcher<0>("----01100010--------11110001----", &Visitor::QADD16) }, // ARMv6
|
{ "QADD16", MakeMatcher<4>("cccc01100010nnnndddd11110001mmmm", &Visitor::QADD16) }, // ARMv6
|
||||||
{ "QASX", MakeMatcher<0>("----01100010--------11110011----", &Visitor::QASX) }, // ARMv6
|
{ "QASX", MakeMatcher<4>("cccc01100010nnnndddd11110011mmmm", &Visitor::QASX) }, // ARMv6
|
||||||
{ "QSAX", MakeMatcher<0>("----01100010--------11110101----", &Visitor::QSAX) }, // ARMv6
|
{ "QSAX", MakeMatcher<4>("cccc01100010nnnndddd11110101mmmm", &Visitor::QSAX) }, // ARMv6
|
||||||
{ "QSUB8", MakeMatcher<0>("----01100010--------11111111----", &Visitor::QSUB8) }, // ARMv6
|
{ "QSUB8", MakeMatcher<4>("cccc01100010nnnndddd11111111mmmm", &Visitor::QSUB8) }, // ARMv6
|
||||||
{ "QSUB16", MakeMatcher<0>("----01100010--------11110111----", &Visitor::QSUB16) }, // ARMv6
|
{ "QSUB16", MakeMatcher<4>("cccc01100010nnnndddd11110111mmmm", &Visitor::QSUB16) }, // ARMv6
|
||||||
{ "UQADD8", MakeMatcher<0>("----01100110--------11111001----", &Visitor::UQADD8) }, // ARMv6
|
{ "UQADD8", MakeMatcher<4>("cccc01100110nnnndddd11111001mmmm", &Visitor::UQADD8) }, // ARMv6
|
||||||
{ "UQADD16", MakeMatcher<0>("----01100110--------11110001----", &Visitor::UQADD16) }, // ARMv6
|
{ "UQADD16", MakeMatcher<4>("cccc01100110nnnndddd11110001mmmm", &Visitor::UQADD16) }, // ARMv6
|
||||||
{ "UQASX", MakeMatcher<0>("----01100110--------11110011----", &Visitor::UQASX) }, // ARMv6
|
{ "UQASX", MakeMatcher<4>("cccc01100110nnnndddd11110011mmmm", &Visitor::UQASX) }, // ARMv6
|
||||||
{ "UQSAX", MakeMatcher<0>("----01100110--------11110101----", &Visitor::UQSAX) }, // ARMv6
|
{ "UQSAX", MakeMatcher<4>("cccc01100110nnnndddd11110101mmmm", &Visitor::UQSAX) }, // ARMv6
|
||||||
{ "UQSUB8", MakeMatcher<0>("----01100110--------11111111----", &Visitor::UQSUB8) }, // ARMv6
|
{ "UQSUB8", MakeMatcher<4>("cccc01100110nnnndddd11111111mmmm", &Visitor::UQSUB8) }, // ARMv6
|
||||||
{ "UQSUB16", MakeMatcher<0>("----01100110--------11110111----", &Visitor::UQSUB16) }, // ARMv6
|
{ "UQSUB16", MakeMatcher<4>("cccc01100110nnnndddd11110111mmmm", &Visitor::UQSUB16) }, // ARMv6
|
||||||
|
|
||||||
// Parallel Add/Subtract (Halving) instructions
|
// Parallel Add/Subtract (Halving) instructions
|
||||||
{ "SHADD8", MakeMatcher<0>("----01100011--------11111001----", &Visitor::SHADD8) }, // ARMv6
|
{ "SHADD8", MakeMatcher<4>("cccc01100011nnnndddd11111001mmmm", &Visitor::SHADD8) }, // ARMv6
|
||||||
{ "SHADD16", MakeMatcher<0>("----01100011--------11110001----", &Visitor::SHADD16) }, // ARMv6
|
{ "SHADD16", MakeMatcher<4>("cccc01100011nnnndddd11110001mmmm", &Visitor::SHADD16) }, // ARMv6
|
||||||
{ "SHASX", MakeMatcher<0>("----01100011--------11110011----", &Visitor::SHASX) }, // ARMv6
|
{ "SHASX", MakeMatcher<4>("cccc01100011nnnndddd11110011mmmm", &Visitor::SHASX) }, // ARMv6
|
||||||
{ "SHSAX", MakeMatcher<0>("----01100011--------11110101----", &Visitor::SHSAX) }, // ARMv6
|
{ "SHSAX", MakeMatcher<4>("cccc01100011nnnndddd11110101mmmm", &Visitor::SHSAX) }, // ARMv6
|
||||||
{ "SHSUB8", MakeMatcher<0>("----01100011--------11111111----", &Visitor::SHSUB8) }, // ARMv6
|
{ "SHSUB8", MakeMatcher<4>("cccc01100011nnnndddd11111111mmmm", &Visitor::SHSUB8) }, // ARMv6
|
||||||
{ "SHSUB16", MakeMatcher<0>("----01100011--------11110111----", &Visitor::SHSUB16) }, // ARMv6
|
{ "SHSUB16", MakeMatcher<4>("cccc01100011nnnndddd11110111mmmm", &Visitor::SHSUB16) }, // ARMv6
|
||||||
{ "UHADD8", MakeMatcher<0>("----01100111--------11111001----", &Visitor::UHADD8) }, // ARMv6
|
{ "UHADD8", MakeMatcher<4>("cccc01100111nnnndddd11111001mmmm", &Visitor::UHADD8) }, // ARMv6
|
||||||
{ "UHADD16", MakeMatcher<0>("----01100111--------11110001----", &Visitor::UHADD16) }, // ARMv6
|
{ "UHADD16", MakeMatcher<4>("cccc01100111nnnndddd11110001mmmm", &Visitor::UHADD16) }, // ARMv6
|
||||||
{ "UHASX", MakeMatcher<0>("----01100111--------11110011----", &Visitor::UHASX) }, // ARMv6
|
{ "UHASX", MakeMatcher<4>("cccc01100111nnnndddd11110011mmmm", &Visitor::UHASX) }, // ARMv6
|
||||||
{ "UHSAX", MakeMatcher<0>("----01100111--------11110101----", &Visitor::UHSAX) }, // ARMv6
|
{ "UHSAX", MakeMatcher<4>("cccc01100111nnnndddd11110101mmmm", &Visitor::UHSAX) }, // ARMv6
|
||||||
{ "UHSUB8", MakeMatcher<0>("----01100111--------11111111----", &Visitor::UHSUB8) }, // ARMv6
|
{ "UHSUB8", MakeMatcher<4>("cccc01100111nnnndddd11111111mmmm", &Visitor::UHSUB8) }, // ARMv6
|
||||||
{ "UHSUB16", MakeMatcher<0>("----01100111--------11110111----", &Visitor::UHSUB16) }, // ARMv6
|
{ "UHSUB16", MakeMatcher<4>("cccc01100111nnnndddd11110111mmmm", &Visitor::UHSUB16) }, // ARMv6
|
||||||
|
|
||||||
// Saturated Add/Subtract instructions
|
// Saturated Add/Subtract instructions
|
||||||
{ "QADD", MakeMatcher<0>("----00010000--------00000101----", &Visitor::QADD) }, // ARMv5xP
|
{ "QADD", MakeMatcher<4>("cccc00010000nnnndddd00000101mmmm", &Visitor::QADD) }, // ARMv5xP
|
||||||
{ "QSUB", MakeMatcher<0>("----00010010--------00000101----", &Visitor::QSUB) }, // ARMv5xP
|
{ "QSUB", MakeMatcher<4>("cccc00010010nnnndddd00000101mmmm", &Visitor::QSUB) }, // ARMv5xP
|
||||||
{ "QDADD", MakeMatcher<0>("----00010100--------00000101----", &Visitor::QDADD) }, // ARMv5xP
|
{ "QDADD", MakeMatcher<4>("cccc00010100nnnndddd00000101mmmm", &Visitor::QDADD) }, // ARMv5xP
|
||||||
{ "QDSUB", MakeMatcher<0>("----00010110--------00000101----", &Visitor::QDSUB) }, // ARMv5xP
|
{ "QDSUB", MakeMatcher<4>("cccc00010110nnnndddd00000101mmmm", &Visitor::QDSUB) }, // ARMv5xP
|
||||||
|
|
||||||
// Status Register Access instructions
|
// Status Register Access instructions
|
||||||
{ "CPS", MakeMatcher<0>("111100010000---00000000---0-----", &Visitor::CPS) }, // ARMv6
|
{ "CPS", MakeMatcher<0>("111100010000---00000000---0-----", &Visitor::CPS) }, // ARMv6
|
||||||
@ -395,4 +395,4 @@ boost::optional<const Instruction&> DecodeArm(u32 i) {
|
|||||||
return iterator != arm_instruction_table.cend() ? boost::make_optional<const Instruction&>(*iterator) : boost::none;
|
return iterator != arm_instruction_table.cend() ? boost::make_optional<const Instruction&>(*iterator) : boost::none;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
} // namespace ArmDecoder
|
||||||
|
@ -60,6 +60,7 @@ using Imm24 = u32;
|
|||||||
using Register = int;
|
using Register = int;
|
||||||
using RegisterList = u16;
|
using RegisterList = u16;
|
||||||
using ShiftType = int;
|
using ShiftType = int;
|
||||||
|
using SignExtendRotation = int;
|
||||||
|
|
||||||
class Visitor {
|
class Visitor {
|
||||||
public:
|
public:
|
||||||
@ -138,18 +139,18 @@ public:
|
|||||||
virtual void UDF() = 0;
|
virtual void UDF() = 0;
|
||||||
|
|
||||||
// Extension functions
|
// Extension functions
|
||||||
virtual void SXTAB() = 0;
|
virtual void SXTAB(Cond cond, Register Rn, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void SXTAB16() = 0;
|
virtual void SXTAB16(Cond cond, Register Rn, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void SXTAH() = 0;
|
virtual void SXTAH(Cond cond, Register Rn, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void SXTB() = 0;
|
virtual void SXTB(Cond cond, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void SXTB16() = 0;
|
virtual void SXTB16(Cond cond, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void SXTH() = 0;
|
virtual void SXTH(Cond cond, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void UXTAB() = 0;
|
virtual void UXTAB(Cond cond, Register Rn, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void UXTAB16() = 0;
|
virtual void UXTAB16(Cond cond, Register Rn, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void UXTAH() = 0;
|
virtual void UXTAH(Cond cond, Register Rn, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void UXTB() = 0;
|
virtual void UXTB(Cond cond, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void UXTB16() = 0;
|
virtual void UXTB16(Cond cond, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
virtual void UXTH() = 0;
|
virtual void UXTH(Cond cond, Register Rd, SignExtendRotation rotate, Register Rm) = 0;
|
||||||
|
|
||||||
// Hint instructions
|
// Hint instructions
|
||||||
virtual void PLD() = 0;
|
virtual void PLD() = 0;
|
||||||
@ -196,109 +197,109 @@ public:
|
|||||||
virtual void STM_usr() = 0;
|
virtual void STM_usr() = 0;
|
||||||
|
|
||||||
// Miscellaneous instructions
|
// Miscellaneous instructions
|
||||||
virtual void CLZ() = 0;
|
virtual void CLZ(Cond cond, Register Rd, Register Rm) = 0;
|
||||||
virtual void NOP() = 0;
|
virtual void NOP() = 0;
|
||||||
virtual void SEL() = 0;
|
virtual void SEL(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
|
|
||||||
// Unsigned sum of absolute difference functions
|
// Unsigned sum of absolute difference functions
|
||||||
virtual void USAD8() = 0;
|
virtual void USAD8(Cond cond, Register Rd, Register Rm, Register Rn) = 0;
|
||||||
virtual void USADA8() = 0;
|
virtual void USADA8(Cond cond, Register Rd, Register Ra, Register Rm, Register Rn) = 0;
|
||||||
|
|
||||||
// Packing instructions
|
// Packing instructions
|
||||||
virtual void PKHBT(Cond cond, Register Rn, Register Rd, Imm5 imm5, Register Rm) = 0;
|
virtual void PKHBT(Cond cond, Register Rn, Register Rd, Imm5 imm5, Register Rm) = 0;
|
||||||
virtual void PKHTB(Cond cond, Register Rn, Register Rd, Imm5 imm5, Register Rm) = 0;
|
virtual void PKHTB(Cond cond, Register Rn, Register Rd, Imm5 imm5, Register Rm) = 0;
|
||||||
|
|
||||||
// Reversal instructions
|
// Reversal instructions
|
||||||
virtual void REV() = 0;
|
virtual void REV(Cond cond, Register Rd, Register Rm) = 0;
|
||||||
virtual void REV16() = 0;
|
virtual void REV16(Cond cond, Register Rd, Register Rm) = 0;
|
||||||
virtual void REVSH() = 0;
|
virtual void REVSH(Cond cond, Register Rd, Register Rm) = 0;
|
||||||
|
|
||||||
// Saturation instructions
|
// Saturation instructions
|
||||||
virtual void SSAT() = 0;
|
virtual void SSAT(Cond cond, Imm5 sat_imm, Register Rd, Imm5 imm5, bool sh, Register Rn) = 0;
|
||||||
virtual void SSAT16() = 0;
|
virtual void SSAT16(Cond cond, Imm4 sat_imm, Register Rd, Register Rn) = 0;
|
||||||
virtual void USAT() = 0;
|
virtual void USAT(Cond cond, Imm5 sat_imm, Register Rd, Imm5 imm5, bool sh, Register Rn) = 0;
|
||||||
virtual void USAT16() = 0;
|
virtual void USAT16(Cond cond, Imm4 sat_imm, Register Rd, Register Rn) = 0;
|
||||||
|
|
||||||
// Multiply (Normal) instructions
|
// Multiply (Normal) instructions
|
||||||
virtual void MLA() = 0;
|
virtual void MLA(Cond cond, bool S, Register Rd, Register Ra, Register Rm, Register Rn) = 0;
|
||||||
virtual void MUL() = 0;
|
virtual void MUL(Cond cond, bool S, Register Rd, Register Rm, Register Rn) = 0;
|
||||||
|
|
||||||
// Multiply (Long) instructions
|
// Multiply (Long) instructions
|
||||||
virtual void SMLAL() = 0;
|
virtual void SMLAL(Cond cond, bool S, Register RdHi, Register RdLo, Register Rm, Register Rn) = 0;
|
||||||
virtual void SMULL() = 0;
|
virtual void SMULL(Cond cond, bool S, Register RdHi, Register RdLo, Register Rm, Register Rn) = 0;
|
||||||
virtual void UMAAL() = 0;
|
virtual void UMAAL(Cond cond, Register RdHi, Register RdLo, Register Rm, Register Rn) = 0;
|
||||||
virtual void UMLAL() = 0;
|
virtual void UMLAL(Cond cond, bool S, Register RdHi, Register RdLo, Register Rm, Register Rn) = 0;
|
||||||
virtual void UMULL() = 0;
|
virtual void UMULL(Cond cond, bool S, Register RdHi, Register RdLo, Register Rm, Register Rn) = 0;
|
||||||
|
|
||||||
// Multiply (Halfword) instructions
|
// Multiply (Halfword) instructions
|
||||||
virtual void SMLALxy() = 0;
|
virtual void SMLALxy(Cond cond, Register RdHi, Register RdLo, Register Rm, bool M, bool N, Register Rn) = 0;
|
||||||
virtual void SMLAxy() = 0;
|
virtual void SMLAxy(Cond cond, Register Rd, Register Ra, Register Rm, bool M, bool N, Register Rn) = 0;
|
||||||
virtual void SMULxy() = 0;
|
virtual void SMULxy(Cond cond, Register Rd, Register Rm, bool M, bool N, Register Rn) = 0;
|
||||||
|
|
||||||
// Multiply (word by halfword) instructions
|
// Multiply (word by halfword) instructions
|
||||||
virtual void SMLAWy() = 0;
|
virtual void SMLAWy(Cond cond, Register Rd, Register Ra, Register Rm, bool M, Register Rn) = 0;
|
||||||
virtual void SMULWy() = 0;
|
virtual void SMULWy(Cond cond, Register Rd, Register Rm, bool M, Register Rn) = 0;
|
||||||
|
|
||||||
// Multiply (Most significant word) instructions
|
// Multiply (Most significant word) instructions
|
||||||
virtual void SMMLA() = 0;
|
virtual void SMMLA(Cond cond, Register Rd, Register Ra, Register Rm, bool R, Register Rn) = 0;
|
||||||
virtual void SMMLS() = 0;
|
virtual void SMMLS(Cond cond, Register Rd, Register Ra, Register Rm, bool R, Register Rn) = 0;
|
||||||
virtual void SMMUL() = 0;
|
virtual void SMMUL(Cond cond, Register Rd, Register Rm, bool R, Register Rn) = 0;
|
||||||
|
|
||||||
// Multiply (Dual) instructions
|
// Multiply (Dual) instructions
|
||||||
virtual void SMLAD() = 0;
|
virtual void SMLAD(Cond cond, Register Rd, Register Ra, Register Rm, bool M, Register Rn) = 0;
|
||||||
virtual void SMLALD() = 0;
|
virtual void SMLALD(Cond cond, Register RdHi, Register RdLo, Register Rm, bool M, Register Rn) = 0;
|
||||||
virtual void SMLSD() = 0;
|
virtual void SMLSD(Cond cond, Register Rd, Register Ra, Register Rm, bool M, Register Rn) = 0;
|
||||||
virtual void SMLSLD() = 0;
|
virtual void SMLSLD(Cond cond, Register RdHi, Register RdLo, Register Rm, bool M, Register Rn) = 0;
|
||||||
virtual void SMUAD() = 0;
|
virtual void SMUAD(Cond cond, Register Rd, Register Rm, bool M, Register Rn) = 0;
|
||||||
virtual void SMUSD() = 0;
|
virtual void SMUSD(Cond cond, Register Rd, Register Rm, bool M, Register Rn) = 0;
|
||||||
|
|
||||||
// Parallel Add/Subtract (Modulo arithmetic) instructions
|
// Parallel Add/Subtract (Modulo arithmetic) instructions
|
||||||
virtual void SADD8() = 0;
|
virtual void SADD8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SADD16() = 0;
|
virtual void SADD16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SASX() = 0;
|
virtual void SASX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SSAX() = 0;
|
virtual void SSAX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SSUB8() = 0;
|
virtual void SSUB8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SSUB16() = 0;
|
virtual void SSUB16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UADD8() = 0;
|
virtual void UADD8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UADD16() = 0;
|
virtual void UADD16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UASX() = 0;
|
virtual void UASX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void USAX() = 0;
|
virtual void USAX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void USUB8() = 0;
|
virtual void USUB8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void USUB16() = 0;
|
virtual void USUB16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
|
|
||||||
// Parallel Add/Subtract (Saturating) instructions
|
// Parallel Add/Subtract (Saturating) instructions
|
||||||
virtual void QADD8() = 0;
|
virtual void QADD8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QADD16() = 0;
|
virtual void QADD16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QASX() = 0;
|
virtual void QASX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QSAX() = 0;
|
virtual void QSAX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QSUB8() = 0;
|
virtual void QSUB8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QSUB16() = 0;
|
virtual void QSUB16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UQADD8() = 0;
|
virtual void UQADD8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UQADD16() = 0;
|
virtual void UQADD16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UQASX() = 0;
|
virtual void UQASX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UQSAX() = 0;
|
virtual void UQSAX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UQSUB8() = 0;
|
virtual void UQSUB8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UQSUB16() = 0;
|
virtual void UQSUB16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
|
|
||||||
// Parallel Add/Subtract (Halving) instructions
|
// Parallel Add/Subtract (Halving) instructions
|
||||||
virtual void SHADD8() = 0;
|
virtual void SHADD8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SHADD16() = 0;
|
virtual void SHADD16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SHASX() = 0;
|
virtual void SHASX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SHSAX() = 0;
|
virtual void SHSAX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SHSUB8() = 0;
|
virtual void SHSUB8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void SHSUB16() = 0;
|
virtual void SHSUB16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UHADD8() = 0;
|
virtual void UHADD8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UHADD16() = 0;
|
virtual void UHADD16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UHASX() = 0;
|
virtual void UHASX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UHSAX() = 0;
|
virtual void UHSAX(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UHSUB8() = 0;
|
virtual void UHSUB8(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void UHSUB16() = 0;
|
virtual void UHSUB16(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
|
|
||||||
// Saturated Add/Subtract instructions
|
// Saturated Add/Subtract instructions
|
||||||
virtual void QADD() = 0;
|
virtual void QADD(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QSUB() = 0;
|
virtual void QSUB(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QDADD() = 0;
|
virtual void QDADD(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
virtual void QDSUB() = 0;
|
virtual void QDSUB(Cond cond, Register Rn, Register Rd, Register Rm) = 0;
|
||||||
|
|
||||||
// Synchronization Primitive instructions
|
// Synchronization Primitive instructions
|
||||||
virtual void CLREX() = 0;
|
virtual void CLREX() = 0;
|
||||||
@ -328,4 +329,4 @@ public:
|
|||||||
virtual void thumb_BLX_suffix(bool X, Imm11 imm11) = 0;
|
virtual void thumb_BLX_suffix(bool X, Imm11 imm11) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
} // namespace ArmDecoder
|
||||||
|
@ -181,7 +181,7 @@ static const std::array<Instruction, 27> thumb_instruction_table = { {
|
|||||||
v->ORR_reg(0xE, /*S=*/true, Rd_Rn, Rd_Rn, 0, 0, Rm_Rs);
|
v->ORR_reg(0xE, /*S=*/true, Rd_Rn, Rd_Rn, 0, 0, Rm_Rs);
|
||||||
break;
|
break;
|
||||||
case 13: // MUL Rd, Rm
|
case 13: // MUL Rd, Rm
|
||||||
v->MUL();
|
v->MUL(0xE, /*S=*/true, Rd_Rn, Rd_Rn, Rm_Rs);
|
||||||
break;
|
break;
|
||||||
case 14: // BIC Rm, Rd
|
case 14: // BIC Rm, Rd
|
||||||
v->BIC_reg(0xE, /*S=*/true, Rd_Rn, Rd_Rn, 0, 0, Rm_Rs);
|
v->BIC_reg(0xE, /*S=*/true, Rd_Rn, Rd_Rn, 0, 0, Rm_Rs);
|
||||||
@ -331,16 +331,16 @@ static const std::array<Instruction, 27> thumb_instruction_table = { {
|
|||||||
Register Rd = bits<0, 2>(instruction);
|
Register Rd = bits<0, 2>(instruction);
|
||||||
switch (opc) {
|
switch (opc) {
|
||||||
case 0: // SXTH Rd, Rm
|
case 0: // SXTH Rd, Rm
|
||||||
v->SXTH();
|
v->SXTH(0xE, Rd, 0, Rm);
|
||||||
break;
|
break;
|
||||||
case 1: // SXTB Rd, Rm
|
case 1: // SXTB Rd, Rm
|
||||||
v->SXTB();
|
v->SXTB(0xE, Rd, 0, Rm);
|
||||||
break;
|
break;
|
||||||
case 2: // UXTH Rd, Rm
|
case 2: // UXTH Rd, Rm
|
||||||
v->UXTH();
|
v->UXTH(0xE, Rd, 0, Rm);
|
||||||
break;
|
break;
|
||||||
case 3: // UXTB Rd, Rm
|
case 3: // UXTB Rd, Rm
|
||||||
v->UXTB();
|
v->UXTB(0xE, Rd, 0, Rm);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -377,16 +377,16 @@ static const std::array<Instruction, 27> thumb_instruction_table = { {
|
|||||||
Register Rd = bits<0, 2>(instruction);
|
Register Rd = bits<0, 2>(instruction);
|
||||||
switch (opc) {
|
switch (opc) {
|
||||||
case 0: // REV Rd, Rn
|
case 0: // REV Rd, Rn
|
||||||
v->REV();
|
v->REV(0xE, Rd, Rn);
|
||||||
break;
|
break;
|
||||||
case 1: // REV16 Rd, Rn
|
case 1: // REV16 Rd, Rn
|
||||||
v->REV16();
|
v->REV16(0xE, Rd, Rn);
|
||||||
break;
|
break;
|
||||||
case 2: // undefined
|
case 2: // undefined
|
||||||
v->UDF();
|
v->UDF();
|
||||||
break;
|
break;
|
||||||
case 3: // REVSH Rd, Rn
|
case 3: // REVSH Rd, Rn
|
||||||
v->REVSH();
|
v->REVSH(0xE, Rd, Rn);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
@ -21,6 +21,7 @@ using ArmImm12 = ArmDecoder::Imm12;
|
|||||||
using ArmImm24 = ArmDecoder::Imm24;
|
using ArmImm24 = ArmDecoder::Imm24;
|
||||||
using Cond = ArmDecoder::Cond;
|
using Cond = ArmDecoder::Cond;
|
||||||
using ShiftType = ArmDecoder::ShiftType;
|
using ShiftType = ArmDecoder::ShiftType;
|
||||||
|
using SignExtendRotation = ArmDecoder::SignExtendRotation;
|
||||||
|
|
||||||
struct JitState {
|
struct JitState {
|
||||||
JitState() : cpu_state(PrivilegeMode::USER32MODE) {}
|
JitState() : cpu_state(PrivilegeMode::USER32MODE) {}
|
||||||
|
@ -122,4 +122,4 @@ void JitX64::BXJ(Cond cond, ArmReg Rm) {
|
|||||||
BX(cond, Rm);
|
BX(cond, Rm);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -14,4 +14,4 @@ void JitX64::MRC() { CompileInterpretInstruction(); }
|
|||||||
void JitX64::MRRC() { CompileInterpretInstruction(); }
|
void JitX64::MRRC() { CompileInterpretInstruction(); }
|
||||||
void JitX64::STC() { CompileInterpretInstruction(); }
|
void JitX64::STC() { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -65,4 +65,4 @@ void JitX64::UDF() {
|
|||||||
current.arm_pc += GetInstSize();
|
current.arm_pc += GetInstSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,17 +6,17 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::SXTAB() { CompileInterpretInstruction(); }
|
void JitX64::SXTAB(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SXTAB16() { CompileInterpretInstruction(); }
|
void JitX64::SXTAB16(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SXTAH() { CompileInterpretInstruction(); }
|
void JitX64::SXTAH(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SXTB() { CompileInterpretInstruction(); }
|
void JitX64::SXTB(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SXTB16() { CompileInterpretInstruction(); }
|
void JitX64::SXTB16(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SXTH() { CompileInterpretInstruction(); }
|
void JitX64::SXTH(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UXTAB() { CompileInterpretInstruction(); }
|
void JitX64::UXTAB(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UXTAB16() { CompileInterpretInstruction(); }
|
void JitX64::UXTAB16(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UXTAH() { CompileInterpretInstruction(); }
|
void JitX64::UXTAH(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UXTB() { CompileInterpretInstruction(); }
|
void JitX64::UXTB(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UXTB16() { CompileInterpretInstruction(); }
|
void JitX64::UXTB16(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UXTH() { CompileInterpretInstruction(); }
|
void JitX64::UXTH(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -12,4 +12,4 @@ void JitX64::WFI() { CompileInterpretInstruction(); }
|
|||||||
void JitX64::WFE() { CompileInterpretInstruction(); }
|
void JitX64::WFE() { CompileInterpretInstruction(); }
|
||||||
void JitX64::YIELD() { CompileInterpretInstruction(); }
|
void JitX64::YIELD() { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -1031,4 +1031,4 @@ void JitX64::LDM_usr() { CompileInterpretInstruction(); }
|
|||||||
void JitX64::LDM_eret() { CompileInterpretInstruction(); }
|
void JitX64::LDM_eret() { CompileInterpretInstruction(); }
|
||||||
void JitX64::STM_usr() { CompileInterpretInstruction(); }
|
void JitX64::STM_usr() { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::CLZ() { CompileInterpretInstruction(); }
|
void JitX64::CLZ(Cond cond, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::NOP() { CompileInterpretInstruction(); }
|
void JitX64::NOP() { CompileInterpretInstruction(); }
|
||||||
void JitX64::SEL() { CompileInterpretInstruction(); }
|
void JitX64::SEL(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -7,36 +7,36 @@
|
|||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
// Multiply (Normal) instructions
|
// Multiply (Normal) instructions
|
||||||
void JitX64::MLA() { CompileInterpretInstruction(); }
|
void JitX64::MLA(Cond cond, bool S, ArmReg Rd, ArmReg Ra, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::MUL() { CompileInterpretInstruction(); }
|
void JitX64::MUL(Cond cond, bool S, ArmReg Rd, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
// Multiply (Long) instructions
|
// Multiply (Long) instructions
|
||||||
void JitX64::SMLAL() { CompileInterpretInstruction(); }
|
void JitX64::SMLAL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMULL() { CompileInterpretInstruction(); }
|
void JitX64::SMULL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UMAAL() { CompileInterpretInstruction(); }
|
void JitX64::UMAAL(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UMLAL() { CompileInterpretInstruction(); }
|
void JitX64::UMLAL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UMULL() { CompileInterpretInstruction(); }
|
void JitX64::UMULL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
// Multiply (Halfword) instructions
|
// Multiply (Halfword) instructions
|
||||||
void JitX64::SMLALxy() { CompileInterpretInstruction(); }
|
void JitX64::SMLALxy(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, bool M, bool N, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMLAxy() { CompileInterpretInstruction(); }
|
void JitX64::SMLAxy(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, bool N, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMULxy() { CompileInterpretInstruction(); }
|
void JitX64::SMULxy(Cond cond, ArmReg Rd, ArmReg Rm, bool M, bool N, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
// Multiply (word by halfword) instructions
|
// Multiply (word by halfword) instructions
|
||||||
void JitX64::SMLAWy() { CompileInterpretInstruction(); }
|
void JitX64::SMLAWy(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMULWy() { CompileInterpretInstruction(); }
|
void JitX64::SMULWy(Cond cond, ArmReg Rd, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
// Multiply (Most significant word) instructions
|
// Multiply (Most significant word) instructions
|
||||||
void JitX64::SMMLA() { CompileInterpretInstruction(); }
|
void JitX64::SMMLA(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool R, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMMLS() { CompileInterpretInstruction(); }
|
void JitX64::SMMLS(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool R, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMMUL() { CompileInterpretInstruction(); }
|
void JitX64::SMMUL(Cond cond, ArmReg Rd, ArmReg Rm, bool R, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
// Multiply (Dual) instructions
|
// Multiply (Dual) instructions
|
||||||
void JitX64::SMLAD() { CompileInterpretInstruction(); }
|
void JitX64::SMLAD(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMLALD() { CompileInterpretInstruction(); }
|
void JitX64::SMLALD(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMLSD() { CompileInterpretInstruction(); }
|
void JitX64::SMLSD(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMLSLD() { CompileInterpretInstruction(); }
|
void JitX64::SMLSLD(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMUAD() { CompileInterpretInstruction(); }
|
void JitX64::SMUAD(Cond cond, ArmReg Rd, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SMUSD() { CompileInterpretInstruction(); }
|
void JitX64::SMUSD(Cond cond, ArmReg Rd, ArmReg Rm, bool M, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -9,4 +9,4 @@ namespace JitX64 {
|
|||||||
void JitX64::PKHBT(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) { CompileInterpretInstruction(); }
|
void JitX64::PKHBT(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::PKHTB(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) { CompileInterpretInstruction(); }
|
void JitX64::PKHTB(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,17 +6,17 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::SHADD8() { CompileInterpretInstruction(); }
|
void JitX64::SHADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SHADD16() { CompileInterpretInstruction(); }
|
void JitX64::SHADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SHASX() { CompileInterpretInstruction(); }
|
void JitX64::SHASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SHSAX() { CompileInterpretInstruction(); }
|
void JitX64::SHSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SHSUB8() { CompileInterpretInstruction(); }
|
void JitX64::SHSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SHSUB16() { CompileInterpretInstruction(); }
|
void JitX64::SHSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UHADD8() { CompileInterpretInstruction(); }
|
void JitX64::UHADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UHADD16() { CompileInterpretInstruction(); }
|
void JitX64::UHADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UHASX() { CompileInterpretInstruction(); }
|
void JitX64::UHASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UHSAX() { CompileInterpretInstruction(); }
|
void JitX64::UHSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UHSUB8() { CompileInterpretInstruction(); }
|
void JitX64::UHSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UHSUB16() { CompileInterpretInstruction(); }
|
void JitX64::UHSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,17 +6,17 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::SADD8() { CompileInterpretInstruction(); }
|
void JitX64::SADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SADD16() { CompileInterpretInstruction(); }
|
void JitX64::SADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SASX() { CompileInterpretInstruction(); }
|
void JitX64::SASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SSAX() { CompileInterpretInstruction(); }
|
void JitX64::SSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SSUB8() { CompileInterpretInstruction(); }
|
void JitX64::SSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SSUB16() { CompileInterpretInstruction(); }
|
void JitX64::SSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UADD8() { CompileInterpretInstruction(); }
|
void JitX64::UADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UADD16() { CompileInterpretInstruction(); }
|
void JitX64::UADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UASX() { CompileInterpretInstruction(); }
|
void JitX64::UASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::USAX() { CompileInterpretInstruction(); }
|
void JitX64::USAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::USUB8() { CompileInterpretInstruction(); }
|
void JitX64::USUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::USUB16() { CompileInterpretInstruction(); }
|
void JitX64::USUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,18 +6,17 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::QADD8() { CompileInterpretInstruction(); }
|
void JitX64::QADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QADD16() { CompileInterpretInstruction(); }
|
void JitX64::QADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QASX() { CompileInterpretInstruction(); }
|
void JitX64::QASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QSAX() { CompileInterpretInstruction(); }
|
void JitX64::QSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QSUB8() { CompileInterpretInstruction(); }
|
void JitX64::QSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QSUB16() { CompileInterpretInstruction(); }
|
void JitX64::QSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UQADD8() { CompileInterpretInstruction(); }
|
void JitX64::UQADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UQADD16() { CompileInterpretInstruction(); }
|
void JitX64::UQADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UQASX() { CompileInterpretInstruction(); }
|
void JitX64::UQASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UQSAX() { CompileInterpretInstruction(); }
|
void JitX64::UQSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UQSUB8() { CompileInterpretInstruction(); }
|
void JitX64::UQSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::UQSUB16() { CompileInterpretInstruction(); }
|
void JitX64::UQSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
|
} // namespace JitX64
|
||||||
}
|
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::QADD() { CompileInterpretInstruction(); }
|
void JitX64::QADD(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QSUB() { CompileInterpretInstruction(); }
|
void JitX64::QSUB(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QDADD() { CompileInterpretInstruction(); }
|
void JitX64::QDADD(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::QDSUB() { CompileInterpretInstruction(); }
|
void JitX64::QDSUB(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::REV() { CompileInterpretInstruction(); }
|
void JitX64::REV(Cond cond, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::REV16() { CompileInterpretInstruction(); }
|
void JitX64::REV16(Cond cond, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
void JitX64::REVSH() { CompileInterpretInstruction(); }
|
void JitX64::REVSH(Cond cond, ArmReg Rd, ArmReg Rm) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::SSAT() { CompileInterpretInstruction(); }
|
void JitX64::SSAT(Cond cond, ArmImm5 sat_imm, ArmReg Rd, ArmImm5 imm5, bool sh, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::SSAT16() { CompileInterpretInstruction(); }
|
void JitX64::SSAT16(Cond cond, ArmImm4 sat_imm, ArmReg Rd, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::USAT() { CompileInterpretInstruction(); }
|
void JitX64::USAT(Cond cond, ArmImm5 sat_imm, ArmReg Rd, ArmImm5 imm5, bool sh, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::USAT16() { CompileInterpretInstruction(); }
|
void JitX64::USAT16(Cond cond, ArmImm4 sat_imm, ArmReg Rd, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -29,4 +29,4 @@ void JitX64::SETEND(bool E) {
|
|||||||
|
|
||||||
void JitX64::SRS() { CompileInterpretInstruction(); }
|
void JitX64::SRS() { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -294,4 +294,4 @@ void JitX64::SWPB(Cond cond, ArmReg Rn_index, ArmReg Rd_index, ArmReg Rm_index)
|
|||||||
CompileInterpretInstruction();
|
CompileInterpretInstruction();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -97,4 +97,4 @@ void JitX64::thumb_BLX_suffix(bool X, ArmImm11 imm11) {
|
|||||||
thumb_BLX_suffix_executed = true;
|
thumb_BLX_suffix_executed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace JitX64 {
|
namespace JitX64 {
|
||||||
|
|
||||||
void JitX64::USAD8() { CompileInterpretInstruction(); }
|
void JitX64::USAD8(Cond cond, ArmReg Rd, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
void JitX64::USADA8() { CompileInterpretInstruction(); }
|
void JitX64::USADA8(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, ArmReg Rn) { CompileInterpretInstruction(); }
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
@ -226,18 +226,18 @@ private:
|
|||||||
void UDF() override;
|
void UDF() override;
|
||||||
|
|
||||||
// Extension functions
|
// Extension functions
|
||||||
void SXTAB() override;
|
void SXTAB(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void SXTAB16() override;
|
void SXTAB16(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void SXTAH() override;
|
void SXTAH(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void SXTB() override;
|
void SXTB(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void SXTB16() override;
|
void SXTB16(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void SXTH() override;
|
void SXTH(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void UXTAB() override;
|
void UXTAB(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void UXTAB16() override;
|
void UXTAB16(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void UXTAH() override;
|
void UXTAH(Cond cond, ArmReg Rn, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void UXTB() override;
|
void UXTB(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void UXTB16() override;
|
void UXTB16(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
void UXTH() override;
|
void UXTH(Cond cond, ArmReg Rd, SignExtendRotation rotate, ArmReg Rm) override;
|
||||||
|
|
||||||
// Hint instructions
|
// Hint instructions
|
||||||
void PLD() override;
|
void PLD() override;
|
||||||
@ -293,109 +293,109 @@ private:
|
|||||||
void STM_usr() override;
|
void STM_usr() override;
|
||||||
|
|
||||||
// Miscellaneous instructions
|
// Miscellaneous instructions
|
||||||
void CLZ() override;
|
void CLZ(Cond cond, ArmReg Rd, ArmReg Rm) override;
|
||||||
void NOP() override;
|
void NOP() override;
|
||||||
void SEL() override;
|
void SEL(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
|
|
||||||
// Unsigned sum of absolute difference functions
|
// Unsigned sum of absolute difference functions
|
||||||
void USAD8() override;
|
void USAD8(Cond cond, ArmReg Rd, ArmReg Rm, ArmReg Rn) override;
|
||||||
void USADA8() override;
|
void USADA8(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, ArmReg Rn) override;
|
||||||
|
|
||||||
// Packing instructions
|
// Packing instructions
|
||||||
void PKHBT(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) override;
|
void PKHBT(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) override;
|
||||||
void PKHTB(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) override;
|
void PKHTB(Cond cond, ArmReg Rn, ArmReg Rd, ArmImm5 imm5, ArmReg Rm) override;
|
||||||
|
|
||||||
// Reversal instructions
|
// Reversal instructions
|
||||||
void REV() override;
|
void REV(Cond cond, ArmReg Rd, ArmReg Rm) override;
|
||||||
void REV16() override;
|
void REV16(Cond cond, ArmReg Rd, ArmReg Rm) override;
|
||||||
void REVSH() override;
|
void REVSH(Cond cond, ArmReg Rd, ArmReg Rm) override;
|
||||||
|
|
||||||
// Saturation instructions
|
// Saturation instructions
|
||||||
void SSAT() override;
|
void SSAT(Cond cond, ArmImm5 sat_imm, ArmReg Rd, ArmImm5 imm5, bool sh, ArmReg Rn) override;
|
||||||
void SSAT16() override;
|
void SSAT16(Cond cond, ArmImm4 sat_imm, ArmReg Rd, ArmReg Rn) override;
|
||||||
void USAT() override;
|
void USAT(Cond cond, ArmImm5 sat_imm, ArmReg Rd, ArmImm5 imm5, bool sh, ArmReg Rn) override;
|
||||||
void USAT16() override;
|
void USAT16(Cond cond, ArmImm4 sat_imm, ArmReg Rd, ArmReg Rn) override;
|
||||||
|
|
||||||
// Multiply (Normal) instructions
|
// Multiply (Normal) instructions
|
||||||
void MLA() override;
|
void MLA(Cond cond, bool S, ArmReg Rd, ArmReg Ra, ArmReg Rm, ArmReg Rn) override;
|
||||||
void MUL() override;
|
void MUL(Cond cond, bool S, ArmReg Rd, ArmReg Rm, ArmReg Rn) override;
|
||||||
|
|
||||||
// Multiply (Long) instructions
|
// Multiply (Long) instructions
|
||||||
void SMLAL() override;
|
void SMLAL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) override;
|
||||||
void SMULL() override;
|
void SMULL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) override;
|
||||||
void UMAAL() override;
|
void UMAAL(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) override;
|
||||||
void UMLAL() override;
|
void UMLAL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) override;
|
||||||
void UMULL() override;
|
void UMULL(Cond cond, bool S, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, ArmReg Rn) override;
|
||||||
|
|
||||||
// Multiply (Halfword) instructions
|
// Multiply (Halfword) instructions
|
||||||
void SMLALxy() override;
|
void SMLALxy(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, bool M, bool N, ArmReg Rn) override;
|
||||||
void SMLAxy() override;
|
void SMLAxy(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, bool N, ArmReg Rn) override;
|
||||||
void SMULxy() override;
|
void SMULxy(Cond cond, ArmReg Rd, ArmReg Rm, bool M, bool N, ArmReg Rn) override;
|
||||||
|
|
||||||
// Multiply (word by halfword) instructions
|
// Multiply (word by halfword) instructions
|
||||||
void SMLAWy() override;
|
void SMLAWy(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
void SMULWy() override;
|
void SMULWy(Cond cond, ArmReg Rd, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
|
|
||||||
// Multiply (Most significant word) instructions
|
// Multiply (Most significant word) instructions
|
||||||
void SMMLA() override;
|
void SMMLA(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool R, ArmReg Rn) override;
|
||||||
void SMMLS() override;
|
void SMMLS(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool R, ArmReg Rn) override;
|
||||||
void SMMUL() override;
|
void SMMUL(Cond cond, ArmReg Rd, ArmReg Rm, bool R, ArmReg Rn) override;
|
||||||
|
|
||||||
// Multiply (Dual) instructions
|
// Multiply (Dual) instructions
|
||||||
void SMLAD() override;
|
void SMLAD(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
void SMLALD() override;
|
void SMLALD(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
void SMLSD() override;
|
void SMLSD(Cond cond, ArmReg Rd, ArmReg Ra, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
void SMLSLD() override;
|
void SMLSLD(Cond cond, ArmReg RdHi, ArmReg RdLo, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
void SMUAD() override;
|
void SMUAD(Cond cond, ArmReg Rd, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
void SMUSD() override;
|
void SMUSD(Cond cond, ArmReg Rd, ArmReg Rm, bool M, ArmReg Rn) override;
|
||||||
|
|
||||||
// Parallel Add/Subtract (Modulo arithmetic) instructions
|
// Parallel Add/Subtract (Modulo arithmetic) instructions
|
||||||
void SADD8() override;
|
void SADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SADD16() override;
|
void SADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SASX() override;
|
void SASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SSAX() override;
|
void SSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SSUB8() override;
|
void SSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SSUB16() override;
|
void SSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UADD8() override;
|
void UADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UADD16() override;
|
void UADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UASX() override;
|
void UASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void USAX() override;
|
void USAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void USUB8() override;
|
void USUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void USUB16() override;
|
void USUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
|
|
||||||
// Parallel Add/Subtract (Saturating) instructions
|
// Parallel Add/Subtract (Saturating) instructions
|
||||||
void QADD8() override;
|
void QADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QADD16() override;
|
void QADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QASX() override;
|
void QASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QSAX() override;
|
void QSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QSUB8() override;
|
void QSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QSUB16() override;
|
void QSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UQADD8() override;
|
void UQADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UQADD16() override;
|
void UQADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UQASX() override;
|
void UQASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UQSAX() override;
|
void UQSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UQSUB8() override;
|
void UQSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UQSUB16() override;
|
void UQSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
|
|
||||||
// Parallel Add/Subtract (Halving) instructions
|
// Parallel Add/Subtract (Halving) instructions
|
||||||
void SHADD8() override;
|
void SHADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SHADD16() override;
|
void SHADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SHASX() override;
|
void SHASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SHSAX() override;
|
void SHSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SHSUB8() override;
|
void SHSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void SHSUB16() override;
|
void SHSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UHADD8() override;
|
void UHADD8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UHADD16() override;
|
void UHADD16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UHASX() override;
|
void UHASX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UHSAX() override;
|
void UHSAX(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UHSUB8() override;
|
void UHSUB8(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void UHSUB16() override;
|
void UHSUB16(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
|
|
||||||
// Saturated Add/Subtract instructions
|
// Saturated Add/Subtract instructions
|
||||||
void QADD() override;
|
void QADD(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QSUB() override;
|
void QSUB(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QDADD() override;
|
void QDADD(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
void QDSUB() override;
|
void QDSUB(Cond cond, ArmReg Rn, ArmReg Rd, ArmReg Rm) override;
|
||||||
|
|
||||||
// Synchronization Primitive instructions
|
// Synchronization Primitive instructions
|
||||||
void CLREX() override;
|
void CLREX() override;
|
||||||
@ -429,4 +429,4 @@ private:
|
|||||||
void thumb_BLX_suffix(bool L, ArmImm11 imm11) override;
|
void thumb_BLX_suffix(bool L, ArmImm11 imm11) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace JitX64
|
||||||
|
Loading…
Reference in New Issue
Block a user