Contents | Prev | Next | Index The JavaTM Virtual Machine Specification

A B C D F G I J L M N P R S T W

## f2d

Operation

Convert `float` to `double`

Format

 f2d

Forms

f2d = 141 (0x8d)

Operand Stack

..., value ..., result

Description

The value on the top of the operand stack must be of type `float`. It is popped from the operand stack and undergoes value set conversion (§3.8.3), resulting in value'. Then value' is converted to a `double` result. This result is pushed onto the operand stack.

Notes

Where an f2d instruction is FP-strict (§3.8.2) it performs a widening primitive conversion (§2.6.2). Because all values of the float value set (§3.3.2) are exactly representable by values of the double value set (§3.3.2), such a conversion is exact.

Where an f2d instruction is not FP-strict, the result of the conversion may be taken from the double-extended-exponent value set; it is not necessarily rounded to the nearest representable value in the double value set. However, if the operand value is taken from the float-extended-exponent value set and the target result is constrained to the double value set, rounding of value may be required.

## f2i

Operation

Convert `float` to `int`

Format

 f2i

Forms

f2i = 139 (0x8b)

Operand Stack

..., value ..., result

Description

The value on the top of the operand stack must be of type `float`. It is popped from the operand stack and undergoes value set conversion (§3.8.3), resulting in value'. Then value' is converted to an `int` result. This result is pushed onto the operand stack:

• If the value' is NaN, the result of the conversion is an `int` 0.

• Otherwise, if the value' is not an infinity, it is rounded to an integer value V, rounding towards zero using IEEE 754 round towards zero mode. If this integer value V can be represented as an `int`, then the result is the `int` value V.

• Otherwise, either the value' must be too small (a negative value of large magnitude or negative infinity), and the result is the smallest representable value of type `int`, or the value' must be too large (a positive value of large magnitude or positive infinity), and the result is the largest representable value of type `int`.

Notes

The f2i instruction performs a narrowing primitive conversion (§2.6.3). It may lose information about the overall magnitude of value' and may also lose precision.

## f2l

Operation

Convert `float` to `long`

Format

 f2l

Forms

f2l = 140 (0x8c)

Operand Stack

..., value ..., result

Description

The value on the top of the operand stack must be of type `float`. It is popped from the operand stack and undergoes value set conversion (§3.8.3), resulting in value'. Then value' is converted to a `long` result. This result is pushed onto the operand stack:

• If the value' is NaN, the result of the conversion is a `long` 0.

• Otherwise, if the value' is not an infinity, it is rounded to an integer value V, rounding towards zero using IEEE 754 round towards zero mode. If this integer value V can be represented as a `long`, then the result is the `long` value V.

• Otherwise, either the value' must be too small (a negative value of large magnitude or negative infinity), and the result is the smallest representable value of type `long`, or the value' must be too large (a positive value of large magnitude or positive infinity), and the result is the largest representable value of type `long`.

Notes

The f2l instruction performs a narrowing primitive conversion (§2.6.3). It may lose information about the overall magnitude of value' and may also lose precision.

Operation

Add `float`

Format

Forms

Operand Stack

..., value1, value2 ..., result

Description

Both value1 and value2 must be of type `float`. The values are popped from the operand stack and undergo value set conversion (§3.8.3), resulting in value1' and value2'. The `float` result is value1' + value2'. The result is pushed onto the operand stack.

The result of an fadd instruction is governed by the rules of IEEE arithmetic:

• If either value1' or value2' is NaN, the result is NaN.

• The sum of two infinities of opposite sign is NaN.

• The sum of two infinities of the same sign is the infinity of that sign.

• The sum of an infinity and any finite value is equal to the infinity.

• The sum of two zeroes of opposite sign is positive zero.

• The sum of two zeroes of the same sign is the zero of that sign.

• The sum of a zero and a nonzero finite value is equal to the nonzero value.

• The sum of two nonzero finite values of the same magnitude and opposite sign is positive zero.
• In the remaining cases, where neither operand is an infinity, a zero, or NaN and the values have the same sign or have different magnitudes, the sum is computed and rounded to the nearest representable value using IEEE 754 round to nearest mode. If the magnitude is too large to represent as a `float`, we say the operation overflows; the result is then an infinity of appropriate sign. If the magnitude is too small to represent as a `float`, we say the operation underflows; the result is then a zero of appropriate sign.
The Java virtual machine requires support of gradual underflow as defined by IEEE 754. Despite the fact that overflow, underflow, or loss of precision may occur, execution of an fadd instruction never throws a runtime exception.

Operation

Load `float` from array

Format

Forms

Operand Stack

..., arrayref, index ..., value

Description

The arrayref must be of type `reference` and must refer to an array whose components are of type `float`. The index must be of type `int`. Both arrayref and index are popped from the operand stack. The `float` value in the component of the array at index is retrieved and pushed onto the operand stack.

Runtime Exceptions

If arrayref is `null`, faload throws a `NullPointerException`.

Otherwise, if index is not within the bounds of the array referenced by arrayref, the faload instruction throws an `ArrayIndexOutOfBoundsException`.

## fastore

Operation

Store into `float` array

Format

 fastore

Forms

fastore = 81 (0x51)

Operand Stack

..., arrayref, index, value ...

Description

The arrayref must be of type `reference` and must refer to an array whose components are of type `float`. The index must be of type `int`, and the value must be of type `float`. The arrayref, index, and value are popped from the operand stack. The `float` value undergoes value set conversion (§3.8.3), resulting in value', and value' is stored as the component of the array indexed by index.

Runtime Exceptions

If arrayref is `null`, fastore throws a `NullPointerException`.

Otherwise, if index is not within the bounds of the array referenced by arrayref, the fastore instruction throws an `ArrayIndexOutOfBoundsException`.

## fcmp<op>

Operation

Compare `float`

Format

 fcmp

Forms

fcmpg = 150 (0x96) fcmpl = 149 (0x95)

Operand Stack

..., value1, value2 ..., result

Description

Both value1 and value2 must be of type `float`. The values are popped from the operand stack and undergo value set conversion (§3.8.3), resulting in value1' and value2'. A floating-point comparison is performed:

• If value1' is greater than value2', the `int` value 1 is pushed onto the operand stack.

• Otherwise, if value1' is equal to value2', the `int` value 0 is pushed onto the operand stack.

• Otherwise, if value1' is less than value2', the `int` value -1 is pushed onto the operand stack.

• Otherwise, at least one of value1' or value2' is NaN. The fcmpg instruction pushes the `int` value 1 onto the operand stack and the fcmpl instruction pushes the `int` value -1 onto the operand stack.

Floating-point comparison is performed in accordance with IEEE 754. All values other than NaN are ordered, with negative infinity less than all finite values and positive infinity greater than all finite values. Positive zero and negative zero are considered equal.

Notes

The fcmpg and fcmpl instructions differ only in their treatment of a comparison involving NaN. NaN is unordered, so any `float` comparison fails if either or both of its operands are NaN. With both fcmpg and fcmpl available, any `float` comparison may be compiled to push the same result onto the operand stack whether the comparison fails on non-NaN values or fails because it encountered a NaN. For more information, see Section 7.5, "More Control Examples."

## fconst_<f>

Operation

Push `float`

Format

 fconst_

Forms

fconst_0 = 11 (0xb) fconst_1 = 12 (0xc) fconst_2 = 13 (0xd)

Operand Stack

... ..., <f>

Description

Push the `float` constant <f> (0.0, 1.0, or 2.0) onto the operand stack.

## fdiv

Operation

Divide `float`

Format

 fdiv

Forms

fdiv = 110 (0x6e)

Operand Stack

..., value1, value2 ..., result

Description

Both value1 and value2 must be of type `float`. The values are popped from the operand stack and undergo value set conversion (§3.8.3), resulting in value1' and value2'. The `float` result is value1' / value2'. The result is pushed onto the operand stack.

The result of an fdiv instruction is governed by the rules of IEEE arithmetic:

• If either value1' or value2' is NaN, the result is NaN.

• If neither value1' nor value2' is NaN, the sign of the result is positive if both values have the same sign, negative if the values have different signs.

• Division of an infinity by an infinity results in NaN.

• Division of an infinity by a finite value results in a signed infinity, with the sign-producing rule just given.

• Division of a finite value by an infinity results in a signed zero, with the sign-producing rule just given.

• Division of a zero by a zero results in NaN; division of zero by any other finite value results in a signed zero, with the sign-producing rule just given.

