18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci// Copyright (C) 2015-2019 ARM Limited.
38c2ecf20Sopenharmony_ci// Original author: Dave Martin <Dave.Martin@arm.com>
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#ifndef ASSEMBLER_H
68c2ecf20Sopenharmony_ci#define ASSEMBLER_H
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci.macro __for from:req, to:req
98c2ecf20Sopenharmony_ci	.if (\from) == (\to)
108c2ecf20Sopenharmony_ci		_for__body %\from
118c2ecf20Sopenharmony_ci	.else
128c2ecf20Sopenharmony_ci		__for \from, %(\from) + ((\to) - (\from)) / 2
138c2ecf20Sopenharmony_ci		__for %(\from) + ((\to) - (\from)) / 2 + 1, \to
148c2ecf20Sopenharmony_ci	.endif
158c2ecf20Sopenharmony_ci.endm
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci.macro _for var:req, from:req, to:req, insn:vararg
188c2ecf20Sopenharmony_ci	.macro _for__body \var:req
198c2ecf20Sopenharmony_ci		.noaltmacro
208c2ecf20Sopenharmony_ci		\insn
218c2ecf20Sopenharmony_ci		.altmacro
228c2ecf20Sopenharmony_ci	.endm
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	.altmacro
258c2ecf20Sopenharmony_ci	__for \from, \to
268c2ecf20Sopenharmony_ci	.noaltmacro
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	.purgem _for__body
298c2ecf20Sopenharmony_ci.endm
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci.macro function name
328c2ecf20Sopenharmony_ci	.macro endfunction
338c2ecf20Sopenharmony_ci		.type \name, @function
348c2ecf20Sopenharmony_ci		.purgem endfunction
358c2ecf20Sopenharmony_ci	.endm
368c2ecf20Sopenharmony_ci\name:
378c2ecf20Sopenharmony_ci.endm
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci.macro define_accessor name, num, insn
408c2ecf20Sopenharmony_ci	.macro \name\()_entry n
418c2ecf20Sopenharmony_ci		\insn \n, 1
428c2ecf20Sopenharmony_ci		ret
438c2ecf20Sopenharmony_ci	.endm
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cifunction \name
468c2ecf20Sopenharmony_ci	adr	x2, .L__accessor_tbl\@
478c2ecf20Sopenharmony_ci	add	x2, x2, x0, lsl #3
488c2ecf20Sopenharmony_ci	br	x2
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci.L__accessor_tbl\@:
518c2ecf20Sopenharmony_ci	_for x, 0, (\num) - 1, \name\()_entry \x
528c2ecf20Sopenharmony_ciendfunction
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	.purgem \name\()_entry
558c2ecf20Sopenharmony_ci.endm
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#endif /* ! ASSEMBLER_H */
58