; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 

include listing.inc

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC	XXH_256
EXTRN	memcpy:PROC
pdata	SEGMENT
$pdata$XXH_256 DD imagerel $LN11
	DD	imagerel $LN11+385
	DD	imagerel $unwind$XXH_256
pdata	ENDS
xdata	SEGMENT
$unwind$XXH_256 DD 0a1a01H
	DD	09741aH
	DD	08641aH
	DD	07541aH
	DD	06341aH
	DD	0c016321aH
; Function compile flags: /Ogtpy
; File d:\downloads\_2013_jun-03\fsbench-0.13.3_kaze\src\codecs\xxhash256.c
xdata	ENDS
_TEXT	SEGMENT
input$ = 48
len$ = 56
out$ = 64
XXH_256	PROC

; 66   : {

$LN11:
  00000	48 89 5c 24 08	 mov	 QWORD PTR [rsp+8], rbx
  00005	48 89 6c 24 10	 mov	 QWORD PTR [rsp+16], rbp
  0000a	48 89 74 24 18	 mov	 QWORD PTR [rsp+24], rsi
  0000f	48 89 7c 24 20	 mov	 QWORD PTR [rsp+32], rdi
  00014	41 54		 push	 r12
  00016	48 83 ec 20	 sub	 rsp, 32			; 00000020H
  0001a	48 8b da	 mov	 rbx, rdx
  0001d	4d 8b e0	 mov	 r12, r8

; 67   :     const uint8_t* p = (uint8_t*)input;
; 68   :     const uint8_t* const bEnd = p + len;

  00020	4c 8d 04 11	 lea	 r8, QWORD PTR [rcx+rdx]

; 69   :     uint64_t v1 = len * PRIME;

  00024	49 b9 b9 7b 4a
	7f b9 79 37 9e	 mov	 r9, -7046029254386353223 ; 9e3779b97f4a7bb9H

; 70   :     uint64_t v2 = v1;
; 71   :     uint64_t v3 = v1;
; 72   :     uint64_t v4 = v1;
; 73   : 
; 74   :     const size_t big_loop_step = 4 * 4 * sizeof(uint64_t);
; 75   :     const size_t small_loop_step = 4 * sizeof(uint64_t);
; 76   :     // Set the big loop limit early enough, so the well-mixing small loop can be executed twice after it
; 77   :     const uint8_t* const big_loop_limit   = bEnd - big_loop_step - 2 * small_loop_step;

  0002e	49 8d 90 40 ff
	ff ff		 lea	 rdx, QWORD PTR [r8-192]

; 78   :     const uint8_t* const small_loop_limit = bEnd - small_loop_step;

  00035	49 8d 40 e0	 lea	 rax, QWORD PTR [r8-32]
  00039	49 0f af d9	 imul	 rbx, r9
  0003d	48 8b f3	 mov	 rsi, rbx
  00040	48 8b eb	 mov	 rbp, rbx
  00043	48 8b fb	 mov	 rdi, rbx

; 79   : 
; 80   :     while (p < big_loop_limit)

  00046	48 3b ca	 cmp	 rcx, rdx
  00049	0f 83 aa 00 00
	00		 jae	 $LN8@XXH_256
  0004f	90		 npad	 1
$LL4@XXH_256:

; 81   :     {
; 82   :         v1 = _rotl(v1, 29) + (*(uint64_t*)p); p+=sizeof(uint64_t);

  00050	48 c1 c3 1d	 rol	 rbx, 29

; 83   :         v2 = _rotl(v2, 31) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 84   :         v3 = _rotl(v3, 33) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 85   :         v4 = _rotl(v4, 35) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 86   :         v1 += v2 *= PRIME;
; 87   :         v1 = _rotl(v1, 29) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 88   :         v2 = _rotl(v2, 31) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 89   :         v3 = _rotl(v3, 33) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 90   :         v4 = _rotl(v4, 35) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 91   :         v2 += v3 *= PRIME;
; 92   :         v1 = _rotl(v1, 29) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 93   :         v2 = _rotl(v2, 31) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 94   :         v3 = _rotl(v3, 33) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 95   :         v4 = _rotl(v4, 35) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 96   :         v3 += v4 *= PRIME;
; 97   :         v1 = _rotl(v1, 29) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 98   :         v2 = _rotl(v2, 31) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 99   :         v3 = _rotl(v3, 33) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 100  :         v4 = _rotl(v4, 35) + (*(uint64_t*)p); p+=sizeof(uint64_t);

  00054	48 83 e9 80	 sub	 rcx, -128		; ffffffffffffff80H
  00058	48 03 59 80	 add	 rbx, QWORD PTR [rcx-128]
  0005c	48 c1 c6 1f	 rol	 rsi, 31
  00060	48 03 71 88	 add	 rsi, QWORD PTR [rcx-120]
  00064	48 c1 cd 1f	 ror	 rbp, 31
  00068	48 03 69 90	 add	 rbp, QWORD PTR [rcx-112]
  0006c	48 c1 cf 1d	 ror	 rdi, 29
  00070	48 03 79 98	 add	 rdi, QWORD PTR [rcx-104]
  00074	49 0f af f1	 imul	 rsi, r9
  00078	48 03 de	 add	 rbx, rsi
  0007b	48 c1 c3 1d	 rol	 rbx, 29
  0007f	48 03 59 a0	 add	 rbx, QWORD PTR [rcx-96]
  00083	48 c1 c6 1f	 rol	 rsi, 31
  00087	48 03 71 a8	 add	 rsi, QWORD PTR [rcx-88]
  0008b	48 c1 cd 1f	 ror	 rbp, 31
  0008f	48 03 69 b0	 add	 rbp, QWORD PTR [rcx-80]
  00093	48 c1 cf 1d	 ror	 rdi, 29
  00097	48 03 79 b8	 add	 rdi, QWORD PTR [rcx-72]
  0009b	49 0f af e9	 imul	 rbp, r9
  0009f	48 03 f5	 add	 rsi, rbp
  000a2	48 c1 c3 1d	 rol	 rbx, 29
  000a6	48 03 59 c0	 add	 rbx, QWORD PTR [rcx-64]
  000aa	48 c1 c6 1f	 rol	 rsi, 31
  000ae	48 03 71 c8	 add	 rsi, QWORD PTR [rcx-56]
  000b2	48 c1 cd 1f	 ror	 rbp, 31
  000b6	48 03 69 d0	 add	 rbp, QWORD PTR [rcx-48]
  000ba	48 c1 cf 1d	 ror	 rdi, 29
  000be	48 03 79 d8	 add	 rdi, QWORD PTR [rcx-40]
  000c2	49 0f af f9	 imul	 rdi, r9
  000c6	48 c1 c3 1d	 rol	 rbx, 29
  000ca	48 03 59 e0	 add	 rbx, QWORD PTR [rcx-32]
  000ce	48 c1 c6 1f	 rol	 rsi, 31
  000d2	48 03 71 e8	 add	 rsi, QWORD PTR [rcx-24]
  000d6	48 03 ef	 add	 rbp, rdi
  000d9	48 c1 cd 1f	 ror	 rbp, 31

; 101  :         v4 += v1 *= PRIME;

  000dd	49 0f af d9	 imul	 rbx, r9
  000e1	48 03 69 f0	 add	 rbp, QWORD PTR [rcx-16]
  000e5	48 c1 cf 1d	 ror	 rdi, 29
  000e9	48 03 79 f8	 add	 rdi, QWORD PTR [rcx-8]
  000ed	48 03 fb	 add	 rdi, rbx
  000f0	48 3b ca	 cmp	 rcx, rdx
  000f3	0f 82 57 ff ff
	ff		 jb	 $LL4@XXH_256
$LN8@XXH_256:

; 102  :     }
; 103  : 
; 104  :     while (p < small_loop_limit)

  000f9	48 3b c8	 cmp	 rcx, rax
  000fc	73 47		 jae	 SHORT $LN1@XXH_256
  000fe	66 90		 npad	 2
$LL2@XXH_256:

; 105  :     {
; 106  :         v1 = _rotl(v1, 29) + (*(uint64_t*)p); p+=sizeof(uint64_t);

  00100	48 c1 c3 1d	 rol	 rbx, 29

; 107  :         v2 += v1 *= PRIME;
; 108  :         v2 = _rotl(v2, 31) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 109  :         v3 += v2 *= PRIME;
; 110  :         v3 = _rotl(v3, 33) + (*(uint64_t*)p); p+=sizeof(uint64_t);
; 111  :         v4 += v3 *= PRIME;
; 112  :         v4 = _rotl(v4, 35) + (*(uint64_t*)p); p+=sizeof(uint64_t);

  00104	48 83 c1 20	 add	 rcx, 32			; 00000020H
  00108	48 03 59 e0	 add	 rbx, QWORD PTR [rcx-32]
  0010c	49 0f af d9	 imul	 rbx, r9
  00110	48 03 f3	 add	 rsi, rbx
  00113	48 c1 c6 1f	 rol	 rsi, 31
  00117	48 03 71 e8	 add	 rsi, QWORD PTR [rcx-24]
  0011b	49 0f af f1	 imul	 rsi, r9
  0011f	48 03 ee	 add	 rbp, rsi
  00122	48 c1 cd 1f	 ror	 rbp, 31
  00126	48 03 69 f0	 add	 rbp, QWORD PTR [rcx-16]
  0012a	49 0f af e9	 imul	 rbp, r9
  0012e	48 03 fd	 add	 rdi, rbp
  00131	48 c1 cf 1d	 ror	 rdi, 29
  00135	48 03 79 f8	 add	 rdi, QWORD PTR [rcx-8]

; 113  :         v1 += v4 *= PRIME;

  00139	49 0f af f9	 imul	 rdi, r9
  0013d	48 03 df	 add	 rbx, rdi
  00140	48 3b c8	 cmp	 rcx, rax
  00143	72 bb		 jb	 SHORT $LL2@XXH_256
$LN1@XXH_256:

; 114  :     }
; 115  :     memcpy(out, p, bEnd - p);

  00145	4c 2b c1	 sub	 r8, rcx
  00148	48 8b d1	 mov	 rdx, rcx
  0014b	49 8b cc	 mov	 rcx, r12
  0014e	e8 00 00 00 00	 call	 memcpy

; 116  : 
; 117  :     out[0] += v1;

  00153	49 01 1c 24	 add	 QWORD PTR [r12], rbx

; 118  :     out[1] += v2;

  00157	49 01 74 24 08	 add	 QWORD PTR [r12+8], rsi

; 119  :     out[2] += v3;

  0015c	49 01 6c 24 10	 add	 QWORD PTR [r12+16], rbp

; 120  :     out[3] += v4;

  00161	49 01 7c 24 18	 add	 QWORD PTR [r12+24], rdi

; 121  : }

  00166	48 8b 5c 24 30	 mov	 rbx, QWORD PTR [rsp+48]
  0016b	48 8b 7c 24 48	 mov	 rdi, QWORD PTR [rsp+72]
  00170	48 8b 6c 24 38	 mov	 rbp, QWORD PTR [rsp+56]
  00175	48 8b 74 24 40	 mov	 rsi, QWORD PTR [rsp+64]
  0017a	48 83 c4 20	 add	 rsp, 32			; 00000020H
  0017e	41 5c		 pop	 r12
  00180	c3		 ret	 0
XXH_256	ENDP
_TEXT	ENDS
END
