1/*	$OpenBSD: quad_float.h,v 1.9 2021/03/11 11:16:57 jsg Exp $	*/
2/*
3  (c) Copyright 1986 HEWLETT-PACKARD COMPANY
4  To anyone who acknowledges that this file is provided "AS IS"
5  without any express or implied warranty:
6      permission to use, copy, modify, and distribute this file
7  for any purpose is hereby granted without fee, provided that
8  the above copyright notice and this notice appears in all
9  copies, and that the name of Hewlett-Packard Company not be
10  used in advertising or publicity pertaining to distribution
11  of the software without specific, written prior permission.
12  Hewlett-Packard Company makes no representations about the
13  suitability of this software for any purpose.
14*/
15/* @(#)quad_float.h: Revision: 1.7.88.1 Date: 93/12/07 15:06:55 */
16
17/******************************
18 *  Quad precision functions  *
19 ******************************/
20
21/* 32-bit word grabbing functions */
22#define Quad_firstword(value) Qallp1(value)
23#define Quad_secondword(value) Qallp2(value)
24#define Quad_thirdword(value)  Qallp3(value)
25#define Quad_fourthword(value)  Qallp4(value)
26
27
28/* This magnitude comparison uses the signless first words and
29 * the regular part2 words.  The comparison is graphically:
30 *
31 *       1st greater?  ----------->|
32 *                                 |
33 *       1st less?-----------------+------->|
34 *                                 |        |
35 *       2nd greater?------------->|        |
36 *                                 |        |
37 *       2nd less?-----------------+------->|
38 *                                 |        |
39 *       3rd greater?------------->|        |
40 *                                 |        |
41 *       3rd less?-----------------+------->|
42 *                                 |        |
43 *       4th greater or equal?---->|        |
44 *                                 |        |
45 *                               False     True
46 */
47#define Quad_ismagnitudeless(leftp3,leftp4,rightp1,rightp2,rightp3,rightp4,signlessleft,signlessright) \
48/*  Quad_floating_point left, right;          *				\
49 *  unsigned int signlessleft, signlessright; */			\
50      ( signlessleft<=signlessright &&					\
51       (signlessleft<signlessright || (Qallp2(leftp2)<=Qallp2(rightp2) && \
52	(Qallp2(leftp2)<Qallp2(rightp2) || (Qallp3(leftp3)<=Qallp3(rightp3) && \
53	 (Qallp3(leftp3)<Qallp3(rightp3) || Qallp4(leftp4)<Qallp4(rightp4)))))))
54
55#define Quad_xor_to_intp1(leftp1,rightp1,result)		\
56    /* quad_floating_point left, right;				\
57     * unsigned int result; */					\
58    result = Qallp1(leftp1) XOR Qallp1(rightp1);
59
60#define Quad_xor_from_intp1(leftp1,rightp1,result)		\
61    /* quad_floating_point right, result;			\
62     * unsigned int left; */					\
63    Qallp1(resultp1) = left XOR Qallp1(rightp1)
64
65#define Quad_swap_lower(leftp1,leftp2,leftp3,leftp4,rightp1,rightp2,rightp3,rightp4)  \
66    /* quad_floating_point left, right; */			\
67    Qallp2(leftp2)  = Qallp2(leftp2) XOR Qallp2(rightp2)	\
68    Qallp2(rightp2) = Qallp2(leftp2) XOR Qallp2(rightp2)	\
69    Qallp2(leftp2)  = Qallp2(leftp2) XOR Qallp2(rightp2)	\
70    Qallp3(leftp3)  = Qallp3(leftp3) XOR Qallp3(rightp3)	\
71    Qallp3(rightp3) = Qallp3(leftp3) XOR Qallp3(rightp3)	\
72    Qallp3(leftp3)  = Qallp3(leftp3) XOR Qallp3(rightp3)	\
73    Qallp4(leftp4)  = Qallp4(leftp4) XOR Qallp4(rightp4)	\
74    Qallp4(rightp4) = Qallp4(leftp4) XOR Qallp4(rightp4)	\
75    Qallp4(leftp4)  = Qallp4(leftp4) XOR Qallp4(rightp4)
76
77int quad_frnd(quad_floating_point *, quad_floating_point *, quad_floating_point *, unsigned int *);
78