Blame crypto/bn/asm/bn-c64xplus.asm

Packit Service 084de1
;; Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
;;
Packit Service 084de1
;; Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
;; this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
;; in the file LICENSE in the source distribution or at
Packit Service 084de1
;; https://www.openssl.org/source/license.html
Packit Service 084de1
;;
Packit Service 084de1
;;====================================================================
Packit Service 084de1
;; Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
Packit Service 084de1
;; project.
Packit Service 084de1
;;
Packit Service 084de1
;; Rights for redistribution and usage in source and binary forms are
Packit Service 084de1
;; granted according to the OpenSSL license. Warranty of any kind is
Packit Service 084de1
;; disclaimed.
Packit Service 084de1
;;====================================================================
Packit Service 084de1
;; Compiler-generated multiply-n-add SPLOOP runs at 12*n cycles, n
Packit Service 084de1
;; being the number of 32-bit words, addition - 8*n. Corresponding 4x
Packit Service 084de1
;; unrolled SPLOOP-free loops - at ~8*n and ~5*n. Below assembler
Packit Service 084de1
;; SPLOOPs spin at ... 2*n cycles [plus epilogue].
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	.text
Packit Service 084de1
Packit Service 084de1
	.if	.ASSEMBLER_VERSION<7000000
Packit Service 084de1
	.asg	0,__TI_EABI__
Packit Service 084de1
	.endif
Packit Service 084de1
	.if	__TI_EABI__
Packit Service 084de1
	.asg	bn_mul_add_words,_bn_mul_add_words
Packit Service 084de1
	.asg	bn_mul_words,_bn_mul_words
Packit Service 084de1
	.asg	bn_sqr_words,_bn_sqr_words
Packit Service 084de1
	.asg	bn_add_words,_bn_add_words
Packit Service 084de1
	.asg	bn_sub_words,_bn_sub_words
Packit Service 084de1
	.asg	bn_div_words,_bn_div_words
Packit Service 084de1
	.asg	bn_sqr_comba8,_bn_sqr_comba8
Packit Service 084de1
	.asg	bn_mul_comba8,_bn_mul_comba8
Packit Service 084de1
	.asg	bn_sqr_comba4,_bn_sqr_comba4
Packit Service 084de1
	.asg	bn_mul_comba4,_bn_mul_comba4
Packit Service 084de1
	.endif
Packit Service 084de1
Packit Service 084de1
	.asg	B3,RA
Packit Service 084de1
	.asg	A4,ARG0
Packit Service 084de1
	.asg	B4,ARG1
Packit Service 084de1
	.asg	A6,ARG2
Packit Service 084de1
	.asg	B6,ARG3
Packit Service 084de1
	.asg	A8,ARG4
Packit Service 084de1
	.asg	B8,ARG5
Packit Service 084de1
	.asg	A4,RET
Packit Service 084de1
	.asg	A15,FP
Packit Service 084de1
	.asg	B14,DP
Packit Service 084de1
	.asg	B15,SP
Packit Service 084de1
Packit Service 084de1
	.global	_bn_mul_add_words
Packit Service 084de1
_bn_mul_add_words:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	MV	ARG2,B0
Packit Service 084de1
  [!B0]	BNOP	RA
Packit Service 084de1
||[!B0]	MVK	0,RET
Packit Service 084de1
   [B0]	MVC	B0,ILC
Packit Service 084de1
   [B0]	ZERO	A19		; high part of accumulator
Packit Service 084de1
|| [B0]	MV	ARG0,A2
Packit Service 084de1
|| [B0]	MV	ARG3,A3
Packit Service 084de1
	NOP	3
Packit Service 084de1
Packit Service 084de1
	SPLOOP	2		; 2*n+10
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	LDW	*ARG1++,B7	; ap[i]
Packit Service 084de1
	NOP	3
Packit Service 084de1
	LDW	*ARG0++,A7	; rp[i]
Packit Service 084de1
	MPY32U	B7,A3,A17:A16
Packit Service 084de1
	NOP	3		; [2,0] in epilogue
