jak-project/test/decompiler/test_FormExpressionBuildLong.cpp
water111 12446037bd
[decompiler] Make addition nicer (#733)
* temp

* update refs

* update reference

* fix tests
2021-08-01 18:24:58 -04:00

2897 lines
76 KiB
C++

#include "gtest/gtest.h"
#include "FormRegressionTest.h"
using namespace decompiler;
TEST_F(FormRegressionTest, ExprArrayMethod2) {
std::string func =
" sll r0, r0, 0\n"
"L130:\n"
" daddiu sp, sp, -48\n"
" sd ra, 0(sp)\n"
" sd fp, 8(sp)\n"
" or fp, t9, r0\n"
" sq s5, 16(sp)\n"
" sq gp, 32(sp)\n"
" or gp, a0, r0\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L342\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" lw t9, type-type?(s7)\n"
" lwu a0, 8(gp)\n"
" lw a1, integer(s7)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq s7, v0, L182\n"
" sll r0, r0, 0\n"
" lwu v1, 8(gp)\n"
" lwu v1, 0(v1)\n"
" daddiu a0, s7, int32\n"
" bne v1, a0, L135\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L134\n"
" sll r0, r0, 0\n"
"L131:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L132\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L133\n"
" sll r0, r0, 0\n"
"L132:\n"
" daddiu a1, fp, L340\n"
"L133:\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L134:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L131\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L135:\n"
" daddiu a0, s7, uint32\n"
" bne v1, a0, L140\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L139\n"
" sll r0, r0, 0\n"
"L136:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L137\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L138\n"
" sll r0, r0, 0\n"
"L137:\n"
" daddiu a1, fp, L340\n"
"L138:\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lwu a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L139:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L136\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L140:\n"
" daddiu a0, s7, int64\n"
" bne v1, a0, L145\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L144\n"
" sll r0, r0, 0\n"
"L141:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L142\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L143\n"
" sll r0, r0, 0\n"
"L142:\n"
" daddiu a1, fp, L340\n"
"L143:\n"
" dsll v1, s5, 3\n"
" daddu v1, v1, gp\n"
" ld a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L144:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L141\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L145:\n"
" daddiu a0, s7, uint64\n"
" bne v1, a0, L150\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L149\n"
" sll r0, r0, 0\n"
"L146:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L147\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L339\n"
" beq r0, r0, L148\n"
" sll r0, r0, 0\n"
"L147:\n"
" daddiu a1, fp, L338\n"
"L148:\n"
" dsll v1, s5, 3\n"
" daddu v1, v1, gp\n"
" ld a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L149:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L146\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L150:\n"
" daddiu a0, s7, int8\n"
" bne v1, a0, L155\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L154\n"
" sll r0, r0, 0\n"
"L151:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L152\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L153\n"
" sll r0, r0, 0\n"
"L152:\n"
" daddiu a1, fp, L340\n"
"L153:\n"
" daddu v1, s5, gp\n"
" lb a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L154:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L151\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L155:\n"
" daddiu a0, s7, uint8\n"
" bne v1, a0, L160\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L159\n"
" sll r0, r0, 0\n"
"L156:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L157\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L158\n"
" sll r0, r0, 0\n"
"L157:\n"
" daddiu a1, fp, L340\n"
"L158:\n"
" daddu v1, s5, gp\n"
" lbu a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L159:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L156\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L160:\n"
" daddiu a0, s7, int16\n"
" bne v1, a0, L165\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L164\n"
" sll r0, r0, 0\n"
"L161:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L162\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L163\n"
" sll r0, r0, 0\n"
"L162:\n"
" daddiu a1, fp, L340\n"
"L163:\n"
" dsll v1, s5, 1\n"
" daddu v1, v1, gp\n"
" lh a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L164:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L161\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L165:\n"
" daddiu a0, s7, uint16\n"
" bne v1, a0, L170\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L169\n"
" sll r0, r0, 0\n"
"L166:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L167\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L168\n"
" sll r0, r0, 0\n"
"L167:\n"
" daddiu a1, fp, L340\n"
"L168:\n"
" dsll v1, s5, 1\n"
" daddu v1, v1, gp\n"
" lhu a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L169:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L166\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L170:\n"
" daddiu a0, s7, uint128\n"
" dsubu a0, v1, a0\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a0\n"
" bnel s7, a1, L171\n"
" or v1, a1, r0\n"
" daddiu a0, s7, int128\n"
" dsubu a0, v1, a0\n"
" daddiu v1, s7, 8\n"
" movn v1, s7, a0\n"
"L171:\n"
" beq s7, v1, L176\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L175\n"
" sll r0, r0, 0\n"
"L172:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L173\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L339\n"
" beq r0, r0, L174\n"
" sll r0, r0, 0\n"
"L173:\n"
" daddiu a1, fp, L338\n"
"L174:\n"
" dsll v1, s5, 4\n"
" daddu v1, v1, gp\n"
" lq a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L175:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L172\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L181\n"
" sll r0, r0, 0\n"
"L176:\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L180\n"
" sll r0, r0, 0\n"
"L177:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" bne s5, r0, L178\n"
" sll r0, r0, 0\n"
" daddiu a1, fp, L341\n"
" beq r0, r0, L179\n"
" sll r0, r0, 0\n"
"L178:\n"
" daddiu a1, fp, L340\n"
"L179:\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu s5, s5, 1\n"
"L180:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L177\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
"L181:\n"
" beq r0, r0, L192\n"
" sll r0, r0, 0\n"
"L182:\n"
" lw v1, float(s7)\n"
" lwu a0, 8(gp)\n"
" bne a0, v1, L187\n"
" sll r0, r0, 0\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L186\n"
" sll r0, r0, 0\n"
"L183:\n"
" bne s5, r0, L184\n"
" sll r0, r0, 0\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L343\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" or v1, v0, r0\n"
" beq r0, r0, L185\n"
" sll r0, r0, 0\n"
"L184:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L337\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" or v1, v0, r0\n"
"L185:\n"
" daddiu s5, s5, 1\n"
"L186:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L183\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L192\n"
" sll r0, r0, 0\n"
"L187:\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L191\n"
" sll r0, r0, 0\n"
"L188:\n"
" bne s5, r0, L189\n"
" sll r0, r0, 0\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L336\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" or v1, v0, r0\n"
" beq r0, r0, L190\n"
" sll r0, r0, 0\n"
"L189:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L335\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a2, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" or v1, v0, r0\n"
"L190:\n"
" daddiu s5, s5, 1\n"
"L191:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L188\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
"L192:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L334\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" or v0, gp, r0\n"
" ld ra, 0(sp)\n"
" ld fp, 8(sp)\n"
" lq gp, 32(sp)\n"
" lq s5, 16(sp)\n"
" jr ra\n"
" daddiu sp, sp, 48";
std::string type = "(function array array)";
std::string expected =
"(begin\n"
" (format #t \"#(\")\n"
" (cond\n"
" ((type-type? (-> arg0 content-type) integer)\n"
" (case (-> arg0 content-type symbol) \n"
" (('int32)\n"
" (dotimes (s5-0 (-> arg0 length))\n"
" (format #t (if (zero? s5-0)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array int32) arg0) s5-0)\n"
" )\n"
" )\n"
" )\n"
" (('uint32)\n"
" (dotimes (s5-1 (-> arg0 length))\n"
" (format #t (if (zero? s5-1)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array uint32) arg0) s5-1)\n"
" )\n"
" )\n"
" )\n"
" (('int64)\n"
" (dotimes (s5-2 (-> arg0 length))\n"
" (format #t (if (zero? s5-2)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array int64) arg0) s5-2)\n"
" )\n"
" )\n"
" )\n"
" (('uint64)\n"
" (dotimes (s5-3 (-> arg0 length))\n"
" (format #t (if (zero? s5-3)\n"
" \"#x~X\"\n"
" \" #x~X\"\n"
" )\n"
" (-> (the-as (array uint64) arg0) s5-3)\n"
" )\n"
" )\n"
" )\n"
" (('int8)\n"
" (dotimes (s5-4 (-> arg0 length))\n"
" (format #t (if (zero? s5-4)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array int8) arg0) s5-4)\n"
" )\n"
" )\n"
" )\n"
" (('uint8)\n"
" (dotimes (s5-5 (-> arg0 length))\n"
" (format #t (if (zero? s5-5)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array uint8) arg0) s5-5)\n"
" )\n"
" )\n"
" )\n"
" (('int16)\n"
" (dotimes (s5-6 (-> arg0 length))\n"
" (format #t (if (zero? s5-6)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array int16) arg0) s5-6)\n"
" )\n"
" )\n"
" )\n"
" (('uint16)\n"
" (dotimes (s5-7 (-> arg0 length))\n"
" (format #t (if (zero? s5-7)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array uint16) arg0) s5-7)\n"
" )\n"
" )\n"
" )\n"
" (('uint128 'int128)\n"
" (dotimes (s5-8 (-> arg0 length))\n"
" (format #t (if (zero? s5-8)\n"
" \"#x~X\"\n"
" \" #x~X\"\n"
" )\n"
" (-> (the-as (array uint128) arg0) s5-8)\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (dotimes (s5-9 (-> arg0 length))\n"
" (format #t (if (zero? s5-9)\n"
" \"~D\"\n"
" \" ~D\"\n"
" )\n"
" (-> (the-as (array int32) arg0) s5-9)\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" ((= (-> arg0 content-type) float)\n"
" (dotimes (s5-10 (-> arg0 length))\n"
" (if (zero? s5-10)\n"
" (format #t \"~f\" (-> (the-as (array float) arg0) s5-10))\n"
" (format #t \" ~f\" (-> (the-as (array float) arg0) s5-10))\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (dotimes (s5-11 (-> arg0 length))\n"
" (if (zero? s5-11)\n"
" (format #t \"~A\" (-> (the-as (array basic) arg0) s5-11))\n"
" (format #t \" ~A\" (-> (the-as (array basic) arg0) s5-11))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (format #t \")\")\n"
" arg0\n"
" )";
test_with_expr(func, type, expected, true, "array",
{{"L343", "~f"},
{"L342", "#("},
{"L341", "~D"},
{"L340", " ~D"},
{"L339", "#x~X"},
{"L338", " #x~X"},
{"L337", " ~f"},
{"L336", "~A"},
{"L335", " ~A"},
{"L334", ")"}},
"["
"\t\t[23, \"gp\", \"(array int32)\"],\n"
"\t\t[43, \"gp\", \"(array uint32)\"],\n"
"\t\t[63, \"gp\", \"(array int64)\"],\n"
"\t\t[83, \"gp\", \"(array uint64)\"],\n"
"\t\t[102, \"gp\", \"(array int8)\"],\n"
"\t\t[121, \"gp\", \"(array uint8)\"],\n"
"\t\t[141, \"gp\", \"(array int16)\"],\n"
"\t\t[161, \"gp\", \"(array uint16)\"],\n"
"\t\t[186, \"gp\", \"(array uint128)\"],\n"
"\t\t[204, \"gp\", \"(array int32)\"],\n"
"\t\t[223, \"gp\", \"(array float)\"],\n"
"\t\t[232, \"gp\", \"(array float)\"],\n"
"\t\t[249, \"gp\", \"(array basic)\"],\n"
"\t\t[258, \"gp\", \"(array basic)\"]]");
}
TEST_F(FormRegressionTest, ExprArrayMethod3) {
std::string func =
" sll r0, r0, 0\n"
"L91:\n"
" daddiu sp, sp, -48\n"
" sd ra, 0(sp)\n"
" sd fp, 8(sp)\n"
" or fp, t9, r0\n"
" sq s5, 16(sp)\n"
" sq gp, 32(sp)\n"
" or gp, a0, r0\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L333\n"
" or a2, gp, r0\n"
" lwu a3, -4(gp)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L332\n"
" lw a2, 4(gp)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L331\n"
" lw a2, 0(gp)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L330\n"
" lwu a2, 8(gp)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L329\n"
" lw a2, 4(gp)\n"
" daddiu a3, gp, 12\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" lw t9, type-type?(s7)\n"
" lwu a0, 8(gp)\n"
" lw a1, integer(s7)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" beq s7, v0, L123\n"
" sll r0, r0, 0\n"
"\n"
" lwu v1, 8(gp)\n"
" lwu v1, 0(v1)\n"
" daddiu a0, s7, int32\n"
" bne v1, a0, L94\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L93\n"
" sll r0, r0, 0\n"
"\n"
"L92:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L93:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L92\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L94:\n"
" daddiu a0, s7, uint32\n"
" bne v1, a0, L97\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L96\n"
" sll r0, r0, 0\n"
"\n"
"L95:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lwu a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L96:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L95\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L97:\n"
" daddiu a0, s7, int64\n"
" bne v1, a0, L100\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L99\n"
" sll r0, r0, 0\n"
"\n"
"L98:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" dsll v1, s5, 3\n"
" daddu v1, v1, gp\n"
" ld a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L99:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L98\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L100:\n"
" daddiu a0, s7, uint64\n"
" bne v1, a0, L103\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L102\n"
" sll r0, r0, 0\n"
"\n"
"L101:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L327\n"
" or a2, s5, r0\n"
" dsll v1, s5, 3\n"
" daddu v1, v1, gp\n"
" ld a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L102:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L101\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L103:\n"
" daddiu a0, s7, int8\n"
" bne v1, a0, L106\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L105\n"
" sll r0, r0, 0\n"
"\n"
"L104:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" daddu v1, s5, gp\n"
" lb a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L105:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L104\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L106:\n"
" daddiu a0, s7, uint8\n"
" bne v1, a0, L109\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L108\n"
" sll r0, r0, 0\n"
"\n"
"L107:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" daddu v1, s5, gp\n"
" lb a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L108:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L107\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L109:\n"
" daddiu a0, s7, int16\n"
" bne v1, a0, L112\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L111\n"
" sll r0, r0, 0\n"
"\n"
"L110:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" dsll v1, s5, 1\n"
" daddu v1, v1, gp\n"
" lh a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L111:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L110\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L112:\n"
" daddiu a0, s7, uint16\n"
" bne v1, a0, L115\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L114\n"
" sll r0, r0, 0\n"
"\n"
"L113:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" dsll v1, s5, 1\n"
" daddu v1, v1, gp\n"
" lhu a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L114:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L113\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L115:\n"
" daddiu a0, s7, int128\n"
" dsubu a0, v1, a0\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a0\n"
" bnel s7, a1, L116\n"
" or v1, a1, r0\n"
"\n"
" daddiu a0, s7, uint128\n"
" dsubu a0, v1, a0\n"
" daddiu v1, s7, 8\n"
" movn v1, s7, a0\n"
"L116:\n"
" beq s7, v1, L119\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L118\n"
" sll r0, r0, 0\n"
"\n"
"L117:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L327\n"
" or a2, s5, r0\n"
" dsll v1, s5, 4\n"
" daddu v1, v1, gp\n"
" lq a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L118:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L117\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L122\n"
" sll r0, r0, 0\n"
"\n"
"L119:\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L121\n"
" sll r0, r0, 0\n"
"\n"
"L120:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L328\n"
" or a2, s5, r0\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L121:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L120\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
"L122:\n"
" beq r0, r0, L129\n"
" sll r0, r0, 0\n"
"\n"
"L123:\n"
" lw v1, float(s7)\n"
" lwu a0, 8(gp)\n"
" bne a0, v1, L126\n"
" sll r0, r0, 0\n"
"\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L125\n"
" sll r0, r0, 0\n"
"\n"
"L124:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L326\n"
" or a2, s5, r0\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lwc1 f0, 12(v1)\n"
" mfc1 a3, f0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L125:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L124\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" beq r0, r0, L129\n"
" sll r0, r0, 0\n"
"\n"
"L126:\n"
" addiu s5, r0, 0\n"
" beq r0, r0, L128\n"
" sll r0, r0, 0\n"
"\n"
"L127:\n"
" lw t9, format(s7)\n"
" daddiu a0, s7, #t\n"
" daddiu a1, fp, L325\n"
" or a2, s5, r0\n"
" dsll v1, s5, 2\n"
" daddu v1, v1, gp\n"
" lw a3, 12(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" daddiu s5, s5, 1\n"
"L128:\n"
" lw v1, 0(gp)\n"
" slt v1, s5, v1\n"
" bne v1, r0, L127\n"
" sll r0, r0, 0\n"
"\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
"L129:\n"
" or v0, gp, r0\n"
" ld ra, 0(sp)\n"
" ld fp, 8(sp)\n"
" lq gp, 32(sp)\n"
" lq s5, 16(sp)\n"
" jr ra\n"
" daddiu sp, sp, 48";
std::string type = "(function array array)";
std::string expected =
"(begin\n"
" (format #t \"[~8x] ~A~%\" arg0 (-> arg0 type))\n"
" (format #t \"~Tallocated-length: ~D~%\" (-> arg0 allocated-length))\n"
" (format #t \"~Tlength: ~D~%\" (-> arg0 length))\n"
" (format #t \" ~Tcontent-type: ~A~%\" (-> arg0 content-type))\n"
" (format #t \"~Tdata[~D]: @ #x~X~%\" (-> arg0 allocated-length) (-> arg0 data))\n"
" (cond\n"
" ((type-type? (-> arg0 content-type) integer)\n"
" (case (-> arg0 content-type symbol) \n"
" (('int32)\n"
" (dotimes (s5-0 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-0 (-> (the-as (array int32) arg0) s5-0))\n"
" )\n"
" )\n"
" (('uint32)\n"
" (dotimes (s5-1 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-1 (-> (the-as (array uint32) arg0) s5-1))\n"
" )\n"
" )\n"
" (('int64)\n"
" (dotimes (s5-2 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-2 (-> (the-as (array int64) arg0) s5-2))\n"
" )\n"
" )\n"
" (('uint64)\n"
" (dotimes (s5-3 (-> arg0 length))\n"
" (format #t \"~T [~D] #x~X~%\" s5-3 (-> (the-as (array uint64) arg0) s5-3))\n"
" )\n"
" )\n"
" (('int8)\n"
" (dotimes (s5-4 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-4 (-> (the-as (array int8) arg0) s5-4))\n"
" )\n"
" )\n"
" (('uint8)\n"
" (dotimes (s5-5 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-5 (-> (the-as (array int8) arg0) s5-5))\n"
" )\n"
" )\n"
" (('int16)\n"
" (dotimes (s5-6 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-6 (-> (the-as (array int16) arg0) s5-6))\n"
" )\n"
" )\n"
" (('uint16)\n"
" (dotimes (s5-7 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-7 (-> (the-as (array uint16) arg0) s5-7))\n"
" )\n"
" )\n"
" (('int128 'uint128)\n"
" (dotimes (s5-8 (-> arg0 length))\n"
" (format\n"
" #t\n"
" \"~T [~D] #x~X~%\"\n"
" s5-8\n"
" (-> (the-as (array uint128) arg0) s5-8)\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (dotimes (s5-9 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-9 (-> (the-as (array int32) arg0) s5-9))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" ((= (-> arg0 content-type) float)\n"
" (dotimes (s5-10 (-> arg0 length))\n"
" (format #t \"~T [~D] ~f~%\" s5-10 (-> (the-as (array float) arg0) s5-10))\n"
" )\n"
" )\n"
" (else\n"
" (dotimes (s5-11 (-> arg0 length))\n"
" (format #t \"~T [~D] ~A~%\" s5-11 (-> (the-as (array basic) arg0) s5-11))\n"
" )\n"
" )\n"
" )\n"
" arg0\n"
" )";
test_with_expr(func, type, expected, true, "array",
{{"L333", "[~8x] ~A~%"},
{"L332", "~Tallocated-length: ~D~%"},
{"L331", "~Tlength: ~D~%"},
{"L330", " ~Tcontent-type: ~A~%"},
{"L329", "~Tdata[~D]: @ #x~X~%"},
{"L328", "~T [~D] ~D~%"},
{"L327", "~T [~D] #x~X~%"},
{"L326", "~T [~D] ~f~%"},
{"L325", "~T [~D] ~A~%"}},
"[\t\t[44, \"gp\", \"(array int32)\"],\n"
"\t\t[62, \"gp\", \"(array uint32)\"],\n"
"\t\t[80, \"gp\", \"(array int64)\"],\n"
"\t\t[98, \"gp\", \"(array uint64)\"],\n"
"\t\t[115, \"gp\", \"(array int8)\"],\n"
"\t\t[132, \"gp\", \"(array int8)\"],\n"
"\t\t[150, \"gp\", \"(array int16)\"],\n"
"\t\t[168, \"gp\", \"(array uint16)\"],\n"
"\t\t[191, \"gp\", \"(array uint128)\"],\n"
"\t\t[207, \"gp\", \"(array int32)\"],\n"
"\t\t[226, \"gp\", \"(array float)\"],\n"
"\t\t[243, \"gp\", \"(array basic)\"]]");
}
TEST_F(FormRegressionTest, ExprValid) {
std::string func =
" sll r0, r0, 0\n"
"L1:\n"
" daddiu sp, sp, -80\n"
" sd ra, 0(sp)\n"
" sd fp, 8(sp)\n"
" or fp, t9, r0\n"
" sq s3, 16(sp)\n"
" sq s4, 32(sp)\n"
" sq s5, 48(sp)\n"
" sq gp, 64(sp)\n"
" or gp, a0, r0\n"
" or s3, a1, r0\n"
" or s4, a2, r0\n"
" or s5, t0, r0\n"
" daddiu v1, s7, -32768\n"
" sltu v1, gp, v1\n"
" daddiu a0, s7, 8\n"
" movn a0, s7, v1\n"
" beql s7, a0, L2\n"
" or v1, a0, r0\n"
"\n"
" lui v1, 2048\n"
" sltu a0, gp, v1\n"
" daddiu v1, s7, 8\n"
" movz v1, s7, a0\n"
"L2:\n"
" bne s7, s3, L8\n"
" sll r0, r0, 0\n"
"\n"
" andi a0, gp, 3\n"
" beq a0, r0, L4\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L3\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" daddiu a1, fp, L321\n"
" or a0, s5, r0\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L3:\n"
" or v0, s7, r0\n"
" beq r0, r0, L7\n"
" sll r0, r0, 0\n"
"\n"
"L4:\n"
" bne s7, v1, L6\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L5\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L320\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L5:\n"
" or v0, s7, r0\n"
" beq r0, r0, L7\n"
" sll r0, r0, 0\n"
"\n"
"L6:\n"
" daddiu v0, s7, #t\n"
"L7:\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L8:\n"
" beql s7, a3, L9\n"
" or a0, a3, r0\n"
"\n"
" beq s7, gp, L9\n"
" daddiu a0, s7, 8\n"
"\n"
" or a0, s7, r0\n"
"L9:\n"
" beq s7, a0, L10\n"
" sll r0, r0, 0\n"
"\n"
" daddiu v0, s7, #t\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L10:\n"
" lw a0, structure(s7)\n"
" bne s3, a0, L17\n"
" sll r0, r0, 0\n"
"\n"
" andi a0, gp, 15\n"
" beq a0, r0, L12\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L11\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L319\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L11:\n"
" or v0, s7, r0\n"
" beq r0, r0, L16\n"
" sll r0, r0, 0\n"
"\n"
"L12:\n"
" beql s7, v1, L13\n"
" daddiu v1, s7, 8\n"
"\n"
" ori v1, r0, 32768\n"
" daddu v1, v1, s7\n"
" sltu a0, gp, v1\n"
" daddiu v1, s7, 8\n"
" movz v1, s7, a0\n"
"L13:\n"
" beq s7, v1, L15\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L14\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L318\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L14:\n"
" or v0, s7, r0\n"
" beq r0, r0, L16\n"
" sll r0, r0, 0\n"
"\n"
"L15:\n"
" daddiu v0, s7, #t\n"
"L16:\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L17:\n"
" lw a0, pair(s7)\n"
" bne s3, a0, L23\n"
" sll r0, r0, 0\n"
"\n"
" addiu a0, r0, 2\n"
" andi a1, gp, 7\n"
" beq a1, a0, L19\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L18\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L319\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L18:\n"
" or v0, s7, r0\n"
" beq r0, r0, L22\n"
" sll r0, r0, 0\n"
"\n"
"L19:\n"
" bne s7, v1, L21\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L20\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L318\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L20:\n"
" or v0, s7, r0\n"
" beq r0, r0, L22\n"
" sll r0, r0, 0\n"
"\n"
"L21:\n"
" daddiu v0, s7, #t\n"
"L22:\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L23:\n"
" lw a0, binteger(s7)\n"
" bne s3, a0, L27\n"
" sll r0, r0, 0\n"
"\n"
" andi v1, gp, 7\n"
" bne v1, r0, L24\n"
" sll r0, r0, 0\n"
"\n"
" daddiu v0, s7, #t\n"
" beq r0, r0, L26\n"
" sll r0, r0, 0\n"
"\n"
"L24:\n"
" beq s7, s4, L25\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L319\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L25:\n"
" or v0, s7, r0\n"
"L26:\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L27:\n"
" addiu a0, r0, 4\n"
" andi a1, gp, 7\n"
" beq a1, a0, L29\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L28\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L319\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L28:\n"
" or v0, s7, r0\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L29:\n"
" bne s7, v1, L31\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L30\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L318\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L30:\n"
" or v0, s7, r0\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L31:\n"
" lw v1, type(s7)\n"
" dsubu v1, s3, v1\n"
" daddiu a0, s7, 8\n"
" movn a0, s7, v1\n"
" beql s7, a0, L33\n"
" or v1, a0, r0\n"
"\n"
" dsll32 v1, gp, 29\n"
" beql v1, r0, L32\n"
" lw v1, binteger(s7)\n"
"\n"
" bgtzl v1, L32\n"
" lw v1, pair(s7)\n"
"\n"
" lwu v1, -4(gp)\n"
"L32:\n"
" lw a0, type(s7)\n"
" dsubu a0, v1, a0\n"
" daddiu v1, s7, 8\n"
" movz v1, s7, a0\n"
"L33:\n"
" beq s7, v1, L36\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L35\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L317\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" dsll32 v1, gp, 29\n"
" beql v1, r0, L34\n"
" lw t1, binteger(s7)\n"
"\n"
" bgtzl v1, L34\n"
" lw t1, pair(s7)\n"
"\n"
" lwu t1, -4(gp)\n"
"L34:\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L35:\n"
" or v0, s7, r0\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L36:\n"
" lw v1, type(s7)\n"
" dsubu v1, s3, v1\n"
" daddiu a0, s7, 8\n"
" movz a0, s7, v1\n"
" beql s7, a0, L38\n"
" or v1, a0, r0\n"
"\n"
" lw t9, valid?(s7)\n"
" dsll32 v1, gp, 29\n"
" beql v1, r0, L37\n"
" lw a0, binteger(s7)\n"
"\n"
" bgtzl v1, L37\n"
" lw a0, pair(s7)\n"
"\n"
" lwu a0, -4(gp)\n"
"L37:\n"
" lw a1, type(s7)\n"
" or a2, s7, r0\n"
" daddiu a3, s7, #t\n"
" addiu t0, r0, 0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" beq s7, v0, L38\n"
" daddiu v1, s7, 8\n"
"\n"
" or v1, s7, r0\n"
"L38:\n"
" beq s7, v1, L41\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L40\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L317\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" dsll32 v1, gp, 29\n"
" beql v1, r0, L39\n"
" lw t1, binteger(s7)\n"
"\n"
" bgtzl v1, L39\n"
" lw t1, pair(s7)\n"
"\n"
" lwu t1, -4(gp)\n"
"L39:\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L40:\n"
" or v0, s7, r0\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L41:\n"
" lw t9, type-type?(s7)\n"
" dsll32 v1, gp, 29\n"
" beql v1, r0, L42\n"
" lw a0, binteger(s7)\n"
"\n"
" bgtzl v1, L42\n"
" lw a0, pair(s7)\n"
"\n"
" lwu a0, -4(gp)\n"
"L42:\n"
" or a1, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" bne s7, v0, L45\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L44\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L316\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" dsll32 v1, gp, 29\n"
" beql v1, r0, L43\n"
" lw t1, binteger(s7)\n"
"\n"
" bgtzl v1, L43\n"
" lw t1, pair(s7)\n"
"\n"
" lwu t1, -4(gp)\n"
"L43:\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L44:\n"
" or v0, s7, r0\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L45:\n"
" lw v1, symbol(s7)\n"
" bne s3, v1, L49\n"
" sll r0, r0, 0\n"
"\n"
" ori v1, r0, 32768\n"
" daddu v1, v1, s7\n"
" sltu v1, gp, v1\n"
" bne v1, r0, L47\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L46\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L315\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L46:\n"
" or v0, s7, r0\n"
" beq r0, r0, L48\n"
" sll r0, r0, 0\n"
"\n"
"L47:\n"
" daddiu v0, s7, #t\n"
"L48:\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L49:\n"
" ori v1, r0, 32768\n"
" daddu v1, v1, s7\n"
" sltu v1, gp, v1\n"
" beq v1, r0, L51\n"
" sll r0, r0, 0\n"
"\n"
" beq s7, s4, L50\n"
" or v1, s7, r0\n"
"\n"
" lw t9, format(s7)\n"
" or a0, s5, r0\n"
" daddiu a1, fp, L314\n"
" or a2, gp, r0\n"
" or a3, s4, r0\n"
" or t0, s3, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"\n"
" or v1, v0, r0\n"
"L50:\n"
" or v0, s7, r0\n"
" beq r0, r0, L52\n"
" sll r0, r0, 0\n"
"\n"
"L51:\n"
" daddiu v0, s7, #t\n"
"L52:\n"
" ld ra, 0(sp)\n"
" ld fp, 8(sp)\n"
" lq gp, 64(sp)\n"
" lq s5, 48(sp)\n"
" lq s4, 32(sp)\n"
" lq s3, 16(sp)\n"
" jr ra\n"
" daddiu sp, sp, 80\n";
std::string type = "(function object type basic basic object symbol)";
std::string expected =
"(let\n"
" ((v1-1\n"
" (and\n"
" (>= (the-as uint arg0) (the-as uint __START-OF-TABLE__))\n"
" (< (the-as uint arg0) (the-as uint #x8000000))\n"
" )\n"
" )\n"
" )\n"
" (cond\n"
" ((not arg1)\n"
" (cond\n"
" ((logtest? (the-as int arg0) 3)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object (misaligned)~%\"\n"
" arg0\n"
" arg2\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((not v1-1)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object (bad address)~%\"\n"
" arg0\n"
" arg2\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" (else\n"
" #t\n"
" )\n"
" )\n"
" )\n"
" ((and arg3 (not arg0))\n"
" #t\n"
" )\n"
" ((= arg1 structure)\n"
" (cond\n"
" ((logtest? (the-as int arg0) 15)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((or (not v1-1) (begin\n"
" (let ((v1-10 #x8000))\n"
" (.daddu v1-11 v1-10 s7-0)\n"
" )\n"
" (< (the-as uint arg0) (the-as uint v1-11))\n"
" )\n"
" )\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" (else\n"
" #t\n"
" )\n"
" )\n"
" )\n"
" ((= arg1 pair)\n"
" (cond\n"
" ((!= (logand (the-as int arg0) 7) 2)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((not v1-1)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" (else\n"
" #t\n"
" )\n"
" )\n"
" )\n"
" ((= arg1 binteger)\n"
" (cond\n"
" ((zero? (logand (the-as int arg0) 7))\n"
" #t\n"
" )\n"
" (else\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" )\n"
" )\n"
" ((!= (logand (the-as int arg0) 7) 4)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((not v1-1)\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((and (= arg1 type) (!= (rtype-of arg0) type))\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (invalid type #x~X)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" (rtype-of arg0)\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((and (!= arg1 type) (not (valid? (rtype-of arg0) type #f #t 0)))\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (invalid type #x~X)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" (rtype-of arg0)\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((not (type-type? (rtype-of arg0) arg1))\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (is type '~A' "
"instead)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" (rtype-of arg0)\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" ((= arg1 symbol)\n"
" (let ((v1-43 #x8000))\n"
" (.daddu v1-44 v1-43 s7-0)\n"
" )\n"
" (cond\n"
" ((>= (the-as uint arg0) (the-as uint v1-44))\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (not in symbol "
"table)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" (else\n"
" #t\n"
" )\n"
" )\n"
" )\n"
" ((begin\n"
" (let ((v1-47 #x8000))\n"
" (.daddu v1-48 v1-47 s7-0)\n"
" )\n"
" (< (the-as uint arg0) (the-as uint v1-48))\n"
" )\n"
" (if arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object of type '~A' (inside symbol table)~%\"\n"
" arg0\n"
" arg2\n"
" arg1\n"
" )\n"
" )\n"
" #f\n"
" )\n"
" (else\n"
" #t\n"
" )\n"
" )\n"
" )\n"
"\n";
test_with_expr(
func, type, expected, false, "",
{{"L321", "ERROR: object #x~X ~S is not a valid object (misaligned)~%"},
{"L320", "ERROR: object #x~X ~S is not a valid object (bad address)~%"},
{"L319", "ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%"},
{"L318", "ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%"},
{"L317", "ERROR: object #x~X ~S is not a valid object of type '~A' (invalid type #x~X)~%"},
{"L316",
"ERROR: object #x~X ~S is not a valid object of type '~A' (is type '~A' instead)~%"},
{"L315", "ERROR: object #x~X ~S is not a valid object of type '~A' (not in symbol table)~%"},
{"L314",
"ERROR: object #x~X ~S is not a valid object of type '~A' (inside symbol table)~%"}});
}
TEST_F(FormRegressionTest, ExprStringToInt) {
std::string func =
" sll r0, r0, 0\n"
"L14:\n"
" daddiu a0, a0, 4\n"
" addiu v0, r0, 0\n"
" or v1, s7, r0\n"
" addiu a1, r0, 35\n"
" lbu a2, 0(a0)\n"
" bne a2, a1, L33\n"
" sll r0, r0, 0\n"
" daddiu a0, a0, 1\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -120\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" bnel s7, a2, L15\n"
" or a1, a2, r0\n"
" lbu a1, 0(a0)\n"
" daddiu a2, a1, -88\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L15:\n"
" beq s7, a1, L27\n"
" or a1, s7, r0\n"
" daddiu a0, a0, 1\n"
" addiu a1, r0, 45\n"
" lbu a2, 1(a0)\n"
" bne a2, a1, L16\n"
" or a1, s7, r0\n"
" daddiu v1, s7, #t\n"
" daddiu a0, a0, 1\n"
" or a1, a0, r0\n"
"L16:\n"
" beq r0, r0, L23\n"
" sll r0, r0, 0\n"
"\n"
"L17:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 65\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L18\n"
" or a1, a2, r0\n"
" addiu a1, r0, 70\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L18:\n"
" beq s7, a1, L19\n"
" sll r0, r0, 0\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -55\n"
" dsll a2, v0, 4\n"
" daddu v0, a1, a2\n"
" or a1, v0, r0\n"
" beq r0, r0, L22\n"
" sll r0, r0, 0\n"
"L19:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 97\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L20\n"
" or a1, a2, r0\n"
" addiu a1, r0, 102\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L20:\n"
" beq s7, a1, L21\n"
" sll r0, r0, 0\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -87\n"
" dsll a2, v0, 4\n"
" daddu v0, a1, a2\n"
" or a1, v0, r0\n"
" beq r0, r0, L22\n"
" sll r0, r0, 0\n"
"L21:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -48\n"
" dsll a2, v0, 4\n"
" daddu v0, a1, a2\n"
" or a1, v0, r0\n"
"L22:\n"
" daddiu a0, a0, 1\n"
"L23:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 48\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L24\n"
" or a1, a2, r0\n"
" addiu a1, r0, 57\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L24:\n"
" bnel s7, a1, L26\n"
" or a1, a1, r0\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 65\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L25\n"
" or a1, a2, r0\n"
" addiu a1, r0, 70\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L25:\n"
" bnel s7, a1, L26\n"
" or a1, a1, r0\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 97\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L26\n"
" or a1, a2, r0\n"
" addiu a1, r0, 102\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L26:\n"
" bne s7, a1, L17\n"
" sll r0, r0, 0\n"
" or a1, s7, r0\n"
" beq r0, r0, L32\n"
" sll r0, r0, 0\n"
"L27:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -98\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" bnel s7, a2, L28\n"
" or a1, a2, r0\n"
" lbu a1, 0(a0)\n"
" daddiu a2, a1, -66\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L28:\n"
" beq s7, a1, L32\n"
" or a1, s7, r0\n"
" daddiu a0, a0, 1\n"
" beq r0, r0, L30\n"
" sll r0, r0, 0\n"
"\n"
"L29:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -48\n"
" dsll a2, v0, 1\n"
" daddu v0, a1, a2\n"
" daddiu a0, a0, 1\n"
"L30:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 48\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L31\n"
" or a1, a2, r0\n"
" addiu a1, r0, 49\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L31:\n"
" bne s7, a1, L29\n"
" sll r0, r0, 0\n"
" or a1, s7, r0\n"
"L32:\n"
" beq r0, r0, L38\n"
" sll r0, r0, 0\n"
"L33:\n"
" addiu a1, r0, 45\n"
" lbu a2, 1(a0)\n"
" bne a2, a1, L34\n"
" or a1, s7, r0\n"
" daddiu v1, s7, #t\n"
" daddiu a0, a0, 1\n"
" or a1, a0, r0\n"
"L34:\n"
" beq r0, r0, L36\n"
" sll r0, r0, 0\n"
"L35:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -48\n"
" addiu a2, r0, 10\n"
" mult3 a2, a2, v0\n"
" daddu v0, a1, a2\n"
" daddiu a0, a0, 1\n"
"L36:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 48\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L37\n"
" or a1, a2, r0\n"
" addiu a1, r0, 57\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L37:\n"
" bne s7, a1, L35\n"
" sll r0, r0, 0\n"
" or a0, s7, r0\n"
"L38:\n"
" beq s7, v1, L39\n"
" sll r0, r0, 0\n"
" dsubu v0, r0, v0\n"
" beq r0, r0, L39\n"
" sll r0, r0, 0\n"
"L39:\n"
" jr ra\n"
" daddu sp, sp, r0";
std::string type = "(function string int)";
std::string expected =
"(defun test-function ((arg0 string))\n"
" (let ((a0-1 (-> arg0 data))\n"
" (v0-0 0)\n"
" (v1-0 #f)\n"
" )\n"
" (cond\n"
" ((= (-> a0-1 0) 35)\n"
" (let ((a0-2 (&-> a0-1 1)))\n"
" (cond\n"
" ((or (= (-> a0-2 0) 120) (= (-> a0-2 0) 88))\n"
" (let ((a0-3 (&-> a0-2 1)))\n"
" (when (= (-> a0-3 1) 45)\n"
" (set! v1-0 #t)\n"
" (set! a0-3 (&-> a0-3 1))\n"
" )\n"
" (while\n"
" (or\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 48))\n"
" (>= (the-as uint 57) (-> a0-3 0))\n"
" )\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 65))\n"
" (>= (the-as uint 70) (-> a0-3 0))\n"
" )\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" )\n"
" (cond\n"
" ((and\n"
" (>= (-> a0-3 0) (the-as uint 65))\n"
" (>= (the-as uint 70) (-> a0-3 0))\n"
" )\n"
" (set! v0-0 (the-as int (+ (-> a0-3 0) -55 (* v0-0 16))))\n"
" )\n"
" ((and\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" (set! v0-0 (the-as int (+ (-> a0-3 0) -87 (* v0-0 16))))\n"
" )\n"
" (else\n"
" (set! v0-0 (the-as int (+ (-> a0-3 0) -48 (* v0-0 16))))\n"
" )\n"
" )\n"
" (set! a0-3 (&-> a0-3 1))\n"
" )\n"
" )\n"
" )\n"
" ((or (= (-> a0-2 0) 98) (= (-> a0-2 0) 66))\n"
" (let ((a0-4 (&-> a0-2 1)))\n"
" (while\n"
" (and\n"
" (>= (-> a0-4 0) (the-as uint 48))\n"
" (>= (the-as uint 49) (-> a0-4 0))\n"
" )\n"
" (set! v0-0 (the-as int (+ (-> a0-4 0) -48 (* v0-0 2))))\n"
" (set! a0-4 (&-> a0-4 1))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (when (= (-> a0-1 1) 45)\n"
" (set! v1-0 #t)\n"
" (set! a0-1 (&-> a0-1 1))\n"
" )\n"
" (while\n"
" (and (>= (-> a0-1 0) (the-as uint 48)) (>= (the-as uint 57) (-> a0-1 0)))\n"
" (set! v0-0 (the-as int (+ (-> a0-1 0) -48 (* 10 v0-0))))\n"
" (set! a0-1 (&-> a0-1 1))\n"
" )\n"
" )\n"
" )\n"
" (cond\n"
" (v1-0\n"
" (- v0-0)\n"
" )\n"
" (else\n"
" (empty)\n"
" v0-0\n"
" )\n"
" )\n"
" )\n"
" )";
test_final_function(func, type, expected);
}
TEST_F(FormRegressionTest, Method19ResTag) {
std::string func =
"sll r0, r0, 0\n"
"L101:\n"
" daddiu sp, sp, -16\n"
" sd fp, 8(sp)\n"
" or fp, t9, r0\n"
" daddiu v1, s7, id\n"
" dsubu v1, a1, v1\n"
" daddiu t0, s7, 8\n"
" movn t0, s7, v1\n"
" bnel s7, t0, L102\n"
" or v1, t0, r0\n"
"\n"
" daddiu v1, s7, aid\n"
" dsubu v1, a1, v1\n"
" daddiu t0, s7, 8\n"
" movn t0, s7, v1\n"
" bnel s7, t0, L102\n"
" or v1, t0, r0\n"
"\n"
" daddiu v1, s7, trans\n"
" dsubu v1, a1, v1\n"
" daddiu t0, s7, 8\n"
" movn t0, s7, v1\n"
" bnel s7, t0, L102\n"
" or v1, t0, r0\n"
"\n"
" daddiu v1, s7, rot\n"
" dsubu v1, a1, v1\n"
" daddiu t0, s7, 8\n"
" movn t0, s7, v1\n"
" bnel s7, t0, L102\n"
" or v1, t0, r0\n"
"\n"
" daddiu v1, s7, nav-mesh\n"
" dsubu v1, a1, v1\n"
" daddiu t0, s7, 8\n"
" movn t0, s7, v1\n"
" bnel s7, t0, L102\n"
" or v1, t0, r0\n"
"\n"
" daddiu v1, s7, process-type\n"
" dsubu v1, a1, v1\n"
" daddiu t0, s7, 8\n"
" movn t0, s7, v1\n"
" bnel s7, t0, L102\n"
" or v1, t0, r0\n"
"\n"
" daddiu v1, s7, task\n"
" dsubu t0, a1, v1\n"
" daddiu v1, s7, 8\n"
" movn v1, s7, t0\n"
"L102:\n"
" beq s7, v1, L103\n"
" or v1, s7, r0\n"
"\n"
" sd r0, 2(r0)\n"
" or v1, r0, r0\n"
"L103:\n"
" beql s7, a0, L104\n"
" daddiu v1, s7, 8\n"
"\n"
" beql a0, r0, L104\n"
" daddiu v1, s7, 8\n"
"\n"
" lw v1, 0(a0)\n"
" slt t0, r0, v1\n"
" daddiu v1, s7, 8\n"
" movn v1, s7, t0\n"
"L104:\n"
" beq s7, v1, L105\n"
" or v1, s7, r0\n"
"\n"
" addiu v0, r0, -1\n"
" beq r0, r0, L129\n"
" sll r0, r0, 0\n"
"\n"
" or v1, r0, r0\n"
"L105:\n"
" addiu v1, r0, -1\n"
" addiu t0, r0, -1\n"
" addiu t1, r0, -1\n"
" ori t2, r0, 65336\n"
" daddu t2, t2, a1\n"
"\n"
" lwu t2, 0(t2)\n"
" daddiu t2, t2, 4\n"
" ld t2, 0(t2)\n"
"\n"
" lw t3, 0(a0)\n"
" daddiu t3, t3, -1\n"
" addiu t4, r0, 0\n"
" beq r0, r0, L109\n"
" sll r0, r0, 0\n"
"\n"
"L106:\n"
" dsubu t5, t3, t4\n"
"\n"
" dsra t5, t5, 1\n"
" daddu t5, t4, t5\n"
" ori t6, r0, 65336\n"
" lwu t7, 24(a0)\n"
" dsll t8, t5, 4\n"
" daddu t7, t7, t8\n"
"\n"
" lq t7, 0(t7)\n"
" dsll32 t7, t7, 0\n"
" dsrl32 t7, t7, 0\n"
" daddu t6, t6, t7\n"
"\n"
" lwu t6, 0(t6)\n"
" daddiu t6, t6, 4\n"
" ld t6, 0(t6)\n"
"\n"
" dsubu t6, t2, t6\n"
" bne t6, r0, L107\n"
" sll r0, r0, 0\n"
"\n"
" or t4, t5, r0\n"
" beq r0, r0, L110\n"
" sll r0, r0, 0\n"
"\n"
" or v1, r0, r0\n"
" beq r0, r0, L109\n"
" sll r0, r0, 0\n"
"\n"
"L107:\n"
" slt t6, t6, r0\n"
" beq t6, r0, L108\n"
" sll r0, r0, 0\n"
"\n"
" daddiu t3, t5, -1\n"
" or t5, t3, r0\n"
" beq r0, r0, L109\n"
" sll r0, r0, 0\n"
"\n"
"L108:\n"
" daddiu t4, t5, 1\n"
" or t5, t4, r0\n"
"L109:\n"
" slt t5, t3, t4\n"
"\n"
" beq t5, r0, L106\n"
" sll r0, r0, 0\n"
"\n"
" or t3, s7, r0\n"
" addiu t4, r0, -1\n"
"L110:\n"
" slt t3, t4, r0\n"
" beq t3, r0, L111\n"
" or t3, s7, r0\n"
"\n"
" or v0, t4, r0\n"
" beq r0, r0, L129\n"
" sll r0, r0, 0\n"
"\n"
" or v1, r0, r0\n"
"L111:\n"
" beq r0, r0, L113\n"
" sll r0, r0, 0\n"
"\n"
"L112:\n"
" daddiu t4, t4, -1\n"
"L113:\n"
" slt t3, r0, t4\n"
" daddiu t5, s7, 8\n"
" movz t5, s7, t3\n"
" beql s7, t5, L114\n"
" or t3, t5, r0\n"
"\n"
" ori t3, r0, 65336\n"
" lwu t5, 24(a0)\n"
" daddiu t6, t4, -1\n"
" dsll t6, t6, 4\n"
" daddu t5, t5, t6\n"
"\n"
" lq t5, 0(t5)\n"
" dsll32 t5, t5, 0\n"
" dsrl32 t5, t5, 0\n"
" daddu t3, t3, t5\n"
"\n"
" lwu t3, 0(t3)\n"
" daddiu t3, t3, 4\n"
" ld t3, 0(t3)\n"
"\n"
" dsubu t5, t2, t3\n"
" daddiu t3, s7, 8\n"
" movn t3, s7, t5\n"
"L114:\n"
" bne s7, t3, L112\n"
" sll r0, r0, 0\n"
"\n"
" or t3, s7, r0\n"
" daddiu t3, s7, base\n"
" bne a2, t3, L115\n"
" or t3, s7, r0\n"
"\n"
" or t0, t4, r0\n"
" or v1, t4, r0\n"
" or a0, s7, r0\n"
" beq r0, r0, L128\n"
" sll r0, r0, 0\n"
"\n"
" or v1, r0, r0\n"
"L115:\n"
" or t3, t4, r0\n"
" dsll t4, t4, 4\n"
" daddu t4, r0, t4\n"
" lwu t5, 24(a0)\n"
" daddu t4, t4, t5\n"
"\n"
" beq r0, r0, L126\n"
" sll r0, r0, 0\n"
"\n"
"L116:\n"
" lq t5, 0(t4)\n"
" dsll32 t5, t5, 0\n"
" dsrl32 t5, t5, 0\n"
" beq a1, t5, L117\n"
" or t5, s7, r0\n"
"\n"
" or t5, s7, r0\n"
" beq r0, r0, L125\n"
" sll r0, r0, 0\n"
"\n"
"L117:\n"
" lq t5, 0(t4)\n"
" dsra32 t5, t5, 0\n"
" mtc1 f0, t5\n"
" mtc1 f1, a3\n"
" c.eq.s f0, f1\n"
" bc1f L118\n"
" or t5, s7, r0\n"
"\n"
" or t0, t3, r0\n"
" or v1, t3, r0\n"
" or a0, s7, r0\n"
" beq r0, r0, L128\n"
" sll r0, r0, 0\n"
"\n"
" or v1, r0, r0\n"
" beq r0, r0, L125\n"
" sll r0, r0, 0\n"
"\n"
"L118:\n"
" mtc1 f0, a3\n"
" lq t5, 0(t4)\n"
" dsra32 t5, t5, 0\n"
" mtc1 f1, t5\n"
" c.lt.s f0, f1\n"
" bc1f L119\n"
" daddiu t5, s7, 8\n"
"\n"
" or t5, s7, r0\n"
"L119:\n"
" beql s7, t5, L120\n"
" or t5, t5, r0\n"
"\n"
" daddiu t5, s7, exact\n"
" dsubu t6, a2, t5\n"
" daddiu t5, s7, 8\n"
" movz t5, s7, t6\n"
"L120:\n"
" beq s7, t5, L122\n"
" or t5, s7, r0\n"
"\n"
" or t0, t3, r0\n"
" or v1, t3, r0\n"
" lq t5, 0(t4)\n"
" dsra32 t5, t5, 0\n"
" mtc1 f0, t5\n"
//" lwc1 f1, L147(fp)\n"
" mtc1 f1, r0\n"
" c.eq.s f0, f1\n"
" bc1f L121\n"
" or t5, s7, r0\n"
"\n"
" or t1, t3, r0\n"
" or t5, t1, r0\n"
"L121:\n"
" beq r0, r0, L125\n"
" sll r0, r0, 0\n"
"\n"
"L122:\n"
" mtc1 f0, a3\n"
" lq t5, 0(t4)\n"
" dsra32 t5, t5, 0\n"
" mtc1 f1, t5\n"
" c.lt.s f0, f1\n"
" bc1f L125\n"
" or t5, s7, r0\n"
"\n"
" dsubu a0, t0, t1\n"
"\n"
" daddiu a1, s7, 8\n"
" movz a1, s7, a0\n"
" beql s7, a1, L123\n"
" or a0, a1, r0\n"
"\n"
" daddiu a0, s7, interp\n"
" dsubu a1, a2, a0\n"
" daddiu a0, s7, 8\n"
" movn a0, s7, a1\n"
"L123:\n"
" beq s7, a0, L124\n"
" or a0, s7, r0\n"
"\n"
" or v1, t3, r0\n"
" or a0, v1, r0\n"
"L124:\n"
" or a0, s7, r0\n"
" beq r0, r0, L128\n"
" sll r0, r0, 0\n"
"\n"
" or v1, r0, r0\n"
"L125:\n"
" daddiu t3, t3, 1\n"
" daddiu t4, t4, 16\n"
"L126:\n"
" lw t5, 0(a0)\n"
" slt t5, t3, t5\n"
" daddiu t6, s7, 8\n"
" movn t6, s7, t5\n"
" bnel s7, t6, L127\n"
" or t5, t6, r0\n"
"\n"
" ori t5, r0, 65336\n"
" lq t6, 0(t4)\n"
" dsll32 t6, t6, 0\n"
" dsrl32 t6, t6, 0\n"
" daddu t5, t5, t6\n"
"\n"
" lwu t5, 0(t5)\n"
" daddiu t5, t5, 4\n"
" ld t5, 0(t5)\n"
"\n"
" sltu t6, t2, t5\n"
" daddiu t5, s7, 8\n"
" movz t5, s7, t6\n"
"L127:\n"
" beq s7, t5, L116\n"
" sll r0, r0, 0\n"
"\n"
" or a0, s7, r0\n"
" or a0, s7, r0\n"
"L128:\n"
//" ld a0, L150(fp)\n"
" or a0, r0, r0\n"
" and a0, a0, t0\n"
" dsll32 v1, v1, 0\n"
" or v0, a0, v1\n"
"\n"
"L129:\n"
" ld fp, 8(sp)\n"
" jr ra\n"
" daddiu sp, sp, 16";
std::string type = "(function res-lump symbol symbol float int)";
std::string expected =
"(begin\n"
" (when\n"
" (or\n"
" (= arg1 'id)\n"
" (= arg1 'aid)\n"
" (= arg1 'trans)\n"
" (= arg1 'rot)\n"
" (= arg1 'nav-mesh)\n"
" (= arg1 'process-type)\n"
" (= arg1 'task)\n"
" )\n"
" (crash!)\n"
" 0\n"
" )\n"
" (if (or (not arg0) (zero? arg0) (<= (-> arg0 length) 0))\n"
" (return -1)\n"
" )\n"
" (let ((v1-14 -1)\n"
" (t0-6 -1)\n"
" )\n"
" (let ((t1-0 -1)\n"
" (t2-4 (-> (the-as (pointer uint64) (-> (symbol->string arg1) data)) 0))\n"
" )\n"
" (let ((t3-1 (+ (-> arg0 length) -1))\n"
" (t4-0 0)\n"
" )\n"
" (while (>= t3-1 t4-0)\n"
" (let* ((t5-2 (+ t4-0 (/ (- t3-1 t4-0) 2)))\n"
" (t6-5\n"
" (-\n"
" t2-4\n"
" (->\n"
" (the-as\n"
" (pointer uint64)\n"
" (-> (symbol->string (-> arg0 tag t5-2 name)) data)\n"
" )\n"
" 0\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (cond\n"
" ((zero? t6-5)\n"
" (set! t4-1 t5-2)\n"
" (goto cfg-32)\n"
" )\n"
" ((< (the-as int t6-5) 0)\n"
" (set! t3-1 (+ t5-2 -1))\n"
" )\n"
" (else\n"
" (set! t4-0 (+ t5-2 1))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (set! t4-1 -1)\n"
" (label cfg-32)\n"
" (if (< t4-1 0)\n"
" (return t4-1)\n"
" )\n"
" (while\n"
" (and\n"
" (> t4-1 0)\n"
" (=\n"
" t2-4\n"
" (->\n"
" (the-as\n"
" (pointer uint64)\n"
" (-> (symbol->string (-> arg0 tag (+ t4-1 -1) name)) data)\n"
" )\n"
" 0\n"
" )\n"
" )\n"
" )\n"
" (+! t4-1 -1)\n"
" )\n"
" (when (= arg2 'base)\n"
" (set! t0-6 t4-1)\n"
" (set! v1-14 t4-1)\n"
" (goto cfg-73)\n"
" )\n"
" (let ((t3-13 t4-1)\n"
" (t4-4 (&-> (-> arg0 tag) t4-1))\n"
" )\n"
" (while\n"
" (not\n"
" (or\n"
" (>= t3-13 (-> arg0 length))\n"
" (<\n"
" t2-4\n"
" (->\n"
" (the-as (pointer uint64) (-> (symbol->string (-> t4-4 0 name)) data))\n"
" 0\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (cond\n"
" ((!= arg1 (-> t4-4 0 name))\n"
" )\n"
" ((= (-> t4-4 0 key-frame) arg3)\n"
" (set! t0-6 t3-13)\n"
" (set! v1-14 t3-13)\n"
" (goto cfg-73)\n"
" )\n"
" ((and (>= arg3 (-> t4-4 0 key-frame)) (!= arg2 'exact))\n"
" (set! t0-6 t3-13)\n"
" (set! v1-14 t3-13)\n"
" (if (= (-> t4-4 0 key-frame) 0.0)\n"
" (set! t1-0 t3-13)\n"
" )\n"
" )\n"
" ((< arg3 (-> t4-4 0 key-frame))\n"
" (if (and (!= t0-6 t1-0) (= arg2 'interp))\n"
" (set! v1-14 t3-13)\n"
" )\n"
" (goto cfg-73)\n"
" )\n"
" )\n"
" (+! t3-13 1)\n"
" (set! t4-4 (&-> t4-4 1))\n"
" )\n"
" )\n"
" )\n"
" (label cfg-73)\n"
" (logior (logand 0 t0-6) (shl v1-14 32))\n"
" )\n"
" )";
test_with_expr(func, type, expected, false, "", {},
"[\n"
" [46, \"t2\", \"(pointer uint64)\"],\n"
" [100, \"t3\", \"(pointer uint64)\"],\n"
" [184, \"t5\", \"(pointer uint64)\"],\n"
" [64, \"t6\", \"(pointer uint64)\"]\n"
" ]");
}