hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
void TemplateTable::lrem() {
{- -------------------------------------------
(1) (assert) (See: TemplateTable::transition())
---------------------------------------- -}
transition(ltos, ltos);
{- -------------------------------------------
(1) コード生成:
「dividend を O2 レジスタにロード」
---------------------------------------- -}
// check for zero
__ pop_l(O2);
{- -------------------------------------------
(1) コード生成:
「divisor(Otos_i)が 0 かどうかを確認する.
0 の場合は ArithmeticException (See: [here](no3059cDE.html) for details).
そうでなければ, 以下のどちらかを行うことで剰余計算を実施.
* 64bit の場合
X mod Y = X - (X/Y)*Y なので, その通りに計算.
* 32bit の場合
SharedRuntime::lrem() を呼び出す 」
---------------------------------------- -}
#ifdef _LP64
__ tst(Otos_l);
__ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
__ sdivx(O2, Otos_l, Otos_l2);
__ mulx (Otos_l2, Otos_l, Otos_l2);
__ sub (O2, Otos_l2, Otos_l);
#else
__ orcc(Otos_l1, Otos_l2, G0);
__ throw_if_not_icc(Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
__ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lrem));
#endif
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.