//MACRO Buffer.comp Buffer1, Buffer2, Length, Branch[2], WReg[2] //-------------------------------------------------------------------------------------------------- // // @ 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. // //-------------------------------------------------------------------------------------------------- // // // Get load/store MIs and word length // eval(DVASM.getEnv()[4]); var ld= "L" + abiWID; var wl= abiWLen; var wn= abiWID == "D" ? "double word" : "word"; // // Validate parameters // var branchLT= Branch[0]; var branchGT= Branch[1]; var WReg0= WReg[0]; var WReg1= WReg[1]; // // Generate code // \#Label ADD #Length, #Buffer1 // Compute and of buffer addr \ ADDI #Length, -#wl // Subtract #wn size from it \ WHILE Condition= ( #Buffer1 <= #Length ) // Start loop to compare all #wn.s \ #ld #WReg0, 0[#Buffer2] // Load next #wn in buffer 1 \ #ld #WReg1, 0[#Buffer1] // Load next #wn in buffer 2 \ IF ( #WReg0 != #WReg1 ), BREAK // Exit loop if not equal - need byte comparison for > or < \ ADDI #Buffer1, #wl // Load next buffer 1 #wn address \ ADDI #Buffer2, #wl // Load next buffer 2 #wn address \ ENDWHILE \ ADDI #Length, #wl // Restore end of buffer addr \ WHILE Condition= ( #Buffer1 < #Length ) // Start residual length loop \ LBU #WReg0, 0[#Buffer1] // Load byte in buffer 1 \ LBU #WReg1, 0[#Buffer2] // Load byte in buffer 2 \ IF ( #WReg0 < #WReg1 ), GOTO, ID= #branchLT \ // Branch to first Branch label if less than \ IF ( #WReg0 > #WReg1 ), GOTO, ID= #branchGT \ // Branch to second Branch label if greater than \ ADDI #Buffer2, 1 // Add 1 to buffer 1 addr \ ADDI #Buffer1, 1 // Add 1 to buffer 2 addr \ ENDWHILE