~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/hexagon/mm/copy_user_template.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*
  3  * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
  4  */
  5 
  6 /* Numerology:
  7  * WXYZ
  8  * W: width in bytes
  9  * X: Load=0, Store=1
 10  * Y: Location 0=preamble,8=loop,9=epilog
 11  * Z: Location=0,handler=9
 12  */
 13         .text
 14         .global FUNCNAME
 15         .type FUNCNAME, @function
 16         .p2align 5
 17 FUNCNAME:
 18         {
 19                 p0 = cmp.gtu(bytes,#0)
 20                 if (!p0.new) jump:nt .Ldone
 21                 r3 = or(dst,src)
 22                 r4 = xor(dst,src)
 23         }
 24         {
 25                 p1 = cmp.gtu(bytes,#15)
 26                 p0 = bitsclr(r3,#7)
 27                 if (!p0.new) jump:nt .Loop_not_aligned_8
 28                 src_dst_sav = combine(src,dst)
 29         }
 30 
 31         {
 32                 loopcount = lsr(bytes,#3)
 33                 if (!p1) jump .Lsmall
 34         }
 35         p3=sp1loop0(.Loop8,loopcount)
 36 .Loop8:
 37 8080:
 38 8180:
 39         {
 40                 if (p3) memd(dst++#8) = d_dbuf
 41                 d_dbuf = memd(src++#8)
 42         }:endloop0
 43 8190:
 44         {
 45                 memd(dst++#8) = d_dbuf
 46                 bytes -= asl(loopcount,#3)
 47                 jump .Lsmall
 48         }
 49 
 50 .Loop_not_aligned_8:
 51         {
 52                 p0 = bitsclr(r4,#7)
 53                 if (p0.new) jump:nt .Lalign
 54         }
 55         {
 56                 p0 = bitsclr(r3,#3)
 57                 if (!p0.new) jump:nt .Loop_not_aligned_4
 58                 p1 = cmp.gtu(bytes,#7)
 59         }
 60 
 61         {
 62                 if (!p1) jump .Lsmall
 63                 loopcount = lsr(bytes,#2)
 64         }
 65         p3=sp1loop0(.Loop4,loopcount)
 66 .Loop4:
 67 4080:
 68 4180:
 69         {
 70                 if (p3) memw(dst++#4) = w_dbuf
 71                 w_dbuf = memw(src++#4)
 72         }:endloop0
 73 4190:
 74         {
 75                 memw(dst++#4) = w_dbuf
 76                 bytes -= asl(loopcount,#2)
 77                 jump .Lsmall
 78         }
 79 
 80 .Loop_not_aligned_4:
 81         {
 82                 p0 = bitsclr(r3,#1)
 83                 if (!p0.new) jump:nt .Loop_not_aligned
 84                 p1 = cmp.gtu(bytes,#3)
 85         }
 86 
 87         {
 88                 if (!p1) jump .Lsmall
 89                 loopcount = lsr(bytes,#1)
 90         }
 91         p3=sp1loop0(.Loop2,loopcount)
 92 .Loop2:
 93 2080:
 94 2180:
 95         {
 96                 if (p3) memh(dst++#2) = w_dbuf
 97                 w_dbuf = memuh(src++#2)
 98         }:endloop0
 99 2190:
100         {
101                 memh(dst++#2) = w_dbuf
102                 bytes -= asl(loopcount,#1)
103                 jump .Lsmall
104         }
105 
106 .Loop_not_aligned: /* Works for as small as one byte */
107         p3=sp1loop0(.Loop1,bytes)
108 .Loop1:
109 1080:
110 1180:
111         {
112                 if (p3) memb(dst++#1) = w_dbuf
113                 w_dbuf = memub(src++#1)
114         }:endloop0
115         /* Done */
116 1190:
117         {
118                 memb(dst) = w_dbuf
119                 jumpr r31
120                 r0 = #0
121         }
122 
123 .Lsmall:
124         {
125                 p0 = cmp.gtu(bytes,#0)
126                 if (p0.new) jump:nt .Loop_not_aligned
127         }
128 .Ldone:
129         {
130                 r0 = #0
131                 jumpr r31
132         }
133         .falign
134 .Lalign:
135 1000:
136         {
137                 if (p0.new) w_dbuf = memub(src)
138                 p0 = tstbit(src,#0)
139                 if (!p1) jump .Lsmall
140         }
141 1100:
142         {
143                 if (p0) memb(dst++#1) = w_dbuf
144                 if (p0) bytes = add(bytes,#-1)
145                 if (p0) src = add(src,#1)
146         }
147 2000:
148         {
149                 if (p0.new) w_dbuf = memuh(src)
150                 p0 = tstbit(src,#1)
151                 if (!p1) jump .Lsmall
152         }
153 2100:
154         {
155                 if (p0) memh(dst++#2) = w_dbuf
156                 if (p0) bytes = add(bytes,#-2)
157                 if (p0) src = add(src,#2)
158         }
159 4000:
160         {
161                 if (p0.new) w_dbuf = memw(src)
162                 p0 = tstbit(src,#2)
163                 if (!p1) jump .Lsmall
164         }
165 4100:
166         {
167                 if (p0) memw(dst++#4) = w_dbuf
168                 if (p0) bytes = add(bytes,#-4)
169                 if (p0) src = add(src,#4)
170                 jump FUNCNAME
171         }
172         .size FUNCNAME,.-FUNCNAME

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php