Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / testing / selftests / arm64 / fp / asm-utils.S
blob4b9728efc18d2f59d2474b86debe832a931bfbf1
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (C) 2015-2021 ARM Limited.
3 // Original author: Dave Martin <Dave.Martin@arm.com>
4 //
5 // Utility functions for assembly code.
7 #include <asm/unistd.h>
8 #include "assembler.h"
10 // Print a single character x0 to stdout
11 // Clobbers x0-x2,x8
12 function putc
13         str     x0, [sp, #-16]!
15         mov     x0, #1                  // STDOUT_FILENO
16         mov     x1, sp
17         mov     x2, #1
18         mov     x8, #__NR_write
19         svc     #0
21         add     sp, sp, #16
22         ret
23 endfunction
24 .globl  putc
25         
26 // Print a NUL-terminated string starting at address x0 to stdout
27 // Clobbers x0-x3,x8
28 function puts
29         mov     x1, x0
31         mov     x2, #0
32 0:      ldrb    w3, [x0], #1
33         cbz     w3, 1f
34         add     x2, x2, #1
35         b       0b
37 1:      mov     w0, #1                  // STDOUT_FILENO
38         mov     x8, #__NR_write
39         svc     #0
41         ret
42 endfunction
43 .globl  puts
45 // Print an unsigned decimal number x0 to stdout
46 // Clobbers x0-x4,x8
47 function putdec
48         mov     x1, sp
49         str     x30, [sp, #-32]!        // Result can't be > 20 digits
51         mov     x2, #0
52         strb    w2, [x1, #-1]!          // Write the NUL terminator
54         mov     x2, #10
55 0:      udiv    x3, x0, x2              // div-mod loop to generate the digits
56         msub    x0, x3, x2, x0
57         add     w0, w0, #'0'
58         strb    w0, [x1, #-1]!
59         mov     x0, x3
60         cbnz    x3, 0b
62         ldrb    w0, [x1]
63         cbnz    w0, 1f
64         mov     w0, #'0'                // Print "0" for 0, not ""
65         strb    w0, [x1, #-1]!
67 1:      mov     x0, x1
68         bl      puts
70         ldr     x30, [sp], #32
71         ret
72 endfunction
73 .globl  putdec
75 // Print an unsigned decimal number x0 to stdout, followed by a newline
76 // Clobbers x0-x5,x8
77 function putdecn
78         mov     x5, x30
80         bl      putdec
81         mov     x0, #'\n'
82         bl      putc
84         ret     x5
85 endfunction
86 .globl  putdecn
88 // Clobbers x0-x3,x8
89 function puthexb
90         str     x30, [sp, #-0x10]!
92         mov     w3, w0
93         lsr     w0, w0, #4
94         bl      puthexnibble
95         mov     w0, w3
97         ldr     x30, [sp], #0x10
98         // fall through to puthexnibble
99 endfunction
100 .globl  puthexb
102 // Clobbers x0-x2,x8
103 function puthexnibble
104         and     w0, w0, #0xf
105         cmp     w0, #10
106         blo     1f
107         add     w0, w0, #'a' - ('9' + 1)
108 1:      add     w0, w0, #'0'
109         b       putc
110 endfunction
111 .globl  puthexnibble
113 // x0=data in, x1=size in, clobbers x0-x5,x8
114 function dumphex
115         str     x30, [sp, #-0x10]!
117         mov     x4, x0
118         mov     x5, x1
120 0:      subs    x5, x5, #1
121         b.lo    1f
122         ldrb    w0, [x4], #1
123         bl      puthexb
124         b       0b
126 1:      ldr     x30, [sp], #0x10
127         ret
128 endfunction
129 .globl  dumphex
131         // Trivial memory copy: copy x2 bytes, starting at address x1, to address x0.
132 // Clobbers x0-x3
133 function memcpy
134         cmp     x2, #0
135         b.eq    1f
136 0:      ldrb    w3, [x1], #1
137         strb    w3, [x0], #1
138         subs    x2, x2, #1
139         b.ne    0b
140 1:      ret
141 endfunction
142 .globl  memcpy
144 // Fill x1 bytes starting at x0 with 0xae (for canary purposes)
145 // Clobbers x1, x2.
146 function memfill_ae
147         mov     w2, #0xae
148         b       memfill
149 endfunction
150 .globl  memfill_ae
151         
152 // Fill x1 bytes starting at x0 with 0.
153 // Clobbers x1, x2.
154 function memclr
155         mov     w2, #0
156 endfunction
157 .globl  memclr
158         // fall through to memfill
160 // Trivial memory fill: fill x1 bytes starting at address x0 with byte w2
161 // Clobbers x1
162 function memfill
163         cmp     x1, #0
164         b.eq    1f
166 0:      strb    w2, [x0], #1
167         subs    x1, x1, #1
168         b.ne    0b
170 1:      ret
171 endfunction
172 .globl  memfill