Skip to content

Implement ARM intrinsics for thumbv6 / thumbv7 #437

Closed
@jcsoo

Description

@jcsoo

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

Metadata

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