//MACRO __SetArguments ArgList[], Stack, Tail{boolean}= false //-------------------------------------------------------------------------------------------------- // // @ CopyRight Roberti & Parau Enterprises, Inc. 2021-2023 // // This work is licensed under the Creative Commons Attribution-NoDerivatives 4.0 International License. // To view a copy of this license, visit http://creativecommons.org/licenses/by-nd/4.0/ // or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. // //-------------------------------------------------------------------------------------------------- // if (ArgList.length == 0) return; // // Get matcher // var regExp= DVASM.getJSGlobal("__arch_argRegExp"); if (regExp == null) { regExp= Pattern.compile( "(?:[\\s\\t]*)(?:" + "(?:(?[\\!][a])(?:[\\s\\t]*$))|" + "(?:(?[\\!][f])(?:[\\s\\t]*$))|" + "(?:" + "(?:[\\{][\\s\\t]*" + "(?(?:[A-Z_]\\w*(?:[.][A-Z_]\\w*)*))" + "[\\s\\t]*[\\}][\\s\\t]*" + ")?" + "(?(?:[^$]+))" + ")" + ")", Pattern.CASE_INSENSITIVE); DVASM.putJSGlobal("__arch_argRegExp", regExp); } // // Get abi and sets limits to integer and float arguments in registers // eval(DVASM.getEnv()[4]); var aRegNo= (abiNoRegs <= 16 ? 6 : 8); var aAlign= abiWLen; var aStmi= "S" + abiWID; var fRegNo= abiNoFRegs; var fAlign= abiFWLen; var fStmi= "S" + abiFWID; // // Scan argument list and prepare arrays used to generate code // var aList= []; var awSet= []; var awReg= 0; var fList= []; var fwSet= []; var awReg= 0; var pList= []; var arNo= 0; var frNo= 0; var reg; for (var i= 0; i < ArgList.length; i++) { var matcher= regExp.matcher(ArgList[i]); if (! matcher.lookingAt()) return DVASM.putError("Argument No. [" + (i+1) + "] is invalid"); // // Check if integer skip // if (matcher.group("skipa") != null) { if (arNo >= aRegNo) { pList.push([null, "A", null]); continue; } arNo++; continue; } // // Check if float skip // if (matcher.group("skipf") != null) { if (fRegNo == 0) return DVASM.putError("Argument No. [" + (i+1) + "] specifies skip float but ABI does not support float parameters"); if (frNo >= fRegNo) { pList.push([null, "F", null]); continue; } frNo++; continue; } // // Get machine instruction if any specified and source // var mi= matcher.group("mi"); mi= (mi == null) ? "ADDI" : mi.toUpperCase(); var source= matcher.group("source"); // // Handle integer case // if (! mi.startsWith("F")) { if (arNo >= aRegNo) { pList.push([mi, awSet[awReg], source]); awReg= (awReg+1)%awSet.length; continue; } aList.push([mi, "a" + arNo, source]); awSet.push("a" + arNo); arNo++; continue; } // // Handle float case // if (fRegNo == 0) return DVASM.putError("Argument No. [" + (i+1) + "] specifies float parameter but ABI does not support float parameters"); if (frNo >= fRegNo) { pList.push([mi, fwSet[fwReg], source]); fwReg= (fwReg+1)%fwSet.length; continue; } fList.push([mi, "fa" + frNo, source]); fwSet.push("fa" + frNo); frNo++; } // // Generate code for non register arguments // if (Tail) return DVASM.putError("Non register arguments not allowed for tail calls"); var displ= 0; for (var i= 0; i < pList.length; i++) { mi= pList[i][0]; reg= pList[i][1]; source= pList[i][2]; if (! mi.startsWith("F")) { DVASM.formatLine("", pList[i][0], pList[i][1] + ", " + pList[i][2], ""); displ= Math.floor((displ+aAlign-1)/aAlign)*aAlign; DVASM.formatLine("", aStmi, pList[i][1] + ", " + Stack + ".parms+" + displ + "-" + Stack + "[sp]", ""); displ+= aAlign; continue; } DVASM.formatLine("", pList[i][0], pList[i][1] + ", " + pList[i][2], ""); displ= Math.floor((displ+fAlign-1)/fAlign)*fAlign; DVASM.formatLine("", fStmi, pList[i][1] + ", " + Stack + ".parms+" + displ + "-" + Stack + "[sp]", ""); displ+= fAlign; } if (displ > 0) DVASM.formatLine("", "ASSERT", displ + " <= " + Stack + ".parms.$LENGTH*" + Stack + ".parms.$REPL", ""); // // Generate code for integer register parameters // for (var i= 0; i < aList.length; i++) DVASM.formatLine("", aList[i][0], aList[i][1] + ", " + aList[i][2], ""); // Generate code for float register parameters for (var i= 0; i < fList.length; i++) DVASM.formatLine("", fList[i][0], fList[i][1] + ", " + fList[i][2], "");