FRED#

Format: FRED.SIN dest1, dest2, destPred, iterationCount, source1, source2

FRED.COS dest1, dest2, predicate, iterationCount, source1, source2.

Phase0: FRED.SIN{.part} W0, W1, (P0|_), iterationCount, S0{.NEG}{.ABS}, (S3|_)

FRED.COS{.part} W0, W1, (P0|_), iterationCount, S0{.NEG}{.ABS}, (S3|_)

Phase1: -

Phase2: -

Description: Trigonometric range reduction, sine/cosine.

Used for making the result of sin/cos/etc. operations more precise.

If iteration = 0 and PARTA:

W0 = Range Reduce(S0)
W1 = Range Reduce(S0)(data for PARTB)

For all other cases:

W0 = Range Reduce(S0, S3) (result - PARTB only)
W1 = Range Reduce(S0, S3) (data for PARTB or next itr)

Where S0 is the original input value and S3 is the data from the previous iteration.

If P0 is set then P = Perform further iteration

This instruction happens in two parts, both parts are required (see example usage below)

W0 does not contain any useful data in part A and may be discarded.

W1 may be discarded on the last iteration.

Example:

void main()
{
    fragColor = sin(a);
}
0    : fred.sin i1, i0, _, 0, sh0,

1    : fred.sin.partb i0, ft0, _, 0, sh0, i0

2    : fsinc r0, p0, i0