From 0ebbaf1c570e0c5512a580d5f9e240baf8e221fa Mon Sep 17 00:00:00 2001 From: dam Date: Fri, 30 Jun 2023 11:00:55 +0100 Subject: Improved unsigned add asm code. --- Math_Ext.jai | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Math_Ext.jai b/Math_Ext.jai index dd553cd..500962f 100644 --- a/Math_Ext.jai +++ b/Math_Ext.jai @@ -74,7 +74,6 @@ add :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: b result: Tr = ---; saturated: bool = ---; - S_ADD_ASM :: #string DONE #asm { // Calculate limit based on x's sign. @@ -102,22 +101,21 @@ add :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: b U_ADD_ASM :: #string DONE #asm { - mov limit: gpr, MAX; - mov result, x; - add.SIZE result, y; - setc saturated; - cmovc result, limit; + add.SIZE x, y; // Add values. + mov result, -1; // Pre-set result with unsigned maximum. + setc saturated; // Set saturated flag if CF. + cmovnc result, x; // Move add-result to result if NOT CF. } DONE #if Tr == u8 - #insert #run replace(replace(U_ADD_ASM, ".SIZE", ".b"), "MAX", "255"); + #insert #run replace(U_ADD_ASM, ".SIZE", ".b"); #if Tr == u16 - #insert #run replace(replace(U_ADD_ASM, ".SIZE", ".w"), "MAX", "65535"); + #insert #run replace(U_ADD_ASM, ".SIZE", ".w"); #if Tr == u32 - #insert #run replace(replace(U_ADD_ASM, ".SIZE", ".d"), "MAX", "4294967295"); + #insert #run replace(U_ADD_ASM, ".SIZE", ".d"); #if Tr == u64 - #insert #run replace(replace(U_ADD_ASM, ".SIZE", ".q"), "MAX", "18446744073709551615"); + #insert #run replace(U_ADD_ASM, ".SIZE", ".q"); return result, saturated; -- cgit v1.2.3