mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-28 02:01:52 +01:00
Merge pull request #2784 from Sonicadvance1/optimize_small_rcr
OpcodeDispatcher: Optimize 8/16-bit RCR
This commit is contained in:
1 file changed
+51
-6
+51
-6
@@ -2669,17 +2669,62 @@ void OpDispatchBuilder::RCRSmallerOp(OpcodeArgs) {
|
||||
// x86 masks the shift by 0x3F or 0x1F depending on size of op
|
||||
Src = _And(Src, _Constant(Size, 0x1F));
|
||||
|
||||
OrderedNode *Tmp = _Constant(64, 0);
|
||||
OrderedNode *Tmp{};
|
||||
|
||||
// Insert the incoming value across the temporary 64bit source
|
||||
// Make sure to insert at <BitSize> + 1 offsets
|
||||
// We need to cover 32bits plus the amount that could rotate in
|
||||
for (size_t i = 0; i < (32 + Size + 1); i += (Size + 1)) {
|
||||
// Insert incoming value
|
||||
Tmp = _Bfi(8, Size, i, Tmp, Dest);
|
||||
|
||||
// Insert CF
|
||||
Tmp = _Bfi(8, 1, i + Size, Tmp, CF);
|
||||
if (Size == 8) {
|
||||
// 8-bit optimal cascade
|
||||
// Cascade: 0
|
||||
// Data: -> [7:0]
|
||||
// CF: -> [8:8]
|
||||
// Cascade: 1
|
||||
// Data: -> [16:9]
|
||||
// CF: -> [17:17]
|
||||
// Cascade: 2
|
||||
// Data: -> [25:18]
|
||||
// CF: -> [26:26]
|
||||
// Cascade: 3
|
||||
// Data: -> [34:27]
|
||||
// CF: -> [35:35]
|
||||
// Cascade: 4
|
||||
// Data: -> [43:36]
|
||||
// CF: -> [44:44]
|
||||
|
||||
// Insert CF, Destination already at [7:0]
|
||||
Tmp = _Bfi(8, 1, 8, Dest, CF);
|
||||
|
||||
// First Cascade, copies 9 bits from itself.
|
||||
Tmp = _Bfi(8, 9, 9, Tmp, Tmp);
|
||||
|
||||
// Second cascade, copies 18 bits from itself.
|
||||
Tmp = _Bfi(8, 18, 18, Tmp, Tmp);
|
||||
|
||||
// Final cascade, copies 9 bits again from itself.
|
||||
Tmp = _Bfi(8, 9, 36, Tmp, Tmp);
|
||||
}
|
||||
else {
|
||||
// 16-bit optimal cascade
|
||||
// Cascade: 0
|
||||
// Data: -> [15:0]
|
||||
// CF: -> [16:16]
|
||||
// Cascade: 1
|
||||
// Data: -> [32:17]
|
||||
// CF: -> [33:33]
|
||||
// Cascade: 2
|
||||
// Data: -> [49:34]
|
||||
// CF: -> [50:50]
|
||||
|
||||
// Insert CF, Destination already at [15:0]
|
||||
Tmp = _Bfi(8, 1, 16, Dest, CF);
|
||||
|
||||
// First Cascade, copies 17 bits from itself.
|
||||
Tmp = _Bfi(8, 17, 17, Tmp, Tmp);
|
||||
|
||||
// Final Cascade, copies 17 bits from itself again.
|
||||
Tmp = _Bfi(8, 17, 34, Tmp, Tmp);
|
||||
}
|
||||
|
||||
// Entire bitfield has been setup
|
||||
|
||||
Reference in new issue
Block a user