- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
void *memcpy(void *__dest, __const void *__src, size_t __n)
{
int i = 0;
unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src;
for (i = __n >> 3; i > 0; i--) {
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
}
if (__n & 1 << 2) {
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
}
if (__n & 1 << 1) {
*d++ = *s++;
*d++ = *s++;
}
if (__n & 1)
*d++ = *s++;
return __dest;
}
TeaBag 30.04.2017 15:43 # −5
а ты говоришь линукс
gost 30.04.2017 16:33 # 0
TeaBag 30.04.2017 17:14 # −6
guestinh0 30.04.2017 16:48 # −7
bormand 30.04.2017 17:05 # −1
Не все ARM'ы умеют читать и писать невыровненные инты. Видимо, автор надеется на то, что гцц сам свернёт эти 8 копирований в одно большое, елси платформа умеет в невыровненный доступ.
guestinh0 30.04.2017 17:50 # −5
bormand 30.04.2017 18:11 # 0
j123123 30.04.2017 18:18 # −7
bormand 30.04.2017 18:20 # −2
З.Ы. Ну хотя, блоки в куче обычно выровнены. Так что хотя бы для них будет пошустрее копировать.
1024-- 30.04.2017 18:33 # +2
bormand 30.04.2017 18:38 # −2
Antervis 01.05.2017 07:26 # +1
j123123 01.05.2017 08:29 # −6
То тоже можно что-нибудь придумать, например читать uint32t_1, маской убрать четвертый байт, сдвинуть потом на 1 байт вправо (и сохраняем, этот байт нам потом понадобится) и записать в uint32t_3, после чего читаем uint32t_2, сдвигаем вправо на 8(сохранив опять-таки вытолкнутый байт), и тот старый байт что был сохранен на предыдущем этапе из uint32t_1 - мы его суем в старший байт этой хни, и потом записываем в uint32_4
bormand 01.05.2017 10:58 # −3
TeaBag 01.05.2017 12:25 # −6
Antervis 01.05.2017 12:55 # −1
А теперь дз: оптимизируем strlen
TeaBag 01.05.2017 13:04 # −13
barop 04.05.2017 03:32 # −7
bormand 30.04.2017 20:46 # −2
В uintptr_t всё-таки.
j123123 30.04.2017 20:48 # −5
bormand 30.04.2017 20:51 # −2
З.Ы. Хотя для этой задачи и uint8_t сойдёт.
barop 04.05.2017 03:26 # −7
Впрочем и там поинтер бывает и 32 и 16, забыл чтоли про дальние указатели?
guestinh0 30.04.2017 22:04 # −5
gost 01.05.2017 00:47 # +1
Dummy00001 01.05.2017 15:41 # 0
ключ находится в названии директории файла: "arm/boot".
это часть бутстрапа, и к самому ядру линуха имеет мало отношения.
похоже на компромис между размером кода и производительностью.
типы из free-electrons умееют бенчить. они достаточно хорошо известны в кругах встроенного линукс/арм.
TeaBag 01.05.2017 15:45 # −6
bormand 01.05.2017 21:27 # 0
Тогда не будет ли вся эта магия с анроллом стрельбой из пушки по тараканам? Стоит ли все это городить ради куска, который проживёт пару-тройку миллисекунд, настроит окружение и сгорит в атмосфере?
Dummy00001 01.05.2017 21:34 # 0
копирование распаковоного кернела длится 100-500мс на мелких системах. почему бы и не сэкономить несколько десятков миллисекунд, если это и не так сложно?
и что значит "городить" - раз написал, и будет работать годами. это не код на котором все будут спотыкаются, или в нем что-то будет ломатся.
TeaBag 01.05.2017 22:07 # −6
barop 04.05.2017 03:28 # −7
Dummy00001 04.05.2017 03:35 # 0
boot time на встроенных линух системах это проблема, и все что-то на эту тему предпринимают.
http://elinux.org/Boot_Time
guestinh0 04.05.2017 07:15 # −7
Dummy00001 04.05.2017 12:07 # −14
Antervis 30.04.2017 16:53 # 0
bormand 30.04.2017 17:00 # −2
Хоть бы скобочки расставили...
TeaBag 30.04.2017 17:14 # −6
TommyVercetti 02.05.2017 00:15 # 0
j123123 30.04.2017 17:48 # −5
bormand 30.04.2017 18:15 # −3
Линус запретил поди. Он же всегда выступал против агрессивных оптимизаций, которые ломают кривой код.
Antervis 30.04.2017 18:55 # 0
bormand 30.04.2017 18:58 # −1