diff options
Diffstat (limited to 'zap/source/amd64/mth')
-rw-r--r-- | zap/source/amd64/mth/abs.S | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/zap/source/amd64/mth/abs.S b/zap/source/amd64/mth/abs.S new file mode 100644 index 0000000..4c9ed01 --- /dev/null +++ b/zap/source/amd64/mth/abs.S @@ -0,0 +1,70 @@ +# Copyright 2022 Gabriel Jensen. +# This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +# If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. + +.globl zap_abs_c +.globl zap_abs_i +.globl zap_abs_l +.globl zap_abs_ll +.globl zap_abs_s +.globl zap_abs_sc + +zap_abs_i: +# The input value: +#define val %edi +# Inverted value of the input: +#define inv %eax + movl val,inv # inv = val + negl inv # inv = -inv // Invert the copy of the input value. This also tests the sign of the value. + # . if (inv > 0x0) + cmovsl val,inv # val = inv // If it was positive, just return the unmodified input. + ret # return val // Otherwise, return the inverted value. + +#undef val +#undef inv + +zap_abs_l: +zap_abs_ll: +# The input value: +#define val %rdi +# Inverted value of the input: +#define inv %rax + movq val,inv # inv = val + negq inv # inv = -inv + # . if (inv > 0x0) + cmovsq val,inv # val = inv + ret # return val + +#undef val +#undef inv + +zap_abs_s: +# The input value: +#define val %di +# Inverted value of the input: +#define inv %ax + movw val,inv # inv = val + negw inv # inv = -inv + # . if (inv > 0x0) + cmovsw val,inv # val = inv + ret # return val + +#undef val +#undef inv + +zap_abs_c: +zap_abs_sc: +# The input value: +#define val %dil +#define val2 %di +# Inverted value of the input: +#define inv %al +#define inv2 %ax + movb val,inv # inv = val + negb inv # inv = -inv + # . if (inv > 0x0) + cmovsw val2,inv2 # val = inv + ret # return val + +#undef val +#undef inv |