On 10/15/2013 06:57 PM, Anders Magnusson wrote:
On 10/15/2013 02:11 PM, Bjarni Juliusson wrote:
Men det verkar hur som helst att slutsatserna är desamma: variabel instruktionslängd, autoinkrementerande adressering, komplicerade instruktioner istället för vanliga sekvenser...
Med viss modifikation, ja, komplicerade instruktioner kan lätt bli för överarbetade och därför för långa.
Ja jo, det som indikeras av de rapporter jag har läst är att det är bra med specialinstruktioner för call/ret, push/pop, kanske strängoperationer, även specialopkoder för instruktion + vanlig operand, typ inc, dec, clear. Däremot missar man ju målet att ersätta vanliga sekvenser med förkortningar om man gör förkortningen mer flexibel än sekvensen den ska ersätta och måste koda en massa extra operander och options som sen sällan används.
På en x86 skulle det vara typ: 1: lodsb stosb jz 1b
Ovanstående är 4 bytes.
Fast varken lods eller stos sätter väl flaggorna? Det var en till av sakerna forskningen visade: sätta flaggor är bra, sparar testinstruktioner. Om Intel hade låtit movs sätta flaggorna så hade man kunnat göra: 1: movsb jnz 1b Tre bytes. Hade de också haft en repnz som struntar i cx och tillåts innan movsb så hade det bara varit: repnz movsb Men då börjar det bli frågan om hur många specialfall man vill ha instruktioner för. Specialgrejer för att repetera en enda instruktion känns lite överdrivet. En liknande, mycket praktisk sak som 68000 har specialinstruktion för är dekrementera+testa+hoppa, vilket ju är nåt man gör jätteofta, så där lönar det sig nog.
Hm, det där är faktiskt rätt bra att ha i bakhuvudet. VAXen liksom Alphan har 16 register, men MIPSen har ju 32. Det är alltså onödigt många då...
Ja, och jag har en känsla av att jag har hört det förr: om registren är general-purpose så räcker 8 för det mesta, och 16 räcker så gott som alltid. MIPS16 har 8 GPR plus 2 specialregister (stackpekare, returadress), THUMB drar ner ARMs 16 register till 8.
Tänkte du köra Williamsminne för registren?
Ja, det ser ut så, förutom ackumulatorn. Jag inriktar mig mycket på minimalistisk hårdvara, för jag vet att jag aldrig kommer att orka bygga 16 register i flip-floppar, för det är jättetråkigt. Dessutom kostar det extra pengar som jag inte har, och tar en massa plats. Så efter att ha tittat på olika minnestekniker så bestämde jag mig för att pröva att bygga ett Williamsminne; dels för att antalet komponenter är väldigt litet, dels för att jag har ett lagom litet oscilloskoprör som bara ligger och skräpar, komplett med nätdelar, dels därför att det är så djävla roligt, dels för att det verkar görbart och inte är beroende på att man kan få tag på udda komponenter eller lyckas konstruera mekaniska delar, och dels för att liksom fira 1900-talet! Få saker är så bra representanter för 1900-talsteknologi som Williamsminne. :) Om det går bra bygger jag kanske ett större Williamsminne som primärminne. Har ett betydligt större rör liggande från en vektordisplay, det borde vara elektrostatisk avlänkning i det.
Själv har jag snöat in på kondensatorminnen för register. Jag tror det kan bli rätt bra :-) Det gäller bara att få till nåt bra refreshsystem, jag är inte helt klar med det än.
Det ska bli skoj att se!
Dessutom tror jag att jag har en bra ide hur man bygger latchar för pipelinesteg. För att kunna använda kombinatoriken under hela klockcykeln har man två flipflops, en ut och en in, som togglas emellan varje steg. För varje pipelinebit går det åt 3 ECC91, 2 EAA91, 2 EH90 och en 6AN6 (quad diode). Men jag är inte helt klar än, ritningar kommer snart :-)
Även det ser jag fram emot! Bjarni