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\n", time_start.tv_sec, time_start.tv_nsec);
    printf("end   time %ld s,%ld ns\n", time_end.tv_sec, time_end.tv_nsec);
    printf("duration:%ld s %ld ns\n", time_end.tv_sec-time_start.tv_sec, time_end.tv_nsec-time_start.tv_nsec);
    
    printf("%.10fmv = %d\n", 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\n", a);
    printk("Hello,world! %d\n", a);
    printk("Hello,world! %d\n", (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\n", time_start.tv_sec, time_start.tv_nsec);
    printk("end   time %ld s,%ld ns\n", time_end.tv_sec, time_end.tv_nsec);
    printk("duration:%ld s %ld ns\n", time_end.tv_sec-time_start.tv_sec, time_end.tv_nsec-time_start.tv_nsec);

    force2int = (int)Vadc;
    printk("%d = %d\n", force2int, t1);

    return 0;
}

static void hello_exit(void)
{
    printk("Goodbye,cruel world!\n");
}

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

 

posted @ 2019-03-29 16:48  Vedic  阅读(3581)  评论(0编辑  收藏