Packit Service 084de1
	ADDU	A16,A7,A21:A20
Packit Service 084de1
	ADDU	A19,A21:A20,A19:A18
Packit Service 084de1
||	MV.S	A17,A23
Packit Service 084de1
	SPKERNEL 2,1		; leave slot for "return value"
Packit Service 084de1
||	STW	A18,*A2++	; rp[i]
Packit Service 084de1
||	ADD	A19,A23,A19
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	BNOP	RA,4
Packit Service 084de1
	MV	A19,RET		; return value
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
Packit Service 084de1
	.global	_bn_mul_words
Packit Service 084de1
_bn_mul_words:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	MV	ARG2,B0
Packit Service 084de1
  [!B0]	BNOP	RA
Packit Service 084de1
||[!B0]	MVK	0,RET
Packit Service 084de1
   [B0]	MVC	B0,ILC
Packit Service 084de1
   [B0]	ZERO	A19		; high part of accumulator
Packit Service 084de1
	NOP	3
Packit Service 084de1
Packit Service 084de1
	SPLOOP	2		; 2*n+10
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	LDW	*ARG1++,A7	; ap[i]
Packit Service 084de1
	NOP	4
Packit Service 084de1
	MPY32U	A7,ARG3,A17:A16
Packit Service 084de1
	NOP	4		; [2,0] in epiloque
Packit Service 084de1
	ADDU	A19,A16,A19:A18
Packit Service 084de1
||	MV.S	A17,A21
Packit Service 084de1
	SPKERNEL 2,1		; leave slot for "return value"
Packit Service 084de1
||	STW	A18,*ARG0++	; rp[i]
Packit Service 084de1
||	ADD.L	A19,A21,A19
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	BNOP	RA,4
Packit Service 084de1
	MV	A19,RET		; return value
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
Packit Service 084de1
	.global	_bn_sqr_words
Packit Service 084de1
_bn_sqr_words:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	MV	ARG2,B0
Packit Service 084de1
  [!B0]	BNOP	RA
Packit Service 084de1
||[!B0]	MVK	0,RET
Packit Service 084de1
   [B0]	MVC	B0,ILC
Packit Service 084de1
   [B0]	MV	ARG0,B2
Packit Service 084de1
|| [B0]	ADD	4,ARG0,ARG0
Packit Service 084de1
	NOP	3
Packit Service 084de1
Packit Service 084de1
	SPLOOP	2		; 2*n+10
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	LDW	*ARG1++,B7	; ap[i]
Packit Service 084de1
	NOP	4
Packit Service 084de1
	MPY32U	B7,B7,B1:B0
Packit Service 084de1
	NOP	3		; [2,0] in epilogue
Packit Service 084de1
	STW	B0,*B2++(8)	; rp[2*i]
Packit Service 084de1
	MV	B1,A1
Packit Service 084de1
	SPKERNEL 2,0		; fully overlap BNOP RA,5
Packit Service 084de1
||	STW	A1,*ARG0++(8)	; rp[2*i+1]
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	BNOP	RA,5
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
Packit Service 084de1
	.global	_bn_add_words
Packit Service 084de1
_bn_add_words:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	MV	ARG3,B0
Packit Service 084de1
  [!B0]	BNOP	RA
Packit Service 084de1
||[!B0]	MVK	0,RET
Packit Service 084de1
   [B0]	MVC	B0,ILC
Packit Service 084de1
   [B0]	ZERO	A1		; carry flag
Packit Service 084de1
|| [B0]	MV	ARG0,A3
Packit Service 084de1
	NOP	3
Packit Service 084de1
Packit Service 084de1
	SPLOOP	2		; 2*n+6
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	LDW	*ARG2++,A7	; bp[i]
Packit Service 084de1
||	LDW	*ARG1++,B7	; ap[i]
Packit Service 084de1
	NOP	4
Packit Service 084de1
	ADDU	A7,B7,A9:A8
Packit Service 084de1
	ADDU	A1,A9:A8,A1:A0
