# Ztrans - transcendental operations See: * * * [[rv_major_opcode_1010011]] for opcode listing. Extension subsets: * **Ztrans**: standard transcendentals (best suited to 3D) * **ZtransExt**: extra functions (useful, not generally needed for 3D, can be synthesised using Ztrans) * **Ztrigpi**: trig. xxx-pi sinpi cospi tanpi * **Ztrignpi**: trig non-xxx-pi sin cos tan * **Zarctrigpi**: arc-trig. a-xxx-pi: atan2pi asinpi acospi * **Zarctrignpi**: arc-trig. non-a-xxx-pi: atan2, asin, acos * **Ztrignh**: trig/arc-trig hyperbolic. sinh cosh tanh, asinh, acosh, atanh * **ZtransAdv**: much more complex to implement in hardware Minimum recommended requirements for 3D: Ztrans, Ztrigpi, Zarctrigpi, Zarctrignpi [[!toc levels=2]] # List of 2-arg opcodes [[!table data=""" opcode | Description | pseudo-code | Extension | FATAN2 | atan2 arc tangent | rd = atan2(rs2, rs1) | Zarctrignpi | FATAN2PI | atan arc tangent / pi | rd = atan2(rs2, rs1) / pi | Zarctrigpi | FPOW | x power of y | rd = pow(rs1, rs2) | ZtransAdv | FROOT | x power 1/y | rd = pow(rs1, 1/rs2) | ZtransAdv | """]] # List of 1-arg transcendental opcodes [[!table data=""" opcode | Description | pseudo-code | Extension | FCBRT | Cube Root | rd = pow(rs1, 3) | Ztrans | FEXP2 | power-of-2 | rd = pow(2, rs1) | Ztrans | FLOG2 | log2 | rd = log2(rs1) | Ztrans | FEXPM1 | exponent minus 1 | rd = pow(e, rs1) - 1.0 | Ztrans | FLOG1P | log plus 1 | rd = log(e, 1 + rs1) | Ztrans | FEXP | exponent | rd = pow(e, rs1) | ZtransExt | FLOG | natural log (base e) | rd = log(e, rs1) | ZtransExt | FEXP10 | power-of-10 | rd = pow(10, rs1) | ZtransExt | FLOG10 | log base 10 | rd = log10(rs1) | ZtransExt | """]] # List of 1-arg trigonometric opcodes [[!table data=""" opcode | Description | pseudo-code | Extension | FSIN | sin (radians) | rd = sin(rs1) | Ztrignpi | FCOS | cos (radians) | rd = cos(rs1) | Ztrignpi | FTAN | tan (radians) | rd = tan(rs1) | Ztrignpi | FASIN | arcsin (radians) | rd = asin(rs1) | Zarctrignpi | FACOS | arccos (radians) | rd = acos(rs1) | Zarctrignpi | FSINPI | sin times pi | rd = sin(pi * rs1) | Ztrigpi | FCOSPI | cos times pi | rd = cos(pi * rs1) | Ztrigpi | FTANPI | tan times pi | rd = tan(pi * rs1) | Ztrigpi | FASINPI | arcsin times pi | rd = asin(pi * rs1) | Zarctrigpi | FACOSPI | arccos times pi | rd = acos(pi * rs1) | Zarctrigpi | FATANPI | arctan times pi | rd = atan(pi * rs1) | Zarctrigpi | FSINH | hyperbolic sin (radians) | rd = sinh(rs1) | Ztrigh | FCOSH | hyperbolic cos (radians) | rd = cosh(rs1) | Ztrigh | FTANH | hyperbolic tan (radians) | rd = tanh(rs1) | Ztrigh | FASINH | inverse hyperbolic sin | rd = asinh(rs1) | Ztrigh | FACOSH | inverse hyperbolic cos | rd = acosh(rs1) | Ztrigh | FATANH | inverse hyperbolic tan | rd = atanh(rs1) | Ztrigh | """]] # Pseudo-code ops and macro-ops The pseudo-ops are best left up to the compiler rather than being actual pseudo-ops, by allocating one scalar FP register for use as a constant (loop invariant) set to "1.0" at the beginning of a function or other suitable code block. * FRCP rd, rs1 - pseudo-code alias for rd = 1.0 / rs1 * FATAN - pseudo-code alias for rd = atan2(rs1, 1.0) - FATAN2 * FATANPI - pseudo alias for rd = atan2pi(rs1, 1.0) - FATAN2PI * FSINCOS - fused macro-op between FSIN and FCOS (issued in that order). * FSINCOSPI - fused macro-op between FSINPI and FCOSPI (issued in that order). FATANPI example pseudo-code: lui t0, 0x3F800 // upper bits of f32 1.0 fmv.x.s ft0, t0 fatan2pi.s rd, rs1, ft0