FPU.java

/**
 * Compile
 *         javac FPU.java
 *         javah FPU
 *
 * Execute
 *         setenv LD_LIBRARY_PATH .
 *         java FPU
 */
package org.mklab.cga.round;

import java.io.IOException;

import org.mklab.cga.platform.Library;
import org.mklab.cga.platform.Platform;


/**
 * C言語でかかれたCPUの丸めモードを変更する関数を Javaで呼び出せるようにしたクラス。
 * 
 */
public final class FPU {

  /**
   * コンストラクタ
   */
  private FPU() {
    //
  }

  /**
   * CPUの丸めモードを設定します。
   * 
   * @param mode 丸めモードを指定する値。
   */
  static native void setRoundMode(final int mode);

  /**
   * CPUの丸めモードを確認します。
   * 
   * @return 現在のCPUの丸めモードの値
   */
  static native int getRoundMode();

  /**
   * CPUの丸めモードを最近点への丸めに設定します。
   */
  public static final int ROUND_NEAR = 0;

  /**
   * CPUの丸めモードを下向の丸めに設定します。
   */
  public static final int ROUND_DOWN = 1;

  /**
   * CPUの丸めモードを上向きに設定します。
   */
  public static final int ROUND_UP = 2;

  /**
   * Describe constant <code>ROUND_ZERO</code> here.
   * 
   */
  public static final int ROUND_ZERO = 3;

  /**
   * Describe constant <code>ROUND_ERROR</code> here.
   * 
   */
  public static final int ROUND_ERROR = -1;

  static {
    final String libname = Platform.IS_JVM_32 ? "FPUNative" : "FPUNative64"; //$NON-NLS-1$ //$NON-NLS-2$
    try {
      Library.loadlibrary(libname);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * 指定されたCPUの丸めモードに設定します。
   * 
   * @param args CPUの設定丸めモードが入る配列
   */
  public static void main(final String[] args) {
    if (args.length == 1) {
      if (args[0].equals("near")) { //$NON-NLS-1$
        setRoundMode(ROUND_NEAR);
        System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
      } else if (args[0].equals("down")) { //$NON-NLS-1$
        setRoundMode(ROUND_DOWN);
        System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
      } else if (args[0].equals("up")) { //$NON-NLS-1$
        setRoundMode(ROUND_UP);
        System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
      } else if (args[0].equals("zero")) { //$NON-NLS-1$
        setRoundMode(ROUND_ZERO);
        System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
      } else if (args[0].equals("status")) { //$NON-NLS-1$
        System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
      }
    }
  }
}