File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / lib / md5-asm-x86_64.S
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 3 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    1: /*
    2:  * x86-64 optimized assembler MD5 implementation
    3:  *
    4:  * Author: Marc Bevand, 2004
    5:  *
    6:  * This code was placed in the public domain by the author. The original
    7:  * publication can be found at:
    8:  *
    9:  * https://www.zorinaq.com/papers/md5-amd64.html
   10:  */
   11: /*
   12:  * No modifications were made aside from changing the function and file names.
   13:  * The MD5_CTX structure as expected here (from OpenSSL) is binary compatible
   14:  * with the md_context used by rsync, for the fields accessed.
   15:  *
   16:  * Benchmarks (in MB/s)            C     ASM
   17:  * - Intel Atom D2700            302     334
   18:  * - Intel i7-7700hq             351     376
   19:  * - AMD ThreadRipper 2950x      728     784
   20:  *
   21:  * The original code was also incorporated into OpenSSL. It has since been
   22:  * modified there. Those changes have not been made here due to licensing
   23:  * incompatibilities. Benchmarks of those changes on the above CPUs did not
   24:  * show any significant difference in performance, though.
   25:  */
   26: 
   27: #include "config.h"
   28: #include "md-defines.h"
   29: 
   30: #if !defined USE_OPENSSL && CSUM_CHUNK == 64
   31: 
   32: #ifdef __APPLE__
   33: #define md5_process_asm _md5_process_asm
   34: #endif
   35: 
   36: .text
   37: .align 16
   38: 
   39: .globl md5_process_asm
   40: md5_process_asm:
   41: 	push	%rbp
   42: 	push	%rbx
   43: 	push	%r12
   44: 	push	%r13			# not really useful (r13 is unused)
   45: 	push	%r14
   46: 	push	%r15
   47: 
   48: 	# rdi = arg #1 (ctx, MD5_CTX pointer)
   49: 	# rsi = arg #2 (ptr, data pointer)
   50: 	# rdx = arg #3 (nbr, number of 16-word blocks to process)
   51: 	mov	%rdi,		%rbp	# rbp = ctx
   52: 	shl	$6,		%rdx	# rdx = nbr in bytes
   53: 	lea	(%rsi,%rdx),	%rdi	# rdi = end
   54: 	mov	0*4(%rbp),	%eax	# eax = ctx->A
   55: 	mov	1*4(%rbp),	%ebx	# ebx = ctx->B
   56: 	mov	2*4(%rbp),	%ecx	# ecx = ctx->C
   57: 	mov	3*4(%rbp),	%edx	# edx = ctx->D
   58: 	# end is 'rdi'
   59: 	# ptr is 'rsi'
   60: 	# A is 'eax'
   61: 	# B is 'ebx'
   62: 	# C is 'ecx'
   63: 	# D is 'edx'
   64: 
   65: 	cmp	%rdi,		%rsi		# cmp end with ptr
   66: 	je	1f				# jmp if ptr == end
   67: 
   68: 	# BEGIN of loop over 16-word blocks
   69: 2:	# save old values of A, B, C, D
   70: 	mov	%eax,		%r8d
   71: 	mov	%ebx,		%r9d
   72: 	mov	%ecx,		%r14d
   73: 	mov	%edx,		%r15d
   74:  mov	0*4(%rsi),	%r10d		/* (NEXT STEP) X[0] */
   75:  mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
   76: 	xor	%ecx,		%r11d		/* y ^ ... */
   77: 	lea	-680876936(%eax,%r10d),%eax		/* Const + dst + ... */
   78: 	and	%ebx,		%r11d		/* x & ... */
   79: 	xor	%edx,		%r11d		/* z ^ ... */
   80: 	mov	1*4(%rsi),%r10d		/* (NEXT STEP) X[1] */
   81: 	add	%r11d,		%eax		/* dst += ... */
   82: 	rol	$7,		%eax		/* dst <<< s */
   83: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
   84: 	add	%ebx,		%eax		/* dst += x */
   85: 	xor	%ebx,		%r11d		/* y ^ ... */
   86: 	lea	-389564586(%edx,%r10d),%edx		/* Const + dst + ... */
   87: 	and	%eax,		%r11d		/* x & ... */
   88: 	xor	%ecx,		%r11d		/* z ^ ... */
   89: 	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
   90: 	add	%r11d,		%edx		/* dst += ... */
   91: 	rol	$12,		%edx		/* dst <<< s */
   92: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
   93: 	add	%eax,		%edx		/* dst += x */
   94: 	xor	%eax,		%r11d		/* y ^ ... */
   95: 	lea	606105819(%ecx,%r10d),%ecx		/* Const + dst + ... */
   96: 	and	%edx,		%r11d		/* x & ... */
   97: 	xor	%ebx,		%r11d		/* z ^ ... */
   98: 	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
   99: 	add	%r11d,		%ecx		/* dst += ... */
  100: 	rol	$17,		%ecx		/* dst <<< s */
  101: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  102: 	add	%edx,		%ecx		/* dst += x */
  103: 	xor	%edx,		%r11d		/* y ^ ... */
  104: 	lea	-1044525330(%ebx,%r10d),%ebx		/* Const + dst + ... */
  105: 	and	%ecx,		%r11d		/* x & ... */
  106: 	xor	%eax,		%r11d		/* z ^ ... */
  107: 	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
  108: 	add	%r11d,		%ebx		/* dst += ... */
  109: 	rol	$22,		%ebx		/* dst <<< s */
  110: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  111: 	add	%ecx,		%ebx		/* dst += x */
  112: 	xor	%ecx,		%r11d		/* y ^ ... */
  113: 	lea	-176418897(%eax,%r10d),%eax		/* Const + dst + ... */
  114: 	and	%ebx,		%r11d		/* x & ... */
  115: 	xor	%edx,		%r11d		/* z ^ ... */
  116: 	mov	5*4(%rsi),%r10d		/* (NEXT STEP) X[5] */
  117: 	add	%r11d,		%eax		/* dst += ... */
  118: 	rol	$7,		%eax		/* dst <<< s */
  119: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  120: 	add	%ebx,		%eax		/* dst += x */
  121: 	xor	%ebx,		%r11d		/* y ^ ... */
  122: 	lea	1200080426(%edx,%r10d),%edx		/* Const + dst + ... */
  123: 	and	%eax,		%r11d		/* x & ... */
  124: 	xor	%ecx,		%r11d		/* z ^ ... */
  125: 	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
  126: 	add	%r11d,		%edx		/* dst += ... */
  127: 	rol	$12,		%edx		/* dst <<< s */
  128: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  129: 	add	%eax,		%edx		/* dst += x */
  130: 	xor	%eax,		%r11d		/* y ^ ... */
  131: 	lea	-1473231341(%ecx,%r10d),%ecx		/* Const + dst + ... */
  132: 	and	%edx,		%r11d		/* x & ... */
  133: 	xor	%ebx,		%r11d		/* z ^ ... */
  134: 	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
  135: 	add	%r11d,		%ecx		/* dst += ... */
  136: 	rol	$17,		%ecx		/* dst <<< s */
  137: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  138: 	add	%edx,		%ecx		/* dst += x */
  139: 	xor	%edx,		%r11d		/* y ^ ... */
  140: 	lea	-45705983(%ebx,%r10d),%ebx		/* Const + dst + ... */
  141: 	and	%ecx,		%r11d		/* x & ... */
  142: 	xor	%eax,		%r11d		/* z ^ ... */
  143: 	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
  144: 	add	%r11d,		%ebx		/* dst += ... */
  145: 	rol	$22,		%ebx		/* dst <<< s */
  146: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  147: 	add	%ecx,		%ebx		/* dst += x */
  148: 	xor	%ecx,		%r11d		/* y ^ ... */
  149: 	lea	1770035416(%eax,%r10d),%eax		/* Const + dst + ... */
  150: 	and	%ebx,		%r11d		/* x & ... */
  151: 	xor	%edx,		%r11d		/* z ^ ... */
  152: 	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
  153: 	add	%r11d,		%eax		/* dst += ... */
  154: 	rol	$7,		%eax		/* dst <<< s */
  155: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  156: 	add	%ebx,		%eax		/* dst += x */
  157: 	xor	%ebx,		%r11d		/* y ^ ... */
  158: 	lea	-1958414417(%edx,%r10d),%edx		/* Const + dst + ... */
  159: 	and	%eax,		%r11d		/* x & ... */
  160: 	xor	%ecx,		%r11d		/* z ^ ... */
  161: 	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
  162: 	add	%r11d,		%edx		/* dst += ... */
  163: 	rol	$12,		%edx		/* dst <<< s */
  164: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  165: 	add	%eax,		%edx		/* dst += x */
  166: 	xor	%eax,		%r11d		/* y ^ ... */
  167: 	lea	-42063(%ecx,%r10d),%ecx		/* Const + dst + ... */
  168: 	and	%edx,		%r11d		/* x & ... */
  169: 	xor	%ebx,		%r11d		/* z ^ ... */
  170: 	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
  171: 	add	%r11d,		%ecx		/* dst += ... */
  172: 	rol	$17,		%ecx		/* dst <<< s */
  173: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  174: 	add	%edx,		%ecx		/* dst += x */
  175: 	xor	%edx,		%r11d		/* y ^ ... */
  176: 	lea	-1990404162(%ebx,%r10d),%ebx		/* Const + dst + ... */
  177: 	and	%ecx,		%r11d		/* x & ... */
  178: 	xor	%eax,		%r11d		/* z ^ ... */
  179: 	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
  180: 	add	%r11d,		%ebx		/* dst += ... */
  181: 	rol	$22,		%ebx		/* dst <<< s */
  182: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  183: 	add	%ecx,		%ebx		/* dst += x */
  184: 	xor	%ecx,		%r11d		/* y ^ ... */
  185: 	lea	1804603682(%eax,%r10d),%eax		/* Const + dst + ... */
  186: 	and	%ebx,		%r11d		/* x & ... */
  187: 	xor	%edx,		%r11d		/* z ^ ... */
  188: 	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
  189: 	add	%r11d,		%eax		/* dst += ... */
  190: 	rol	$7,		%eax		/* dst <<< s */
  191: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  192: 	add	%ebx,		%eax		/* dst += x */
  193: 	xor	%ebx,		%r11d		/* y ^ ... */
  194: 	lea	-40341101(%edx,%r10d),%edx		/* Const + dst + ... */
  195: 	and	%eax,		%r11d		/* x & ... */
  196: 	xor	%ecx,		%r11d		/* z ^ ... */
  197: 	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
  198: 	add	%r11d,		%edx		/* dst += ... */
  199: 	rol	$12,		%edx		/* dst <<< s */
  200: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  201: 	add	%eax,		%edx		/* dst += x */
  202: 	xor	%eax,		%r11d		/* y ^ ... */
  203: 	lea	-1502002290(%ecx,%r10d),%ecx		/* Const + dst + ... */
  204: 	and	%edx,		%r11d		/* x & ... */
  205: 	xor	%ebx,		%r11d		/* z ^ ... */
  206: 	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
  207: 	add	%r11d,		%ecx		/* dst += ... */
  208: 	rol	$17,		%ecx		/* dst <<< s */
  209: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  210: 	add	%edx,		%ecx		/* dst += x */
  211: 	xor	%edx,		%r11d		/* y ^ ... */
  212: 	lea	1236535329(%ebx,%r10d),%ebx		/* Const + dst + ... */
  213: 	and	%ecx,		%r11d		/* x & ... */
  214: 	xor	%eax,		%r11d		/* z ^ ... */
  215: 	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
  216: 	add	%r11d,		%ebx		/* dst += ... */
  217: 	rol	$22,		%ebx		/* dst <<< s */
  218: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  219: 	add	%ecx,		%ebx		/* dst += x */
  220:  mov	1*4(%rsi),	%r10d		/* (NEXT STEP) X[1] */
  221:  mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  222:  mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
  223: 	not	%r11d				/* not z */
  224: 	lea	-165796510(%eax,%r10d),%eax		/* Const + dst + ... */
  225: 	and	%ebx,		%r12d		/* x & z */
  226: 	and	%ecx,		%r11d		/* y & (not z) */
  227: 	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
  228: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  229: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  230: 	add	%r12d,		%eax		/* dst += ... */
  231: 	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
  232: 	rol	$5,		%eax		/* dst <<< s */
  233: 	add	%ebx,		%eax		/* dst += x */
  234: 	not	%r11d				/* not z */
  235: 	lea	-1069501632(%edx,%r10d),%edx		/* Const + dst + ... */
  236: 	and	%eax,		%r12d		/* x & z */
  237: 	and	%ebx,		%r11d		/* y & (not z) */
  238: 	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
  239: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  240: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  241: 	add	%r12d,		%edx		/* dst += ... */
  242: 	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
  243: 	rol	$9,		%edx		/* dst <<< s */
  244: 	add	%eax,		%edx		/* dst += x */
  245: 	not	%r11d				/* not z */
  246: 	lea	643717713(%ecx,%r10d),%ecx		/* Const + dst + ... */
  247: 	and	%edx,		%r12d		/* x & z */
  248: 	and	%eax,		%r11d		/* y & (not z) */
  249: 	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
  250: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  251: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  252: 	add	%r12d,		%ecx		/* dst += ... */
  253: 	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
  254: 	rol	$14,		%ecx		/* dst <<< s */
  255: 	add	%edx,		%ecx		/* dst += x */
  256: 	not	%r11d				/* not z */
  257: 	lea	-373897302(%ebx,%r10d),%ebx		/* Const + dst + ... */
  258: 	and	%ecx,		%r12d		/* x & z */
  259: 	and	%edx,		%r11d		/* y & (not z) */
  260: 	mov	5*4(%rsi),%r10d		/* (NEXT STEP) X[5] */
  261: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  262: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  263: 	add	%r12d,		%ebx		/* dst += ... */
  264: 	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
  265: 	rol	$20,		%ebx		/* dst <<< s */
  266: 	add	%ecx,		%ebx		/* dst += x */
  267: 	not	%r11d				/* not z */
  268: 	lea	-701558691(%eax,%r10d),%eax		/* Const + dst + ... */
  269: 	and	%ebx,		%r12d		/* x & z */
  270: 	and	%ecx,		%r11d		/* y & (not z) */
  271: 	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
  272: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  273: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  274: 	add	%r12d,		%eax		/* dst += ... */
  275: 	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
  276: 	rol	$5,		%eax		/* dst <<< s */
  277: 	add	%ebx,		%eax		/* dst += x */
  278: 	not	%r11d				/* not z */
  279: 	lea	38016083(%edx,%r10d),%edx		/* Const + dst + ... */
  280: 	and	%eax,		%r12d		/* x & z */
  281: 	and	%ebx,		%r11d		/* y & (not z) */
  282: 	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
  283: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  284: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  285: 	add	%r12d,		%edx		/* dst += ... */
  286: 	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
  287: 	rol	$9,		%edx		/* dst <<< s */
  288: 	add	%eax,		%edx		/* dst += x */
  289: 	not	%r11d				/* not z */
  290: 	lea	-660478335(%ecx,%r10d),%ecx		/* Const + dst + ... */
  291: 	and	%edx,		%r12d		/* x & z */
  292: 	and	%eax,		%r11d		/* y & (not z) */
  293: 	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
  294: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  295: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  296: 	add	%r12d,		%ecx		/* dst += ... */
  297: 	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
  298: 	rol	$14,		%ecx		/* dst <<< s */
  299: 	add	%edx,		%ecx		/* dst += x */
  300: 	not	%r11d				/* not z */
  301: 	lea	-405537848(%ebx,%r10d),%ebx		/* Const + dst + ... */
  302: 	and	%ecx,		%r12d		/* x & z */
  303: 	and	%edx,		%r11d		/* y & (not z) */
  304: 	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
  305: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  306: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  307: 	add	%r12d,		%ebx		/* dst += ... */
  308: 	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
  309: 	rol	$20,		%ebx		/* dst <<< s */
  310: 	add	%ecx,		%ebx		/* dst += x */
  311: 	not	%r11d				/* not z */
  312: 	lea	568446438(%eax,%r10d),%eax		/* Const + dst + ... */
  313: 	and	%ebx,		%r12d		/* x & z */
  314: 	and	%ecx,		%r11d		/* y & (not z) */
  315: 	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
  316: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  317: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  318: 	add	%r12d,		%eax		/* dst += ... */
  319: 	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
  320: 	rol	$5,		%eax		/* dst <<< s */
  321: 	add	%ebx,		%eax		/* dst += x */
  322: 	not	%r11d				/* not z */
  323: 	lea	-1019803690(%edx,%r10d),%edx		/* Const + dst + ... */
  324: 	and	%eax,		%r12d		/* x & z */
  325: 	and	%ebx,		%r11d		/* y & (not z) */
  326: 	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
  327: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  328: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  329: 	add	%r12d,		%edx		/* dst += ... */
  330: 	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
  331: 	rol	$9,		%edx		/* dst <<< s */
  332: 	add	%eax,		%edx		/* dst += x */
  333: 	not	%r11d				/* not z */
  334: 	lea	-187363961(%ecx,%r10d),%ecx		/* Const + dst + ... */
  335: 	and	%edx,		%r12d		/* x & z */
  336: 	and	%eax,		%r11d		/* y & (not z) */
  337: 	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
  338: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  339: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  340: 	add	%r12d,		%ecx		/* dst += ... */
  341: 	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
  342: 	rol	$14,		%ecx		/* dst <<< s */
  343: 	add	%edx,		%ecx		/* dst += x */
  344: 	not	%r11d				/* not z */
  345: 	lea	1163531501(%ebx,%r10d),%ebx		/* Const + dst + ... */
  346: 	and	%ecx,		%r12d		/* x & z */
  347: 	and	%edx,		%r11d		/* y & (not z) */
  348: 	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
  349: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  350: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  351: 	add	%r12d,		%ebx		/* dst += ... */
  352: 	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
  353: 	rol	$20,		%ebx		/* dst <<< s */
  354: 	add	%ecx,		%ebx		/* dst += x */
  355: 	not	%r11d				/* not z */
  356: 	lea	-1444681467(%eax,%r10d),%eax		/* Const + dst + ... */
  357: 	and	%ebx,		%r12d		/* x & z */
  358: 	and	%ecx,		%r11d		/* y & (not z) */
  359: 	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
  360: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  361: 	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
  362: 	add	%r12d,		%eax		/* dst += ... */
  363: 	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
  364: 	rol	$5,		%eax		/* dst <<< s */
  365: 	add	%ebx,		%eax		/* dst += x */
  366: 	not	%r11d				/* not z */
  367: 	lea	-51403784(%edx,%r10d),%edx		/* Const + dst + ... */
  368: 	and	%eax,		%r12d		/* x & z */
  369: 	and	%ebx,		%r11d		/* y & (not z) */
  370: 	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
  371: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  372: 	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
  373: 	add	%r12d,		%edx		/* dst += ... */
  374: 	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
  375: 	rol	$9,		%edx		/* dst <<< s */
  376: 	add	%eax,		%edx		/* dst += x */
  377: 	not	%r11d				/* not z */
  378: 	lea	1735328473(%ecx,%r10d),%ecx		/* Const + dst + ... */
  379: 	and	%edx,		%r12d		/* x & z */
  380: 	and	%eax,		%r11d		/* y & (not z) */
  381: 	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
  382: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  383: 	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
  384: 	add	%r12d,		%ecx		/* dst += ... */
  385: 	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
  386: 	rol	$14,		%ecx		/* dst <<< s */
  387: 	add	%edx,		%ecx		/* dst += x */
  388: 	not	%r11d				/* not z */
  389: 	lea	-1926607734(%ebx,%r10d),%ebx		/* Const + dst + ... */
  390: 	and	%ecx,		%r12d		/* x & z */
  391: 	and	%edx,		%r11d		/* y & (not z) */
  392: 	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
  393: 	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
  394: 	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
  395: 	add	%r12d,		%ebx		/* dst += ... */
  396: 	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
  397: 	rol	$20,		%ebx		/* dst <<< s */
  398: 	add	%ecx,		%ebx		/* dst += x */
  399:  mov	5*4(%rsi),	%r10d		/* (NEXT STEP) X[5] */
  400:  mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
  401: 	lea	-378558(%eax,%r10d),%eax		/* Const + dst + ... */
  402: 	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
  403: 	xor	%edx,		%r11d		/* z ^ ... */
  404: 	xor	%ebx,		%r11d		/* x ^ ... */
  405: 	add	%r11d,		%eax		/* dst += ... */
  406: 	rol	$4,		%eax		/* dst <<< s */
  407: 	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
  408: 	add	%ebx,		%eax		/* dst += x */
  409: 	lea	-2022574463(%edx,%r10d),%edx		/* Const + dst + ... */
  410: 	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
  411: 	xor	%ecx,		%r11d		/* z ^ ... */
  412: 	xor	%eax,		%r11d		/* x ^ ... */
  413: 	add	%r11d,		%edx		/* dst += ... */
  414: 	rol	$11,		%edx		/* dst <<< s */
  415: 	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
  416: 	add	%eax,		%edx		/* dst += x */
  417: 	lea	1839030562(%ecx,%r10d),%ecx		/* Const + dst + ... */
  418: 	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
  419: 	xor	%ebx,		%r11d		/* z ^ ... */
  420: 	xor	%edx,		%r11d		/* x ^ ... */
  421: 	add	%r11d,		%ecx		/* dst += ... */
  422: 	rol	$16,		%ecx		/* dst <<< s */
  423: 	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
  424: 	add	%edx,		%ecx		/* dst += x */
  425: 	lea	-35309556(%ebx,%r10d),%ebx		/* Const + dst + ... */
  426: 	mov	1*4(%rsi),%r10d		/* (NEXT STEP) X[1] */
  427: 	xor	%eax,		%r11d		/* z ^ ... */
  428: 	xor	%ecx,		%r11d		/* x ^ ... */
  429: 	add	%r11d,		%ebx		/* dst += ... */
  430: 	rol	$23,		%ebx		/* dst <<< s */
  431: 	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
  432: 	add	%ecx,		%ebx		/* dst += x */
  433: 	lea	-1530992060(%eax,%r10d),%eax		/* Const + dst + ... */
  434: 	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
  435: 	xor	%edx,		%r11d		/* z ^ ... */
  436: 	xor	%ebx,		%r11d		/* x ^ ... */
  437: 	add	%r11d,		%eax		/* dst += ... */
  438: 	rol	$4,		%eax		/* dst <<< s */
  439: 	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
  440: 	add	%ebx,		%eax		/* dst += x */
  441: 	lea	1272893353(%edx,%r10d),%edx		/* Const + dst + ... */
  442: 	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
  443: 	xor	%ecx,		%r11d		/* z ^ ... */
  444: 	xor	%eax,		%r11d		/* x ^ ... */
  445: 	add	%r11d,		%edx		/* dst += ... */
  446: 	rol	$11,		%edx		/* dst <<< s */
  447: 	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
  448: 	add	%eax,		%edx		/* dst += x */
  449: 	lea	-155497632(%ecx,%r10d),%ecx		/* Const + dst + ... */
  450: 	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
  451: 	xor	%ebx,		%r11d		/* z ^ ... */
  452: 	xor	%edx,		%r11d		/* x ^ ... */
  453: 	add	%r11d,		%ecx		/* dst += ... */
  454: 	rol	$16,		%ecx		/* dst <<< s */
  455: 	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
  456: 	add	%edx,		%ecx		/* dst += x */
  457: 	lea	-1094730640(%ebx,%r10d),%ebx		/* Const + dst + ... */
  458: 	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
  459: 	xor	%eax,		%r11d		/* z ^ ... */
  460: 	xor	%ecx,		%r11d		/* x ^ ... */
  461: 	add	%r11d,		%ebx		/* dst += ... */
  462: 	rol	$23,		%ebx		/* dst <<< s */
  463: 	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
  464: 	add	%ecx,		%ebx		/* dst += x */
  465: 	lea	681279174(%eax,%r10d),%eax		/* Const + dst + ... */
  466: 	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
  467: 	xor	%edx,		%r11d		/* z ^ ... */
  468: 	xor	%ebx,		%r11d		/* x ^ ... */
  469: 	add	%r11d,		%eax		/* dst += ... */
  470: 	rol	$4,		%eax		/* dst <<< s */
  471: 	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
  472: 	add	%ebx,		%eax		/* dst += x */
  473: 	lea	-358537222(%edx,%r10d),%edx		/* Const + dst + ... */
  474: 	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
  475: 	xor	%ecx,		%r11d		/* z ^ ... */
  476: 	xor	%eax,		%r11d		/* x ^ ... */
  477: 	add	%r11d,		%edx		/* dst += ... */
  478: 	rol	$11,		%edx		/* dst <<< s */
  479: 	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
  480: 	add	%eax,		%edx		/* dst += x */
  481: 	lea	-722521979(%ecx,%r10d),%ecx		/* Const + dst + ... */
  482: 	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
  483: 	xor	%ebx,		%r11d		/* z ^ ... */
  484: 	xor	%edx,		%r11d		/* x ^ ... */
  485: 	add	%r11d,		%ecx		/* dst += ... */
  486: 	rol	$16,		%ecx		/* dst <<< s */
  487: 	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
  488: 	add	%edx,		%ecx		/* dst += x */
  489: 	lea	76029189(%ebx,%r10d),%ebx		/* Const + dst + ... */
  490: 	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
  491: 	xor	%eax,		%r11d		/* z ^ ... */
  492: 	xor	%ecx,		%r11d		/* x ^ ... */
  493: 	add	%r11d,		%ebx		/* dst += ... */
  494: 	rol	$23,		%ebx		/* dst <<< s */
  495: 	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
  496: 	add	%ecx,		%ebx		/* dst += x */
  497: 	lea	-640364487(%eax,%r10d),%eax		/* Const + dst + ... */
  498: 	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
  499: 	xor	%edx,		%r11d		/* z ^ ... */
  500: 	xor	%ebx,		%r11d		/* x ^ ... */
  501: 	add	%r11d,		%eax		/* dst += ... */
  502: 	rol	$4,		%eax		/* dst <<< s */
  503: 	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
  504: 	add	%ebx,		%eax		/* dst += x */
  505: 	lea	-421815835(%edx,%r10d),%edx		/* Const + dst + ... */
  506: 	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
  507: 	xor	%ecx,		%r11d		/* z ^ ... */
  508: 	xor	%eax,		%r11d		/* x ^ ... */
  509: 	add	%r11d,		%edx		/* dst += ... */
  510: 	rol	$11,		%edx		/* dst <<< s */
  511: 	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
  512: 	add	%eax,		%edx		/* dst += x */
  513: 	lea	530742520(%ecx,%r10d),%ecx		/* Const + dst + ... */
  514: 	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
  515: 	xor	%ebx,		%r11d		/* z ^ ... */
  516: 	xor	%edx,		%r11d		/* x ^ ... */
  517: 	add	%r11d,		%ecx		/* dst += ... */
  518: 	rol	$16,		%ecx		/* dst <<< s */
  519: 	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
  520: 	add	%edx,		%ecx		/* dst += x */
  521: 	lea	-995338651(%ebx,%r10d),%ebx		/* Const + dst + ... */
  522: 	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
  523: 	xor	%eax,		%r11d		/* z ^ ... */
  524: 	xor	%ecx,		%r11d		/* x ^ ... */
  525: 	add	%r11d,		%ebx		/* dst += ... */
  526: 	rol	$23,		%ebx		/* dst <<< s */
  527: 	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
  528: 	add	%ecx,		%ebx		/* dst += x */
  529:  mov	0*4(%rsi),	%r10d		/* (NEXT STEP) X[0] */
  530:  mov	$0xffffffff,	%r11d
  531:  xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx*/
  532: 	lea	-198630844(%eax,%r10d),%eax		/* Const + dst + ... */
  533: 	or	%ebx,		%r11d		/* x | ... */
  534: 	xor	%ecx,		%r11d		/* y ^ ... */
  535: 	add	%r11d,		%eax		/* dst += ... */
  536: 	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
  537: 	mov	$0xffffffff,	%r11d
  538: 	rol	$6,		%eax		/* dst <<< s */
  539: 	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
  540: 	add	%ebx,		%eax		/* dst += x */
  541: 	lea	1126891415(%edx,%r10d),%edx		/* Const + dst + ... */
  542: 	or	%eax,		%r11d		/* x | ... */
  543: 	xor	%ebx,		%r11d		/* y ^ ... */
  544: 	add	%r11d,		%edx		/* dst += ... */
  545: 	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
  546: 	mov	$0xffffffff,	%r11d
  547: 	rol	$10,		%edx		/* dst <<< s */
  548: 	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
  549: 	add	%eax,		%edx		/* dst += x */
  550: 	lea	-1416354905(%ecx,%r10d),%ecx		/* Const + dst + ... */
  551: 	or	%edx,		%r11d		/* x | ... */
  552: 	xor	%eax,		%r11d		/* y ^ ... */
  553: 	add	%r11d,		%ecx		/* dst += ... */
  554: 	mov	5*4(%rsi),%r10d		/* (NEXT STEP) X[5] */
  555: 	mov	$0xffffffff,	%r11d
  556: 	rol	$15,		%ecx		/* dst <<< s */
  557: 	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
  558: 	add	%edx,		%ecx		/* dst += x */
  559: 	lea	-57434055(%ebx,%r10d),%ebx		/* Const + dst + ... */
  560: 	or	%ecx,		%r11d		/* x | ... */
  561: 	xor	%edx,		%r11d		/* y ^ ... */
  562: 	add	%r11d,		%ebx		/* dst += ... */
  563: 	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
  564: 	mov	$0xffffffff,	%r11d
  565: 	rol	$21,		%ebx		/* dst <<< s */
  566: 	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
  567: 	add	%ecx,		%ebx		/* dst += x */
  568: 	lea	1700485571(%eax,%r10d),%eax		/* Const + dst + ... */
  569: 	or	%ebx,		%r11d		/* x | ... */
  570: 	xor	%ecx,		%r11d		/* y ^ ... */
  571: 	add	%r11d,		%eax		/* dst += ... */
  572: 	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
  573: 	mov	$0xffffffff,	%r11d
  574: 	rol	$6,		%eax		/* dst <<< s */
  575: 	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
  576: 	add	%ebx,		%eax		/* dst += x */
  577: 	lea	-1894986606(%edx,%r10d),%edx		/* Const + dst + ... */
  578: 	or	%eax,		%r11d		/* x | ... */
  579: 	xor	%ebx,		%r11d		/* y ^ ... */
  580: 	add	%r11d,		%edx		/* dst += ... */
  581: 	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
  582: 	mov	$0xffffffff,	%r11d
  583: 	rol	$10,		%edx		/* dst <<< s */
  584: 	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
  585: 	add	%eax,		%edx		/* dst += x */
  586: 	lea	-1051523(%ecx,%r10d),%ecx		/* Const + dst + ... */
  587: 	or	%edx,		%r11d		/* x | ... */
  588: 	xor	%eax,		%r11d		/* y ^ ... */
  589: 	add	%r11d,		%ecx		/* dst += ... */
  590: 	mov	1*4(%rsi),%r10d		/* (NEXT STEP) X[1] */
  591: 	mov	$0xffffffff,	%r11d
  592: 	rol	$15,		%ecx		/* dst <<< s */
  593: 	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
  594: 	add	%edx,		%ecx		/* dst += x */
  595: 	lea	-2054922799(%ebx,%r10d),%ebx		/* Const + dst + ... */
  596: 	or	%ecx,		%r11d		/* x | ... */
  597: 	xor	%edx,		%r11d		/* y ^ ... */
  598: 	add	%r11d,		%ebx		/* dst += ... */
  599: 	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
  600: 	mov	$0xffffffff,	%r11d
  601: 	rol	$21,		%ebx		/* dst <<< s */
  602: 	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
  603: 	add	%ecx,		%ebx		/* dst += x */
  604: 	lea	1873313359(%eax,%r10d),%eax		/* Const + dst + ... */
  605: 	or	%ebx,		%r11d		/* x | ... */
  606: 	xor	%ecx,		%r11d		/* y ^ ... */
  607: 	add	%r11d,		%eax		/* dst += ... */
  608: 	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
  609: 	mov	$0xffffffff,	%r11d
  610: 	rol	$6,		%eax		/* dst <<< s */
  611: 	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
  612: 	add	%ebx,		%eax		/* dst += x */
  613: 	lea	-30611744(%edx,%r10d),%edx		/* Const + dst + ... */
  614: 	or	%eax,		%r11d		/* x | ... */
  615: 	xor	%ebx,		%r11d		/* y ^ ... */
  616: 	add	%r11d,		%edx		/* dst += ... */
  617: 	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
  618: 	mov	$0xffffffff,	%r11d
  619: 	rol	$10,		%edx		/* dst <<< s */
  620: 	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
  621: 	add	%eax,		%edx		/* dst += x */
  622: 	lea	-1560198380(%ecx,%r10d),%ecx		/* Const + dst + ... */
  623: 	or	%edx,		%r11d		/* x | ... */
  624: 	xor	%eax,		%r11d		/* y ^ ... */
  625: 	add	%r11d,		%ecx		/* dst += ... */
  626: 	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
  627: 	mov	$0xffffffff,	%r11d
  628: 	rol	$15,		%ecx		/* dst <<< s */
  629: 	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
  630: 	add	%edx,		%ecx		/* dst += x */
  631: 	lea	1309151649(%ebx,%r10d),%ebx		/* Const + dst + ... */
  632: 	or	%ecx,		%r11d		/* x | ... */
  633: 	xor	%edx,		%r11d		/* y ^ ... */
  634: 	add	%r11d,		%ebx		/* dst += ... */
  635: 	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
  636: 	mov	$0xffffffff,	%r11d
  637: 	rol	$21,		%ebx		/* dst <<< s */
  638: 	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
  639: 	add	%ecx,		%ebx		/* dst += x */
  640: 	lea	-145523070(%eax,%r10d),%eax		/* Const + dst + ... */
  641: 	or	%ebx,		%r11d		/* x | ... */
  642: 	xor	%ecx,		%r11d		/* y ^ ... */
  643: 	add	%r11d,		%eax		/* dst += ... */
  644: 	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
  645: 	mov	$0xffffffff,	%r11d
  646: 	rol	$6,		%eax		/* dst <<< s */
  647: 	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
  648: 	add	%ebx,		%eax		/* dst += x */
  649: 	lea	-1120210379(%edx,%r10d),%edx		/* Const + dst + ... */
  650: 	or	%eax,		%r11d		/* x | ... */
  651: 	xor	%ebx,		%r11d		/* y ^ ... */
  652: 	add	%r11d,		%edx		/* dst += ... */
  653: 	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
  654: 	mov	$0xffffffff,	%r11d
  655: 	rol	$10,		%edx		/* dst <<< s */
  656: 	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
  657: 	add	%eax,		%edx		/* dst += x */
  658: 	lea	718787259(%ecx,%r10d),%ecx		/* Const + dst + ... */
  659: 	or	%edx,		%r11d		/* x | ... */
  660: 	xor	%eax,		%r11d		/* y ^ ... */
  661: 	add	%r11d,		%ecx		/* dst += ... */
  662: 	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
  663: 	mov	$0xffffffff,	%r11d
  664: 	rol	$15,		%ecx		/* dst <<< s */
  665: 	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
  666: 	add	%edx,		%ecx		/* dst += x */
  667: 	lea	-343485551(%ebx,%r10d),%ebx		/* Const + dst + ... */
  668: 	or	%ecx,		%r11d		/* x | ... */
  669: 	xor	%edx,		%r11d		/* y ^ ... */
  670: 	add	%r11d,		%ebx		/* dst += ... */
  671: 	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
  672: 	mov	$0xffffffff,	%r11d
  673: 	rol	$21,		%ebx		/* dst <<< s */
  674: 	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
  675: 	add	%ecx,		%ebx		/* dst += x */
  676: 	# add old values of A, B, C, D
  677: 	add	%r8d,	%eax
  678: 	add	%r9d,	%ebx
  679: 	add	%r14d,	%ecx
  680: 	add	%r15d,	%edx
  681: 
  682: 	# loop control
  683: 	add	$64,		%rsi		# ptr += 64
  684: 	cmp	%rdi,		%rsi		# cmp end with ptr
  685: 	jb	2b				# jmp if ptr < end
  686: 	# END of loop over 16-word blocks
  687: 1:
  688: 	mov	%eax,		0*4(%rbp)	# ctx->A = A
  689: 	mov	%ebx,		1*4(%rbp)	# ctx->B = B
  690: 	mov	%ecx,		2*4(%rbp)	# ctx->C = C
  691: 	mov	%edx,		3*4(%rbp)	# ctx->D = D
  692: 
  693: 	pop	%r15
  694: 	pop	%r14
  695: 	pop	%r13				# not really useful (r13 is unused)
  696: 	pop	%r12
  697: 	pop	%rbx
  698: 	pop	%rbp
  699: 	ret
  700: 
  701: #endif /* !USE_OPENSSL ... */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>