Packit Service 084de1
	SPKERNEL 0,0		; fully overlap BNOP RA,5
Packit Service 084de1
||	STW	A0,*A3++	; write result
Packit Service 084de1
||	MV	A1,RET		; keep carry flag in RET
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	BNOP	RA,5
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
Packit Service 084de1
	.global	_bn_sub_words
Packit Service 084de1
_bn_sub_words:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	MV	ARG3,B0
Packit Service 084de1
  [!B0]	BNOP	RA
Packit Service 084de1
||[!B0]	MVK	0,RET
Packit Service 084de1
   [B0]	MVC	B0,ILC
Packit Service 084de1
   [B0]	ZERO	A2		; borrow flag
Packit Service 084de1
|| [B0]	MV	ARG0,A3
Packit Service 084de1
	NOP	3
Packit Service 084de1
Packit Service 084de1
	SPLOOP	2		; 2*n+6
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	LDW	*ARG2++,A7	; bp[i]
Packit Service 084de1
||	LDW	*ARG1++,B7	; ap[i]
Packit Service 084de1
	NOP	4
Packit Service 084de1
	SUBU	B7,A7,A1:A0
Packit Service 084de1
  [A2]	SUB	A1:A0,1,A1:A0
Packit Service 084de1
	SPKERNEL 0,1		; leave slot for "return borrow flag"
Packit Service 084de1
||	STW	A0,*A3++	; write result
Packit Service 084de1
||	AND	1,A1,A2		; pass on borrow flag
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	BNOP	RA,4
Packit Service 084de1
	AND	1,A1,RET	; return borrow flag
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
Packit Service 084de1
	.global	_bn_div_words
Packit Service 084de1
_bn_div_words:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	LMBD	1,A6,A0		; leading zero bits in dv
Packit Service 084de1
	LMBD	1,A4,A1		; leading zero bits in hi
Packit Service 084de1
||	MVK	32,B0
Packit Service 084de1
	CMPLTU	A1,A0,A2
Packit Service 084de1
||	ADD	A0,B0,B0
Packit Service 084de1
  [ A2]	BNOP	RA
Packit Service 084de1
||[ A2]	MVK	-1,A4		; return overflow
Packit Service 084de1
||[!A2]	MV	A4,A3		; reassign hi
Packit Service 084de1
  [!A2]	MV	B4,A4		; reassign lo, will be quotient
Packit Service 084de1
||[!A2]	MVC	B0,ILC
Packit Service 084de1
  [!A2]	SHL	A6,A0,A6	; normalize dv
Packit Service 084de1
||	MVK	1,A1
Packit Service 084de1
Packit Service 084de1
  [!A2]	CMPLTU	A3,A6,A1	; hi
Packit Service 084de1
||[!A2]	SHL	A4,1,A5:A4	; lo<<1
Packit Service 084de1
  [!A1]	SUB	A3,A6,A3	; hi-=dv
Packit Service 084de1
||[!A1]	OR	1,A4,A4
Packit Service 084de1
  [!A2]	SHRU	A3,31,A1	; upper bit
Packit Service 084de1
||[!A2]	ADDAH	A5,A3,A3	; hi<<1|lo>>31
Packit Service 084de1
Packit Service 084de1
	SPLOOP	3
Packit Service 084de1
  [!A1]	CMPLTU	A3,A6,A1	; hi
Packit Service 084de1
||[ A1]	ZERO	A1
Packit Service 084de1
||	SHL	A4,1,A5:A4	; lo<<1
Packit Service 084de1
  [!A1]	SUB	A3,A6,A3	; hi-=dv
Packit Service 084de1
||[!A1]	OR	1,A4,A4		; quotient
Packit Service 084de1
	SHRU	A3,31,A1	; upper bit
Packit Service 084de1
||	ADDAH	A5,A3,A3	; hi<<1|lo>>31
Packit Service 084de1
	SPKERNEL
