// 直交形式 [ IF <cond> ] SR = [ SR OR ] LSHIFT <dreg> <opt>; // 基本形式 [ IF <cond> ] SR = [ SR OR ] LSHIFT SI <opt>; // 即値形式 SR = [ SR OR ] LSHIFT <dreg> BY <imm> <opt>;
// 直交形式。シフト量はSEで与える SR = LSHIFT AX0 (HI); // SR1基準でシフト。結果は上書き。 SR = SR OR LSHIFT (HI); // SR1基準でシフト。結果はSRの内容とOR。 IF EQ SR = LSHIFT AX0 (HI); // 条件シフト。SR1基準でシフト。結果は上書き。 SR = LSHIFT AX0 (LO); // SR0基準でシフト。結果は上書き。 // 基本形式。シフト量はSEで与える SR = LSHIFT SI (HI); // SR1基準でシフト。結果は上書き。 SR = LSHIFT SI (LO); // SR0基準でシフト。結果は上書き。 // 即値形式 SR = LSHIFT AX0 by 3 (HI); // SR1基準で左に3ビット算術シフト。 SR = LSHIFT AX0 by -3 (HI); // SR1基準で右に3ビット算術シフト。
16ビット・オペランドを40ビットに0拡張し、SEレジスタの値の分だけシフトしてSRレジスタに格納します。シフト量はSEレジスタのほか即値で与えることもできます。また、SRレジスタへの格納は上書きのほかビット単位の論理和とすることもできます。
シフト量は正負の値を与えます。値が正のとき、シフトは左方向です。値が負のとき、シフトは右方向です。シフト量の絶対値は1より大きくてもかまいません。シフト量にかかわらず、命令は1サイクルで動作を完了します。
必須オプションの(HI)、(LO)はシフト時に基準となる位置を決めます。これによって倍精度シフトを簡単に行うことができます。以下にAX1:AX0に置かれている32ビット値を左に3ビットシフトするプログラムを示します。
// 倍精度算術シフト SR = LSHIFT AX0 BY 3(LO); // 下位ワードを0拡張してシフト後、上書き代入 SR = SR OR LSHIFT AX1 BY 3(HI); // 上位ワードを0拡張してシフト後、論理和
<dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, SI, AR, MR2, MR1, MR0, SR2, SR1, SR0 <opt> ::= (HI), (LO) <cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE