Created
October 20, 2018 09:16
-
-
Save Triang3l/4f27ca057e62eee67c800fde720c6b99 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Check if the target format is 7e3 and the conversion is needed (this is | |
// pretty long, better to branch here). | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_IF) | | |
ENCODE_D3D10_SB_INSTRUCTION_TEST_BOOLEAN( | |
D3D10_SB_INSTRUCTION_TEST_NONZERO) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(3)); | |
shader_code_.push_back( | |
EncodeVectorSelectOperand(D3D10_SB_OPERAND_TYPE_TEMP, 1, 1)); | |
shader_code_.push_back(flags_temp); | |
++stat_.instruction_count; | |
++stat_.dynamic_flow_control_count; | |
uint32_t small_float_format_temp = PushSystemTemp(); | |
uint32_t small_float_mantissa_temp = PushSystemTemp(); | |
uint32_t small_float_exponent_temp = PushSystemTemp(); | |
uint32_t small_float_denormalized_and_sign_temp = PushSystemTemp(); | |
// Get format info: | |
// X - mantissa mask. | |
// Y - exponent width. | |
// Z - exponent offset. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(15)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b0111, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 2, 1)); | |
shader_code_.push_back(flags_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(0x3FF); | |
shader_code_.push_back(5); | |
shader_code_.push_back(10); | |
shader_code_.push_back(0); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(0x7F); | |
shader_code_.push_back(3); | |
shader_code_.push_back(7); | |
shader_code_.push_back(0); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Extract the mantissa. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_AND) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// Extract the exponent. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D11_SB_OPCODE_UBFE) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(9)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 1, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 2, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(target_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// Get format info: | |
// X - mantissa width - 31. | |
// Y - mantissa width + 1. | |
// Z - mantissa mask. | |
// W - exponent bias. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(15)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 2, 1)); | |
shader_code_.push_back(flags_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(uint32_t(-21)); | |
shader_code_.push_back(11); | |
shader_code_.push_back(0x3FF); | |
shader_code_.push_back(112); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(uint32_t(-24)); | |
shader_code_.push_back(8); | |
shader_code_.push_back(0x7F); | |
shader_code_.push_back(124); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Normalize the mantissa for denormalized numbers (with zero exponent - | |
// exponent can be used for selection in movc). | |
// Note that HLSL firstbithigh(x) is compiled to DXBC like: | |
// `x ? 31 - firstbit_hi(x) : -1` | |
// (it returns the index from the LSB, not the MSB, but -1 for zero as well). | |
// denormalized_temp = firstbit_hi(mantissa) | |
shader_code_.push_back( | |
ENCODE_D3D10_SB_OPCODE_TYPE(D3D11_SB_OPCODE_FIRSTBIT_HI) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(5)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// denormalized_temp = 7 - (31 - firstbit_hi(mantissa)) for 7e3 | |
// denormalized_temp = 10 - (31 - firstbit_hi(mantissa)) for s10e5 | |
// Or, if expanded: | |
// denormalized_temp = firstbit_hi(mantissa) - 24 for 7e3 | |
// denormalized_temp = firstbit_hi(mantissa) - 21 for s10e5 | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_IADD) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// If mantissa is zero, then: | |
// denormalized_temp = 7 - (-1) = 8 for 7e3 | |
// denormalized_temp = 10 - (-1) = 11 for s10e5 | |
// After this, it works like the following HLSL: | |
// denormalized_temp = 7 - firstbithigh(mantissa) for 7e3 | |
// denormalized_temp = 10 - firstbithigh(mantissa) for s10e5 | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(9)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 1, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// If the number is not denormalized, make | |
// `(mantissa << (mantissa_width - firstbithigh(mantissa))) & mantissa_mask` | |
// a no-op - zero mantissa_width - firstbithigh(mantissa). | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(12)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Normalize the mantissa - step 1. | |
// mantissa = mantissa << (mantissa_width - firstbithigh(mantissa)) | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_ISHL) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// Normalize the mantissa - step 2. | |
// mantissa = (mantissa << (mantissa_width - firstbithigh(mantissa))) & | |
// mantissa_mask | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_AND) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 2, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// Get the normalized exponent. | |
// denormalized_temp = 1 - (mantissa_width - firstbithigh(mantissa)) | |
// If the number is normal, the result will be ignored anyway, so zeroing | |
// mantissa_width - firstbithigh(mantissa) will have no effect on this. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_IADD) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(11)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(1); | |
shader_code_.push_back(1); | |
shader_code_.push_back(1); | |
shader_code_.push_back(1); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1) | | |
ENCODE_D3D10_SB_OPERAND_EXTENDED(1)); | |
shader_code_.push_back( | |
ENCODE_D3D10_SB_EXTENDED_OPERAND_MODIFIER(D3D10_SB_OPERAND_MODIFIER_NEG)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// Overwrite the exponent with the normalized one if needed. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(9)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Bias the exponent. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_IADD) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 3, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// Get the format info: | |
// X - sign mask (or 0 for unsigned). | |
// Y - mantissa shift. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(15)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b0011, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 2, 1)); | |
shader_code_.push_back(flags_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(0x8000); | |
shader_code_.push_back(13); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(0); | |
shader_code_.push_back(16); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Extract the sign. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_AND) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// Remove the sign so movc can be used for zero comparison. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_XOR) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// If the original number is zero, make the exponent zero (mantissa is already | |
// zero in this case). | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(12)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
shader_code_.push_back(0); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Shift the mantissa into its float32 position. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_ISHL) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorReplicatedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 1, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// Shift the exponent into its float32 position. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_ISHL) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(10)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(23); | |
shader_code_.push_back(23); | |
shader_code_.push_back(23); | |
shader_code_.push_back(23); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// For k_2_10_10_10_FLOAT, convert the alpha from fixed-point to format X. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_UTOF) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(5)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b0001, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
shader_code_.push_back( | |
EncodeVectorSelectOperand(D3D10_SB_OPERAND_TYPE_TEMP, 3, 1)); | |
shader_code_.push_back(target_temp); | |
++stat_.instruction_count; | |
++stat_.conversion_instruction_count; | |
// Combine mantissa and exponent into float32 numbers. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_OR) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_mantissa_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_exponent_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// Shift the sign into its float32 position. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_ISHL) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(10)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
shader_code_.push_back(EncodeVectorSwizzledOperand( | |
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); | |
shader_code_.push_back(16); | |
shader_code_.push_back(16); | |
shader_code_.push_back(16); | |
shader_code_.push_back(16); | |
++stat_.instruction_count; | |
++stat_.int_instruction_count; | |
// Add the signs to float32 numbers. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_OR) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(7)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1111, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSwizzledOperand(D3D10_SB_OPERAND_TYPE_TEMP, kSwizzleXYZW, 1)); | |
shader_code_.push_back(small_float_denormalized_and_sign_temp); | |
++stat_.instruction_count; | |
++stat_.uint_instruction_count; | |
// For k_2_10_10_10_FLOAT, use the alpha converted from fixed-point. | |
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOVC) | | |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(9)); | |
shader_code_.push_back( | |
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0b1000, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSelectOperand(D3D10_SB_OPERAND_TYPE_TEMP, 2, 1)); | |
shader_code_.push_back(flags_temp); | |
shader_code_.push_back( | |
EncodeVectorSelectOperand(D3D10_SB_OPERAND_TYPE_TEMP, 3, 1)); | |
shader_code_.push_back(target_temp); | |
shader_code_.push_back( | |
EncodeVectorSelectOperand(D3D10_SB_OPERAND_TYPE_TEMP, 0, 1)); | |
shader_code_.push_back(small_float_format_temp); | |
++stat_.instruction_count; | |
++stat_.movc_instruction_count; | |
// Release small_float_format_temp, small_float_mantissa_temp, | |
// small_float_exponent_temp and small_float_denormalized_and_sign_temp. | |
PopSystemTemp(4); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment