Сравниваю "безрегистровую" и регистровую архитектуры мелких софт-процессоров... Пример - работа с памятью:
//копирование массива
//while(src <= pmax) *dst++ = *src++;
//"безрегистровая" архитектура
//цикл: 3команды, 8тактов
//ofs = dst - src
loop: *src[ofs] = *src //4такта
src++ //2
loop(src <= pmax) //2
Код
//копирование массива
//while(src <= pmax) *dst++ = *src++;
//"безрегистровая" архитектура
//цикл: 3команды, 8тактов
//ofs = dst - src
loop: *src[ofs] = *src //4такта
src++ //2
loop(src <= pmax) //2
MSP430:
Код
loop1: mov.w @R12+, offset(R12) // 5 тактов, один из которых именно для
// mov можно исключить (зазря читается регистр
// назначения, так как mov выполняется так же как и
// add, sub, or, and, etc.)
// разве что размер ядра увеличится и частота упадёт
cmp.w R12, R13 // 1 такт
jnz loop1 // 2 такта, но в моей реализации - 1.
// mov можно исключить (зазря читается регистр
// назначения, так как mov выполняется так же как и
// add, sub, or, and, etc.)
// разве что размер ядра увеличится и частота упадёт
cmp.w R12, R13 // 1 такт
jnz loop1 // 2 такта, но в моей реализации - 1.
паритет. либо у MSP кода есть выигрыш в 1 такт (это если jnz за такт, как у меня)
что касается размера кода - четыре 16-ти разрядных слова. что опять же меньше чем три 32-х разрядных.
Цитата
//регистровое, "пустой магазин": 7команд, 7 тактов
r1 = b
r1 = *r1
r2 = c
r2 = *r2
r2 += r1
r1 = a
*r1 = r2
r1 = b
r1 = *r1
r2 = c
r2 = *r2
r2 += r1
r1 = a
*r1 = r2
что-то мне подсказывает, что такая архитектура, если её грамотно реализовать, без проблем заведётся на 100+ MHz. даже в чахлом спартане/циклоне.
кажется мне, что нужно серьёзно посравнивать архитектуры на разных подзадачках. и по размеру кода, и по растактовке и по сложности реализации. и что-то мне подсказывает, что древняя PDP11 будет ох как хороша.