Как стать автором
Обновить
0
0
8086 @8086

Пользователь

Отправить сообщение
Идея для хобби-проектов хорошая и давно используемая, например.
Туда же можно загнать то, чего нет в 181-х алу: сдвиги, ротации, какие-нибудь полезные таблицы.
Правда, когда делаешь 8-битное, придётся разбивать на 4-хбитных
(ибо иначе нужны уже многомегабайтные E(E)PROMы)
и их сопряжение для нетривиальных функций тоже нетривиально.
Скажем, сдвиг на один бит — просто, а на несколько — сложно.
Кстати, в по кр. мере одной машине IBM (1620) не было АЛУ, только таблицы в памяти!
(гуглить по слову CADET — Can't Add Don't Even Try).
Начиная с Пентиум Про есть команда условного перемещения — cmov.
если компилятор тупит и не хочет её генерировать для конструкций вида
a=a<b?a:b;
то можно ему
подсказать:
static inline int f4(int a, int b)
    {
    int _a=-a;
    _a=_a<0?a:_a;
    int _b=-b;
    _b=_b<0?b:_b;
    _a=_a<_b?_a:_b;
    int _c=-_a;
    _c=(a^b)<0?_c:_a;
    return _c;
    }

Сгенерируется красивый код без ветвлений:
примерно такой
//eax==a, edx==b
mov ebx, eax
neg ebx
cmovs ebx, eax
mov ecx, edx
neg ecx
cmovs ecx, edx
cmp ebx, edx
cmovg ebx, edx
mov edx, ebx
neg edx
xor eax, ebx
cmovs ebx, edx
//ebx <- ответ

Но он не сильно быстрее вашего варианта (cmov довольно медленно выполняется).

А вот этот заметно быстрее
static inline int f5(int a, int b)
    {
    int s,_a,_b,n[2];
    _a=(a>>31)&0xFFFFFFFE;
    _b=(b>>31)&0xFFFFFFFE;
    s=(_a^_b)+1;
    a*=(_a)+1;
    b*=(_b)+1;
    n[0]=b;
    n[1]=a;
    return s*n[a<b];
    }
Нет конечно.
Но 1.3 пришёл в составе системы, так что владелец был как раз из фанатов Интела наверное.
На техпроцессе 180 нм Коппермайны не могли работать на частотах выше тех самых ~1.1-1.2.
Появившиеся было Coppermine 1.13 были отозваны Интелом из-за нестабильной работы.
Большая коллекционная редкость эти копперы на 1.13 =)
А архитектура P4 позволяла достичь на тех же самых 180 нм двух гигагерц (это их не очень спасало, конечно).
И только с переходом на 130 нм летом 2001 года стали возможны туалатины, легко работавшие на 1.4Ггц.
Под азотом достижимы 2+ ГГц.
Вот именно с переходом на более тонкий техпроцесс Интел задержала выход туалатинов,
раньше 2001 года дальнейший рост частот PIII был невозможен.
Ну, редкими они не были.
У меня есть на 1.3 и 1.4
P3-450 от P2-450 отличался только наличием команд SSE,
да и то они были реализованы в условиях жестокой нехватки места на кристалле.
Пришлось идти на компромиссы, в частности, именно поэтому нельзя было использовать
регистры fpu и sse одновременно, это были физически одни и те же регистры.
А вот P4 от старших P3 в смысле архитектуры отличается кардинально.
Начиная с 75-го тепловыделение перестало быть такой проблемой,
от металлической крышки на керамике быстро отказались.
Десктопные — от 166, мобильные были ещё 120, 133, 150.
Некоторые исправления:
Первые пентиумы (P5) работали без множителя, на частоте шины, 60 и 66 МГц.
fdiv баг был из-за того, что в lookup-таблице, использующейся при делении,
были не заполнены (содержали нули вместо нужных значений) несколько записей.
Этим грешили не все ревизии даже самых ранних пентиумов.
Баг был далеко не настолько серьёзен, его обнаружили более чем через полтора года после выхода камней.
Он проявлялся только для определённых (и очень малых из общего числа) аргументов,
приводя к ошибке при делении в худшем случае в 4-м разряде.
Такие экземпляры сейчас весьма ценятся у коллекционеров.
У P5(60-66 МГц) было много проблем с тепловыделением, первые экземпляры были полностью керамические,
перегревались, была добавлена металлическая крышка.
Скорость для целочисленных операций была не намного выше, чем для гораздо более дешёвого 486-го.
Но уже с выходом P5C(75-100 МГц) удалось решить большинство проблем,
пентиум пошёл в массы и начал приносить огромные прибыли,
особенно с переходом на 350 нм (P5CS) и достижением частоты 200 МГц,
появлением MMX (P55C, до 233 МГц настольные, до 300 МГц мобильные).
Именно на волне успеха первого следующее поколение было названо Pentium II.
С выходом P6 ничего на рынке кардинально не изменилось.
Продолжилась конкуренция с АМД в лице K6-2/3.
Первые PIII с внешним кешем (Katmai) кроме добавления SSE ничем не отличались от PII.
Затем, когда кеш переместился в ядро скорость заметно возросла, это да.
Но уже с появлением первых Athlon-ов, тогда ещё слотовых, позиции PIII резко пошатнулись,
при равных частотах Атлон в среднем выигрывал, особенно в играх.
Про netburst — это уже отдельная история…
Пофиксил, и теперь
163
#include<iostream>
char p[1<<30];long long n,s,i=1,j;int main(){std::cin>>n;for(;++i<4e4;)if(j=!p[i])for(;++j*i<=n;)p[j*i]=1;for(;n;)s+=!p[n]*n--;std::cout<<s-1;}