• Division of a nonzero finite value by a zero results in a signed infinity, with the sign-producing rule just given.
• In the remaining cases, where neither operand is an infinity, a zero, or NaN, the quotient is computed and rounded to the nearest `float` using IEEE 754 round to nearest mode. If the magnitude is too large to represent as a `float`, we say the operation overflows; the result is then an infinity of appropriate sign. If the magnitude is too small to represent as a `float`, we say the operation underflows; the result is then a zero of appropriate sign.
The Java virtual machine requires support of gradual underflow as defined by IEEE 754. Despite the fact that overflow, underflow, division by zero, or loss of precision may occur, execution of an fdiv instruction never throws a runtime exception.

Operation

Load `float` from local variable

Format

Forms

Operand Stack

... ..., value

Description

The index is an unsigned byte that must be an index into the local variable array of the current frame (§3.6). The local variable at index must contain a `float`. The value of the local variable at index is pushed onto the operand stack.

Notes

The fload opcode can be used in conjunction with the wide instruction to access a local variable using a two-byte unsigned index.

Operation

Load `float` from local variable

Format

Forms

Operand Stack

... ..., value

Description

The <n> must be an index into the local variable array of the current frame (§3.6). The local variable at <n> must contain a `float`. The value of the local variable at <n> is pushed onto the operand stack.

Notes

Each of the fload_<n> instructions is the same as fload with an index of <n>, except that the operand <n> is implicit.

## fmul

Operation

Multiply `float`

Format

 fmul

Forms

fmul = 106 (0x6a)

Operand Stack

..., value1, value2 ..., result

Description

Both value1 and value2 must be of type `float`. The values are popped from the operand stack and undergo value set conversion (§3.8.3), resulting in value1' and value2'. The `float` result is value1' * value2'. The result is pushed onto the operand stack.

The result of an fmul instruction is governed by the rules of IEEE arithmetic:

• If either value1' or value2' is NaN, the result is NaN.

• If neither value1' nor value2' is NaN, the sign of the result is positive if both values have the same sign, and negative if the values have different signs.

• Multiplication of an infinity by a zero results in NaN.

• Multiplication of an infinity by a finite value results in a signed infinity, with the sign-producing rule just given.

• In the remaining cases, where neither an infinity nor NaN is involved, the product is computed and rounded to the nearest representable value using IEEE 754 round to nearest mode. If the magnitude is too large to represent as a `float`, we say the operation overflows; the result is then an infinity of appropriate sign. If the magnitude is too small to represent as a `float`, we say the operation underflows; the result is then a zero of appropriate sign.
The Java virtual machine requires support of gradual underflow as defined by IEEE 754. Despite the fact that overflow, underflow, or loss of precision may occur, execution of an fmul instruction never throws a runtime exception.

## fneg

Operation

Negate `float`

Format

 fneg

Forms

fneg = 118 (0x76)

Operand Stack

..., value ..., result

Description

The value must be of type `float`. It is popped from the operand stack and undergoes value set conversion (§3.8.3), resulting in value'. The `float` result is the arithmetic negation of value'. This result is pushed onto the operand stack.

For `float` values, negation is not the same as subtraction from zero. If `x` is +`0.0`, then `0.0`-`x` equals +`0.0`, but -`x` equals -`0.0`. Unary minus merely inverts the sign of a `float`.

Special cases of interest:

• If the operand is NaN, the result is NaN (recall that NaN has no sign).

• If the operand is an infinity, the result is the infinity of opposite sign.

• If the operand is a zero, the result is the zero of opposite sign.

## frem

Operation

Remainder `float`

Format

 frem

Forms

frem = 114 (0x72)

Operand Stack

..., value1, value2 ..., result

Description

Both value1 and value2 must be of type `float`. The values are popped from the operand stack and undergo value set conversion (§3.8.3), resulting in value1' and value2'. The result is calculated and pushed onto the operand stack as a `float`.

The result of an frem instruction is not the same as that of the so-called remainder operation defined by IEEE 754. The IEEE 754 "remainder" operation computes the remainder from a rounding division, not a truncating division, and so its behavior is not analogous to that of the usual integer remainder operator. Instead, the Java virtual machine defines frem to behave in a manner analogous to that of the Java virtual machine integer remainder instructions (irem and lrem); this may be compared with the C library function `fmod`.

