1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * "memset" implementation for SH4 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1999 Niibe Yutaka 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (c) 2009 STMicroelectronics Limited 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Author: Stuart Menefy <stuart.menefy:st.com> 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * void *memset(void *s, int c, size_t n); 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/linkage.h> 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengENTRY(memset) 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov #12,r0 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add r6,r4 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmp/gt r6,r0 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bt/s 40f ! if it's too small, set a byte at once 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r4,r0 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and #3,r0 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmp/eq #0,r0 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bt/s 2f ! It's aligned 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sub r0,r6 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1: 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng dt r0 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bf/s 1b 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.b r5,@-r4 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng2: ! make VVVV 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng extu.b r5,r5 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng swap.b r5,r0 ! V0 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r0,r5 ! VV 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng swap.w r5,r0 ! VV00 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r0,r5 ! VVVV 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ! Check if enough bytes need to be copied to be worth the big loop 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov #0x40, r0 ! (MT) 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmp/gt r6,r0 ! (MT) 64 > len => slow loop 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bt/s 22f 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r6,r0 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ! align the dst to the cache block size if necessary 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r4, r3 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov #~(0x1f), r1 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and r3, r1 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmp/eq r3, r1 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bt/s 11f ! dst is already aligned 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sub r1, r3 ! r3-r1 -> r3 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng shlr2 r3 ! number of loops 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng10: mov.l r5,@-r4 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng dt r3 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bf/s 10b 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add #-4, r6 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng11: ! dst is 32byte aligned 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r6,r2 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov #-5,r0 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng shld r0,r2 ! number of loops 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add #-32, r4 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r5, r0 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng12: 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng movca.l r0,@r4 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(4, r4) 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(8, r4) 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(12,r4) 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(16,r4) 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(20,r4) 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add #-0x20, r6 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(24,r4) 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng dt r2 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@(28,r4) 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bf/s 12b 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add #-32, r4 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add #32, r4 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov #8, r0 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmp/ge r0, r6 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bf 40f 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r6,r0 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng22: 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng shlr2 r0 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng shlr r0 ! r0 = r6 >> 3 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng3: 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng dt r0 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@-r4 ! set 8-byte at once 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bf/s 3b 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.l r5,@-r4 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ! 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov #7,r0 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and r0,r6 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ! fill bytes (length may be zero) 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng40: tst r6,r6 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bt 5f 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng4: 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng dt r6 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bf/s 4b 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov.b r5,@-r4 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng5: 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng rts 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mov r4,r0 108