1/* $OpenBSD: bn_arch.h,v 1.2 2023/06/24 15:51:47 jsing Exp $ */ 2/* 3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18#include <openssl/bn.h> 19 20#ifndef HEADER_BN_ARCH_H 21#define HEADER_BN_ARCH_H 22 23#ifndef OPENSSL_NO_ASM 24 25#if defined(__GNUC__) 26 27#define HAVE_BN_SUBW 28 29static inline void 30bn_subw(BN_ULONG a, BN_ULONG b, BN_ULONG *out_borrow, BN_ULONG *out_r0) 31{ 32 BN_ULONG borrow, r0; 33 34 __asm__ ( 35 "mov %[borrow], #0 \n" 36 "subs %[r0], %[a], %[b] \n" 37 "sbc %[borrow], %[borrow], #0 \n" 38 "neg %[borrow], %[borrow] \n" 39 : [borrow]"=&r"(borrow), [r0]"=r"(r0) 40 : [a]"r"(a), [b]"r"(b) 41 : "cc"); 42 43 *out_borrow = borrow; 44 *out_r0 = r0; 45} 46 47#define HAVE_BN_SUBW_SUBW 48 49static inline void 50bn_subw_subw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_borrow, 51 BN_ULONG *out_r0) 52{ 53 BN_ULONG borrow, r0; 54 55 __asm__ ( 56 "mov %[borrow], #0 \n" 57 "subs %[r0], %[a], %[b] \n" 58 "sbc %[borrow], %[borrow], #0 \n" 59 "subs %[r0], %[r0], %[c] \n" 60 "sbc %[borrow], %[borrow], #0 \n" 61 "neg %[borrow], %[borrow] \n" 62 : [borrow]"=&r"(borrow), [r0]"=&r"(r0) 63 : [a]"r"(a), [b]"r"(b), [c]"r"(c) 64 : "cc"); 65 66 *out_borrow = borrow; 67 *out_r0 = r0; 68} 69 70#endif /* __GNUC__ */ 71 72#endif 73#endif 74