Packit Service 084de1
Packit Service 084de1
	BNOP	RA,5
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
Packit Service 084de1
;;====================================================================
Packit Service 084de1
;; Not really Comba algorithm, just straightforward NxM... Dedicated
Packit Service 084de1
;; fully unrolled real Comba implementations are asymptotically 2x
Packit Service 084de1
;; faster, but naturally larger undertaking. Purpose of this exercise
Packit Service 084de1
;; was rather to learn to master nested SPLOOPs...
Packit Service 084de1
;;====================================================================
Packit Service 084de1
	.global	_bn_sqr_comba8
Packit Service 084de1
	.global	_bn_mul_comba8
Packit Service 084de1
_bn_sqr_comba8:
Packit Service 084de1
	MV	ARG1,ARG2
Packit Service 084de1
_bn_mul_comba8:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	MVK	8,B0		; N, RILC
Packit Service 084de1
||	MVK	8,A0		; M, outer loop counter
Packit Service 084de1
||	MV	ARG1,A5		; copy ap
Packit Service 084de1
||	MV	ARG0,B4		; copy rp
Packit Service 084de1
||	ZERO	B19		; high part of accumulator
Packit Service 084de1
	MVC	B0,RILC
Packit Service 084de1
||	SUB	B0,2,B1		; N-2, initial ILC
Packit Service 084de1
||	SUB	B0,1,B2		; const B2=N-1
Packit Service 084de1
||	LDW	*A5++,B6	; ap[0]
Packit Service 084de1
||	MV	A0,A3		; const A3=M
Packit Service 084de1
sploopNxM?:			; for best performance arrange M<=N
Packit Service 084de1
   [A0]	SPLOOPD	2		; 2*n+10
Packit Service 084de1
||	MVC	B1,ILC
Packit Service 084de1
||	ADDAW	B4,B0,B5
Packit Service 084de1
||	ZERO	B7
Packit Service 084de1
||	LDW	*A5++,A9	; pre-fetch ap[1]
Packit Service 084de1
||	ZERO	A1
Packit Service 084de1
||	SUB	A0,1,A0
Packit Service 084de1
;;====================================================================
Packit Service 084de1
;; SPLOOP from bn_mul_add_words, but with flipped A<>B register files.
Packit Service 084de1
;; This is because of Advisory 15 from TI publication SPRZ247I.
Packit Service 084de1
	LDW	*ARG2++,A7	; bp[i]
Packit Service 084de1
	NOP	3
Packit Service 084de1
   [A1]	LDW	*B5++,B7	; rp[i]
Packit Service 084de1
	MPY32U	A7,B6,B17:B16
Packit Service 084de1
	NOP	3
Packit Service 084de1
	ADDU	B16,B7,B21:B20
Packit Service 084de1
	ADDU	B19,B21:B20,B19:B18
Packit Service 084de1
||	MV.S	B17,B23
Packit Service 084de1
	SPKERNEL
Packit Service 084de1
||	STW	B18,*B4++	; rp[i]
Packit Service 084de1
||	ADD.S	B19,B23,B19
Packit Service 084de1
;;====================================================================
Packit Service 084de1
outer?:				; m*2*(n+1)+10
Packit Service 084de1
	SUBAW	ARG2,A3,ARG2	; rewind bp to bp[0]
Packit Service 084de1
	SPMASKR
Packit Service 084de1
||	CMPGT	A0,1,A2		; done pre-fetching ap[i+1]?
Packit Service 084de1
	MVD	A9,B6		; move through .M unit(*)
Packit Service 084de1
   [A2]	LDW	*A5++,A9	; pre-fetch ap[i+1]
Packit Service 084de1
	SUBAW	B5,B2,B5	; rewind rp to rp[1]
Packit Service 084de1
	MVK	1,A1
Packit Service 084de1
   [A0]	BNOP.S1	outer?,4
Packit Service 084de1
|| [A0]	SUB.L	A0,1,A0
Packit Service 084de1
	STW	B19,*B4--[B2]	; rewind rp tp rp[1]
Packit Service 084de1
||	ZERO.S	B19		; high part of accumulator
Packit Service 084de1
;; end of outer?
Packit Service 084de1
	BNOP	RA,5		; return
