/*******************************************************************************
* File Name: CyBootAsmGnu.s
* Version 3.40
*
*  Description:
*   Assembly routines for GNU as.
*
********************************************************************************
* Copyright 2010-2013, Cypress Semiconductor Corporation.  All rights reserved.
* You may use this file only in accordance with the license, terms, conditions,
* disclaimers, and limitations in the end user license agreement accompanying
* the software package with which this file was provided.
*******************************************************************************/

.syntax unified
.text
.thumb


/*******************************************************************************
* Function Name: CyDelayCycles
********************************************************************************
*
* Summary:
*  Delays for the specified number of cycles.
*
* Parameters:
*  uint32 cycles: number of cycles to delay.
*
* Return:
*  None
*
*******************************************************************************/
/* void CyDelayCycles(uint32 cycles) */
.align 3                    /* Align to 8 byte boundary (2^n) */
.global CyDelayCycles
.func CyDelayCycles, CyDelayCycles
.type CyDelayCycles, %function
.thumb_func
CyDelayCycles:              /* cycles bytes */
	ADDS r0, r0, #2         /*	1	2	Round to nearest multiple of 4 */
	LSRS r0, r0, #2         /*	1	2	Divide by 4 and set flags */
	BEQ CyDelayCycles_done  /*	2	2	Skip if 0 */
	NOP                     /*	1	2	Loop alignment padding */
CyDelayCycles_loop:
	SUBS r0, r0, #1         /*	1	2 */
	MOV r0, r0              /*	1	2	Pad loop to power of two cycles */
	BNE CyDelayCycles_loop  /*	2	2 */
CyDelayCycles_done:
	BX lr                   /*	3	2 */
.endfunc


/*******************************************************************************
* Function Name: CyEnterCriticalSection
********************************************************************************
*
* Summary:
*  CyEnterCriticalSection disables interrupts and returns a value indicating
*  whether interrupts were previously enabled (the actual value depends on
*  whether the device is PSoC 3 or PSoC 5).
*
*  Note Implementation of CyEnterCriticalSection manipulates the IRQ enable bit
*  with interrupts still enabled. The test and set of the interrupt bits is not
*  atomic; this is true for both PSoC 3 and PSoC 5. Therefore, to avoid
*  corrupting processor state, it must be the policy that all interrupt routines
*  restore the interrupt enable bits as they were found on entry.
*
* Parameters:
*  None
*
* Return:
*  uint8
*   Returns 0 if interrupts were previously enabled or 1 if interrupts
*   were previously disabled.
*
*******************************************************************************/
/* uint8 CyEnterCriticalSection(void) */
.global CyEnterCriticalSection
.func CyEnterCriticalSection, CyEnterCriticalSection
.type CyEnterCriticalSection, %function
.thumb_func
CyEnterCriticalSection:
	MRS r0, PRIMASK         /* Save and return interrupt state */
	CPSID I                 /* Disable interrupts */
	BX lr
.endfunc


/*******************************************************************************
* Function Name: CyExitCriticalSection
********************************************************************************
*
* Summary:
*  CyExitCriticalSection re-enables interrupts if they were enabled before
*  CyEnterCriticalSection was called. The argument should be the value returned
*  from CyEnterCriticalSection.
*
* Parameters:
*  uint8 savedIntrStatus:
*   Saved interrupt status returned by the CyEnterCriticalSection function.
*
* Return:
*  None
*
*******************************************************************************/
/* void CyExitCriticalSection(uint8 savedIntrStatus) */
.global CyExitCriticalSection
.func CyExitCriticalSection, CyExitCriticalSection
.type CyExitCriticalSection, %function
.thumb_func
CyExitCriticalSection:
	MSR PRIMASK, r0         /* Restore interrupt state */
	BX lr
.endfunc

.end


/* [] END OF FILE */
