Add meta definitions for floating point operations.
Rename the Select instruction format to Ternary since it is also used by the fma instruction.
This commit is contained in:
@@ -771,73 +771,48 @@ Floating point operations
|
||||
These operations generally follow IEEE 754-2008 semantics.
|
||||
|
||||
.. autoinst:: fcmp
|
||||
.. autoinst:: fadd
|
||||
.. autoinst:: fsub
|
||||
.. autoinst:: fmul
|
||||
.. autoinst:: fdiv
|
||||
.. autoinst:: sqrt
|
||||
.. autoinst:: fma
|
||||
|
||||
.. inst:: fadd x,y
|
||||
Sign bit manipulations
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Floating point addition.
|
||||
The sign manipulating instructions work as bitwise operations, so they don't
|
||||
have special behavior for signaling NaN operands. The exponent and trailing
|
||||
significand bits are always preserved.
|
||||
|
||||
.. inst:: fsub x,y
|
||||
.. autoinst:: fneg
|
||||
.. autoinst:: fabs
|
||||
.. autoinst:: fcopysign
|
||||
|
||||
Floating point subtraction.
|
||||
Minimum and maximum
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. inst:: fneg x
|
||||
These instructions return the larger or smaller of their operands. They differ
|
||||
in their handling of quiet NaN inputs. Note that signaling NaN operands always
|
||||
cause a NaN result.
|
||||
|
||||
Floating point negation.
|
||||
When comparing zeroes, these instructions behave as if :math:`-0.0 < 0.0`.
|
||||
|
||||
:result: ``x`` with its sign bit inverted.
|
||||
.. autoinst:: fmin
|
||||
.. autoinst:: fminnum
|
||||
.. autoinst:: fmax
|
||||
.. autoinst:: fmaxnum
|
||||
|
||||
Note that this is a pure bitwise operation.
|
||||
Rounding
|
||||
~~~~~~~~
|
||||
|
||||
.. inst:: fabs x
|
||||
These instructions round their argument to a nearby integral value, still
|
||||
represented as a floating point number.
|
||||
|
||||
Floating point absolute value.
|
||||
|
||||
:result: ``x`` with its sign bit cleared.
|
||||
|
||||
Note that this is a pure bitwise operation.
|
||||
|
||||
.. inst:: a = fcopysign x, y
|
||||
|
||||
Floating point copy sign.
|
||||
|
||||
:result: ``x`` with its sign changed to that of ``y``.
|
||||
|
||||
Note that this is a pure bitwise operation. The sign bit from ``y`` is
|
||||
copied to the sign bit of ``x``.
|
||||
|
||||
.. inst:: a = fmul x, y
|
||||
.. inst:: a = fdiv x, y
|
||||
.. inst:: a = fmin x, y
|
||||
.. inst:: a = fminnum x, y
|
||||
.. inst:: a = fmax x, y
|
||||
.. inst:: a = fmaxnum x, y
|
||||
|
||||
.. inst:: a = ceil x
|
||||
|
||||
Round floating point round to integral, towards positive infinity.
|
||||
|
||||
.. inst:: floor x
|
||||
|
||||
Round floating point round to integral, towards negative infinity.
|
||||
|
||||
.. inst:: trunc x
|
||||
|
||||
Round floating point round to integral, towards zero.
|
||||
|
||||
.. inst:: nearest x
|
||||
|
||||
Round floating point round to integral, towards nearest with ties to even.
|
||||
|
||||
.. inst:: sqrt x
|
||||
|
||||
Floating point square root.
|
||||
|
||||
.. inst:: a = fma x, y, z
|
||||
|
||||
Floating point fused multiply-and-add.
|
||||
|
||||
Computes :math:`a := xy+z` wihtout any intermediate rounding of the
|
||||
product.
|
||||
.. autoinst:: ceil
|
||||
.. autoinst:: floor
|
||||
.. autoinst:: trunc
|
||||
.. autoinst:: nearest
|
||||
|
||||
Conversion operations
|
||||
---------------------
|
||||
|
||||
@@ -159,7 +159,7 @@ pub enum InstructionData {
|
||||
second_result: Value,
|
||||
args: [Value; 2],
|
||||
},
|
||||
Select {
|
||||
Ternary {
|
||||
opcode: Opcode,
|
||||
ty: Type,
|
||||
args: [Value; 3],
|
||||
|
||||
@@ -194,7 +194,7 @@ pub fn write_instruction(w: &mut Write, func: &Function, inst: Inst) -> Result {
|
||||
BinaryImm { arg, imm, .. } => writeln!(w, " {}, {}", arg, imm),
|
||||
BinaryImmRev { imm, arg, .. } => writeln!(w, " {}, {}", imm, arg),
|
||||
BinaryOverflow { args, .. } => writeln!(w, " {}, {}", args[0], args[1]),
|
||||
Select { args, .. } => writeln!(w, " {}, {}, {}", args[0], args[1], args[2]),
|
||||
Ternary { args, .. } => writeln!(w, " {}, {}, {}", args[0], args[1], args[2]),
|
||||
InsertLane { lane, args, .. } => writeln!(w, " {}, {}, {}", args[0], lane, args[1]),
|
||||
ExtractLane { lane, arg, .. } => writeln!(w, " {}, {}", arg, lane),
|
||||
IntCompare { cond, args, .. } => writeln!(w, " {}, {}, {}", cond, args[0], args[1]),
|
||||
|
||||
@@ -815,13 +815,15 @@ impl<'a> Parser<'a> {
|
||||
args: [lhs, rhs],
|
||||
}
|
||||
}
|
||||
InstructionFormat::Select => {
|
||||
InstructionFormat::Ternary => {
|
||||
// Names here refer to the `select` instruction.
|
||||
// This format is also use by `fma`.
|
||||
let ctrl_arg = try!(self.match_value("expected SSA value control operand"));
|
||||
try!(self.match_token(Token::Comma, "expected ',' between operands"));
|
||||
let true_arg = try!(self.match_value("expected SSA value true operand"));
|
||||
try!(self.match_token(Token::Comma, "expected ',' between operands"));
|
||||
let false_arg = try!(self.match_value("expected SSA value false operand"));
|
||||
InstructionData::Select {
|
||||
InstructionData::Ternary {
|
||||
opcode: opcode,
|
||||
ty: VOID,
|
||||
args: [ctrl_arg, true_arg, false_arg],
|
||||
|
||||
Reference in New Issue
Block a user