//MACRO Buffer.comppad Buffer1, Length1, Buffer2, Length2, Branch[2], PadReg, WReg[3] //-------------------------------------------------------------------------------------------------- // // @ 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. // //-------------------------------------------------------------------------------------------------- // // // Set up variables // eval(DVASM.getEnv()[4]); var ld= "L" + abiWID; var st= "S" + abiWID; var wl= abiWLen; var wn= abiWID == "D" ? "double word" : "word"; var WReg0= WReg[0]; var WReg1= WReg[1]; var WReg2= WReg[2]; var branchLt= Branch[0]; var branchGt= Branch[1]; var doLabel= DVASM.getNewLabel(); // // Generate code // \#Label HWRD 0[0] // Start of code \#doLabel DO \ IF ( #Length1 > #Length2 ), THEN // Check if buffer 1 is larger \ MV #WReg0, #Length2 // Select #Length2 as shortest length \ ADD #Length1, #Buffer1 // Compute end address of buffer 1 \ ELSE \ MV #WReg0, #Length1 // Select #Length1 as shortest length \ ADD #Length2, #Buffer2 // Compute end address of buffer 1 \ ENDIF \ BUFFER.COMP #Buffer1, #Buffer2, #WReg0, [#branchLt, #branchGt], [#WReg1, #WReg2] // Compare common length buffers \ \ // Select three different length case \ \ IF ( #Length1 > #Length2 ), THEN \ ADDI #Length1, -#wl // Subtract #wn size from it \ WHILE Condition= ( #Buffer1 <= #Length1 ) // Start loop to compare all #wn.s \ #ld #WReg1, 0[#Buffer1] // Load buffer 1 #wn \ IF ( #PadReg != #WReg1 ), BREAK // Exit loop if not equal - need byte comparison for > or < \ ADDI #Buffer1, #wl // Load next buffer 1 #wn address \ ENDWHILE \ ANDI #WReg0, 0xFF[#PadReg] // Keep only low byte in #PadReg \ ADDI #Length1, #wl // Restore end of buffer addr \ IF ( #Buffer1 >= #Length1 ), BREAK, ID=#doLabel // Skip residual length before loop \ WHILE // Start residual length loop \ LBU #WReg1, 0[#Buffer1] // Load byte in buffer 1 \ IF ( #WReg1 < #WReg0 ), GOTO, ID= #branchLt // Branch to first Branch label if less than \ IF ( #WReg1 > #WReg0 ), GOTO, ID= #branchGt // Branch to second Branch label if greater than \ ADDI #Buffer1, 1 // Add 1 to buffer 1 addr \ IF ( #Buffer1 >= #Length1 ), BREAK, ID=#doLabel // Done if end of buffer \ ENDWHILE \ ENDIF \ \ ADDI #Length2, -#wl // Subtract #wn size from it \ WHILE Condition= ( #Buffer2 <= #Length2 ) // Start loop to compare all #wn.s \ #ld #WReg1, 0[#Buffer2] // Load buffer 1 #wn \ IF ( #PadReg != #WReg1 ), BREAK // Exit loop if not equal - need byte comparison for > or < \ ADDI #Buffer2, #wl // Load next buffer 2 #wn address \ ENDWHILE \ ANDI #WReg0, 0xFF[#PadReg] // Keep only low byte in #PadReg \ ADDI #Length2, #wl // Restore end of buffer addr \ WHILE Condition= ( #Buffer2 < #Length2 ) // Start residual length loop \ LBU #WReg1, 0[#Buffer2] // Load byte in buffer 1 \ IF ( #WReg1 < #WReg0 ), GOTO, ID= #branchGt // Branch to first Branch label if less than \ IF ( #WReg1 > #WReg0 ), GOTO, ID= #branchLt // Branch to second Branch label if greater than \ ADDI #Buffer2, 1 // Add 1 to buffer 2 addr \ ENDWHILE \ ENDDO