cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

memmove.S (2735B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * arch/alpha/lib/memmove.S
      4 *
      5 * Barely optimized memmove routine for Alpha EV5.
      6 *
      7 * This is hand-massaged output from the original memcpy.c.  We defer to
      8 * memcpy whenever possible; the backwards copy loops are not unrolled.
      9 */
     10#include <asm/export.h>        
     11	.set noat
     12	.set noreorder
     13	.text
     14
     15	.align 4
     16	.globl memmove
     17	.ent memmove
     18memmove:
     19	ldgp $29, 0($27)
     20	unop
     21	nop
     22	.prologue 1
     23
     24	addq $16,$18,$4
     25	addq $17,$18,$5
     26	cmpule $4,$17,$1		/*  dest + n <= src  */
     27	cmpule $5,$16,$2		/*  dest >= src + n  */
     28
     29	bis $1,$2,$1
     30	mov $16,$0
     31	xor $16,$17,$2
     32	bne $1,memcpy			!samegp
     33
     34	and $2,7,$2			/* Test for src/dest co-alignment.  */
     35	and $16,7,$1
     36	cmpule $16,$17,$3
     37	bne $3,$memmove_up		/* dest < src */
     38
     39	and $4,7,$1
     40	bne $2,$misaligned_dn
     41	unop
     42	beq $1,$skip_aligned_byte_loop_head_dn
     43
     44$aligned_byte_loop_head_dn:
     45	lda $4,-1($4)
     46	lda $5,-1($5)
     47	unop
     48	ble $18,$egress
     49
     50	ldq_u $3,0($5)
     51	ldq_u $2,0($4)
     52	lda $18,-1($18)
     53	extbl $3,$5,$1
     54
     55	insbl $1,$4,$1
     56	mskbl $2,$4,$2
     57	bis $1,$2,$1
     58	and $4,7,$6
     59
     60	stq_u $1,0($4)
     61	bne $6,$aligned_byte_loop_head_dn
     62
     63$skip_aligned_byte_loop_head_dn:
     64	lda $18,-8($18)
     65	blt $18,$skip_aligned_word_loop_dn
     66
     67$aligned_word_loop_dn:
     68	ldq $1,-8($5)
     69	nop
     70	lda $5,-8($5)
     71	lda $18,-8($18)
     72
     73	stq $1,-8($4)
     74	nop
     75	lda $4,-8($4)
     76	bge $18,$aligned_word_loop_dn
     77
     78$skip_aligned_word_loop_dn:
     79	lda $18,8($18)
     80	bgt $18,$byte_loop_tail_dn
     81	unop
     82	ret $31,($26),1
     83
     84	.align 4
     85$misaligned_dn:
     86	nop
     87	fnop
     88	unop
     89	beq $18,$egress
     90
     91$byte_loop_tail_dn:
     92	ldq_u $3,-1($5)
     93	ldq_u $2,-1($4)
     94	lda $5,-1($5)
     95	lda $4,-1($4)
     96
     97	lda $18,-1($18)
     98	extbl $3,$5,$1
     99	insbl $1,$4,$1
    100	mskbl $2,$4,$2
    101
    102	bis $1,$2,$1
    103	stq_u $1,0($4)
    104	bgt $18,$byte_loop_tail_dn
    105	br $egress
    106
    107$memmove_up:
    108	mov $16,$4
    109	mov $17,$5
    110	bne $2,$misaligned_up
    111	beq $1,$skip_aligned_byte_loop_head_up
    112
    113$aligned_byte_loop_head_up:
    114	unop
    115	ble $18,$egress
    116	ldq_u $3,0($5)
    117	ldq_u $2,0($4)
    118
    119	lda $18,-1($18)
    120	extbl $3,$5,$1
    121	insbl $1,$4,$1
    122	mskbl $2,$4,$2
    123
    124	bis $1,$2,$1
    125	lda $5,1($5)
    126	stq_u $1,0($4)
    127	lda $4,1($4)
    128
    129	and $4,7,$6
    130	bne $6,$aligned_byte_loop_head_up
    131
    132$skip_aligned_byte_loop_head_up:
    133	lda $18,-8($18)
    134	blt $18,$skip_aligned_word_loop_up
    135
    136$aligned_word_loop_up:
    137	ldq $1,0($5)
    138	nop
    139	lda $5,8($5)
    140	lda $18,-8($18)
    141
    142	stq $1,0($4)
    143	nop
    144	lda $4,8($4)
    145	bge $18,$aligned_word_loop_up
    146
    147$skip_aligned_word_loop_up:
    148	lda $18,8($18)
    149	bgt $18,$byte_loop_tail_up
    150	unop
    151	ret $31,($26),1
    152
    153	.align 4
    154$misaligned_up:
    155	nop
    156	fnop
    157	unop
    158	beq $18,$egress
    159
    160$byte_loop_tail_up:
    161	ldq_u $3,0($5)
    162	ldq_u $2,0($4)
    163	lda $18,-1($18)
    164	extbl $3,$5,$1
    165
    166	insbl $1,$4,$1
    167	mskbl $2,$4,$2
    168	bis $1,$2,$1
    169	stq_u $1,0($4)
    170
    171	lda $5,1($5)
    172	lda $4,1($4)
    173	nop
    174	bgt $18,$byte_loop_tail_up
    175
    176$egress:
    177	ret $31,($26),1
    178	nop
    179	nop
    180	nop
    181
    182	.end memmove
    183	EXPORT_SYMBOL(memmove)