Lines Matching +full:- +full:first
4 * Copyright (c) 2019-2022, Arm Limited.
5 * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
12 -mbranch-protect compile-time option. */
22 /* Provide default parameters for PAC-code handling in leaf-functions. */
40 * - M-profile branch target identification (BTI) landing-pads when compiled
41 * with `-mbranch-protection=bti'.
42 * - PAC-signing and verification instructions, depending on hardware support
43 * and whether the PAC-signing of leaf functions has been requested via the
44 * `-mbranch-protection=pac-ret+leaf' compiler argument.
45 * - 8-byte stack alignment preservation at function entry, defaulting to the
49 * - Prologue stack alignment is implemented by detecting a push with an odd
51 * - If alignment is attempted on a list containing r0, compilation will result
53 * - If alignment is attempted in a list containing r1, r0 will be prepended to
55 * functions with non-void return types, this will result in the corruption of
57 * - Stack alignment is enforced via the following helper macro call-chain:
59 * {prologue|epilogue} ->_align8 -> _preprocess_reglist ->
60 * _preprocess_reglist1 -> {_prologue|_epilogue}
62 * - Debug CFI directives are automatically added to prologues and epilogues,
67 * --------
68 * - first - If `last' specified, this serves as start of general-purpose
72 * - last - If given, specifies inclusive upper-bound of GPR range.
73 * - push_ip - Determines whether IP register is to be pushed to stack at
74 * prologue. When pac-signing is requested, this holds the
75 * the pac-key. Either 1 or 0 to push or not push, respectively.
77 * - push_lr - Determines whether to push lr to the stack on function entry.
79 * - align8 - Whether to enforce alignment. Either 1 or 0, with 1 requesting
83 * --------
89 * prologue push_ip=1 -> push {ip}
90 * epilogue push_ip=1, align8=1 -> pop {r2, ip}
91 * prologue push_ip=1, push_lr=1 -> push {ip, lr}
92 * epilogue 1 -> pop {r1}
93 * prologue 1, align8=1 -> push {r0, r1}
94 * epilogue 1, push_ip=1 -> pop {r1, ip}
95 * prologue 1, 4 -> push {r1-r4}
96 * epilogue 1, 4 push_ip=1 -> pop {r1-r4, ip}
101 .macro cfirestorelist first, last
103 .if \last-\first
104 cfirestorelist \first, \last-1
109 .macro cfisavelist first, last, index=1
110 .cfi_offset \last, -4*(\index)
111 .if \last-\first
112 cfisavelist \first, \last-1, \index+1
116 .macro _prologue first=-1, last=-1, push_ip=PAC_LEAF_PUSH_IP, push_lr=0
123 .if \first != -1
124 .if \last == -1
125 /* Upper-bound not provided: Set upper = lower. */
126 _prologue \first, \first, \push_ip, \push_lr
142 .if \first != -1
143 .if \last != \first
150 push {r\first-r\last, ip, lr}
151 .cfi_adjust_cfa_offset ((\last-\first)+3)*4
152 .cfi_offset 14, -4
153 .cfi_offset 143, -8
154 cfisavelist \first, \last, 3
157 push {r\first-r\last, ip}
158 .cfi_adjust_cfa_offset ((\last-\first)+2)*4
159 .cfi_offset 143, -4
160 cfisavelist \first, \last, 2
165 push {r\first-r\last, lr}
166 .cfi_adjust_cfa_offset ((\last-\first)+2)*4
167 .cfi_offset 14, -4
168 cfisavelist \first, \last, 2
171 push {r\first-r\last}
172 .cfi_adjust_cfa_offset ((\last-\first)+1)*4
173 cfisavelist \first, \last, 1
176 .else // \last == \first
180 push {r\first, ip, lr}
182 .cfi_offset 14, -4
183 .cfi_offset 143, -8
184 cfisavelist \first, \first, 3
187 push {r\first, ip}
189 .cfi_offset 143, -4
190 cfisavelist \first, \first, 2
195 push {r\first, lr}
197 .cfi_offset 14, -4
198 cfisavelist \first, \first, 2
201 push {r\first}
203 cfisavelist \first, \first, 1
207 .else // \first == -1
213 .cfi_offset 14, -4
214 .cfi_offset 143, -8
219 .cfi_offset 143, -4
226 .cfi_offset 14, -4
232 .macro _epilogue first=-1, last=-1, push_ip=PAC_LEAF_PUSH_IP, push_lr=0
239 .if \first != -1
240 .if \last == -1
241 /* Upper-bound not provided: Set upper = lower. */
242 _epilogue \first, \first, \push_ip, \push_lr
245 .if \last != \first
252 pop {r\first-r\last, ip, lr}
255 cfirestorelist \first, \last
258 pop {r\first-r\last, ip}
260 cfirestorelist \first, \last
265 pop {r\first-r\last, lr}
267 cfirestorelist \first, \last
270 pop {r\first-r\last}
271 cfirestorelist \first, \last
274 .else // \last == \first
278 pop {r\first, ip, lr}
281 cfirestorelist \first, \first
284 pop {r\first, ip}
286 cfirestorelist \first, \first
291 pop {r\first, lr}
293 cfirestorelist \first, \first
296 pop {r\first}
297 cfirestorelist \first, \first
301 .else // \first == -1
328 .macro _preprocess_reglist1 first:req, last:req, push_ip:req, push_lr:req, reglist_op:req
330 \reglist_op \first, 0, \push_ip, \push_lr
332 \reglist_op \first, 1, \push_ip, \push_lr
334 \reglist_op \first, 2, \push_ip, \push_lr
336 \reglist_op \first, 3, \push_ip, \push_lr
338 \reglist_op \first, 4, \push_ip, \push_lr
340 \reglist_op \first, 5, \push_ip, \push_lr
342 \reglist_op \first, 6, \push_ip, \push_lr
344 \reglist_op \first, 7, \push_ip, \push_lr
346 \reglist_op \first, 8, \push_ip, \push_lr
348 \reglist_op \first, 9, \push_ip, \push_lr
350 \reglist_op \first, 10, \push_ip, \push_lr
352 \reglist_op \first, 11, \push_ip, \push_lr
358 /* Clean up expressions in 'first'. */
359 .macro _preprocess_reglist first:req, last, push_ip=0, push_lr=0, reglist_op:req
361 _preprocess_reglist \first \first \push_ip \push_lr
363 .if \first > \last
364 .error "last (\last) must be at least as great as first (\first)"
366 .if \first == 0
368 .elseif \first == 1
370 .elseif \first == 2
372 .elseif \first == 3
374 .elseif \first == 4
376 .elseif \first == 5
378 .elseif \first == 6
380 .elseif \first == 7
382 .elseif \first == 8
384 .elseif \first == 9
386 .elseif \first == 10
388 .elseif \first == 11
391 .error "first (\first) out of range"
396 .macro _align8 first, last, push_ip=0, push_lr=0, reglist_op=_prologue
397 .ifb \first
399 .error "can't have last (\last) without specifying first"
402 \reglist_op first=-1, last=-1, push_ip=\push_ip, push_lr=\push_lr
409 .endif // .ifb \first
412 _align8 \first, \first, \push_ip, \push_lr, \reglist_op
420 .ifeq (\last - \first + \push_ip + \push_lr) % 2
421 .if \first == 0
422 .error "Alignment required and first register is r0"
425 _preprocess_reglist \first-1, \last, \push_ip, \push_lr, \reglist_op
427 _preprocess_reglist \first \last, \push_ip, \push_lr, \reglist_op
432 .macro prologue first, last, push_ip=PAC_LEAF_PUSH_IP, push_lr=0, align8=STACK_ALIGN_ENFORCE
434 _align8 \first, \last, \push_ip, \push_lr, _prologue
436 _prologue first=\first, last=\last, push_ip=\push_ip, push_lr=\push_lr
440 .macro epilogue first, last, push_ip=PAC_LEAF_PUSH_IP, push_lr=0, align8=STACK_ALIGN_ENFORCE
442 _align8 \first, \last, \push_ip, \push_lr, reglist_op=_epilogue
444 _epilogue first=\first, last=\last, push_ip=\push_ip, push_lr=\push_lr
473 .size name, .-name;