glibc/sysdeps/s390/s390-64/multiarch/memset.S

110 lines
2.8 KiB
ArmAsm

/* Set a block of memory to some byte value. 64 bit S/390 version.
Copyright (C) 2012-2014 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "sysdep.h"
#include "asm-syntax.h"
/* INPUT PARAMETERS
%r2 = address of memory area
%r3 = byte to fill memory with
%r4 = number of bytes to fill. */
.text
#ifndef NOT_IN_libc
ENTRY(memset_z196)
.machine "z196"
ltgr %r4,%r4
je .L_Z196_4
stc %r3,0(%r2)
lgr %r1,%r2
cghi %r4,1
je .L_Z196_4
aghi %r4,-2
srlg %r5,%r4,8
ltgr %r5,%r5
jne .L_Z196_1
.L_Z196_3:
exrl %r4,.L_Z196_17
.L_Z196_4:
br %r14
.L_Z196_1:
cgfi %r5,1048576
jh memset_mvcle # Switch to mvcle for >256MB
.L_Z196_2:
pfd 2,1024(%r1)
mvc 1(256,%r1),0(%r1)
aghi %r5,-1
la %r1,256(%r1)
jne .L_Z196_2
j .L_Z196_3
.L_Z196_17:
mvc 1(1,%r1),0(%r1)
END(memset_z196)
ENTRY(memset_z10)
.machine "z10"
cgije %r4,0,.L_Z10_4
stc %r3,0(%r2)
lgr %r1,%r2
cgije %r4,1,.L_Z10_4
aghi %r4,-2
srlg %r5,%r4,8
cgijlh %r5,0,.L_Z10_15
.L_Z10_3:
exrl %r4,.L_Z10_18
.L_Z10_4:
br %r14
.L_Z10_15:
cgfi %r5,163840 # Switch to mvcle for >40MB
jh memset_mvcle
.L_Z10_14:
pfd 2,1024(%r1)
mvc 1(256,%r1),0(%r1)
la %r1,256(%r1)
brctg %r5,.L_Z10_14
j .L_Z10_3
.L_Z10_18:
mvc 1(1,%r1),0(%r1)
END(memset_z10)
ENTRY(memset_mvcle)
aghi %r4,2 # take back the change done by the caller
lgr %r0,%r2 # save source address
lgr %r1,%r3 # move pad byte to R1
lgr %r3,%r4 # move length to r3
sgr %r4,%r4 # no source for MVCLE, only a pad byte
sgr %r5,%r5
.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
jo .L0
lgr %r2,%r0 # return value is source address
.L1:
br %r14
END(memset_mvcle)
#endif
#include "../memset.S"
#ifdef NOT_IN_libc
.globl memset
.set memset,memset_z900
#endif