#include "gtest/gtest.h" #include "FormRegressionTest.h" using namespace decompiler; TEST_F(FormRegressionTest, MatrixPMult) { std::string func = "sll r0, r0, 0\n" " daddiu sp, sp, -112\n" " sd ra, 0(sp)\n" " sq s5, 80(sp)\n" " sq gp, 96(sp)\n" " or gp, a0, r0\n" " daddiu s5, sp, 16\n" " sq r0, 0(s5)\n" " sq r0, 16(s5)\n" " sq r0, 32(s5)\n" " sq r0, 48(s5)\n" " lw t9, matrix*!(s7)\n" " or a0, s5, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " lq v1, 0(s5)\n" " sq v1, 0(gp)\n" " lq v1, 16(s5)\n" " sq v1, 16(gp)\n" " lq v1, 32(s5)\n" " sq v1, 32(gp)\n" " lq v1, 48(s5)\n" " sq v1, 48(gp)\n" " or v0, gp, r0\n" " ld ra, 0(sp)\n" " lq gp, 96(sp)\n" " lq s5, 80(sp)\n" " jr ra\n" " daddiu sp, sp, 112"; std::string type = "(function matrix matrix matrix matrix)"; std::string expected = "(begin\n" " (let ((s5-0 (new (quote stack) (quote matrix))))\n" " (set! (-> s5-0 vector 0 quad) (the-as uint128 0))\n" " (set! (-> s5-0 vector 1 quad) (the-as uint128 0))\n" " (set! (-> s5-0 vector 2 quad) (the-as uint128 0))\n" " (set! (-> s5-0 vector 3 quad) (the-as uint128 0))\n" " (matrix*! s5-0 arg1 arg2)\n" " (set! (-> arg0 vector 0 quad) (-> s5-0 vector 0 quad))\n" " (set! (-> arg0 vector 1 quad) (-> s5-0 vector 1 quad))\n" " (set! (-> arg0 vector 2 quad) (-> s5-0 vector 2 quad))\n" " (set! (-> arg0 vector 3 quad) (-> s5-0 vector 3 quad))\n" " )\n" " arg0\n" " )"; test_with_stack_vars(func, type, expected, "[\n" " [16, \"matrix\"]\n" " ]"); }