Blame crypto/c64xpluscpuid.pl

Packit c4476c
#! /usr/bin/env perl
Packit c4476c
# Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
#
Packit c4476c
# Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
# this file except in compliance with the License.  You can obtain a copy
Packit c4476c
# in the file LICENSE in the source distribution or at
Packit c4476c
# https://www.openssl.org/source/license.html
Packit c4476c
Packit c4476c
while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
Packit c4476c
open STDOUT,">$output";
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
	.text
Packit c4476c
Packit c4476c
	.if	.ASSEMBLER_VERSION<7000000
Packit c4476c
	.asg	0,__TI_EABI__
Packit c4476c
	.endif
Packit c4476c
	.if	__TI_EABI__
Packit c4476c
	.asg	OPENSSL_rdtsc,_OPENSSL_rdtsc
Packit c4476c
	.asg	OPENSSL_cleanse,_OPENSSL_cleanse
Packit c4476c
	.asg	CRYPTO_memcmp,_CRYPTO_memcmp
Packit c4476c
	.asg	OPENSSL_atomic_add,_OPENSSL_atomic_add
Packit c4476c
	.asg	OPENSSL_wipe_cpu,_OPENSSL_wipe_cpu
Packit c4476c
	.asg	OPENSSL_instrument_bus,_OPENSSL_instrument_bus
Packit c4476c
	.asg	OPENSSL_instrument_bus2,_OPENSSL_instrument_bus2
Packit c4476c
	.endif
Packit c4476c
Packit c4476c
	.asg	B3,RA
Packit c4476c
Packit c4476c
	.global	_OPENSSL_rdtsc
Packit c4476c
_OPENSSL_rdtsc:
Packit c4476c
	.asmfunc
Packit c4476c
	B	RA
Packit c4476c
	MVC	TSCL,B0
Packit c4476c
	MVC	TSCH,B1
Packit c4476c
  [!B0]	MVC	B0,TSCL		; start TSC
Packit c4476c
	MV	B0,A4
Packit c4476c
	MV	B1,A5
Packit c4476c
	.endasmfunc
Packit c4476c
Packit c4476c
	.global	_OPENSSL_cleanse
Packit c4476c
_OPENSSL_cleanse:
Packit c4476c
	.asmfunc
Packit c4476c
	ZERO	A3:A2
Packit c4476c
||	ZERO	B2
Packit c4476c
||	SHRU	B4,3,B0		; is length >= 8
Packit c4476c
||	ADD	1,A4,B6
Packit c4476c
  [!B0]	BNOP	RA
Packit c4476c
||	ZERO	A1
Packit c4476c
||	ZERO	B1
Packit c4476c
   [B0]	MVC	B0,ILC
Packit c4476c
||[!B0]	CMPLT	0,B4,A1
Packit c4476c
||[!B0]	CMPLT	1,B4,B1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
|| [B1] STB	B2,*B6++[2]
Packit c4476c
||[!B0]	CMPLT	2,B4,A1
Packit c4476c
||[!B0]	CMPLT	3,B4,B1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
|| [B1] STB	B2,*B6++[2]
Packit c4476c
||[!B0]	CMPLT	4,B4,A1
Packit c4476c
||[!B0]	CMPLT	5,B4,B1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
|| [B1] STB	B2,*B6++[2]
Packit c4476c
||[!B0]	CMPLT	6,B4,A1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
Packit c4476c
	SPLOOP	1
Packit c4476c
	STNDW	A3:A2,*A4++
Packit c4476c
||	SUB	B4,8,B4
Packit c4476c
	SPKERNEL
Packit c4476c
Packit c4476c
	MV	B4,B0		; remaining bytes
Packit c4476c
||	ADD	1,A4,B6
Packit c4476c
||	BNOP	RA
Packit c4476c
   [B0]	CMPLT	0,B0,A1
Packit c4476c
|| [B0]	CMPLT	1,B0,B1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
|| [B1] STB	B2,*B6++[2]
Packit c4476c
|| [B0]	CMPLT	2,B0,A1
Packit c4476c
|| [B0]	CMPLT	3,B0,B1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
|| [B1] STB	B2,*B6++[2]
Packit c4476c
|| [B0]	CMPLT	4,B0,A1
Packit c4476c
|| [B0]	CMPLT	5,B0,B1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
|| [B1] STB	B2,*B6++[2]
Packit c4476c
|| [B0]	CMPLT	6,B0,A1
Packit c4476c
   [A1]	STB	A2,*A4++[2]
Packit c4476c
	.endasmfunc
Packit c4476c
Packit c4476c
	.global	_CRYPTO_memcmp
Packit c4476c
_CRYPTO_memcmp:
Packit c4476c
	.asmfunc
Packit c4476c
	MV	A6,B0
Packit c4476c
  [!B0]	BNOP	RA
Packit c4476c
||[!B0]	ZERO	A4
Packit c4476c
   [B0]	MVC	B0,ILC
Packit c4476c
|| [B0]	ZERO	A0
Packit c4476c
	NOP	4
Packit c4476c
Packit c4476c
	SPLOOP	1
Packit c4476c
	LDBU	*A4++,A1
Packit c4476c
||	LDBU	*B4++,B1
Packit c4476c
	NOP	4
Packit c4476c
	XOR.L	B1,A1,A2
Packit c4476c
	SPKERNEL 1,0
Packit c4476c
||	OR.S	A2,A0,A0
Packit c4476c
Packit c4476c
	BNOP	RA,3
Packit c4476c
	ZERO.L	A4
Packit c4476c
  [A0]	MVK	1,A4
Packit c4476c
	.endasmfunc
Packit c4476c
Packit c4476c
	.global	_OPENSSL_atomic_add
Packit c4476c
_OPENSSL_atomic_add:
Packit c4476c
	.asmfunc
Packit c4476c
	MV	A4,B0
Packit c4476c
atomic_add?:
Packit c4476c
	LL	*B0,B5
Packit c4476c
	NOP	4
Packit c4476c
	ADD	B4,B5,B5
Packit c4476c
	SL	B5,*B0
Packit c4476c
	CMTL	*B0,B1
Packit c4476c
	NOP	4
Packit c4476c
  [!B1]	B	atomic_add?
Packit c4476c
   [B1]	BNOP	RA,4
Packit c4476c
	MV	B5,A4
Packit c4476c
	.endasmfunc
Packit c4476c
Packit c4476c
	.global	_OPENSSL_wipe_cpu
Packit c4476c
_OPENSSL_wipe_cpu:
Packit c4476c
	.asmfunc
Packit c4476c
	ZERO	A0
Packit c4476c
||	ZERO	B0
Packit c4476c
||	ZERO	A1
Packit c4476c
||	ZERO	B1
Packit c4476c
	ZERO	A3:A2
Packit c4476c
||	MVD	B0,B2
Packit c4476c
||	ZERO	A4
Packit c4476c
||	ZERO	B4
Packit c4476c
||	ZERO	A5
Packit c4476c
||	ZERO	B5
Packit c4476c
||	BNOP	RA
Packit c4476c
	ZERO	A7:A6
Packit c4476c
||	ZERO	B7:B6
Packit c4476c
||	ZERO	A8
Packit c4476c
||	ZERO	B8
Packit c4476c
||	ZERO	A9
Packit c4476c
||	ZERO	B9
Packit c4476c
	ZERO	A17:A16
Packit c4476c
||	ZERO	B17:B16
Packit c4476c
||	ZERO	A18
Packit c4476c
||	ZERO	B18
Packit c4476c
||	ZERO	A19
Packit c4476c
||	ZERO	B19
Packit c4476c
	ZERO	A21:A20
Packit c4476c
||	ZERO	B21:B20
Packit c4476c
||	ZERO	A22
Packit c4476c
||	ZERO	B22
Packit c4476c
||	ZERO	A23
Packit c4476c
||	ZERO	B23
Packit c4476c
	ZERO	A25:A24
Packit c4476c
||	ZERO	B25:B24
Packit c4476c
||	ZERO	A26
Packit c4476c
||	ZERO	B26
Packit c4476c
||	ZERO	A27
Packit c4476c
||	ZERO	B27
Packit c4476c
	ZERO	A29:A28
Packit c4476c
||	ZERO	B29:B28
Packit c4476c
||	ZERO	A30
Packit c4476c
||	ZERO	B30
Packit c4476c
||	ZERO	A31
Packit c4476c
||	ZERO	B31
Packit c4476c
	.endasmfunc
Packit c4476c
Packit c4476c
CLFLUSH	.macro	CONTROL,ADDR,LEN
Packit c4476c
	B	passthrough?
Packit c4476c
||	STW	ADDR,*CONTROL[0]
Packit c4476c
	STW	LEN,*CONTROL[1]
Packit c4476c
spinlock?:
Packit c4476c
	LDW	*CONTROL[1],A0
Packit c4476c
	NOP	3
Packit c4476c
passthrough?:
Packit c4476c
	NOP
Packit c4476c
  [A0]	BNOP	spinlock?,5
Packit c4476c
	.endm
Packit c4476c
Packit c4476c
	.global	_OPENSSL_instrument_bus
Packit c4476c
_OPENSSL_instrument_bus:
Packit c4476c
	.asmfunc
Packit c4476c
	MV	B4,B0			; reassign sizeof(output)
Packit c4476c
||	MV	A4,B4			; reassign output
Packit c4476c
||	MVK	0x00004030,A3
Packit c4476c
	MV	B0,A4			; return value
