blob: 5d9beb1e2f539261e7ec72d725dc06cc0aa42098 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Optimized memset() for SW64 with SIMD instructions
*
* Copyright (C) Mao Minkai
* Author: Mao Minkai
*
* Fill SIZE bytes pointed to by SRC with CHAR.
*
* Input:
* $16: SRC, clobbered
* $17: CHAR, clobbered
* $18: SIZE, clobbered
*
* Output:
* $0: SRC
*
* Temporaries:
* $1: unaligned parts of addr (0 means aligned addr), tmp data
* $2: tmp data
* $3: tmp data
* $4: tmp data
* $5: compare result
* $f10: 32 bytes data (manually saved)
*
*/
#include <asm/export.h>
#define FIXUP_LDST(x, y) \
x, y
.set noat
.set noreorder
.text
.align 4
.globl memset
.globl __memset
.globl ___memset
.globl __memsetw
.globl __constant_c_memset
.ent ___memset
___memset:
.frame $30, 0, $26, 0
.prologue 0
/* expand 1 byte data to 8 bytes */
and $17, 0xff, $17
sll $17, 8, $4
bis $17, $4, $17
sll $17, 16, $4
bis $17, $4, $17
sll $17, 32, $4
bis $17, $4, $17
__constant_c_memset:
bis $31, $31, $7
bis $31, $16, $0
#include "deep-set_template.S"
$out:
ret
.end ___memset
EXPORT_SYMBOL(___memset)
.align 5
.ent __memsetw
__memsetw:
.prologue 0
inslh $17, 0, $1
inslh $17, 2, $2
inslh $17, 4, $3
bis $1, $2, $1
inslh $17, 6, $4
bis $1, $3, $1
bis $1, $4, $17
br $31, __constant_c_memset
.end __memsetw
EXPORT_SYMBOL(__memsetw)
memset = ___memset
EXPORT_SYMBOL(memset)
__memset = ___memset
EXPORT_SYMBOL(__memset)