| /* |
| * Copyright 2020 Broadcom. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_ARCH_ARM64_MACRO_INC_ |
| #define ZEPHYR_INCLUDE_ARCH_ARM64_MACRO_INC_ |
| |
| #ifdef _ASMLANGUAGE |
| |
| .macro switch_el, xreg, el3_label, el2_label, el1_label |
| mrs \xreg, CurrentEL |
| cmp \xreg, 0xc |
| beq \el3_label |
| cmp \xreg, 0x8 |
| beq \el2_label |
| cmp \xreg, 0x4 |
| beq \el1_label |
| .endm |
| |
| /* |
| * macro to support mov of immediate constant to 64 bit register |
| * It will generate instruction sequence of 'mov'/ 'movz' and one |
| * to three 'movk' depending on the immediate value. |
| */ |
| .macro mov_imm, xreg, imm |
| .if ((\imm) == 0) |
| mov \xreg, \imm |
| .else |
| .if (((\imm) >> 31) == 0 || ((\imm) >> 31) == 0x1ffffffff) |
| movz \xreg, (\imm >> 16) & 0xffff, lsl 16 |
| .else |
| .if (((\imm) >> 47) == 0 || ((\imm) >> 47) == 0x1ffff) |
| movz \xreg, (\imm >> 32) & 0xffff, lsl 32 |
| .else |
| movz \xreg, (\imm >> 48) & 0xffff, lsl 48 |
| movk \xreg, (\imm >> 32) & 0xffff, lsl 32 |
| .endif |
| movk \xreg, (\imm >> 16) & 0xffff, lsl 16 |
| .endif |
| movk \xreg, (\imm) & 0xffff, lsl 0 |
| .endif |
| .endm |
| #endif /* _ASMLANGUAGE */ |
| |
| #endif /* ZEPHYR_INCLUDE_ARCH_ARM64_MACRO_INC_ */ |