/*
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "pico.h"

#ifdef __riscv
// Get macros for convenient use of Hazard3 instructions without binutils support
#include "hardware/hazard3/instructions.h"
#endif

#if !PICO_ASSEMBLER_IS_CLANG
#define apsr_nzcv r15
#endif
// note we don't do this by default in this file for backwards comaptibility with user code
// that may include this file, but not use unified syntax. Note that this macro does equivalent
// setup to the pico_default_asm macro for inline assembly in C code.
.macro pico_default_asm_setup
#ifndef __riscv
.syntax unified
.cpu cortex-m33
.fpu fpv5-sp-d16
.thumb
#endif
.endm

// do not put align in here as it is used mid function sometimes
.macro local_func x
.type \x,%function
#ifndef __riscv
.thumb_func
#endif
\x:
.endm

// do not put align in here as it is used mid function sometimes
.macro regular_func x
.global \x
.type \x,%function
#ifndef __riscv
.thumb_func
#endif
\x:
.endm

.macro weak_func x
.weak \x
.type \x,%function
#ifndef __riscv
.thumb_func
#endif
\x:
.endm

.macro regular_func_with_section x
.section .text.\x
regular_func \x
.endm

// do not put align in here as it is used mid function sometimes
.macro wrapper_func x
regular_func WRAPPER_FUNC_NAME(\x)
.endm

.macro weak_wrapper_func x
weak_func WRAPPER_FUNC_NAME(\x)
.endm

.macro __pre_init_with_offset func, offset, priority_string1
.section .preinit_array.\priority_string1
.p2align 2
.word \func + \offset
.endm

// backwards compatibility
.macro __pre_init func, priority_string1
__pre_init_with_offset \func, 0, \priority_string1
.endm