Packit c4476c
||	MVK	1,A1
Packit c4476c
||	MVKH	0x01840000,A3		; L1DWIBAR
Packit c4476c
	MVC	TSCL,B8			; collect 1st tick
Packit c4476c
||	MVK	0x00004010,A5
Packit c4476c
	MV	B8,B9			; lasttick = tick
Packit c4476c
||	MVK	0,B7			; lastdiff = 0
Packit c4476c
||	MVKH	0x01840000,A5		; L2WIBAR
Packit c4476c
	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
Packit c4476c
	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
Packit c4476c
	LL	*B4,B5
Packit c4476c
	NOP	4
Packit c4476c
	ADD	B7,B5,B5
Packit c4476c
	SL	B5,*B4
Packit c4476c
	CMTL	*B4,B1
Packit c4476c
	NOP	4
Packit c4476c
	STW	B5,*B4
Packit c4476c
bus_loop1?:
Packit c4476c
	MVC	TSCL,B8
Packit c4476c
|| [B0]	SUB	B0,1,B0
Packit c4476c
	SUB	B8,B9,B7		; lastdiff = tick - lasttick
Packit c4476c
||	MV	B8,B9			; lasttick = tick
Packit c4476c
	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
Packit c4476c
	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
Packit c4476c
	LL	*B4,B5
Packit c4476c
	NOP	4
Packit c4476c
	ADD	B7,B5,B5
Packit c4476c
	SL	B5,*B4
Packit c4476c
	CMTL	*B4,B1
Packit c4476c
	STW	B5,*B4			; [!B1] is removed to flatten samples
Packit c4476c
||	ADDK	4,B4
Packit c4476c
|| [B0]	BNOP	bus_loop1?,5
Packit c4476c
Packit c4476c
	BNOP	RA,5
Packit c4476c
	.endasmfunc
Packit c4476c
Packit c4476c
	.global	_OPENSSL_instrument_bus2
Packit c4476c
_OPENSSL_instrument_bus2:
Packit c4476c
	.asmfunc
Packit c4476c
	MV	A6,B0			; reassign max
Packit c4476c
||	MV	B4,A6			; reassign sizeof(output)
Packit c4476c
||	MVK	0x00004030,A3
Packit c4476c
	MV	A4,B4			; reassign output
Packit c4476c
||	MVK	0,A4			; return value
Packit c4476c
||	MVK	1,A1
Packit c4476c
||	MVKH	0x01840000,A3		; L1DWIBAR
Packit c4476c
Packit c4476c
	MVC	TSCL,B8			; collect 1st tick
Packit c4476c
||	MVK	0x00004010,A5
Packit c4476c
	MV	B8,B9			; lasttick = tick
Packit c4476c
||	MVK	0,B7			; lastdiff = 0
Packit c4476c
||	MVKH	0x01840000,A5		; L2WIBAR
Packit c4476c
	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
Packit c4476c
	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
Packit c4476c
	LL	*B4,B5
Packit c4476c
	NOP	4
Packit c4476c
	ADD	B7,B5,B5
Packit c4476c
	SL	B5,*B4
Packit c4476c
	CMTL	*B4,B1
Packit c4476c
	NOP	4
Packit c4476c
	STW	B5,*B4
Packit c4476c
Packit c4476c
	MVC	TSCL,B8			; collect 1st diff
Packit c4476c
	SUB	B8,B9,B7		; lastdiff = tick - lasttick
Packit c4476c
||	MV	B8,B9			; lasttick = tick
Packit c4476c
||	SUB	B0,1,B0
Packit c4476c
bus_loop2?:
Packit c4476c
	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
Packit c4476c
	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
Packit c4476c
	LL	*B4,B5
Packit c4476c
	NOP	4
Packit c4476c
	ADD	B7,B5,B5
Packit c4476c
	SL	B5,*B4
Packit c4476c
	CMTL	*B4,B1
Packit c4476c
	STW	B5,*B4			; [!B1] is removed to flatten samples
Packit c4476c
||[!B0]	BNOP	bus_loop2_done?,2
Packit c4476c
||	SUB	B0,1,B0
Packit c4476c
	MVC	TSCL,B8
Packit c4476c
	SUB	B8,B9,B8
Packit c4476c
||	MV	B8,B9
Packit c4476c
	CMPEQ	B8,B7,B2
Packit c4476c
||	MV	B8,B7
Packit c4476c
  [!B2]	ADDAW	B4,1,B4
Packit c4476c
||[!B2]	ADDK	1,A4
Packit c4476c
	CMPEQ	A4,A6,A2
Packit c4476c
  [!A2]	BNOP	bus_loop2?,5
Packit c4476c
Packit c4476c
bus_loop2_done?:
Packit c4476c
	BNOP	RA,5
Packit c4476c
	.endasmfunc
Packit c4476c
___
Packit c4476c
Packit c4476c
print $code;
Packit c4476c
close STDOUT or die "error closing STDOUT: $!";