Skip to content

Implement ARM intrinsics for thumbv6 / thumbv7 #437

Closed

Description

See Implement all x86 vendor intrinsics for more information about implementing intrinsics.

Also see rust-embedded/wg#63 for more discussion.

There are two groups of intrinsics that need to be implemented for thumbv6 / thumbv7.

Core Register Access functions

Documentation of the core register functions:

https://www.keil.com/pack/doc/CMSIS/Core/html/group__Core__Register__gr.html

ARM CMSIS header file:

https://github.com/ARM-software/CMSIS/blob/master/CMSIS/Include/cmsis_armcc.h

CPSID

  • fn disable_fault_irq() // CPSID f
  • fn disable_irq() // CPSID i
  • fn enable_fault_irq() // CPSIE f
  • fn enable_irq() // CPSIE e

MRS

  • fn get_ASPR() -> u32
  • fn get_BASEPRI -> u32
  • fn get_CONTROL() -> u32
  • fn get_FAULTMASK() -> u32
  • fn get_FPSCR() -> u32 // - M4, M7
  • fn get_IPSR() -> u32
  • fn get_MSP() -> u32
  • fn get_PRIMASK() -> u32
  • fn get_PSP() -> u32
  • fn get_xPSR() -> u32

MSR

  • fn set_ASPR(u32)
  • fn set_BASEPRI(u32)
  • fn set_CONTROL(u32)
  • fn set_FAULTMASK(u32)
  • fn set_FPSCR(u32) // - M4, M7
  • fn set_IPSR(u32)
  • fn set_MSP(u32)
  • fn set_PRIMASK(u32)
  • fn set_PSP(u32)
  • fn set_xPSR(u32)

ARM ACLE Intrinsics

The ARM ACLE specification is here:

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053d/IHI0053D_acle_2_1.pdf

The Clang ARM ACLE header file is here:

https://github.com/llvm-mirror/clang/blob/master/lib/Headers/arm_acle.h

The compiler intrinsics available through LLVM can be found here:

https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/IntrinsicsARM.td

8.3 Memory Barriers

  • fn dmb(u32) // Data Memory Barrier
  • fn dsb(u32) // Data Synchronization Barrier
  • fn isb(u32) // Instruction Synchronziation Barrier

8.4 Hints

  • fn wfi() // Wait For Interrupt
  • fn wfe() // Wait for Event
  • fn sev() // Send Global Event
  • fn sevl() // Send Local Event
  • fn yield() // Yield
  • fn dbg(u32) // Debug

8.5 Swap

  • fn swp(u32, *mut u32) // Swap

8.7 NOP

  • fn nop() // No-op

9.2 Miscellaneous data-processing intrinsics

Note: These may have equivalents in core.

  • fn ror(u32, u32) -> u32 // Rotate Right
  • fn clz(u32) -> u32 // Count Leading Zeros
  • fn cls(u32) -> u32 // Count Leading Sign Bits
  • fn rev(u32) -> u32 // Reverse Byte Order
  • fn rev16(u32) -> u32 // Reverse Byte Order (16 bit)
  • fn revsh(u32) -> u32 // Reverse Byte Order Signed (16 bit)
  • fn rbit(u32) -> u32 / Reverse Bits

10.1 Special register intrinsics

  • fn arm_rsr(special_register) -> u32 // Read System Register
  • fn arm_rsrp(special_register) -> *const () // Read System Register Containing Address
  • fn arm_wsr(special_register, u32) // Write System Register
  • fn arm_wsrp(special_register, *const ()) // Write System Register
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions