Кросс шланг для cortex-m*

Вот такой простой тестовый исходник.
int blcFeedBack(int iA, int iB)
{
int iY;
iY = (2365LL * iA) >> 32;
return iY;
}
arm-none-eabi-gcc -S foo.c -mcpu=cortex-m3 -mthumb -O2
movw r3, #2365
smull r0, r1, r0, r3
mov r0, r1
bx lr
clang -target arm-none-eabi -S foo.c -mcpu=cortex-m3 -mthumb -O2
movw r1, #2365
smull r1, r0, r0, r1
bx lr
cross-arm-none-eabi/gcc-4.8.2
sys-devel/clang-3.3-r100
Делать тесты на коде записи в регистры думаю смысла нет, кода с плавающей точкой у меня сейчас подходящего нет.
int sqd(float a)
{
return a * a;
}
arm-none-eabi-gcc -c foo.c -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O2
0000000c <sqd>:
c: ee20 0a00 vmul.f32 s0, s0, s0
10: eebd 0ac0 vcvt.s32.f32 s0, s0
14: ee10 0a10 vmov r0, s0
18: 4770 bx lr
1a: bf00 nop
clang -target arm-none-eabi -c foo.c -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -O2
0000000c <sqd>:
c: ee20 0a00 vmul.f32 s0, s0, s0
10: eebd 0ac0 vcvt.s32.f32 s0, s0
14: ee10 0a10 vmov r0, s0
18: 4770 bx lr
1a: bf00 nop
Делал objdump т.к. gcc генерит нечто странное с префиксами f вместо v, но binutils его понимает.
Кто уже пробовал отпишите о результатах.
Добавка: Попробовал на коде инициализации.
GCC:
0000001c <irqSysTick>:
1c: f7ff bffe b.w 0 <halTick>
Clang:
0000001c <irqSysTick>:
1c: b580 push {r7, lr}
1e: 466f mov r7, sp
20: f7ff fffe bl 0 <halTick>
24: bd80 pop {r7, pc}
26: bf00 nop
Подозреваю можно отключить сохранение sp, но не копал пока.
GCC:
000001a0 <halResetReason>:
1a0: f44f 5360 mov.w r3, #14336 ; 0x3800
1a4: f2c4 0302 movt r3, #16386 ; 0x4002
1a8: 6f58 ldr r0, [r3, #116] ; 0x74
1aa: 0e40 lsrs r0, r0, #25
1ac: 4770 bx lr
1ae: bf00 nop
Clang:
000001cc <halResetReason>:
1cc: f643 0074 movw r0, #14452 ; 0x3874
1d0: f2c4 0002 movt r0, #16386 ; 0x4002
1d4: 6800 ldr r0, [r0, #0]
1d6: 0e40 lsrs r0, r0, #25
1d8: 4770 bx lr
1da: bf00 nop
Здесь я не понимаю GCC. Есть еще длинная функция инициализации, но у меня нет сил ее анализировать.
GCC:
00000020 <halEntry>:
20: b508 push {r3, lr}
22: f44f 5360 mov.w r3, #14336 ; 0x3800
26: f2c4 0302 movt r3, #16386 ; 0x4002
2a: 2200 movs r2, #0
2c: 6819 ldr r1, [r3, #0]
2e: f041 0101 orr.w r1, r1, #1
32: 6019 str r1, [r3, #0]
34: 609a str r2, [r3, #8]
36: 6819 ldr r1, [r3, #0]
38: f021 7186 bic.w r1, r1, #17563648 ; 0x10c0000
3c: f421 3180 bic.w r1, r1, #65536 ; 0x10000
40: 6019 str r1, [r3, #0]
42: 60da str r2, [r3, #12]
44: 6819 ldr r1, [r3, #0]
46: f441 3180 orr.w r1, r1, #65536 ; 0x10000
4a: 6019 str r1, [r3, #0]
4c: 461c mov r4, r3
4e: f644 70ff movw r0, #20479 ; 0x4fff
52: 6821 ldr r1, [r4, #0]
54: f411 3100 ands.w r1, r1, #131072 ; 0x20000
58: f102 0201 add.w r2, r2, #1
5c: bf14 ite ne
5e: 2500 movne r5, #0
60: 2501 moveq r5, #1
62: f44f 5360 mov.w r3, #14336 ; 0x3800
66: 4282 cmp r2, r0
68: bfcc ite gt
6a: 2500 movgt r5, #0
6c: f005 0501 andle.w r5, r5, #1
70: f2c4 0302 movt r3, #16386 ; 0x4002
74: 2d00 cmp r5, #0
76: d1ec bne.n 52 <halEntry+0x32>
78: 2900 cmp r1, #0
7a: d039 beq.n f0 <halEntry+0xd0>
7c: 6c19 ldr r1, [r3, #64] ; 0x40
7e: f44f 42e0 mov.w r2, #28672 ; 0x7000
82: f2c4 0200 movt r2, #16384 ; 0x4000
86: f041 5180 orr.w r1, r1, #268435456 ; 0x10000000
8a: 6419 str r1, [r3, #64] ; 0x40
8c: 6811 ldr r1, [r2, #0]
8e: f441 4140 orr.w r1, r1, #49152 ; 0xc000
92: 6011 str r1, [r2, #0]
94: 689a ldr r2, [r3, #8]
96: f422 427c bic.w r2, r2, #64512 ; 0xfc00
9a: f022 02f0 bic.w r2, r2, #240 ; 0xf0
9e: 609a str r2, [r3, #8]
a0: 6899 ldr r1, [r3, #8]
a2: f642 2204 movw r2, #10756 ; 0x2a04
a6: f2c0 7240 movt r2, #1856 ; 0x740
aa: f441 4114 orr.w r1, r1, #37888 ; 0x9400
ae: 6099 str r1, [r3, #8]
b0: 605a str r2, [r3, #4]
b2: 681a ldr r2, [r3, #0]
b4: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000
b8: 601a str r2, [r3, #0]
ba: 6819 ldr r1, [r3, #0]
bc: f44f 5260 mov.w r2, #14336 ; 0x3800
c0: 0189 lsls r1, r1, #6
c2: f2c4 0202 movt r2, #16386 ; 0x4002
c6: d5f8 bpl.n ba <halEntry+0x9a>
c8: f44f 5370 mov.w r3, #15360 ; 0x3c00
cc: f2c4 0302 movt r3, #16386 ; 0x4002
d0: f240 7105 movw r1, #1797 ; 0x705
d4: 6019 str r1, [r3, #0]
d6: 6893 ldr r3, [r2, #8]
d8: f023 0303 bic.w r3, r3, #3
dc: 6093 str r3, [r2, #8]
de: 6893 ldr r3, [r2, #8]
e0: f043 0302 orr.w r3, r3, #2
e4: 6093 str r3, [r2, #8]
e6: 6893 ldr r3, [r2, #8]
e8: f003 030c and.w r3, r3, #12
ec: 2b08 cmp r3, #8
ee: d1fa bne.n e6 <halEntry+0xc6>
f0: f44f 436d mov.w r3, #60672 ; 0xed00
f4: f2ce 0300 movt r3, #57344 ; 0xe000
f8: f8d3 2088 ldr.w r2, [r3, #136] ; 0x88
fc: f442 0270 orr.w r2, r2, #15728640 ; 0xf00000
100: f8c3 2088 str.w r2, [r3, #136] ; 0x88
104: f3bf 8f4f dsb sy
108: f3bf 8f6f isb sy
10c: f44f 436d mov.w r3, #60672 ; 0xed00
110: f2ce 0300 movt r3, #57344 ; 0xe000
114: f240 0200 movw r2, #0
118: f2c0 0200 movt r2, #0
11c: 609a str r2, [r3, #8]
11e: 68da ldr r2, [r3, #12]
120: f64f 01ff movw r1, #63743 ; 0xf8ff
124: 4011 ands r1, r2
126: f24e 0210 movw r2, #57360 ; 0xe010
12a: f2ce 0200 movt r2, #57344 ; 0xe000
12e: f041 61bf orr.w r1, r1, #100139008 ; 0x5f80000
132: f24a 207f movw r0, #41599 ; 0xa27f
136: f441 3601 orr.w r6, r1, #132096 ; 0x20400
13a: f2c0 0019 movt r0, #25
13e: 25f0 movs r5, #240 ; 0xf0
140: 2400 movs r4, #0
142: 2107 movs r1, #7
144: 60de str r6, [r3, #12]
146: 6050 str r0, [r2, #4]
148: f883 5023 strb.w r5, [r3, #35] ; 0x23
14c: 6094 str r4, [r2, #8]
14e: 6011 str r1, [r2, #0]
150: b662 cpsie i
152: f44f 42e0 mov.w r2, #28672 ; 0x7000
156: f2c4 0200 movt r2, #16384 ; 0x4000
15a: f44f 5360 mov.w r3, #14336 ; 0x3800
15e: 6811 ldr r1, [r2, #0]
160: f2c4 0302 movt r3, #16386 ; 0x4002
164: f041 01f0 orr.w r1, r1, #240 ; 0xf0
168: 6011 str r1, [r2, #0]
16a: 6b1a ldr r2, [r3, #48] ; 0x30
16c: f042 021f orr.w r2, r2, #31
170: 631a str r2, [r3, #48] ; 0x30
172: 6b1a ldr r2, [r3, #48] ; 0x30
174: f442 1280 orr.w r2, r2, #1048576 ; 0x100000
178: 631a str r2, [r3, #48] ; 0x30
17a: f7ff fffe bl 0 <halMain>
17e: f3bf 8f4f dsb sy
182: f44f 426d mov.w r2, #60672 ; 0xed00
186: f2ce 0200 movt r2, #57344 ; 0xe000
18a: 2304 movs r3, #4
18c: 68d1 ldr r1, [r2, #12]
18e: f2c0 53fa movt r3, #1530 ; 0x5fa
192: f401 61e0 and.w r1, r1, #1792 ; 0x700
196: 430b orrs r3, r1
198: 60d3 str r3, [r2, #12]
19a: f3bf 8f4f dsb sy
19e: e7fe b.n 19e <halEntry+0x17e>
Clang:
00000028 <halEntry>:
28: e92d 4890 stmdb sp!, {r4, r7, fp, lr}
2c: f643 0100 movw r1, #14336 ; 0x3800
30: 2200 movs r2, #0
32: f64f 74ff movw r4, #65535 ; 0xffff
36: af01 add r7, sp, #4
38: f2c4 0102 movt r1, #16386 ; 0x4002
3c: f6cf 64f2 movt r4, #65266 ; 0xfef2
40: 6808 ldr r0, [r1, #0]
42: f040 0001 orr.w r0, r0, #1
46: 6008 str r0, [r1, #0]
48: f643 0008 movw r0, #14344 ; 0x3808
4c: f2c4 0002 movt r0, #16386 ; 0x4002
50: 6002 str r2, [r0, #0]
52: 680b ldr r3, [r1, #0]
54: 4023 ands r3, r4
56: 600b str r3, [r1, #0]
58: f643 030c movw r3, #14348 ; 0x380c
5c: f2c4 0302 movt r3, #16386 ; 0x4002
60: 601a str r2, [r3, #0]
62: 680a ldr r2, [r1, #0]
64: f442 3280 orr.w r2, r2, #65536 ; 0x10000
68: 600a str r2, [r1, #0]
6a: 2201 movs r2, #1
6c: 680b ldr r3, [r1, #0]
6e: 2400 movs r4, #0
70: f413 3300 ands.w r3, r3, #131072 ; 0x20000
74: bf08 it eq
76: 2401 moveq r4, #1
78: f5b2 4fa0 cmp.w r2, #20480 ; 0x5000
7c: da02 bge.n 84 <halEntry+0x5c>
7e: 3201 adds r2, #1
80: 2c00 cmp r4, #0
82: d1f3 bne.n 6c <halEntry+0x44>
84: 2b00 cmp r3, #0
86: d03f beq.n 108 <halEntry+0xe0>
88: f643 0240 movw r2, #14400 ; 0x3840
8c: f2c4 0202 movt r2, #16386 ; 0x4002
90: 6813 ldr r3, [r2, #0]
92: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000
96: 6013 str r3, [r2, #0]
98: f247 0200 movw r2, #28672 ; 0x7000
9c: f2c4 0200 movt r2, #16384 ; 0x4000
a0: 6813 ldr r3, [r2, #0]
a2: f443 4340 orr.w r3, r3, #49152 ; 0xc000
a6: 6013 str r3, [r2, #0]
a8: f240 330f movw r3, #783 ; 0x30f
ac: 6802 ldr r2, [r0, #0]
ae: f6cf 73ff movt r3, #65535 ; 0xffff
b2: 401a ands r2, r3
b4: f642 2304 movw r3, #10756 ; 0x2a04
b8: 6002 str r2, [r0, #0]
ba: f2c0 7340 movt r3, #1856 ; 0x740
be: 6802 ldr r2, [r0, #0]
c0: f442 4214 orr.w r2, r2, #37888 ; 0x9400
c4: 6002 str r2, [r0, #0]
c6: f643 0204 movw r2, #14340 ; 0x3804
ca: f2c4 0202 movt r2, #16386 ; 0x4002
ce: 6013 str r3, [r2, #0]
d0: 680a ldr r2, [r1, #0]
d2: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000
d6: 600a str r2, [r1, #0]
d8: 680a ldr r2, [r1, #0]
da: f012 7f00 tst.w r2, #33554432 ; 0x2000000
de: d0fb beq.n d8 <halEntry+0xb0>
e0: f643 4100 movw r1, #15360 ; 0x3c00
e4: f240 7205 movw r2, #1797 ; 0x705
e8: f2c4 0102 movt r1, #16386 ; 0x4002
ec: 600a str r2, [r1, #0]
ee: 6801 ldr r1, [r0, #0]
f0: f021 0103 bic.w r1, r1, #3
f4: 6001 str r1, [r0, #0]
f6: 6801 ldr r1, [r0, #0]
f8: f041 0102 orr.w r1, r1, #2
fc: 6001 str r1, [r0, #0]
fe: 6801 ldr r1, [r0, #0]
100: f001 010c and.w r1, r1, #12
104: 2908 cmp r1, #8
106: d1fa bne.n fe <halEntry+0xd6>
108: f64e 5088 movw r0, #60808 ; 0xed88
10c: f64e 540c movw r4, #60684 ; 0xed0c
110: f2ce 0000 movt r0, #57344 ; 0xe000
114: f2ce 0400 movt r4, #57344 ; 0xe000
118: 6801 ldr r1, [r0, #0]
11a: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000
11e: 6001 str r1, [r0, #0]
120: f64e 5008 movw r0, #60680 ; 0xed08
124: f240 0100 movw r1, #0
128: f3bf 8f4f dsb sy
12c: f3bf 8f6f isb sy
130: f2ce 0000 movt r0, #57344 ; 0xe000
134: f2c0 0100 movt r1, #0
138: 6001 str r1, [r0, #0]
13a: f64f 01ff movw r1, #63743 ; 0xf8ff
13e: 6820 ldr r0, [r4, #0]
140: 4008 ands r0, r1
142: f24a 217f movw r1, #41599 ; 0xa27f
146: f040 60bf orr.w r0, r0, #100139008 ; 0x5f80000
14a: f2c0 0119 movt r1, #25
14e: f440 3001 orr.w r0, r0, #132096 ; 0x20400
152: 6020 str r0, [r4, #0]
154: f24e 0014 movw r0, #57364 ; 0xe014
158: f2ce 0000 movt r0, #57344 ; 0xe000
15c: 6001 str r1, [r0, #0]
15e: f64e 5023 movw r0, #60707 ; 0xed23
162: 21f0 movs r1, #240 ; 0xf0
164: f2ce 0000 movt r0, #57344 ; 0xe000
168: 7001 strb r1, [r0, #0]
16a: f24e 0018 movw r0, #57368 ; 0xe018
16e: 2100 movs r1, #0
170: f2ce 0000 movt r0, #57344 ; 0xe000
174: 6001 str r1, [r0, #0]
176: f24e 0010 movw r0, #57360 ; 0xe010
17a: 2107 movs r1, #7
17c: f2ce 0000 movt r0, #57344 ; 0xe000
180: 6001 str r1, [r0, #0]
182: f247 0000 movw r0, #28672 ; 0x7000
186: b662 cpsie i
188: f2c4 0000 movt r0, #16384 ; 0x4000
18c: 6801 ldr r1, [r0, #0]
18e: f041 01f0 orr.w r1, r1, #240 ; 0xf0
192: 6001 str r1, [r0, #0]
194: f643 0030 movw r0, #14384 ; 0x3830
198: f2c4 0002 movt r0, #16386 ; 0x4002
19c: 6801 ldr r1, [r0, #0]
19e: f041 011f orr.w r1, r1, #31
1a2: 6001 str r1, [r0, #0]
1a4: 6801 ldr r1, [r0, #0]
1a6: f441 1180 orr.w r1, r1, #1048576 ; 0x100000
1aa: 6001 str r1, [r0, #0]
1ac: f7ff fffe bl 0 <halMain>
1b0: f3bf 8f4f dsb sy
1b4: 6820 ldr r0, [r4, #0]
1b6: 2104 movs r1, #4
1b8: f2c0 51fa movt r1, #1530 ; 0x5fa
1bc: f400 60e0 and.w r0, r0, #1792 ; 0x700
1c0: 4308 orrs r0, r1
1c2: 6020 str r0, [r4, #0]
1c4: f3bf 8f4f dsb sy
1c8: e7fe b.n 1c8 <halEntry+0x1a0>
1ca: bf00 nop
На первый взгляд у шланга все плохо, все ldr/std с нулевым смещением и код длиннее, со стеком какие-то попытки идут. У GCC тоже странности есть, r3 заполняется дважды хотя не был испорчен. Настройки компиляции остались прежние, -mcpu=cortex-m4 -mthumb -O2.
- 0
- 09 июня 2014, 20:54
- amaora
- 1
Файлы в топике:
hal.c.gz
Думаю народ хотел бы более широких тестов на реальных проектах. Но спасибо даже и за это, парочка моих знакомых, недолюбливающих gcc уже тестирует новинку.
- count_enable
- 10 июня 2014, 13:05
- ↓
Делать тесты на коде записи в регистры думаю смысла нет,Очень, очень даже есть.
Особенно интересно глянують на оптимизацию использования SPL и записи в 10 регистров. GCC не всегда додумывается грузить общий адрес, а потом писать со смещением.
Комментарии (14)
RSS свернуть / развернуть