zoukankan      html  css  js  c++  java
  • Linux内核使用浮点运算问题

      上一篇博文中 电池温度检测原理和示例代码 ,由于驱动要使用对数函数而从网上参看一个实现

    double ln(double a)
    {
        int N = 15;
        int k,nk;
        double x,xx,y;
    
        x = (a-1)/(a+1);
        xx = x*x;
        nk = 2*N+1;
        y = 1.0/nk;
        for(k=N;k>0;k--) {
            nk = nk - 2;
            y = 1.0/nk+xx*y;
        }
    
        return 2.0*x*y;
    }

    尴尬的是当时内核不支持浮点运算所以停滞了, 时间紧迫只能折中先列出各个温度和电压对应表, 通过查表方式处理, 今天着重了解一下为何内核使用浮点运算“前世今生”

    一、早期处理器

      由于早期处理器硬件压根没有浮点运算功能, 所以编译器自然不会编译出对应指令, 但是确实有需要的场景, 无论应用程序还是内核驱动, 所有出现了浮点模拟器,具体配置在:   

        

      原理很简单, 就是编译器对浮点运算代码还是编译对应“指令”, 当运行时ARM指令集没有该“指令”从而导致指令异常, 然后在异常处理函数中调用浮点模拟器函数计算该“指令”并返回结果

    优点不言而喻是能够支持浮点需求场景, 对应用程序还是驱动都透明;缺点也显而易见, 这种“指令异常” 方式会增加系统无效负载, 影响中断响应时间等。

      Linus Torvalds认为内核不应该进行浮点运算, 所以后来的内核版本menuconfig我没看到有这个浮点模拟器, 相比于内核应用程序使用到浮点运算需求更大, 总不能“躺枪”也不能用吧?

    所以就出现了个软浮点库, 编译器在编译应用程序发现这是一条浮点运算时会用函数进行替代! 比如上面ln()函数的x = (a-1)/(a+1); 减法 加法 最后相除都调用函数解决!

        x = (a-1)/(a+1); 
    反汇编如下:
        84c8:       e3a0300f        mov     r3, #15
        84cc:       e50b3020        str     r3, [fp, #-32]  ; 0xffffffe0
        84d0:       e14b03dc        ldrd    r0, [fp, #-60]  ; 0xffffffc4
        84d4:       e3a02000        mov     r2, #0
        84d8:       e3a035ff        mov     r3, #1069547520 ; 0x3fc00000
        84dc:       e2833603        add     r3, r3, #3145728        ; 0x300000
        84e0:       eb000188        bl      8b08 <__aeabi_dsub>
        84e4:       e1a02000        mov     r2, r0
        84e8:       e1a03001        mov     r3, r1
        84ec:       e1a04002        mov     r4, r2
        84f0:       e1a05003        mov     r5, r3
        84f4:       e14b03dc        ldrd    r0, [fp, #-60]  ; 0xffffffc4
        84f8:       e3a02000        mov     r2, #0
        84fc:       e3a035ff        mov     r3, #1069547520 ; 0x3fc00000
        8500:       e2833603        add     r3, r3, #3145728        ; 0x300000
        8504:       eb000180        bl      8b0c <__adddf3>
        8508:       e1a02000        mov     r2, r0
        850c:       e1a03001        mov     r3, r1
        8510:       e1a00004        mov     r0, r4
        8514:       e1a01005        mov     r1, r5
        8518:       eb000301        bl      9124 <__aeabi_ddiv>

      这很好理解, 毕竟应用使用浮点频率较高, 靠浮点模拟器总产生异常应用态切成内核态处理完再返回用户态, 太耗性能了。

    二、现代处理器

      现代处理器硬件已经支持浮点运算, 而且作为一个组件对待, 可选配, 根据需求和方案选型处理器时评估是否需要硬件支持。在STM系列浮点硬件单元叫做FPU(float process unit)吧,

    ARM中归属协处理器那边的。所以我们知道如果要使用硬件浮点的话, 需要满足三个条件:

    1. 硬件要有浮点运算单元
    2. 软件要配置使能硬件浮点,比如Linux内核要选中下面配置(主要设置协处理器)
    
    3. 编译器指定-mfloat-abi=softfp 或-mfloat-abi=hard 编译浮点指令而不是用函数替换!

       同样是上面ln()函数的x = (a-1)/(a+1); 采用了硬浮点指令后反汇编代码如下:

        x = (a-1)/(a+1); 
    反汇编如下:
      84b0:    ed1b6b0d     vldr    d6, [fp, #-52]    ; 0xffffffcc
        84b4:    ed9f7b33     vldr    d7, [pc, #204]    ; 8588 <ln+0xf0>
        84b8:    ee365b47     vsub.f64    d5, d6, d7
        84bc:    ed1b6b0d     vldr    d6, [fp, #-52]    ; 0xffffffcc
        84c0:    ed9f7b30     vldr    d7, [pc, #192]    ; 8588 <ln+0xf0>
        84c4:    ee366b07     vadd.f64    d6, d6, d7
        84c8:    ee857b06     vdiv.f64    d7, d5, d6

     三、示例代码

      我们分别写个应用程序和驱动程序, 且分别用软浮点和硬浮点测试其性能

    1.应用程序

       代码如下:

    /* arm-none-linux-gnueabi-gcc -mfloat-abi=soft application_test.c -lrt -o soft.bin
     * arm-none-linux-gnueabi-gcc -mfloat-abi=softfp application_test.c -lrt -o softfp.bin
     * arm-none-linux-gnueabi-gcc -mfloat-abi=hard application_test.c -lrt  fail!!
     */
    #include<stdio.h>
    #include<time.h>
    
    double ln(double a)
    {
        int N = 15;
        int k,nk;
        double x,xx,y;
    
        x = (a-1)/(a+1);
        xx = x*x;
        nk = 2*N+1;
        y = 1.0/nk;
        for(k=N;k>0;k--) {
            nk = nk - 2;
            y = 1.0/nk+xx*y;
        }
    
        return 2.0*x*y;
    }
    
    int main()
    {
        int t1;
        double Rt, Vadc;
        struct timespec time_start={0, 0},time_end={0, 0};
    
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time_start);
        /* 根据采样电压反推热敏电阻的温度 */
        for(Vadc=1; Vadc<1800; Vadc++) {
            Rt = Vadc * 47000 / (1800-Vadc);
            t1=1/(ln(Rt/10000)/3950+1/298.15)-273.15;
        }
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time_end);
    
        printf("start time %ld s,%ld ns
    ", time_start.tv_sec, time_start.tv_nsec);
        printf("end   time %ld s,%ld ns
    ", time_end.tv_sec, time_end.tv_nsec);
        printf("duration:%ld s %ld ns
    ", time_end.tv_sec-time_start.tv_sec, time_end.tv_nsec-time_start.tv_nsec);
        
        printf("%.10fmv = %d
    ", Vadc, t1);
    
        return 0;
    }

    反汇编可以看出硬浮点直接指令, 软浮点是用函数替换而且是静态链接, 导致bin文件比较大

    /* arm-none-linux-gnueabi-objdump -d soft.bin > objdump_soft.txt */
    soft.bin:     file format elf32-littlearm
    
    
    Disassembly of section .init:
    
    00008388 <_init>:
        8388:    e92d4008     push    {r3, lr}
        838c:    eb000024     bl    8424 <call_gmon_start>
        8390:    e8bd8008     pop    {r3, pc}
    
    Disassembly of section .plt:
    
    00008394 <.plt>:
        8394:    e52de004     push    {lr}        ; (str lr, [sp, #-4]!)
        8398:    e59fe004     ldr    lr, [pc, #4]    ; 83a4 <_init+0x1c>
        839c:    e08fe00e     add    lr, pc, lr
        83a0:    e5bef008     ldr    pc, [lr, #8]!
        83a4:    00009168     .word    0x00009168
        83a8:    e28fc600     add    ip, pc, #0, 12
        83ac:    e28cca09     add    ip, ip, #36864    ; 0x9000
        83b0:    e5bcf168     ldr    pc, [ip, #360]!    ; 0x168
        83b4:    e28fc600     add    ip, pc, #0, 12
        83b8:    e28cca09     add    ip, ip, #36864    ; 0x9000
        83bc:    e5bcf160     ldr    pc, [ip, #352]!    ; 0x160
        83c0:    e28fc600     add    ip, pc, #0, 12
        83c4:    e28cca09     add    ip, ip, #36864    ; 0x9000
        83c8:    e5bcf158     ldr    pc, [ip, #344]!    ; 0x158
        83cc:    e28fc600     add    ip, pc, #0, 12
        83d0:    e28cca09     add    ip, ip, #36864    ; 0x9000
        83d4:    e5bcf150     ldr    pc, [ip, #336]!    ; 0x150
        83d8:    e28fc600     add    ip, pc, #0, 12
        83dc:    e28cca09     add    ip, ip, #36864    ; 0x9000
        83e0:    e5bcf148     ldr    pc, [ip, #328]!    ; 0x148
    
    Disassembly of section .text:
    
    000083e8 <_start>:
        83e8:    e3a0b000     mov    fp, #0
        83ec:    e3a0e000     mov    lr, #0
        83f0:    e49d1004     pop    {r1}        ; (ldr r1, [sp], #4)
        83f4:    e1a0200d     mov    r2, sp
        83f8:    e52d2004     push    {r2}        ; (str r2, [sp, #-4]!)
        83fc:    e52d0004     push    {r0}        ; (str r0, [sp, #-4]!)
        8400:    e59fc010     ldr    ip, [pc, #16]    ; 8418 <_start+0x30>
        8404:    e52dc004     push    {ip}        ; (str ip, [sp, #-4]!)
        8408:    e59f000c     ldr    r0, [pc, #12]    ; 841c <_start+0x34>
        840c:    e59f300c     ldr    r3, [pc, #12]    ; 8420 <_start+0x38>
        8410:    ebffffe7     bl    83b4 <_init+0x2c>
        8414:    ebffffef     bl    83d8 <_init+0x50>
        8418:    00009328     .word    0x00009328
        841c:    00008628     .word    0x00008628
        8420:    00009260     .word    0x00009260
    
    00008424 <call_gmon_start>:
        8424:    e59f0014     ldr    r0, [pc, #20]    ; 8440 <call_gmon_start+0x1c>
        8428:    e59f2014     ldr    r2, [pc, #20]    ; 8444 <call_gmon_start+0x20>
        842c:    e08f3000     add    r3, pc, r0
        8430:    e7933002     ldr    r3, [r3, r2]
        8434:    e3530000     cmp    r3, #0
        8438:    012fff1e     bxeq    lr
        843c:    eaffffdf     b    83c0 <_init+0x38>
        8440:    000090d8     .word    0x000090d8
        8444:    00000020     .word    0x00000020
    
    00008448 <__do_global_dtors_aux>:
        8448:    e59f3010     ldr    r3, [pc, #16]    ; 8460 <__do_global_dtors_aux+0x18>
        844c:    e5d32000     ldrb    r2, [r3]
        8450:    e3520000     cmp    r2, #0
        8454:    03a02001     moveq    r2, #1
        8458:    05c32000     strbeq    r2, [r3]
        845c:    e12fff1e     bx    lr
        8460:    00011538     .word    0x00011538
    
    00008464 <frame_dummy>:
        8464:    e59f0020     ldr    r0, [pc, #32]    ; 848c <frame_dummy+0x28>
        8468:    e92d4008     push    {r3, lr}
        846c:    e5903000     ldr    r3, [r0]
        8470:    e3530000     cmp    r3, #0
        8474:    08bd8008     popeq    {r3, pc}
        8478:    e59f3010     ldr    r3, [pc, #16]    ; 8490 <frame_dummy+0x2c>
        847c:    e3530000     cmp    r3, #0
        8480:    08bd8008     popeq    {r3, pc}
        8484:    e12fff33     blx    r3
        8488:    e8bd8008     pop    {r3, pc}
        848c:    00011410     .word    0x00011410
        ...
    
    00008498 <ln>:
        8498:    e92d4830     push    {r4, r5, fp, lr}
        849c:    e28db00c     add    fp, sp, #12
        84a0:    e24dd030     sub    sp, sp, #48    ; 0x30
        84a4:    e14b03fc     strd    r0, [fp, #-60]    ; 0xffffffc4
        84a8:    e3a0300f     mov    r3, #15
        84ac:    e50b3020     str    r3, [fp, #-32]    ; 0xffffffe0
        84b0:    e14b03dc     ldrd    r0, [fp, #-60]    ; 0xffffffc4
        84b4:    e3a02000     mov    r2, #0
        84b8:    e3a035ff     mov    r3, #1069547520    ; 0x3fc00000
        84bc:    e2833603     add    r3, r3, #3145728    ; 0x300000
        84c0:    eb0000fc     bl    88b8 <__aeabi_dsub>
        84c4:    e1a02000     mov    r2, r0
        84c8:    e1a03001     mov    r3, r1
        84cc:    e1a04002     mov    r4, r2
        84d0:    e1a05003     mov    r5, r3
        84d4:    e14b03dc     ldrd    r0, [fp, #-60]    ; 0xffffffc4
        84d8:    e3a02000     mov    r2, #0
        84dc:    e3a035ff     mov    r3, #1069547520    ; 0x3fc00000
        84e0:    e2833603     add    r3, r3, #3145728    ; 0x300000
        84e4:    eb0000f4     bl    88bc <__adddf3>
        84e8:    e1a02000     mov    r2, r0
        84ec:    e1a03001     mov    r3, r1
        84f0:    e1a00004     mov    r0, r4
        84f4:    e1a01005     mov    r1, r5
        84f8:    eb000275     bl    8ed4 <__aeabi_ddiv>
        84fc:    e1a02000     mov    r2, r0
        8500:    e1a03001     mov    r3, r1
        8504:    e14b22fc     strd    r2, [fp, #-44]    ; 0xffffffd4
        8508:    e14b02dc     ldrd    r0, [fp, #-44]    ; 0xffffffd4
        850c:    e14b22dc     ldrd    r2, [fp, #-44]    ; 0xffffffd4
        8510:    eb0001d4     bl    8c68 <__aeabi_dmul>
        8514:    e1a02000     mov    r2, r0
        8518:    e1a03001     mov    r3, r1
        851c:    e14b23f4     strd    r2, [fp, #-52]    ; 0xffffffcc
        8520:    e51b3020     ldr    r3, [fp, #-32]    ; 0xffffffe0
        8524:    e1a03083     lsl    r3, r3, #1
        8528:    e2833001     add    r3, r3, #1
        852c:    e50b3014     str    r3, [fp, #-20]    ; 0xffffffec
        8530:    e51b0014     ldr    r0, [fp, #-20]    ; 0xffffffec
        8534:    eb000194     bl    8b8c <__aeabi_i2d>
        8538:    e1a02000     mov    r2, r0
        853c:    e1a03001     mov    r3, r1
        8540:    e3a00000     mov    r0, #0
        8544:    e3a015ff     mov    r1, #1069547520    ; 0x3fc00000
        8548:    e2811603     add    r1, r1, #3145728    ; 0x300000
        854c:    eb000260     bl    8ed4 <__aeabi_ddiv>
        8550:    e1a02000     mov    r2, r0
        8554:    e1a03001     mov    r3, r1
        8558:    e14b21fc     strd    r2, [fp, #-28]    ; 0xffffffe4
        855c:    e51b3020     ldr    r3, [fp, #-32]    ; 0xffffffe0
        8560:    e50b3010     str    r3, [fp, #-16]
        8564:    ea00001c     b    85dc <ln+0x144>
        8568:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec
        856c:    e2433002     sub    r3, r3, #2
        8570:    e50b3014     str    r3, [fp, #-20]    ; 0xffffffec
        8574:    e51b0014     ldr    r0, [fp, #-20]    ; 0xffffffec
        8578:    eb000183     bl    8b8c <__aeabi_i2d>
        857c:    e1a02000     mov    r2, r0
        8580:    e1a03001     mov    r3, r1
        8584:    e3a00000     mov    r0, #0
        8588:    e3a015ff     mov    r1, #1069547520    ; 0x3fc00000
        858c:    e2811603     add    r1, r1, #3145728    ; 0x300000
        8590:    eb00024f     bl    8ed4 <__aeabi_ddiv>
        8594:    e1a02000     mov    r2, r0
        8598:    e1a03001     mov    r3, r1
        859c:    e1a04002     mov    r4, r2
        85a0:    e1a05003     mov    r5, r3
        85a4:    e14b03d4     ldrd    r0, [fp, #-52]    ; 0xffffffcc
        85a8:    e14b21dc     ldrd    r2, [fp, #-28]    ; 0xffffffe4
        85ac:    eb0001ad     bl    8c68 <__aeabi_dmul>
        85b0:    e1a02000     mov    r2, r0
        85b4:    e1a03001     mov    r3, r1
        85b8:    e1a00004     mov    r0, r4
        85bc:    e1a01005     mov    r1, r5
        85c0:    eb0000bd     bl    88bc <__adddf3>
        85c4:    e1a02000     mov    r2, r0
        85c8:    e1a03001     mov    r3, r1
        85cc:    e14b21fc     strd    r2, [fp, #-28]    ; 0xffffffe4
        85d0:    e51b3010     ldr    r3, [fp, #-16]
        85d4:    e2433001     sub    r3, r3, #1
        85d8:    e50b3010     str    r3, [fp, #-16]
        85dc:    e51b3010     ldr    r3, [fp, #-16]
        85e0:    e3530000     cmp    r3, #0
        85e4:    caffffdf     bgt    8568 <ln+0xd0>
        85e8:    e14b22dc     ldrd    r2, [fp, #-44]    ; 0xffffffd4
        85ec:    e1a00002     mov    r0, r2
        85f0:    e1a01003     mov    r1, r3
        85f4:    eb0000b0     bl    88bc <__adddf3>
        85f8:    e1a02000     mov    r2, r0
        85fc:    e1a03001     mov    r3, r1
        8600:    e1a00002     mov    r0, r2
        8604:    e1a01003     mov    r1, r3
        8608:    e14b21dc     ldrd    r2, [fp, #-28]    ; 0xffffffe4
        860c:    eb000195     bl    8c68 <__aeabi_dmul>
        8610:    e1a02000     mov    r2, r0
        8614:    e1a03001     mov    r3, r1
        8618:    e1a00002     mov    r0, r2
        861c:    e1a01003     mov    r1, r3
        8620:    e24bd00c     sub    sp, fp, #12
        8624:    e8bd8830     pop    {r4, r5, fp, pc}
    
    00008628 <main>:
        8628:    e92d4830     push    {r4, r5, fp, lr}
        862c:    e28db00c     add    fp, sp, #12
        8630:    e24dd030     sub    sp, sp, #48    ; 0x30
        8634:    e3a03000     mov    r3, #0
        8638:    e50b302c     str    r3, [fp, #-44]    ; 0xffffffd4
        863c:    e3a03000     mov    r3, #0
        8640:    e50b3028     str    r3, [fp, #-40]    ; 0xffffffd8
        8644:    e3a03000     mov    r3, #0
        8648:    e50b3034     str    r3, [fp, #-52]    ; 0xffffffcc
        864c:    e3a03000     mov    r3, #0
        8650:    e50b3030     str    r3, [fp, #-48]    ; 0xffffffd0
        8654:    e3a00002     mov    r0, #2
        8658:    e24b302c     sub    r3, fp, #44    ; 0x2c
        865c:    e1a01003     mov    r1, r3
        8660:    ebffff59     bl    83cc <_init+0x44>
        8664:    e3a02000     mov    r2, #0
        8668:    e3a035ff     mov    r3, #1069547520    ; 0x3fc00000
        866c:    e2833603     add    r3, r3, #3145728    ; 0x300000
        8670:    e14b21fc     strd    r2, [fp, #-28]    ; 0xffffffe4
        8674:    ea000046     b    8794 <main+0x16c>
        8678:    e14b01dc     ldrd    r0, [fp, #-28]    ; 0xffffffe4
        867c:    e28f3f7b     add    r3, pc, #492    ; 0x1ec
        8680:    e1c320d0     ldrd    r2, [r3]
        8684:    eb000177     bl    8c68 <__aeabi_dmul>
        8688:    e1a02000     mov    r2, r0
        868c:    e1a03001     mov    r3, r1
        8690:    e1a04002     mov    r4, r2
        8694:    e1a05003     mov    r5, r3
        8698:    e28f1f76     add    r1, pc, #472    ; 0x1d8
        869c:    e1c100d0     ldrd    r0, [r1]
        86a0:    e14b21dc     ldrd    r2, [fp, #-28]    ; 0xffffffe4
        86a4:    eb000083     bl    88b8 <__aeabi_dsub>
        86a8:    e1a02000     mov    r2, r0
        86ac:    e1a03001     mov    r3, r1
        86b0:    e1a00004     mov    r0, r4
        86b4:    e1a01005     mov    r1, r5
        86b8:    eb000205     bl    8ed4 <__aeabi_ddiv>
        86bc:    e1a02000     mov    r2, r0
        86c0:    e1a03001     mov    r3, r1
        86c4:    e14b22f4     strd    r2, [fp, #-36]    ; 0xffffffdc
        86c8:    e14b02d4     ldrd    r0, [fp, #-36]    ; 0xffffffdc
        86cc:    e28f3f6b     add    r3, pc, #428    ; 0x1ac
        86d0:    e1c320d0     ldrd    r2, [r3]
        86d4:    eb0001fe     bl    8ed4 <__aeabi_ddiv>
        86d8:    e1a02000     mov    r2, r0
        86dc:    e1a03001     mov    r3, r1
        86e0:    e1a00002     mov    r0, r2
        86e4:    e1a01003     mov    r1, r3
        86e8:    ebffff6a     bl    8498 <ln>
        86ec:    e1a02000     mov    r2, r0
        86f0:    e1a03001     mov    r3, r1
        86f4:    e1a00002     mov    r0, r2
        86f8:    e1a01003     mov    r1, r3
        86fc:    e28f3f61     add    r3, pc, #388    ; 0x184
        8700:    e1c320d0     ldrd    r2, [r3]
        8704:    eb0001f2     bl    8ed4 <__aeabi_ddiv>
        8708:    e1a02000     mov    r2, r0
        870c:    e1a03001     mov    r3, r1
        8710:    e1a00002     mov    r0, r2
        8714:    e1a01003     mov    r1, r3
        8718:    e28f3e17     add    r3, pc, #368    ; 0x170
        871c:    e1c320d0     ldrd    r2, [r3]
        8720:    eb000065     bl    88bc <__adddf3>
        8724:    e1a02000     mov    r2, r0
        8728:    e1a03001     mov    r3, r1
        872c:    e3a00000     mov    r0, #0
        8730:    e3a015ff     mov    r1, #1069547520    ; 0x3fc00000
        8734:    e2811603     add    r1, r1, #3145728    ; 0x300000
        8738:    eb0001e5     bl    8ed4 <__aeabi_ddiv>
        873c:    e1a02000     mov    r2, r0
        8740:    e1a03001     mov    r3, r1
        8744:    e1a00002     mov    r0, r2
        8748:    e1a01003     mov    r1, r3
        874c:    e28f3f51     add    r3, pc, #324    ; 0x144
        8750:    e1c320d0     ldrd    r2, [r3]
        8754:    eb000057     bl    88b8 <__aeabi_dsub>
        8758:    e1a02000     mov    r2, r0
        875c:    e1a03001     mov    r3, r1
        8760:    e1a00002     mov    r0, r2
        8764:    e1a01003     mov    r1, r3
        8768:    eb0002a5     bl    9204 <__aeabi_d2iz>
        876c:    e1a03000     mov    r3, r0
        8770:    e50b3010     str    r3, [fp, #-16]
        8774:    e14b01dc     ldrd    r0, [fp, #-28]    ; 0xffffffe4
        8778:    e3a02000     mov    r2, #0
        877c:    e3a035ff     mov    r3, #1069547520    ; 0x3fc00000
        8780:    e2833603     add    r3, r3, #3145728    ; 0x300000
        8784:    eb00004c     bl    88bc <__adddf3>
        8788:    e1a02000     mov    r2, r0
        878c:    e1a03001     mov    r3, r1
        8790:    e14b21fc     strd    r2, [fp, #-28]    ; 0xffffffe4
        8794:    e3a03001     mov    r3, #1
        8798:    e1a04003     mov    r4, r3
        879c:    e14b01dc     ldrd    r0, [fp, #-28]    ; 0xffffffe4
        87a0:    e28f30d0     add    r3, pc, #208    ; 0xd0
        87a4:    e1c320d0     ldrd    r2, [r3]
        87a8:    eb000281     bl    91b4 <__aeabi_dcmplt>
        87ac:    e1a03000     mov    r3, r0
        87b0:    e3530000     cmp    r3, #0
        87b4:    1a000001     bne    87c0 <main+0x198>
        87b8:    e3a03000     mov    r3, #0
        87bc:    e1a04003     mov    r4, r3
        87c0:    e20430ff     and    r3, r4, #255    ; 0xff
        87c4:    e3530000     cmp    r3, #0
        87c8:    1affffaa     bne    8678 <main+0x50>
        87cc:    e3a00002     mov    r0, #2
        87d0:    e24b3034     sub    r3, fp, #52    ; 0x34
        87d4:    e1a01003     mov    r1, r3
        87d8:    ebfffefb     bl    83cc <_init+0x44>
        87dc:    e59f10bc     ldr    r1, [pc, #188]    ; 88a0 <main+0x278>
        87e0:    e51b202c     ldr    r2, [fp, #-44]    ; 0xffffffd4
        87e4:    e51b3028     ldr    r3, [fp, #-40]    ; 0xffffffd8
        87e8:    e1a00001     mov    r0, r1
        87ec:    e1a01002     mov    r1, r2
        87f0:    e1a02003     mov    r2, r3
        87f4:    ebfffeeb     bl    83a8 <_init+0x20>
        87f8:    e59f10a4     ldr    r1, [pc, #164]    ; 88a4 <main+0x27c>
        87fc:    e51b2034     ldr    r2, [fp, #-52]    ; 0xffffffcc
        8800:    e51b3030     ldr    r3, [fp, #-48]    ; 0xffffffd0
        8804:    e1a00001     mov    r0, r1
        8808:    e1a01002     mov    r1, r2
        880c:    e1a02003     mov    r2, r3
        8810:    ebfffee4     bl    83a8 <_init+0x20>
        8814:    e59f008c     ldr    r0, [pc, #140]    ; 88a8 <main+0x280>
        8818:    e51b2034     ldr    r2, [fp, #-52]    ; 0xffffffcc
        881c:    e51b302c     ldr    r3, [fp, #-44]    ; 0xffffffd4
        8820:    e0632002     rsb    r2, r3, r2
        8824:    e51b1030     ldr    r1, [fp, #-48]    ; 0xffffffd0
        8828:    e51b3028     ldr    r3, [fp, #-40]    ; 0xffffffd8
        882c:    e0633001     rsb    r3, r3, r1
        8830:    e1a01000     mov    r1, r0
        8834:    e1a00001     mov    r0, r1
        8838:    e1a01002     mov    r1, r2
        883c:    e1a02003     mov    r2, r3
        8840:    ebfffed8     bl    83a8 <_init+0x20>
        8844:    e59f2060     ldr    r2, [pc, #96]    ; 88ac <main+0x284>
        8848:    e51b3010     ldr    r3, [fp, #-16]
        884c:    e58d3000     str    r3, [sp]
        8850:    e1a03002     mov    r3, r2
        8854:    e1a00003     mov    r0, r3
        8858:    e14b21dc     ldrd    r2, [fp, #-28]    ; 0xffffffe4
        885c:    ebfffed1     bl    83a8 <_init+0x20>
        8860:    e3a03000     mov    r3, #0
        8864:    e1a00003     mov    r0, r3
        8868:    e24bd00c     sub    sp, fp, #12
        886c:    e8bd8830     pop    {r4, r5, fp, pc}
        8870:    00000000     .word    0x00000000
        8874:    40e6f300     .word    0x40e6f300
        8878:    00000000     .word    0x00000000
        887c:    409c2000     .word    0x409c2000
        8880:    00000000     .word    0x00000000
        8884:    40c38800     .word    0x40c38800
        8888:    00000000     .word    0x00000000
        888c:    40aedc00     .word    0x40aedc00
        8890:    dcb5db83     .word    0xdcb5db83
        8894:    3f6b79e1     .word    0x3f6b79e1
        8898:    66666666     .word    0x66666666
        889c:    40711266     .word    0x40711266
        88a0:    00009338     .word    0x00009338
        88a4:    00009354     .word    0x00009354
        88a8:    00009370     .word    0x00009370
        88ac:    00009388     .word    0x00009388
    
    000088b0 <__aeabi_drsub>:
        88b0:    e2211102     eor    r1, r1, #-2147483648    ; 0x80000000
        88b4:    ea000000     b    88bc <__adddf3>
    
    000088b8 <__aeabi_dsub>:
        88b8:    e2233102     eor    r3, r3, #-2147483648    ; 0x80000000
    
    000088bc <__adddf3>:
        88bc:    e92d4030     push    {r4, r5, lr}
        88c0:    e1a04081     lsl    r4, r1, #1
        88c4:    e1a05083     lsl    r5, r3, #1
        88c8:    e1340005     teq    r4, r5
        88cc:    01300002     teqeq    r0, r2
        88d0:    1194c000     orrsne    ip, r4, r0
        88d4:    1195c002     orrsne    ip, r5, r2
        88d8:    11f0cac4     mvnsne    ip, r4, asr #21
        88dc:    11f0cac5     mvnsne    ip, r5, asr #21
        88e0:    0a000079     beq    8acc <__adddf3+0x210>
        88e4:    e1a04aa4     lsr    r4, r4, #21
        88e8:    e0745aa5     rsbs    r5, r4, r5, lsr #21
        88ec:    b2655000     rsblt    r5, r5, #0
        88f0:    da000006     ble    8910 <__adddf3+0x54>
        88f4:    e0844005     add    r4, r4, r5
        88f8:    e0202002     eor    r2, r0, r2
        88fc:    e0213003     eor    r3, r1, r3
        8900:    e0220000     eor    r0, r2, r0
        8904:    e0231001     eor    r1, r3, r1
        8908:    e0202002     eor    r2, r0, r2
        890c:    e0213003     eor    r3, r1, r3
        8910:    e3550036     cmp    r5, #54    ; 0x36
        8914:    88bd8030     pophi    {r4, r5, pc}
        8918:    e3110102     tst    r1, #-2147483648    ; 0x80000000
        891c:    e1a01601     lsl    r1, r1, #12
        8920:    e3a0c601     mov    ip, #1048576    ; 0x100000
        8924:    e18c1621     orr    r1, ip, r1, lsr #12
        8928:    0a000001     beq    8934 <__adddf3+0x78>
        892c:    e2700000     rsbs    r0, r0, #0
        8930:    e2e11000     rsc    r1, r1, #0
        8934:    e3130102     tst    r3, #-2147483648    ; 0x80000000
        8938:    e1a03603     lsl    r3, r3, #12
        893c:    e18c3623     orr    r3, ip, r3, lsr #12
        8940:    0a000001     beq    894c <__adddf3+0x90>
        8944:    e2722000     rsbs    r2, r2, #0
        8948:    e2e33000     rsc    r3, r3, #0
        894c:    e1340005     teq    r4, r5
        8950:    0a000057     beq    8ab4 <__adddf3+0x1f8>
        8954:    e2444001     sub    r4, r4, #1
        8958:    e275e020     rsbs    lr, r5, #32
        895c:    ba000005     blt    8978 <__adddf3+0xbc>
        8960:    e1a0ce12     lsl    ip, r2, lr
        8964:    e0900532     adds    r0, r0, r2, lsr r5
        8968:    e2a11000     adc    r1, r1, #0
        896c:    e0900e13     adds    r0, r0, r3, lsl lr
        8970:    e0b11553     adcs    r1, r1, r3, asr r5
        8974:    ea000006     b    8994 <__adddf3+0xd8>
        8978:    e2455020     sub    r5, r5, #32
        897c:    e28ee020     add    lr, lr, #32
        8980:    e3520001     cmp    r2, #1
        8984:    e1a0ce13     lsl    ip, r3, lr
        8988:    238cc002     orrcs    ip, ip, #2
        898c:    e0900553     adds    r0, r0, r3, asr r5
        8990:    e0b11fc3     adcs    r1, r1, r3, asr #31
        8994:    e2015102     and    r5, r1, #-2147483648    ; 0x80000000
        8998:    5a000002     bpl    89a8 <__adddf3+0xec>
        899c:    e27cc000     rsbs    ip, ip, #0
        89a0:    e2f00000     rscs    r0, r0, #0
        89a4:    e2e11000     rsc    r1, r1, #0
        89a8:    e3510601     cmp    r1, #1048576    ; 0x100000
        89ac:    3a00000e     bcc    89ec <__adddf3+0x130>
        89b0:    e3510602     cmp    r1, #2097152    ; 0x200000
        89b4:    3a000006     bcc    89d4 <__adddf3+0x118>
        89b8:    e1b010a1     lsrs    r1, r1, #1
        89bc:    e1b00060     rrxs    r0, r0
        89c0:    e1a0c06c     rrx    ip, ip
        89c4:    e2844001     add    r4, r4, #1
        89c8:    e1a02a84     lsl    r2, r4, #21
        89cc:    e3720501     cmn    r2, #4194304    ; 0x400000
        89d0:    2a000055     bcs    8b2c <__adddf3+0x270>
        89d4:    e35c0102     cmp    ip, #-2147483648    ; 0x80000000
        89d8:    01b0c0a0     lsrseq    ip, r0, #1
        89dc:    e2b00000     adcs    r0, r0, #0
        89e0:    e0a11a04     adc    r1, r1, r4, lsl #20
        89e4:    e1811005     orr    r1, r1, r5
        89e8:    e8bd8030     pop    {r4, r5, pc}
        89ec:    e1b0c08c     lsls    ip, ip, #1
        89f0:    e0b00000     adcs    r0, r0, r0
        89f4:    e0a11001     adc    r1, r1, r1
        89f8:    e3110601     tst    r1, #1048576    ; 0x100000
        89fc:    e2444001     sub    r4, r4, #1
        8a00:    1afffff3     bne    89d4 <__adddf3+0x118>
        8a04:    e3310000     teq    r1, #0
        8a08:    01a01000     moveq    r1, r0
        8a0c:    03a00000     moveq    r0, #0
        8a10:    e16f3f11     clz    r3, r1
        8a14:    02833020     addeq    r3, r3, #32
        8a18:    e243300b     sub    r3, r3, #11
        8a1c:    e2532020     subs    r2, r3, #32
        8a20:    aa000007     bge    8a44 <__adddf3+0x188>
        8a24:    e292200c     adds    r2, r2, #12
        8a28:    da000004     ble    8a40 <__adddf3+0x184>
        8a2c:    e282c014     add    ip, r2, #20
        8a30:    e262200c     rsb    r2, r2, #12
        8a34:    e1a00c11     lsl    r0, r1, ip
        8a38:    e1a01231     lsr    r1, r1, r2
        8a3c:    ea000004     b    8a54 <__adddf3+0x198>
        8a40:    e2822014     add    r2, r2, #20
        8a44:    d262c020     rsble    ip, r2, #32
        8a48:    e1a01211     lsl    r1, r1, r2
        8a4c:    d1811c30     orrle    r1, r1, r0, lsr ip
        8a50:    d1a00210     lslle    r0, r0, r2
        8a54:    e0544003     subs    r4, r4, r3
        8a58:    a0811a04     addge    r1, r1, r4, lsl #20
        8a5c:    a1811005     orrge    r1, r1, r5
        8a60:    a8bd8030     popge    {r4, r5, pc}
        8a64:    e1e04004     mvn    r4, r4
        8a68:    e254401f     subs    r4, r4, #31
        8a6c:    aa00000d     bge    8aa8 <__adddf3+0x1ec>
        8a70:    e294400c     adds    r4, r4, #12
        8a74:    ca000005     bgt    8a90 <__adddf3+0x1d4>
        8a78:    e2844014     add    r4, r4, #20
        8a7c:    e2642020     rsb    r2, r4, #32
        8a80:    e1a00430     lsr    r0, r0, r4
        8a84:    e1800211     orr    r0, r0, r1, lsl r2
        8a88:    e1851431     orr    r1, r5, r1, lsr r4
        8a8c:    e8bd8030     pop    {r4, r5, pc}
        8a90:    e264400c     rsb    r4, r4, #12
        8a94:    e2642020     rsb    r2, r4, #32
        8a98:    e1a00230     lsr    r0, r0, r2
        8a9c:    e1800411     orr    r0, r0, r1, lsl r4
        8aa0:    e1a01005     mov    r1, r5
        8aa4:    e8bd8030     pop    {r4, r5, pc}
        8aa8:    e1a00431     lsr    r0, r1, r4
        8aac:    e1a01005     mov    r1, r5
        8ab0:    e8bd8030     pop    {r4, r5, pc}
        8ab4:    e3340000     teq    r4, #0
        8ab8:    e2233601     eor    r3, r3, #1048576    ; 0x100000
        8abc:    02211601     eoreq    r1, r1, #1048576    ; 0x100000
        8ac0:    02844001     addeq    r4, r4, #1
        8ac4:    12455001     subne    r5, r5, #1
        8ac8:    eaffffa1     b    8954 <__adddf3+0x98>
        8acc:    e1f0cac4     mvns    ip, r4, asr #21
        8ad0:    11f0cac5     mvnsne    ip, r5, asr #21
        8ad4:    0a000018     beq    8b3c <__adddf3+0x280>
        8ad8:    e1340005     teq    r4, r5
        8adc:    01300002     teqeq    r0, r2
        8ae0:    0a000003     beq    8af4 <__adddf3+0x238>
        8ae4:    e194c000     orrs    ip, r4, r0
        8ae8:    01a01003     moveq    r1, r3
        8aec:    01a00002     moveq    r0, r2
        8af0:    e8bd8030     pop    {r4, r5, pc}
        8af4:    e1310003     teq    r1, r3
        8af8:    13a01000     movne    r1, #0
        8afc:    13a00000     movne    r0, #0
        8b00:    18bd8030     popne    {r4, r5, pc}
        8b04:    e1b0caa4     lsrs    ip, r4, #21
        8b08:    1a000003     bne    8b1c <__adddf3+0x260>
        8b0c:    e1b00080     lsls    r0, r0, #1
        8b10:    e0b11001     adcs    r1, r1, r1
        8b14:    23811102     orrcs    r1, r1, #-2147483648    ; 0x80000000
        8b18:    e8bd8030     pop    {r4, r5, pc}
        8b1c:    e2944501     adds    r4, r4, #4194304    ; 0x400000
        8b20:    32811601     addcc    r1, r1, #1048576    ; 0x100000
        8b24:    38bd8030     popcc    {r4, r5, pc}
        8b28:    e2015102     and    r5, r1, #-2147483648    ; 0x80000000
        8b2c:    e385147f     orr    r1, r5, #2130706432    ; 0x7f000000
        8b30:    e381160f     orr    r1, r1, #15728640    ; 0xf00000
        8b34:    e3a00000     mov    r0, #0
        8b38:    e8bd8030     pop    {r4, r5, pc}
        8b3c:    e1f0cac4     mvns    ip, r4, asr #21
        8b40:    11a01003     movne    r1, r3
        8b44:    11a00002     movne    r0, r2
        8b48:    01f0cac5     mvnseq    ip, r5, asr #21
        8b4c:    11a03001     movne    r3, r1
        8b50:    11a02000     movne    r2, r0
        8b54:    e1904601     orrs    r4, r0, r1, lsl #12
        8b58:    01925603     orrseq    r5, r2, r3, lsl #12
        8b5c:    01310003     teqeq    r1, r3
        8b60:    13811702     orrne    r1, r1, #524288    ; 0x80000
        8b64:    e8bd8030     pop    {r4, r5, pc}
    
    00008b68 <__aeabi_ui2d>:
        8b68:    e3300000     teq    r0, #0
        8b6c:    03a01000     moveq    r1, #0
        8b70:    012fff1e     bxeq    lr
        8b74:    e92d4030     push    {r4, r5, lr}
        8b78:    e3a04b01     mov    r4, #1024    ; 0x400
        8b7c:    e2844032     add    r4, r4, #50    ; 0x32
        8b80:    e3a05000     mov    r5, #0
        8b84:    e3a01000     mov    r1, #0
        8b88:    eaffff9d     b    8a04 <__adddf3+0x148>
    
    00008b8c <__aeabi_i2d>:
        8b8c:    e3300000     teq    r0, #0
        8b90:    03a01000     moveq    r1, #0
        8b94:    012fff1e     bxeq    lr
        8b98:    e92d4030     push    {r4, r5, lr}
        8b9c:    e3a04b01     mov    r4, #1024    ; 0x400
        8ba0:    e2844032     add    r4, r4, #50    ; 0x32
        8ba4:    e2105102     ands    r5, r0, #-2147483648    ; 0x80000000
        8ba8:    42600000     rsbmi    r0, r0, #0
        8bac:    e3a01000     mov    r1, #0
        8bb0:    eaffff93     b    8a04 <__adddf3+0x148>
    
    00008bb4 <__aeabi_f2d>:
        8bb4:    e1b02080     lsls    r2, r0, #1
        8bb8:    e1a011c2     asr    r1, r2, #3
        8bbc:    e1a01061     rrx    r1, r1
        8bc0:    e1a00e02     lsl    r0, r2, #28
        8bc4:    121234ff     andsne    r3, r2, #-16777216    ; 0xff000000
        8bc8:    133304ff     teqne    r3, #-16777216    ; 0xff000000
        8bcc:    1221130e     eorne    r1, r1, #939524096    ; 0x38000000
        8bd0:    112fff1e     bxne    lr
        8bd4:    e3320000     teq    r2, #0
        8bd8:    133304ff     teqne    r3, #-16777216    ; 0xff000000
        8bdc:    012fff1e     bxeq    lr
        8be0:    e92d4030     push    {r4, r5, lr}
        8be4:    e3a04d0e     mov    r4, #896    ; 0x380
        8be8:    e2015102     and    r5, r1, #-2147483648    ; 0x80000000
        8bec:    e3c11102     bic    r1, r1, #-2147483648    ; 0x80000000
        8bf0:    eaffff83     b    8a04 <__adddf3+0x148>
    
    00008bf4 <__aeabi_ul2d>:
        8bf4:    e1902001     orrs    r2, r0, r1
        8bf8:    012fff1e     bxeq    lr
        8bfc:    e92d4030     push    {r4, r5, lr}
        8c00:    e3a05000     mov    r5, #0
        8c04:    ea000006     b    8c24 <__aeabi_l2d+0x1c>
    
    00008c08 <__aeabi_l2d>:
        8c08:    e1902001     orrs    r2, r0, r1
        8c0c:    012fff1e     bxeq    lr
        8c10:    e92d4030     push    {r4, r5, lr}
        8c14:    e2115102     ands    r5, r1, #-2147483648    ; 0x80000000
        8c18:    5a000001     bpl    8c24 <__aeabi_l2d+0x1c>
        8c1c:    e2700000     rsbs    r0, r0, #0
        8c20:    e2e11000     rsc    r1, r1, #0
        8c24:    e3a04b01     mov    r4, #1024    ; 0x400
        8c28:    e2844032     add    r4, r4, #50    ; 0x32
        8c2c:    e1b0cb21     lsrs    ip, r1, #22
        8c30:    0affff5c     beq    89a8 <__adddf3+0xec>
        8c34:    e3a02003     mov    r2, #3
        8c38:    e1b0c1ac     lsrs    ip, ip, #3
        8c3c:    12822003     addne    r2, r2, #3
        8c40:    e1b0c1ac     lsrs    ip, ip, #3
        8c44:    12822003     addne    r2, r2, #3
        8c48:    e08221ac     add    r2, r2, ip, lsr #3
        8c4c:    e2623020     rsb    r3, r2, #32
        8c50:    e1a0c310     lsl    ip, r0, r3
        8c54:    e1a00230     lsr    r0, r0, r2
        8c58:    e1800311     orr    r0, r0, r1, lsl r3
        8c5c:    e1a01231     lsr    r1, r1, r2
        8c60:    e0844002     add    r4, r4, r2
        8c64:    eaffff4f     b    89a8 <__adddf3+0xec>
    
    00008c68 <__aeabi_dmul>:
        8c68:    e92d4070     push    {r4, r5, r6, lr}
        8c6c:    e3a0c0ff     mov    ip, #255    ; 0xff
        8c70:    e38ccc07     orr    ip, ip, #1792    ; 0x700
        8c74:    e01c4a21     ands    r4, ip, r1, lsr #20
        8c78:    101c5a23     andsne    r5, ip, r3, lsr #20
        8c7c:    1134000c     teqne    r4, ip
        8c80:    1135000c     teqne    r5, ip
        8c84:    0b00006f     bleq    8e48 <__aeabi_dmul+0x1e0>
        8c88:    e0844005     add    r4, r4, r5
        8c8c:    e0216003     eor    r6, r1, r3
        8c90:    e1c11a8c     bic    r1, r1, ip, lsl #21
        8c94:    e1c33a8c     bic    r3, r3, ip, lsl #21
        8c98:    e1905601     orrs    r5, r0, r1, lsl #12
        8c9c:    11925603     orrsne    r5, r2, r3, lsl #12
        8ca0:    e3811601     orr    r1, r1, #1048576    ; 0x100000
        8ca4:    e3833601     orr    r3, r3, #1048576    ; 0x100000
        8ca8:    0a00001c     beq    8d20 <__aeabi_dmul+0xb8>
        8cac:    e08ec290     umull    ip, lr, r0, r2
        8cb0:    e3a05000     mov    r5, #0
        8cb4:    e0a5e291     umlal    lr, r5, r1, r2
        8cb8:    e2062102     and    r2, r6, #-2147483648    ; 0x80000000
        8cbc:    e0a5e390     umlal    lr, r5, r0, r3
        8cc0:    e3a06000     mov    r6, #0
        8cc4:    e0a65391     umlal    r5, r6, r1, r3
        8cc8:    e33c0000     teq    ip, #0
        8ccc:    138ee001     orrne    lr, lr, #1
        8cd0:    e24440ff     sub    r4, r4, #255    ; 0xff
        8cd4:    e3560c02     cmp    r6, #512    ; 0x200
        8cd8:    e2c44c03     sbc    r4, r4, #768    ; 0x300
        8cdc:    2a000002     bcs    8cec <__aeabi_dmul+0x84>
        8ce0:    e1b0e08e     lsls    lr, lr, #1
        8ce4:    e0b55005     adcs    r5, r5, r5
        8ce8:    e0a66006     adc    r6, r6, r6
        8cec:    e1821586     orr    r1, r2, r6, lsl #11
        8cf0:    e1811aa5     orr    r1, r1, r5, lsr #21
        8cf4:    e1a00585     lsl    r0, r5, #11
        8cf8:    e1800aae     orr    r0, r0, lr, lsr #21
        8cfc:    e1a0e58e     lsl    lr, lr, #11
        8d00:    e254c0fd     subs    ip, r4, #253    ; 0xfd
        8d04:    835c0c07     cmphi    ip, #1792    ; 0x700
        8d08:    8a00000f     bhi    8d4c <__aeabi_dmul+0xe4>
        8d0c:    e35e0102     cmp    lr, #-2147483648    ; 0x80000000
        8d10:    01b0e0a0     lsrseq    lr, r0, #1
        8d14:    e2b00000     adcs    r0, r0, #0
        8d18:    e0a11a04     adc    r1, r1, r4, lsl #20
        8d1c:    e8bd8070     pop    {r4, r5, r6, pc}
        8d20:    e2066102     and    r6, r6, #-2147483648    ; 0x80000000
        8d24:    e1861001     orr    r1, r6, r1
        8d28:    e1800002     orr    r0, r0, r2
        8d2c:    e0211003     eor    r1, r1, r3
        8d30:    e05440ac     subs    r4, r4, ip, lsr #1
        8d34:    c074500c     rsbsgt    r5, r4, ip
        8d38:    c1811a04     orrgt    r1, r1, r4, lsl #20
        8d3c:    c8bd8070     popgt    {r4, r5, r6, pc}
        8d40:    e3811601     orr    r1, r1, #1048576    ; 0x100000
        8d44:    e3a0e000     mov    lr, #0
        8d48:    e2544001     subs    r4, r4, #1
        8d4c:    ca000058     bgt    8eb4 <__aeabi_dmul+0x24c>
        8d50:    e3740036     cmn    r4, #54    ; 0x36
        8d54:    d3a00000     movle    r0, #0
        8d58:    d2011102     andle    r1, r1, #-2147483648    ; 0x80000000
        8d5c:    d8bd8070     pople    {r4, r5, r6, pc}
        8d60:    e2644000     rsb    r4, r4, #0
        8d64:    e2544020     subs    r4, r4, #32
        8d68:    aa000018     bge    8dd0 <__aeabi_dmul+0x168>
        8d6c:    e294400c     adds    r4, r4, #12
        8d70:    ca00000b     bgt    8da4 <__aeabi_dmul+0x13c>
        8d74:    e2844014     add    r4, r4, #20
        8d78:    e2645020     rsb    r5, r4, #32
        8d7c:    e1a03510     lsl    r3, r0, r5
        8d80:    e1a00430     lsr    r0, r0, r4
        8d84:    e1800511     orr    r0, r0, r1, lsl r5
        8d88:    e2012102     and    r2, r1, #-2147483648    ; 0x80000000
        8d8c:    e3c11102     bic    r1, r1, #-2147483648    ; 0x80000000
        8d90:    e0900fa3     adds    r0, r0, r3, lsr #31
        8d94:    e0a21431     adc    r1, r2, r1, lsr r4
        8d98:    e19ee083     orrs    lr, lr, r3, lsl #1
        8d9c:    01c00fa3     biceq    r0, r0, r3, lsr #31
        8da0:    e8bd8070     pop    {r4, r5, r6, pc}
        8da4:    e264400c     rsb    r4, r4, #12
        8da8:    e2645020     rsb    r5, r4, #32
        8dac:    e1a03410     lsl    r3, r0, r4
        8db0:    e1a00530     lsr    r0, r0, r5
        8db4:    e1800411     orr    r0, r0, r1, lsl r4
        8db8:    e2011102     and    r1, r1, #-2147483648    ; 0x80000000
        8dbc:    e0900fa3     adds    r0, r0, r3, lsr #31
        8dc0:    e2a11000     adc    r1, r1, #0
        8dc4:    e19ee083     orrs    lr, lr, r3, lsl #1
        8dc8:    01c00fa3     biceq    r0, r0, r3, lsr #31
        8dcc:    e8bd8070     pop    {r4, r5, r6, pc}
        8dd0:    e2645020     rsb    r5, r4, #32
        8dd4:    e18ee510     orr    lr, lr, r0, lsl r5
        8dd8:    e1a03430     lsr    r3, r0, r4
        8ddc:    e1833511     orr    r3, r3, r1, lsl r5
        8de0:    e1a00431     lsr    r0, r1, r4
        8de4:    e2011102     and    r1, r1, #-2147483648    ; 0x80000000
        8de8:    e1c00431     bic    r0, r0, r1, lsr r4
        8dec:    e0800fa3     add    r0, r0, r3, lsr #31
        8df0:    e19ee083     orrs    lr, lr, r3, lsl #1
        8df4:    01c00fa3     biceq    r0, r0, r3, lsr #31
        8df8:    e8bd8070     pop    {r4, r5, r6, pc}
        8dfc:    e3340000     teq    r4, #0
        8e00:    1a000008     bne    8e28 <__aeabi_dmul+0x1c0>
        8e04:    e2016102     and    r6, r1, #-2147483648    ; 0x80000000
        8e08:    e1b00080     lsls    r0, r0, #1
        8e0c:    e0a11001     adc    r1, r1, r1
        8e10:    e3110601     tst    r1, #1048576    ; 0x100000
        8e14:    02444001     subeq    r4, r4, #1
        8e18:    0afffffa     beq    8e08 <__aeabi_dmul+0x1a0>
        8e1c:    e1811006     orr    r1, r1, r6
        8e20:    e3350000     teq    r5, #0
        8e24:    112fff1e     bxne    lr
        8e28:    e2036102     and    r6, r3, #-2147483648    ; 0x80000000
        8e2c:    e1b02082     lsls    r2, r2, #1
        8e30:    e0a33003     adc    r3, r3, r3
        8e34:    e3130601     tst    r3, #1048576    ; 0x100000
        8e38:    02455001     subeq    r5, r5, #1
        8e3c:    0afffffa     beq    8e2c <__aeabi_dmul+0x1c4>
        8e40:    e1833006     orr    r3, r3, r6
        8e44:    e12fff1e     bx    lr
        8e48:    e134000c     teq    r4, ip
        8e4c:    e00c5a23     and    r5, ip, r3, lsr #20
        8e50:    1135000c     teqne    r5, ip
        8e54:    0a000006     beq    8e74 <__aeabi_dmul+0x20c>
        8e58:    e1906081     orrs    r6, r0, r1, lsl #1
        8e5c:    11926083     orrsne    r6, r2, r3, lsl #1
        8e60:    1affffe5     bne    8dfc <__aeabi_dmul+0x194>
        8e64:    e0211003     eor    r1, r1, r3
        8e68:    e2011102     and    r1, r1, #-2147483648    ; 0x80000000
        8e6c:    e3a00000     mov    r0, #0
        8e70:    e8bd8070     pop    {r4, r5, r6, pc}
        8e74:    e1906081     orrs    r6, r0, r1, lsl #1
        8e78:    01a00002     moveq    r0, r2
        8e7c:    01a01003     moveq    r1, r3
        8e80:    11926083     orrsne    r6, r2, r3, lsl #1
        8e84:    0a00000f     beq    8ec8 <__aeabi_dmul+0x260>
        8e88:    e134000c     teq    r4, ip
        8e8c:    1a000001     bne    8e98 <__aeabi_dmul+0x230>
        8e90:    e1906601     orrs    r6, r0, r1, lsl #12
        8e94:    1a00000b     bne    8ec8 <__aeabi_dmul+0x260>
        8e98:    e135000c     teq    r5, ip
        8e9c:    1a000003     bne    8eb0 <__aeabi_dmul+0x248>
        8ea0:    e1926603     orrs    r6, r2, r3, lsl #12
        8ea4:    11a00002     movne    r0, r2
        8ea8:    11a01003     movne    r1, r3
        8eac:    1a000005     bne    8ec8 <__aeabi_dmul+0x260>
        8eb0:    e0211003     eor    r1, r1, r3
        8eb4:    e2011102     and    r1, r1, #-2147483648    ; 0x80000000
        8eb8:    e381147f     orr    r1, r1, #2130706432    ; 0x7f000000
        8ebc:    e381160f     orr    r1, r1, #15728640    ; 0xf00000
        8ec0:    e3a00000     mov    r0, #0
        8ec4:    e8bd8070     pop    {r4, r5, r6, pc}
        8ec8:    e381147f     orr    r1, r1, #2130706432    ; 0x7f000000
        8ecc:    e381173e     orr    r1, r1, #16252928    ; 0xf80000
        8ed0:    e8bd8070     pop    {r4, r5, r6, pc}
    
    00008ed4 <__aeabi_ddiv>:
        8ed4:    e92d4070     push    {r4, r5, r6, lr}
        8ed8:    e3a0c0ff     mov    ip, #255    ; 0xff
        8edc:    e38ccc07     orr    ip, ip, #1792    ; 0x700
        8ee0:    e01c4a21     ands    r4, ip, r1, lsr #20
        8ee4:    101c5a23     andsne    r5, ip, r3, lsr #20
        8ee8:    1134000c     teqne    r4, ip
        8eec:    1135000c     teqne    r5, ip
        8ef0:    0b00005c     bleq    9068 <__aeabi_ddiv+0x194>
        8ef4:    e0444005     sub    r4, r4, r5
        8ef8:    e021e003     eor    lr, r1, r3
        8efc:    e1925603     orrs    r5, r2, r3, lsl #12
        8f00:    e1a01601     lsl    r1, r1, #12
        8f04:    0a00004b     beq    9038 <__aeabi_ddiv+0x164>
        8f08:    e1a03603     lsl    r3, r3, #12
        8f0c:    e3a05201     mov    r5, #268435456    ; 0x10000000
        8f10:    e1853223     orr    r3, r5, r3, lsr #4
        8f14:    e1833c22     orr    r3, r3, r2, lsr #24
        8f18:    e1a02402     lsl    r2, r2, #8
        8f1c:    e1855221     orr    r5, r5, r1, lsr #4
        8f20:    e1855c20     orr    r5, r5, r0, lsr #24
        8f24:    e1a06400     lsl    r6, r0, #8
        8f28:    e20e1102     and    r1, lr, #-2147483648    ; 0x80000000
        8f2c:    e1550003     cmp    r5, r3
        8f30:    01560002     cmpeq    r6, r2
        8f34:    e2a440fd     adc    r4, r4, #253    ; 0xfd
        8f38:    e2844c03     add    r4, r4, #768    ; 0x300
        8f3c:    2a000001     bcs    8f48 <__aeabi_ddiv+0x74>
        8f40:    e1b030a3     lsrs    r3, r3, #1
        8f44:    e1a02062     rrx    r2, r2
        8f48:    e0566002     subs    r6, r6, r2
        8f4c:    e0c55003     sbc    r5, r5, r3
        8f50:    e1b030a3     lsrs    r3, r3, #1
        8f54:    e1a02062     rrx    r2, r2
        8f58:    e3a00601     mov    r0, #1048576    ; 0x100000
        8f5c:    e3a0c702     mov    ip, #524288    ; 0x80000
        8f60:    e056e002     subs    lr, r6, r2
        8f64:    e0d5e003     sbcs    lr, r5, r3
        8f68:    20466002     subcs    r6, r6, r2
        8f6c:    21a0500e     movcs    r5, lr
        8f70:    2180000c     orrcs    r0, r0, ip
        8f74:    e1b030a3     lsrs    r3, r3, #1
        8f78:    e1a02062     rrx    r2, r2
        8f7c:    e056e002     subs    lr, r6, r2
        8f80:    e0d5e003     sbcs    lr, r5, r3
        8f84:    20466002     subcs    r6, r6, r2
        8f88:    21a0500e     movcs    r5, lr
        8f8c:    218000ac     orrcs    r0, r0, ip, lsr #1
        8f90:    e1b030a3     lsrs    r3, r3, #1
        8f94:    e1a02062     rrx    r2, r2
        8f98:    e056e002     subs    lr, r6, r2
        8f9c:    e0d5e003     sbcs    lr, r5, r3
        8fa0:    20466002     subcs    r6, r6, r2
        8fa4:    21a0500e     movcs    r5, lr
        8fa8:    2180012c     orrcs    r0, r0, ip, lsr #2
        8fac:    e1b030a3     lsrs    r3, r3, #1
        8fb0:    e1a02062     rrx    r2, r2
        8fb4:    e056e002     subs    lr, r6, r2
        8fb8:    e0d5e003     sbcs    lr, r5, r3
        8fbc:    20466002     subcs    r6, r6, r2
        8fc0:    21a0500e     movcs    r5, lr
        8fc4:    218001ac     orrcs    r0, r0, ip, lsr #3
        8fc8:    e195e006     orrs    lr, r5, r6
        8fcc:    0a00000d     beq    9008 <__aeabi_ddiv+0x134>
        8fd0:    e1a05205     lsl    r5, r5, #4
        8fd4:    e1855e26     orr    r5, r5, r6, lsr #28
        8fd8:    e1a06206     lsl    r6, r6, #4
        8fdc:    e1a03183     lsl    r3, r3, #3
        8fe0:    e1833ea2     orr    r3, r3, r2, lsr #29
        8fe4:    e1a02182     lsl    r2, r2, #3
        8fe8:    e1b0c22c     lsrs    ip, ip, #4
        8fec:    1affffdb     bne    8f60 <__aeabi_ddiv+0x8c>
        8ff0:    e3110601     tst    r1, #1048576    ; 0x100000
        8ff4:    1a000006     bne    9014 <__aeabi_ddiv+0x140>
        8ff8:    e1811000     orr    r1, r1, r0
        8ffc:    e3a00000     mov    r0, #0
        9000:    e3a0c102     mov    ip, #-2147483648    ; 0x80000000
        9004:    eaffffd5     b    8f60 <__aeabi_ddiv+0x8c>
        9008:    e3110601     tst    r1, #1048576    ; 0x100000
        900c:    01811000     orreq    r1, r1, r0
        9010:    03a00000     moveq    r0, #0
        9014:    e254c0fd     subs    ip, r4, #253    ; 0xfd
        9018:    835c0c07     cmphi    ip, #1792    ; 0x700
        901c:    8affff4a     bhi    8d4c <__aeabi_dmul+0xe4>
        9020:    e055c003     subs    ip, r5, r3
        9024:    0056c002     subseq    ip, r6, r2
        9028:    01b0c0a0     lsrseq    ip, r0, #1
        902c:    e2b00000     adcs    r0, r0, #0
        9030:    e0a11a04     adc    r1, r1, r4, lsl #20
        9034:    e8bd8070     pop    {r4, r5, r6, pc}
        9038:    e20ee102     and    lr, lr, #-2147483648    ; 0x80000000
        903c:    e18e1621     orr    r1, lr, r1, lsr #12
        9040:    e09440ac     adds    r4, r4, ip, lsr #1
        9044:    c074500c     rsbsgt    r5, r4, ip
        9048:    c1811a04     orrgt    r1, r1, r4, lsl #20
        904c:    c8bd8070     popgt    {r4, r5, r6, pc}
        9050:    e3811601     orr    r1, r1, #1048576    ; 0x100000
        9054:    e3a0e000     mov    lr, #0
        9058:    e2544001     subs    r4, r4, #1
        905c:    eaffff3a     b    8d4c <__aeabi_dmul+0xe4>
        9060:    e185e006     orr    lr, r5, r6
        9064:    eaffff38     b    8d4c <__aeabi_dmul+0xe4>
        9068:    e00c5a23     and    r5, ip, r3, lsr #20
        906c:    e134000c     teq    r4, ip
        9070:    0135000c     teqeq    r5, ip
        9074:    0affff93     beq    8ec8 <__aeabi_dmul+0x260>
        9078:    e134000c     teq    r4, ip
        907c:    1a000006     bne    909c <__aeabi_ddiv+0x1c8>
        9080:    e1904601     orrs    r4, r0, r1, lsl #12
        9084:    1affff8f     bne    8ec8 <__aeabi_dmul+0x260>
        9088:    e135000c     teq    r5, ip
        908c:    1affff87     bne    8eb0 <__aeabi_dmul+0x248>
        9090:    e1a00002     mov    r0, r2
        9094:    e1a01003     mov    r1, r3
        9098:    eaffff8a     b    8ec8 <__aeabi_dmul+0x260>
        909c:    e135000c     teq    r5, ip
        90a0:    1a000004     bne    90b8 <__aeabi_ddiv+0x1e4>
        90a4:    e1925603     orrs    r5, r2, r3, lsl #12
        90a8:    0affff6d     beq    8e64 <__aeabi_dmul+0x1fc>
        90ac:    e1a00002     mov    r0, r2
        90b0:    e1a01003     mov    r1, r3
        90b4:    eaffff83     b    8ec8 <__aeabi_dmul+0x260>
        90b8:    e1906081     orrs    r6, r0, r1, lsl #1
        90bc:    11926083     orrsne    r6, r2, r3, lsl #1
        90c0:    1affff4d     bne    8dfc <__aeabi_dmul+0x194>
        90c4:    e1904081     orrs    r4, r0, r1, lsl #1
        90c8:    1affff78     bne    8eb0 <__aeabi_dmul+0x248>
        90cc:    e1925083     orrs    r5, r2, r3, lsl #1
        90d0:    1affff63     bne    8e64 <__aeabi_dmul+0x1fc>
        90d4:    eaffff7b     b    8ec8 <__aeabi_dmul+0x260>
    
    000090d8 <__gedf2>:
        90d8:    e3e0c000     mvn    ip, #0
        90dc:    ea000002     b    90ec <__cmpdf2+0x4>
    
    000090e0 <__ledf2>:
        90e0:    e3a0c001     mov    ip, #1
        90e4:    ea000000     b    90ec <__cmpdf2+0x4>
    
    000090e8 <__cmpdf2>:
        90e8:    e3a0c001     mov    ip, #1
        90ec:    e52dc004     push    {ip}        ; (str ip, [sp, #-4]!)
        90f0:    e1a0c081     lsl    ip, r1, #1
        90f4:    e1f0cacc     mvns    ip, ip, asr #21
        90f8:    e1a0c083     lsl    ip, r3, #1
        90fc:    11f0cacc     mvnsne    ip, ip, asr #21
        9100:    0a00000e     beq    9140 <__cmpdf2+0x58>
        9104:    e28dd004     add    sp, sp, #4
        9108:    e190c081     orrs    ip, r0, r1, lsl #1
        910c:    0192c083     orrseq    ip, r2, r3, lsl #1
        9110:    11310003     teqne    r1, r3
        9114:    01300002     teqeq    r0, r2
        9118:    03a00000     moveq    r0, #0
        911c:    012fff1e     bxeq    lr
        9120:    e3700000     cmn    r0, #0
        9124:    e1310003     teq    r1, r3
        9128:    51510003     cmppl    r1, r3
        912c:    01500002     cmpeq    r0, r2
        9130:    21a00fc3     asrcs    r0, r3, #31
        9134:    31e00fc3     mvncc    r0, r3, asr #31
        9138:    e3800001     orr    r0, r0, #1
        913c:    e12fff1e     bx    lr
        9140:    e1a0c081     lsl    ip, r1, #1
        9144:    e1f0cacc     mvns    ip, ip, asr #21
        9148:    1a000001     bne    9154 <__cmpdf2+0x6c>
        914c:    e190c601     orrs    ip, r0, r1, lsl #12
        9150:    1a000004     bne    9168 <__cmpdf2+0x80>
        9154:    e1a0c083     lsl    ip, r3, #1
        9158:    e1f0cacc     mvns    ip, ip, asr #21
        915c:    1affffe8     bne    9104 <__cmpdf2+0x1c>
        9160:    e192c603     orrs    ip, r2, r3, lsl #12
        9164:    0affffe6     beq    9104 <__cmpdf2+0x1c>
        9168:    e49d0004     pop    {r0}        ; (ldr r0, [sp], #4)
        916c:    e12fff1e     bx    lr
    
    00009170 <__aeabi_cdrcmple>:
        9170:    e1a0c000     mov    ip, r0
        9174:    e1a00002     mov    r0, r2
        9178:    e1a0200c     mov    r2, ip
        917c:    e1a0c001     mov    ip, r1
        9180:    e1a01003     mov    r1, r3
        9184:    e1a0300c     mov    r3, ip
        9188:    eaffffff     b    918c <__aeabi_cdcmpeq>
    
    0000918c <__aeabi_cdcmpeq>:
        918c:    e92d4001     push    {r0, lr}
        9190:    ebffffd4     bl    90e8 <__cmpdf2>
        9194:    e3500000     cmp    r0, #0
        9198:    43700000     cmnmi    r0, #0
        919c:    e8bd8001     pop    {r0, pc}
    
    000091a0 <__aeabi_dcmpeq>:
        91a0:    e52de008     str    lr, [sp, #-8]!
        91a4:    ebfffff8     bl    918c <__aeabi_cdcmpeq>
        91a8:    03a00001     moveq    r0, #1
        91ac:    13a00000     movne    r0, #0
        91b0:    e49df008     ldr    pc, [sp], #8
    
    000091b4 <__aeabi_dcmplt>:
        91b4:    e52de008     str    lr, [sp, #-8]!
        91b8:    ebfffff3     bl    918c <__aeabi_cdcmpeq>
        91bc:    33a00001     movcc    r0, #1
        91c0:    23a00000     movcs    r0, #0
        91c4:    e49df008     ldr    pc, [sp], #8
    
    000091c8 <__aeabi_dcmple>:
        91c8:    e52de008     str    lr, [sp, #-8]!
        91cc:    ebffffee     bl    918c <__aeabi_cdcmpeq>
        91d0:    93a00001     movls    r0, #1
        91d4:    83a00000     movhi    r0, #0
        91d8:    e49df008     ldr    pc, [sp], #8
    
    000091dc <__aeabi_dcmpge>:
        91dc:    e52de008     str    lr, [sp, #-8]!
        91e0:    ebffffe2     bl    9170 <__aeabi_cdrcmple>
        91e4:    93a00001     movls    r0, #1
        91e8:    83a00000     movhi    r0, #0
        91ec:    e49df008     ldr    pc, [sp], #8
    
    000091f0 <__aeabi_dcmpgt>:
        91f0:    e52de008     str    lr, [sp, #-8]!
        91f4:    ebffffdd     bl    9170 <__aeabi_cdrcmple>
        91f8:    33a00001     movcc    r0, #1
        91fc:    23a00000     movcs    r0, #0
        9200:    e49df008     ldr    pc, [sp], #8
    
    00009204 <__aeabi_d2iz>:
        9204:    e1a02081     lsl    r2, r1, #1
        9208:    e2922602     adds    r2, r2, #2097152    ; 0x200000
        920c:    2a00000c     bcs    9244 <__aeabi_d2iz+0x40>
        9210:    5a000009     bpl    923c <__aeabi_d2iz+0x38>
        9214:    e3e03e3e     mvn    r3, #992    ; 0x3e0
        9218:    e0532ac2     subs    r2, r3, r2, asr #21
        921c:    9a00000a     bls    924c <__aeabi_d2iz+0x48>
        9220:    e1a03581     lsl    r3, r1, #11
        9224:    e3833102     orr    r3, r3, #-2147483648    ; 0x80000000
        9228:    e1833aa0     orr    r3, r3, r0, lsr #21
        922c:    e3110102     tst    r1, #-2147483648    ; 0x80000000
        9230:    e1a00233     lsr    r0, r3, r2
        9234:    12600000     rsbne    r0, r0, #0
        9238:    e12fff1e     bx    lr
        923c:    e3a00000     mov    r0, #0
        9240:    e12fff1e     bx    lr
        9244:    e1900601     orrs    r0, r0, r1, lsl #12
        9248:    1a000002     bne    9258 <__aeabi_d2iz+0x54>
        924c:    e2110102     ands    r0, r1, #-2147483648    ; 0x80000000
        9250:    03e00102     mvneq    r0, #-2147483648    ; 0x80000000
        9254:    e12fff1e     bx    lr
        9258:    e3a00000     mov    r0, #0
        925c:    e12fff1e     bx    lr
    
    00009260 <__libc_csu_init>:
        9260:    e92d47f0     push    {r4, r5, r6, r7, r8, r9, sl, lr}
        9264:    e1a0a000     mov    sl, r0
        9268:    e1a08001     mov    r8, r1
        926c:    e1a07002     mov    r7, r2
        9270:    e59f40a8     ldr    r4, [pc, #168]    ; 9320 <__libc_csu_init+0xc0>
        9274:    ebfffc43     bl    8388 <_init>
        9278:    e59f10a4     ldr    r1, [pc, #164]    ; 9324 <__libc_csu_init+0xc4>
        927c:    e08f4004     add    r4, pc, r4
        9280:    e08f0001     add    r0, pc, r1
        9284:    e0649000     rsb    r9, r4, r0
        9288:    e1b09149     asrs    r9, r9, #2
        928c:    08bd87f0     popeq    {r4, r5, r6, r7, r8, r9, sl, pc}
        9290:    e3a06001     mov    r6, #1
        9294:    e4943004     ldr    r3, [r4], #4
        9298:    e1a0000a     mov    r0, sl
        929c:    e1a01008     mov    r1, r8
        92a0:    e1a02007     mov    r2, r7
        92a4:    e2495001     sub    r5, r9, #1
        92a8:    e12fff33     blx    r3
        92ac:    e1560009     cmp    r6, r9
        92b0:    e0055006     and    r5, r5, r6
        92b4:    08bd87f0     popeq    {r4, r5, r6, r7, r8, r9, sl, pc}
        92b8:    e3550000     cmp    r5, #0
        92bc:    0a000007     beq    92e0 <__libc_csu_init+0x80>
        92c0:    e494c004     ldr    ip, [r4], #4
        92c4:    e1a0000a     mov    r0, sl
        92c8:    e1a01008     mov    r1, r8
        92cc:    e1a02007     mov    r2, r7
        92d0:    e3a06002     mov    r6, #2
        92d4:    e12fff3c     blx    ip
        92d8:    e1560009     cmp    r6, r9
        92dc:    08bd87f0     popeq    {r4, r5, r6, r7, r8, r9, sl, pc}
        92e0:    e1a05004     mov    r5, r4
        92e4:    e4953004     ldr    r3, [r5], #4
        92e8:    e1a0000a     mov    r0, sl
        92ec:    e1a01008     mov    r1, r8
        92f0:    e1a02007     mov    r2, r7
        92f4:    e12fff33     blx    r3
        92f8:    e2866002     add    r6, r6, #2
        92fc:    e594c004     ldr    ip, [r4, #4]
        9300:    e1a0000a     mov    r0, sl
        9304:    e1a01008     mov    r1, r8
        9308:    e1a02007     mov    r2, r7
        930c:    e12fff3c     blx    ip
        9310:    e1560009     cmp    r6, r9
        9314:    e2854004     add    r4, r5, #4
        9318:    1afffff0     bne    92e0 <__libc_csu_init+0x80>
        931c:    e8bd87f0     pop    {r4, r5, r6, r7, r8, r9, sl, pc}
        9320:    00008184     .word    0x00008184
        9324:    00008184     .word    0x00008184
    
    00009328 <__libc_csu_fini>:
        9328:    e12fff1e     bx    lr
    
    Disassembly of section .fini:
    
    0000932c <_fini>:
        932c:    e92d4008     push    {r3, lr}
        9330:    e8bd8008     pop    {r3, pc}
    arm-none-linux-gnueabi-objdump -d soft.bin > objdump_soft.txt
    /* arm-none-linux-gnueabi-objdump -d softfp.bin > objdump_softfp.txt */
    softfp.bin:     file format elf32-littlearm
    
    
    Disassembly of section .init:
    
    00008388 <_init>:
        8388:    e92d4008     push    {r3, lr}
        838c:    eb000024     bl    8424 <call_gmon_start>
        8390:    e8bd8008     pop    {r3, pc}
    
    Disassembly of section .plt:
    
    00008394 <.plt>:
        8394:    e52de004     push    {lr}        ; (str lr, [sp, #-4]!)
        8398:    e59fe004     ldr    lr, [pc, #4]    ; 83a4 <_init+0x1c>
        839c:    e08fe00e     add    lr, pc, lr
        83a0:    e5bef008     ldr    pc, [lr, #8]!
        83a4:    0000865c     .word    0x0000865c
        83a8:    e28fc600     add    ip, pc, #0, 12
        83ac:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
        83b0:    e5bcf65c     ldr    pc, [ip, #1628]!    ; 0x65c
        83b4:    e28fc600     add    ip, pc, #0, 12
        83b8:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
        83bc:    e5bcf654     ldr    pc, [ip, #1620]!    ; 0x654
        83c0:    e28fc600     add    ip, pc, #0, 12
        83c4:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
        83c8:    e5bcf64c     ldr    pc, [ip, #1612]!    ; 0x64c
        83cc:    e28fc600     add    ip, pc, #0, 12
        83d0:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
        83d4:    e5bcf644     ldr    pc, [ip, #1604]!    ; 0x644
        83d8:    e28fc600     add    ip, pc, #0, 12
        83dc:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
        83e0:    e5bcf63c     ldr    pc, [ip, #1596]!    ; 0x63c
    
    Disassembly of section .text:
    
    000083e8 <_start>:
        83e8:    e3a0b000     mov    fp, #0
        83ec:    e3a0e000     mov    lr, #0
        83f0:    e49d1004     pop    {r1}        ; (ldr r1, [sp], #4)
        83f4:    e1a0200d     mov    r2, sp
        83f8:    e52d2004     push    {r2}        ; (str r2, [sp, #-4]!)
        83fc:    e52d0004     push    {r0}        ; (str r0, [sp, #-4]!)
        8400:    e59fc010     ldr    ip, [pc, #16]    ; 8418 <_start+0x30>
        8404:    e52dc004     push    {ip}        ; (str ip, [sp, #-4]!)
        8408:    e59f000c     ldr    r0, [pc, #12]    ; 841c <_start+0x34>
        840c:    e59f300c     ldr    r3, [pc, #12]    ; 8420 <_start+0x38>
        8410:    ebffffe7     bl    83b4 <_init+0x2c>
        8414:    ebffffef     bl    83d8 <_init+0x50>
        8418:    00008830     .word    0x00008830
        841c:    00008590     .word    0x00008590
        8420:    00008768     .word    0x00008768
    
    00008424 <call_gmon_start>:
        8424:    e59f0014     ldr    r0, [pc, #20]    ; 8440 <call_gmon_start+0x1c>
        8428:    e59f2014     ldr    r2, [pc, #20]    ; 8444 <call_gmon_start+0x20>
        842c:    e08f3000     add    r3, pc, r0
        8430:    e7933002     ldr    r3, [r3, r2]
        8434:    e3530000     cmp    r3, #0
        8438:    012fff1e     bxeq    lr
        843c:    eaffffdf     b    83c0 <_init+0x38>
        8440:    000085cc     .word    0x000085cc
        8444:    00000020     .word    0x00000020
    
    00008448 <__do_global_dtors_aux>:
        8448:    e59f3010     ldr    r3, [pc, #16]    ; 8460 <__do_global_dtors_aux+0x18>
        844c:    e5d32000     ldrb    r2, [r3]
        8450:    e3520000     cmp    r2, #0
        8454:    03a02001     moveq    r2, #1
        8458:    05c32000     strbeq    r2, [r3]
        845c:    e12fff1e     bx    lr
        8460:    00010a2c     .word    0x00010a2c
    
    00008464 <frame_dummy>:
        8464:    e59f0020     ldr    r0, [pc, #32]    ; 848c <frame_dummy+0x28>
        8468:    e92d4008     push    {r3, lr}
        846c:    e5903000     ldr    r3, [r0]
        8470:    e3530000     cmp    r3, #0
        8474:    08bd8008     popeq    {r3, pc}
        8478:    e59f3010     ldr    r3, [pc, #16]    ; 8490 <frame_dummy+0x2c>
        847c:    e3530000     cmp    r3, #0
        8480:    08bd8008     popeq    {r3, pc}
        8484:    e12fff33     blx    r3
        8488:    e8bd8008     pop    {r3, pc}
        848c:    00010904     .word    0x00010904
        ...
    
    00008498 <ln>:
        8498:    e52db004     push    {fp}        ; (str fp, [sp, #-4]!)
        849c:    e28db000     add    fp, sp, #0
        84a0:    e24dd034     sub    sp, sp, #52    ; 0x34
        84a4:    e14b03f4     strd    r0, [fp, #-52]    ; 0xffffffcc
        84a8:    e3a0300f     mov    r3, #15
        84ac:    e50b3018     str    r3, [fp, #-24]    ; 0xffffffe8
        84b0:    ed1b6b0d     vldr    d6, [fp, #-52]    ; 0xffffffcc
        84b4:    ed9f7b33     vldr    d7, [pc, #204]    ; 8588 <ln+0xf0>
        84b8:    ee365b47     vsub.f64    d5, d6, d7
        84bc:    ed1b6b0d     vldr    d6, [fp, #-52]    ; 0xffffffcc
        84c0:    ed9f7b30     vldr    d7, [pc, #192]    ; 8588 <ln+0xf0>
        84c4:    ee366b07     vadd.f64    d6, d6, d7
        84c8:    ee857b06     vdiv.f64    d7, d5, d6
        84cc:    ed0b7b09     vstr    d7, [fp, #-36]    ; 0xffffffdc
        84d0:    ed1b6b09     vldr    d6, [fp, #-36]    ; 0xffffffdc
        84d4:    ed1b7b09     vldr    d7, [fp, #-36]    ; 0xffffffdc
        84d8:    ee267b07     vmul.f64    d7, d6, d7
        84dc:    ed0b7b0b     vstr    d7, [fp, #-44]    ; 0xffffffd4
        84e0:    e51b3018     ldr    r3, [fp, #-24]    ; 0xffffffe8
        84e4:    e1a03083     lsl    r3, r3, #1
        84e8:    e2833001     add    r3, r3, #1
        84ec:    e50b300c     str    r3, [fp, #-12]
        84f0:    e51b300c     ldr    r3, [fp, #-12]
        84f4:    ee073a90     vmov    s15, r3
        84f8:    eeb86be7     vcvt.f64.s32    d6, s15
        84fc:    ed9f5b21     vldr    d5, [pc, #132]    ; 8588 <ln+0xf0>
        8500:    ee857b06     vdiv.f64    d7, d5, d6
        8504:    ed0b7b05     vstr    d7, [fp, #-20]    ; 0xffffffec
        8508:    e51b3018     ldr    r3, [fp, #-24]    ; 0xffffffe8
        850c:    e50b3008     str    r3, [fp, #-8]
        8510:    ea00000f     b    8554 <ln+0xbc>
        8514:    e51b300c     ldr    r3, [fp, #-12]
        8518:    e2433002     sub    r3, r3, #2
        851c:    e50b300c     str    r3, [fp, #-12]
        8520:    e51b300c     ldr    r3, [fp, #-12]
        8524:    ee063a90     vmov    s13, r3
        8528:    eeb87be6     vcvt.f64.s32    d7, s13
        852c:    ed9f5b15     vldr    d5, [pc, #84]    ; 8588 <ln+0xf0>
        8530:    ee856b07     vdiv.f64    d6, d5, d7
        8534:    ed1b5b0b     vldr    d5, [fp, #-44]    ; 0xffffffd4
        8538:    ed1b7b05     vldr    d7, [fp, #-20]    ; 0xffffffec
        853c:    ee257b07     vmul.f64    d7, d5, d7
        8540:    ee367b07     vadd.f64    d7, d6, d7
        8544:    ed0b7b05     vstr    d7, [fp, #-20]    ; 0xffffffec
        8548:    e51b3008     ldr    r3, [fp, #-8]
        854c:    e2433001     sub    r3, r3, #1
        8550:    e50b3008     str    r3, [fp, #-8]
        8554:    e51b3008     ldr    r3, [fp, #-8]
        8558:    e3530000     cmp    r3, #0
        855c:    caffffec     bgt    8514 <ln+0x7c>
        8560:    ed1b7b09     vldr    d7, [fp, #-36]    ; 0xffffffdc
        8564:    ee376b07     vadd.f64    d6, d7, d7
        8568:    ed1b7b05     vldr    d7, [fp, #-20]    ; 0xffffffec
        856c:    ee267b07     vmul.f64    d7, d6, d7
        8570:    ec532b17     vmov    r2, r3, d7
        8574:    e1a00002     mov    r0, r2
        8578:    e1a01003     mov    r1, r3
        857c:    e28bd000     add    sp, fp, #0
        8580:    e8bd0800     pop    {fp}
        8584:    e12fff1e     bx    lr
        8588:    00000000     .word    0x00000000
        858c:    3ff00000     .word    0x3ff00000
    
    00008590 <main>:
        8590:    e92d4800     push    {fp, lr}
        8594:    e28db004     add    fp, sp, #4
        8598:    e24dd030     sub    sp, sp, #48    ; 0x30
        859c:    e3a03000     mov    r3, #0
        85a0:    e50b3024     str    r3, [fp, #-36]    ; 0xffffffdc
        85a4:    e3a03000     mov    r3, #0
        85a8:    e50b3020     str    r3, [fp, #-32]    ; 0xffffffe0
        85ac:    e3a03000     mov    r3, #0
        85b0:    e50b302c     str    r3, [fp, #-44]    ; 0xffffffd4
        85b4:    e3a03000     mov    r3, #0
        85b8:    e50b3028     str    r3, [fp, #-40]    ; 0xffffffd8
        85bc:    e3a00002     mov    r0, #2
        85c0:    e24b3024     sub    r3, fp, #36    ; 0x24
        85c4:    e1a01003     mov    r1, r3
        85c8:    ebffff7f     bl    83cc <_init+0x44>
        85cc:    e28f3f53     add    r3, pc, #332    ; 0x14c
        85d0:    e1c320d0     ldrd    r2, [r3]
        85d4:    e14b21f4     strd    r2, [fp, #-20]    ; 0xffffffec
        85d8:    ea00001e     b    8658 <main+0xc8>
        85dc:    ed1b6b05     vldr    d6, [fp, #-20]    ; 0xffffffec
        85e0:    ed9f7b50     vldr    d7, [pc, #320]    ; 8728 <main+0x198>
        85e4:    ee266b07     vmul.f64    d6, d6, d7
        85e8:    e28f3d05     add    r3, pc, #320    ; 0x140
        85ec:    e1c320d0     ldrd    r2, [r3]
        85f0:    ed1b7b05     vldr    d7, [fp, #-20]    ; 0xffffffec
        85f4:    ec432b15     vmov    d5, r2, r3
        85f8:    ee355b47     vsub.f64    d5, d5, d7
        85fc:    ee867b05     vdiv.f64    d7, d6, d5
        8600:    ed0b7b07     vstr    d7, [fp, #-28]    ; 0xffffffe4
        8604:    ed1b5b07     vldr    d5, [fp, #-28]    ; 0xffffffe4
        8608:    ed9f6b4a     vldr    d6, [pc, #296]    ; 8738 <main+0x1a8>
        860c:    ee857b06     vdiv.f64    d7, d5, d6
        8610:    ec510b17     vmov    r0, r1, d7
        8614:    ebffff9f     bl    8498 <ln>
        8618:    ec410b15     vmov    d5, r0, r1
        861c:    ed9f6b47     vldr    d6, [pc, #284]    ; 8740 <main+0x1b0>
        8620:    ee857b06     vdiv.f64    d7, d5, d6
        8624:    ed9f6b47     vldr    d6, [pc, #284]    ; 8748 <main+0x1b8>
        8628:    ee376b06     vadd.f64    d6, d7, d6
        862c:    ed9f5b3b     vldr    d5, [pc, #236]    ; 8720 <main+0x190>
        8630:    ee857b06     vdiv.f64    d7, d5, d6
        8634:    ed9f6b45     vldr    d6, [pc, #276]    ; 8750 <main+0x1c0>
        8638:    ee377b46     vsub.f64    d7, d7, d6
        863c:    eefd6bc7     vcvt.s32.f64    s13, d7
        8640:    ee163a90     vmov    r3, s13
        8644:    e50b3008     str    r3, [fp, #-8]
        8648:    ed1b6b05     vldr    d6, [fp, #-20]    ; 0xffffffec
        864c:    ed9f7b33     vldr    d7, [pc, #204]    ; 8720 <main+0x190>
        8650:    ee367b07     vadd.f64    d7, d6, d7
        8654:    ed0b7b05     vstr    d7, [fp, #-20]    ; 0xffffffec
        8658:    ed1b6b05     vldr    d6, [fp, #-20]    ; 0xffffffec
        865c:    ed9f7b33     vldr    d7, [pc, #204]    ; 8730 <main+0x1a0>
        8660:    eeb46bc7     vcmpe.f64    d6, d7
        8664:    eef1fa10     vmrs    APSR_nzcv, fpscr
        8668:    53a03000     movpl    r3, #0
        866c:    43a03001     movmi    r3, #1
        8670:    e20330ff     and    r3, r3, #255    ; 0xff
        8674:    e3530000     cmp    r3, #0
        8678:    1affffd7     bne    85dc <main+0x4c>
        867c:    e3a00002     mov    r0, #2
        8680:    e24b302c     sub    r3, fp, #44    ; 0x2c
        8684:    e1a01003     mov    r1, r3
        8688:    ebffff4f     bl    83cc <_init+0x44>
        868c:    e59f10c4     ldr    r1, [pc, #196]    ; 8758 <main+0x1c8>
        8690:    e51b2024     ldr    r2, [fp, #-36]    ; 0xffffffdc
        8694:    e51b3020     ldr    r3, [fp, #-32]    ; 0xffffffe0
        8698:    e1a00001     mov    r0, r1
        869c:    e1a01002     mov    r1, r2
        86a0:    e1a02003     mov    r2, r3
        86a4:    ebffff3f     bl    83a8 <_init+0x20>
        86a8:    e59f10ac     ldr    r1, [pc, #172]    ; 875c <main+0x1cc>
        86ac:    e51b202c     ldr    r2, [fp, #-44]    ; 0xffffffd4
        86b0:    e51b3028     ldr    r3, [fp, #-40]    ; 0xffffffd8
        86b4:    e1a00001     mov    r0, r1
        86b8:    e1a01002     mov    r1, r2
        86bc:    e1a02003     mov    r2, r3
        86c0:    ebffff38     bl    83a8 <_init+0x20>
        86c4:    e59f0094     ldr    r0, [pc, #148]    ; 8760 <main+0x1d0>
        86c8:    e51b202c     ldr    r2, [fp, #-44]    ; 0xffffffd4
        86cc:    e51b3024     ldr    r3, [fp, #-36]    ; 0xffffffdc
        86d0:    e0632002     rsb    r2, r3, r2
        86d4:    e51b1028     ldr    r1, [fp, #-40]    ; 0xffffffd8
        86d8:    e51b3020     ldr    r3, [fp, #-32]    ; 0xffffffe0
        86dc:    e0633001     rsb    r3, r3, r1
        86e0:    e1a01000     mov    r1, r0
        86e4:    e1a00001     mov    r0, r1
        86e8:    e1a01002     mov    r1, r2
        86ec:    e1a02003     mov    r2, r3
        86f0:    ebffff2c     bl    83a8 <_init+0x20>
        86f4:    e59f2068     ldr    r2, [pc, #104]    ; 8764 <main+0x1d4>
        86f8:    e51b3008     ldr    r3, [fp, #-8]
        86fc:    e58d3000     str    r3, [sp]
        8700:    e1a03002     mov    r3, r2
        8704:    e1a00003     mov    r0, r3
        8708:    e14b21d4     ldrd    r2, [fp, #-20]    ; 0xffffffec
        870c:    ebffff25     bl    83a8 <_init+0x20>
        8710:    e3a03000     mov    r3, #0
        8714:    e1a00003     mov    r0, r3
        8718:    e24bd004     sub    sp, fp, #4
        871c:    e8bd8800     pop    {fp, pc}
        8720:    00000000     .word    0x00000000
        8724:    3ff00000     .word    0x3ff00000
        8728:    00000000     .word    0x00000000
        872c:    40e6f300     .word    0x40e6f300
        8730:    00000000     .word    0x00000000
        8734:    409c2000     .word    0x409c2000
        8738:    00000000     .word    0x00000000
        873c:    40c38800     .word    0x40c38800
        8740:    00000000     .word    0x00000000
        8744:    40aedc00     .word    0x40aedc00
        8748:    dcb5db83     .word    0xdcb5db83
        874c:    3f6b79e1     .word    0x3f6b79e1
        8750:    66666666     .word    0x66666666
        8754:    40711266     .word    0x40711266
        8758:    00008840     .word    0x00008840
        875c:    0000885c     .word    0x0000885c
        8760:    00008878     .word    0x00008878
        8764:    00008890     .word    0x00008890
    
    00008768 <__libc_csu_init>:
        8768:    e92d47f0     push    {r4, r5, r6, r7, r8, r9, sl, lr}
        876c:    e1a0a000     mov    sl, r0
        8770:    e1a08001     mov    r8, r1
        8774:    e1a07002     mov    r7, r2
        8778:    e59f40a8     ldr    r4, [pc, #168]    ; 8828 <__libc_csu_init+0xc0>
        877c:    ebffff01     bl    8388 <_init>
        8780:    e59f10a4     ldr    r1, [pc, #164]    ; 882c <__libc_csu_init+0xc4>
        8784:    e08f4004     add    r4, pc, r4
        8788:    e08f0001     add    r0, pc, r1
        878c:    e0649000     rsb    r9, r4, r0
        8790:    e1b09149     asrs    r9, r9, #2
        8794:    08bd87f0     popeq    {r4, r5, r6, r7, r8, r9, sl, pc}
        8798:    e3a06001     mov    r6, #1
        879c:    e4943004     ldr    r3, [r4], #4
        87a0:    e1a0000a     mov    r0, sl
        87a4:    e1a01008     mov    r1, r8
        87a8:    e1a02007     mov    r2, r7
        87ac:    e2495001     sub    r5, r9, #1
        87b0:    e12fff33     blx    r3
        87b4:    e1560009     cmp    r6, r9
        87b8:    e0055006     and    r5, r5, r6
        87bc:    08bd87f0     popeq    {r4, r5, r6, r7, r8, r9, sl, pc}
        87c0:    e3550000     cmp    r5, #0
        87c4:    0a000007     beq    87e8 <__libc_csu_init+0x80>
        87c8:    e494c004     ldr    ip, [r4], #4
        87cc:    e1a0000a     mov    r0, sl
        87d0:    e1a01008     mov    r1, r8
        87d4:    e1a02007     mov    r2, r7
        87d8:    e3a06002     mov    r6, #2
        87dc:    e12fff3c     blx    ip
        87e0:    e1560009     cmp    r6, r9
        87e4:    08bd87f0     popeq    {r4, r5, r6, r7, r8, r9, sl, pc}
        87e8:    e1a05004     mov    r5, r4
        87ec:    e4953004     ldr    r3, [r5], #4
        87f0:    e1a0000a     mov    r0, sl
        87f4:    e1a01008     mov    r1, r8
        87f8:    e1a02007     mov    r2, r7
        87fc:    e12fff33     blx    r3
        8800:    e2866002     add    r6, r6, #2
        8804:    e594c004     ldr    ip, [r4, #4]
        8808:    e1a0000a     mov    r0, sl
        880c:    e1a01008     mov    r1, r8
        8810:    e1a02007     mov    r2, r7
        8814:    e12fff3c     blx    ip
        8818:    e1560009     cmp    r6, r9
        881c:    e2854004     add    r4, r5, #4
        8820:    1afffff0     bne    87e8 <__libc_csu_init+0x80>
        8824:    e8bd87f0     pop    {r4, r5, r6, r7, r8, r9, sl, pc}
        8828:    00008170     .word    0x00008170
        882c:    00008170     .word    0x00008170
    
    00008830 <__libc_csu_fini>:
        8830:    e12fff1e     bx    lr
    
    Disassembly of section .fini:
    
    00008834 <_fini>:
        8834:    e92d4008     push    {r3, lr}
        8838:    e8bd8008     pop    {r3, pc}
    arm-none-linux-gnueabi-objdump -d softfp.bin > objdump_softfp.txt

    分别执行bin文件:

    可以看出相差一个数量级 硬浮点2.7ms, 软浮点29.5ms, 性能还是差距很大的!

     2.驱动程序

     代码如下:

    #include <linux/module.h>
    #include <linux/configfs.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    
    static double ln(double a)
    {
        int N = 15;
        int k,nk;
        double x,xx,y;
    
        x = (a-1)/(a+1);
        xx = x*x;
        nk = 2*N+1;
        y = 1.0/nk;
        for(k=N;k>0;k--) {
            nk = nk - 2;
            y = 1.0/nk+xx*y;
        }
    
        return 2.0*x*y;
    }
    
    static int hello_init(void)
    {
        int t1, force2int;
        double Rt, Vadc;
        struct timespec time_start={0, 0},time_end={0, 0};
        double a;
        a = 3.9;
        a = a*a;
        printk("Hello,world! %f
    ", a);
        printk("Hello,world! %d
    ", a);
        printk("Hello,world! %d
    ", (int)a);
    
        time_start = current_kernel_time();
        /* 根据采样电压反推热敏电阻的温度 */
        for(Vadc=1; Vadc<1800; Vadc++) {
            Rt = Vadc * 47000 / (1800-Vadc);
            t1=1/(ln(Rt/10000)/3950+1/298.15)-273.15;
        }
        time_end = current_kernel_time();
    
        printk("start time %ld s,%ld ns
    ", time_start.tv_sec, time_start.tv_nsec);
        printk("end   time %ld s,%ld ns
    ", time_end.tv_sec, time_end.tv_nsec);
        printk("duration:%ld s %ld ns
    ", time_end.tv_sec-time_start.tv_sec, time_end.tv_nsec-time_start.tv_nsec);
    
        force2int = (int)Vadc;
        printk("%d = %d
    ", force2int, t1);
    
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk("Goodbye,cruel world!
    ");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    
    MODULE_AUTHOR("Vedic <FZKmxcz@163.com>");
    MODULE_LICENSE("Dual BSD/GPL");

    Makefile:

    obj-m +=driver_test.o
    driver_test-objs:= hello.o
    
    KDIR:=/home/fuzk/project/Prolin/firmware_4/build_dir/linux-sc9820_sc9820_pax/linux-3.10.65
    
    COMPILER=/opt/toolchain/arm-2012.03/bin/arm-none-linux-gnueabi-gcc
    LD_PATH=/opt/toolchain/arm-2012.03/bin/arm-none-linux-gnueabi-ld
    AR_PATH=/opt/toolchain/arm-2012.03/bin/arm-none-linux-gnueabi-ar
    ARCH_TYPE=arm
    
    ccflags-y += -mfloat-abi=softfp
    ldflags-y += -L/opt/toolchain/arm-2012.03/lib/gcc/arm-none-linux-gnueabi/4.6.3 -lgcc -static 
    
    all:
        make CC=$(COMPILER) LD=$(LD_PATH) AR=$(AR_PATH) ARCH=$(ARCH_TYPE) -C $(KDIR)  M=$(PWD)  modules
    
    clean:
        make CC=$(COMPILER) LD=$(LD_PATH) ARCH=$(ARCH_TYPE) -C $(KDIR)  M=$(PWD)  clean

      由于是驱动所以得写个Makefile, 同时printk不支持打印浮点数格式, 只能先强制类型转换int再打印, 否则打印的数值是错的, 待会贴log就可以看出来

    运行时间如下:

      这里需要注意的是: 驱动在内核态, 进程不会被切出去(最多task_struct结构体的flag被标志NEED_RESHEDULE), 且只有中断才能打断其执行

    而时间函数current_kernel_time()更新的步进应该是每10ms产生一个中断, 所以在中断前执行完读出来的时间戳是一样的, 或者在中断完成后读到

    更新后的时间戳, 总而言之该时间函数精度为10ms, 测试几次出来发现要么0要么近10ms可以推测这段代码执行时间小于10ms!

      反汇编发现汇编指令跟应用程序的硬浮点是一样的, 所以推测时间也在2.7ms左右

    /* arm-none-linux-gnueabi-objdump -d driver_test.o > objdump_softfp.txt */
    driver_test.o:     file format elf32-littlearm
    
    
    Disassembly of section .text:
    
    00000000 <init_module>:
       0:    e92d41f0     push    {r4, r5, r6, r7, r8, lr}
       4:    ed2d8b02     vpush    {d8}
       8:    e24dd010     sub    sp, sp, #16
       c:    e59f217c     ldr    r2, [pc, #380]    ; 190 <init_module+0x190>
      10:    e59f317c     ldr    r3, [pc, #380]    ; 194 <init_module+0x194>
      14:    e59f017c     ldr    r0, [pc, #380]    ; 198 <init_module+0x198>
      18:    ebfffffe     bl    0 <printk>
      1c:    ed9f8b4b     vldr    d8, [pc, #300]    ; 150 <init_module+0x150>
      20:    e59f2168     ldr    r2, [pc, #360]    ; 190 <init_module+0x190>
      24:    e59f3168     ldr    r3, [pc, #360]    ; 194 <init_module+0x194>
      28:    e59f016c     ldr    r0, [pc, #364]    ; 19c <init_module+0x19c>
      2c:    ebfffffe     bl    0 <printk>
      30:    e3a0100f     mov    r1, #15
      34:    e59f0160     ldr    r0, [pc, #352]    ; 19c <init_module+0x19c>
      38:    ebfffffe     bl    0 <printk>
      3c:    e1a0000d     mov    r0, sp
      40:    ebfffffe     bl    0 <current_kernel_time>
      44:    e59d7000     ldr    r7, [sp]
      48:    e59d5004     ldr    r5, [sp, #4]
      4c:    eeb02b48     vmov.f64    d2, d8
      50:    ea000021     b    dc <init_module+0xdc>
      54:    ed9f0b3f     vldr    d0, [pc, #252]    ; 158 <init_module+0x158>
      58:    ee366b48     vsub.f64    d6, d6, d8
      5c:    ed9f7b3f     vldr    d7, [pc, #252]    ; 160 <init_module+0x160>
      60:    e3a0301f     mov    r3, #31
      64:    ed9f4b3f     vldr    d4, [pc, #252]    ; 168 <init_module+0x168>
      68:    ee280b00     vmul.f64    d0, d8, d0
      6c:    ee806b06     vdiv.f64    d6, d0, d6
      70:    ee866b07     vdiv.f64    d6, d6, d7
      74:    ee367b42     vsub.f64    d7, d6, d2
      78:    ee366b02     vadd.f64    d6, d6, d2
      7c:    ee876b06     vdiv.f64    d6, d7, d6
      80:    ee265b06     vmul.f64    d5, d6, d6
      84:    e2433002     sub    r3, r3, #2
      88:    ed9f3b30     vldr    d3, [pc, #192]    ; 150 <init_module+0x150>
      8c:    e3530001     cmp    r3, #1
      90:    ee013a10     vmov    s2, r3
      94:    eeb87bc1     vcvt.f64.s32    d7, s2
      98:    ee827b07     vdiv.f64    d7, d2, d7
      9c:    eeb01b47     vmov.f64    d1, d7
      a0:    ee051b04     vmla.f64    d1, d5, d4
      a4:    eeb04b41     vmov.f64    d4, d1
      a8:    1afffff5     bne    84 <init_module+0x84>
      ac:    ee360b06     vadd.f64    d0, d6, d6
      b0:    ed9f6b2e     vldr    d6, [pc, #184]    ; 170 <init_module+0x170>
      b4:    ed9f5b2f     vldr    d5, [pc, #188]    ; 178 <init_module+0x178>
      b8:    ee207b01     vmul.f64    d7, d0, d1
      bc:    ee877b06     vdiv.f64    d7, d7, d6
      c0:    ed9f6b2e     vldr    d6, [pc, #184]    ; 180 <init_module+0x180>
      c4:    ee374b05     vadd.f64    d4, d7, d5
      c8:    ee834b04     vdiv.f64    d4, d3, d4
      cc:    ee347b46     vsub.f64    d7, d4, d6
      d0:    eefd1bc7     vcvt.s32.f64    s3, d7
      d4:    ee114a90     vmov    r4, s3
      d8:    ee388b03     vadd.f64    d8, d8, d3
      dc:    ed9f6b29     vldr    d6, [pc, #164]    ; 188 <init_module+0x188>
      e0:    eeb48bc6     vcmpe.f64    d8, d6
      e4:    eef1fa10     vmrs    APSR_nzcv, fpscr
      e8:    4affffd9     bmi    54 <init_module+0x54>
      ec:    e28d0008     add    r0, sp, #8
      f0:    ebfffffe     bl    0 <current_kernel_time>
      f4:    e59d8008     ldr    r8, [sp, #8]
      f8:    e59d600c     ldr    r6, [sp, #12]
      fc:    e1a01007     mov    r1, r7
     100:    e1a02005     mov    r2, r5
     104:    e59f0094     ldr    r0, [pc, #148]    ; 1a0 <init_module+0x1a0>
     108:    ebfffffe     bl    0 <printk>
     10c:    e1a01008     mov    r1, r8
     110:    e1a02006     mov    r2, r6
     114:    e59f0088     ldr    r0, [pc, #136]    ; 1a4 <init_module+0x1a4>
     118:    ebfffffe     bl    0 <printk>
     11c:    e0671008     rsb    r1, r7, r8
     120:    e0652006     rsb    r2, r5, r6
     124:    e59f007c     ldr    r0, [pc, #124]    ; 1a8 <init_module+0x1a8>
     128:    ebfffffe     bl    0 <printk>
     12c:    eefd3bc8     vcvt.s32.f64    s7, d8
     130:    e1a02004     mov    r2, r4
     134:    e59f0070     ldr    r0, [pc, #112]    ; 1ac <init_module+0x1ac>
     138:    ee131a90     vmov    r1, s7
     13c:    ebfffffe     bl    0 <printk>
     140:    e3a00000     mov    r0, #0
     144:    e28dd010     add    sp, sp, #16
     148:    ecbd8b02     vpop    {d8}
     14c:    e8bd81f0     pop    {r4, r5, r6, r7, r8, pc}
     150:    00000000     .word    0x00000000
     154:    3ff00000     .word    0x3ff00000
     158:    00000000     .word    0x00000000
     15c:    40e6f300     .word    0x40e6f300
     160:    00000000     .word    0x00000000
     164:    40c38800     .word    0x40c38800
     168:    08421084     .word    0x08421084
     16c:    3fa08421     .word    0x3fa08421
     170:    00000000     .word    0x00000000
     174:    40aedc00     .word    0x40aedc00
     178:    dcb5db83     .word    0xdcb5db83
     17c:    3f6b79e1     .word    0x3f6b79e1
     180:    66666666     .word    0x66666666
     184:    40711266     .word    0x40711266
     188:    00000000     .word    0x00000000
     18c:    409c2000     .word    0x409c2000
     190:    1eb851eb     .word    0x1eb851eb
     194:    402e6b85     .word    0x402e6b85
     198:    00000000     .word    0x00000000
     19c:    00000011     .word    0x00000011
     1a0:    00000022     .word    0x00000022
     1a4:    0000003b     .word    0x0000003b
     1a8:    00000054     .word    0x00000054
     1ac:    0000006b     .word    0x0000006b
    
    000001b0 <cleanup_module>:
     1b0:    e59f0000     ldr    r0, [pc]    ; 1b8 <cleanup_module+0x8>
     1b4:    eafffffe     b    0 <printk>
     1b8:    00000074     .word    0x00000074
     1bc:    e320f000     nop    {0}
    arm-none-linux-gnueabi-objdump -d driver_test.o > objdump_softfp.txt

      Makefile修改浮点为软浮点时候, 链接警告, 缺少上面说的函数, 可以我已经链接了libgcc.a, 不知道为何还是警告找不到, 因此就没深究了(怀疑这个库是应用专用)

    ccflags-y += -mfloat-abi=soft
    链接警告:
    WARNING: "__aeabi_d2iz" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!
    WARNING: "__aeabi_i2d" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!
    WARNING: "__aeabi_dsub" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!
    WARNING: "__aeabi_dadd" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!
    WARNING: "__aeabi_dmul" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!
    WARNING: "__aeabi_ddiv" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!
    WARNING: "__aeabi_dcmplt" [/home/fuzk/test/bokeyuan/float/driver/driver_test.ko] undefined!

    加载失败:
    [ 1780.809417] c0 double: Unknown symbol __aeabi_ddiv (err 0)
    [ 1780.815002] c0 double: Unknown symbol __aeabi_dmul (err 0)
    [ 1780.820495] c0 double: Unknown symbol __aeabi_dadd (err 0)
    [ 1780.826049] c0 double: Unknown symbol __aeabi_dsub (err 0)
    [ 1780.831512] c0 double: Unknown symbol __aeabi_i2d (err 0)
    insmod: can't insert 'driver_test.ko': unknown symbol in module, or unknown parameter
  • 相关阅读:
    不一样的抽象工厂模式(设计模式七)
    不一样的工厂模式(设计模式六)
    asp .net core 静态文件资源
    asp .net core 中间件
    平时写文档的文档要求
    mysql 悲观锁和乐观锁(二)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Java实现 LeetCode 834 树中距离之和(DFS+分析)
    nmon数据采集参数
    Linux安装iostat命令
  • 原文地址:https://www.cnblogs.com/vedic/p/10622332.html
Copyright © 2011-2022 走看看