Привет!
Mon Apr 25 2005 16:01, Alexey Boyko wrote to Alexander Golov:
...
AB>>> Боюсь - упрется в скорость памяти. Расчет тактов для ARM-а AB>>> немного сложнее, вообще-то ни разу не считал.
AG>> А что, симулятором не проще ли?
AB> Hету.
AB>>> 6 ramcpy: AB>>> 11 0000 000052E3 cmp r2, #0 AB>>> 12 0004 0EF0A001 moveq pc, lr ; return if length==0 AB>>> 13 .L3: AB>>> 14 0008 0130D1E4 ldrb r3, [r1], #1 ; r3 := [r1++]; AB>>> 15 000c 0130C0E4 strb r3, [r0], #1 ; [r0++] := r3; AB>>> 16 0010 012052E2 subs r2, r2, #1 ; r2 := r2-1 AB>>> 17 0014 0EF0A001 moveq pc, lr ; return if all data AB>>> 18 0018 000000EA b .L3
AG>> Hу "b .L3" никак не может длиться один цикл.
AB> Hу может не один. Hо это переход безусловный, и выборка идет сразу по AB> адресу .L3. Вроде получается 2 такта. Hа первом такте команды еще AB> загружается следующий адрес, на втором - уже новый адрес. То есть, AB> выполняется, конечно за три такта (как и все команды ARM), но экономится AB> один такт на загрузке ldrb
Какая разница условный или нет, если условие -- часть любой команды ARM? Судя по описанию "B" всегда требует 3-х циклов, и её последний цикл не может совмещаться с первым циклом следующей команды, а вот третий цикл LDR, может.
...
AG>> т.е. если я правильно понимаю переход потянет на 5 циклов,
AB> У меня получается 3+2+1+1+2 = 9 тактов. (мог и ошибиться, запустить AB> сейчас не на чем. Если будет - постараюсь вспомнить и замерить.)
Мне кажется, что 2+2+1+1+3, но сумма та же.
...
AG>> можно из него выжать в предельном случае, LDM'ами или может ещё AG>> чем-то?
AB> Да. LDM-ами по многу - будет быстрее всего. AB> Самая быстрая memcpy будет из трех кусков состоять. AB> Сначала ldm/stm по где-то 48 байт. Потом, если осталось меньше 48 - ld/st AB> по 4 байта и потом уже по байту.
Значит 14 циклов на LDM, 13 на STM, SUBS + BNE -- 4, итого 48 байтов за 516 нс, или 10,7 нс/байт.
Александр Голов, Москва, snipped-for-privacy@mail.ru