GNU Linux-libre 4.9.296-gnu1
[releases.git] / arch / sparc / lib / NG4memset.S
1 /* NG4memset.S: Niagara-4 optimized memset/bzero.
2  *
3  * Copyright (C) 2012 David S. Miller (davem@davemloft.net)
4  */
5
6 #include <asm/asi.h>
7
8         .register       %g2, #scratch
9         .register       %g3, #scratch
10
11         .text
12         .align          32
13         .globl          NG4memset
14 NG4memset:
15         andcc           %o1, 0xff, %o4
16         be,pt           %icc, 1f
17          mov            %o2, %o1
18         sllx            %o4, 8, %g1
19         or              %g1, %o4, %o2
20         sllx            %o2, 16, %g1
21         or              %g1, %o2, %o2
22         sllx            %o2, 32, %g1
23         ba,pt           %icc, 1f
24          or             %g1, %o2, %o4
25         .size           NG4memset,.-NG4memset
26
27         .align          32
28         .globl          NG4bzero
29 NG4bzero:
30         clr             %o4
31 1:      cmp             %o1, 16
32         ble             %icc, .Ltiny
33          mov            %o0, %o3
34         sub             %g0, %o0, %g1
35         and             %g1, 0x7, %g1
36         brz,pt          %g1, .Laligned8
37          sub            %o1, %g1, %o1
38 1:      stb             %o4, [%o0 + 0x00]
39         subcc           %g1, 1, %g1
40         bne,pt          %icc, 1b
41          add            %o0, 1, %o0
42 .Laligned8:
43         cmp             %o1, 64 + (64 - 8)
44         ble             .Lmedium
45          sub            %g0, %o0, %g1
46         andcc           %g1, (64 - 1), %g1
47         brz,pn          %g1, .Laligned64
48          sub            %o1, %g1, %o1
49 1:      stx             %o4, [%o0 + 0x00]
50         subcc           %g1, 8, %g1
51         bne,pt          %icc, 1b
52          add            %o0, 0x8, %o0
53 .Laligned64:
54         andn            %o1, 64 - 1, %g1
55         sub             %o1, %g1, %o1
56         brnz,pn         %o4, .Lnon_bzero_loop
57          mov            0x20, %g2
58 1:      stxa            %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P
59         subcc           %g1, 0x40, %g1
60         stxa            %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P
61         bne,pt          %icc, 1b
62          add            %o0, 0x40, %o0
63 .Lpostloop:
64         cmp             %o1, 8
65         bl,pn           %icc, .Ltiny
66          membar         #StoreStore|#StoreLoad
67 .Lmedium:
68         andn            %o1, 0x7, %g1
69         sub             %o1, %g1, %o1
70 1:      stx             %o4, [%o0 + 0x00]
71         subcc           %g1, 0x8, %g1
72         bne,pt          %icc, 1b
73          add            %o0, 0x08, %o0
74         andcc           %o1, 0x4, %g1
75         be,pt           %icc, .Ltiny
76          sub            %o1, %g1, %o1
77         stw             %o4, [%o0 + 0x00]
78         add             %o0, 0x4, %o0
79 .Ltiny:
80         cmp             %o1, 0
81         be,pn           %icc, .Lexit
82 1:       subcc          %o1, 1, %o1
83         stb             %o4, [%o0 + 0x00]
84         bne,pt          %icc, 1b
85          add            %o0, 1, %o0
86 .Lexit:
87         retl
88          mov            %o3, %o0
89 .Lnon_bzero_loop:
90         mov             0x08, %g3
91         mov             0x28, %o5
92 1:      stxa            %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P
93         subcc           %g1, 0x40, %g1
94         stxa            %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P
95         stxa            %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P
96         stxa            %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P
97         add             %o0, 0x10, %o0
98         stxa            %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P
99         stxa            %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P
100         stxa            %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P
101         stxa            %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P
102         bne,pt          %icc, 1b
103          add            %o0, 0x30, %o0
104         ba,a,pt         %icc, .Lpostloop
105         .size           NG4bzero,.-NG4bzero