找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3033|回复: 1

【C】记一次GCC -O3优化效果实测

[复制链接]
发表于 2018-5-6 04:56:01 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
先上源码。

20180506044932.png

_sw_transceive是重点。我在调试STM32F103单片机SPI外设的时候遇到了问题,它并不能成功驱动我的硬件。为了排除外设操作的问题,我用自己写GPIO的方式实现了强行SPI协议传输,来看看传输的调用是不是对的。
这个函数本身很简短,就是模拟SPI外设的工作效果。通过拨弄SCK针来控制时间,然后写MOSI,读MISO。这个函数只有55行,但它用短循环调用了很多宏和static函数。

  1. static uint32_t _sw_transceive(spi_master_ctrl_p smc, uint32_t txval)
  2. {
  3.         int bitcount = smc->dff ? 16 : 8;
  4.         int togo = bitcount;
  5.         uint32_t rxval = 0;
  6.         if(!smc->bitorder) txval = _bit_reorder(txval, bitcount);
  7.         if(smc->cpha)
  8.         {
  9.                 if(smc->cpol)
  10.                 {
  11.                         while(togo --> 0)
  12.                         {
  13.                                 _sw_clk_l(smc);
  14.                                 _sw_mosi_out(smc, txval & 1); txval >>= 1;
  15.                                 _sw_clk_h(smc);
  16.                                 rxval = (rxval << 1) | _sw_miso_in(smc);
  17.                         }
  18.                 }
  19.                 else
  20.                 {
  21.                         while(togo --> 0)
  22.                         {
  23.                                 _sw_clk_h(smc);
  24.                                 _sw_mosi_out(smc, txval & 1); txval >>= 1;
  25.                                 _sw_clk_l(smc);
  26.                                 rxval = (rxval << 1) | _sw_miso_in(smc);
  27.                         }
  28.                 }
  29.         }
  30.         else
  31.         {
  32.                 if(smc->cpol)
  33.                 {
  34.                         while(togo --> 0)
  35.                         {
  36.                                 rxval = (rxval << 1) | _sw_miso_in(smc);
  37.                                 _sw_mosi_out(smc, txval & 1); txval >>= 1;
  38.                                 _sw_clk_l(smc);
  39.                                 _sw_clk_h(smc);
  40.                         }
  41.                 }
  42.                 else
  43.                 {
  44.                         while(togo --> 0)
  45.                         {
  46.                                 rxval = (rxval << 1) | _sw_miso_in(smc);
  47.                                 _sw_mosi_out(smc, txval & 1); txval >>= 1;
  48.                                 _sw_clk_h(smc);
  49.                                 _sw_clk_l(smc);
  50.                         }
  51.                 }
  52.         }
  53.         if(smc->bitorder) rxval = _bit_reorder(rxval, bitcount);
  54.         return rxval;
  55. }
复制代码
熟悉STM32或SPI协议(以及它在STM32的外设接口)的人都能看出我这个函数是在干啥。

spi.png

然而当我把它编译出来后,得到的二进制明显相当大——虽然是预料之内。至少直接写外设或者通过bit band写外设都是需要进行绝对地址直接寻址的,而且根据SPI的配置,这里存在这样几个变化的情况:
  • 传输单位,是以8bit为单位还是16bit为单位(虽然16bit也不过是一次传输两个8bit而已)
  • 时钟相位CPHA,时钟先变化还是数据先变化
  • 时钟极性CPOL,高电平为闲置还是低电平为闲置
  • 位顺序,高位在前还是低位在前
按照GCC的优化能力,它会把不同的情况组合都拆开,并且会把短循环直接展开。那么我们得到的二进制是什么样的呢?请看IDA图表。

20180506044434.png

这简直有点复杂……
底下这些小格子是怎么回事呢?

20180506044528.png

说实话我看不懂。我对ARM汇编不熟。
顺手F5一下看看。

20180506054933.png

简直好多局部变量,而且后面也是各种“缩进拳”,完全和我写的源代码不一样。GCC的各种逻辑优化和循环展开已经把它变得面目全非了。

20180506055352.png
  1. unsigned int __fastcall sw_transceive(int a1, unsigned int a2)
  2. {
  3.   __int64 v2; // kr00_8
  4.   int v3; // r2
  5.   unsigned int v4; // r3
  6.   signed int v5; // r4
  7.   int v6; // r2
  8.   int v7; // r6
  9.   int v8; // r4
  10.   int v9; // lr
  11.   int v10; // r2
  12.   int v11; // r7
  13.   int v12; // r12
  14.   int v13; // r10
  15.   int v14; // r6
  16.   int v15; // r11
  17.   signed int v16; // r0
  18.   _BOOL4 v17; // r11
  19.   signed int v18; // r10
  20.   _BOOL4 v19; // r0
  21.   signed int v20; // r0
  22.   signed int v21; // r3
  23.   signed int v22; // r0
  24.   signed int v23; // r3
  25.   int v24; // r0
  26.   signed int v25; // r5
  27.   _BOOL4 v26; // r0
  28.   signed int v27; // r3
  29.   int v28; // r10
  30.   signed int v29; // r11
  31.   unsigned int result; // r0
  32.   unsigned int v31; // r1
  33.   unsigned int v32; // r2
  34.   unsigned int v33; // r2
  35.   unsigned int v34; // r2
  36.   unsigned int v35; // r2
  37.   unsigned int v36; // r2
  38.   unsigned int v37; // r2
  39.   unsigned int v38; // r2
  40.   unsigned int v39; // r3
  41.   int v40; // r11
  42.   int v41; // r10
  43.   int v42; // r9
  44.   int v43; // lr
  45.   int v44; // r4
  46.   int v45; // r12
  47.   int v46; // r2
  48.   int v47; // r7
  49.   int v48; // r3
  50.   signed int v49; // r10
  51.   int v50; // r11
  52.   signed int v51; // r9
  53.   signed int v52; // r5
  54.   _BOOL4 v53; // r11
  55.   signed int v54; // r0
  56.   signed int v55; // r9
  57.   signed int v56; // r0
  58.   _BOOL4 v57; // r9
  59.   int v58; // r10
  60.   int v59; // r9
  61.   int v60; // r0
  62.   _BOOL4 v61; // r10
  63.   _BOOL4 v62; // r9
  64.   signed int v63; // r11
  65.   _BOOL4 v64; // r10
  66.   _BOOL4 v65; // r10
  67.   _BOOL4 v66; // r10
  68.   _BOOL4 v67; // r10
  69.   _BOOL4 v68; // r10
  70.   _BOOL4 v69; // r10
  71.   _BOOL4 v70; // r10
  72.   unsigned int v71; // r1
  73.   _BOOL4 v72; // r3
  74.   int v73; // r3
  75.   unsigned int v74; // r2
  76.   unsigned int v75; // r2
  77.   unsigned int v76; // r2
  78.   unsigned int v77; // r2
  79.   int v78; // r2
  80.   unsigned int v79; // r3
  81.   unsigned int v80; // r3
  82.   unsigned int v81; // r0
  83.   int v82; // r6
  84.   int v83; // lr
  85.   int v84; // r4
  86.   int v85; // r3
  87.   int v86; // r12
  88.   int v87; // r9
  89.   int v88; // r7
  90.   int v89; // r10
  91.   int v90; // r11
  92.   signed int v91; // r9
  93.   _BOOL4 v92; // r10
  94.   _BOOL4 v93; // r11
  95.   bool v94; // zf
  96.   signed int v95; // r5
  97.   signed int v96; // r9
  98.   signed int v97; // r0
  99.   signed int v98; // r9
  100.   signed int v99; // r0
  101.   signed int v100; // r0
  102.   signed int v101; // r9
  103.   int v102; // r9
  104.   _BOOL4 v103; // r9
  105.   signed int v104; // r11
  106.   unsigned int v105; // r1
  107.   signed int v106; // r3
  108.   int v107; // lr
  109.   int v108; // r6
  110.   int v109; // r12
  111.   int v110; // r4
  112.   int v111; // r7
  113.   int v112; // r3
  114.   signed int v113; // r10
  115.   int v114; // r11
  116.   signed int v115; // r9
  117.   signed int v116; // r5
  118.   _BOOL4 v117; // r11
  119.   signed int v118; // r0
  120.   signed int v119; // r9
  121.   signed int v120; // r0
  122.   _BOOL4 v121; // r9
  123.   int v122; // r10
  124.   int v123; // r9
  125.   int v124; // r0
  126.   _BOOL4 v125; // r10
  127.   _BOOL4 v126; // r9
  128.   signed int v127; // r11
  129.   _BOOL4 v128; // r10
  130.   _BOOL4 v129; // r10
  131.   _BOOL4 v130; // r10
  132.   _BOOL4 v131; // r10
  133.   _BOOL4 v132; // r10
  134.   _BOOL4 v133; // r10
  135.   _BOOL4 v134; // r10
  136.   unsigned int v135; // r1
  137.   _BOOL4 v136; // r3
  138.   signed int v137; // [sp+4h] [bp-44h]
  139.   int v138; // [sp+8h] [bp-40h]
  140.   _BOOL4 v139; // [sp+Ch] [bp-3Ch]
  141.   int v140; // [sp+Ch] [bp-3Ch]
  142.   signed int v141; // [sp+10h] [bp-38h]
  143.   signed int v142; // [sp+10h] [bp-38h]
  144.   signed int v143; // [sp+10h] [bp-38h]
  145.   signed int v144; // [sp+10h] [bp-38h]
  146.   signed int v145; // [sp+14h] [bp-34h]
  147.   signed int v146; // [sp+14h] [bp-34h]
  148.   signed int v147; // [sp+14h] [bp-34h]
  149.   signed int v148; // [sp+14h] [bp-34h]
  150.   _BOOL4 v149; // [sp+18h] [bp-30h]
  151.   signed int v150; // [sp+18h] [bp-30h]
  152.   _BOOL4 v151; // [sp+18h] [bp-30h]

  153.   v2 = *(_QWORD *)(a1 + 24);
  154.   v138 = *(_QWORD *)(a1 + 24) >> 32;
  155.   if ( !(_DWORD)v2 )
  156.   {
  157.     if ( HIDWORD(v2) )
  158.     {
  159.       v137 = 7;
  160.       goto LABEL_6;
  161.     }
  162.     v3 = a2 & 1;
  163.     v4 = a2 >> 1;
  164.     v5 = 6;
  165.     v137 = 7;
  166. LABEL_30:
  167.     a2 = (v4 >> 6) & 1 | 2
  168.                        * ((v4 >> 5) & 1 | 2
  169.                                         * ((v4 >> 4) & 1 | 2
  170.                                                          * ((v4 >> 3) & 1 | 2
  171.                                                                           * ((v4 >> 2) & 1 | 2
  172.                                                                                            * ((v4 >> 1) & 1 | 2 * (v4 & 1 | 2 * v3))))));
  173.     v32 = v4 >> 7;
  174.     if ( v5 != 6 )
  175.     {
  176.       a2 = v32 & 1 | 2 * a2;
  177.       v33 = v4 >> 8;
  178.       if ( v5 > 7 )
  179.       {
  180.         a2 = v33 & 1 | 2 * a2;
  181.         v34 = v4 >> 9;
  182.         if ( v5 > 8 )
  183.         {
  184.           a2 = v34 & 1 | 2 * a2;
  185.           v35 = v4 >> 10;
  186.           if ( v5 > 9 )
  187.           {
  188.             a2 = v35 & 1 | 2 * a2;
  189.             v36 = v4 >> 11;
  190.             if ( v5 > 10 )
  191.             {
  192.               a2 = v36 & 1 | 2 * a2;
  193.               v37 = v4 >> 12;
  194.               if ( v5 > 11 )
  195.               {
  196.                 a2 = v37 & 1 | 2 * a2;
  197.                 v38 = v4 >> 13;
  198.                 if ( v5 > 12 )
  199.                 {
  200.                   a2 = v38 & 1 | 2 * a2;
  201.                   v39 = v4 >> 14;
  202.                   if ( v5 == 14 )
  203.                     a2 = v39 | 2 * a2;
  204.                 }
  205.               }
  206.             }
  207.           }
  208.         }
  209.       }
  210.     }
  211. LABEL_6:
  212.     v7 = *(_QWORD *)(a1 + 16) >> 32;
  213.     v6 = *(_QWORD *)(a1 + 16);
  214.     if ( v7 )
  215.       goto LABEL_7;
  216.     goto LABEL_40;
  217.   }
  218.   if ( !HIDWORD(v2) )
  219.   {
  220.     v3 = a2 & 1;
  221.     v4 = a2 >> 1;
  222.     v5 = 14;
  223.     v137 = 15;
  224.     goto LABEL_30;
  225.   }
  226.   v7 = *(_QWORD *)(a1 + 16) >> 32;
  227.   v6 = *(_QWORD *)(a1 + 16);
  228.   v137 = 15;
  229.   if ( v7 )
  230.   {
  231. LABEL_7:
  232.     if ( v6 )
  233.     {
  234.       v8 = *(unsigned __int16 *)(a1 + 6);
  235.       v9 = *(unsigned __int16 *)(a1 + 10);
  236.       v10 = (*(unsigned __int16 *)(a1 + 4) << 15) + 1109459328;
  237.       v11 = (*(unsigned __int16 *)(a1 + 8) << 15) + 1109459328;
  238.       v12 = *(unsigned __int16 *)(a1 + 14);
  239.       v13 = *(unsigned __int16 *)(a1 + 12) << 15;
  240.       *(_DWORD *)(v10 + 4 * v8) = 0;
  241.       v14 = v13 + 1109459200;
  242.       *(_DWORD *)(v11 + 4 * v9) = a2 & 1;
  243.       *(_DWORD *)(v10 + 4 * v8) = 1;
  244.       v15 = *(_DWORD *)(v13 + 1109459200 + 4 * v12);
  245.       *(_DWORD *)(v10 + 4 * v8) = 0;
  246.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 1) & 1;
  247.       *(_DWORD *)(v10 + 4 * v8) = 1;
  248.       v16 = *(_DWORD *)(v13 + 1109459200 + 4 * v12);
  249.       *(_DWORD *)(v10 + 4 * v8) = 0;
  250.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 2) & 1;
  251.       *(_DWORD *)(v10 + 4 * v8) = 1;
  252.       v17 = v15 != 0;
  253.       v18 = v16;
  254.       if ( v16 )
  255.         v18 = 1;
  256.       v19 = *(_DWORD *)(v14 + 4 * v12) != 0;
  257.       *(_DWORD *)(v10 + 4 * v8) = 0;
  258.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 3) & 1;
  259.       *(_DWORD *)(v10 + 4 * v8) = 1;
  260.       v139 = v19;
  261.       v20 = *(_DWORD *)(v14 + 4 * v12);
  262.       *(_DWORD *)(v10 + 4 * v8) = 0;
  263.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 4) & 1;
  264.       v21 = v20;
  265.       if ( v20 )
  266.         v21 = 1;
  267.       *(_DWORD *)(v10 + 4 * v8) = 1;
  268.       v22 = *(_DWORD *)(v14 + 4 * v12);
  269.       v141 = v21;
  270.       *(_DWORD *)(v10 + 4 * v8) = 0;
  271.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 5) & 1;
  272.       v23 = v22;
  273.       if ( v22 )
  274.         v23 = 1;
  275.       *(_DWORD *)(v10 + 4 * v8) = 1;
  276.       v145 = v23;
  277.       v24 = *(_DWORD *)(v14 + 4 * v12);
  278.       *(_DWORD *)(v10 + 4 * v8) = 0;
  279.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 6) & 1;
  280.       *(_DWORD *)(v10 + 4 * v8) = 1;
  281.       v25 = *(_DWORD *)(v14 + 4 * v12);
  282.       *(_DWORD *)(v10 + 4 * v8) = 0;
  283.       *(_DWORD *)(v11 + 4 * v9) = (a2 >> 7) & 1;
  284.       *(_DWORD *)(v10 + 4 * v8) = 1;
  285.       v26 = v24 != 0;
  286.       v27 = v25;
  287.       if ( v25 )
  288.         v27 = 1;
  289.       v28 = v18 | 2 * v17;
  290.       v29 = *(_DWORD *)(v14 + 4 * v12);
  291.       if ( *(_DWORD *)(v14 + 4 * v12) )
  292.         v29 = 1;
  293.       result = v29 | 2 * (v27 | 2 * (v26 | 2 * (v145 | 2 * (v141 | 2 * (v139 | 2 * v28)))));
  294.       if ( v137 != 7 )
  295.       {
  296.         *(_DWORD *)(v10 + 4 * v8) = 0;
  297.         *(_DWORD *)(v11 + 4 * v9) = (unsigned __int8)a2 >> 8;
  298.         *(_DWORD *)(v10 + 4 * v8) = 1;
  299.         result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  300.         if ( v137 > 8 )
  301.         {
  302.           *(_DWORD *)(v10 + 4 * v8) = 0;
  303.           *(_DWORD *)(v11 + 4 * v9) = (a2 >> 9) & 1;
  304.           *(_DWORD *)(v10 + 4 * v8) = 1;
  305.           result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  306.           if ( v137 > 9 )
  307.           {
  308.             *(_DWORD *)(v10 + 4 * v8) = 0;
  309.             *(_DWORD *)(v11 + 4 * v9) = (a2 >> 10) & 1;
  310.             *(_DWORD *)(v10 + 4 * v8) = 1;
  311.             result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  312.             if ( v137 > 10 )
  313.             {
  314.               *(_DWORD *)(v10 + 4 * v8) = 0;
  315.               *(_DWORD *)(v11 + 4 * v9) = (a2 >> 11) & 1;
  316.               *(_DWORD *)(v10 + 4 * v8) = 1;
  317.               result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  318.               if ( v137 > 11 )
  319.               {
  320.                 *(_DWORD *)(v10 + 4 * v8) = 0;
  321.                 *(_DWORD *)(v11 + 4 * v9) = (a2 >> 12) & 1;
  322.                 *(_DWORD *)(v10 + 4 * v8) = 1;
  323.                 result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  324.                 if ( v137 > 12 )
  325.                 {
  326.                   *(_DWORD *)(v10 + 4 * v8) = 0;
  327.                   *(_DWORD *)(v11 + 4 * v9) = (a2 >> 13) & 1;
  328.                   *(_DWORD *)(v10 + 4 * v8) = 1;
  329.                   result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  330.                   if ( v137 > 13 )
  331.                   {
  332.                     *(_DWORD *)(v10 + 4 * v8) = 0;
  333.                     *(_DWORD *)(v11 + 4 * v9) = (a2 >> 14) & 1;
  334.                     *(_DWORD *)(v10 + 4 * v8) = 1;
  335.                     v31 = a2 >> 15;
  336.                     result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  337.                     if ( v137 == 15 )
  338.                     {
  339.                       *(_DWORD *)(v10 + 4 * v8) = 0;
  340.                       *(_DWORD *)(v11 + 4 * v9) = v31;
  341.                       *(_DWORD *)(v10 + 4 * v8) = 1;
  342.                       result = (*(_DWORD *)(v14 + 4 * v12) != 0) | 2 * result;
  343.                     }
  344.                   }
  345.                 }
  346.               }
  347.             }
  348.           }
  349.         }
  350.       }
  351.     }
  352.     else
  353.     {
  354.       v82 = *(unsigned __int16 *)(a1 + 6);
  355.       v83 = *(unsigned __int16 *)(a1 + 10);
  356.       v84 = (*(unsigned __int16 *)(a1 + 4) << 15) + 1109459328;
  357.       v85 = (*(unsigned __int16 *)(a1 + 8) << 15) + 1109459328;
  358.       v86 = *(unsigned __int16 *)(a1 + 14);
  359.       v87 = *(unsigned __int16 *)(a1 + 12) << 15;
  360.       *(_DWORD *)(v84 + 4 * v82) = 1;
  361.       v88 = v87 + 1109459200;
  362.       *(_DWORD *)(v85 + 4 * v83) = a2 & 1;
  363.       *(_DWORD *)(v84 + 4 * v82) = 0;
  364.       v89 = *(_DWORD *)(v87 + 1109459200 + 4 * v86);
  365.       *(_DWORD *)(v84 + 4 * v82) = 1;
  366.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 1) & 1;
  367.       *(_DWORD *)(v84 + 4 * v82) = 0;
  368.       v90 = *(_DWORD *)(v87 + 1109459200 + 4 * v86);
  369.       *(_DWORD *)(v84 + 4 * v82) = 1;
  370.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 2) & 1;
  371.       *(_DWORD *)(v84 + 4 * v82) = 0;
  372.       v91 = *(_DWORD *)(v87 + 1109459200 + 4 * v86);
  373.       *(_DWORD *)(v84 + 4 * v82) = 1;
  374.       v92 = v89 != 0;
  375.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 3) & 1;
  376.       *(_DWORD *)(v84 + 4 * v82) = 0;
  377.       v93 = v90 != 0;
  378.       v95 = v91;
  379.       v94 = v91 == 0;
  380.       v96 = *(_DWORD *)(v88 + 4 * v86);
  381.       *(_DWORD *)(v84 + 4 * v82) = 1;
  382.       if ( !v94 )
  383.         v95 = 1;
  384.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 4) & 1;
  385.       v97 = v96;
  386.       if ( v96 )
  387.         v97 = 1;
  388.       *(_DWORD *)(v84 + 4 * v82) = 0;
  389.       v98 = *(_DWORD *)(v88 + 4 * v86);
  390.       v143 = v97;
  391.       *(_DWORD *)(v84 + 4 * v82) = 1;
  392.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 5) & 1;
  393.       v99 = v98;
  394.       if ( v98 )
  395.         v99 = 1;
  396.       *(_DWORD *)(v84 + 4 * v82) = 0;
  397.       v147 = v99;
  398.       v100 = *(_DWORD *)(v88 + 4 * v86);
  399.       *(_DWORD *)(v84 + 4 * v82) = 1;
  400.       v101 = v100;
  401.       if ( v100 )
  402.         v101 = 1;
  403.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 6) & 1;
  404.       *(_DWORD *)(v84 + 4 * v82) = 0;
  405.       v150 = v101;
  406.       v102 = *(_DWORD *)(v88 + 4 * v86);
  407.       *(_DWORD *)(v84 + 4 * v82) = 1;
  408.       *(_DWORD *)(v85 + 4 * v83) = (a2 >> 7) & 1;
  409.       *(_DWORD *)(v84 + 4 * v82) = 0;
  410.       v140 = v93 | 2 * v92;
  411.       v103 = v102 != 0;
  412.       v104 = *(_DWORD *)(v88 + 4 * v86);
  413.       if ( *(_DWORD *)(v88 + 4 * v86) )
  414.         v104 = 1;
  415.       result = v104 | 2 * (v103 | 2 * (v150 | 2 * (v147 | 2 * (v143 | 2 * (v95 | 2 * v140)))));
  416.       if ( v137 != 7 )
  417.       {
  418.         *(_DWORD *)(v84 + 4 * v82) = 1;
  419.         *(_DWORD *)(v85 + 4 * v83) = (unsigned __int8)a2 >> 8;
  420.         *(_DWORD *)(v84 + 4 * v82) = 0;
  421.         result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  422.         if ( v137 > 8 )
  423.         {
  424.           *(_DWORD *)(v84 + 4 * v82) = 1;
  425.           *(_DWORD *)(v85 + 4 * v83) = (a2 >> 9) & 1;
  426.           *(_DWORD *)(v84 + 4 * v82) = 0;
  427.           result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  428.           if ( v137 > 9 )
  429.           {
  430.             *(_DWORD *)(v84 + 4 * v82) = 1;
  431.             *(_DWORD *)(v85 + 4 * v83) = (a2 >> 10) & 1;
  432.             *(_DWORD *)(v84 + 4 * v82) = 0;
  433.             result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  434.             if ( v137 > 10 )
  435.             {
  436.               *(_DWORD *)(v84 + 4 * v82) = 1;
  437.               *(_DWORD *)(v85 + 4 * v83) = (a2 >> 11) & 1;
  438.               *(_DWORD *)(v84 + 4 * v82) = 0;
  439.               result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  440.               if ( v137 > 11 )
  441.               {
  442.                 *(_DWORD *)(v84 + 4 * v82) = 1;
  443.                 *(_DWORD *)(v85 + 4 * v83) = (a2 >> 12) & 1;
  444.                 *(_DWORD *)(v84 + 4 * v82) = 0;
  445.                 result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  446.                 if ( v137 > 12 )
  447.                 {
  448.                   *(_DWORD *)(v84 + 4 * v82) = 1;
  449.                   *(_DWORD *)(v85 + 4 * v83) = (a2 >> 13) & 1;
  450.                   *(_DWORD *)(v84 + 4 * v82) = 0;
  451.                   result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  452.                   if ( v137 > 13 )
  453.                   {
  454.                     *(_DWORD *)(v84 + 4 * v82) = 1;
  455.                     *(_DWORD *)(v85 + 4 * v83) = (a2 >> 14) & 1;
  456.                     *(_DWORD *)(v84 + 4 * v82) = 0;
  457.                     v105 = a2 >> 15;
  458.                     result = (*(_DWORD *)(v88 + 4 * v86) != 0) | 2 * result;
  459.                     if ( v137 == 15 )
  460.                     {
  461.                       *(_DWORD *)(v84 + 4 * v82) = 1;
  462.                       *(_DWORD *)(v85 + 4 * v83) = v105;
  463.                       *(_DWORD *)(v84 + 4 * v82) = 0;
  464.                       v106 = *(_DWORD *)(v88 + 4 * v86);
  465.                       if ( *(_DWORD *)(v88 + 4 * v86) )
  466.                         v106 = 1;
  467.                       result = v106 | 2 * result;
  468.                     }
  469.                   }
  470.                 }
  471.               }
  472.             }
  473.           }
  474.         }
  475.       }
  476.     }
  477.     goto LABEL_27;
  478.   }
  479. LABEL_40:
  480.   v40 = *(unsigned __int16 *)(a1 + 12);
  481.   v41 = *(unsigned __int16 *)(a1 + 8);
  482.   v42 = *(unsigned __int16 *)(a1 + 4);
  483.   if ( v6 )
  484.   {
  485.     v43 = *(unsigned __int16 *)(a1 + 14);
  486.     v44 = *(unsigned __int16 *)(a1 + 6);
  487.     v45 = *(unsigned __int16 *)(a1 + 10);
  488.     v46 = (v42 << 15) + 1109459328;
  489.     v47 = (v41 << 15) + 1109459328;
  490.     v48 = (v40 << 15) + 1109459200;
  491.     v49 = *(_DWORD *)((v40 << 15) + 0x42210100 + 4 * v43);
  492.     *(_DWORD *)(v47 + 4 * v45) = a2 & 1;
  493.     *(_DWORD *)(v46 + 4 * v44) = v7;
  494.     *(_DWORD *)(v46 + 4 * v44) = 1;
  495.     v50 = *(_DWORD *)((v40 << 15) + 0x42210100 + 4 * v43);
  496.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 1) & 1;
  497.     *(_DWORD *)(v46 + 4 * v44) = v7;
  498.     *(_DWORD *)(v46 + 4 * v44) = 1;
  499.     v51 = *(_DWORD *)(v48 + 4 * v43);
  500.     v52 = v49;
  501.     if ( v49 )
  502.       v52 = 1;
  503.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 2) & 1;
  504.     v53 = v50 != 0;
  505.     v54 = v51;
  506.     if ( v51 )
  507.       v54 = 1;
  508.     *(_DWORD *)(v46 + 4 * v44) = v7;
  509.     *(_DWORD *)(v46 + 4 * v44) = 1;
  510.     v55 = *(_DWORD *)(v48 + 4 * v43);
  511.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 3) & 1;
  512.     v142 = v54;
  513.     *(_DWORD *)(v46 + 4 * v44) = v7;
  514.     v56 = v55;
  515.     *(_DWORD *)(v46 + 4 * v44) = 1;
  516.     if ( v55 )
  517.       v56 = 1;
  518.     v57 = *(_DWORD *)(v48 + 4 * v43) != 0;
  519.     v146 = v56;
  520.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 4) & 1;
  521.     *(_DWORD *)(v46 + 4 * v44) = v7;
  522.     *(_DWORD *)(v46 + 4 * v44) = 1;
  523.     v58 = *(_DWORD *)(v48 + 4 * v43);
  524.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 5) & 1;
  525.     *(_DWORD *)(v46 + 4 * v44) = v7;
  526.     *(_DWORD *)(v46 + 4 * v44) = 1;
  527.     v149 = v57;
  528.     v59 = *(_DWORD *)(v48 + 4 * v43);
  529.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 6) & 1;
  530.     *(_DWORD *)(v46 + 4 * v44) = v7;
  531.     *(_DWORD *)(v46 + 4 * v44) = 1;
  532.     v60 = v53 | 2 * v52;
  533.     v61 = v58 != 0;
  534.     v62 = v59 != 0;
  535.     v63 = *(_DWORD *)(v48 + 4 * v43);
  536.     if ( *(_DWORD *)(v48 + 4 * v43) )
  537.       v63 = 1;
  538.     *(_DWORD *)(v47 + 4 * v45) = (a2 >> 7) & 1;
  539.     result = v63 | 2 * (v62 | 2 * (v61 | 2 * (v149 | 2 * (v146 | 2 * (v142 | 2 * v60)))));
  540.     *(_DWORD *)(v46 + 4 * v44) = v7;
  541.     *(_DWORD *)(v46 + 4 * v44) = 1;
  542.     if ( v137 != 7 )
  543.     {
  544.       v64 = *(_DWORD *)(v48 + 4 * v43) != 0;
  545.       *(_DWORD *)(v47 + 4 * v45) = (unsigned __int8)a2 >> 8;
  546.       result = v64 | 2 * result;
  547.       *(_DWORD *)(v46 + 4 * v44) = v7;
  548.       *(_DWORD *)(v46 + 4 * v44) = 1;
  549.       if ( v137 > 8 )
  550.       {
  551.         v65 = *(_DWORD *)(v48 + 4 * v43) != 0;
  552.         *(_DWORD *)(v47 + 4 * v45) = (a2 >> 9) & 1;
  553.         result = v65 | 2 * result;
  554.         *(_DWORD *)(v46 + 4 * v44) = v7;
  555.         *(_DWORD *)(v46 + 4 * v44) = 1;
  556.         if ( v137 > 9 )
  557.         {
  558.           v66 = *(_DWORD *)(v48 + 4 * v43) != 0;
  559.           *(_DWORD *)(v47 + 4 * v45) = (a2 >> 10) & 1;
  560.           result = v66 | 2 * result;
  561.           *(_DWORD *)(v46 + 4 * v44) = v7;
  562.           *(_DWORD *)(v46 + 4 * v44) = 1;
  563.           if ( v137 > 10 )
  564.           {
  565.             v67 = *(_DWORD *)(v48 + 4 * v43) != 0;
  566.             *(_DWORD *)(v47 + 4 * v45) = (a2 >> 11) & 1;
  567.             result = v67 | 2 * result;
  568.             *(_DWORD *)(v46 + 4 * v44) = v7;
  569.             *(_DWORD *)(v46 + 4 * v44) = 1;
  570.             if ( v137 > 11 )
  571.             {
  572.               v68 = *(_DWORD *)(v48 + 4 * v43) != 0;
  573.               *(_DWORD *)(v47 + 4 * v45) = (a2 >> 12) & 1;
  574.               result = v68 | 2 * result;
  575.               *(_DWORD *)(v46 + 4 * v44) = v7;
  576.               *(_DWORD *)(v46 + 4 * v44) = 1;
  577.               if ( v137 > 12 )
  578.               {
  579.                 v69 = *(_DWORD *)(v48 + 4 * v43) != 0;
  580.                 *(_DWORD *)(v47 + 4 * v45) = (a2 >> 13) & 1;
  581.                 result = v69 | 2 * result;
  582.                 *(_DWORD *)(v46 + 4 * v44) = v7;
  583.                 *(_DWORD *)(v46 + 4 * v44) = 1;
  584.                 if ( v137 > 13 )
  585.                 {
  586.                   v70 = *(_DWORD *)(v48 + 4 * v43) != 0;
  587.                   *(_DWORD *)(v47 + 4 * v45) = (a2 >> 14) & 1;
  588.                   v71 = a2 >> 15;
  589.                   *(_DWORD *)(v46 + 4 * v44) = v7;
  590.                   result = v70 | 2 * result;
  591.                   *(_DWORD *)(v46 + 4 * v44) = 1;
  592.                   if ( v137 == 15 )
  593.                   {
  594.                     v72 = *(_DWORD *)(v48 + 4 * v43) != 0;
  595.                     *(_DWORD *)(v47 + 4 * v45) = v71;
  596.                     result = v72 | 2 * result;
  597.                     *(_DWORD *)(v46 + 4 * v44) = 0;
  598.                     *(_DWORD *)(v46 + 4 * v44) = 1;
  599.                   }
  600.                 }
  601.               }
  602.             }
  603.           }
  604.         }
  605.       }
  606.     }
  607.   }
  608.   else
  609.   {
  610.     v107 = *(unsigned __int16 *)(a1 + 14);
  611.     v108 = *(unsigned __int16 *)(a1 + 6);
  612.     v109 = *(unsigned __int16 *)(a1 + 10);
  613.     v110 = (v42 << 15) + 1109459328;
  614.     v111 = (v41 << 15) + 1109459328;
  615.     v112 = (v40 << 15) + 1109459200;
  616.     v113 = *(_DWORD *)((v40 << 15) + 0x42210100 + 4 * v107);
  617.     *(_DWORD *)(v111 + 4 * v109) = a2 & 1;
  618.     *(_DWORD *)(v110 + 4 * v108) = 1;
  619.     *(_DWORD *)(v110 + 4 * v108) = 0;
  620.     v114 = *(_DWORD *)((v40 << 15) + 0x42210100 + 4 * v107);
  621.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 1) & 1;
  622.     *(_DWORD *)(v110 + 4 * v108) = 1;
  623.     *(_DWORD *)(v110 + 4 * v108) = 0;
  624.     v115 = *(_DWORD *)(v112 + 4 * v107);
  625.     v116 = v113;
  626.     if ( v113 )
  627.       v116 = 1;
  628.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 2) & 1;
  629.     v117 = v114 != 0;
  630.     v118 = v115;
  631.     if ( v115 )
  632.       v118 = 1;
  633.     *(_DWORD *)(v110 + 4 * v108) = 1;
  634.     *(_DWORD *)(v110 + 4 * v108) = 0;
  635.     v119 = *(_DWORD *)(v112 + 4 * v107);
  636.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 3) & 1;
  637.     v144 = v118;
  638.     *(_DWORD *)(v110 + 4 * v108) = 1;
  639.     v120 = v119;
  640.     *(_DWORD *)(v110 + 4 * v108) = 0;
  641.     if ( v119 )
  642.       v120 = 1;
  643.     v121 = *(_DWORD *)(v112 + 4 * v107) != 0;
  644.     v148 = v120;
  645.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 4) & 1;
  646.     *(_DWORD *)(v110 + 4 * v108) = 1;
  647.     *(_DWORD *)(v110 + 4 * v108) = 0;
  648.     v122 = *(_DWORD *)(v112 + 4 * v107);
  649.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 5) & 1;
  650.     *(_DWORD *)(v110 + 4 * v108) = 1;
  651.     *(_DWORD *)(v110 + 4 * v108) = 0;
  652.     v151 = v121;
  653.     v123 = *(_DWORD *)(v112 + 4 * v107);
  654.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 6) & 1;
  655.     *(_DWORD *)(v110 + 4 * v108) = 1;
  656.     *(_DWORD *)(v110 + 4 * v108) = 0;
  657.     v124 = v117 | 2 * v116;
  658.     v125 = v122 != 0;
  659.     v126 = v123 != 0;
  660.     v127 = *(_DWORD *)(v112 + 4 * v107);
  661.     if ( *(_DWORD *)(v112 + 4 * v107) )
  662.       v127 = 1;
  663.     *(_DWORD *)(v111 + 4 * v109) = (a2 >> 7) & 1;
  664.     result = v127 | 2 * (v126 | 2 * (v125 | 2 * (v151 | 2 * (v148 | 2 * (v144 | 2 * v124)))));
  665.     *(_DWORD *)(v110 + 4 * v108) = 1;
  666.     *(_DWORD *)(v110 + 4 * v108) = 0;
  667.     if ( v137 != 7 )
  668.     {
  669.       v128 = *(_DWORD *)(v112 + 4 * v107) != 0;
  670.       *(_DWORD *)(v111 + 4 * v109) = (unsigned __int8)a2 >> 8;
  671.       result = v128 | 2 * result;
  672.       *(_DWORD *)(v110 + 4 * v108) = 1;
  673.       *(_DWORD *)(v110 + 4 * v108) = 0;
  674.       if ( v137 > 8 )
  675.       {
  676.         v129 = *(_DWORD *)(v112 + 4 * v107) != 0;
  677.         *(_DWORD *)(v111 + 4 * v109) = (a2 >> 9) & 1;
  678.         result = v129 | 2 * result;
  679.         *(_DWORD *)(v110 + 4 * v108) = 1;
  680.         *(_DWORD *)(v110 + 4 * v108) = 0;
  681.         if ( v137 > 9 )
  682.         {
  683.           v130 = *(_DWORD *)(v112 + 4 * v107) != 0;
  684.           *(_DWORD *)(v111 + 4 * v109) = (a2 >> 10) & 1;
  685.           result = v130 | 2 * result;
  686.           *(_DWORD *)(v110 + 4 * v108) = 1;
  687.           *(_DWORD *)(v110 + 4 * v108) = 0;
  688.           if ( v137 > 10 )
  689.           {
  690.             v131 = *(_DWORD *)(v112 + 4 * v107) != 0;
  691.             *(_DWORD *)(v111 + 4 * v109) = (a2 >> 11) & 1;
  692.             result = v131 | 2 * result;
  693.             *(_DWORD *)(v110 + 4 * v108) = 1;
  694.             *(_DWORD *)(v110 + 4 * v108) = 0;
  695.             if ( v137 > 11 )
  696.             {
  697.               v132 = *(_DWORD *)(v112 + 4 * v107) != 0;
  698.               *(_DWORD *)(v111 + 4 * v109) = (a2 >> 12) & 1;
  699.               result = v132 | 2 * result;
  700.               *(_DWORD *)(v110 + 4 * v108) = 1;
  701.               *(_DWORD *)(v110 + 4 * v108) = 0;
  702.               if ( v137 > 12 )
  703.               {
  704.                 v133 = *(_DWORD *)(v112 + 4 * v107) != 0;
  705.                 *(_DWORD *)(v111 + 4 * v109) = (a2 >> 13) & 1;
  706.                 result = v133 | 2 * result;
  707.                 *(_DWORD *)(v110 + 4 * v108) = 1;
  708.                 *(_DWORD *)(v110 + 4 * v108) = 0;
  709.                 if ( v137 > 13 )
  710.                 {
  711.                   v134 = *(_DWORD *)(v112 + 4 * v107) != 0;
  712.                   *(_DWORD *)(v111 + 4 * v109) = (a2 >> 14) & 1;
  713.                   v135 = a2 >> 15;
  714.                   *(_DWORD *)(v110 + 4 * v108) = 1;
  715.                   result = v134 | 2 * result;
  716.                   *(_DWORD *)(v110 + 4 * v108) = 0;
  717.                   if ( v137 == 15 )
  718.                   {
  719.                     v136 = *(_DWORD *)(v112 + 4 * v107) != 0;
  720.                     *(_DWORD *)(v111 + 4 * v109) = v135;
  721.                     *(_DWORD *)(v110 + 4 * v108) = 1;
  722.                     result = v136 | 2 * result;
  723.                     *(_DWORD *)(v110 + 4 * v108) = 0;
  724.                   }
  725.                 }
  726.               }
  727.             }
  728.           }
  729.         }
  730.       }
  731.     }
  732.   }
  733. LABEL_27:
  734.   if ( v138 )
  735.   {
  736.     v73 = (result >> 7) & 1 | 2
  737.                             * ((result >> 6) & 1 | 2
  738.                                                  * ((result >> 5) & 1 | 2
  739.                                                                       * ((result >> 4) & 1 | 2
  740.                                                                                            * ((result >> 3) & 1 | 2 * ((result >> 2) & 1 | 2 * (2 * result & 2 | (result >> 1) & 1))))));
  741.     v74 = result >> 8;
  742.     if ( v137 == 7
  743.       || (v73 = v74 & 1 | 2 * v73, v75 = result >> 9, v137 <= 8)
  744.       || (v73 = v75 & 1 | 2 * v73, v76 = result >> 10, v137 <= 9)
  745.       || (v73 = v76 & 1 | 2 * v73, v77 = result >> 11, v137 <= 10) )
  746.     {
  747.       result = v73;
  748.     }
  749.     else
  750.     {
  751.       v78 = v77 & 1 | 2 * v73;
  752.       v79 = result >> 12;
  753.       if ( v137 <= 11
  754.         || (v78 = v79 & 1 | 2 * v78, v80 = result >> 13, v137 <= 12)
  755.         || (v78 = v80 & 1 | 2 * v78, v137 <= 13)
  756.         || (v78 = (result >> 14) & 1 | 2 * v78, v81 = result >> 15, v137 != 15) )
  757.       {
  758.         result = v78;
  759.       }
  760.       else
  761.       {
  762.         result = v81 | 2 * v78;
  763.       }
  764.     }
  765.   }
  766.   return result;
  767. }
复制代码
其实有些地方它并不是十分准确,因为我是不停地对一个volatile修饰的变量进行读写,而IDA的F5会把这些大量的volatile读写操作整理成一长句,或者搞没。所以不能太信任它。
ARM不同于牙膏厂x86,它没有缓存的概念,也没有乱序执行。而且因为ARM有个三级流水线,每次跳转都要浪费两个周期的时间,所以要尽量减少跳转的次数。
但该做成函数的还是要做成函数,如果啥都内联的话,STM32F103的64K ROM是不够用的。
回复

使用道具 举报

发表于 2018-5-6 08:12:41 | 显示全部楼层
每个循环单独写成一个函数就好 牺牲点性能没啥大不了的
现在arm被冷落了 大多开始转向risc-v了
risc-v
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 16:14 , Processed in 0.049526 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表