From 8b5c33cd6f2ff1f0a073a773a27987b995ea8bc1 Mon Sep 17 00:00:00 2001 From: dam Date: Sat, 29 Apr 2023 03:48:10 +0100 Subject: Prototyping sat_s64 add/sub procedures. --- ttt.jai | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/ttt.jai b/ttt.jai index 9c7f948..60db8b7 100644 --- a/ttt.jai +++ b/ttt.jai @@ -1163,6 +1163,95 @@ read_enter_confirmation :: inline (row: int, style: int, message: string) -> boo } main :: () { + + // value_a: s64 = 2; + // value_b: s64 = S64_MAX-1; + value_a: s64 = -2; + value_b: s64 = S64_MIN+1; + print(">%\n", S64_MAX); + argx := get_command_line_arguments(); + if argx.count > 1 + value_a = parse_int(*argx[1]); + if argx.count > 2 + value_b = parse_int(*argx[2]); + + result: s64 = ---; + flags: s64;// = ---; + #asm LAHF_SAHF { // TODO Remove LAHF_SAHF it not required. + + // Code from https://locklessinc.com/articles/sat_arithmetic/ + + + // value_a === b; + // value_b === c; + // add value_a, value_b; + // mov result, value_a; + + // Version 1 + // mov b: gpr === b, value_a; + // mov c: gpr === c, value_b; + // add b, c; + // mov result, b; + // seto flags; + // cmovns b, c; + +// s64b sat_adds64b(s64b x, s64b y) +// { +// u64b ux = x; +// u64b uy = y; +// u64b res = ux + uy; +// +// ux = (ux >> 63) + LONG_MAX; +// +// /* Force compiler to use cmovns instruction */ +// if ((s64b) ((ux ^ uy) | ~(uy ^ res)) >= 0) +// { +// res = ux; +// } +// +// return res; +// } + // Version 2 - WORKS + mov d: gpr === d, 9223372036854775807; + mov a: gpr === a, value_a; + mov b: gpr === b, value_b; + add a, b; + seto flags; // Signal overflow. + mov result, a; + mov a, value_a; + shr a, 63; + add a, d; + mov c: gpr, value_a; + xor c, b; + xor b, result; + not b; + or c, b; + test c, c; + cmovns result, a; + +// s64b sat_subs64b(s64b x, s64b y) +// { +// u64b ux = x; +// u64b uy = y; +// u64b res = ux - uy; +// +// ux = (ux >> 63) + LONG_MAX; +// +// /* Force compiler to use cmovns instruction */ +// if ((s64b)((ux ^ uy) & (ux ^ res)) < 0) +// { +// res = ux; +// } +// +// return res; +// } + // TODO Use https://godbolt.org/ to help + + } + print("% + % = %\n", value_a, value_b, result); + print("flag: %\n", flags); + return; + // TODO Implement signal handling and see modules/Debug.jai for examples. -- cgit v1.2.3