147 lines
3.3 KiB
C
Executable File
147 lines
3.3 KiB
C
Executable File
/*
|
|
|
|
This program is part of the TACLeBench benchmark suite.
|
|
Version V 1.x
|
|
|
|
Name: memhelper.c
|
|
|
|
Author: Torbjorn Granlund
|
|
|
|
NIST Secure Hash Algorithm
|
|
|
|
Copy block beginning at SRCP to
|
|
block beginning at DSTP with LEN `op_t' words (not LEN bytes!).
|
|
Both SRCP and DSTP should be aligned for memory operations on `op_t's.
|
|
|
|
Source: GNU C Library
|
|
|
|
Changes: no major functional changes
|
|
|
|
License: Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc.
|
|
*/
|
|
|
|
#include "memhelper.h"
|
|
int printf(const char * restrict format, ... );
|
|
/* sha_wordcopy_fwd_aligned -- Copy block beginning at SRCP to
|
|
block beginning at DSTP with LEN `op_t' words (not LEN bytes!).
|
|
Both SRCP and DSTP should be aligned for memory operations on `op_t's.
|
|
*/
|
|
|
|
void sha_wordcopy_fwd_aligned( long int dstp, long int srcp, size_t len )
|
|
{
|
|
op_t a0 = 0;
|
|
op_t a1 = 0;
|
|
char switch_target;
|
|
|
|
switch ( len % 8 ) {
|
|
case 2:
|
|
a0 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 6 * OPSIZ;
|
|
dstp -= 7 * OPSIZ;
|
|
len += 6;
|
|
switch_target = 1;
|
|
break;
|
|
case 3:
|
|
a1 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 5 * OPSIZ;
|
|
dstp -= 6 * OPSIZ;
|
|
len += 5;
|
|
switch_target = 2;
|
|
break;
|
|
case 4:
|
|
a0 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 4 * OPSIZ;
|
|
dstp -= 5 * OPSIZ;
|
|
len += 4;
|
|
switch_target = 3;
|
|
break;
|
|
case 5:
|
|
a1 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 3 * OPSIZ;
|
|
dstp -= 4 * OPSIZ;
|
|
len += 3;
|
|
switch_target = 4;
|
|
break;
|
|
case 6:
|
|
a0 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 2 * OPSIZ;
|
|
dstp -= 3 * OPSIZ;
|
|
len += 2;
|
|
switch_target = 5;
|
|
break;
|
|
case 7:
|
|
a1 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 1 * OPSIZ;
|
|
dstp -= 2 * OPSIZ;
|
|
len += 1;
|
|
switch_target = 6;
|
|
break;
|
|
case 0:
|
|
if ( OP_T_THRES <= 3 * OPSIZ && len == 0 )
|
|
return;
|
|
a0 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= 0 * OPSIZ;
|
|
dstp -= 1 * OPSIZ;
|
|
switch_target = 7;
|
|
break;
|
|
case 1:
|
|
a1 = ( ( op_t * ) srcp )[ 0 ];
|
|
srcp -= -1 * OPSIZ;
|
|
dstp -= 0 * OPSIZ;
|
|
len -= 1;
|
|
if ( OP_T_THRES <= 3 * OPSIZ && len == 0 ) {
|
|
( ( op_t * ) dstp )[ 0 ] = a1;
|
|
return;
|
|
} else {
|
|
switch_target = 8;
|
|
break;
|
|
}
|
|
}
|
|
|
|
_Pragma( "loopbound min 1 max 2" ) //max 1
|
|
do {
|
|
switch ( switch_target ) {
|
|
case 8:
|
|
a0 = ( ( op_t * ) srcp )[ 0 ];
|
|
( ( op_t * ) dstp )[ 0 ] = a1;
|
|
break;
|
|
case 7:
|
|
a1 = ( ( op_t * ) srcp )[ 1 ];
|
|
( ( op_t * ) dstp )[ 1 ] = a0;
|
|
break;
|
|
case 6:
|
|
a0 = ( ( op_t * ) srcp )[ 2 ];
|
|
( ( op_t * ) dstp )[ 2 ] = a1;
|
|
break;
|
|
case 5:
|
|
a1 = ( ( op_t * ) srcp )[ 3 ];
|
|
( ( op_t * ) dstp )[ 3 ] = a0;
|
|
break;
|
|
case 4:
|
|
a0 = ( ( op_t * ) srcp )[ 4 ];
|
|
( ( op_t * ) dstp )[ 4 ] = a1;
|
|
break;
|
|
case 3:
|
|
a1 = ( ( op_t * ) srcp )[ 5 ];
|
|
( ( op_t * ) dstp )[ 5 ] = a0;
|
|
break;
|
|
case 2:
|
|
a0 = ( ( op_t * ) srcp )[ 6 ];
|
|
( ( op_t * ) dstp )[ 6 ] = a1;
|
|
break;
|
|
case 1:
|
|
a1 = ( ( op_t * ) srcp )[ 7 ];
|
|
( ( op_t * ) dstp )[ 7 ] = a0;
|
|
break;
|
|
}
|
|
|
|
srcp += 8 * OPSIZ;
|
|
dstp += 8 * OPSIZ;
|
|
len -= 8;
|
|
switch_target = 8;
|
|
} while ( len != 0 );
|
|
|
|
( ( op_t * ) dstp )[ 0 ] = a1;
|
|
}
|
|
|