![](/img/trans.png)
[英]GCC 8 Cross Compiler outputs ARMv7 executable instead of ARMv6
[英]ARMv7 gcc option to force native divide
我正在使用GCC為支持本機划分的ARMv7內核構建裸機應用程序。 我刪除了所有庫依賴項。
GCC C編譯器有時會引用__aeabi_uidiv()。 其他時候,它將選擇使用硬件除法(用於無符號整數除法)。 我一直找不到能夠迫使其使用硬件除法器(而不是__aeabi_ * lib調用)的編譯器標志。 有人知道這樣的標志嗎?
編輯:我應該澄清一下,我正在為i.MX6ULL使用編譯器標志-mtune = cortex-a7和-march = armv7-a。
錯誤示例:
uint32_t GenerateError(uint32_t num, uint32_t den) {
return num / den; //generates undefined reference to __aeabi_uidiv
}
gcc就是這樣的編譯器。
uint8_t fun_u8 ( uint8_t a, uint8_t b )
{
return(a/b);
}
uint16_t fun_u16 ( uint16_t a, uint16_t b )
{
return(a/b);
}
uint32_t fun_u32 ( uint32_t a, uint32_t b )
{
return(a/b);
}
uint64_t fun_u64 ( uint64_t a, uint64_t b )
{
return(a/b);
}
int8_t fun_s8 ( int8_t a, int8_t b )
{
return(a/b);
}
int16_t fun_s16 ( int16_t a, int16_t b )
{
return(a/b);
}
int32_t fun_s32 ( int32_t a, int32_t b )
{
return(a/b);
}
int64_t fun_s64 ( int64_t a, int64_t b )
{
return(a/b);
}
建立
arm-none-eabi-gcc -O2 -mcpu = cortex-a7 -c so.c -o so.o
結果
00000000 <fun_u8>:
0: e730f110 udiv r0, r0, r1
4: e12fff1e bx lr
00000008 <fun_u16>:
8: e730f110 udiv r0, r0, r1
c: e12fff1e bx lr
00000010 <fun_u32>:
10: e730f110 udiv r0, r0, r1
14: e12fff1e bx lr
00000018 <fun_u64>:
18: e92d4010 push {r4, lr}
1c: ebfffffe bl 0 <__aeabi_uldivmod>
20: e8bd8010 pop {r4, pc}
00000024 <fun_s8>:
24: e730f110 udiv r0, r0, r1
28: e12fff1e bx lr
0000002c <fun_s16>:
2c: e710f110 sdiv r0, r0, r1
30: e6bf0070 sxth r0, r0
34: e12fff1e bx lr
00000038 <fun_s32>:
38: e710f110 sdiv r0, r0, r1
3c: e12fff1e bx lr
00000040 <fun_s64>:
40: e92d4010 push {r4, lr}
44: ebfffffe bl 0 <__aeabi_ldivmod>
48: e8bd8010 pop {r4, pc}
根據正確的Arm文檔,硬件支持最高32位/ 32位。 除此之外,您還必須調用一個庫(乘以相同)只是為了確認期望可以添加:
uint8_t fun_m8 ( uint32_t a, uint8_t b )
{
return(a/b);
}
uint16_t fun_m16 ( uint32_t a, uint16_t b )
{
return(a/b);
}
uint32_t fun_m32 ( uint32_t a, uint32_t b )
{
return(a/b);
}
0000004c <fun_m8>:
4c: e730f110 udiv r0, r0, r1
50: e6ef0070 uxtb r0, r0
54: e12fff1e bx lr
00000058 <fun_m16>:
58: e730f110 udiv r0, r0, r1
5c: e6ff0070 uxth r0, r0
60: e12fff1e bx lr
00000064 <fun_m32>:
64: e730f110 udiv r0, r0, r1
68: e12fff1e bx lr
毫不奇怪。
現在是手臂模式,編譯器通常會以拇指模式...
00000000 <fun_u8>:
0: fbb0 f0f1 udiv r0, r0, r1
4: 4770 bx lr
6: bf00 nop
00000008 <fun_u16>:
8: fbb0 f0f1 udiv r0, r0, r1
c: 4770 bx lr
e: bf00 nop
...
此平台上沒有任何變化的thumb2也支持除法,因此其大於支持正在編譯的代碼的要求,該要求決定了是否可以使用硬件指令,對於此測試,gcc選擇了所需的硬件指令,而不是gcclib調用(對於那些可以的)。
如果要編譯器使用硬件指令,則指示編譯器使用所需的指令集。 並將您的代碼保持在該指令集的功能范圍內。 並使用同樣針對感興趣的指令集編譯的庫,並且代碼不會超出該指令集的范圍。 (然后查看編譯器是使用整個指令集還是至少使用感興趣的指令,如果不使用,則使您自己的庫函數進行匯編分割並調用它)。
您正在尋找的是-march=armv7ve
。 這將針對帶有硬件除法指令的Armv7。 -mcpu=cortex-a15
和cortex-a7
以此架構cortex-a7
目標,因此它們將生成除法指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.