• Linux下VFP NEON浮点编译


    http://blog.csdn.net/liujia2100/article/details/27236477

    NEON:SIMD(Single Instruction Multiple Data 单指令多重数据) 指令集, 其针对多媒体和讯号处理程式具备标准化的加速能力。

    VFP: (Vector Float Point), 向量浮点运算单元,arm11(s3c6410 支持VFPv2),Cortex-A8(s5pv210)支持VFPv3.

    NEON和VFPv3 浮点协处理器共享寄存器组,所以在汇编时,指令是一样的。

    编译选项:

    -mfpu = name(neon or vfpvx)指定FPU 单元

    -mfloat-abi = name(soft、hard、 softfp):指定软件浮点或硬件浮点或兼容软浮点调用接口

    如果只指定 -mfpu,那么默认编译不会选择选择硬件浮点指令集

    如果只指定 -mfloat-abi = hard或者softfp,那么编译会使用硬件浮点指令集

    测试C文件

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. int main(void)  
    2. {  
    3.     float f1, f2, f3;  
    4.     f1 = 1.2;  
    5.     f2 = 1.3;  
    6.     f3 = f1 / f2;  
    7.     return 0;  
    8. }  


    1、 arm-eabi-gcc  -S hello.c -mfpu=neon

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .fpu softvfp  
    3.     .eabi_attribute 20, 1  
    4.     .eabi_attribute 21, 1  
    5.     .eabi_attribute 23, 3  
    6.     .eabi_attribute 24, 1  
    7.     .eabi_attribute 25, 1  
    8.     .eabi_attribute 26, 2  
    9.     .eabi_attribute 30, 6  
    10.     .eabi_attribute 18, 4  
    11.     .file   "hello.c"  
    12.     .global __aeabi_fdiv  
    13.     .text  
    14.     .align  2  
    15.     .global main  
    16.     .type   main, %function  
    17. main:  
    18.     .fnstart  
    19. .LFB0:  
    20.     @ args = 0, pretend = 0, frame = 16  
    21.     @ frame_needed = 1, uses_anonymous_args = 0  
    22.     stmfd   sp!, {fp, lr}  
    23.     .save {fp, lr}  
    24. .LCFI0:  
    25.     .setfp fp, sp, #4  
    26.     add fp, sp, #4  
    27. .LCFI1:  
    28.     .pad #16  
    29.     sub sp, sp, #16  
    30. .LCFI2:  
    31.     ldr r3, .L3 @ float  
    32.     str r3, [fp, #-16]  @ float  
    33.     ldr r3, .L3+4   @ float  
    34.     str r3, [fp, #-12]  @ float  
    35.     ldr r0, [fp, #-16]  @ float  
    36.     ldr r1, [fp, #-12]  @ float  
    37.     bl  __aeabi_fdiv  
    38.     mov r3, r0  
    39.     str r3, [fp, #-8]   @ float  
    40.     mov r3, #0  
    41.     mov r0, r3  
    42.     sub sp, fp, #4  
    43.     ldmfd   sp!, {fp, pc}  
    44. .L4:  
    45.     .align  2  
    46. .L3:  
    47.     .word   1067030938  
    48.     .word   1067869798  
    49. .LFE0:  
    50.     .fnend  
    51.     .size   main, .-main  
    52.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    53.     .section    .note.GNU-stack,"",%progbits  


    2、 arm-eabi-gcc  -S hello.c -mfpu=vfp

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .fpu softvfp  
    3.     .eabi_attribute 20, 1  
    4.     .eabi_attribute 21, 1  
    5.     .eabi_attribute 23, 3  
    6.     .eabi_attribute 24, 1  
    7.     .eabi_attribute 25, 1  
    8.     .eabi_attribute 26, 2  
    9.     .eabi_attribute 30, 6  
    10.     .eabi_attribute 18, 4  
    11.     .file   "hello.c"  
    12.     .global __aeabi_fdiv  
    13.     .text  
    14.     .align  2  
    15.     .global main  
    16.     .type   main, %function  
    17. main:  
    18.     .fnstart  
    19. .LFB0:  
    20.     @ args = 0, pretend = 0, frame = 16  
    21.     @ frame_needed = 1, uses_anonymous_args = 0  
    22.     stmfd   sp!, {fp, lr}  
    23.     .save {fp, lr}  
    24. .LCFI0:  
    25.     .setfp fp, sp, #4  
    26.     add fp, sp, #4  
    27. .LCFI1:  
    28.     .pad #16  
    29.     sub sp, sp, #16  
    30. .LCFI2:  
    31.     ldr r3, .L3 @ float  
    32.     str r3, [fp, #-16]  @ float  
    33.     ldr r3, .L3+4   @ float  
    34.     str r3, [fp, #-12]  @ float  
    35.     ldr r0, [fp, #-16]  @ float  
    36.     ldr r1, [fp, #-12]  @ float  
    37.     bl  __aeabi_fdiv  
    38.     mov r3, r0  
    39.     str r3, [fp, #-8]   @ float  
    40.     mov r3, #0  
    41.     mov r0, r3  
    42.     sub sp, fp, #4  
    43.     ldmfd   sp!, {fp, pc}  
    44. .L4:  
    45.     .align  2  
    46. .L3:  
    47.     .word   1067030938  
    48.     .word   1067869798  
    49. .LFE0:  
    50.     .fnend  
    51.     .size   main, .-main  
    52.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    53.     .section    .note.GNU-stack,"",%progbits  


    可以看到上面两个例子,使用的是 .fpu softvfp

    3、 arm-eabi-gcc  -S hello.c -mfpu=neon -mfloat-abi=hard

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .eabi_attribute 27, 3  
    3.     .eabi_attribute 28, 1  
    4.     .fpu neon  
    5.     .eabi_attribute 20, 1  
    6.     .eabi_attribute 21, 1  
    7.     .eabi_attribute 23, 3  
    8.     .eabi_attribute 24, 1  
    9.     .eabi_attribute 25, 1  
    10.     .eabi_attribute 26, 2  
    11.     .eabi_attribute 30, 6  
    12.     .eabi_attribute 18, 4  
    13.     .file   "hello.c"  
    14.     .text  
    15.     .align  2  
    16.     .global main  
    17.     .type   main, %function  
    18. main:  
    19.     .fnstart  
    20. .LFB0:  
    21.     @ args = 0, pretend = 0, frame = 16  
    22.     @ frame_needed = 1, uses_anonymous_args = 0  
    23.     @ link register save eliminated.  
    24.     str fp, [sp, #-4]!  
    25.     .save {fp}  
    26. .LCFI0:  
    27.     .setfp fp, sp, #0  
    28.     add fp, sp, #0  
    29. .LCFI1:  
    30.     .pad #20  
    31.     sub sp, sp, #20  
    32. .LCFI2:  
    33.     flds    s15, .L3  
    34.     fsts    s15, [fp, #-16]  
    35.     flds    s15, .L3+4  
    36.     fsts    s15, [fp, #-12]  
    37.     flds    s14, [fp, #-16]  
    38.     flds    s15, [fp, #-12]  
    39.     fdivs   s15, s14, s15  
    40.     fsts    s15, [fp, #-8]  
    41.     mov r3, #0  
    42.     mov r0, r3  
    43.     add sp, fp, #0  
    44.     ldmfd   sp!, {fp}  
    45.     bx  lr  
    46. .L4:  
    47.     .align  2  
    48. .L3:  
    49.     .word   1067030938  
    50.     .word   1067869798  
    51. .LFE0:  
    52.     .fnend  
    53.     .size   main, .-main  
    54.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    55.     .section    .note.GNU-stack,"",%progbits  


    4、 arm-eabi-gcc  -S hello.c -mfpu=neon -mfloat-abi=softfp

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .eabi_attribute 27, 3  
    3.     .fpu neon  
    4.     .eabi_attribute 20, 1  
    5.     .eabi_attribute 21, 1  
    6.     .eabi_attribute 23, 3  
    7.     .eabi_attribute 24, 1  
    8.     .eabi_attribute 25, 1  
    9.     .eabi_attribute 26, 2  
    10.     .eabi_attribute 30, 6  
    11.     .eabi_attribute 18, 4  
    12.     .file   "hello.c"  
    13.     .text  
    14.     .align  2  
    15.     .global main  
    16.     .type   main, %function  
    17. main:  
    18.     .fnstart  
    19. .LFB0:  
    20.     @ args = 0, pretend = 0, frame = 16  
    21.     @ frame_needed = 1, uses_anonymous_args = 0  
    22.     @ link register save eliminated.  
    23.     str fp, [sp, #-4]!  
    24.     .save {fp}  
    25. .LCFI0:  
    26.     .setfp fp, sp, #0  
    27.     add fp, sp, #0  
    28. .LCFI1:  
    29.     .pad #20  
    30.     sub sp, sp, #20  
    31. .LCFI2:  
    32.     flds    s15, .L3  
    33.     fsts    s15, [fp, #-16]  
    34.     flds    s15, .L3+4  
    35.     fsts    s15, [fp, #-12]  
    36.     flds    s14, [fp, #-16]  
    37.     flds    s15, [fp, #-12]  
    38.     fdivs   s15, s14, s15  
    39.     fsts    s15, [fp, #-8]  
    40.     mov r3, #0  
    41.     mov r0, r3  
    42.     add sp, fp, #0  
    43.     ldmfd   sp!, {fp}  
    44.     bx  lr  
    45. .L4:  
    46.     .align  2  
    47. .L3:  
    48.     .word   1067030938  
    49.     .word   1067869798  
    50. .LFE0:  
    51.     .fnend  
    52.     .size   main, .-main  
    53.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    54.     .section    .note.GNU-stack,"",%progbits  


    5、 arm-eabi-gcc  -S hello.c -mfpu=vfpv3 -mfloat-abi=softfp

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .eabi_attribute 27, 3  
    3.     .fpu vfpv3  
    4.     .eabi_attribute 20, 1  
    5.     .eabi_attribute 21, 1  
    6.     .eabi_attribute 23, 3  
    7.     .eabi_attribute 24, 1  
    8.     .eabi_attribute 25, 1  
    9.     .eabi_attribute 26, 2  
    10.     .eabi_attribute 30, 6  
    11.     .eabi_attribute 18, 4  
    12.     .file   "hello.c"  
    13.     .text  
    14.     .align  2  
    15.     .global main  
    16.     .type   main, %function  
    17. main:  
    18.     .fnstart  
    19. .LFB0:  
    20.     @ args = 0, pretend = 0, frame = 16  
    21.     @ frame_needed = 1, uses_anonymous_args = 0  
    22.     @ link register save eliminated.  
    23.     str fp, [sp, #-4]!  
    24.     .save {fp}  
    25. .LCFI0:  
    26.     .setfp fp, sp, #0  
    27.     add fp, sp, #0  
    28. .LCFI1:  
    29.     .pad #20  
    30.     sub sp, sp, #20  
    31. .LCFI2:  
    32.     flds    s15, .L3  
    33.     fsts    s15, [fp, #-16]  
    34.     flds    s15, .L3+4  
    35.     fsts    s15, [fp, #-12]  
    36.     flds    s14, [fp, #-16]  
    37.     flds    s15, [fp, #-12]  
    38.     fdivs   s15, s14, s15  
    39.     fsts    s15, [fp, #-8]  
    40.     mov r3, #0  
    41.     mov r0, r3  
    42.     add sp, fp, #0  
    43.     ldmfd   sp!, {fp}  
    44.     bx  lr  
    45. .L4:  
    46.     .align  2  
    47. .L3:  
    48.     .word   1067030938  
    49.     .word   1067869798  
    50. .LFE0:  
    51.     .fnend  
    52.     .size   main, .-main  
    53.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    54.     .section    .note.GNU-stack,"",%progbits  


    6、 arm-eabi-gcc  -S hello.c -mfpu=vfpv3 -mfloat-abi=hard

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .eabi_attribute 27, 3  
    3.     .eabi_attribute 28, 1  
    4.     .fpu vfpv3  
    5.     .eabi_attribute 20, 1  
    6.     .eabi_attribute 21, 1  
    7.     .eabi_attribute 23, 3  
    8.     .eabi_attribute 24, 1  
    9.     .eabi_attribute 25, 1  
    10.     .eabi_attribute 26, 2  
    11.     .eabi_attribute 30, 6  
    12.     .eabi_attribute 18, 4  
    13.     .file   "hello.c"  
    14.     .text  
    15.     .align  2  
    16.     .global main  
    17.     .type   main, %function  
    18. main:  
    19.     .fnstart  
    20. .LFB0:  
    21.     @ args = 0, pretend = 0, frame = 16  
    22.     @ frame_needed = 1, uses_anonymous_args = 0  
    23.     @ link register save eliminated.  
    24.     str fp, [sp, #-4]!  
    25.     .save {fp}  
    26. .LCFI0:  
    27.     .setfp fp, sp, #0  
    28.     add fp, sp, #0  
    29. .LCFI1:  
    30.     .pad #20  
    31.     sub sp, sp, #20  
    32. .LCFI2:  
    33.     flds    s15, .L3  
    34.     fsts    s15, [fp, #-16]  
    35.     flds    s15, .L3+4  
    36.     fsts    s15, [fp, #-12]  
    37.     flds    s14, [fp, #-16]  
    38.     flds    s15, [fp, #-12]  
    39.     fdivs   s15, s14, s15  
    40.     fsts    s15, [fp, #-8]  
    41.     mov r3, #0  
    42.     mov r0, r3  
    43.     add sp, fp, #0  
    44.     ldmfd   sp!, {fp}  
    45.     bx  lr  
    46. .L4:  
    47.     .align  2  
    48. .L3:  
    49.     .word   1067030938  
    50.     .word   1067869798  
    51. .LFE0:  
    52.     .fnend  
    53.     .size   main, .-main  
    54.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    55.     .section    .note.GNU-stack,"",%progbits  


    从上面可以看到,使用softfp和hard使用的指令集是一样的,都是硬件浮点, neon和vfp的区别,仅仅体现在.fpu vfpv3和.fpu neon.

    7、 arm-eabi-gcc  -S hello.c -mfloat-abi=hard

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.     .arch armv5te  
    2.     .eabi_attribute 27, 3  
    3.     .eabi_attribute 28, 1  
    4.     .fpu vfp  
    5.     .eabi_attribute 20, 1  
    6.     .eabi_attribute 21, 1  
    7.     .eabi_attribute 23, 3  
    8.     .eabi_attribute 24, 1  
    9.     .eabi_attribute 25, 1  
    10.     .eabi_attribute 26, 2  
    11.     .eabi_attribute 30, 6  
    12.     .eabi_attribute 18, 4  
    13.     .file   "hello.c"  
    14.     .text  
    15.     .align  2  
    16.     .global main  
    17.     .type   main, %function  
    18. main:  
    19.     .fnstart  
    20. .LFB0:  
    21.     @ args = 0, pretend = 0, frame = 16  
    22.     @ frame_needed = 1, uses_anonymous_args = 0  
    23.     @ link register save eliminated.  
    24.     str fp, [sp, #-4]!  
    25.     .save {fp}  
    26. .LCFI0:  
    27.     .setfp fp, sp, #0  
    28.     add fp, sp, #0  
    29. .LCFI1:  
    30.     .pad #20  
    31.     sub sp, sp, #20  
    32. .LCFI2:  
    33.     flds    s15, .L3  
    34.     fsts    s15, [fp, #-16]  
    35.     flds    s15, .L3+4  
    36.     fsts    s15, [fp, #-12]  
    37.     flds    s14, [fp, #-16]  
    38.     flds    s15, [fp, #-12]  
    39.     fdivs   s15, s14, s15  
    40.     fsts    s15, [fp, #-8]  
    41.     mov r3, #0  
    42.     mov r0, r3  
    43.     add sp, fp, #0  
    44.     ldmfd   sp!, {fp}  
    45.     bx  lr  
    46. .L4:  
    47.     .align  2  
    48. .L3:  
    49.     .word   1067030938  
    50.     .word   1067869798  
    51. .LFE0:  
    52.     .fnend  
    53.     .size   main, .-main  
    54.     .ident  "GCC: (Sourcery G++ Lite 2009q3-67) 4.4.1"  
    55.     .section    .note.GNU-stack,"",%progbits  


    当直接使用-mfloat-abi=hard时,会默认使用.fpu vfp硬件浮点。

     

  • 相关阅读:
    Python接口测试
    Python数据类型间互转(字典、字符串、列表、元组)
    Jenkins自动构建部署(Maven+SVN+Tomcat7))
    Hadoop搭建HA环境(Hadoop+HBase+Zookeeper)注意事项
    CentOS中安装使用ssh
    CentOS中设置网络
    CentOS中永久修改主机名
    jsp页面动态的显示当前系统的时间
    css样式解决不同IE版本之间的兼容问题
    java.lang.NoClassDefFoundError: org/apache/jsp/licence_jsp (wrong name: org/apache/jsp/Licence_jsp)
  • 原文地址:https://www.cnblogs.com/leaven/p/6244697.html
Copyright © 2020-2023  润新知