Commit e33826f0 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Add assembly CRYPTO_memcmp.



GH: #102

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
parent 2e6d7799
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -134,6 +134,34 @@ OPENSSL_cleanse:
	bne	$17,.Little
.Ldone: ret	($26)
.end	OPENSSL_cleanse

.globl	CRYPTO_memcmp
.ent	CRYPTO_memcmp
CRYPTO_memcmp:
	.frame	$30,0,$26
	.prologue 0
	xor	$0,$0,$0
	beq	$18,.Lno_data

	xor	$1,$1,$1
	nop
.Loop_cmp:
	ldq_u	$2,0($16)
	subq	$18,1,$18
	ldq_u	$3,0($17)
	extbl	$2,$16,$2
	lda	$16,1($16)
	extbl	$3,$17,$3
	lda	$17,1($17)
	xor	$3,$2,$2
	or	$2,$0,$0
	bne	$18,.Loop_cmp

	subq	$31,$0,$0
	srl	$0,63,$0
.Lno_data:
	ret	($26)
.end	CRYPTO_memcmp
___
{
my ($out,$cnt,$max)=("\$16","\$17","\$18");
+20 −0
Original line number Diff line number Diff line
@@ -100,6 +100,26 @@ OPENSSL_cleanse:
	cbnz	x1,.Little	// len!=0?
	ret
.size	OPENSSL_cleanse,.-OPENSSL_cleanse

.globl	CRYPTO_memcmp
.type	CRYPTO_memcmp,%function
.align	4
CRYPTO_memcmp:
	eor	w3,w3,w3
	cbz	x2,.Lno_data	// len==0?
.Loop_cmp:
	ldrb	w4,[x0],#1
	ldrb	w5,[x1],#1
	eor	w4,w4,w5
	orr	w3,w3,w4
	subs	x2,x2,#1
	b.ne	.Loop_cmp

.Lno_data:
	neg	w0,w3
	lsr	w0,w0,#31
	ret
.size	CRYPTO_memcmp,.-CRYPTO_memcmp
___

print $code;
+30 −0
Original line number Diff line number Diff line
@@ -105,6 +105,36 @@ OPENSSL_cleanse:
#endif
.size	OPENSSL_cleanse,.-OPENSSL_cleanse

.global	CRYPTO_memcmp
.type	CRYPTO_memcmp,%function
.align	4
CRYPTO_memcmp:
	eor	ip,ip,ip
	cmp	r2,#0
	beq	.Lno_data
	stmdb	sp!,{r4,r5}

.Loop_cmp:
	ldrb	r4,[r0],#1
	ldrb	r5,[r1],#1
	eor	r4,r4,r5
	orr	ip,ip,r4
	subs	r2,r2,#1
	bne	.Loop_cmp

	ldmia	sp!,{r4,r5}
.Lno_data:
	neg	r0,ip
	mov	r0,r0,lsr#31
#if __ARM_ARCH__>=5
	bx	lr
#else
	tst	lr,#1
	moveq	pc,lr
	.word	0xe12fff1e	@ bx	lr
#endif
.size	CRYPTO_memcmp,.-CRYPTO_memcmp

#if __ARM_MAX_ARCH__>=7
.arch	armv7-a
.fpu	neon
+24 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ $code.=<<___;
	.if	__TI_EABI__
	.asg	OPENSSL_rdtsc,_OPENSSL_rdtsc
	.asg	OPENSSL_cleanse,_OPENSSL_cleanse
	.asg	CRYPTO_memcmp,_CRYPTO_memcmp
	.asg	OPENSSL_atomic_add,_OPENSSL_atomic_add
	.asg	OPENSSL_wipe_cpu,_OPENSSL_wipe_cpu
	.asg	OPENSSL_instrument_bus,_OPENSSL_instrument_bus
@@ -87,6 +88,29 @@ _OPENSSL_cleanse:
   [A1]	STB	A2,*A4++[2]
	.endasmfunc

	.global	_CRYPTO_memcmp
_CRYPTO_memcmp:
	.asmfunc
	MV	A6,B0
  [!B0]	BNOP	RA
||[!B0]	ZERO	A4
   [B0]	MVC	B0,ILC
|| [B0]	ZERO	A0
	NOP	4

	SPLOOP	1
	LDBU	*A4++,A1
||	LDBU	*B4++,B1
	NOP	4
	XOR.L	B1,A1,A2
	SPKERNEL 1,0
||	OR.S	A2,A0,A0

	BNOP	RA,3
	ZERO.L	A4
  [A0]	MVK	1,A4
	.endasmfunc

	.global	_OPENSSL_atomic_add
_OPENSSL_atomic_add:
	.asmfunc
+2 −0
Original line number Diff line number Diff line
@@ -316,6 +316,7 @@ void OPENSSL_die(const char *message, const char *file, int line)
#endif
}

#if !defined(OPENSSL_CPUID_OBJ)
/* volatile unsigned char* pointers are there because
 * 1. Accessing a variable declared volatile via a pointer
 *    that lacks a volatile qualifier causes undefined behavior.
@@ -347,3 +348,4 @@ int CRYPTO_memcmp(const volatile void * volatile in_a,

    return x;
}
#endif
Loading