Packit Service 084de1
	.endasmfunc
Packit Service 084de1
;; (*)	It should be noted that B6 is used as input to MPY32U in
Packit Service 084de1
;;	chronologically next cycle in *preceding* SPLOOP iteration.
Packit Service 084de1
;;	Normally such arrangement would require DINT, but at this
Packit Service 084de1
;;	point SPLOOP is draining and interrupts are disabled
Packit Service 084de1
;;	implicitly.
Packit Service 084de1
Packit Service 084de1
	.global	_bn_sqr_comba4
Packit Service 084de1
	.global	_bn_mul_comba4
Packit Service 084de1
_bn_sqr_comba4:
Packit Service 084de1
	MV	ARG1,ARG2
Packit Service 084de1
_bn_mul_comba4:
Packit Service 084de1
	.asmfunc
Packit Service 084de1
	.if	0
Packit Service 084de1
	BNOP	sploopNxM?,3
Packit Service 084de1
	;; Above mentioned m*2*(n+1)+10 does not apply in n=m=4 case,
Packit Service 084de1
	;; because of low-counter effect, when prologue phase finishes
Packit Service 084de1
	;; before SPKERNEL instruction is reached. As result it's 25%
Packit Service 084de1
	;; slower than expected...
Packit Service 084de1
	MVK	4,B0		; N, RILC
Packit Service 084de1
||	MVK	4,A0		; M, outer loop counter
Packit Service 084de1
||	MV	ARG1,A5		; copy ap
Packit Service 084de1
||	MV	ARG0,B4		; copy rp
Packit Service 084de1
||	ZERO	B19		; high part of accumulator
Packit Service 084de1
	MVC	B0,RILC
Packit Service 084de1
||	SUB	B0,2,B1		; first ILC
Packit Service 084de1
||	SUB	B0,1,B2		; const B2=N-1
Packit Service 084de1
||	LDW	*A5++,B6	; ap[0]
Packit Service 084de1
||	MV	A0,A3		; const A3=M
Packit Service 084de1
	.else
Packit Service 084de1
	;; This alternative is an exercise in fully unrolled Comba
Packit Service 084de1
	;; algorithm implementation that operates at n*(n+1)+12, or
Packit Service 084de1
	;; as little as 32 cycles...
Packit Service 084de1
	LDW	*ARG1[0],B16	; a[0]
Packit Service 084de1
||	LDW	*ARG2[0],A16	; b[0]
Packit Service 084de1
	LDW	*ARG1[1],B17	; a[1]
Packit Service 084de1
||	LDW	*ARG2[1],A17	; b[1]
Packit Service 084de1
	LDW	*ARG1[2],B18	; a[2]
Packit Service 084de1
||	LDW	*ARG2[2],A18	; b[2]
Packit Service 084de1
	LDW	*ARG1[3],B19	; a[3]
Packit Service 084de1
||	LDW	*ARG2[3],A19	; b[3]
Packit Service 084de1
	NOP
Packit Service 084de1
	MPY32U	A16,B16,A1:A0	; a[0]*b[0]
Packit Service 084de1
	MPY32U	A17,B16,A23:A22	; a[0]*b[1]
Packit Service 084de1
	MPY32U	A16,B17,A25:A24	; a[1]*b[0]
Packit Service 084de1
	MPY32U	A16,B18,A27:A26	; a[2]*b[0]
Packit Service 084de1
	STW	A0,*ARG0[0]
Packit Service 084de1
||	MPY32U	A17,B17,A29:A28	; a[1]*b[1]
Packit Service 084de1
	MPY32U	A18,B16,A31:A30	; a[0]*b[2]
Packit Service 084de1
||	ADDU	A22,A1,A1:A0
Packit Service 084de1
	MV	A23,B0
Packit Service 084de1
||	MPY32U	A19,B16,A21:A20	; a[3]*b[0]
Packit Service 084de1
||	ADDU	A24,A1:A0,A1:A0
Packit Service 084de1
	ADDU	A25,B0,B1:B0