Я не очень знаю Си, вроде бы s+=!p[n]*n--; — это не случай неопределённого поведения, и всё ок т.к. приоритет [] выше, чем --?
164
#include<iostream>
char p[1<<30];long long n,s,i=1,j;int main(){std::cin>>n;for(;++i<4e4;)if(j=!p[i])for(;j++*i<=n;)p[j*i]=1;for(;n-->2;)s+=p[n]?0:n;std::cout<<s;}
Решение в 165 байт, по времени укладывается.
Можно сэкономить 4 байта, пожертвовав 7-ю гигабайтами.

#include<iostream>
char p[1<<30];long long n,s,i=1,j;int main(){std::cin>>n;for(;++i<4e4;)if(!p[i])for(j=i*i;j<=n;j+=i)p[j]=1;for(;n-->2;)s+=p[n]?0:n;std::cout<<s;}
Оффтопик: t-фрактал на ассемблере размерном в 32 байта, написал под влиянием упомянутой статьи.
fsqrt.blogspot.com/2012/07/32b-t.html
0 <= r,g,b <= 63, более старшие биты не используются.
Во второй процедуре int 10h — лишнее.
Эх.
Надо писать crinkler для никсов, с поддержкой максимального стрипа хидеров заодно.
Вот это будет серьёзно.
Тогда можно будет конкурентоспособные 1к, 4к делать.
Это я от Форта не отошёл пока =)
fsqrt.blogspot.com/2012/02/256b-mbps.html
Можно, конечно.
Но выглядеть и звучать будет жутко.
Да и одновременное наличие dsp и fb*
ещё менее вероятно, так что я забил.
Я тоже недавно мучал эльфов,
в некоторых случаях можно запихать
программный хидер в эльфовый.
В формате 128 байт осталось место
и для графики, выводимой через фреймбуфер:
fsqrt.blogspot.com/2012/01/128b-lintro.html
Привет!
Спасибо!
Лучше всего — машина с Windows XP, в ней делаю финальное тестирование и всё идёт быстро.
Многое тормозит в DosBOX, особенно в случаях чтения памяти (особенно нижних сегментов) и операциях fpu. Он в некоторых случаях может быть тормознее XP в десятки раз даже с максимальными настройками на скорость.
Насчёт плазмы — неплохую можно сделать в 54 байта или даже поменьше.
Так что пишите всё на асме и не жалейте времени на оптимизацию =)

ПС Осваиваю псевдо-воксели, сегодня вечером выложу кое-что на 128б.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность