Itanium2: double-Multiplikation mit vollen 104bits und Speichern in General Registern

Mitglied seit
11.04.2005
Beiträge
20
Renomée
0
Hallo,

mein Problem betrifft eigentlich eher Programmierung, aber da es sich sehr um den Itanium2 dreht, habe ich die Frage mal in diesem Unterforum eingestellt:

Habe zwei Floating-Point-Zahlen (double) a und b, die ich miteinander multipliziere und deren vollen Signifikanden (104bits) ich am Ende in zwei aufeinanderfolgenden General Registern speichern möchte.

Klar kann ich mit

x_high = a * b
x_low = a * b - x_high

die oberen 64 und die unteren 40bits bestimmen, und mit fcvt.fx und getf.sig die Signifikanden jeweils in General Register verschieben. Allerdings habe ich dann im ersten Register 64 bits und im zweiten 40 bits oder weniger, wobei ich jedoch nicht genau weiss, ob die Bits nahtlos aneinander anschliessen. Wenn das sichergestellt wäre, könnte ich ja die Bits im zweiten Register mit nem Shift um 20 bits nach links verschieben, und anschliessend per Shift-Right-Pair alle Bits wieder 20 bits nach rechts zu verschieben. Dann hätte ich den kompletten Signifikanden in zwei Registern. Ist der Ansatz von der Idee zumindest in Ordnung?

Oder gibt es eine Möglichkeit, direkt die 64 niedrigsten bits in x_low und die restlichen 40 bits in x_high zu speichern?

Ich hoffe, es ist ungefähr rausgekommen, was ich vorhabe. Wenn nicht, einfach fragen,.

Besten Dank für eure Hilfe
Heinzi
 
Geht es dir nur um die Signifikanden Bits?

Wenn ja müsste doch eine 64x64 => 128 bit integer multiplikation mit xma reichen. Die 'xma' nimmt die Signifikanden zweier FP Register (d.h. 64 bit mantisse) und multipliziert sie und addiert einen weiteren Wert. Je nach Form (xma.l/xma.lu/xma.h/xma.hu) arbeitet die Anweisung signed/unsigned und liefert entweder low oder high Part.

Wenn ich nicht voll daneben liege sollte sowas gehen:

xma.l fl,f0,fa,fb
xma.h fh,f0,fa,fb

fl = low part register (exponent = 0x1003e, mantisse = untere 64 bit der multiplikation)
fh = high part register (analog zu fl)
fa = register das double a enthält
fb = register das double b enthält

Details findest du in "Intel Itanium Architecture Software Developer's Manual -- Volume 3 Instruction Set Reference", Kapitel 2.2. Das findest du zum download bei Intel.

BTW. Wenn die viel high precision arithmetik machst könnte dieser Artikel auch noch interessant sein: P. Markstein, "A Fast Quad Precision Elementary Function Library for Itanium", Proc. Fifth Intl. Conf. on Real Numbers and Computing, pp. 5-12, Sep. 2003
 
Hallo,

sorry für die späte Rückmeldung. Lag die letzten Tage platt im Bett. Der XMA-Befehl scheint sehr gut das abzubilden, was ich eigentlich gesucht habe bzw. scheint einiges zu vereinfachen, was ich mir gedacht habe.
Herzlichen Dank für den Hinweis..

Gruss
Heinz
 
Zurück
Oben Unten