簡體   English   中英

為什么GCC為Cortex-A9生成Fxxx而不是Vxxx浮點匯編指令?

[英]Why does GCC generates Fxxx instead of Vxxx floating point assembly instructions for Cortex-A9?

我正在嘗試為ARM Cortex-A9生成浮點代碼。 我正在研究為NEON協處理器生成的代碼與僅為VFPV3協處理器生成的代碼之間的性能差異。 我從以下簡單的測試程序開始:

#define ASIZE 4

float   A[ASIZE] = {7.0f, 2.0f, 3.0f, 4.0f};
float   B[ASIZE] = {5.0f, 6.0f, 7.0f, 8.0f};
float   C[ASIZE];

int main(void) {
unsigned int i;
for (i=0; i<ASIZE; i++)
{
    C[i] = A[i] + B[i];
}
return 0;
}

當我用以下標志編譯它時

CCFLAGS = -g -c -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -ffast-math -funsafe-math-optimizations 

我從GCC或Code Sourcery Lite編譯器獲得以下程序集輸出:

 9:atest.c       **** int main(void) {
23                      .loc 1 9 0
24                      .cfi_startproc
25                      @ args = 0, pretend = 0, frame = 0
26                      @ frame_needed = 0, uses_anonymous_args = 0
27                      @ link register save eliminated.
10:atest.c       **** 
11:atest.c       ****   unsigned int i;
12:atest.c       **** 
13:atest.c       ****   for (i=0; i<ASIZE; i++)
14:atest.c       ****   {
15:atest.c       ****       C[i] = A[i] + B[i];
28                      .loc 1 15 0
29 0000 003000E3        movw    r3, #:lower16:.LANCHOR0
30 0004 002000E3        movw    r2, #:lower16:C
31 0008 003040E3        movt    r3, #:upper16:.LANCHOR0
32 000c DF2A63F4        vld1.64 {d18-d19}, [r3:64]
33 0010 040BD3ED        vldr    d16, [r3, #16]
34 0014 061BD3ED        vldr    d17, [r3, #24]
35 0018 E00D42F2        vadd.f32    q8, q9, q8
36 001c 002040E3        movt    r2, #:upper16:C
16:atest.c       ****   }
17:atest.c       **** 
18:atest.c       ****   return 0;
19:atest.c       **** }

這是我期望看到的。 浮點指令的形式為“ Vxxx”​​。

現在,當我將編譯器標志更改為-mfpu = vfpv3(或任何其他排列,例如-mfpu = vfpv3-d16-f16)時,會看到以下內容:

 9:atest.c       **** int main(void) {
23                      .loc 1 9 0
24                      .cfi_startproc
25                      @ args = 0, pretend = 0, frame = 0
26                      @ frame_needed = 0, uses_anonymous_args = 0
27                      @ link register save eliminated.
28                  .LVL0:
11:atest.c       ****   unsigned int i;
13:atest.c       ****   for (i=0; i<ASIZE; i++)
14:atest.c       ****   {
15:atest.c       ****       C[i] = A[i] + B[i];
29                      .loc 1 15 0
30 0000 003000E3        movw    r3, #:lower16:.LANCHOR0
31 0004 002000E3        movw    r2, #:lower16:C
32 0008 003040E3        movt    r3, #:upper16:.LANCHOR0
33 000c 002040E3        movt    r2, #:upper16:C
34 0010 004A93ED        flds    s8, [r3]
16:atest.c       ****   }
18:atest.c       ****   return 0;
19:atest.c       **** }
35                      .loc 1 19 0
36 0014 0000A0E3        mov r0, #0
15:atest.c       ****   }
37                      .loc 1 15 0
38 0018 046A93ED        flds    s12, [r3, #16]
39 001c 014AD3ED        flds    s9, [r3, #4]
40 0020 056AD3ED        flds    s13, [r3, #20]
41 0024 025A93ED        flds    s10, [r3, #8]
42 0028 067A93ED        flds    s14, [r3, #24]
43 002c 035AD3ED        flds    s11, [r3, #12]
44 0030 077AD3ED        flds    s15, [r3, #28]
45 0034 066A34EE        fadds   s12, s8, s12
46 0038 A66A74EE        fadds   s13, s9, s13
47 003c 077A35EE        fadds   s14, s10, s14
48 0040 A77A75EE        fadds   s15, s11, s15
49 0044 006A82ED        fsts    s12, [r2]
50                  .LVL1:
51 0048 016AC2ED        fsts    s13, [r2, #4]
52                  .LVL2:
53 004c 027A82ED        fsts    s14, [r2, #8]
54                  .LVL3:
55 0050 037AC2ED        fsts    s15, [r2, #12]
56                  .LVL4:
57                      .loc 1 19 0
58 0054 1EFF2FE1        bx  lr
59                      .cfi_endproc
60                  .LFE0:
61                      .fnend

所有浮點匯編指令的格式均為“ Fxxx”。 他們為什么不采用“ Vxxx”​​形式? 我期待看到類似於VLD1.32的加載指令,並添加類似於VADD.F32的指令。 當我在ARM官方文檔中搜索指令“ flds”時,它說“ flds”用於ARM9體系結構,而不是Cortex-A9。

我已經嘗試了-mcpu,-mfpu和-march編譯器標志的每種組合,但是使用Linux的GCC編譯器或Linux的Code Sorcery Lite編譯器似乎無法生成“ Vxxx”​​形式的浮點匯編指令。 。 我究竟做錯了什么?

我究竟做錯了什么?

絕對沒有,除非您使用舊的反匯編程序進行計數。 指令是相同的,編碼是相同的,只是建議的匯編助記符已更改 顯然,自從ARM引入UAL語法以來,您正在使用的反匯編程序(我不知道該輸出格式)都沒有得到更新,因此已經反匯編為舊的助記符。 可以隨意嘗試另一個反匯編程序(例如,最近流行的objdump )進行比較,但是正如我所說的,這純粹是表示形式上的差異-無需擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM