//MACRO Checkpoint Before=IORW, After=IORW //-------------------------------------------------------------------------------------------------- // // @ 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 (Before.length > 4) return DVASM.putError("Before parameter [" + Before + "] is too long"); if (After.length > 4) return DVASM.putError("Before parameter [" + After + "] is too long"); var bb= 0; var cc= ""; for (var i= 0; i < Before.length; i++) { var c= Before.substring(i, i+1).toUpperCase(); if (cc.includes(c)) return DVASM.putError("Before parameter [" + Before + "] contains duplicate FENCE setting [" + c + "]"); cc+= c; var k= "IORW".indexOf(c); if (k < 0) return DVASM.putError("Before parameter [" + Before + "] contains duplicateinvalid FENCE setting [" + c + "]"); bb|= 1 << (3-k); } var aa= 0; cc= ""; for (var i= 0; i < After.length; i++) { var c= After.substring(i, i+1).toUpperCase(); if (cc.includes(c)) return DVASM.putError("Aefore parameter [" + After + "] contains duplicate FENCE setting [" + c + "]"); cc+= c; var k= "IORW".indexOf(c); if (k < 0) return DVASM.putError("Aefore parameter [" + After + "] contains duplicateinvalid FENCE setting [" + c + "]"); aa|= 1 << (3-k); } var imm= (bb << 4) + aa; if (imm == 0) return DVASM.putError("No memory FENCE setting specified for before or after"); imm= imm.toString(2); // // Generate code // \#Label FENCE 0, 0b#imm // Set memmory checkpoint using the FENCE instruction