Line 291: |
Line 291: |
| | | |
| == Instructions == | | == Instructions == |
| + | |
| + | == Instructions == |
| + | Unless noted otherwise, SRC1 and SRC2 refer to their respectively indexed float[4] registers (after swizzling). Similarly, DST refers to its indexed register modulo destination component masking, i.e. an expression like DST=SRC1 might actually just set DST.y to SRC1.y. |
| + | |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 302: |
Line 306: |
| | 1 | | | 1 |
| | ADD | | | ADD |
− | | Adds two vectors component by component; DST[i] = SRC1[i]+SRC2[i] for all i (modulo destination component masking) | + | | Adds two vectors component by component; DST[i] = SRC1[i]+SRC2[i] for all i |
| |- | | |- |
| | 0x01 | | | 0x01 |
Line 327: |
Line 331: |
| | 1u | | | 1u |
| | EX2 | | | EX2 |
− | | Computes SRC1's exp component by component; DST[i] = EXP(SRC1[i]) for all i (modulo destination component masking) (base 2) | + | | Computes SRC1's per-component exponent with base 2; DST[i] = EXP(SRC1[i]) for all i |
| |- | | |- |
| | 0x06 | | | 0x06 |
| | 1u | | | 1u |
| | LG2 | | | LG2 |
− | | Computes SRC1's log2 component by component; DST[i] = LOG2(SRC1[i]) for all i (modulo destination component masking) (base 2) | + | | Computes SRC1's log2 component by component; DST[i] = LOG2(SRC1[i]) for all i |
| |- | | |- |
| | 0x07 | | | 0x07 |
Line 342: |
Line 346: |
| | 1 | | | 1 |
| | MUL | | | MUL |
− | | Multiplies two vectors component by component; DST[i] = SRC1[i].SRC2[i] for all i (modulo destination component masking) | + | | Multiplies two vectors component by component; DST[i] = SRC1[i].SRC2[i] for all i |
| |- | | |- |
| | 0x09 | | | 0x09 |
| | 1 | | | 1 |
| | SGE | | | SGE |
− | | Sets output if SRC1 is greater than or equal to SRC2; DST[i] = (SRC1[i] >= SRC2[i]) ? 1.0 : 0.0 for all i (modulo destination component masking) | + | | Sets output if SRC1 is greater than or equal to SRC2; DST[i] = (SRC1[i] >= SRC2[i]) ? 1.0 : 0.0 for all i |
| |- | | |- |
| | 0x0A | | | 0x0A |
| | 1 | | | 1 |
| | SLT | | | SLT |
− | | Sets output if SRC1 is strictly less than SRC2; DST[i] = (SRC1[i] < SRC2[i]) ? 1.0 : 0.0 for all i (modulo destination component masking) | + | | Sets output if SRC1 is strictly less than SRC2; DST[i] = (SRC1[i] < SRC2[i]) ? 1.0 : 0.0 for all i |
| |- | | |- |
| | 0x0B | | | 0x0B |
| | 1u | | | 1u |
| | FLR | | | FLR |
− | | Computes SRC1's floor component by component; DST[i] = FLOOR(SRC1[i]) for all i (modulo destination component masking) | + | | Computes SRC1's floor component by component; DST[i] = FLOOR(SRC1[i]) for all i |
| |- | | |- |
| | 0x0C | | | 0x0C |
| | 1 | | | 1 |
| | MAX | | | MAX |
− | | Takes the max of two vectors, component by component; DST[i] = MAX(SRC1[i], SRC2[i]) for all i (modulo destination component masking) | + | | Takes the max of two vectors, component by component; DST[i] = MAX(SRC1[i], SRC2[i]) for all i |
| |- | | |- |
| | 0x0D | | | 0x0D |
| | 1 | | | 1 |
| | MIN | | | MIN |
− | | Takes the min of two vectors, component by component; DST[i] = MIN(SRC1[i], SRC2[i]) for all i (modulo destination component masking) | + | | Takes the min of two vectors, component by component; DST[i] = MIN(SRC1[i], SRC2[i]) for all i |
| |- | | |- |
| | 0x0E | | | 0x0E |
| | 1u | | | 1u |
| | RCP | | | RCP |
− | | Computes the reciprocal of the vector, component by component; DST[i] = 1/SRC1[i] for all i (modulo destination component masking) | + | | Computes the reciprocal of the vector, component by component; DST[i] = 1/SRC1[i] for all i |
| |- | | |- |
| | 0x0F | | | 0x0F |
| | 1u | | | 1u |
| | RSQ | | | RSQ |
− | | Computes the reciprocal of the square root of the vector, component by component; DST[i] = 1/sqrt(SRC1[i]) for all i (modulo destination component masking) | + | | Computes the reciprocal of the square root of the vector, component by component; DST[i] = 1/sqrt(SRC1[i]) for all i |
| |- | | |- |
| | 0x10 | | | 0x10 |
Line 392: |
Line 396: |
| | 1u | | | 1u |
| | MOVA | | | MOVA |
− | | Move to address register; Casts the float uniform given by SRC1 to an integer (truncating the fractional part) and assigns the result to (a0.x, a0.y, _, _) (modulo destination component masking). | + | | Move to address register; Casts the float uniform given by SRC1 to an integer (truncating the fractional part) and assigns the result to (a0.x, a0.y, _, _), respecting the destination component mask. |
| |- | | |- |
| | 0x13 | | | 0x13 |
Line 432: |
Line 436: |
| | 1i | | | 1i |
| | SGEI | | | SGEI |
− | | Sets output if SRC1 is greater than or equal to SRC2; DST[i] = (SRC1[i] >= SRC2[i]) ? 1.0 : 0.0 for all i (modulo destination component masking) | + | | Sets output if SRC1 is greater than or equal to SRC2; DST[i] = (SRC1[i] >= SRC2[i]) ? 1.0 : 0.0 for all i |
| |- | | |- |
| | 0x1B | | | 0x1B |
| | 1i | | | 1i |
| | SLTI | | | SLTI |
− | | Sets output if SRC1 is strictly less than SRC2; DST[i] = (SRC1[i] < SRC2[i]) ? 1.0 : 0.0 for all i (modulo destination component masking) | + | | Sets output if SRC1 is strictly less than SRC2; DST[i] = (SRC1[i] < SRC2[i]) ? 1.0 : 0.0 for all i |
| |- | | |- |
| | 0x1C | | | 0x1C |
Line 532: |
Line 536: |
| | 1c | | | 1c |
| | CMP | | | CMP |
− | | Sets booleans cmp.x and cmp.y based on the operand's x and y components and the CMPX and CMPY comparison operators respectively. See [[#Comparison_operator|below]] for details about operators. | + | | Sets booleans cmp.x and cmp.y based on the operand's x and y components and the CMPX and CMPY comparison operators respectively. See [[#Comparison_operator|below]] for details about operators. It's unknown whether CMP respects the destination component mask or not. |
| |- | | |- |
| | 0x30-0x37 | | | 0x30-0x37 |
| | 5i | | | 5i |
| | MADI | | | MADI |
− | | Multiplies two vectors and adds a third one component by component; DST[i] = SRC3[i] + SRC2[i].SRC1[i] for all i (modulo destination component masking) | + | | Multiplies two vectors and adds a third one component by component; DST[i] = SRC3[i] + SRC2[i].SRC1[i] for all i |
| |- | | |- |
| | 0x38-0x3F | | | 0x38-0x3F |
| | 5 | | | 5 |
| | MAD | | | MAD |
− | | Multiplies two vectors and adds a third one component by component; DST[i] = SRC3[i] + SRC2[i].SRC1[i] for all i (modulo destination component masking) | + | | Multiplies two vectors and adds a third one component by component; DST[i] = SRC3[i] + SRC2[i].SRC1[i] for all i |
| |} | | |} |
| | | |