162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci// Copyright (C) 2015-2019 ARM Limited.
362306a36Sopenharmony_ci// Original author: Dave Martin <Dave.Martin@arm.com>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifndef ASSEMBLER_H
662306a36Sopenharmony_ci#define ASSEMBLER_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci.macro __for from:req, to:req
962306a36Sopenharmony_ci	.if (\from) == (\to)
1062306a36Sopenharmony_ci		_for__body %\from
1162306a36Sopenharmony_ci	.else
1262306a36Sopenharmony_ci		__for \from, %(\from) + ((\to) - (\from)) / 2
1362306a36Sopenharmony_ci		__for %(\from) + ((\to) - (\from)) / 2 + 1, \to
1462306a36Sopenharmony_ci	.endif
1562306a36Sopenharmony_ci.endm
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci.macro _for var:req, from:req, to:req, insn:vararg
1862306a36Sopenharmony_ci	.macro _for__body \var:req
1962306a36Sopenharmony_ci		.noaltmacro
2062306a36Sopenharmony_ci		\insn
2162306a36Sopenharmony_ci		.altmacro
2262306a36Sopenharmony_ci	.endm
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	.altmacro
2562306a36Sopenharmony_ci	__for \from, \to
2662306a36Sopenharmony_ci	.noaltmacro
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	.purgem _for__body
2962306a36Sopenharmony_ci.endm
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci.macro function name
3262306a36Sopenharmony_ci	.macro endfunction
3362306a36Sopenharmony_ci		.type \name, @function
3462306a36Sopenharmony_ci		.purgem endfunction
3562306a36Sopenharmony_ci	.endm
3662306a36Sopenharmony_ci\name:
3762306a36Sopenharmony_ci.endm
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci.macro define_accessor name, num, insn
4062306a36Sopenharmony_ci	.macro \name\()_entry n
4162306a36Sopenharmony_ci		\insn \n, 1
4262306a36Sopenharmony_ci		ret
4362306a36Sopenharmony_ci	.endm
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cifunction \name
4662306a36Sopenharmony_ci	adr	x2, .L__accessor_tbl\@
4762306a36Sopenharmony_ci	add	x2, x2, x0, lsl #3
4862306a36Sopenharmony_ci	br	x2
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci.L__accessor_tbl\@:
5162306a36Sopenharmony_ci	_for x, 0, (\num) - 1, \name\()_entry \x
5262306a36Sopenharmony_ciendfunction
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	.purgem \name\()_entry
5562306a36Sopenharmony_ci.endm
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci// Utility macro to print a literal string
5862306a36Sopenharmony_ci// Clobbers x0-x4,x8
5962306a36Sopenharmony_ci.macro puts string
6062306a36Sopenharmony_ci	.pushsection .rodata.str1.1, "aMS", @progbits, 1
6162306a36Sopenharmony_ci.L__puts_literal\@: .string "\string"
6262306a36Sopenharmony_ci	.popsection
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	ldr	x0, =.L__puts_literal\@
6562306a36Sopenharmony_ci	bl	puts
6662306a36Sopenharmony_ci.endm
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif /* ! ASSEMBLER_H */
69