jak-project/test/decompiler/test_FormExpressionBuildLong.cpp
2021-02-11 14:35:28 -05:00

2241 lines
61 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 (quote #t) \"#(\")\n"
" (cond\n"
" ((type-type? (-> arg0 content-type) integer)\n"
" (set! v1-1 (-> arg0 content-type symbol))\n"
" (cond\n"
" ((= v1-1 (quote int32))\n"
" (set! s5-0 0)\n"
" (while\n"
" (< s5-0 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-0) \"~D\" \" ~D\")\n"
" (-> (the-as (array int32) arg0) s5-0)\n"
" )\n"
" (set! s5-0 (+ s5-0 1))\n"
" )\n"
" (set! v1-5 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint32))\n"
" (set! s5-1 0)\n"
" (while\n"
" (< s5-1 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-1) \"~D\" \" ~D\")\n"
" (-> (the-as (array uint32) arg0) s5-1)\n"
" )\n"
" (set! s5-1 (+ s5-1 1))\n"
" )\n"
" (set! v1-10 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote int64))\n"
" (set! s5-2 0)\n"
" (while\n"
" (< s5-2 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-2) \"~D\" \" ~D\")\n"
" (-> (the-as (array int64) arg0) s5-2)\n"
" )\n"
" (set! s5-2 (+ s5-2 1))\n"
" )\n"
" (set! v1-15 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint64))\n"
" (set! s5-3 0)\n"
" (while\n"
" (< s5-3 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-3) \"#x~X\" \" #x~X\")\n"
" (-> (the-as (array uint64) arg0) s5-3)\n"
" )\n"
" (set! s5-3 (+ s5-3 1))\n"
" )\n"
" (set! v1-20 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote int8))\n"
" (set! s5-4 0)\n"
" (while\n"
" (< s5-4 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-4) \"~D\" \" ~D\")\n"
" (-> (the-as (array int8) arg0) s5-4)\n"
" )\n"
" (set! s5-4 (+ s5-4 1))\n"
" )\n"
" (set! v1-24 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint8))\n"
" (set! s5-5 0)\n"
" (while\n"
" (< s5-5 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-5) \"~D\" \" ~D\")\n"
" (-> (the-as (array uint8) arg0) s5-5)\n"
" )\n"
" (set! s5-5 (+ s5-5 1))\n"
" )\n"
" (set! v1-28 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote int16))\n"
" (set! s5-6 0)\n"
" (while\n"
" (< s5-6 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-6) \"~D\" \" ~D\")\n"
" (-> (the-as (array int16) arg0) s5-6)\n"
" )\n"
" (set! s5-6 (+ s5-6 1))\n"
" )\n"
" (set! v1-33 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint16))\n"
" (set! s5-7 0)\n"
" (while\n"
" (< s5-7 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-7) \"~D\" \" ~D\")\n"
" (-> (the-as (array uint16) arg0) s5-7)\n"
" )\n"
" (set! s5-7 (+ s5-7 1))\n"
" )\n"
" (set! v1-38 (quote #f))\n"
" (quote #f)\n"
" )\n"
" (else\n"
" (set! v1-40 (or (= v1-1 (quote uint128)) (= v1-1 (quote int128))))\n"
" (cond\n"
" (v1-40\n"
" (set! s5-8 0)\n"
" (while\n"
" (< s5-8 (-> arg0 length))\n"
" (set! t9-10 format)\n"
" (set! a0-21 (quote #t))\n"
" (set! a1-11 (if (zero? s5-8) \"#x~X\" \" #x~X\"))\n"
" (set!\n"
" v1-42\n"
" (+ (shl s5-8 4) (the-as int (the-as (array uint128) arg0)))\n"
" )\n"
" (.lq a2-8 12 v1-42)\n"
" (t9-10 a0-21 a1-11 a2-8)\n"
" (set! s5-8 (+ s5-8 1))\n"
" )\n"
" (set! v1-44 (quote #f))\n"
" (quote #f)\n"
" )\n"
" (else\n"
" (set! s5-9 0)\n"
" (while\n"
" (< s5-9 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" (if (zero? s5-9) \"~D\" \" ~D\")\n"
" (-> (the-as (array int32) arg0) s5-9)\n"
" )\n"
" (set! s5-9 (+ s5-9 1))\n"
" )\n"
" (set! v1-49 (quote #f))\n"
" (quote #f)\n"
" )\n"
" )\n"
" v1-39\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (cond\n"
" ((= (-> arg0 content-type) float)\n"
" (set! s5-10 0)\n"
" (while\n"
" (< s5-10 (-> arg0 length))\n"
" (if\n"
" (zero? s5-10)\n"
" (format (quote #t) \"~f\" (-> (the-as (array float) arg0) s5-10))\n"
" (format (quote #t) \" ~f\" (-> (the-as (array float) arg0) s5-10))\n"
" )\n"
" (set! s5-10 (+ s5-10 1))\n"
" )\n"
" (set! v1-59 (quote #f))\n"
" (quote #f)\n"
" )\n"
" (else\n"
" (set! s5-11 0)\n"
" (while\n"
" (< s5-11 (-> arg0 length))\n"
" (if\n"
" (zero? s5-11)\n"
" (format (quote #t) \"~A\" (-> (the-as (array basic) arg0) s5-11))\n"
" (format (quote #t) \" ~A\" (-> (the-as (array basic) arg0) s5-11))\n"
" )\n"
" (set! s5-11 (+ s5-11 1))\n"
" )\n"
" (set! v1-68 (quote #f))\n"
" (quote #f)\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (format (quote #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", ")"}},
parse_hint_json("["
"\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 (quote #t) \"[~8x] ~A~%\" arg0 (-> arg0 type))\n"
" (format (quote #t) \"~Tallocated-length: ~D~%\" (-> arg0 allocated-length))\n"
" (format (quote #t) \"~Tlength: ~D~%\" (-> arg0 length))\n"
" (format (quote #t) \" ~Tcontent-type: ~A~%\" (-> arg0 content-type))\n"
" (format\n"
" (quote #t)\n"
" \"~Tdata[~D]: @ #x~X~%\"\n"
" (-> arg0 allocated-length)\n"
" (-> arg0 data)\n"
" )\n"
" (cond\n"
" ((type-type? (-> arg0 content-type) integer)\n"
" (set! v1-1 (-> arg0 content-type symbol))\n"
" (cond\n"
" ((= v1-1 (quote int32))\n"
" (set! s5-0 0)\n"
" (while\n"
" (< s5-0 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-0\n"
" (-> (the-as (array int32) arg0) s5-0)\n"
" )\n"
" (set! s5-0 (+ s5-0 1))\n"
" )\n"
" (set! v1-5 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint32))\n"
" (set! s5-1 0)\n"
" (while\n"
" (< s5-1 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-1\n"
" (-> (the-as (array uint32) arg0) s5-1)\n"
" )\n"
" (set! s5-1 (+ s5-1 1))\n"
" )\n"
" (set! v1-10 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote int64))\n"
" (set! s5-2 0)\n"
" (while\n"
" (< s5-2 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-2\n"
" (-> (the-as (array int64) arg0) s5-2)\n"
" )\n"
" (set! s5-2 (+ s5-2 1))\n"
" )\n"
" (set! v1-15 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint64))\n"
" (set! s5-3 0)\n"
" (while\n"
" (< s5-3 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] #x~X~%\"\n"
" s5-3\n"
" (-> (the-as (array uint64) arg0) s5-3)\n"
" )\n"
" (set! s5-3 (+ s5-3 1))\n"
" )\n"
" (set! v1-20 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote int8))\n"
" (set! s5-4 0)\n"
" (while\n"
" (< s5-4 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-4\n"
" (-> (the-as (array int8) arg0) s5-4)\n"
" )\n"
" (set! s5-4 (+ s5-4 1))\n"
" )\n"
" (set! v1-24 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint8))\n"
" (set! s5-5 0)\n"
" (while\n"
" (< s5-5 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-5\n"
" (-> (the-as (array int8) arg0) s5-5)\n"
" )\n"
" (set! s5-5 (+ s5-5 1))\n"
" )\n"
" (set! v1-28 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote int16))\n"
" (set! s5-6 0)\n"
" (while\n"
" (< s5-6 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-6\n"
" (-> (the-as (array int16) arg0) s5-6)\n"
" )\n"
" (set! s5-6 (+ s5-6 1))\n"
" )\n"
" (set! v1-33 (quote #f))\n"
" (quote #f)\n"
" )\n"
" ((= v1-1 (quote uint16))\n"
" (set! s5-7 0)\n"
" (while\n"
" (< s5-7 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~D~%\"\n"
" s5-7\n"
" (-> (the-as (array uint16) arg0) s5-7)\n"
" )\n"
" (set! s5-7 (+ s5-7 1))\n"
" )\n"
" (set! v1-38 (quote #f))\n"
" (quote #f)\n"
" )\n"
" (else\n"
" (set! v1-40 (or (= v1-1 (quote int128)) (= v1-1 (quote uint128))))\n"
" (cond\n"
" (v1-40\n"
" (set! s5-8 0)\n"
" (while\n"
" (< s5-8 (-> arg0 length))\n"
" (set! t9-14 format)\n"
" (set! a0-25 (quote #t))\n"
" (set! a1-15 \"~T [~D] #x~X~%\")\n"
" (set! a2-13 s5-8)\n"
" (set!\n"
" v1-42\n"
" (+ (shl s5-8 4) (the-as int (the-as (array uint128) arg0)))\n"
" )\n"
" (.lq a3-10 12 v1-42)\n"
" (t9-14 a0-25 a1-15 a2-13 a3-10)\n"
" (set! s5-8 (+ s5-8 1))\n"
" )\n"
" (set! v1-44 (quote #f))\n"
" (quote #f)\n"
" )\n"
" (else\n"
" (set! s5-9 0)\n"
" (while\n"
" (< s5-9 (-> arg0 length))\n"
" (format (quote #t) \"~T [~D] ~D~%\" s5-9 (-> arg0 s5-9))\n"
" (set! s5-9 (+ s5-9 1))\n"
" )\n"
" (set! v1-49 (quote #f))\n"
" (quote #f)\n"
" )\n"
" )\n"
" v1-39\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (cond\n"
" ((= (-> arg0 content-type) float)\n"
" (set! s5-10 0)\n"
" (while\n"
" (< s5-10 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~f~%\"\n"
" s5-10\n"
" (-> (the-as (array float) arg0) s5-10)\n"
" )\n"
" (set! s5-10 (+ s5-10 1))\n"
" )\n"
" (set! v1-55 (quote #f))\n"
" (quote #f)\n"
" )\n"
" (else\n"
" (set! s5-11 0)\n"
" (while\n"
" (< s5-11 (-> arg0 length))\n"
" (format\n"
" (quote #t)\n"
" \"~T [~D] ~A~%\"\n"
" s5-11\n"
" (-> (the-as (array basic) arg0) s5-11)\n"
" )\n"
" (set! s5-11 (+ s5-11 1))\n"
" )\n"
" (set! v1-60 (quote #f))\n"
" (quote #f)\n"
" )\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~%"}},
parse_hint_json("[\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[204, [\"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 =
"(begin\n"
" (set!\n"
" v1-1\n"
" (and\n"
" (>= (the-as uint arg0) (the-as uint __START-OF-TABLE__))\n"
" (< (the-as uint arg0) (the-as uint 134217728))\n"
" )\n"
" )\n"
" (cond\n"
" ((not arg1)\n"
" (cond\n"
" ((nonzero? (logand (the-as int arg0) 3))\n"
" (if\n"
" arg2\n"
" (format\n"
" arg4\n"
" \"ERROR: object #x~X ~S is not a valid object (misaligned)~%\"\n"
" arg0\n"
" arg2\n"
" )\n"
" )\n"
" (quote #f)\n"
" )\n"
" ((not v1-1)\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" (else (quote #t))\n"
" )\n"
" )\n"
" ((and arg3 (not arg0)) (quote #t))\n"
" (else\n"
" (cond\n"
" ((= arg1 structure)\n"
" (cond\n"
" ((nonzero? (logand (the-as int arg0) 15))\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" ((or\n"
" (not v1-1)\n"
" (begin\n"
" (set! v1-10 32768)\n"
" (.daddu v1-11 v1-10 s7-0)\n"
" (< (the-as uint arg0) (the-as uint v1-11))\n"
" )\n"
" )\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" (else (quote #t))\n"
" )\n"
" )\n"
" ((= arg1 pair)\n"
" (cond\n"
" ((!= (logand (the-as int arg0) 7) 2)\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" ((not v1-1)\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" (else (quote #t))\n"
" )\n"
" )\n"
" ((= arg1 binteger)\n"
" (cond\n"
" ((zero? (logand (the-as int arg0) 7)) (quote #t))\n"
" (else\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" )\n"
" )\n"
" ((!= (logand (the-as int arg0) 7) 4)\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" ((not v1-1)\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" ((and (= arg1 type) (!= (rtype-of arg0) type))\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" (else\n"
// todo - why isn't this compacted?
" (set!\n"
" v1-33\n"
" (and\n"
" (!= arg1 type)\n"
" (not (valid? (rtype-of arg0) type (quote #f) (quote #t) 0))\n"
" )\n"
" )\n"
" (cond\n"
" (v1-33\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" ((not (type-type? (rtype-of arg0) arg1))\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" ((= arg1 symbol)\n"
" (set! v1-43 32768)\n"
" (.daddu v1-44 v1-43 s7-0)\n"
" (cond\n"
" ((>= (the-as uint arg0) (the-as uint v1-44))\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" (else (quote #t))\n"
" )\n"
" )\n"
" ((begin\n"
" (set! v1-47 32768)\n"
" (.daddu v1-48 v1-47 s7-0)\n"
" (< (the-as uint arg0) (the-as uint v1-48))\n"
" )\n"
" (if\n"
" 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"
" (quote #f)\n"
" )\n"
" (else (quote #t))\n"
" )\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)~%"}});
}