1*8d67ca89SAndroid Build Coastguard Worker/* 2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2014, Intel Corporation 3*8d67ca89SAndroid Build Coastguard WorkerAll rights reserved. 4*8d67ca89SAndroid Build Coastguard Worker 5*8d67ca89SAndroid Build Coastguard WorkerRedistribution and use in source and binary forms, with or without 6*8d67ca89SAndroid Build Coastguard Workermodification, are permitted provided that the following conditions are met: 7*8d67ca89SAndroid Build Coastguard Worker 8*8d67ca89SAndroid Build Coastguard Worker * Redistributions of source code must retain the above copyright notice, 9*8d67ca89SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer. 10*8d67ca89SAndroid Build Coastguard Worker 11*8d67ca89SAndroid Build Coastguard Worker * Redistributions in binary form must reproduce the above copyright notice, 12*8d67ca89SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 13*8d67ca89SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 14*8d67ca89SAndroid Build Coastguard Worker 15*8d67ca89SAndroid Build Coastguard Worker * Neither the name of Intel Corporation nor the names of its contributors 16*8d67ca89SAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software 17*8d67ca89SAndroid Build Coastguard Worker * without specific prior written permission. 18*8d67ca89SAndroid Build Coastguard Worker 19*8d67ca89SAndroid Build Coastguard WorkerTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20*8d67ca89SAndroid Build Coastguard WorkerANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21*8d67ca89SAndroid Build Coastguard WorkerWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22*8d67ca89SAndroid Build Coastguard WorkerDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 23*8d67ca89SAndroid Build Coastguard WorkerANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24*8d67ca89SAndroid Build Coastguard Worker(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25*8d67ca89SAndroid Build Coastguard WorkerLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26*8d67ca89SAndroid Build Coastguard WorkerANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*8d67ca89SAndroid Build Coastguard Worker(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28*8d67ca89SAndroid Build Coastguard WorkerSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*8d67ca89SAndroid Build Coastguard Worker*/ 30*8d67ca89SAndroid Build Coastguard Worker 31*8d67ca89SAndroid Build Coastguard Worker#include <private/bionic_asm.h> 32*8d67ca89SAndroid Build Coastguard Worker 33*8d67ca89SAndroid Build Coastguard Worker 34*8d67ca89SAndroid Build Coastguard Worker#ifndef L 35*8d67ca89SAndroid Build Coastguard Worker# define L(label) .L##label 36*8d67ca89SAndroid Build Coastguard Worker#endif 37*8d67ca89SAndroid Build Coastguard Worker 38*8d67ca89SAndroid Build Coastguard Worker#ifndef ALIGN 39*8d67ca89SAndroid Build Coastguard Worker# define ALIGN(n) .p2align n 40*8d67ca89SAndroid Build Coastguard Worker#endif 41*8d67ca89SAndroid Build Coastguard Worker 42*8d67ca89SAndroid Build Coastguard Worker 43*8d67ca89SAndroid Build Coastguard WorkerENTRY(__memset_chk_generic) 44*8d67ca89SAndroid Build Coastguard Worker # %rdi = dst, %rsi = byte, %rdx = n, %rcx = dst_len 45*8d67ca89SAndroid Build Coastguard Worker cmp %rcx, %rdx 46*8d67ca89SAndroid Build Coastguard Worker ja __memset_chk_fail 47*8d67ca89SAndroid Build Coastguard Worker // Fall through to memset... 48*8d67ca89SAndroid Build Coastguard WorkerEND(__memset_chk_generic) 49*8d67ca89SAndroid Build Coastguard Worker 50*8d67ca89SAndroid Build Coastguard Worker 51*8d67ca89SAndroid Build Coastguard Worker .section .text.sse2,"ax",@progbits 52*8d67ca89SAndroid Build Coastguard WorkerENTRY(memset_generic) 53*8d67ca89SAndroid Build Coastguard Worker movq %rdi, %rax 54*8d67ca89SAndroid Build Coastguard Worker and $0xff, %rsi 55*8d67ca89SAndroid Build Coastguard Worker mov $0x0101010101010101, %rcx 56*8d67ca89SAndroid Build Coastguard Worker imul %rsi, %rcx 57*8d67ca89SAndroid Build Coastguard Worker cmpq $16, %rdx 58*8d67ca89SAndroid Build Coastguard Worker jae L(16bytesormore) 59*8d67ca89SAndroid Build Coastguard Worker testb $8, %dl 60*8d67ca89SAndroid Build Coastguard Worker jnz L(8_15bytes) 61*8d67ca89SAndroid Build Coastguard Worker testb $4, %dl 62*8d67ca89SAndroid Build Coastguard Worker jnz L(4_7bytes) 63*8d67ca89SAndroid Build Coastguard Worker testb $2, %dl 64*8d67ca89SAndroid Build Coastguard Worker jnz L(2_3bytes) 65*8d67ca89SAndroid Build Coastguard Worker testb $1, %dl 66*8d67ca89SAndroid Build Coastguard Worker jz L(return) 67*8d67ca89SAndroid Build Coastguard Worker movb %cl, (%rdi) 68*8d67ca89SAndroid Build Coastguard WorkerL(return): 69*8d67ca89SAndroid Build Coastguard Worker ret 70*8d67ca89SAndroid Build Coastguard Worker 71*8d67ca89SAndroid Build Coastguard WorkerL(8_15bytes): 72*8d67ca89SAndroid Build Coastguard Worker movq %rcx, (%rdi) 73*8d67ca89SAndroid Build Coastguard Worker movq %rcx, -8(%rdi, %rdx) 74*8d67ca89SAndroid Build Coastguard Worker ret 75*8d67ca89SAndroid Build Coastguard Worker 76*8d67ca89SAndroid Build Coastguard WorkerL(4_7bytes): 77*8d67ca89SAndroid Build Coastguard Worker movl %ecx, (%rdi) 78*8d67ca89SAndroid Build Coastguard Worker movl %ecx, -4(%rdi, %rdx) 79*8d67ca89SAndroid Build Coastguard Worker ret 80*8d67ca89SAndroid Build Coastguard Worker 81*8d67ca89SAndroid Build Coastguard WorkerL(2_3bytes): 82*8d67ca89SAndroid Build Coastguard Worker movw %cx, (%rdi) 83*8d67ca89SAndroid Build Coastguard Worker movw %cx, -2(%rdi, %rdx) 84*8d67ca89SAndroid Build Coastguard Worker ret 85*8d67ca89SAndroid Build Coastguard Worker 86*8d67ca89SAndroid Build Coastguard Worker ALIGN (4) 87*8d67ca89SAndroid Build Coastguard WorkerL(16bytesormore): 88*8d67ca89SAndroid Build Coastguard Worker movd %rcx, %xmm0 89*8d67ca89SAndroid Build Coastguard Worker pshufd $0, %xmm0, %xmm0 90*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, (%rdi) 91*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, -16(%rdi, %rdx) 92*8d67ca89SAndroid Build Coastguard Worker cmpq $32, %rdx 93*8d67ca89SAndroid Build Coastguard Worker jbe L(32bytesless) 94*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, 16(%rdi) 95*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, -32(%rdi, %rdx) 96*8d67ca89SAndroid Build Coastguard Worker cmpq $64, %rdx 97*8d67ca89SAndroid Build Coastguard Worker jbe L(64bytesless) 98*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, 32(%rdi) 99*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, 48(%rdi) 100*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, -64(%rdi, %rdx) 101*8d67ca89SAndroid Build Coastguard Worker movdqu %xmm0, -48(%rdi, %rdx) 102*8d67ca89SAndroid Build Coastguard Worker cmpq $128, %rdx 103*8d67ca89SAndroid Build Coastguard Worker ja L(128bytesmore) 104*8d67ca89SAndroid Build Coastguard WorkerL(32bytesless): 105*8d67ca89SAndroid Build Coastguard WorkerL(64bytesless): 106*8d67ca89SAndroid Build Coastguard Worker ret 107*8d67ca89SAndroid Build Coastguard Worker 108*8d67ca89SAndroid Build Coastguard Worker ALIGN (4) 109*8d67ca89SAndroid Build Coastguard WorkerL(128bytesmore): 110*8d67ca89SAndroid Build Coastguard Worker leaq 64(%rdi), %rcx 111*8d67ca89SAndroid Build Coastguard Worker andq $-64, %rcx 112*8d67ca89SAndroid Build Coastguard Worker movq %rdx, %r8 113*8d67ca89SAndroid Build Coastguard Worker addq %rdi, %rdx 114*8d67ca89SAndroid Build Coastguard Worker andq $-64, %rdx 115*8d67ca89SAndroid Build Coastguard Worker cmpq %rcx, %rdx 116*8d67ca89SAndroid Build Coastguard Worker je L(return) 117*8d67ca89SAndroid Build Coastguard Worker 118*8d67ca89SAndroid Build Coastguard Worker cmp __x86_shared_cache_size(%rip), %r8 119*8d67ca89SAndroid Build Coastguard Worker 120*8d67ca89SAndroid Build Coastguard Worker ja L(128bytesmore_nt) 121*8d67ca89SAndroid Build Coastguard Worker 122*8d67ca89SAndroid Build Coastguard Worker ALIGN (4) 123*8d67ca89SAndroid Build Coastguard WorkerL(128bytesmore_normal): 124*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm0, (%rcx) 125*8d67ca89SAndroid Build Coastguard Worker movaps %xmm0, 0x10(%rcx) 126*8d67ca89SAndroid Build Coastguard Worker movaps %xmm0, 0x20(%rcx) 127*8d67ca89SAndroid Build Coastguard Worker movaps %xmm0, 0x30(%rcx) 128*8d67ca89SAndroid Build Coastguard Worker addq $64, %rcx 129*8d67ca89SAndroid Build Coastguard Worker cmpq %rcx, %rdx 130*8d67ca89SAndroid Build Coastguard Worker jne L(128bytesmore_normal) 131*8d67ca89SAndroid Build Coastguard Worker ret 132*8d67ca89SAndroid Build Coastguard Worker 133*8d67ca89SAndroid Build Coastguard Worker ALIGN (4) 134*8d67ca89SAndroid Build Coastguard WorkerL(128bytesmore_nt): 135*8d67ca89SAndroid Build Coastguard Worker movntdq %xmm0, (%rcx) 136*8d67ca89SAndroid Build Coastguard Worker movntdq %xmm0, 0x10(%rcx) 137*8d67ca89SAndroid Build Coastguard Worker movntdq %xmm0, 0x20(%rcx) 138*8d67ca89SAndroid Build Coastguard Worker movntdq %xmm0, 0x30(%rcx) 139*8d67ca89SAndroid Build Coastguard Worker leaq 64(%rcx), %rcx 140*8d67ca89SAndroid Build Coastguard Worker cmpq %rcx, %rdx 141*8d67ca89SAndroid Build Coastguard Worker jne L(128bytesmore_nt) 142*8d67ca89SAndroid Build Coastguard Worker sfence 143*8d67ca89SAndroid Build Coastguard Worker ret 144*8d67ca89SAndroid Build Coastguard Worker 145*8d67ca89SAndroid Build Coastguard WorkerEND(memset_generic) 146