The result of an frem instruction is governed by these rules:

• If either value1' or value2' is NaN, the result is NaN.

• If neither value1' nor value2' is NaN, the sign of the result equals the sign of the dividend.

• If the dividend is an infinity or the divisor is a zero or both, the result is NaN.

• If the dividend is finite and the divisor is an infinity, the result equals the dividend.
• If the dividend is a zero and the divisor is finite, the result equals the dividend.

• In the remaining cases, where neither operand is an infinity, a zero, or NaN, the floating-point remainder result from a dividend value1' and a divisor value2' is defined by the mathematical relation result = value1' - (value2' * q), where q is an integer that is negative only if value1' / value2' is negative and positive only if value1' / value2' is positive, and whose magnitude is as large as possible without exceeding the magnitude of the true mathematical quotient of value1' and value2'.
Despite the fact that division by zero may occur, evaluation of an frem instruction never throws a runtime exception. Overflow, underflow, or loss of precision cannot occur.

Notes

The IEEE 754 remainder operation may be computed by the library routine `Math.IEEEremainder`.

## freturn

Operation

Return `float` from method

Format

 freturn

Forms

freturn = 174 (0xae)

Operand Stack

..., value [empty]

Description

The current method must have return type `float`. The value must be of type `float`. If the current method is a `synchronized` method, the monitor acquired or reentered on invocation of the method is released or exited (respectively) as if by execution of a monitorexit instruction. If no exception is thrown, value is popped from the operand stack of the current frame (§3.6) and undergoes value set conversion (§3.8.3), resulting in value'. The value' is pushed onto the operand stack of the frame of the invoker. Any other values on the operand stack of the current method are discarded.

The interpreter then returns control to the invoker of the method, reinstating the frame of the invoker.

Runtime Exceptions

If the current method is a `synchronized` method and the current thread is not the owner of the monitor acquired or reentered on invocation of the method, freturn throws an `IllegalMonitorStateException`. This can happen, for example, if a `synchronized` method contains a monitorexit instruction, but no monitorenter instruction, on the object on which the method is synchronized.

Otherwise, if the virtual machine implementation enforces the rules on structured use of locks described in §8.13 and if the first of those rules is violated during invocation of the current method, then freturn throws an `IllegalMonitorStateException`.

## fstore

Operation

Store `float` into local variable

Format

 fstore index

Forms

fstore = 56 (0x38)

Operand Stack

..., value ...

Description

The index is an unsigned byte that must be an index into the local variable array of the current frame (§3.6). The value on the top of the operand stack must be of type `float`. It is popped from the operand stack and undergoes value set conversion (§3.8.3), resulting in value'. The value of the local variable at index is set to value'.

Notes

The fstore opcode can be used in conjunction with the wide instruction to access a local variable using a two-byte unsigned index.

## fstore_<n>

Operation

Store `float` into local variable

Format

 fstore_

Forms

fstore_0 = 67 (0x43) fstore_1 = 68 (0x44) fstore_2 = 69 (0x45) fstore_3 = 70 (0x46)

Operand Stack

..., value ...

Description

The <n> must be an index into the local variable array of the current frame (§3.6). The value on the top of the operand stack must be of type `float`. It is popped from the operand stack and undergoes value set conversion (§3.8.3), resulting in value'. The value of the local variable at <n> is set to value'.

Notes

Each of the fstore_<n> is the same as fstore with an index of <n>, except that the operand <n> is implicit.

## fsub

Operation

Subtract `float`

Format

 fsub

Forms

fsub = 102 (0x66)

Operand Stack

..., value1, value2 ..., result

Description

Both value1 and value2 must be of type `float`. The values are popped from the operand stack and undergo value set conversion (§3.8.3), resulting in value1' and value2'. The `float` result is value1' - value2'. The result is pushed onto the operand stack.

For `float` subtraction, it is always the case that `a`-`b` produces the same result as `a`+(-`b`). However, for the fsub instruction, subtraction from zero is not the same as negation, because if `x` is +`0.0`, then `0.0`-`x` equals +`0.0`, but -`x` equals -`0.0`.

The Java virtual machine requires support of gradual underflow as defined by IEEE 754. Despite the fact that overflow, underflow, or loss of precision may occur, execution of an fsub instruction never throws a runtime exception.

The JavaTM Virtual Machine Specification