[CALU] Re: [CALU]

  • From: Martin Elshuber <e9825286@xxxxxxxxxxxxxxxxxxxx>
  • To: calu-ss2010-tuwien@xxxxxxxxxxxxx
  • Date: Sun, 11 Apr 2010 19:32:24 +0200

Günther Wimpassinger wrote:
Hi Kollegas,

hab mir unsere ISA mal genauer angesehen.

Also die MULI(S) sind absout sinnfrei, denn wir können nur mit Zahlen 0..15 oder -8..7 multiplizieren. Bei diesen Konstanten läßt sich das immer mit 2-3 shift/sub/add Befehlen nachbauen (unsigned). Signed hab ich nicht extra geprüft, sollte jedoch genau so sein.

Für die vorzeichenlose Division gilt das Selbe wie bei der Multiplikaion mit Konstanten. Ausserdem benötigen * und / so viel Zeit, dass ein extra MovI nicht sonderlich auffällt.

Ich würde in beiden Blöcken das I streichen und Mul/Div zusammenführen. Dann untscheidet das "I" ob es sich um Mul oder Div handelt. Den gewonnenen Platz würde ich wohl mit LoadByte und LoadHalfWord ergänzen.

is ah recht.
eine weitere sinnvolle verwendung für den platz wären die shift ops. die haben nur ein 4 bit immediate
AND/OR/NOR/XOR mit derart kurzen Immediates (ersten 5 Bits) halte ich auch nicht besonders für sinnvoll. Ob die Einsparung etwas bringt, ist ein anderer Fall. Eine andere Möglichkeit wäre natürlich bei Immediate-Arithmetic-Instruction folgnedes Format zu wählen, wodurch unsere Immediates um 4 bit länger würden (Sinnvoll?):
<pred> OP reg,imm

Semantisch:
reg:=reg op imm
ist eine überlegung

Wie schon in einem vorigen E-Mail erwähnt brauchen wir lange, bis wir ein Register mit 32bit gefüllt haben, wenn wir den Wert nicht aus dem Datenspeicher holen können. Habe nichts unter 10 Instr. auf die Schnelle gefunden.

mit 9 hab ich eine

movi r1,bits 31..26
pushi bits 12..0
pushi bits 25..13
pop r2
shl r1,13
or r1,r1,r2
pop r2
shl r1,13
or r1,r1,r2


Wie führen wir Instruktionen unbedingt aus? Damit noch weitere Instruktionen ausgeführt werden, muss mindestens ein Pred-Regist auf 1 sein. D.h sobald alle Pred-Regs 0 sind, haben wir nur noch NOPs. D.h. nach einem Reset sind alle Pred-Regs auf 1.

man könnte auch ein predikat auf fixieren zb p15 oder p0
Meine Meinung: Der ASM-Programmierer/Compiler muss dafür sorgen, dass soetwas nicht passieren kann.

Wird unser INTR-Flag ein Teil des Pred-Regs? Wenn nicht, brauchen wir zusätzliche Befehle zum Setzen/Löschen von InterruptEnable.

Zu dem Scratchpad:
Da bin ich mir noch nicht ganz sicher, wie das funktionieren soll. Was passiert bei einem Sprung auf eine Adresse die nicht im Scratchpad ist? Was passiert, wenn die letzte "Zeile" Code aus dem Scratchpad ausgeführt wurde?

Zu deinem Beispiel:
(Annahme p15=1)

pred (a==0), p0<UU>, p1<iUU> (p15)  -- p0=(a==0);
pred (b==0), p2<UU>, p3<iUU> (p15)  -- p2=(b==0);
pred (a==a), p4<UU>, p5<iUU> (p15)  -- p4=1;
pred (c==0), p4<UU>, p5<iUU> (p2)   -- wenn p2 dann p4=(c==0)
                                   -- p4=(b==0 ? c==0 : p4)

S1 (p0)
S2 (p4)
S3 (p5)

sorry das geht nicht. Gegenbeispiel
zb a=b=c=0; es sollte nur S1 ausgeführt werden am ende ist aber p0=p4=1


     | (init)   | step 1| step 2| step 3| step 4
a b c | p0 p1 p2 | p0 p1 | p2 p3 | p4 p5 | p4 p5|
------+----------+-------+------+--------+------+
0 0 0 | x  x  x  | 1  0  | 1  0  | 1  0  | 1  0 |
0 0 1 | x  x  x  | 1  0  | 1  0  | 1  0  | 0  1 |
0 1 0 | x  x  x  | 1  0  | 0  1  | 1  0  | 0  0 |
0 1 1 | x  x  x  | 1  0  | 0  1  | 1  0  | 0  0 |
1 0 0 | x  x  x  | 0  1  | 1  0  | 1  0  | 1  0 |
1 0 1 | x  x  x  | 0  1  | 1  0  | 1  0  | 0  1 |
1 1 0 | x  x  x  | 0  1  | 0  1  | 1  0  | 0  0 |
1 1 1 | x  x  x  | 0  1  | 0  1  | 1  0  | 0  0 |

  • References:
    • [CALU]
      • From: Günther Wimpassinger

Other related posts: