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

Уже давно как clang умеет делать код для arm. Сегодня ковырялся с целочисленными операциями, смотрел на выход gcc, и вспомнил про шланг читая stackoverflow.

Вот такой простой тестовый исходник.

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

Комментарии (14)

RSS свернуть / развернуть
Я как-то затрудняюсь понять, а о чем собственно топик?
+3
  • avatar
  • Vga
  • 10 июня 2014, 03:55
clang экономит одну инструкцию в некоторых случаях?
0
Очевидно, о том, что не GCC единым жить можно, а шланга с его llvm бояться не стоит.
0
А чем оно, собственно, отличается и насколько развита поддержка армов в LLVM?
0
Вот это я и хотел бы тоже узнать.
0
Думаю народ хотел бы более широких тестов на реальных проектах. Но спасибо даже и за это, парочка моих знакомых, недолюбливающих gcc уже тестирует новинку.
0
Откуда clang брали? C CodeSourcery или vanilla?
0
Джентушный пакет, может быть патченный я не проверял, версии указаны, и они не самые новые.
0
Делать тесты на коде записи в регистры думаю смысла нет,
Очень, очень даже есть.
Особенно интересно глянують на оптимизацию использования SPL и записи в 10 регистров. GCC не всегда додумывается грузить общий адрес, а потом писать со смещением.
0
SPL не использую. Добавил тесты на коде инициализации. Оказалось плохо, а я надеялся найти компилятор к которому я не смогу придраться.
0
А как у шланга с инлайном/constexpr?
GCC опять на эти директивы по моим ощущениям вообще плюёт.
И код бы на C этих функций.
0
GCC опять на эти директивы по моим ощущениям вообще плюёт.
Почему плюёт? Если оптимизацию включить, то инлайнит, если можно.
0
Да GCC инлайнит по моим наблюдениям все, что можно, даже без явного указания. По новым стандартам плюсов не знаю, не работаю с ними.
0
в смысле «больших функций инициализации»
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.