luckytyphlosion

Xoroshiro32PlusPlus

Apr 10th, 2020
1,269
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; input: pointer to 32-bit seed
  2. ; output: random value between [0, 65535]
  3. Xoroshiro32PlusPlus:
  4.         ldrh    r3, [r0]
  5.         push    {r4, r5, lr}
  6.         movs    r4, r3
  7.         ldrh    r2, [r0, #2]
  8.         lsls    r5, r3, #13
  9.         lsrs    r1, r3, #3
  10.         eors    r4, r2
  11.         orrs    r1, r5
  12.         eors    r1, r4
  13.         lsls    r5, r4, #5
  14.         eors    r1, r5
  15.         strh    r1, [r0]
  16.         lsrs    r1, r4, #6
  17.         lsls    r4, r4, #10
  18.         adds    r2, r3, r2
  19.         orrs    r4, r1
  20.         strh    r4, [r0, #2]
  21.         lsls    r0, r2, #16
  22.         lsrs    r0, r0, #23
  23.         lsls    r2, r2, #9
  24.         orrs    r0, r2
  25.         subs    r3, r3, #1
  26.         adds    r0, r0, r3
  27.         lsls    r0, r0, #16
  28.         lsrs    r0, r0, #16
  29.         pop     {r4, r5, pc}
  30.  
  31. ; Compiled from:
  32. ; #include <stdint.h>
  33. ;  
  34. ; const uint16_t a = 13;
  35. ; const uint16_t b = 5;
  36. ; const uint16_t c = 10;
  37. ; const uint16_t d = 9;
  38. ;  
  39. ; static inline uint16_t rol(uint16_t x, uint16_t k)
  40. ; {
  41. ;     return (x << k) | (x >> ((sizeof(x) * 8) - k));
  42. ; }
  43. ;  
  44. ; uint16_t Xoroshiro32PlusPlus(uint16_t * seed) {
  45. ;     uint16_t result = rol(seed[0] + seed[1], d) + seed[0];
  46. ;  
  47. ;     seed[1] ^= seed[0];
  48. ;     seed[0] = rol(seed[0], a) ^ seed[1] ^ (seed[1] << b);
  49. ;     seed[1] = rol(seed[1], c);
  50. ;  
  51. ;  
  52. ;     return result - 1;
  53. ; }
RAW Paste Data