The current Alpha chips don't provide hardware for integer | |
division. The C compiler expects the functions | |
__divqu: 64-bit unsigned long divide | |
__remqu: 64-bit unsigned long remainder | |
__divq/__remq: signed 64-bit | |
__divlu/__remlu: unsigned 32-bit | |
__divl/__reml: signed 32-bit | |
These are not normal C functions: instead of the normal calling | |
sequence, these expect their arguments in registers t10 and t11, and | |
return the result in t12 (aka pv). Register AT may be clobbered | |
(assembly temporary), anything else must be saved. | |
Furthermore, the return address is in t9 instead of ra. | |
Normal function Divide functions | |
--------------- ---------------- | |
v0 ($0) t12/pv ($27) | |
a0 ($16) t10 ($24) | |
a1 ($17) t11 ($25) | |
ra ($26) t9 ($23) | |