Packit Service 084de1
||	STW	A0,*ARG0[1]
Packit Service 084de1
||	MPY32U	A18,B17,A23:A22	; a[2]*b[1]
Packit Service 084de1
||	ADDU	A26,A1,A9:A8
Packit Service 084de1
	ADDU	A27,B1,B9:B8
Packit Service 084de1
||	MPY32U	A17,B18,A25:A24	; a[1]*b[2]
Packit Service 084de1
||	ADDU	A28,A9:A8,A9:A8
Packit Service 084de1
	ADDU	A29,B9:B8,B9:B8
Packit Service 084de1
||	MPY32U	A16,B19,A27:A26	; a[0]*b[3]
Packit Service 084de1
||	ADDU	A30,A9:A8,A9:A8
Packit Service 084de1
	ADDU	A31,B9:B8,B9:B8
Packit Service 084de1
||	ADDU	B0,A9:A8,A9:A8
Packit Service 084de1
	STW	A8,*ARG0[2]
Packit Service 084de1
||	ADDU	A20,A9,A1:A0
Packit Service 084de1
	ADDU	A21,B9,B1:B0
Packit Service 084de1
||	MPY32U	A19,B17,A21:A20	; a[3]*b[1]
Packit Service 084de1
||	ADDU	A22,A1:A0,A1:A0
Packit Service 084de1
	ADDU	A23,B1:B0,B1:B0
Packit Service 084de1
||	MPY32U	A18,B18,A23:A22	; a[2]*b[2]
Packit Service 084de1
||	ADDU	A24,A1:A0,A1:A0
Packit Service 084de1
	ADDU	A25,B1:B0,B1:B0
Packit Service 084de1
||	MPY32U	A17,B19,A25:A24	; a[1]*b[3]
Packit Service 084de1
||	ADDU	A26,A1:A0,A1:A0
Packit Service 084de1
	ADDU	A27,B1:B0,B1:B0
Packit Service 084de1
||	ADDU	B8,A1:A0,A1:A0
Packit Service 084de1
	STW	A0,*ARG0[3]
Packit Service 084de1
||	MPY32U	A19,B18,A27:A26	; a[3]*b[2]
Packit Service 084de1
||	ADDU	A20,A1,A9:A8
Packit Service 084de1
	ADDU	A21,B1,B9:B8
Packit Service 084de1
||	MPY32U	A18,B19,A29:A28	; a[2]*b[3]
Packit Service 084de1
||	ADDU	A22,A9:A8,A9:A8
Packit Service 084de1
	ADDU	A23,B9:B8,B9:B8
Packit Service 084de1
||	MPY32U	A19,B19,A31:A30	; a[3]*b[3]
Packit Service 084de1
||	ADDU	A24,A9:A8,A9:A8
Packit Service 084de1
	ADDU	A25,B9:B8,B9:B8
Packit Service 084de1
||	ADDU	B0,A9:A8,A9:A8
Packit Service 084de1
	STW	A8,*ARG0[4]
Packit Service 084de1
||	ADDU	A26,A9,A1:A0
Packit Service 084de1
	ADDU	A27,B9,B1:B0
Packit Service 084de1
||	ADDU	A28,A1:A0,A1:A0
Packit Service 084de1
	ADDU	A29,B1:B0,B1:B0
Packit Service 084de1
||	BNOP	RA
Packit Service 084de1
||	ADDU	B8,A1:A0,A1:A0
Packit Service 084de1
	STW	A0,*ARG0[5]
Packit Service 084de1
||	ADDU	A30,A1,A9:A8
Packit Service 084de1
	ADD	A31,B1,B8
Packit Service 084de1
	ADDU	B0,A9:A8,A9:A8	; removed || to avoid cross-path stall below
Packit Service 084de1
	ADD	B8,A9,A9
Packit Service 084de1
||	STW	A8,*ARG0[6]
Packit Service 084de1
	STW	A9,*ARG0[7]
Packit Service 084de1
	.endif
Packit Service 084de1
	.endasmfunc