Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / metag / lib / memset.S
1 !   Copyright (C) 2008-2012 Imagination Technologies Ltd.
2
3         .text
4         .global _memset
5         .type   _memset,function
6 ! D1Ar1 dst
7 ! D0Ar2 c
8 ! D1Ar3 cnt
9 ! D0Re0 dst
10 _memset:
11         AND     D0Ar2,D0Ar2,#0xFF       ! Ensure a byte input value
12         MULW    D0Ar2,D0Ar2,#0x0101     ! Duplicate byte value into  0-15
13         ANDS    D0Ar4,D1Ar1,#7          ! Extract bottom LSBs of dst
14         LSL     D0Re0,D0Ar2,#16         ! Duplicate byte value into 16-31
15         ADD     A0.2,D0Ar2,D0Re0        ! Duplicate byte value into 4 (A0.2)
16         MOV     D0Re0,D1Ar1             ! Return dst
17         BZ      $LLongStub              ! if start address is aligned
18         ! start address is not aligned on an 8 byte boundary, so we
19         ! need the number of bytes up to the next 8 byte address
20         ! boundary, or the length of the string if less than 8, in D1Ar5
21         MOV     D0Ar2,#8                ! Need 8 - N in D1Ar5 ...
22         SUB     D1Ar5,D0Ar2,D0Ar4       !            ... subtract N
23         CMP     D1Ar3,D1Ar5
24         MOVMI   D1Ar5,D1Ar3
25         B       $LByteStub              ! dst is mis-aligned, do $LByteStub
26
27 !
28 ! Preamble to LongLoop which generates 4*8 bytes per interation (5 cycles)
29 !
30 $LLongStub:
31         LSRS    D0Ar2,D1Ar3,#5
32         AND     D1Ar3,D1Ar3,#0x1F
33         MOV     A1.2,A0.2
34         BEQ     $LLongishStub
35         SUB     TXRPT,D0Ar2,#1
36         CMP     D1Ar3,#0
37 $LLongLoop:
38         SETL    [D1Ar1++],A0.2,A1.2
39         SETL    [D1Ar1++],A0.2,A1.2
40         SETL    [D1Ar1++],A0.2,A1.2
41         SETL    [D1Ar1++],A0.2,A1.2
42         BR      $LLongLoop
43         BZ      $Lexit
44 !
45 ! Preamble to LongishLoop which generates 1*8 bytes per interation (2 cycles)
46 !
47 $LLongishStub:
48         LSRS    D0Ar2,D1Ar3,#3
49         AND     D1Ar3,D1Ar3,#0x7
50         MOV     D1Ar5,D1Ar3
51         BEQ     $LByteStub
52         SUB     TXRPT,D0Ar2,#1
53         CMP     D1Ar3,#0
54 $LLongishLoop:
55         SETL    [D1Ar1++],A0.2,A1.2
56         BR      $LLongishLoop
57         BZ      $Lexit
58 !
59 ! This does a byte structured burst of up to 7 bytes
60 !
61 !       D1Ar1 should point to the location required
62 !       D1Ar3 should be the remaining total byte count
63 !       D1Ar5 should be burst size (<= D1Ar3)
64 !
65 $LByteStub:
66         SUBS    D1Ar3,D1Ar3,D1Ar5       ! Reduce count
67         ADD     D1Ar1,D1Ar1,D1Ar5       ! Advance pointer to end of area
68         MULW    D1Ar5,D1Ar5,#4          ! Scale to (1*4), (2*4), (3*4)
69         SUB     D1Ar5,D1Ar5,#(8*4)      ! Rebase to -(7*4), -(6*4), -(5*4), ...
70         MOV     A1.2,D1Ar5
71         SUB     PC,CPC1,A1.2            ! Jump into table below
72         SETB    [D1Ar1+#(-7)],A0.2
73         SETB    [D1Ar1+#(-6)],A0.2
74         SETB    [D1Ar1+#(-5)],A0.2
75         SETB    [D1Ar1+#(-4)],A0.2
76         SETB    [D1Ar1+#(-3)],A0.2
77         SETB    [D1Ar1+#(-2)],A0.2
78         SETB    [D1Ar1+#(-1)],A0.2
79 !
80 ! Return if all data has been output, otherwise do $LLongStub
81 !
82         BNZ     $LLongStub
83 $Lexit:
84         MOV     PC,D1RtP
85         .size _memset,.-_memset
86