#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" " (set! gp-0 a0-0)\n" " (format (quote #t) L342)\n" " (cond\n" " ((type-type? (-> gp-0 content-type) integer)\n" " (set! v1-1 (-> gp-0 content-type symbol))\n" " (cond\n" " ((= v1-1 (quote int32))\n" " (set! s5-0 0)\n" " (while\n" " (< s5-0 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-0) L341 L340)\n" " (-> (the-as (array int32) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-1) L341 L340)\n" " (-> (the-as (array uint32) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-2) L341 L340)\n" " (-> (the-as (array int64) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-3) L339 L338)\n" " (-> (the-as (array uint64) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-4) L341 L340)\n" " (-> (the-as (array int8) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-5) L341 L340)\n" " (-> (the-as (array uint8) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-6) L341 L340)\n" " (-> (the-as (array int16) gp-0) 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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-7) L341 L340)\n" " (-> (the-as (array uint16) gp-0) 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-40 (quote int128))))\n" " (cond\n" " (v1-40\n" " (set! s5-8 0)\n" " (while\n" " (< s5-8 (-> gp-0 length))\n" " (set! t9-10 format)\n" " (set! a0-21 (quote #t))\n" " (set! a1-11 (if (zero? s5-8) L339 L338))\n" " (set!\n" " v1-42\n" " (+\n" " (shl s5-8 4)\n" " (the-as int (the-as (array uint128) gp-0))\n" " )\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 (-> gp-0 length))\n" " (format\n" " (quote #t)\n" " (if (zero? s5-9) L341 L340)\n" " (-> (the-as (array int32) gp-0) 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" " ((= (-> gp-0 content-type) float)\n" " (set! s5-10 0)\n" " (while\n" " (< s5-10 (-> gp-0 length))\n" " (if\n" " (zero? s5-10)\n" " (format (quote #t) L343 (-> (the-as (array float) gp-0) s5-10))\n" " (format (quote #t) L337 (-> (the-as (array float) gp-0) 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 (-> gp-0 length))\n" " (if\n" " (zero? s5-11)\n" " (format (quote #t) L336 (-> (the-as (array basic) gp-0) s5-11))\n" " (format (quote #t) L335 (-> (the-as (array basic) gp-0) 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) L334)\n" " gp-0\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[185, [\"gp\", \"(array uint128)\"]],\n" "\t\t[203, [\"gp\", \"(array int32)\"]],\n" "\t\t[222, [\"gp\", \"(array float)\"]],\n" "\t\t[231, [\"gp\", \"(array float)\"]],\n" "\t\t[248, [\"gp\", \"(array basic)\"]],\n" "\t\t[257, [\"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" " (set! gp-0 a0-0)\n" " (format (quote #t) L333 gp-0 (-> gp-0 type))\n" " (format (quote #t) L332 (-> gp-0 allocated-length))\n" " (format (quote #t) L331 (-> gp-0 length))\n" " (format (quote #t) L330 (-> gp-0 content-type))\n" " (format (quote #t) L329 (-> gp-0 allocated-length) (-> gp-0 data))\n" " (cond\n" " ((type-type? (-> gp-0 content-type) integer)\n" " (set! v1-1 (-> gp-0 content-type symbol))\n" " (cond\n" " ((= v1-1 (quote int32))\n" " (set! s5-0 0)\n" " (while\n" " (< s5-0 (-> gp-0 length))\n" " (format (quote #t) L328 s5-0 (-> (the-as (array int32) gp-0) s5-0))\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-1 (-> (the-as (array uint32) gp-0) s5-1))\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-2 (-> (the-as (array int64) gp-0) s5-2))\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 (-> gp-0 length))\n" " (format (quote #t) L327 s5-3 (-> (the-as (array uint64) gp-0) s5-3))\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-4 (-> (the-as (array int8) gp-0) s5-4))\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-5 (-> (the-as (array int8) gp-0) s5-5))\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-6 (-> (the-as (array int16) gp-0) s5-6))\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-7 (-> (the-as (array uint16) gp-0) s5-7))\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-40 (quote uint128))))\n" " (cond\n" " (v1-40\n" " (set! s5-8 0)\n" " (while\n" " (< s5-8 (-> gp-0 length))\n" " (set! t9-14 format)\n" " (set! a0-25 (quote #t))\n" " (set! a1-15 L327)\n" " (set! a2-13 s5-8)\n" " (set!\n" " v1-42\n" " (+\n" " (shl s5-8 4)\n" " (the-as int (the-as (array uint128) gp-0))\n" " )\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 (-> gp-0 length))\n" " (format (quote #t) L328 s5-9 (-> gp-0 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" " ((= (-> gp-0 content-type) float)\n" " (set! s5-10 0)\n" " (while\n" " (< s5-10 (-> gp-0 length))\n" " (format (quote #t) L326 s5-10 (-> (the-as (array float) gp-0) s5-10))\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 (-> gp-0 length))\n" " (format (quote #t) L325 s5-11 (-> (the-as (array basic) gp-0) s5-11))\n" " (set! s5-11 (+ s5-11 1))\n" " )\n" " (set! v1-60 (quote #f))\n" " (quote #f)\n" " )\n" " )\n" " )\n" " )\n" " gp-0\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[190, [\"gp\", \"(array uint128)\"]],\n" "\t\t[203, [\"gp\", \"(array int32)\"]],\n" "\t\t[225, [\"gp\", \"(array float)\"]],\n" "\t\t[242, [\"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" " (begin\n" " (set! gp-0 a0-0)\n" " (set! s3-0 a1-0)\n" " (set! s4-0 a2-0)\n" " (set! s5-0 t0-0)\n" " (and\n" " (>= (the-as uint gp-0) (the-as uint __START-OF-TABLE__))\n" " (< (the-as uint gp-0) (the-as uint 134217728))\n" " )\n" " )\n" " )\n" " (cond\n" " ((not s3-0)\n" " (cond\n" " ((nonzero? (logand (the-as int gp-0) 3))\n" " (if s4-0 (set! v1-4 (format s5-0 L321 gp-0 s4-0)))\n" " (quote #f)\n" " )\n" " ((not v1-1) (if s4-0 (set! v1-6 (format s5-0 L320 gp-0 s4-0))) (quote #f))\n" " (else (quote #t))\n" " )\n" " )\n" " ((and a3-0 (not gp-0)) (quote #t))\n" " (else\n" " (cond\n" " ((= s3-0 structure)\n" " (cond\n" " ((nonzero? (logand (the-as int gp-0) 15))\n" " (if s4-0 (set! v1-8 (format s5-0 L319 gp-0 s4-0 s3-0)))\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 gp-0) (the-as uint v1-11))\n" " )\n" " )\n" " (if s4-0 (set! v1-13 (format s5-0 L318 gp-0 s4-0 s3-0)))\n" " (quote #f)\n" " )\n" " (else (quote #t))\n" " )\n" " )\n" " ((= s3-0 pair)\n" " (cond\n" " ((!= (logand (the-as int gp-0) 7) 2)\n" " (if s4-0 (set! v1-15 (format s5-0 L319 gp-0 s4-0 s3-0)))\n" " (quote #f)\n" " )\n" " ((not v1-1)\n" " (if s4-0 (set! v1-17 (format s5-0 L318 gp-0 s4-0 s3-0)))\n" " (quote #f)\n" " )\n" " (else (quote #t))\n" " )\n" " )\n" " ((= s3-0 binteger)\n" " (cond\n" " ((zero? (logand (the-as int gp-0) 7)) (quote #t))\n" " (else\n" " (if s4-0 (set! v1-20 (format s5-0 L319 gp-0 s4-0 s3-0)))\n" " (quote #f)\n" " )\n" " )\n" " )\n" " ((!= (logand (the-as int gp-0) 7) 4)\n" " (if s4-0 (set! v1-22 (format s5-0 L319 gp-0 s4-0 s3-0)))\n" " (quote #f)\n" " )\n" " ((not v1-1)\n" " (if s4-0 (set! v1-24 (format s5-0 L318 gp-0 s4-0 s3-0)))\n" " (quote #f)\n" " )\n" " ((and (= s3-0 type) (!= (type-of gp-0) type))\n" " (if s4-0 (set! v1-31 (format s5-0 L317 gp-0 s4-0 s3-0 (type-of gp-0))))\n" " (quote #f)\n" " )\n" " (else\n" " (set!\n" " v1-33\n" " (and\n" " (!= s3-0 type)\n" " (not (valid? (type-of gp-0) type (quote #f) (quote #t) 0))\n" " )\n" " )\n" " (cond\n" " (v1-33\n" " (if s4-0 (set! v1-37 (format s5-0 L317 gp-0 s4-0 s3-0 (type-of gp-0))))\n" " (quote #f)\n" " )\n" " ((not (type-type? (type-of gp-0) s3-0))\n" " (if s4-0 (set! v1-41 (format s5-0 L316 gp-0 s4-0 s3-0 (type-of gp-0))))\n" " (quote #f)\n" " )\n" " ((= s3-0 symbol)\n" " (set! v1-43 32768)\n" " (.daddu v1-44 v1-43 s7-0)\n" " (cond\n" " ((>= (the-as uint gp-0) (the-as uint v1-44))\n" " (if s4-0 (set! v1-46 (format s5-0 L315 gp-0 s4-0 s3-0)))\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 gp-0) (the-as uint v1-48))\n" " )\n" " (if s4-0 (set! v1-50 (format s5-0 L314 gp-0 s4-0 s3-0)))\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)~%"}}); }