// Prozessor: MIPS
// Endianness: irrelevant
// Compiler: GNU-C oder ...
-// Parameter-Übergabe:
+// Parameter-Übergabe:
// o32: in Registern $4,$5,$6,$7, und auf dem Stack 16($sp),...
// n32: in Registern $4,$5,$6,$7,$8,$9,$10,$11, und auf dem Stack 4($sp),...
-// Rückgabewert: in Register $2
+// Rückgabewert: in Register $2
// Einstellungen: intCsize=32, intDsize=32.
-// Besonderheiten: Nach jedem Ladebefehl ein Wartetakt nötig, bevor der
+// Besonderheiten: Nach jedem Ladebefehl ein Wartetakt nötig, bevor der
// geholte Wert benutzt werden darf.
// Strictly speaking, the MIPS ABI (-32 or -n32) is independent from the CPU
DECLARE_FUNCTION(mulu32_)
.ent mulu32_ // Input in $4,$5, Output in $2,mulu32_high
mulu32_:
+#if __mips_isa_rev >= 6
+ mulu $2,$5,$4 // arg1 * arg2, lo
+ muhu $6,$5,$4 // arg1 * arg2, hi
+#else
multu $5,$4 // arg1 * arg2
mfhi $6 // hi
mflo $2 // lo
+#endif
sw $6,mulu32_high // hi abspeichern // Adressierung?? Deklaration??
j $31 // return
.end mulu32_