演算機能の使用方法
単精度整数演算
表 4-5に示すコマンドは、単精度整数演算を行います。
表 4-5 単精度演算機能
コマンド
|
スタックダイアグラム
|
説明
|
+ |
( nu1 nu2 -- sum )
|
nu1 + nu2 の加算を行います。
|
- |
( nu1 nu2 -- diff )
|
nu1 - nu2 の減算を行います。
|
* |
( nu1 nu2 -- prod )
|
nu1 * nu2 の乗算を行います。
|
*/ |
( n1 n2 n3 -- quot )
|
nu1 * nu2 / n3 を計算します。入力、出力、中間値はすべて 1 つのセルに入ります。
|
/ |
( n1 n2 -- quot )
|
n1 を n2 で割ります。剰余は捨てられます。
|
1+ |
( nu1 -- nu2 )
|
1 を足します。
|
1- |
( nu1 -- nu2 )
|
1 を引きます。
|
2+ |
( nu1 -- nu2 )
|
2 を足します。
|
2- |
( nu1 -- nu2 )
|
2 を引きます。
|
abs |
( n -- u )
|
絶対値。
|
bounds |
( start len -- len+start start )
|
do または ?do ループ用に start、len を end、start に変換します。
|
even |
( n -- n | n+1 )
|
最も近い偶数の整数 >= n に丸めます。
|
max |
( n1 n2 -- n3 )
|
n1 と n2 の大きいほうの値を n3 とします。
|
min |
( n1 n2 -- n3 )
|
n1 と n2 の小さいほうの値を n3 とします。
|
mod |
( n1 n2 -- rem )
|
n1 / n2 の剰余を計算します。
|
*/mod |
( n1 n2 n3 -- rem quot )
|
n1 * n2 / n3 の剰余と商。
|
/mod |
( n1 n2 -- rem quot )
|
n1 / n2 の剰余と商。
|
negate |
( n1 -- n2 )
|
n1 の符号を変更します。
|
u* |
(u1 u2 -- uprod )
|
符号なしの 2 つの数値を乗算し、符号なしの積を生じます。
|
u/mod |
( u1 u2 -- urem uquot )
|
符号なし 1 セル数値を符号なし 1 セル数値で割り、 1 セルの剰余と商を生じます。
|
<< |
( x1 u -- x2 )
|
lshift の同義語。
|
>> |
( x1 u -- x2 )
|
rshift の同義語。
|
2* |
( x1 -- x2 )
|
2 を掛けます。
|
2/ |
( x1 -- x2 )
|
2 で割ります。
|
>>a |
( x1 u -- x2 )
|
x1 を u ビット 右に算術シフトします。
|
and |
( x1 x2 -- x3 )
|
ビット単位の論理積。
|
invert |
( x1 -- x2 )
|
x1 の全ビットを反転します。
|
lshift |
( x1 u -- x2 )
|
x1 を u ビット左シフトし、下位ビットにゼロを埋め込みます。
|
not |
( x1 -- x2 )
|
invert の同義語。
|
or |
( x1 x2 -- x3 )
|
ビット単位の論理和。
|
rshift |
( x1 u -- x2 )
|
x1 を u ビット右シフトし、上位ビットにゼロを埋め込みます。
|
u2/ |
( x1 -- x2 )
|
1 ビット右へ論理シフトし、上位ビットにゼロをシフトします。
|
xor |
( x1 x2 -- x3 )
|
ビット単位排他的論理和。
|
倍精度数演算
表 4-6に示すコマンドは倍精度数の演算を行います。
表 4-6 倍精度数演算機能
コマンド
|
スタックダイアグラム
|
説明
|
d+ |
( d1 d2 -- d.sum )
|
d1 を d2 に足し、倍精度数 d.sum を生じます。
|
d- |
( d1 d2 --d.diff )
|
d1 から d2 を引き、倍精度数 d.diff を生じます。
|
fm/mod |
( d n -- rem quot )
|
d を n で割ります。
|
m* |
( n1 n2 -- d )
|
符号付き乗算を行い、倍精度数の積を生じます。
|
s>d |
( n1 -- d1 )
|
数値を倍精度数に変換します。
|
sm/rem |
( d n -- rem quot )
|
d を n で割ります。対称除算。
|
um* |
( u1 u2 -- ud )
|
符号なし乗算を行い、符号なし倍精度数の積を生じます。
|
um/mod |
( ud u -- urem uprod )
|
ud を u で割ります。
|
データ型変換
表 4-7に示すコマンドはデータ型の変換を行います。
表 4-7 32 ビットデータ型変換機能
コマンド
|
スタックダイアグラム
|
説明
|
bljoin |
( b.low b2 b3 b.hi -- quad )
|
4 バイトを結合して quadlet (32 ビット) を作ります。
|
bwjoin |
( b.low b.hi -- word )
|
2 バイトを結合して doublet (16 ビット) を作ります。
|
lbflip |
( quad1 -- quad2 )
|
quadlet 内の 4 バイトを逆に並べ替えます。
|
lbsplit |
( quad -- b.low b2 b3 b.hi )
|
quadlet を 4 バイトに分割します。
|
lwflip |
( quad1 -- quad2 )
|
quadlet 内の 2 つの doublet をスワップします。
|
lwsplit |
( quad -- w.low w.hi )
|
quadlet を 2 つの doublet に分割します。
|
wbflip |
( word1 --
word2 )
|
doublet 内の 2 バイトをスワップします。
|
wbsplit |
( word -- b.low b.hi )
|
doublet を 2 バイトに分割します。
|
wljoin |
( w.low w.hi -- quad )
|
2 つの doublet を結合して quadlet を作ります。
|
表 4-8に示すデータ型変換用コマンドは 64 ビットの OpenBoot 実装専用です。
表 4-8 64 ビットデータ型変換機能
コマンド
|
スタックダイアグラム
|
説明
|
bxjoin
|
( b.lo b.2 b.3 b.4 b.5 b.6 b.7 b.hi -- o )
|
8 バイトを結合して
octlet を作ります。
|
lxjoin
|
( quad.lo quad.hi -- o )
|
2 つの quadlet を結合して octlet を作ります。
|
wxjoin
|
( w.lo w.2 w.3 w.hi -- o )
|
4 つの doublet を結合して octlet を作ります。
|
xbflip
|
( oct1 -- oct2 )
|
octlet 内の 8 バイトを逆に並べ替えます。
|
xbsplit
|
( o -- b.lo b.2 b.3 b.4 b.5 b.6 b.7 b.hi )
|
octlet を 8 バイトに分割します。
|
xlflip
|
( oct1 -- oct2 )
|
octlet 内の 2 つの quadlet をスワップします。各 quadlet 内の 4 バイトは逆に並べ替えられません。
|
xlsplit
|
( o -- quad.lo quad.hi )
|
octlet を 2 つの quadlet に分割します。
|
xwflip
|
( oct1 -- oct2 )
|
octlet 内の 4 つの doublet を逆に並べ替えます。各 doublet 内の 2 バイトは並べ替えられません。
|
xwsplit
|
( o -- w.lo w.2 w.3 w.hi )
|
octlet を 4 つの doublet に分割します。
|
アドレス演算
表 4-9に示すコマンドはアドレス演算を行います。
表 4-9 アドレス演算機能
コマンド
|
スタックダイアグラム
|
説明
|
aligned |
( n1 -- n1 | a-addr)
|
必要な場合、 n1 大きくして可変境界アドレスを生じます。
|
/c |
( -- n )
|
バイトのアドレス単位数 : 1。
|
/c* |
( nu1 -- nu2 )
|
chars の同義語。
|
ca+ |
( addr1 index -- addr2 )
|
addr1
を/c の値の index 倍増やします。
|
ca1+ |
( addr1 -- addr2 )
|
char+ の同義語。
|
cell+ |
( addr1 -- addr2 )
|
addr1 を /n の値だけ増やします。
|
cells |
( nu1 -- nu2 )
|
nu1 に /n の値を掛けます。
|
char+ |
( addr1 -- addr2 )
|
addr1 を /c の値だけ増やします。
|
chars |
( nu1 -- nu2 )
|
nu1 に /c の値を掛けます。
|
/l |
( -- n )
|
quadlet のアドレス単位数 : 通常 4。
|
/l* |
( nu1 -- nu2 )
|
nu1 に /l の値を掛けます。
|
la+ |
( addr1 index -- addr2 )
|
addr1 を /l の値の index 倍増やします。
|
la1+ |
( addr1 -- addr2 )
|
addr1 を /l の値だけ増やします。
|
/n |
( -- n )
|
セルのアドレス単位数。
|
/n* |
( nu1 -- nu2 )
|
cells の同義語。
|
na+ |
( addr1 index -- addr2 )
|
addr1 を /n の値 index 倍増やします。
|
na1+ |
( addr1 -- addr2 )
|
cell+ の同義語。
|
/w |
( -- n )
|
doublet のアドレス単位数 : 通常 2。
|
/w* |
( nu1 -- nu2 )
|
nu1 に /w の値を掛けます。
|
wa+ |
( addr1 index -- addr2 )
|
addr1 を /w の値の index 倍増やします。
|
wa1+ |
( addr1 -- addr2 )
|
addr1 を/w の値だけ増やします。
|
表 4-10に示すアドレス演算用コマンドは 64 ビットの OpenBoot 実装専用です。
表 4-10 64 ビットアドレス演算機能
コマンド
|
スタックダイアグラム
|
説明
|
/x |
( -- n )
|
octlet のアドレス単位数 : 通常 8。
|
/x* |
( nu1 -- nu2 )
|
nu1 に /x の値を掛けます。
|
xa+ |
( addr1 index -- addr2 )
|
addr1 を /x の値のindex 倍増やします。
|
xa1+ |
( addr1 -- addr2 )
|
addr1 を /x の値だけ増やします。
|