Skip to content

Instantly share code, notes, and snippets.

@Lusamine
Created October 1, 2022 03:25
Show Gist options
  • Save Lusamine/84e3d5a5183abcf340538b9dac68eb06 to your computer and use it in GitHub Desktop.
Save Lusamine/84e3d5a5183abcf340538b9dac68eb06 to your computer and use it in GitHub Desktop.
unsigned __int8 __fastcall select_from_table(__int64 a1, unsigned int total_entries)
{
__int64 v2; // x8
__int64 v3; // x9
unsigned __int64 v4; // x8
unsigned __int64 v5; // x9
unsigned __int64 v6; // x9
__int64 s0; // x10
__int64 s1; // x11
__int64 v9; // x12
int v10; // w8
__int64 v11; // x10
unsigned int rand; // w8
if ( total_entries < 2 )
return 0;
v2 = __clz(total_entries);
v3 = 31LL;
if ( ((0x7FFFFFFFu >> v2) & total_entries) != 0 )
v3 = 32LL;
v4 = v3 - v2;
v5 = v4 >> 6;
if ( (v4 & 0x3F) != 0 )
++v5;
if ( v5 > v4 )
LODWORD(v6) = 0;
else
v6 = 0xFFFFFFFFFFFFFFFFLL >> -(v4 / v5);
s0 = *(a1 + 112);
s1 = *(a1 + 120);
do
{
v9 = s0 ^ s1;
v10 = s0 + s1;
v11 = s0 ^ s1 ^ __ROR8__(s0, 40);
s1 = __ROR8__(v9, 27);
rand = v10 & v6;
s0 = v11 ^ (v9 << 16);
}
while ( rand >= total_entries );
*(a1 + 112) = s0;
*(a1 + 120) = s1;
return rand;
}
------
.text:00000071008273D4 ; unsigned __int8 __fastcall select_from_table(__int64 a1, unsigned int total_entries)
.text:00000071008273D4 select_from_table ; CODE XREF: sub_710078103C+88↑p
.text:00000071008273D4 ; sub_71007C9178+124↑p ...
.text:00000071008273D4 CMP W1, #2
.text:00000071008273D8 B.CC loc_710082744C
.text:00000071008273DC CLZ W8, W1
.text:00000071008273E0 MOV W9, #0x7FFFFFFF
.text:00000071008273E4 LSR W9, W9, W8
.text:00000071008273E8 TST W9, W1
.text:00000071008273EC MOV W9, #0x1F
.text:00000071008273F0 CINC X9, X9, NE
.text:00000071008273F4 SUB X8, X9, X8
.text:00000071008273F8 LSR X9, X8, #6
.text:00000071008273FC TST X8, #0x3F
.text:0000007100827400 CINC X9, X9, NE
.text:0000007100827404 CMP X9, X8
.text:0000007100827408 B.HI loc_7100827458
.text:000000710082740C UDIV X8, X8, X9
.text:0000007100827410 MOV X9, #0xFFFFFFFFFFFFFFFF
.text:0000007100827414 NEG X8, X8
.text:0000007100827418 LSR X9, X9, X8
.text:000000710082741C
.text:000000710082741C loc_710082741C ; CODE XREF: select_from_table+88↓j
.text:000000710082741C LDP X10, X11, [X0,#0x70]
.text:0000007100827420
.text:0000007100827420 loc_7100827420 ; CODE XREF: select_from_table+68↓j
.text:0000007100827420 EOR X12, X10, X11
.text:0000007100827424 ADD X8, X10, X11
.text:0000007100827428 EOR X10, X12, X10,ROR#40
.text:000000710082742C EXTR X11, X12, X12, #0x1B
.text:0000007100827430 AND X8, X8, X9
.text:0000007100827434 CMP W8, W1
.text:0000007100827438 EOR X10, X10, X12,LSL#16
.text:000000710082743C B.CS loc_7100827420
.text:0000007100827440 STP X10, X11, [X0,#0x70]
.text:0000007100827444 MOV W0, W8
.text:0000007100827448 RET
.text:000000710082744C ; ---------------------------------------------------------------------------
.text:000000710082744C
.text:000000710082744C loc_710082744C ; CODE XREF: select_from_table+4↑j
.text:000000710082744C MOV W8, WZR
.text:0000007100827450 MOV W0, W8
.text:0000007100827454 RET
.text:0000007100827458 ; ---------------------------------------------------------------------------
.text:0000007100827458
.text:0000007100827458 loc_7100827458 ; CODE XREF: select_from_table+34↑j
.text:0000007100827458 MOV X9, XZR
.text:000000710082745C B loc_710082741C
.text:000000710082745C ; End of function select_from_table
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment