jak-project/test/decompiler/test_FormExpressionBuildLong.cpp
water111 814480f9e5
[Decompiler] Replace type hint system and improve variable types. (#320)
* get gkernel and gkernel-h at least somewhat working in the offline tests

* strip comments from json

* switch hints to casts. online tests passing, offline passing up to gkernel

* variable retyping is added

* fix up casts in lets

* update
2021-03-13 16:10:39 -05:00

2447 lines
65 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"
" (if\n"
" (type-type? (-> arg0 content-type) integer)\n"
" (let\n"
" ((v1-1 (-> arg0 content-type symbol)))\n"
" (cond\n"
" ((= v1-1 (quote int32))\n"
" (dotimes\n"
" (s5-0 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-0) \"~D\" \" ~D\")\n"
" (-> (the-as (array int32) arg0) s5-0)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint32))\n"
" (dotimes\n"
" (s5-1 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-1) \"~D\" \" ~D\")\n"
" (-> (the-as (array uint32) arg0) s5-1)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote int64))\n"
" (dotimes\n"
" (s5-2 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-2) \"~D\" \" ~D\")\n"
" (-> (the-as (array int64) arg0) s5-2)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint64))\n"
" (dotimes\n"
" (s5-3 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-3) \"#x~X\" \" #x~X\")\n"
" (-> (the-as (array uint64) arg0) s5-3)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote int8))\n"
" (dotimes\n"
" (s5-4 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-4) \"~D\" \" ~D\")\n"
" (-> (the-as (array int8) arg0) s5-4)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint8))\n"
" (dotimes\n"
" (s5-5 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-5) \"~D\" \" ~D\")\n"
" (-> (the-as (array uint8) arg0) s5-5)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote int16))\n"
" (dotimes\n"
" (s5-6 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-6) \"~D\" \" ~D\")\n"
" (-> (the-as (array int16) arg0) s5-6)\n"
" )\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint16))\n"
" (dotimes\n"
" (s5-7 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-7) \"~D\" \" ~D\")\n"
" (-> (the-as (array uint16) arg0) s5-7)\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (cond\n"
" ((or (= v1-1 (quote uint128)) (= v1-1 (quote int128)))\n"
" (dotimes\n"
" (s5-8 (-> arg0 length))\n"
" (let\n"
" ((t9-10 format) (a0-21 #t) (a1-11 (if (zero? s5-8) \"#x~X\" \" #x~X\")))\n"
" (let\n"
" ((v1-42 (+ (shl s5-8 4) (the-as int (the-as (array uint128) arg0)))))\n"
" (.lq a2-8 12 v1-42)\n"
" )\n"
" (t9-10 a0-21 a1-11 a2-8)\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (dotimes\n"
" (s5-9 (-> arg0 length))\n"
" (format\n"
" #t\n"
" (if (zero? s5-9) \"~D\" \" ~D\")\n"
" (-> (the-as (array int32) arg0) s5-9)\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (cond\n"
" ((= (-> arg0 content-type) float)\n"
" (dotimes\n"
" (s5-10 (-> arg0 length))\n"
" (if\n"
" (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\n"
" (s5-11 (-> arg0 length))\n"
" (if\n"
" (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"
" )\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", ")"}},
parse_cast_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 #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"
" (if\n"
" (type-type? (-> arg0 content-type) integer)\n"
" (let\n"
" ((v1-1 (-> arg0 content-type symbol)))\n"
" (cond\n"
" ((= v1-1 (quote int32))\n"
" (dotimes\n"
" (s5-0 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-0 (-> (the-as (array int32) arg0) s5-0))\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint32))\n"
" (dotimes\n"
" (s5-1 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-1 (-> (the-as (array uint32) arg0) s5-1))\n"
" )\n"
" )\n"
" ((= v1-1 (quote int64))\n"
" (dotimes\n"
" (s5-2 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-2 (-> (the-as (array int64) arg0) s5-2))\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint64))\n"
" (dotimes\n"
" (s5-3 (-> arg0 length))\n"
" (format #t \"~T [~D] #x~X~%\" s5-3 (-> (the-as (array uint64) arg0) s5-3))\n"
" )\n"
" )\n"
" ((= v1-1 (quote int8))\n"
" (dotimes\n"
" (s5-4 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-4 (-> (the-as (array int8) arg0) s5-4))\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint8))\n"
" (dotimes\n"
" (s5-5 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-5 (-> (the-as (array int8) arg0) s5-5))\n"
" )\n"
" )\n"
" ((= v1-1 (quote int16))\n"
" (dotimes\n"
" (s5-6 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-6 (-> (the-as (array int16) arg0) s5-6))\n"
" )\n"
" )\n"
" ((= v1-1 (quote uint16))\n"
" (dotimes\n"
" (s5-7 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-7 (-> (the-as (array uint16) arg0) s5-7))\n"
" )\n"
" )\n"
" (else\n"
" (cond\n"
" ((or (= v1-1 (quote int128)) (= v1-1 (quote uint128)))\n"
" (dotimes\n"
" (s5-8 (-> arg0 length))\n"
" (let\n"
" ((t9-14 format) (a0-25 #t) (a1-15 \"~T [~D] #x~X~%\") (a2-13 s5-8))\n"
" (let\n"
" ((v1-42 (+ (shl s5-8 4) (the-as int (the-as (array uint128) arg0)))))\n"
" (.lq a3-10 12 v1-42)\n"
" )\n"
" (t9-14 a0-25 a1-15 a2-13 a3-10)\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (dotimes\n"
" (s5-9 (-> arg0 length))\n"
" (format #t \"~T [~D] ~D~%\" s5-9 (-> (the-as (array int32) arg0) s5-9))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (cond\n"
" ((= (-> arg0 content-type) float)\n"
" (dotimes\n"
" (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\n"
" (s5-11 (-> arg0 length))\n"
" (format #t \"~T [~D] ~A~%\" s5-11 (-> (the-as (array basic) arg0) s5-11))\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_cast_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[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"
" ((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"
" #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"
" #f\n"
" )\n"
" (else #t)\n"
" )\n"
" )\n"
" ((and arg3 (not arg0)) #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"
" #f\n"
" )\n"
" ((or\n"
" (not v1-1)\n"
" (begin\n"
" (let ((v1-10 #x8000)) (.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"
" #f\n"
" )\n"
" (else #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"
" #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"
" #f\n"
" )\n"
" (else #t)\n"
" )\n"
" )\n"
" ((= arg1 binteger)\n"
" (cond\n"
" ((zero? (logand (the-as int arg0) 7)) #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"
" #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"
" #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"
" #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"
" #f\n"
" )\n"
" (else\n"
" (cond\n"
" ((and (!= arg1 type) (not (valid? (rtype-of arg0) type #f #t 0)))\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"
" #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"
" #f\n"
" )\n"
" ((= arg1 symbol)\n"
" (let ((v1-43 #x8000)) (.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"
" #f\n"
" )\n"
" (else #t)\n"
" )\n"
" )\n"
" ((begin\n"
" (let ((v1-47 #x8000)) (.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"
" #f\n"
" )\n"
" (else #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)~%"}});
}
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\n"
" ((a0-1 (-> arg0 data)) (v0-0 0) (v1-0 #f))\n"
" (cond\n"
" ((= (-> a0-1 0) 35)\n"
" (let\n"
" ((a0-2 (&-> a0-1 1)))\n"
" (cond\n"
" ((or (= (-> a0-2 0) 120) (= (-> a0-2 0) 88))\n"
" (let\n"
" ((a0-3 (&-> a0-2 1)))\n"
" (when\n"
" (= (-> a0-3 1) 45)\n"
" (set! v1-0 #t)\n"
" (set! a0-3 (&-> a0-3 1))\n"
" (let ((a1-8 a0-3)))\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 (+ (+ (-> a0-3 0) -55) (the-as uint (shl v0-0 4))))\n"
" (let ((a1-14 (the-as uint v0-0))))\n"
" )\n"
" (else\n"
" (cond\n"
" ((and\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" (set! v0-0 (+ (+ (-> a0-3 0) -87) (the-as uint (shl v0-0 4))))\n"
" (let ((a1-20 (the-as uint v0-0))))\n"
" )\n"
" (else\n"
" (set! v0-0 (+ (+ (-> a0-3 0) -48) (the-as uint (shl v0-0 4))))\n"
" (let ((a1-23 (the-as uint v0-0))))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (set! a0-3 (&-> a0-3 1))\n"
" )\n"
" )\n"
" )\n"
" ((or (= (-> a0-2 0) 98) (= (-> a0-2 0) 66))\n"
" (let\n"
" ((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 (+ (+ (-> a0-4 0) -48) (the-as uint (shl v0-0 1))))\n"
" (set! a0-4 (&-> a0-4 1))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (when\n"
" (= (-> a0-1 1) 45)\n"
" (set! v1-0 #t)\n"
" (set! a0-1 (&-> a0-1 1))\n"
" (let ((a1-47 a0-1)))\n"
" )\n"
" (while\n"
" (and (>= (-> a0-1 0) (the-as uint 48)) (>= (the-as uint 57) (-> a0-1 0)))\n"
" (set! v0-0 (+ (+ (-> a0-1 0) -48) (the-as uint (* 10 v0-0))))\n"
" (set! a0-1 (&-> a0-1 1))\n"
" )\n"
" )\n"
" )\n"
" (cond (v1-0 (- v0-0)) (else (empty) v0-0))\n"
" )\n"
" )";
test_final_function(func, type, expected);
}