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:
Jakob Stoklund Olesen
2016-07-07 13:16:24 -07:00
parent 5d8fb0fdc3
commit 81ca406dd0
6 changed files with 183 additions and 64 deletions

View File

@@ -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
---------------------

View File

@@ -159,7 +159,7 @@ pub enum InstructionData {
second_result: Value,
args: [Value; 2],
},
Select {
Ternary {
opcode: Opcode,
ty: Type,
args: [Value; 3],

View File

@@ -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]),

View File

@@ -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],