【2015-02-13】《RealView编译工具编译器参考指南》摘录:部分指令内在函数
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2015-02-13 标题《RealView编译工具编译器参考指南》摘录部分指令内在函数分类操作系统 / ARM 标签ARM《RealView编译工具编译器参考指南》摘录部分指令内在函数备注4.7. 指令内在函数4.7.5. \_\_current\_pc语法返回值4.7.6. \_\_current\_sp语法返回值4.7.7. \_\_disable\_fiqNote语法Note返回值限制示例4.7.8. \_\_disable\_irqNote语法Note返回值示例限制4.7.9. \_\_enable\_fiqNote语法限制4.7.10. \_\_enable\_irqNote语法限制4.7.11. \_\_fabsNote语法返回值4.7.12. \_\_fabsf4.7.18. \_\_nopNote语法4.7.28. \_\_return\_address语法返回值限制不优化内联优化尾调用优化备注1 本部分文档摘录自ARM网站【 http://infocenter.arm.com/help/index.jsp?topic/com.arm.doc.dui0348bc/index.html 】,版权归属于ARM。2 作者只摘录了部分内容全面详细的内容清参考ARM网址。4.7. 指令内在函数4.7.5. __current_pc通过使用此内在函数可以确定程序中使用该内在函数的位置处的程序计数器的当前值。语法unsigned int __current_pc(void)返回值__current_pc 内在函数返回程序中使用该内在函数的位置处的程序计数器的当前值。4.7.6. __current_sp此内在函数返回程序中当前位置的堆栈指针值。语法unsigned int __current_sp(void)返回值__current_sp 内在函数返回程序中使用该内在函数的位置处的堆栈指针的当前值。4.7.7. __disable_fiq此内在函数禁用 FIQ 中断。Note通常此内在函数通过设置 CPSR 中的 F 位禁用 FIQ 中断。但对于 v7-M它设置故障掩码寄存器 (FAULTMASK)。v6-M 中不支持 FIQ 中断。语法int __disable_fiq(void)Note在 M-profile 上__disable_fiq 内在函数具有以下原型void __disable_fiq(void)返回值__disable_fiq 返回在禁用 FIQ 中断之前 FIQ 中断掩码在 PSR 中包含的值。限制只能在特权模式即非用户模式下执行 __disable_fiq 内在函数。在用户模式下此内在函数不会更改 CPSR 中的中断标记。示例voidfoo(void){intwas_masked__disable_fiq();/* ... */if(!was_masked)__enable_fiq();}4.7.8. __disable_irq此内在函数禁用 IRQ 中断。Note通常此内在函数通过设置 CPSR 中的 I 位禁用 IRQ 中断。但对于 M-profile它设置异常掩码寄存器 (PRIMASK)。语法int __disable_irq(void)Note在 M-profile 上__disable_irq 内在函数具有以下原型void __disable_irq(void)返回值__disable_irq() 返回在禁用 IRQ 中断之前 IRQ 中断掩码在 PSR 中包含的值。示例voidfoo(void){intwas_masked__disable_irq();/* ... */if(!was_masked)__enable_irq();}限制只能在特权模式即非用户模式下执行 __disable_irq 内在函数。在用户模式下此内在函数不会更改 CPSR 中的中断标记。4.7.9. __enable_fiq此内在函数启用 FIQ 中断。Note通常此内在函数通过清除 CPSR 中的 F 位启用 FIQ 中断。但对于 v7-M它清除故障掩码寄存器 (FAULTMASK)。v6-M 中不支持 FIQ 中断。语法void __enable_fiq(void)限制只能在特权模式即非用户模式下执行 __enable_fiq 内在函数。在用户模式下此内在函数不会更改 CPSR 中的中断标记。4.7.10. __enable_irq此内在函数启用 IRQ 中断。Note通常此内在函数通过清除 CPSR 中的 I 位启用 IRQ 中断。但对于 Cortex M-profile 处理器它清除异常掩码寄存器 (PRIMASK)。语法void __enable_irq(void)限制只能在特权模式即非用户模式下执行 __enable_irq 内在函数。在用户模式下此内在函数不会更改 CPSR 中的中断标记。4.7.11. __fabs此内在函数在编译器生成的指令流中插入 VABS 指令或等效的代码序列。通过使用此内在函数可以从 C 或 C 代码中获取双精度浮点值的绝对值。Note__fabs 内在函数类似于标准 C 库函数 fabs。它在以下方面不同于标准库函数可确保在基于 ARM 体系结构且配备 VFP 协处理器的处理器上将 __fabs 调用编译为单个内联机器指令。语法double __fabs(double val)其中val是一个双精度浮点值。返回值__fabs 内在函数以 double 形式返回 val 的绝对值。4.7.12. __fabsf此内在函数是 __fabs 内在函数的单精度版本。它与 __fabs 的功能相当只不过它使用 float 类型的自变量而不是 double 类型的自变量它返回 float 值而不是 double 值。4.7.18. __nop此内在函数在编译器生成的指令流中插入 NOP 指令或等效的代码序列。将为源代码中的每个 __nop 内在函数生成一个 NOP 指令。除了正常删除不会到达的代码之外编译器不会优化删除 NOP 指令。__nop 内在函数还用作编译器中的指令调度屏障。即不会由于优化而将指令从 NOP 一侧移到另一侧。Note可以使用 __schedule_barrier 内在函数插入调度屏障而无需生成 NOP 指令。语法void __nop(void)4.7.28. __return_address此内在函数返回当前函数的返回地址。语法unsigned int __return_address(void)返回值__return_address 内在函数返回在从当前函数返回时使用的链接寄存器的值。限制__return_address 内在函数不 影响编译器执行优化的功能如内联、尾调用和代码共享。如果进行了优化__return_address 返回的值将反映所执行的优化不优化如果未执行任何优化\_\_return\_address 从函数 foo 中返回的值是 foo 的返回地址。内联优化如果函数 foo 已内联到函数 bar则 \_\_return\_address 从 foo 中返回的值是 bar 的返回地址。尾调用优化如果从函数 bar 中尾调用函数 foo则 \_\_return\_address 从 foo 中返回的值是 bar 的返回地址。