yuzu-emu
/
yuzu-android
Archived
1
0
Fork 0

Apply CC test to the final value to be stored in the register

This commit is contained in:
Rodolfo Bogado 2018-12-12 19:02:37 -03:00
parent bbf8d6bf01
commit 33056dd833
1 changed files with 12 additions and 9 deletions

View File

@ -410,16 +410,17 @@ public:
* @param dest_num_components Number of components in the destination. * @param dest_num_components Number of components in the destination.
* @param value_num_components Number of components in the value. * @param value_num_components Number of components in the value.
* @param is_saturated Optional, when True, saturates the provided value. * @param is_saturated Optional, when True, saturates the provided value.
* @param sets_cc Optional, when True, sets the corresponding values to the implemented
* condition flags.
* @param dest_elem Optional, the destination element to use for the operation. * @param dest_elem Optional, the destination element to use for the operation.
*/ */
void SetRegisterToFloat(const Register& reg, u64 elem, const std::string& value, void SetRegisterToFloat(const Register& reg, u64 elem, const std::string& value,
u64 dest_num_components, u64 value_num_components, u64 dest_num_components, u64 value_num_components,
bool is_saturated = false, bool sets_cc = false, u64 dest_elem = 0, bool is_saturated = false, bool sets_cc = false, u64 dest_elem = 0,
bool precise = false) { bool precise = false) {
const const std::string clamped_value = const std::string clamped_value = is_saturated ? "clamp(" + value + ", 0.0, 1.0)" : value;
is_saturated ? "clamp(" + value + ", 0.0, 1.0)" : value; SetRegister(reg, elem, clamped_value, dest_num_components, value_num_components, dest_elem,
SetRegister(reg, elem, clamped_value, precise);
dest_num_components, value_num_components, dest_elem, precise);
if (sets_cc) { if (sets_cc) {
if (reg == Register::ZeroIndex) { if (reg == Register::ZeroIndex) {
SetConditionalCodesFromExpression(clamped_value); SetConditionalCodesFromExpression(clamped_value);
@ -437,6 +438,8 @@ public:
* @param dest_num_components Number of components in the destination. * @param dest_num_components Number of components in the destination.
* @param value_num_components Number of components in the value. * @param value_num_components Number of components in the value.
* @param is_saturated Optional, when True, saturates the provided value. * @param is_saturated Optional, when True, saturates the provided value.
* @param sets_cc Optional, when True, sets the corresponding values to the implemented
* condition flags.
* @param dest_elem Optional, the destination element to use for the operation. * @param dest_elem Optional, the destination element to use for the operation.
* @param size Register size to use for conversion instructions. * @param size Register size to use for conversion instructions.
*/ */
@ -446,15 +449,15 @@ public:
bool sets_cc = false, u64 dest_elem = 0, bool sets_cc = false, u64 dest_elem = 0,
Register::Size size = Register::Size::Word) { Register::Size size = Register::Size::Word) {
UNIMPLEMENTED_IF(is_saturated); UNIMPLEMENTED_IF(is_saturated);
const std::string final_value = ConvertIntegerSize(value, size);
const std::string func{is_signed ? "intBitsToFloat" : "uintBitsToFloat"}; const std::string func{is_signed ? "intBitsToFloat" : "uintBitsToFloat"};
SetRegister(reg, elem, func + '(' + ConvertIntegerSize(value, size) + ')', SetRegister(reg, elem, func + '(' + final_value + ')', dest_num_components,
dest_num_components, value_num_components, dest_elem, false); value_num_components, dest_elem, false);
if (sets_cc) { if (sets_cc) {
if (reg == Register::ZeroIndex) { if (reg == Register::ZeroIndex) {
SetConditionalCodesFromExpression(value); SetConditionalCodesFromExpression(final_value);
} else { } else {
SetConditionalCodesFromRegister(reg, dest_elem); SetConditionalCodesFromRegister(reg, dest_elem);
} }