【问题标题】:unify neon assembly on both iOS and android在 iOS 和 android 上统一 neon 组件
【发布时间】:2012-02-03 08:19:31
【问题描述】:

我想在 IOS(Xcode4.2) 和 Android(ndk r7) 上使用统一的 NEON 汇编代码。但是它们的宏定义却大不相同:

IOS:

.macro TestMacro 3

vext.8 $2, $0, $1, #1

.endm

ndk r7:

.macro TestMacro ref,src,dst

vext.8 \dst,\ref,\src, #1

.endm

有统一它们的想法吗?谢谢。

【问题讨论】:

  • 对于这种情况,我会编写一个脚本,将一种形式转换为另一种形式。
  • 我和@BitBank 在这方面。编写一个脚本,将一个转换为另一个。或者用您自己的宏语言编写实际的程序集,该语言可以很容易地通过脚本翻译成您现在需要的任何语言。第一个可能更快,但如果您需要对大量文件执行此操作并希望将其翻译给第三个编译器(例如 RVCT),则创建自己的语言可能更容易。

标签: ios xcode assembly android-ndk arm


【解决方案1】:

我为 ios 和 android 使用单独的宏定义

example.S

#ifdef __MACH__

; iOS
.macro TestMacro
    vext.8 $2, $0, $1, #1
.endm

#else//__MACH__

; Android NDK
.macro TestMacro ref,src,dst
    vext.8 \dst,\ref,\src, #1
.endm

#endif//__MACH__

【讨论】:

    【解决方案2】:

    您可以使用 C 预处理器启用“新”宏语法,如下所示:

    #include "macros.h"
    
    .macro M_DEMO M3ARGS
       #define ref MARG0
       #define src MARG1
       #define dst MARG2
    
       vext.8 dst, ref, src, #1
    
       #undef ref
       #undef src
       #undef dst
    .endm
    

    macros.h 头文件包含的位置:

    #ifndef __MACROS_H__
    #define __MACROS_H__
    
    #ifdef __MACH__
    
        /*
         * iOS macro support
         */
    
        // Number of arguments in macro definition
        #define M0ARGS
        #define M1ARGS
        #define M2ARGS
        #define M3ARGS
        #define M4ARGS
        #define M5ARGS
        #define M6ARGS
        #define M7ARGS
        #define M8ARGS
        #define M9ARGS
        #define M10ARGS
    
        // Macro arguments
        #define MARG0 $0
        #define MARG1 $1
        #define MARG2 $2
        #define MARG3 $3
        #define MARG4 $4
        #define MARG5 $5
        #define MARG6 $6
        #define MARG7 $7
        #define MARG8 $8
        #define MARG9 $9
    
    #else
    
        /* 
         * Android macro support
         */
    
        // Number of arguments in macro definition
        #define M0ARGS
        #define M1ARGS  $0
        #define M2ARGS  $0, $1
        #define M3ARGS  $0, $1, $2
        #define M4ARGS  $0, $1, $2, $3
        #define M5ARGS  $0, $1, $2, $3, $4
        #define M6ARGS  $0, $1, $2, $3, $4, $5
        #define M7ARGS  $0, $1, $2, $3, $4, $5, $6
        #define M8ARGS  $0, $1, $2, $3, $4, $5, $6, $7
        #define M9ARGS  $0, $1, $2, $3, $4, $5, $6, $7, $8
        #define M10ARGS $0, $1, $2, $3, $4, $5, $6, $7, $8, $9
    
        // Macro arguments
        #define MARG0 \$0
        #define MARG1 \$1
        #define MARG2 \$2
        #define MARG3 \$3
        #define MARG4 \$4
        #define MARG5 \$5
        #define MARG6 \$6
        #define MARG7 \$7
        #define MARG8 \$8
        #define MARG9 \$9
    
    #endif
    
    #endif // __MACROS_H__
    

    【讨论】:

      【解决方案3】:

      尝试使用来自 C/C++ 源代码的 GCC 内在函数,而不是编写汇编文件。或 GCC 内联汇编。

      【讨论】:

      • 而不是使用 GCC 内在函数只是不使用宏应该是一个更好的选择;)但这不是对问题的回应!
      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 2012-03-12
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      相关资源
      最近更新 更多