Merge branch 'knuth-bubble-sort' into 'master'
[why3.git] / examples / multiprecision / wmpn.drv
bloba9c3053bfa6f9b0e488eb94d32dc2b86886d85d6
1 module sqrt.Sqrt1
3   prelude
4 "#include \"sqrtinit.h\"\
5 \n\
6 \nuint64_t rsa_estimate (uint64_t a) {\
7 \n  uint64_t abits, x0;\
8 \n  abits = a >> 55;\
9 \n  x0 = 0x100 | invsqrttab[abits - 0x80];\
10 \n  return x0;\
11 \n}\
14 syntax val rsa_estimate "rsa_estimate"
16 end
18 blacklist "invsqrttab"
20 module powm.Powm
22 prelude
23 "\n#include \"binverttab.h\"\
24 \n\
25 \nuint64_t binvert_limb_table (uint64_t n) {\
26 \n  return (uint64_t)binverttab[n];\
27 \n}"
29 syntax val binvert_limb_table "binvert_limb_table"
31 end
33 blacklist "binverttab"
35 module mach.int.UInt64GMP
36   interface "\
37     \ntypedef unsigned __int128 uint128_t;\
38     \n\
39     \nstruct __mul64_double_result {\
40     \n  uint64_t __field_0;\
41     \n  uint64_t __field_1;\
42     \n};\
43     \n\
44     \nstatic inline struct __mul64_double_result\
45     \nmul64_double(uint64_t x, uint64_t y)\
46     \n{\
47     \n  uint128_t z = (uint128_t)x * (uint128_t)y;\
48     \n  struct __mul64_double_result result = { z, z >> 64 };\
49     \n  return result;\
50     \n}\
51     \n\
52     \nstatic inline uint64_t\
53     \ndiv64_2by1(uint64_t ul, uint64_t uh, uint64_t d)\
54     \n{\
55     \n  return (((uint128_t)uh << 64) | ul) / d;\
56     \n}\
57   "
59   syntax val mul_double "mul64_double"
60   syntax val div2by1 "div64_2by1"
62 end
64 blacklist "mul64_double" "div64_2by1"
66 module ptralias.Alias
68   interface "\
69     \nstruct __open_sep_result {\
70     \n  uint64_t *__field_0;\
71     \n  uint64_t *__field_1;\
72     \n  uint64_t *__field_2;\
73     \n};\
74     \n\
75     \nstruct __open_rx_result {\
76     \n  uint64_t *__field_0;\
77     \n  uint64_t *__field_1;\
78     \n  uint64_t *__field_2;\
79     \n};\
80     \n\
81     \nstruct __open_shift_sep_result {\
82     \n  uint64_t *__field_0;\
83     \n  uint64_t *__field_1;\
84     \n};\
85     \n\
86     \nstatic inline struct __open_sep_result\
87     \nopen_sep (uint64_t *r, uint64_t *x, uint64_t *y)\
88     \n{\
89     \n  struct __open_sep_result result;\
90     \n  result.__field_0 = r;\
91     \n  result.__field_1 = x;\
92     \n  result.__field_2 = y;\
93     \n  return result;\
94     \n}\
95     \n\
96     \nstatic inline struct __open_rx_result\
97     \nopen_rx (uint64_t *x, uint64_t *y)\
98     \n{\
99     \n  struct __open_rx_result result;\
100     \n  result.__field_0 = x;\
101     \n  result.__field_1 = x;\
102     \n  result.__field_2 = y;\
103     \n  return result;\
104     \n}\
105     \n\
106     \nstatic inline struct __open_shift_sep_result\
107     \nopen_shift_sep (uint64_t *r, uint64_t *x)\
108     \n{\
109     \n  struct __open_shift_sep_result result;\
110     \n  result.__field_0 = r;\
111     \n  result.__field_1 = x;\
112     \n  return result;\
113     \n}\
114   "
116   syntax val open_sep "open_sep"
117   syntax val open_rx "open_rx"
118   syntax val open_shift_sep "open_shift_sep"
119   syntax val close_sep "IGNORE3(%1, %2, %3)" prec 1 15 15 15
120   syntax val close_rx "IGNORE2(%1, %2)" prec 1 15 15
121   syntax val close_shift_sep "IGNORE2(%1, %2)" prec 1 15 15
125 module mpz.Z
127 interface
128 "\ntypedef struct\
129 \n{\
130 \n  int _alloc;\
131 \n  int _size;\
132 \n  uint64_t * _ptr;\
133 \n} __wmpz_struct;\
135 \ntypedef __wmpz_struct *wmpz_ptr;\
136 \ntypedef __wmpz_struct wmpz_t[1];\
138 \n#define SIZ(x) ((x)->_size)\
139 \n#define ALLOC(x) ((x)->_alloc)\
140 \n#define PTR(x) ((x)->_ptr)\
144   syntax type mpz_ptr "wmpz_ptr"
145   syntax type mpz_struct "__wmpz_struct"
146   syntax val mpz_eq "%1 == %2" prec 7 15 14
147   syntax val size_of "SIZ(%1)" prec 1 15
148   syntax val alloc_of "ALLOC(%1)" prec 1 15
151 module mpz.Zutil
153 prelude
154 "\nvoid __wmpz_init (wmpz_ptr x) {\
155 \n  ALLOC(x) = 1;\
156 \n  SIZ(x) = 0;\
157 \n  PTR(x) = malloc(sizeof(uint64_t));\
158 \n  PTR(x)[0] = 0;\
159 \n  return;\
160 \n}"
162 prelude
163 "\nvoid wmpz_clear (wmpz_ptr x)\
164 \n{\
165 \n  free (PTR(x));\
166 \n}"
168 interface "\n\
169 void __wmpz_init (wmpz_ptr);\
170 \nvoid wmpz_clear (wmpz_ptr);\
173   syntax val set_size "SIZ(%1) = %2" prec 14 15 14
174   syntax val set_size_0 "SIZ(%1) = 0" prec 14 15
175   syntax val wmpz_minus "SIZ(%1) = -SIZ(%1)" prec 14 15 15
176   syntax val set_alloc "ALLOC(%1) = %2" prec 14 15 14
177   syntax val set_ptr "PTR(%1) = %2" prec 14 15 14
178   syntax val get_read_ptr "PTR(%1)" prec 1 15
179   syntax val get_write_ptr "PTR(%1)" prec 1 15
180   syntax val release_reader "(void)(%1)" prec 2 15
181   syntax val release_writer "(void)(%1)" prec 2 15
182   syntax val wmpz_init "__wmpz_init" prec 2
183   syntax val wmpz_tmp_decl "{ 0, 0, NULL }" prec 2
184   syntax val wmpz_struct_to_ptr "&%1" prec 2 2
185   syntax val wmpz_clear "wmpz_clear" prec 2
189 blacklist "__wmpz_init"
191 module types.Types
192   remove module
195 module types.Int32Eq
196   remove module
199 module types.UInt64Eq
200   remove module
203 module logical.LogicalUtil
204   remove module