// UtilDP.bcpl
// Copyright Xerox Corporation 1979
external [
//the exported procedures
SetUpDP
AssignDP
NegateDP
DoubleLShift
DoubleRShift
DoubleSubtract
DoubleUsc
//from the OS
DoubleAdd
Usc
CallSwat
]
external [
zeroDP; oneDP; minusOneDP
]
static [
zeroDP; oneDP; minusOneDP
]
let SetUpDP(sixFreeWords) be
[
sixFreeWords!0=0; sixFreeWords!1=0
zeroDP=sixFreeWords
sixFreeWords!2=0; sixFreeWords!3=1
oneDP=sixFreeWords+2
sixFreeWords!4=-1; sixFreeWords!5=-1
minusOneDP=sixFreeWords+4
]
and AssignDP(new, old) be
[
new!0 = old!0
new!1 = old!1
]
and NegateDP(new, old) be
[
new!0 = not old!0
new!1 = not old!1
DoubleAdd(new, oneDP)
]
and DoubleSubtract(minuend, subtrahend) be
[
let temp = vec 1
NegateDP(temp, subtrahend)
DoubleAdd(minuend, temp)
]
and DoubleLShift(dest, src, amt) be
switchon amt into
[
case 0 to 15:
dest!0 = (src!0 lshift amt)%(src!1 rshift (16-amt))
dest!1 = src!1 lshift amt
return
case 16 to 31:
dest!0 = src!1 lshift (amt-16)
dest!1 = 0
return
default:
CallSwat("DoubleLShift called with funny amount.")
]
and DoubleRShift(dest, src, amt) be
switchon amt into
[
case 0 to 15:
dest!1 = (src!1 rshift amt)%(src!0 lshift (16-amt))
dest!0 = src!0 rshift amt
return
case 16 to 31:
dest!1 = src!0 rshift (amt-16)
dest!0 = 0
return
default:
CallSwat("DoubleRShift called with funny amount.")
]
and DoubleUsc(a, b) =
selecton Usc(a!0, b!0) into
[
case -1: -1
case 1: 1
case 0: Usc(a!1, b!1)
]