[decompiler] Detect vector*! (#3846)

Detect use of `vector*!`, which is inlined in jak 2 and jak 3.

---------

Co-authored-by: water111 <awaterford1111445@gmail.com>
This commit is contained in:
water111
2025-01-20 12:21:28 -05:00
committed by GitHub
parent 3ee2b4423c
commit 98d6618a8b
37 changed files with 2449 additions and 3185 deletions
+3
View File
@@ -353,6 +353,8 @@ std::string get_simple_expression_op_name(SimpleExpression::Kind kind) {
return "pcypld";
case SimpleExpression::Kind::VECTOR_PLUS:
return "vector+!2";
case SimpleExpression::Kind::VECTOR_XYZ_PRODUCT:
return "vector-xyz-product!";
case SimpleExpression::Kind::VECTOR_MINUS:
return "vector-!2";
case SimpleExpression::Kind::VECTOR_FLOAT_PRODUCT:
@@ -427,6 +429,7 @@ int get_simple_expression_arg_count(SimpleExpression::Kind kind) {
case SimpleExpression::Kind::VECTOR_MINUS:
case SimpleExpression::Kind::VECTOR_FLOAT_PRODUCT:
case SimpleExpression::Kind::VECTOR_CROSS:
case SimpleExpression::Kind::VECTOR_XYZ_PRODUCT:
return 3;
case SimpleExpression::Kind::SUBU_L32_S7:
return 1;
+1
View File
@@ -256,6 +256,7 @@ class SimpleExpression {
VECTOR_PLUS,
VECTOR_MINUS,
VECTOR_FLOAT_PRODUCT,
VECTOR_XYZ_PRODUCT, // vector*!, elementwise xyz, jak3 only
VECTOR_CROSS,
SUBU_L32_S7, // use SUBU X, src0, s7 to check if lower 32-bits are s7.
VECTOR_3_DOT,
+1
View File
@@ -238,6 +238,7 @@ TP_Type SimpleExpression::get_type(const TypeState& input,
case Kind::VECTOR_PLUS:
case Kind::VECTOR_MINUS:
case Kind::VECTOR_CROSS:
case Kind::VECTOR_XYZ_PRODUCT:
return TP_Type::make_from_ts("vector");
case Kind::VECTOR_FLOAT_PRODUCT:
return TP_Type::make_from_ts("vector");
+2
View File
@@ -1858,6 +1858,8 @@ std::string fixed_operator_to_string(FixedOperatorKind kind) {
return "vector-!";
case FixedOperatorKind::VECTOR_PLUS:
return "vector+!";
case FixedOperatorKind::VECTOR_XYZ_PRODUCT:
return "vector*!";
case FixedOperatorKind::VECTOR_CROSS:
return "vector-cross!";
case FixedOperatorKind::VECTOR_FLOAT_PRODUCT:
@@ -2527,6 +2527,10 @@ void SimpleExpressionElement::update_from_stack(const Env& env,
update_from_stack_vector_plus_minus_cross(FixedOperatorKind::VECTOR_CROSS, env, pool, stack,
result, allow_side_effects);
break;
case SimpleExpression::Kind::VECTOR_XYZ_PRODUCT:
update_from_stack_vector_plus_minus_cross(FixedOperatorKind::VECTOR_XYZ_PRODUCT, env, pool,
stack, result, allow_side_effects);
break;
case SimpleExpression::Kind::VECTOR_FLOAT_PRODUCT:
update_from_stack_vector_float_product(env, pool, stack, result, allow_side_effects);
break;
+1
View File
@@ -162,6 +162,7 @@ enum class FixedOperatorKind {
VECTOR_MINUS,
VECTOR_CROSS,
VECTOR_FLOAT_PRODUCT,
VECTOR_XYZ_PRODUCT,
L32_NOT_FALSE_CBOOL,
VECTOR_3_DOT,
PROCESS_TO_PPOINTER,