aboutsummaryrefslogtreecommitdiff
path: root/modules/Saturation/module.jai
diff options
context:
space:
mode:
authordam <dam@gudinoff>2024-05-18 01:30:01 +0100
committerdam <dam@gudinoff>2024-05-18 01:30:01 +0100
commitaf1317ed93f7d5fc16baceaadb0da17aa17591be (patch)
tree17b0878b430688da9f3481ac621f581d18cbf076 /modules/Saturation/module.jai
parentbdea73c8349c2c918befad4120f49f9826d270dc (diff)
downloadtask-time-tracker-af1317ed93f7d5fc16baceaadb0da17aa17591be.tar.zst
task-time-tracker-af1317ed93f7d5fc16baceaadb0da17aa17591be.zip
Updated modules.
Diffstat (limited to 'modules/Saturation/module.jai')
-rw-r--r--modules/Saturation/module.jai26
1 files changed, 14 insertions, 12 deletions
diff --git a/modules/Saturation/module.jai b/modules/Saturation/module.jai
index 74643e0..50c9b3c 100644
--- a/modules/Saturation/module.jai
+++ b/modules/Saturation/module.jai
@@ -1,5 +1,7 @@
// Integer saturating arighmetic (with assembly branch-free procedures for x64 - expecting signed values in two's complement).
+#module_parameters(PREFER_BRANCH_FREE_CODE := false);
+
#import "Basic";
#import "Math";
#import "String";
@@ -37,11 +39,11 @@ INTEGER_ARITHMETIC_TYPES_CHECK :: #string DONE
return true;
DONE
-add :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
+add :: (x: $Tx, y: $Ty, $prefer_branch_free_code := PREFER_BRANCH_FREE_CODE) -> result: $Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
{
+
+ #if !(prefer_branch_free_code && CPU == .X64) {
- #if USE_GENERIC || CPU != .X64 {
-
#if Tr == s8 || Tr == s16 || Tr == s32 || Tr == s64 {
#if Tr == s8 { MAX :: S8_MAX; MIN :: S8_MIN; }
@@ -66,7 +68,7 @@ add :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: b
return x + y, false;
} else {
-
+
result: Tr = ---;
saturated: bool = ---;
@@ -118,10 +120,10 @@ add :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: b
}
}
-sub :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
+sub :: (x: $Tx, y: $Ty, $prefer_branch_free_code := PREFER_BRANCH_FREE_CODE) -> result: $Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
{
- #if USE_GENERIC || CPU != .X64 {
+ #if !(prefer_branch_free_code && CPU == .X64) {
#if Tr == s8 || Tr == s16 || Tr == s32 || Tr == s64 {
@@ -195,10 +197,10 @@ sub :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: b
}
-mul :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
+mul :: (x: $Tx, y: $Ty, $prefer_branch_free_code := PREFER_BRANCH_FREE_CODE) -> result: $Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
{
- #if USE_GENERIC || CPU != .X64 {
+ #if !(prefer_branch_free_code && CPU == .X64) {
#if Tr == s8 || Tr == s16 || Tr == s32 || Tr == s64 {
@@ -286,10 +288,10 @@ mul :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, saturated: b
}
}
-div :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, remainder: Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
+div :: (x: $Tx, y: $Ty, $prefer_branch_free_code := PREFER_BRANCH_FREE_CODE) -> result: $Tr, remainder: Tr, saturated: bool #modify { #insert INTEGER_ARITHMETIC_TYPES_CHECK; }
{
- #if USE_GENERIC || CPU != .X64 {
+ #if !(prefer_branch_free_code && CPU == .X64) {
#if Tr == s8 || Tr == s16 || Tr == s32 || Tr == s64 {
@@ -380,11 +382,11 @@ div :: (x: $Tx, y: $Ty, $USE_GENERIC: bool = false) -> result: $Tr, remainder: T
#asm {
result === a; // Pin result to register A.
remainder === d; // Pin remainder to register D.
-
+
xor result, result; // Clear result.
xor remainder, remainder; // Clear remainder (required when used as dividend's high bits).
xor saturated, saturated; // Clear saturated (unsigned division never saturates).
- mov result, x; // Copy x value to result.
+ mov.SIZE result, x; // Copy x value to result.
DIVIDE_PLACEHOLDER
}