Bläddra i källkod

* GMP initial version.

git-svn-id: trunk@13667 -
marco 16 år sedan
förälder
incheckning
da9458587d

+ 16 - 0
.gitattributes

@@ -1814,6 +1814,22 @@ packages/ggi/fpmake.pp svneol=native#text/plain
 packages/ggi/src/ggi.pp svneol=native#text/plain
 packages/ggi/src/ggi2d.pp svneol=native#text/plain
 packages/ggi/src/gii.pp svneol=native#text/plain
+packages/gmp/Makefile svneol=native#text/plain
+packages/gmp/Makefile.fpc svneol=native#text/plain
+packages/gmp/examples/Makefile svneol=native#text/plain
+packages/gmp/examples/Makefile.fpc svneol=native#text/plain
+packages/gmp/examples/gmp_accept_test.pas svneol=native#text/plain
+packages/gmp/examples/gmp_test_impl.inc svneol=native#text/plain
+packages/gmp/examples/gmp_test_intf.inc svneol=native#text/plain
+packages/gmp/examples/gmp_testcase.pas svneol=native#text/plain
+packages/gmp/examples/pidigits_example.pas svneol=native#text/plain
+packages/gmp/examples/pidigits_example2.pas svneol=native#text/plain
+packages/gmp/examples/printf_example.pas svneol=native#text/plain
+packages/gmp/examples/printf_example2.pas svneol=native#text/plain
+packages/gmp/examples/scanf_example.pas svneol=native#text/plain
+packages/gmp/examples/scanf_example2.pas svneol=native#text/plain
+packages/gmp/readme svneol=native#text/plain
+packages/gmp/src/gmp.pas svneol=native#text/plain
 packages/gnome1/Makefile svneol=native#text/plain
 packages/gnome1/Makefile.fpc svneol=native#text/plain
 packages/gnome1/examples/gconfcallback1.pp svneol=native#text/plain

+ 2803 - 0
packages/gmp/Makefile

@@ -0,0 +1,2803 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/08/28]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifeq ($(OS_TARGET),darwin)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifndef DARWIN2DARWIN
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=gmp
+override PACKAGE_VERSION=2.5.1
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_UNITS+=gmp
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+override INSTALL_FPCPACKAGE=y
+override INSTALL_FPCSUBDIR=packages
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+override SHARED_BUILD=n
+override SHARED_BUILD=n
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifeq ($(OS_SOURCE),linux)
+ifndef GCCLIBDIR
+ifeq ($(CPU_TARGET),i386)
+ifneq ($(findstring x86_64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc64)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifndef GCCLIBDIR
+CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(CROSSGCC),)
+GCCLIBDIR:=$(shell dirname `$(CROSSGCC) -print-libgcc-file-name`)
+endif
+endif
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifdef inUnix
+ifeq ($(OS_SOURCE),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_examples
+ifneq ($(TARGET_EXAMPLES),)
+HASEXAMPLES=1
+override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMPLES)) $(addsuffix .pas,$(TARGET_EXAMPLES)) $(addsuffix .lpr,$(TARGET_EXAMPLES)) $(addsuffix .dpr,$(TARGET_EXAMPLES)))
+override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES))
+override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES)))
+override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+endif
+ifneq ($(TARGET_EXAMPLEDIRS),)
+HASEXAMPLES=1
+endif
+fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(TARGET_EXAMPLEDIRS))
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+ifeq ($(FULL_TARGET),i386-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifdef TARGET_EXAMPLEDIRS_EXAMPLES
+examples_all:
+	$(MAKE) -C examples all
+examples_debug:
+	$(MAKE) -C examples debug
+examples_smart:
+	$(MAKE) -C examples smart
+examples_release:
+	$(MAKE) -C examples release
+examples_units:
+	$(MAKE) -C examples units
+examples_examples:
+	$(MAKE) -C examples examples
+examples_shared:
+	$(MAKE) -C examples shared
+examples_install:
+	$(MAKE) -C examples install
+examples_sourceinstall:
+	$(MAKE) -C examples sourceinstall
+examples_exampleinstall:
+	$(MAKE) -C examples exampleinstall
+examples_distinstall:
+	$(MAKE) -C examples distinstall
+examples_zipinstall:
+	$(MAKE) -C examples zipinstall
+examples_zipsourceinstall:
+	$(MAKE) -C examples zipsourceinstall
+examples_zipexampleinstall:
+	$(MAKE) -C examples zipexampleinstall
+examples_zipdistinstall:
+	$(MAKE) -C examples zipdistinstall
+examples_clean:
+	$(MAKE) -C examples clean
+examples_distclean:
+	$(MAKE) -C examples distclean
+examples_cleanall:
+	$(MAKE) -C examples cleanall
+examples_info:
+	$(MAKE) -C examples info
+examples_makefiles:
+	$(MAKE) -C examples makefiles
+examples:
+	$(MAKE) -C examples all
+.PHONY: examples_all examples_debug examples_smart examples_release examples_units examples_examples examples_shared examples_install examples_sourceinstall examples_exampleinstall examples_distinstall examples_zipinstall examples_zipsourceinstall examples_zipexampleinstall examples_zipdistinstall examples_clean examples_distclean examples_cleanall examples_info examples_makefiles examples
+endif
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples: fpc_examples
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean $(addsuffix _clean,$(TARGET_EXAMPLEDIRS))
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 32 - 0
packages/gmp/Makefile.fpc

@@ -0,0 +1,32 @@
+#
+#   Makefile.fpc for Free Pascal ImLib 1.x Packages
+#
+
+[package]
+name=gmp 
+version=2.5.1
+
+[target]
+units=gmp
+exampledirs=examples
+
+[require]
+libc=y
+
+[compiler]
+includedir=src
+sourcedir=src 
+
+
+[install]
+fpcpackage=y
+fpcsubdir=packages
+
+[default]
+fpcdir=../..
+
+[shared]
+build=n
+
+[rules]
+.NOTPARALLEL:

+ 2045 - 0
packages/gmp/examples/Makefile

@@ -0,0 +1,2045 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/08/28]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifeq ($(OS_TARGET),darwin)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifndef DARWIN2DARWIN
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_PROGRAMS+=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+endif
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifeq ($(OS_SOURCE),linux)
+ifndef GCCLIBDIR
+ifeq ($(CPU_TARGET),i386)
+ifneq ($(findstring x86_64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc64)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifndef GCCLIBDIR
+CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(CROSSGCC),)
+GCCLIBDIR:=$(shell dirname `$(CROSSGCC) -print-libgcc-file-name`)
+endif
+endif
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifdef inUnix
+ifeq ($(OS_SOURCE),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl gmp
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_GMP=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_GMP
+PACKAGEDIR_GMP:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /gmp/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_GMP),)
+ifneq ($(wildcard $(PACKAGEDIR_GMP)/units/$(TARGETSUFFIX)),)
+UNITDIR_GMP=$(PACKAGEDIR_GMP)/units/$(TARGETSUFFIX)
+else
+UNITDIR_GMP=$(PACKAGEDIR_GMP)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_GMP)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_GMP) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_GMP)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_GMP=
+UNITDIR_GMP:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /gmp/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_GMP),)
+UNITDIR_GMP:=$(firstword $(UNITDIR_GMP))
+else
+UNITDIR_GMP=
+endif
+endif
+ifdef UNITDIR_GMP
+override COMPILER_UNITDIR+=$(UNITDIR_GMP)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_exes
+ifndef CROSSINSTALL
+ifneq ($(TARGET_PROGRAMS),)
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+endif
+fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 21 - 0
packages/gmp/examples/Makefile.fpc

@@ -0,0 +1,21 @@
+#
+#   Makefile.fpc for Free Pascal GTK 2.x.y Examples
+#
+
+[target]
+programs=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
+
+[require]
+packages=gmp
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../../..
+
+[rules]
+.NOTPARALLEL:
+
+
+

+ 45 - 0
packages/gmp/examples/gmp_accept_test.pas

@@ -0,0 +1,45 @@
+program gmp_accept_test;
+
+{$mode objfpc}{$H+}
+
+uses
+  heaptrc, testutils, strutils, math, sysutils, gmp, classes;
+
+
+type
+  TTestCase = class(TPersistent);
+  TTestCases = class of TTestCase;
+
+{$include gmp_test_intf}
+{$include gmp_test_impl}
+
+procedure Run(Tests: array of TTestCases);
+var
+  TestObj: TTestCase;
+  MethodList: TStringList;
+  TI, MI: integer;
+  Test: procedure of object;
+begin
+  for TI := 0 to Length(Tests) - 1 do begin
+    TestObj := Tests[TI].Create;
+    MethodList := TStringList.Create;
+    try
+      TMethod(Test).Data := TestObj;
+      GetMethodList(TestObj, MethodList);
+      for MI := 0 to MethodList.Count - 1 do begin
+        TMethod(Test).Code := MethodList.Objects[MI];
+        Test;
+      end;
+      WriteLn(Format('%s: Tests executed: %d.', [TestObj.ClassName, MethodList.Count]));
+    finally
+      MethodList.Free;
+      TestObj.Free;
+    end;
+  end;
+end;
+
+begin
+  HaltOnNotReleased := True; // exit code wanted
+  Run([TTestGmpBinding, TTestGmpExtensions, TTestGmpOperators]);
+end.
+

+ 7848 - 0
packages/gmp/examples/gmp_test_impl.inc

@@ -0,0 +1,7848 @@
+{$ifopt c-}
+{$error 'Must enable assertions'}
+{$endif}
+
+const
+  BASE10 = 10;
+  BASE16 = 16;
+  Z_FMT = '%Zd';
+  Q_FMT = '%Qd';
+
+function alloc_func(alloc_size: sizeuint): pointer; cdecl;
+begin
+  result := getmem(alloc_size);
+end;
+
+procedure free_proc(p: pointer; size: sizeuint); cdecl;
+begin
+  assert(size = size); // hint off
+  freemem(p);
+end;
+
+function reallocate_func(p: pointer; old_size, new_size: sizeuint): pointer; cdecl;
+begin
+  assert(old_size = old_size); // hint off
+  result := reallocmem(p, new_size);
+end;
+
+function rnd_test(var state: randstate_t): boolean;
+const N = 1000000;
+var r1, r2, r3: valuint;
+begin
+  r1 := mp_urandomm_ui(state, N);
+  r2 := mp_urandomm_ui(state, N);
+  r3 := mp_urandomm_ui(state, N);
+  result := (r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3));
+end;
+
+{ TTestGmpBinding }
+
+procedure TTestGmpBinding.mp_set_memory_functions_test;
+var
+  af0, af: alloc_func_t;
+  rf0, rf: reallocate_func_t;
+  fp0, fp: free_proc_t;
+begin
+  mp_get_memory_functions(@af0, @rf0, @fp0);
+  try
+    mp_set_memory_functions(@alloc_func, @reallocate_func, @free_proc);
+    mp_get_memory_functions(@af, @rf, @fp);
+    assert(af = @alloc_func);
+    assert(rf = @reallocate_func);
+    assert(fp = @free_proc);
+  finally
+    mp_set_memory_functions(af0, rf0, fp0);
+    mp_get_memory_functions(@af, @rf, @fp);
+    assert(af = af0);
+    assert(rf = rf0);
+    assert(fp = fp0);
+  end;
+end;
+
+procedure TTestGmpBinding.mp_get_memory_functions_test;
+var
+  af: alloc_func_t;
+  fp: free_proc_t;
+  rf: reallocate_func_t;
+begin
+  af := nil;
+  fp := nil;
+  rf := nil;
+  mp_get_memory_functions(nil, nil, nil);
+  assert(af = nil);
+  assert(fp = nil);
+  assert(rf = nil);
+
+  mp_get_memory_functions(@af, nil, nil);
+  assert(af <> nil);
+  assert(fp = nil);
+  assert(rf = nil);
+
+  af := nil;
+  mp_get_memory_functions(nil, @rf, nil);
+  assert(af = nil);
+  assert(fp = nil);
+  assert(rf <> nil);
+
+  rf := nil;
+  mp_get_memory_functions(nil, nil, @fp);
+  assert(af = nil);
+  assert(fp <> nil);
+  assert(rf = nil);
+end;
+
+procedure TTestGmpBinding.mp_randinit_default_test;
+var state: randstate_t;
+begin
+  mp_randinit_default(state);
+  assert(rnd_test(state));
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_randinit_mt_test;
+var state: randstate_t;
+begin
+  mp_randinit_mt(state);
+  assert(rnd_test(state));
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_randinit_lc_2exp_test;
+const
+  A_ =  3;
+  C = 5;
+  M2EXP = 8;
+var
+  state: randstate_t;
+  a: mpz_t;
+begin
+  mpz_init_set_ui(a, A_);
+  mp_randinit_lc_2exp(state, a, C, M2EXP);
+  assert(rnd_test(state));
+  mp_randclear(state);
+  mpz_clear(a);
+end;
+
+procedure TTestGmpBinding.mp_randinit_lc_2exp_size_test;
+var state: randstate_t;
+begin
+  assert(longbool(mp_randinit_lc_2exp_size(state, 0)));
+  assert(rnd_test(state));
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_randinit_set_test;
+var rop, op: randstate_t;
+begin
+  mp_randinit_default(op);
+  mp_randinit_set(rop, op);
+  assert(rnd_test(rop));
+  mp_randclear(rop);
+  mp_randclear(op);
+end;
+
+procedure TTestGmpBinding.mp_randclear_test;
+var state: randstate_t;
+begin
+  mp_randinit_default(state);
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_randseed_test;
+var
+  state: randstate_t;
+  seed: mpz_t;
+begin
+  mp_randinit_default(state);
+  mpz_init_set_ui(seed, 0);
+  mp_randseed(state, seed);
+  mp_randclear(state);
+  mpz_clear(seed);
+end;
+
+procedure TTestGmpBinding.mp_randseed_ui_test;
+var state: randstate_t;
+begin
+  mp_randinit_default(state);
+  mp_randseed_ui(state, 0);
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_urandomb_ui_test;
+const
+  B = 8 * (sizeof(valuint) - 1);
+  N = 1 shl B;
+var
+  state: randstate_t;
+  r1, r2, r3: valuint;
+begin
+  mp_randinit_default(state);
+  r1 := mp_urandomb_ui(state, B);
+  r2 := mp_urandomb_ui(state, B);
+  r3 := mp_urandomb_ui(state, B);
+  assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_urandomm_ui_test;
+const  N = high(valuint);
+var
+  state: randstate_t;
+  r1, r2, r3: valuint;
+begin
+  mp_randinit_default(state);
+  r1 := mp_urandomm_ui(state, N);
+  r2 := mp_urandomm_ui(state, N);
+  r3 := mp_urandomm_ui(state, N);
+  assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mp_asprintf_test;
+const
+  N = 123456;
+  S = '123456';
+var
+  z: mpz_t;
+  p: pchar;
+begin
+  mpz_init_set_ui(z, N);
+  assert(mp_asprintf(p, Z_FMT, [@z]) = length(S));
+  assert(p = S);
+  freemem(p);
+  mpz_clear(z);
+end;
+
+procedure TTestGmpBinding.mp_asprintf_test2;
+const
+  N = 123456;
+  S = '123456';
+var
+  z: mpz_t;
+  p: pchar;
+begin
+  mpz_init_set_ui(z, N);
+  assert(mp_asprintf(p, Z_FMT, @z) = length(S));
+  assert(p = S);
+  freemem(p);
+  mpz_clear(z);
+end;
+
+procedure TTestGmpBinding.mp_snprintf_test;
+const
+  N = 123456;
+  S = '123456';
+var
+  z: mpz_t;
+  buf: pchar;
+begin
+  mpz_init_set_ui(z, N);
+  getmem(buf, length(S) + 1);
+  assert(mp_snprintf(buf, length(S) + 1, Z_FMT, [@z]) = length(S));
+  assert(buf = S);
+  freemem(buf);
+  mpz_clear(z);
+end;
+
+procedure TTestGmpBinding.mp_snprintf_test2;
+const
+  N = 123456;
+  S = '123456';
+var
+  z: mpz_t;
+  buf: pchar;
+begin
+  mpz_init_set_ui(z, N);
+  getmem(buf, length(S) + 1);
+  assert(mp_snprintf(buf, length(S) + 1, Z_FMT, @z) = length(S));
+  assert(buf = S);
+  freemem(buf);
+  mpz_clear(z);
+end;
+
+procedure TTestGmpBinding.mp_sprintf_test;
+const
+  N = 123456;
+  S = '123456';
+var
+  z: mpz_t;
+  buf: pchar;
+begin
+  mpz_init_set_ui(z, N);
+  getmem(buf, length(S) + 1);
+  assert(mp_sprintf(buf, Z_FMT, [@z]) = length(S));
+  assert(buf = S);
+  freemem(buf);
+  mpz_clear(z);
+end;
+
+procedure TTestGmpBinding.mp_sprintf_test2;
+const
+  N = 123456;
+  S = '123456';
+var
+  z: mpz_t;
+  buf: pchar;
+begin
+  mpz_init_set_ui(z, N);
+  getmem(buf, length(S) + 1);
+  assert(mp_sprintf(buf, Z_FMT, @z) = length(S));
+  assert(buf = S);
+  freemem(buf);
+  mpz_clear(z);
+end;
+
+procedure TTestGmpBinding.mp_sscanf_test;
+const
+  N = 3;
+  D = 2;
+var q: mpq_t;
+begin
+  mpq_init(q);
+  assert(mp_sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, [@q]) = 1);
+  assert(mpq_cmp_ui(q, N, D) = 0);
+  mpq_clear(q);
+end;
+
+procedure TTestGmpBinding.mp_sscanf_test2;
+const
+  N = 3;
+  D = 2;
+var q: mpq_t;
+begin
+  mpq_init(q);
+  assert(mp_sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, @q) = 1);
+  assert(mpq_cmp_ui(q, N, D) = 0);
+  mpq_clear(q);
+end;
+
+procedure TTestGmpBinding.mpz_init_test;
+var integer_: mpz_t;
+begin
+  mpz_init(integer_);
+  assert(mpz_get_si(integer_) = 0);
+  mpz_clear(integer_);
+end;
+
+procedure TTestGmpBinding.mpz_clear_test;
+const N = 1000000;
+var integer_: mpz_t;
+begin
+  mpz_init2(integer_, N);
+  assert(mpz_get_si(integer_) = 0);
+  mpz_clear(integer_);
+end;
+
+procedure TTestGmpBinding.mpz_init2_test;
+const N = 1000000;
+var integer_: mpz_t;
+begin
+  mpz_init2(integer_, N);
+  assert(mpz_get_si(integer_) = 0);
+  mpz_clear(integer_);
+end;
+
+procedure TTestGmpBinding.mpz_init_set_si_test;
+const N = -1000000;
+var rop: mpz_t;
+begin
+  mpz_init_set_si(rop, N);
+  assert(mpz_get_si(rop) = N);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_init_set_ui_test;
+const N = 1000000;
+var rop: mpz_t;
+begin
+  mpz_init_set_ui(rop, N);
+  assert(mpz_get_ui(rop) = N);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_init_set_d_test;
+const N = -1000000;
+var rop: mpz_t;
+begin
+  mpz_init_set_d(rop, N);
+  assert(mpz_get_si(rop) = N);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_init_set_test;
+const N = -1000000;
+var rop, op: mpz_t;
+begin
+  mpz_init_set_si(op, N);
+  mpz_init_set(rop, op);
+  assert(mpz_get_si(rop) = N);
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_init_set_str_test;
+const N = 1000000;
+var rop: mpz_t;
+begin
+  assert(mpz_init_set_str(rop, pchar(inttostr(N)), BASE10) = 0);
+  assert(mpz_get_si(rop) = N);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_realloc_test;
+const N = 1000;
+var integer_: mpz_t;
+begin
+  mpz_init(integer_);
+  mpz_realloc(integer_, N);
+  mpz_clear(integer_)
+end;
+
+procedure TTestGmpBinding.mpz_realloc2_test;
+const N = 1000;
+var integer_: mpz_t;
+begin
+  mpz_init(integer_);
+  mpz_realloc2(integer_, N);
+  mpz_clear(integer_)
+end;
+
+procedure TTestGmpBinding.mpz_getlimbn_test;
+const N = 1234;
+var op: mpz_t;
+begin
+  mpz_init_set_ui(op, N);
+  assert(mpz_getlimbn(op, 0) = N);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_export_test;
+type t = word;
+const
+  N = 1000000;
+  BUF_HIGH = sizeof(N) div sizeof(t);
+var
+  export_op, import_op: mpz_t;
+  buf: array[0..BUF_HIGH] of t;
+  count: sizeuint;
+begin
+  mpz_init_set_si(export_op, N);
+  mpz_init(import_op);
+  mpz_export(buf, count, -1, sizeof(t), 0, 0, export_op);
+  mpz_import(import_op, count, -1, sizeof(t), 0, 0, buf);
+  assert(mpz_get_si(export_op) =mpz_get_si(import_op));
+  mpz_clear(export_op);
+  mpz_clear(import_op);
+end;
+
+procedure TTestGmpBinding.mpz_import_test;
+type t = word;
+const
+  N = 1000000;
+  BUF_HIGH = sizeof(N) div sizeof(t);
+var
+  export_op, import_op: mpz_t;
+  buf: array[0..BUF_HIGH] of t;
+  count: sizeuint;
+begin
+  mpz_init_set_si(export_op, N);
+  mpz_init(import_op);
+  mpz_export(buf, count, -1, sizeof(t), 0, 0, export_op);
+  mpz_import(import_op, count, -1, sizeof(t), 0, 0, buf);
+  assert(mpz_get_si(export_op) =mpz_get_si(import_op));
+  mpz_clear(export_op);
+  mpz_clear(import_op);
+end;
+
+procedure TTestGmpBinding.mpz_swap_test;
+const
+  ROP_1 = -1000;
+  ROP_2 = 1000000;
+var rop1, rop2: mpz_t;
+begin
+  mpz_init_set_si(rop1, ROP_1);
+  mpz_init_set_si(rop2, ROP_2);
+  mpz_swap(rop1, rop2);
+  assert(mpz_get_si(rop1) = ROP_2);
+  assert(mpz_get_si(rop2) = ROP_1);
+  mpz_clear(rop1);
+  mpz_clear(rop2);
+end;
+
+procedure TTestGmpBinding.mpz_set_test;
+const OP_ = 1000000;
+var rop, op: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, OP_);
+  mpz_set(rop, op);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_set_d_test;
+const OP_ = 1000000;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_set_d(rop, OP_);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_set_f_test;
+const OP_ = -10;
+var
+  op: mpf_t;
+  rop: mpz_t;
+begin
+  mpf_init_set_si(op, OP_);
+  mpz_init(rop);
+  mpz_set_f(rop, op);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_set_q_test;
+const OP_ = -10;
+var
+  op: mpq_t;
+  rop: mpz_t;
+begin
+  mpq_init(op);
+  mpz_init(rop);
+  mpq_set_si(op, OP_, 1);
+  mpz_set_q(rop, op);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+  mpq_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_set_si_test;
+const OP_ = -1000000;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_set_si(rop, OP_);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_set_str_test;
+const OP_ = -1000000;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  assert(mpz_set_str(rop, pchar(inttostr(OP_)), BASE10) = 0);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_set_ui_test;
+const OP_ = 1000000;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_set_ui(rop, OP_);
+  assert(mpz_get_si(rop) = OP_);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_get_d_test;
+const N = -1000;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, N);
+  assert(mpz_get_d(op) = N);
+  mpz_clear(op)
+end;
+
+procedure TTestGmpBinding.mpz_get_d_2exp_test;
+const
+  N_LG2 = 4;
+  N = 1 shl N_LG2;
+var
+  op: mpz_t;
+  exp: mp_exp_t;
+begin
+  mpz_init_set_si(op, N);
+  assert(mpz_get_d_2exp(exp, op) = 1 / 2);
+  assert(exp = N_LG2 + 1);
+  mpz_clear(op)
+end;
+
+procedure TTestGmpBinding.mpz_get_si_test;
+const N = -1000000;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, N);
+  assert(mpz_get_si(op) = N);
+  mpz_clear(op)
+end;
+
+procedure TTestGmpBinding.mpz_get_str_test;
+const N = -1000000;
+var
+  op: mpz_t;
+  p: pchar;
+  s0, s1: string;
+begin
+  mpz_init_set_si(op, N);
+  s0 := inttostr(N);
+  p :=mpz_get_str(nil, BASE10, op);
+  assert(s0 = p);
+  freemem(p);
+  setlength(s1, length(s0));
+  assert(pointer(mpz_get_str(pchar(s1), BASE10, op)) = pointer(s1));
+  assert(s0 = s1);
+  mpz_clear(op)
+end;
+
+procedure TTestGmpBinding.mpz_get_ui_test;
+const N = 1000000;
+var op: mpz_t;
+begin
+  mpz_init_set_ui(op, N);
+  assert(mpz_get_ui(op) = N);
+  mpz_clear(op)
+end;
+
+procedure TTestGmpBinding.mpz_add_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_add(rop, op1, op2);
+  assert(mpz_get_si(rop) = OP_1 + OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_add_ui_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_add_ui(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = OP_1 + OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_sub_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_sub(rop, op1, op2);
+  assert(mpz_get_si(rop) = OP_1 - OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_sub_ui_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_sub_ui(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = OP_1 - OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_ui_sub_test;
+const
+  OP_1 = 1000;
+  OP_2 = 1000000;
+var rop, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op2, OP_2);
+  mpz_ui_sub(rop, OP_1, op2);
+  assert(mpz_get_si(rop) = OP_1 - OP_2);
+  mpz_clear(rop);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_mul_test;
+const
+  OP_1 = -10;
+  OP_2 = 1000;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_mul(rop, op1, op2);
+  assert(mpz_get_si(rop) = OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_mul_si_test;
+const
+  OP_1 = 10;
+  OP_2 = -1000;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_mul_si(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_mul_ui_test;
+const
+  OP_1 = -10;
+  OP_2 = 1000;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_mul_ui(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_addmul_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init_set_si(rop, ROP_);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_addmul(rop, op1, op2);
+  assert(mpz_get_si(rop) = ROP_ + OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_addmul_ui_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1: mpz_t;
+begin
+  mpz_init_set_si(rop, ROP_);
+  mpz_init_set_si(op1, OP_1);
+  mpz_addmul_ui(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = ROP_ + OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_submul_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init_set_si(rop, ROP_);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_submul(rop, op1, op2);
+  assert(mpz_get_si(rop) = ROP_ - OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_submul_ui_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1: mpz_t;
+begin
+  mpz_init_set_si(rop, ROP_);
+  mpz_init_set_si(op1, OP_1);
+  mpz_submul_ui(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = ROP_ - OP_1 * OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_mul_2exp_test;
+const
+  OP_1 = 10;
+  OP_2 = 10;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_mul_2exp(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = OP_1 * (1 shl OP_2));
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_neg_test;
+const OP_ = 1000;
+var rop, op: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, OP_);
+  mpz_neg(rop, op);
+  assert(mpz_get_si(rop) = -OP_);
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_abs_test;
+const OP_ = -1000;
+var rop, op: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, OP_);
+  mpz_abs(rop, op);
+  assert(mpz_get_si(rop) = abs(OP_));
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_q_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_cdiv_q(q, n, d);
+  assert(mpz_get_si(q) = ceil(N_ / D_));
+  mpz_clear(q);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_q_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_fdiv_q(q, n, d);
+  assert(mpz_get_si(q) = floor(N_ / D_));
+  mpz_clear(q);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_q_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_tdiv_q(q, n, d);
+  assert(mpz_get_si(q) = trunc(N_ / D_));
+  mpz_clear(q);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_q_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var q, n: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_cdiv_q_2exp(q, n, B_);
+  assert(mpz_get_si(q) = ceil(N_ / D_));
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_q_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var q, n: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_fdiv_q_2exp(q, n, B_);
+  assert(mpz_get_si(q) = floor(N_ / D_));
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_q_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var q, n: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_tdiv_q_2exp(q, n, B_);
+  assert(mpz_get_si(q) = trunc(N_ / D_));
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_q_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_cdiv_q_ui(q, n, D_);
+  assert(mpz_get_si(q) = ceil(N_ / D_));
+  assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_q_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_fdiv_q_ui(q, n, D_);
+  assert(mpz_get_si(q) = floor(N_ / D_));
+  assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_q_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_tdiv_q_ui(q, n, D_);
+  assert(mpz_get_si(q) = trunc(N_ / D_));
+  assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_qr_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, r, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_cdiv_qr(q, r, n, d);
+  assert(mpz_get_si(q) = ceil(N_ / D_));
+  assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_qr_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, r, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_fdiv_qr(q, r, n, d);
+  assert(mpz_get_si(q) = floor(N_ / D_));
+  assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_qr_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, r, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_tdiv_qr(q, r, n, d);
+  assert(mpz_get_si(q) = trunc(N_ / D_));
+  assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_qr_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, r, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(q);
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_cdiv_qr_ui(q, r, n, D_);
+  assert(mpz_get_si(q) = ceil(N_ / D_));
+  assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
+  assert(ur - abs(mpz_get_si(r)) = 0);
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_qr_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, r, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(q);
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_fdiv_qr_ui(q, r, n, D_);
+  assert(mpz_get_si(q) = floor(N_ / D_));
+  assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
+  assert(ur - abs(mpz_get_si(r)) = 0);
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_qr_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, r, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(q);
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_tdiv_qr_ui(q, r, n, D_);
+  assert(mpz_get_si(q) = trunc(N_ / D_));
+  assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
+  assert(ur - abs(mpz_get_si(r)) = 0);
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_r_test;
+const
+  N_ = -17;
+  D_ = 4;
+var r, n, d: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_cdiv_r(r, n, d);
+  assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_r_test;
+const
+  N_ = -17;
+  D_ = 4;
+var r, n, d: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_fdiv_r(r, n, d);
+  assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_r_test;
+const
+  N_ = -17;
+  D_ = 4;
+var r, n, d: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_tdiv_r(r, n, d);
+  assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_r_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var r, n: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_cdiv_r_2exp(r, n, B_);
+  assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_r_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var r, n: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_fdiv_r_2exp(r, n, B_);
+  assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_r_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var r, n: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_tdiv_r_2exp(r, n, B_);
+  assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_r_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  r, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_cdiv_r_ui(r, n, D_);
+  assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  assert(ur - abs(mpz_get_si(r)) = 0);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_r_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  r, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_fdiv_r_ui(r, n, D_);
+  assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  assert(ur - abs(mpz_get_si(r)) = 0);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_r_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  r, n: mpz_t;
+  ur: valuint;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  ur :=mpz_tdiv_r_ui(r, n, D_);
+  assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
+  assert(ur - abs(mpz_get_si(r)) = 0);
+  mpz_clear(r);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_cdiv_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_cdiv_ui(n, D_) - abs(N_ - ceil(N_ / D_) * D_) = 0);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_fdiv_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_fdiv_ui(n, D_) - abs(N_ - floor(N_ / D_) * D_) = 0);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_tdiv_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_tdiv_ui(n, D_) = abs(N_ - trunc(N_ / D_) * D_));
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_mod_test;
+const
+  N_ = 17;
+  D_ = -4;
+var r, n, d: mpz_t;
+begin
+  mpz_init(r);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_mod(r, n, d);
+  assert(mpz_get_si(r) = N_ mod abs(D_));
+  mpz_clear(r);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_divexact_test;
+const
+  N_ = -16;
+  D_ = 4;
+var q, n, d: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  mpz_divexact(q, n, d);
+  assert(mpz_get_si(q) * D_ = N_);
+  mpz_clear(q);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_divexact_ui_test;
+const
+  N_ = -16;
+  D_ = 4;
+var q, n: mpz_t;
+begin
+  mpz_init(q);
+  mpz_init_set_si(n, N_);
+  mpz_divexact_ui(q, n, D_);
+  assert(mpz_get_si(q) * D_ = N_);
+  mpz_clear(q);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_divisible_p_test;
+const
+  N_ = -16;
+  D_ = 4;
+var n, d: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(d, D_);
+  assert(mpz_divisible_p(n, d) <> 0);
+  mpz_set_si(n,mpz_get_si(n) + 1);
+  assert(mpz_divisible_p(n, d) = 0);
+  mpz_clear(n);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_divisible_ui_p_test;
+const
+  N_ = -16;
+  D_ = 4;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_divisible_ui_p(n, D_) <> 0);
+  mpz_set_si(n,mpz_get_si(n) + 1);
+  assert(mpz_divisible_ui_p(n, D_) = 0);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_divisible_2exp_p_test;
+const
+  N_ = -16;
+  B_ = 2;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_divisible_2exp_p(n, B_) <> 0);
+  mpz_set_si(n,mpz_get_si(n) + 1);
+  assert(mpz_divisible_ui_p(n, B_) = 0);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_congruent_p_test;
+const
+  N_ = 23;
+  C_ = 6;
+  D_ = 17;
+var n, c, d: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(c, C_);
+  mpz_init_set_si(d, D_);
+  assert(mpz_congruent_p(n, c, d) <> 0);
+  mpz_set_si(n,mpz_get_si(n) + 1);
+  assert(mpz_congruent_p(n, c, d) = 0);
+  mpz_clear(n);
+  mpz_clear(c);
+  mpz_clear(d);
+end;
+
+procedure TTestGmpBinding.mpz_congruent_2exp_p_test;
+const
+  N_ = 23;
+  C_ = 7;
+  B_ = 4;
+var n, c: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  mpz_init_set_si(c, C_);
+  assert(mpz_congruent_2exp_p(n, c, B_) <> 0);
+  mpz_set_si(n,mpz_get_si(n) + 1);
+  assert(mpz_congruent_2exp_p(n, c, B_) = 0);
+  mpz_clear(n);
+  mpz_clear(c);
+end;
+
+procedure TTestGmpBinding.mpz_congruent_ui_p_test;
+const
+  N_ = 23;
+  C_ = 6;
+  D_ = 17;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_congruent_ui_p(n, C_, D_) <> 0);
+  mpz_set_si(n,mpz_get_si(n) + 1);
+  assert(mpz_congruent_ui_p(n, C_, D_) = 0);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_powm_test;
+const
+  N_EXP = 3;
+  N_MOD = 16;
+  ROP_ = 8;
+var rop, base, exp, mod_: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(base, BASE10);
+  mpz_init_set_si(exp, N_EXP);
+  mpz_init_set_si(mod_, N_MOD);
+  mpz_powm(rop, base, exp, mod_);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(base);
+  mpz_clear(exp);
+  mpz_clear(mod_);
+end;
+
+procedure TTestGmpBinding.mpz_powm_ui_test;
+const
+  N_EXP = 3;
+  N_MOD = 16;
+  ROP_ = 8;
+var rop, base, mod_: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(base, BASE10);
+  mpz_init_set_si(mod_, N_MOD);
+  mpz_powm_ui(rop, base, N_EXP, mod_);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(base);
+  mpz_clear(mod_);
+end;
+
+procedure TTestGmpBinding.mpz_pow_ui_test;
+const
+  BASE_ = 10;
+  EXP = 3;
+var rop, base: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(base, BASE_);
+  mpz_pow_ui(rop, base, EXP);
+  assert(mpz_get_si(rop) = BASE_ ** EXP);
+  mpz_clear(rop);
+  mpz_clear(base);
+end;
+
+procedure TTestGmpBinding.mpz_ui_pow_ui_test;
+const
+  BASE_ = 10;
+  EXP = 3;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_ui_pow_ui(rop, BASE_, EXP);
+  assert(mpz_get_si(rop) = BASE_ ** EXP);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_root_test;
+const
+  ROOT = 5;
+  N_ = 3;
+var rop, op: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, ROOT ** N_);
+  assert(mpz_root(rop, op, N_) <> 0);
+  assert(mpz_get_si(rop) = ROOT);
+  mpz_set_si(op, ROOT ** N_ + 1);
+  assert(mpz_root(rop, op, N_) = 0);
+  assert(mpz_get_si(rop) = ROOT);
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_rootrem_test;
+const
+  ROOT_ = 5;
+  N_ = 3;
+  REM_ = 1;
+var root, rem, u: mpz_t;
+begin
+  assert(REM_ < ROOT_);
+  mpz_init(root);
+  mpz_init(rem);
+  mpz_init_set_si(u, ROOT_ ** N_);
+  mpz_rootrem(root, rem, u, N_);
+  assert(mpz_get_si(root) = ROOT_);
+  assert(mpz_get_si(rem) = 0);
+  mpz_set_si(u, ROOT_ ** N_ + REM_);
+  mpz_rootrem(root, rem, u, N_);
+  assert(mpz_get_si(root) = ROOT_);
+  assert(mpz_get_si(rem) = REM_);
+  mpz_clear(root);
+  mpz_clear(rem);
+  mpz_clear(u);
+end;
+
+procedure TTestGmpBinding.mpz_sqrt_test;
+const ROOT = 5;
+var rop, op: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, ROOT ** 2);
+  mpz_sqrt(rop, op);
+  assert(mpz_get_si(rop) = ROOT);
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_sqrtrem_test;
+const
+  ROOT = 5;
+  REM = 1;
+var rop1, rop2, op: mpz_t;
+begin
+  mpz_init(rop1);
+  mpz_init(rop2);
+  mpz_init_set_si(op, ROOT ** 2 + REM);
+  mpz_sqrtrem(rop1, rop2, op);
+  assert(mpz_get_si(rop1) = ROOT);
+  assert(mpz_get_si(rop2) = REM);
+  mpz_clear(rop1);
+  mpz_clear(rop2);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_perfect_power_p_test;
+const
+  ROOT = 3;
+  EXP = 3;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, ROOT ** EXP);
+  assert(mpz_perfect_power_p(op) <> 0);
+  mpz_set_si(op, ROOT ** EXP + 1);
+  assert(mpz_perfect_power_p(op) = 0);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_perfect_square_p_test;
+const ROOT = 3;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, ROOT ** 2);
+  assert(mpz_perfect_square_p(op) <> 0);
+  mpz_set_si(op, ROOT ** 2 or 2);
+  assert(mpz_perfect_square_p(op) = 0);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_probab_prime_p_test;
+const
+  N_ = 127;
+  REPS = 5;
+var n: mpz_t;
+begin
+  mpz_init_set_si(n, N_);
+  assert(mpz_probab_prime_p(n, REPS) = 2);
+  mpz_set_si(n, N_ + 1);
+  assert(mpz_probab_prime_p(n, REPS) = 0);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_nextprime_test;
+const
+  PRIME3 = 5;
+  PRIME4 = 7;
+var rop, op: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, PRIME3);
+  mpz_nextprime(rop, op);
+  assert(mpz_get_si(rop) = PRIME4);
+  mpz_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_gcd_test;
+const
+  OP_1 = 42;
+  OP_2 = 56;
+  ROP_ = 14;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_gcd(rop, op1, op2);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_gcd_ui_test;
+const
+  OP_1 = 42;
+  OP_2 = 56;
+  ROP_ = 14;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  assert(mpz_gcd_ui(rop, op1, OP_2) = ROP_);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_gcdext_test;
+const
+  A_ = 42;
+  B_ = 56;
+  G_ = 14;
+var g, s, t, a, b: mpz_t;
+begin
+  mpz_init(g);
+  mpz_init(s);
+  mpz_init(t);
+  mpz_init_set_si(a, A_);
+  mpz_init_set_si(b, B_);
+  mpz_gcdext(g, s, t, a, b);
+  assert(mpz_get_si(g) = G_);
+  assert(A_ *mpz_get_si(s) + B_ *mpz_get_si(t) = G_);
+  mpz_clear(g);
+  mpz_clear(s);
+  mpz_clear(t);
+  mpz_clear(a);
+  mpz_clear(b);
+end;
+
+procedure TTestGmpBinding.mpz_lcm_test;
+const
+  OP_1 = 21;
+  OP_2 = 6;
+  ROP_ = 42;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_lcm(rop, op1, op2);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_lcm_ui_test;
+const
+  OP_1 = 21;
+  OP_2 = 6;
+  ROP_ = 42;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_lcm_ui(rop, op1, OP_2);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_invert_test;
+const
+  OP_1 = 256;
+  OP_2 = 337;
+  ROP_ = 104;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  assert(mpz_invert(rop, op1, op2) <> 0);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_jacobi_test;
+const
+  B0 = 11;
+  A0 = 13 * B0;
+  AM1 = 1001;
+  BM1 = 9907;
+  A1 = 4;
+  B1 = 7;
+var a, b: mpz_t;
+begin
+  mpz_init_set_si(a, A0);
+  mpz_init_set_si(b, B0);
+  assert(mpz_jacobi(a, b) = 0);
+  mpz_set_si(a, AM1);
+  mpz_set_si(b, BM1);
+  assert(mpz_jacobi(a, b) = -1);
+  mpz_set_si(a, A1);
+  mpz_set_si(b, B1);
+  assert(mpz_jacobi(a, b) = 1);
+  mpz_clear(a);
+  mpz_clear(b);
+end;
+
+procedure TTestGmpBinding.mpz_kronecker_si_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var a: mpz_t;
+begin
+  mpz_init_set_si(a, A_);
+  assert(mpz_kronecker_si(a, B1) = 1);
+  assert(mpz_kronecker_si(a, B0) = 0);
+  assert(mpz_kronecker_si(a, BM1) = -1);
+  mpz_clear(a);
+end;
+
+procedure TTestGmpBinding.mpz_kronecker_ui_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var a: mpz_t;
+begin
+  mpz_init_set_si(a, A_);
+  assert(mpz_kronecker_ui(a, B1) = 1);
+  assert(mpz_kronecker_ui(a, B0) = 0);
+  assert(mpz_kronecker_ui(a, BM1) = -1);
+  mpz_clear(a);
+end;
+
+procedure TTestGmpBinding.mpz_si_kronecker_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var b: mpz_t;
+begin
+  mpz_init_set_si(b, B1);
+  assert(mpz_si_kronecker(A_, b) = 1);
+  mpz_set_si(b, B0);
+  assert(mpz_si_kronecker(A_, b) = 0);
+  mpz_set_si(b, BM1);
+  assert(mpz_si_kronecker(A_, b) = -1);
+  mpz_clear(b);
+end;
+
+procedure TTestGmpBinding.mpz_ui_kronecker_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var b: mpz_t;
+begin
+  mpz_init_set_si(b, B1);
+  assert(mpz_ui_kronecker(A_, b) = 1);
+  mpz_set_si(b, B0);
+  assert(mpz_ui_kronecker(A_, b) = 0);
+  mpz_set_si(b, BM1);
+  assert(mpz_ui_kronecker(A_, b) = -1);
+  mpz_clear(b);
+end;
+
+procedure TTestGmpBinding.mpz_remove_test;
+const
+  F_ = 5;
+  OP_ = 3 * F_ * 7;
+  ROP_ = OP_ div F_;
+var rop, op, f: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op, OP_);
+  mpz_init_set_si(f, F_);
+  assert(mpz_remove(rop, op, f) = 1);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(op);
+  mpz_clear(f);
+end;
+
+procedure TTestGmpBinding.mpz_fac_ui_test;
+const
+  OP = 4;
+  ROP_ = 2 * 3 * 4;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_fac_ui(rop, OP);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_bin_ui_test;
+const
+  N_ = 7;
+  K = 3;
+  ROP_ = 35;
+var rop, n: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(n, N_);
+  mpz_bin_ui(rop, n, K);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+  mpz_clear(n);
+end;
+
+procedure TTestGmpBinding.mpz_bin_uiui_test;
+const
+  N = 7;
+  K = 3;
+  ROP_ = 35;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_bin_uiui(rop, N, K);
+  assert(mpz_get_si(rop) = ROP_);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_fib_ui_test;
+const
+  N = 10;
+  FN_ = 55;
+var fn: mpz_t;
+begin
+  mpz_init(fn);
+  mpz_fib_ui(fn, N);
+  assert(mpz_get_si(fn) = FN_);
+  mpz_clear(fn);
+end;
+
+procedure TTestGmpBinding.mpz_fib2_ui_test;
+const
+  N = 10;
+  FN_ = 55;
+  FNSUB1_ = 34;
+var fn, fnsub1: mpz_t;
+begin
+  mpz_init(fn);
+  mpz_init(fnsub1);
+  mpz_fib2_ui(fn, fnsub1, N);
+  assert(mpz_get_si(fn) = FN_);
+  assert(mpz_get_si(fnsub1) = FNSUB1_);
+  mpz_clear(fn);
+  mpz_clear(fnsub1);
+end;
+
+procedure TTestGmpBinding.mpz_lucnum_ui_test;
+const
+  N = 10;
+  LN_ = 123;
+var ln: mpz_t;
+begin
+  mpz_init(ln);
+  mpz_lucnum_ui(ln, N);
+  assert(mpz_get_si(ln) = LN_);
+  mpz_clear(ln);
+end;
+
+procedure TTestGmpBinding.mpz_lucnum2_ui_test;
+const
+  N = 10;
+  LN_ = 123;
+  LNSUB1_ = 76;
+var ln, lnsub1: mpz_t;
+begin
+  mpz_init(ln);
+  mpz_init(lnsub1);
+  mpz_lucnum2_ui(ln, lnsub1, N);
+  assert(mpz_get_si(ln) = LN_);
+  assert(mpz_get_si(lnsub1) = LNSUB1_);
+  mpz_clear(ln);
+  mpz_clear(lnsub1);
+end;
+
+procedure TTestGmpBinding.mpz_cmp_test;
+const
+  OP_1 = -10;
+  OP_2 = OP_1 - 1;
+var op1, op2: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  assert(mpz_cmp(op1, op2) > 0);
+  mpz_set_si(op2, OP_1);
+  assert(mpz_cmp(op1, op2) = 0);
+  mpz_set_si(op2, OP_1 + 1);
+  assert(mpz_cmp(op1, op2) < 0);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_cmp_d_test;
+const
+  OP_1 = -10;
+var op1: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  assert(mpz_cmp_d(op1, OP_1 - 1) > 0);
+  assert(mpz_cmp_d(op1, OP_1) = 0);
+  assert(mpz_cmp_d(op1, OP_1 + 1) < 0);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_cmp_si_test;
+const
+  OP_1 = -10;
+var op1: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  assert(mpz_cmp_si(op1, OP_1 - 1) > 0);
+  assert(mpz_cmp_si(op1, OP_1) = 0);
+  assert(mpz_cmp_si(op1, OP_1 + 1) < 0);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_cmp_ui_test;
+const
+  OP_1 = 10;
+var op1: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  assert(mpz_cmp_ui(op1, OP_1 - 1) > 0);
+  assert(mpz_cmp_ui(op1, OP_1) = 0);
+  assert(mpz_cmp_ui(op1, OP_1 + 1) < 0);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_cmpabs_test;
+const
+  OP_1 = -10;
+  OP_2 = -OP_1 - 1;
+var op1, op2: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, -OP_2);
+  assert(mpz_cmpabs(op1, op2) > 0);
+  mpz_set_si(op2, -OP_1);
+  assert(mpz_cmpabs(op1, op2) = 0);
+  mpz_set_si(op2, -OP_1 + 1);
+  assert(mpz_cmpabs(op1, op2) < 0);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_cmpabs_d_test;
+const OP_1 = -10;
+var op1: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  assert(mpz_cmpabs_d(op1, -OP_1 - 1) > 0);
+  assert(mpz_cmpabs_d(op1, -OP_1) = 0);
+  assert(mpz_cmpabs_d(op1, -OP_1 + 1) < 0);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_cmpabs_ui_test;
+const OP_1 = -10;
+var op1: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  assert(mpz_cmpabs_ui(op1, -OP_1 - 1) > 0);
+  assert(mpz_cmpabs_ui(op1, -OP_1) = 0);
+  assert(mpz_cmpabs_ui(op1, -OP_1 + 1) < 0);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_and_test;
+const
+  OP_1 = $c;
+  OP_2 = $a;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_and(rop, op1, op2);
+  assert(mpz_get_si(rop) = OP_1 and OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_ior_test;
+const
+  OP_1 = $c;
+  OP_2 = $a;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_ior(rop, op1, op2);
+  assert(mpz_get_si(rop) = OP_1 or OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_xor_test;
+const
+  OP_1 = $c;
+  OP_2 = $a;
+var rop, op1, op2: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  mpz_xor(rop, op1, op2);
+  assert(mpz_get_si(rop) = OP_1 xor OP_2);
+  mpz_clear(rop);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_com_test;
+const
+  OP_1 = 2;
+var rop, op1: mpz_t;
+begin
+  mpz_init(rop);
+  mpz_init_set_si(op1, OP_1);
+  mpz_com(rop, op1);
+  assert(mpz_get_si(rop) = not OP_1 );
+  mpz_clear(rop);
+  mpz_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpz_popcount_test;
+const
+  OP_ = $55AA;
+  N = 8;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, OP_);
+  assert(mpz_popcount(op) = N);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_hamdist_test;
+const
+  OP_1 = $55;
+  OP_2 = $7A;
+  N = 5;
+var op1, op2: mpz_t;
+begin
+  mpz_init_set_si(op1, OP_1);
+  mpz_init_set_si(op2, OP_2);
+  assert(mpz_hamdist(op1, op2) = N);
+  mpz_clear(op1);
+  mpz_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpz_scan0_test;
+const
+  OP_ = $F75;
+  STARTING_BIT = 4;
+  N = 7;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, OP_);
+  assert(mpz_scan0(op, STARTING_BIT) = N);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_scan1_test;
+const
+  OP_ = $85;
+  STARTING_BIT = 4;
+  N = 7;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, OP_);
+  assert(mpz_scan1(op, STARTING_BIT) = N);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_setbit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX = 7;
+var rop: mpz_t;
+begin
+  mpz_init_set_ui(rop, ROP_);
+  mpz_setbit(rop, BIT_INDEX);
+  assert(mpz_get_ui(rop) = ROP_ or (1 shl BIT_INDEX));
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_clrbit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX = 9;
+var rop: mpz_t;
+begin
+  mpz_init_set_ui(rop, ROP_);
+  mpz_clrbit(rop, BIT_INDEX);
+  assert(mpz_get_ui(rop) = ROP_ and not (1 shl BIT_INDEX));
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_combit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX = 7;
+var rop: mpz_t;
+begin
+  mpz_init_set_ui(rop, ROP_);
+  mpz_combit(rop, BIT_INDEX);
+  assert(mpz_get_ui(rop) = ROP_ xor (1 shl BIT_INDEX));
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_tstbit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX1 = 7;
+  BIT_INDEX2 = 8;
+var rop: mpz_t;
+begin
+  mpz_init_set_ui(rop, ROP_);
+  assert(longbool(mpz_tstbit(rop, BIT_INDEX1)) = longbool(ROP_ and (1 shl BIT_INDEX1)));
+  assert(longbool(mpz_tstbit(rop, BIT_INDEX2)) = longbool(ROP_ and (1 shl BIT_INDEX2)));
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_urandomb_test;
+const
+  B = 8 * (sizeof(valuint) - 1);
+  N = 1 shl B;
+var
+  rop: mpz_t;
+  state: randstate_t;
+begin
+  mp_randinit_default(state);
+  mpz_init(rop);
+  mpz_urandomb(rop, state, B);
+  assert(mpz_cmp_ui(rop, N) < 0);
+  mpz_clear(rop);
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mpz_urandomm_test;
+const
+  N_ = 1000000;
+var
+  rop, n: mpz_t;
+  state: randstate_t;
+begin
+  mp_randinit_default(state);
+  mpz_init(rop);
+  mpz_init_set_ui(n, N_);
+  mpz_urandomm(rop, state, n);
+  assert(mpz_cmp_ui(rop, N_) < 0);
+  mpz_clear(rop);
+  mpz_clear(n);
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mpz_rrandomb_test;
+const
+  B = 8 * sizeof(valuint) - 2;
+  N = 1 shl B;
+var
+  rop: mpz_t;
+  state: randstate_t;
+begin
+  mp_randinit_default(state);
+  mpz_init(rop);
+  mpz_rrandomb(rop, state, B);
+  assert(mpz_cmp_ui(rop, N) < 0);
+  mpz_clear(rop);
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mpz_fits_ushort_p_test;
+var op: mpz_t;
+begin
+  mpz_init_set_ui(op, high(word));
+  assert(longbool(mpz_fits_ushort_p(op)));
+  mpz_add_ui(op, op, 1);
+  assert(not longbool(mpz_fits_ushort_p(op)));
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_fits_sshort_p_test;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, high(smallint));
+  assert(longbool(mpz_fits_sshort_p(op)));
+  mpz_add_ui(op, op, 1);
+  assert(not longbool(mpz_fits_sshort_p(op)));
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_fits_uint_p_test;
+var op: mpz_t;
+begin
+  mpz_init_set_ui(op, high(cardinal));
+  assert(longbool(mpz_fits_uint_p(op)));
+  mpz_add_ui(op, op, 1);
+  assert(not longbool(mpz_fits_uint_p(op)));
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_fits_sint_p_test;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, high(integer));
+  assert(longbool(mpz_fits_sint_p(op)));
+  mpz_add_ui(op, op, 1);
+  assert(not longbool(mpz_fits_sint_p(op)));
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_fits_ulong_p_test;
+var op: mpz_t;
+begin
+  mpz_init_set_ui(op, high(valuint));
+  assert(longbool(mpz_fits_ulong_p(op)));
+  mpz_add_ui(op, op, 1);
+  assert(not longbool(mpz_fits_ulong_p(op)));
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_fits_slong_p_test;
+var op: mpz_t;
+begin
+  mpz_init_set_si(op, high(valsint));
+  assert(longbool(mpz_fits_slong_p(op)));
+  mpz_add_ui(op, op, 1);
+  assert(not longbool(mpz_fits_slong_p(op)));
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpz_sizeinbase_test;
+const
+  OP_ = 1000000;
+var rop: mpz_t;
+begin
+  mpz_init_set_ui(rop, OP_);
+  assert(mpz_sizeinbase(rop, BASE10) - length(inttostr(OP_)) = 0);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpz_size_test;
+var rop: mpz_t;
+begin
+  mpz_init(rop);
+  assert(mpz_size(rop) = 0);
+  mpz_add_ui(rop, rop, 1);
+  assert(mpz_size(rop) = 1);
+  mpz_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpq_init_test;
+var rational: mpq_t;
+begin
+  mpq_init(rational);
+  assert(mpq_cmp_ui(rational, 0, 1) = 0);
+  mpq_clear(rational);
+end;
+
+procedure TTestGmpBinding.mpq_clear_test;
+var rational: mpq_t;
+begin
+  mpq_init(rational);
+  mpq_clear(rational);
+end;
+
+procedure TTestGmpBinding.mpq_set_ui_test;
+const
+  OP_1 = 13;
+  OP_2 = 17;
+var rational: mpq_t;
+begin
+  mpq_init(rational);
+  mpq_set_ui(rational, OP_1, OP_2);
+  assert(mpq_cmp_ui(rational, OP_1, OP_2) = 0);
+  mpq_clear(rational);
+end;
+
+procedure TTestGmpBinding.mpq_set_si_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var rational: mpq_t;
+begin
+  mpq_init(rational);
+  mpq_set_si(rational, OP_1, OP_2);
+  assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
+  mpq_clear(rational);
+end;
+
+procedure TTestGmpBinding.mpq_canonicalize_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+  CF = 11;
+var rational: mpq_t;
+begin
+  mpq_init(rational);
+  mpq_set_si(rational, CF * OP_1, CF * OP_2);
+  mpq_canonicalize(rational);
+  assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
+  mpq_clear(rational);
+end;
+
+procedure TTestGmpBinding.mpq_set_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var rational1, rational2: mpq_t;
+begin
+  mpq_init(rational1);
+  mpq_init(rational2);
+  mpq_set_si(rational2, OP_1, OP_2);
+  mpq_set(rational1, rational2);
+  assert(mpq_cmp_si(rational1, OP_1, OP_2) = 0);
+  mpq_clear(rational1);
+  mpq_clear(rational2);
+end;
+
+procedure TTestGmpBinding.mpq_setmpz_test;
+const
+  OP_1 = -13;
+var
+  rational: mpq_t;
+  op: mpz_t;
+begin
+  mpq_init(rational);
+  mpz_init_set_si(op, OP_1);
+  mpq_set_z(rational, op);
+  assert(mpq_cmp_si(rational, OP_1, 1) = 0);
+  mpq_clear(rational);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpq_set_str_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var rational: mpq_t;
+begin
+  mpq_init(rational);
+  assert(mpq_set_str(rational, pchar(inttostr(OP_1) + '/' + inttostr(OP_2)), BASE10) = 0);
+  assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
+  assert(mpq_set_str(rational, pchar(inttostr(OP_1) + '*' + inttostr(OP_2)), BASE10) <> 0);
+  mpq_clear(rational);
+end;
+
+procedure TTestGmpBinding.mpq_swap_test;
+const
+  ROP_1N = -13;
+  ROP_1D = 17;
+  ROP_2N = -23;
+  ROP_2D = 31;
+var rop1, rop2: mpq_t;
+begin
+  mpq_init(rop1);
+  mpq_init(rop2);
+  mpq_set_si(rop1, ROP_1N, ROP_1D);
+  mpq_set_si(rop2, ROP_2N, ROP_2D);
+  mpq_swap(rop1, rop2);
+  assert(mpq_cmp_si(rop1, ROP_2N, ROP_2D) = 0);
+  assert(mpq_cmp_si(rop2, ROP_1N, ROP_1D) = 0);
+  mpq_clear(rop1);
+  mpq_clear(rop2);
+end;
+
+procedure TTestGmpBinding.mpq_get_d_test;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var op: mpq_t;
+begin
+  mpq_init(op);
+  mpq_set_si(op, OP_1, OP_2);
+  assert(mpq_get_d(op) = OP_1 / OP_2);
+  mpq_clear(op);
+end;
+
+procedure TTestGmpBinding.mpq_set_d_test;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var rop: mpq_t;
+begin
+  mpq_init(rop);
+  mpq_set_d(rop, OP_1 / OP_2);
+  assert(mpq_cmp_si(rop, OP_1, OP_2) = 0);
+  mpq_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpq_set_f_test;
+const OP_ = -10;
+var
+  op: mpf_t;
+  rop: mpq_t;
+begin
+  mpf_init_set_si(op, OP_);
+  mpq_init(rop);
+  mpq_set_f(rop, op);
+  assert(mpq_get_d(rop) = OP_);
+  mpq_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpq_get_str_test;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var
+  op: mpq_t;
+  p: pchar;
+begin
+  mpq_init(op);
+  mpq_set_si(op, OP_1, OP_2);
+  p := mpq_get_str(nil, BASE10, op);
+  assert(p = inttostr(OP_1) + '/' + inttostr(OP_2));
+  freemem(p);
+  mpq_clear(op);
+end;
+
+procedure TTestGmpBinding.mpq_add_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var sum, addend1, addend2: mpq_t;
+begin
+  mpq_init(sum);
+  mpq_init(addend1);
+  mpq_init(addend2);
+  mpq_set_si(addend1, N1, D1);
+  mpq_set_si(addend2, N2, D2);
+  mpq_add(sum, addend1, addend2);
+  assert(mpq_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
+  mpq_clear(sum);
+  mpq_clear(addend1);
+  mpq_clear(addend2);
+end;
+
+procedure TTestGmpBinding.mpq_sub_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var difference, minuend, subtrahend: mpq_t;
+begin
+  mpq_init(difference);
+  mpq_init(minuend);
+  mpq_init(subtrahend);
+  mpq_set_si(minuend, N1, D1);
+  mpq_set_si(subtrahend, N2, D2);
+  mpq_sub(difference, minuend, subtrahend);
+  assert(mpq_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
+  mpq_clear(difference);
+  mpq_clear(minuend);
+  mpq_clear(subtrahend);
+end;
+
+procedure TTestGmpBinding.mpq_mul_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var product, multiplier, multiplicant: mpq_t;
+begin
+  mpq_init(product);
+  mpq_init(multiplier);
+  mpq_init(multiplicant);
+  mpq_set_si(multiplier, N1, D1);
+  mpq_set_si(multiplicant, N2, D2);
+  mpq_mul(product, multiplier, multiplicant);
+  assert(mpq_cmp_si(product, N1 * N2, D1 * D2) = 0);
+  mpq_clear(product);
+  mpq_clear(multiplier);
+  mpq_clear(multiplicant);
+end;
+
+procedure TTestGmpBinding.mpq_mul_2exp_test;
+const
+  N1 = 5;
+  D1 = 3;
+  OP_2 = 2;
+var rop, op1: mpq_t;
+begin
+  mpq_init(rop);
+  mpq_init(op1);
+  mpq_set_si(op1, N1, D1);
+  mpq_mul_2exp(rop, op1, OP_2);
+  assert(mpq_cmp_si(rop, N1 * (1 shl OP_2), D1) = 0);
+  mpq_clear(rop);
+  mpq_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpq_div_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var quotient, dividend, divisor: mpq_t;
+begin
+  mpq_init(quotient);
+  mpq_init(dividend);
+  mpq_init(divisor);
+  mpq_set_si(dividend, N1, D1);
+  mpq_set_si(divisor, N2, D2);
+  mpq_div(quotient, dividend, divisor);
+  assert(mpq_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
+  mpq_clear(quotient);
+  mpq_clear(dividend);
+  mpq_clear(divisor);
+end;
+
+procedure TTestGmpBinding.mpq_div_2exp_test;
+const
+  N1 = 5;
+  D1 = 3;
+  OP_2 = 2;
+var rop, op1: mpq_t;
+begin
+  mpq_init(rop);
+  mpq_init(op1);
+  mpq_set_si(op1, N1, D1);
+  mpq_div_2exp(rop, op1, OP_2);
+  assert(mpq_cmp_si(rop, N1, D1 * (1 shl OP_2)) = 0);
+  mpq_clear(rop);
+  mpq_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpq_neg_test;
+const
+  N1 = -5;
+  D1 = 3;
+var negated_operand, operand: mpq_t;
+begin
+  mpq_init(negated_operand);
+  mpq_init(operand);
+  mpq_set_si(operand, N1, D1);
+  mpq_neg(negated_operand, operand);
+  assert(mpq_cmp_si(negated_operand, -N1, D1) = 0);
+  mpq_clear(negated_operand);
+  mpq_clear(operand);
+end;
+
+procedure TTestGmpBinding.mpq_abs_test;
+const
+  N1 = 5;
+  D1 = 3;
+var rop, op: mpq_t;
+begin
+  mpq_init(rop);
+  mpq_init(op);
+  mpq_set_si(op, -N1, D1);
+  mpq_abs(rop, op);
+  assert(mpq_cmp_si(rop, N1, D1) = 0);
+  mpq_clear(rop);
+  mpq_clear(op);
+end;
+
+procedure TTestGmpBinding.mpq_inv_test;
+const
+  N1 = -5;
+  D1 = 3;
+var inverted_number, number: mpq_t;
+begin
+  mpq_init(inverted_number);
+  mpq_init(number);
+  mpq_set_si(number, N1, D1);
+  mpq_inv(inverted_number, number);
+  assert(mpq_cmp_si(inverted_number, -D1, -N1) = 0);
+  mpq_clear(inverted_number);
+  mpq_clear(number);
+end;
+
+procedure TTestGmpBinding.mpq_cmp_test;
+const
+  N1 = -7;
+  D1 = 5;
+var op1, op2: mpq_t;
+begin
+  mpq_init(op1);
+  mpq_init(op2);
+  mpq_set_si(op1, N1, D1);
+  mpq_set_si(op2, N1, D1);
+  assert(mpq_cmp(op1, op2) = 0);
+  mpq_set_si(op1, N1 + 1, D1);
+  assert(mpq_cmp(op1, op2) > 0);
+  mpq_set_si(op1, N1 - 1, D1);
+  assert(mpq_cmp(op1, op2) < 0);
+  mpq_clear(op1);
+  mpq_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpq_cmp_si_test;
+const
+  N1 = -7;
+  D1 = 5;
+var op1: mpq_t;
+begin
+  mpq_init(op1);
+  mpq_set_si(op1, N1, D1);
+  assert(mpq_cmp_si(op1, N1, D1) = 0);
+  assert(mpq_cmp_si(op1, N1 - 1, D1) > 0);
+  assert(mpq_cmp_si(op1, N1 + 1, D1) < 0);
+  mpq_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpq_cmp_ui_test;
+const
+  N1 = 7;
+  D1 = 5;
+var op1: mpq_t;
+begin
+  mpq_init(op1);
+  mpq_set_si(op1, N1, D1);
+  assert(mpq_cmp_ui(op1, N1, D1) = 0);
+  assert(mpq_cmp_ui(op1, N1 - 1, D1) > 0);
+  assert(mpq_cmp_ui(op1, N1 + 1, D1) < 0);
+  mpq_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpq_equal_test;
+const
+  N1 = -7;
+  D1 = 5;
+var op1, op2: mpq_t;
+begin
+  mpq_init(op1);
+  mpq_init(op2);
+  mpq_set_si(op1, N1, D1);
+  mpq_set_si(op2, N1, D1);
+  assert(longbool(mpq_equal(op1, op2)));
+  mpq_set_si(op1, N1 + 1, D1);
+  assert(not longbool(mpq_equal(op1, op2)));
+  mpq_set_si(op1, N1 - 1, D1);
+  assert(not longbool(mpq_equal(op1, op2)));
+  mpq_clear(op1);
+  mpq_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpq_get_num_test;
+const
+  N1 = -7;
+  D1 = 5;
+var
+  rational: mpq_t;
+  numerator: mpz_t;
+begin
+  mpq_init(rational);
+  mpz_init(numerator);
+  mpq_set_si(rational, N1, D1);
+  mpq_get_num(numerator, rational);
+  assert(mpz_get_si(numerator) = N1);
+  mpq_clear(rational);
+  mpz_clear(numerator);
+end;
+
+procedure TTestGmpBinding.mpq_get_den_test;
+const
+  N1 = -7;
+  D1 = 5;
+var
+  rational: mpq_t;
+  denominator: mpz_t;
+begin
+  mpq_init(rational);
+  mpz_init(denominator);
+  mpq_set_si(rational, N1, D1);
+  mpq_get_den(denominator, rational);
+  assert(mpz_get_si(denominator) = D1);
+  mpq_clear(rational);
+  mpz_clear(denominator);
+end;
+
+procedure TTestGmpBinding.mpq_set_num_test;
+const
+  N1 = -7;
+  D1 = 5;
+  N2 = 3;
+var
+  rational: mpq_t;
+  numerator: mpz_t;
+begin
+  mpq_init(rational);
+  mpz_init_set_si(numerator, N2);
+  mpq_set_si(rational, N1, D1);
+  mpq_set_num(rational, numerator);
+  assert(mpq_cmp_si(rational, N2, D1) = 0);
+  mpq_clear(rational);
+  mpz_clear(numerator);
+end;
+
+procedure TTestGmpBinding.mpq_set_den_test;
+const
+  N1 = -7;
+  D1 = 5;
+  D2 = 3;
+var
+  rational: mpq_t;
+  denominator: mpz_t;
+begin
+  mpq_init(rational);
+  mpz_init_set_si(denominator, D2);
+  mpq_set_si(rational, N1, D1);
+  mpq_set_den(rational, denominator);
+  assert(mpq_cmp_si(rational, N1, D2) = 0);
+  mpq_clear(rational);
+  mpz_clear(denominator);
+end;
+
+procedure TTestGmpBinding.mpf_get_default_prec_test;
+begin
+  assert(mpf_get_default_prec > 0);
+end;
+
+procedure TTestGmpBinding.mpf_set_default_prec_test;
+var prec: valuint;
+begin
+  prec := mpf_get_default_prec;
+  mpf_set_default_prec(2 * prec);
+  assert(mpf_get_default_prec  = 2 * prec);
+  mpf_set_default_prec(prec);
+end;
+
+procedure TTestGmpBinding.mpf_init_test;
+var x: mpf_t;
+begin
+  mpf_init(x);
+  assert(mpf_get_prec(x) = mpf_get_default_prec);
+  mpf_clear(x);
+end;
+
+procedure TTestGmpBinding.mpf_init2_test;
+var x: mpf_t;
+begin
+  mpf_init2(x, 2 * mpf_get_default_prec);
+  assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
+  mpf_clear(x);
+end;
+
+procedure TTestGmpBinding.mpf_clear_test;
+var x: mpf_t;
+begin
+  mpf_init(x);
+  mpf_clear(x);
+end;
+
+procedure TTestGmpBinding.mpf_get_prec_test;
+var x: mpf_t;
+begin
+  mpf_init(x);
+  mpf_set_prec(x, 2 * mpf_get_default_prec);
+  assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
+  mpf_clear(x);
+end;
+
+procedure TTestGmpBinding.mpf_set_prec_test;
+var x: mpf_t;
+begin
+  mpf_init(x);
+  mpf_set_prec(x, 2 * mpf_get_default_prec);
+  assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
+  mpf_clear(x);
+end;
+
+procedure TTestGmpBinding.mpf_set_prec_raw_test;
+const N = 10;
+var x: mpf_t;
+begin
+  mpf_init2(x, N * mpf_get_default_prec);
+  mpf_set_prec_raw(x, mpf_get_default_prec);
+  mpf_set_prec_raw(x, N * mpf_get_default_prec);
+  mpf_clear(x);
+end;
+
+procedure TTestGmpBinding.mpf_set_q_test;
+const OP_ = -10;
+var
+  op: mpq_t;
+  rop: mpf_t;
+begin
+  mpq_init(op);
+  mpf_init(rop);
+  mpq_set_si(op, OP_, 1);
+  mpf_set_q(rop, op);
+  assert(mpf_get_si(rop) = OP_);
+  mpf_clear(rop);
+  mpq_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_set_ui_test;
+const OP = 1000000;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_set_ui(rop, OP);
+  assert(mpf_get_ui(rop) = OP);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_get_ui_test;
+const OP = 1000000;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_set_ui(rop, OP);
+  assert(mpf_get_ui(rop) = OP);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_set_si_test;
+const OP = -1000000;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_set_si(rop, OP);
+  assert(mpf_get_si(rop) = OP);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_get_si_test;
+const OP = -1000000;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_set_si(rop, OP);
+  assert(mpf_get_si(rop) = OP);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_set_test;
+const N = -1000000;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_si(op, N);
+  mpf_set(rop, op);
+  assert(mpf_get_si(rop) = N);
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_set_str_test;
+const N = -123;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  assert(mpf_set_str(rop, pchar(inttostr(N)), BASE10) = 0);
+  assert(mpf_get_si(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_swap_test;
+const
+  ROP_1 = -13;
+  ROP_2 = -23;
+var rop1, rop2: mpf_t;
+begin
+  mpf_init_set_si(rop1, ROP_1);
+  mpf_init_set_si(rop2, ROP_2);
+  mpf_swap(rop1, rop2);
+  assert(mpf_get_si(rop1) =  ROP_2);
+  assert(mpf_get_si(rop2) = ROP_1);
+  mpf_clear(rop1);
+  mpf_clear(rop2);
+end;
+
+procedure TTestGmpBinding.mpf_get_d_test;
+const N = -1.5;
+var rop: mpf_t;
+begin
+  mpf_init_set_d(rop, N);
+  assert(mpf_get_d(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_set_d_test;
+const N = -1.5;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_set_d(rop, N);
+  assert(mpf_get_d(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_setmpz_test;
+const
+  OP_1 = -13;
+var
+  rop: mpf_t;
+  op: mpz_t;
+begin
+  mpf_init(rop);
+  mpz_init_set_si(op, OP_1);
+  mpf_set_z(rop, op);
+  assert(mpf_get_si(rop) = OP_1);
+  mpf_clear(rop);
+  mpz_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_get_d_2exp_test;
+const
+  M = 0.5;
+  E = 4;
+  N = (1 shl E) div 2;
+var
+  rop: mpf_t;
+  exp: valsint;
+begin
+  mpf_init_set_d(rop, N);
+  exp := -1;
+  assert(mpf_get_d_2exp(exp, rop) = M);
+  assert(exp = E);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_get_str_test;
+const
+  N = 3.1416;
+  S = '31416';
+  E = 1;
+var
+  op: mpf_t;
+  p: pchar;
+  exp: mp_exp_t;
+begin
+  mpf_init_set_d(op, N);
+  p := mpf_get_str(nil, exp, BASE10, length(S), op);
+  assert(p = S);
+  assert(exp = E);
+  freemem(p);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_add_test;
+const
+  OP1_ = 1;
+  OP2_ = 2;
+var rop, op1, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_init_set_d(op2, OP2_);
+  mpf_add(rop, op1, op2);
+  assert(mpf_get_d(rop) = OP1_ + OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_add_ui_test;
+const
+  OP1_ = 1;
+  OP2_ = 2;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_add_ui(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ + OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_sub_test;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op1, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_init_set_d(op2, OP2_);
+  mpf_sub(rop, op1, op2);
+  assert(mpf_get_d(rop) = OP1_ - OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_sub_ui_test;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_sub_ui(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ - OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_ui_sub_test;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op2, OP2_);
+  mpf_ui_sub(rop, OP1_, op2);
+  assert(mpf_get_d(rop) = OP1_ - OP2_);
+  mpf_clear(rop);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_mul_test;
+const
+  OP1_ = 2;
+  OP2_ = 3;
+var rop, op1, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_init_set_d(op2, OP2_);
+  mpf_mul(rop, op1, op2);
+  assert(mpf_get_d(rop) = OP1_ * OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_mul_ui_test;
+const
+  OP1_ = 2;
+  OP2_ = 3;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_mul_ui(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ * OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_mul_2exp_test;
+const
+  OP1_ = 3;
+  OP2_ = 4;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_mul_2exp(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ * (1 shl OP2_));
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_div_test;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op1, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_init_set_d(op2, OP2_);
+  mpf_div(rop, op1, op2);
+  assert(mpf_get_d(rop) = OP1_ / OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_div_ui_test;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_div_ui(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ / OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_ui_div_test;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_si(op2, OP2_);
+  mpf_ui_div(rop, OP1_, op2);
+  assert(mpf_get_d(rop) = OP1_ / OP2_);
+  mpf_clear(rop);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_div_2exp_test;
+const
+  OP1_ = 16;
+  OP2_ = 2;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_div_2exp(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ / (1 shl OP2_));
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_sqrt_test;
+const
+  OP_ = 4;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op, OP_);
+  mpf_sqrt(rop, op);
+  assert(mpf_get_d(rop) = sqrt(OP_));
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_sqrt_ui_test;
+const
+  OP_ = 4;
+var rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_sqrt_ui(rop, OP_);
+  assert(mpf_get_d(rop) = sqrt(OP_));
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_pow_ui_test;
+const
+  OP1_ = 3;
+  OP2_ = 2;
+var rop, op1: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_pow_ui(rop, op1, OP2_);
+  assert(mpf_get_d(rop) = OP1_ ** OP2_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+end;
+
+procedure TTestGmpBinding.mpf_neg_test;
+const
+  OP_ = 4;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op, OP_);
+  mpf_neg(rop, op);
+  assert(mpf_get_d(rop) = -OP_);
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_abs_test;
+const OP_ = -4;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op, OP_);
+  mpf_abs(rop, op);
+  assert(mpf_get_d(rop) = -OP_);
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_cmp_test;
+const OP_1 = -10;
+var op1, op2: mpf_t;
+begin
+  mpf_init_set_si(op1, OP_1);
+  mpf_init_set_si(op2, OP_1);
+  assert(mpf_cmp(op1, op2) = 0);
+  mpf_set_si(op2, OP_1 + 1);
+  assert(mpf_cmp(op1, op2) < 0);
+  mpf_set_si(op2, OP_1 - 1);
+  assert(mpf_cmp(op1, op2) > 0);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_cmp_d_test;
+const OP_ = -10;
+var op: mpf_t;
+begin
+  mpf_init_set_si(op, OP_);
+  assert(mpf_cmp_d(op, OP_) = 0);
+  assert(mpf_cmp_d(op, OP_ + 1) < 0);
+  assert(mpf_cmp_d(op, OP_ - 1) > 0);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_cmp_si_test;
+const OP_ = -10;
+var op: mpf_t;
+begin
+  mpf_init_set_si(op, OP_);
+  assert(mpf_cmp_si(op, OP_) = 0);
+  assert(mpf_cmp_si(op, OP_ + 1) < 0);
+  assert(mpf_cmp_si(op, OP_ - 1) > 0);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_cmp_ui_test;
+const OP_ = 10;
+var op: mpf_t;
+begin
+  mpf_init_set_si(op, OP_);
+  assert(mpf_cmp_ui(op, OP_) = 0);
+  assert(mpf_cmp_ui(op, OP_ + 1) < 0);
+  assert(mpf_cmp_ui(op, OP_ - 1) > 0);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_eq_test;
+const
+  OP_1 = 10;
+  OP_3 = 8;
+var op1, op2: mpf_t;
+begin
+  mpf_init_set_si(op1, OP_1);
+  mpf_init_set_si(op2, OP_1);
+  assert(mpf_eq(op1, op2, OP_3) <> 0);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_reldiff_test;
+const
+  OP1_ = 4;
+  OP2_ = 2;
+var rop, op1, op2: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op1, OP1_);
+  mpf_init_set_d(op2, OP2_);
+  mpf_reldiff(rop, op1, op2);
+  assert(mpf_get_d(rop) = abs(OP1_ - OP2_) / OP1_);
+  mpf_clear(rop);
+  mpf_clear(op1);
+  mpf_clear(op2);
+end;
+
+procedure TTestGmpBinding.mpf_ceil_test;
+const N = 3.1;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op, N);
+  mpf_ceil(rop, op);
+  assert(mpf_get_d(rop) = ceil(N));
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_floor_test;
+const N = 3.9;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op, N);
+  mpf_floor(rop, op);
+  assert(mpf_get_d(rop) = floor(N));
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_trunc_test;
+const N = -3.9;
+var rop, op: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_init_set_d(op, N);
+  mpf_trunc(rop, op);
+  assert(mpf_get_d(rop) = trunc(N));
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_integer_p_test;
+const
+  N1 = 10;
+  N2 = 10.1;
+var op: mpf_t;
+begin
+  mpf_init_set_si(op, N1);
+  assert(longbool(mpf_integer_p(op)));
+  mpf_set_d(op, N2);
+  assert(not longbool(mpf_integer_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_fits_ushort_p_test;
+var op: mpf_t;
+begin
+  mpf_init_set_ui(op, high(word));
+  assert(longbool(mpf_fits_ushort_p(op)));
+  mpf_add_ui(op, op, 1);
+  assert(not longbool(mpf_fits_ushort_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_fits_sshort_p_test;
+var op: mpf_t;
+begin
+  mpf_init_set_ui(op, high(smallint));
+  assert(longbool(mpf_fits_sshort_p(op)));
+  mpf_add_ui(op, op, 1);
+  assert(not longbool(mpf_fits_sshort_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_fits_uint_p_test;
+var op: mpf_t;
+begin
+  mpf_init_set_ui(op, high(cardinal));
+  assert(longbool(mpf_fits_uint_p(op)));
+  mpf_add_ui(op, op, 1);
+  assert(not longbool(mpf_fits_uint_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_fits_sint_p_test;
+var op: mpf_t;
+begin
+  mpf_init_set_ui(op, high(integer));
+  assert(longbool(mpf_fits_sint_p(op)));
+  mpf_add_ui(op, op, 1);
+  assert(not longbool(mpf_fits_sint_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_fits_ulong_p_test;
+var op: mpf_t;
+begin
+  mpf_init_set_ui(op, high(valuint));
+  assert(longbool(mpf_fits_ulong_p(op)));
+  mpf_add_ui(op, op, 1);
+  assert(not longbool(mpf_fits_ulong_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_fits_slong_p_test;
+var op: mpf_t;
+begin
+  mpf_init_set_ui(op, high(valsint));
+  assert(longbool(mpf_fits_slong_p(op)));
+  mpf_add_ui(op, op, 1);
+  assert(not longbool(mpf_fits_slong_p(op)));
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_urandomb_test;
+const NBITS = 100;
+var
+  rop: mpf_t;
+  state: randstate_t;
+  cmp: longint;
+begin
+  mp_randinit_default(state);
+  mpf_init(rop);
+  mpf_urandomb(rop, state, NBITS);
+  cmp := mpf_cmp_ui(rop, 0);
+  assert(cmp >= 0);
+  assert(mpf_cmp_ui(rop, 1) < 0);
+  mpf_clear(rop);
+  mp_randclear(state);
+end;
+
+procedure TTestGmpBinding.mpf_random2_test;
+var
+  rop: mpf_t;
+begin
+  mpf_init(rop);
+  mpf_random2(rop, 1, 1);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_init_set_test;
+const N = -1000000;
+var rop, op: mpf_t;
+begin
+  mpf_init_set_si(op, N);
+  mpf_init_set(rop, op);
+  assert(mpf_get_si(rop) = N);
+  mpf_clear(rop);
+  mpf_clear(op);
+end;
+
+procedure TTestGmpBinding.mpf_init_set_d_test;
+const N = -1.5;
+var rop: mpf_t;
+begin
+  mpf_init_set_d(rop, N);
+  assert(mpf_get_d(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_init_set_si_test;
+const N = -5;
+var rop: mpf_t;
+begin
+  mpf_init_set_si(rop, N);
+  assert(mpf_get_si(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_init_set_str_test;
+const N = -123;
+var rop: mpf_t;
+begin
+  mpf_init_set_str(rop, pchar(inttostr(N)), BASE10);
+  assert(mpf_get_si(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpf_init_set_ui_test;
+const N = 5;
+var rop: mpf_t;
+begin
+  mpf_init_set_ui(rop, N);
+  assert(mpf_get_ui(rop) = N);
+  mpf_clear(rop);
+end;
+
+procedure TTestGmpBinding.mpn_add_n_test;
+var
+  rop, s1, s2: mp_limb_t;
+begin
+  s1 := high(mp_limb_t);
+  s2 := s1;
+  rop := 2;
+  assert(mpn_add_n(@rop, @s1, @s2, 1) = 1);
+  assert(rop = high(mp_limb_t) - 1);
+end;
+
+procedure TTestGmpBinding.mpn_add_1_test;
+var
+  rop, s1: mp_limb_t;
+begin
+  s1 := high(mp_limb_t);
+  rop := 2;
+  assert(mpn_add_1(@rop, @s1, 1, high(mp_limb_t)) = 1);
+  assert(rop = high(mp_limb_t) - 1);
+end;
+
+procedure TTestGmpBinding.mpn_add_test;
+var
+  rop, s1, s2: mp_limb_t;
+begin
+  s1 := high(mp_limb_t);
+  s2 := s1;
+  rop := 2;
+  assert(mpn_add(@rop, @s1, 1, @s2, 1) = 1);
+  assert(rop = high(mp_limb_t) - 1);
+end;
+
+procedure TTestGmpBinding.mpn_sub_n_test;
+var
+  rop, s1, s2: mp_limb_t;
+begin
+  s1 := 0;
+  s2 := high(mp_limb_t);
+  rop := 2;
+  assert(mpn_sub_n(@rop, @s1, @s2, 1) = 1);
+  assert(rop = 1);
+end;
+
+procedure TTestGmpBinding.mpn_sub_1_test;
+var
+  rop, s1: mp_limb_t;
+begin
+  s1 := 0;
+  rop := 2;
+  assert(mpn_sub_1(@rop, @s1, 1, high(mp_limb_t)) = 1);
+  assert(rop = 1);
+end;
+
+procedure TTestGmpBinding.mpn_sub_test;
+var
+  rop, s1, s2: mp_limb_t;
+begin
+  s1 := 0;
+  s2 := high(mp_limb_t);
+  rop := 2;
+  assert(mpn_sub(@rop, @s1, 1, @s2, 1) = 1);
+  assert(rop = 1);
+end;
+
+procedure TTestGmpBinding.mpn_mul_n_test;
+var
+  rop: array[0..1] of mp_limb_t;
+  s1, s2: mp_limb_t;
+begin
+  s1 := high(mp_limb_t);
+  s2 := s1;
+  mpn_mul_n(@rop, @s1, @s2, 1);
+  assert(rop[0] = 1);
+  assert(rop[1] = high(mp_limb_t) - 1);
+end;
+
+procedure TTestGmpBinding.mpn_mul_1_test;
+var
+  rop: array[0..1] of mp_limb_t;
+  s1: mp_limb_t;
+begin
+  s1 := high(mp_limb_t);
+  assert(mpn_mul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
+  assert(rop[0] = 1);
+end;
+
+procedure TTestGmpBinding.mpn_mul_test;
+var
+  rop: array[0..1] of mp_limb_t;
+  s1, s2: mp_limb_t;
+begin
+  s1 := high(mp_limb_t);
+  s2 := s1;
+  assert(mpn_mul(@rop, @s1, 1, @s2, 1) = high(mp_limb_t) - 1);
+  assert(rop[0] = 1);
+  assert(rop[1] = high(mp_limb_t) - 1);
+end;
+
+procedure TTestGmpBinding.mpn_addmul_1_test;
+var
+  rop: array[0..1] of mp_limb_t;
+  s1: mp_limb_t;
+begin
+  rop[0] := 1;
+  rop[1] := 0;
+  s1 := high(mp_limb_t);
+  assert(mpn_addmul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
+  assert(rop[0] = 2);
+end;
+
+procedure TTestGmpBinding.mpn_submul_1_test;
+var
+  rop: array[0..1] of mp_limb_t;
+  s1: mp_limb_t;
+begin
+  rop[0] := 1;
+  rop[1] := 0;
+  s1 := high(mp_limb_t);
+  assert(mpn_submul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
+  assert(rop[0] = 0);
+end;
+
+procedure TTestGmpBinding.mpn_tdiv_qr_test;
+const
+  N_ = 19;
+  D_ = 4;
+var
+  q, r: array[0..1] of mp_limb_t;
+  n, d: mp_limb_t;
+begin
+  n := N_;
+  d := D_;
+  q[0] := 0;
+  q[1] := 0;
+  r[0] := 0;
+  r[1] := 0;
+  mpn_tdiv_qr(@q, @r, 0, @n, 1, @d, 1);
+  assert(q[0] = N_ div D_);
+  assert(r[0] = N_ mod D_);
+end;
+
+procedure TTestGmpBinding.mpn_divrem_1_test;
+const
+  N_ = 19;
+  D_ = 4;
+var r1, s2: mp_limb_t;
+begin
+  r1 := 0;
+  s2 := N_;
+  assert(mpn_divrem_1(@r1, 0, @s2, 1, D_) = N_ mod D_);
+  assert(r1 = N_ div D_);
+end;
+
+procedure TTestGmpBinding.mpn_divexact_by3c_test;
+const
+  K = 3;
+  N_ = 17;
+var r, s: mp_limb_t;
+begin
+  r := 0;
+  s := K * N_;
+  assert(mpn_divexact_by3c(@r, @s, 1, 0) = 0);
+  assert(r = N_);
+  s := K * N_ + 1;
+  assert(mpn_divexact_by3c(@r, @s, 1, 0) <> 0);
+end;
+
+procedure TTestGmpBinding.mpn_mod_1_test;
+const
+  N_ = 19;
+  D_ = 4;
+var s1: mp_limb_t;
+begin
+  s1 := N_;
+  assert(mpn_mod_1(@s1, 1, D_) = N_ mod D_);
+end;
+
+procedure TTestGmpBinding.mpn_lshift_test;
+var r, s: mp_limb_t;
+begin
+  r := 0;
+  s := high(mp_limb_t);
+  assert(mpn_lshift(@r, @s, 1, 1) = 1);
+  assert(r = high(mp_limb_t) - 1);
+end;
+
+procedure TTestGmpBinding.mpn_rshift_test;
+var r, s: mp_limb_t;
+begin
+  r := 0;
+  s := high(mp_limb_t);
+  assert(mpn_rshift(@r, @s, 1, 1) = valuint(1) shl (bits_per_limb - 1));
+  assert(r = high(mp_limb_t) shr 1);
+end;
+
+procedure TTestGmpBinding.mpn_cmp_test;
+const S1_ = 10;
+var s1, s2: mp_limb_t;
+begin
+  s1 := S1_;
+  S2 := S1_;
+  assert(mpn_cmp(@s1, @s2, 1) = 0);
+  S2 := S1_ - 1;
+  assert(mpn_cmp(@s1, @s2, 1) > 0);
+  S2 := S1_ + 1;
+  assert(mpn_cmp(@s1, @s2, 1) < 0);
+end;
+
+procedure TTestGmpBinding.mpn_gcd_test;
+const
+  S1_ = 30;
+  S2_ = 105;
+  RP_ = 15;
+var r, s1, s2: mp_limb_t;
+begin
+  s1 := S1_;
+  s2 := S2_;
+  r := 0;
+  assert(mpn_gcd(@r, @s1, 1, @s2, 1) = 1);
+  assert(r = RP_);
+end;
+
+procedure TTestGmpBinding.mpn_gcd_1_test;
+const
+  S1_ = 30;
+  S2_ = 105;
+  R_ = 15;
+var s1: mp_limb_t;
+begin
+  s1 := S1_;
+  assert(mpn_gcd_1(@s1, 1, S2_) = R_);
+end;
+
+procedure TTestGmpBinding.mpn_gcdext_test;
+const
+  S1_ = 3 * 5;
+  S2_ = 2 * 3;
+  R1_ = 3;
+var
+  r1, r2, s1, s2: array[0..1] of mp_limb_t;
+  r2n: mp_size_t;
+  k: valsint;
+begin
+  s1[0] := S1_;
+  s1[1] := 0;
+  s2[0] := S2_;
+  s2[1] := 0;
+  assert(mpn_gcdext(@r1, @r2, r2n, @s1, 1, @s2, 1) = 1);
+  assert(r2n = 1);
+  assert(r1[0] = R1_);
+  k := (valsint(r1[0]) - valsint(r2[0]) * valsint(s1[0])) div valsint(s2[0]);
+  assert(valsint(r1[0]) = valsint(r2[0]) * valsint(s1[0]) + k * valsint(s2[0]));
+end;
+
+procedure TTestGmpBinding.mpn_sqrtrem_test;
+const
+  ROOT = 3;
+var r1, r2, s: mp_limb_t;
+begin
+  s := ROOT ** 2 + ROOT - 1;
+  assert(mpn_sqrtrem(@r1, @r2, @s, 1) = 1);
+  assert(r1 = ROOT);
+  assert(r2 = ROOT - 1);
+end;
+
+procedure TTestGmpBinding.mpn_get_str_test;
+const N = uint64($FEDCBA9876543210);
+var
+  str: array[0..2 * sizeof(mp_limb_t)] of byte;
+  s1: mp_limb_t;
+  i: integer;
+begin
+  s1 := N and (high(mp_limb_t) - 1);
+  assert(mpn_get_str(@str, BASE16, @s1, 1) = high(str));
+  for i := 0 to high(str) - 1 do
+    assert(str[i] = high(str) - i - 1);
+end;
+
+procedure TTestGmpBinding.mpn_set_str_test;
+const N = uint64($FEDCBA9876543210);
+var
+  r: mp_limb_t;
+  str: array[0..2 * sizeof(mp_limb_t)] of byte;
+  i: integer;
+begin
+  for i := 0 to high(str) - 1 do
+    str[i] := high(str) - i - 1;
+  assert(mpn_set_str(@r, @str, high(str), BASE16) = 1);
+  assert(r = N and (high(mp_limb_t) - 1));
+end;
+
+procedure TTestGmpBinding.mpn_scan0_test;
+const
+  S1_ = $F75;
+  STARTING_BIT = 4;
+  N = 7;
+var s1: mp_limb_t;
+begin
+  s1 := S1_;
+  assert(mpn_scan0(@s1, STARTING_BIT) = N);
+end;
+
+procedure TTestGmpBinding.mpn_scan1_test;
+const
+  S1_ = $85;
+  STARTING_BIT = 4;
+  N = 7;
+var s1: mp_limb_t;
+begin
+  s1 := S1_;
+  assert(mpn_scan1(@s1, STARTING_BIT) = N);
+end;
+
+procedure TTestGmpBinding.mpn_popcount_test;
+const
+  S1_ = $55AA;
+  N = 8;
+var s1: mp_limb_t;
+begin
+  s1 := S1_;
+  assert(mpn_popcount(@s1, 1) = N);
+end;
+
+procedure TTestGmpBinding.mpn_hamdist_test;
+const
+  S1_ = $55;
+  S2_ = $7A;
+  N = 5;
+var s1, s2: mp_limb_t;
+begin
+  s1 := S1_;
+  s2 := S2_;
+  assert(mpn_hamdist(@s1, @s2, 1) = N);
+end;
+
+procedure TTestGmpBinding.mpn_perfect_square_p_test;
+const ROOT = 3;
+var s1: mp_limb_t;
+begin
+  s1 := ROOT ** 2;
+  assert(mpn_perfect_square_p(@s1, 1) <> 0);
+  s1 := s1 or 2;
+  assert(mpn_perfect_square_p(@s1, 1) = 0);
+end;
+
+procedure TTestGmpBinding.mpn_random_test;
+var r1: array[0..2] of mp_limb_t;
+begin
+  mpn_random(@r1, high(r1) + 1);
+  assert((r1[2] <> 0) and ((r1[0] <> r1[1]) or (r1[0] <> r1[2]) or (r1[1] <> r1[2])));
+end;
+
+procedure TTestGmpBinding.mpn_random2_test;
+var r1: array[0..2] of mp_limb_t;
+begin
+  mpn_random2(@r1, high(r1) + 1);
+  assert((r1[2] <> 0) and ((r1[0] <> r1[1]) or (r1[0] <> r1[2]) or (r1[1] <> r1[2])));
+end;
+
+procedure TTestGmpBinding.bits_per_limb_test;
+begin
+  assert(bits_per_limb = 8 * sizeof(mp_limb_t));
+end;
+
+procedure TTestGmpBinding.version_test;
+
+  function isvernum(s: string; first, last: integer): boolean;
+  var i: integer;
+  begin
+    i := strtointdef(copy(s, first, last - first + 1), -1);
+    result := i >= 0;
+  end;
+
+const DOT = '.';
+var
+  v: string;
+  dot1, dot2: integer;
+begin
+  v := version;
+  dot1 := pos(DOT, v);
+  assert(dot1 <> 0);
+  dot2 := posex(DOT, v, dot1 + 1);
+  assert(dot2 <> 0);
+  assert(isvernum(v, 1, dot1 - 1));
+  assert(isvernum(v, dot1 + 1, dot2 - 1));
+  assert(isvernum(v, dot2 + 1, length(v)));
+end;
+
+{ TTestGmpExtensions }
+
+procedure TTestGmpExtensions.randinit_default_test;
+var state: MPRandState;
+begin
+  randinit_default(state);
+  assert(rnd_test(state.Ptr^));
+end;
+
+procedure TTestGmpExtensions.randinit_mt_test;
+var state: MPRandState;
+begin
+  randinit_mt(state);
+  assert(rnd_test(state.Ptr^));
+end;
+
+procedure TTestGmpExtensions.randinit_lc_2exp_test;
+const
+  A_ =  3;
+  C = 5;
+  M2EXP = 8;
+var
+  state: MPRandState;
+  a: MPInteger;
+begin
+  z_init_set_ui(a, A_);
+  randinit_lc_2exp(state, a, C, M2EXP);
+  assert(rnd_test(state.Ptr^));
+end;
+
+procedure TTestGmpExtensions.randinit_lc_2exp_size_test;
+var state: MPRandState;
+begin
+  assert(randinit_lc_2exp_size(state, 0));
+  assert(rnd_test(state.Ptr^));
+end;
+
+procedure TTestGmpExtensions.randinit_set_test;
+var rop, op: MPRandState;
+begin
+  randinit_default(op);
+  randinit_set(rop, op);
+  assert(rnd_test(rop.Ptr^));
+end;
+
+procedure TTestGmpExtensions.randclear_test;
+var state: MPRandState;
+begin
+  randinit_default(state);
+  randclear(state);
+end;
+
+procedure TTestGmpExtensions.randseed_test;
+var
+  state: MPRandState;
+  seed: MPInteger;
+begin
+  randinit_default(state);
+  z_init_set_ui(seed, 0);
+  randseed(state, seed);
+end;
+
+procedure TTestGmpExtensions.randseed_ui_test;
+var state: MPRandState;
+begin
+  randinit_default(state);
+  randseed_ui(state, 0);
+end;
+
+procedure TTestGmpExtensions.urandomb_ui_test;
+const
+  B = 8 * (sizeof(valuint) - 1);
+  N = 1 shl B;
+var
+  state: MPRandState;
+  r1, r2, r3: valuint;
+begin
+  randinit_default(state);
+  r1 := urandomb_ui(state, B);
+  r2 := urandomb_ui(state, B);
+  r3 := urandomb_ui(state, B);
+  assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
+end;
+
+procedure TTestGmpExtensions.urandomm_ui_test;
+const  N = high(valuint);
+var
+  state: MPRandState;
+  r1, r2, r3: valuint;
+begin
+  randinit_default(state);
+  r1 := urandomm_ui(state, N);
+  r2 := urandomm_ui(state, N);
+  r3 := urandomm_ui(state, N);
+  assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
+end;
+
+//procedure TTestGmpExtensions.asprintf_test;
+//const
+//  N = 123456;
+//  S = '123456';
+//var
+//  z: MPInteger;
+//  p: pchar;
+//begin
+//  z_init_set_ui(z, N);
+//  assert(asprintf(p, Z_FMT, [@z]) = length(S));
+//  assert(p = S);
+//  freemem(p);
+//  z_clear(z);
+//end;
+//
+//procedure TTestGmpExtensions.asprintf_test2;
+//const
+//  N = 123456;
+//  S = '123456';
+//var
+//  z: MPInteger;
+//  p: pchar;
+//begin
+//  z_init_set_ui(z, N);
+//  assert(asprintf(p, Z_FMT, @z) = length(S));
+//  assert(p = S);
+//  freemem(p);
+//  z_clear(z);
+//end;
+//
+//procedure TTestGmpExtensions.snprintf_test;
+//const
+//  N = 123456;
+//  S = '123456';
+//var
+//  z: MPInteger;
+//  buf: pchar;
+//begin
+//  z_init_set_ui(z, N);
+//  getmem(buf, length(S) + 1);
+//  assert(snprintf(buf, length(S) + 1, Z_FMT, [@z]) = length(S));
+//  assert(buf = S);
+//  freemem(buf);
+//  z_clear(z);
+//end;
+//
+//procedure TTestGmpExtensions.snprintf_test2;
+//const
+//  N = 123456;
+//  S = '123456';
+//var
+//  z: MPInteger;
+//  buf: pchar;
+//begin
+//  z_init_set_ui(z, N);
+//  getmem(buf, length(S) + 1);
+//  assert(snprintf(buf, length(S) + 1, Z_FMT, @z) = length(S));
+//  assert(buf = S);
+//  freemem(buf);
+//  z_clear(z);
+//end;
+//
+//procedure TTestGmpExtensions.sprintf_test;
+//const
+//  N = 123456;
+//  S = '123456';
+//var
+//  z: MPInteger;
+//  buf: pchar;
+//begin
+//  z_init_set_ui(z, N);
+//  getmem(buf, length(S) + 1);
+//  assert(sprintf(buf, Z_FMT, [@z]) = length(S));
+//  assert(buf = S);
+//  freemem(buf);
+//  z_clear(z);
+//end;
+//
+//procedure TTestGmpExtensions.sprintf_test2;
+//const
+//  N = 123456;
+//  S = '123456';
+//var
+//  z: MPInteger;
+//  buf: pchar;
+//begin
+//  z_init_set_ui(z, N);
+//  getmem(buf, length(S) + 1);
+//  assert(sprintf(buf, Z_FMT, @z) = length(S));
+//  assert(buf = S);
+//  freemem(buf);
+//  z_clear(z);
+//end;
+//
+//procedure TTestGmpExtensions.sscanf_test;
+//const
+//  N = 3;
+//  D = 2;
+//var q: mpq_t;
+//begin
+//  q_init(q);
+//  assert(sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, [@q]) = 1);
+//  assert(q_cmp_ui(q, N, D) = 0);
+//  q_clear(q);
+//end;
+//
+//procedure TTestGmpExtensions.sscanf_test2;
+//const
+//  N = 3;
+//  D = 2;
+//var q: mpq_t;
+//begin
+//  q_init(q);
+//  assert(sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, @q) = 1);
+//  assert(q_cmp_ui(q, N, D) = 0);
+//  q_clear(q);
+//end;
+
+procedure TTestGmpExtensions.z_init_test;
+var integer_: MPInteger;
+begin
+  z_init(integer_);
+  assert(z_get_si(integer_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_clear_test;
+const N = 1000000;
+var integer_: MPInteger;
+begin
+  z_init2(integer_, N);
+  z_clear(integer_);
+  assert(z_get_si(integer_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_init2_test;
+const N = 1000000;
+var integer_: MPInteger;
+begin
+  z_init2(integer_, N);
+  assert(z_get_si(integer_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_init_set_si_test;
+const N = -1000000;
+var rop: MPInteger;
+begin
+  z_init_set_si(rop, N);
+  assert(z_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.z_init_set_ui_test;
+const N = 1000000;
+var rop: MPInteger;
+begin
+  z_init_set_ui(rop, N);
+  assert(z_get_ui(rop) = N);
+end;
+
+procedure TTestGmpExtensions.z_init_set_d_test;
+const N = -1000000;
+var rop: MPInteger;
+begin
+  z_init_set_d(rop, N);
+  assert(z_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.z_init_set_test;
+const N = -1000000;
+var rop, op: MPInteger;
+begin
+  z_init_set_si(op, N);
+  z_init_set(rop, op);
+  assert(z_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.z_init_set_str_test;
+const N = 1000000;
+var rop: MPInteger;
+begin
+  assert(z_init_set_str(rop, IntToStr(N), BASE10));
+  assert(z_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.z_realloc_test;
+const N = 1000;
+var integer_: MPInteger;
+begin
+  z_init(integer_);
+  z_realloc(integer_, N);
+end;
+
+procedure TTestGmpExtensions.z_realloc2_test;
+const N = 1000;
+var integer_: MPInteger;
+begin
+  z_init(integer_);
+  z_realloc2(integer_, N);
+end;
+
+procedure TTestGmpExtensions.z_getlimbn_test;
+const N = 1234;
+var op: MPInteger;
+begin
+  z_init_set_ui(op, N);
+  assert(z_getlimbn(op, 0) = N);
+end;
+
+procedure TTestGmpExtensions.z_export_test;
+type t = word;
+const
+  N = 1000000;
+  BUF_HIGH = sizeof(N) div sizeof(t);
+var
+  export_op, import_op: MPInteger;
+  buf: array[0..BUF_HIGH] of t;
+  count: sizeuint;
+begin
+  z_init_set_si(export_op, N);
+  z_init(import_op);
+  z_export(buf, count, -1, sizeof(t), 0, 0, export_op);
+  z_import(import_op, count, -1, sizeof(t), 0, 0, buf);
+  assert(z_get_si(export_op) = z_get_si(import_op));
+end;
+
+procedure TTestGmpExtensions.z_import_test;
+type t = word;
+const
+  N = 1000000;
+  BUF_HIGH = sizeof(N) div sizeof(t);
+var
+  export_op, import_op: MPInteger;
+  buf: array[0..BUF_HIGH] of t;
+  count: sizeuint;
+begin
+  z_init_set_si(export_op, N);
+  z_init(import_op);
+  z_export(buf, count, -1, sizeof(t), 0, 0, export_op);
+  z_import(import_op, count, -1, sizeof(t), 0, 0, buf);
+  assert(z_get_si(export_op) = z_get_si(import_op));
+end;
+
+procedure TTestGmpExtensions.z_swap_test;
+const
+  ROP_1 = -1000;
+  ROP_2 = 1000000;
+var rop1, rop2: MPInteger;
+begin
+  z_init_set_si(rop1, ROP_1);
+  z_init_set_si(rop2, ROP_2);
+  z_swap(rop1, rop2);
+  assert(z_get_si(rop1) = ROP_2);
+  assert(z_get_si(rop2) = ROP_1);
+end;
+
+procedure TTestGmpExtensions.z_set_test;
+const OP_ = 1000000;
+var rop, op: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, OP_);
+  z_set(rop, op);
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_set_d_test;
+const OP_ = 1000000;
+var rop: MPInteger;
+begin
+  z_init(rop);
+  z_set_d(rop, OP_);
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_set_f_test;
+const OP_ = -10;
+var
+  op: MPFloat;
+  rop: MPInteger;
+begin
+  f_init_set_si(op, OP_);
+  z_init(rop);
+  z_set_f(rop, op);
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_set_q_test;
+const OP_ = -10;
+var
+  op: MPRational;
+  rop: MPInteger;
+begin
+  q_init(op);
+  z_init(rop);
+  q_set_si(op, OP_, 1);
+  z_set_q(rop, op);
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_set_si_test;
+const OP_ = -1000000;
+var rop: MPInteger;
+begin
+  z_init(rop);
+  z_set_si(rop, OP_);
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_set_str_test;
+const OP_ = -1000000;
+var rop: MPInteger;
+begin
+  z_init(rop);
+  assert(z_set_str(rop, IntToStr(OP_), BASE10));
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_set_ui_test;
+const OP_ = 1000000;
+var rop: MPInteger;
+begin
+  z_init(rop);
+  z_set_ui(rop, OP_);
+  assert(z_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.z_get_d_test;
+const N = -1000;
+var op: MPInteger;
+begin
+  z_init_set_si(op, N);
+  assert(z_get_d(op) = N);
+end;
+
+procedure TTestGmpExtensions.z_get_d_2exp_test;
+const
+  N_LG2 = 4;
+  N = 1 shl N_LG2;
+var
+  op: MPInteger;
+  exp: mp_exp_t;
+begin
+  z_init_set_si(op, N);
+  assert(z_get_d_2exp(exp, op) = 1 / 2);
+  assert(exp = N_LG2 + 1);
+end;
+
+procedure TTestGmpExtensions.z_get_si_test;
+const N = -1000000;
+var op: MPInteger;
+begin
+  z_init_set_si(op, N);
+  assert(z_get_si(op) = N);
+end;
+
+procedure TTestGmpExtensions.z_get_str_test;
+const N = -1000000;
+var
+  op: MPInteger;
+  p: pchar;
+  s, s0, s1: String;
+begin
+  z_init_set_si(op, N);
+  s0 := inttostr(N);
+  s := z_get_str(BASE10, op);
+  assert(s = s0);
+  p := z_get_str(nil, BASE10, op);
+  assert(p = s0);
+  freemem(p);
+  setlength(s1, length(s0));
+  assert(pointer(z_get_str(pchar(s1), BASE10, op)) = pointer(s1));
+  assert(s1 = s0);
+end;
+
+procedure TTestGmpExtensions.z_get_ui_test;
+const N = 1000000;
+var op: MPInteger;
+begin
+  z_init_set_ui(op, N);
+  assert(z_get_ui(op) = N);
+end;
+
+procedure TTestGmpExtensions.z_add_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, op2, sum: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_add(rop, op1, op2);
+  assert(z_get_si(rop) = OP_1 + OP_2);
+  sum := z_add(op1, op2);
+  assert(z_get_si(sum) = OP_1 + OP_2);
+end;
+
+procedure TTestGmpExtensions.z_add_ui_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, sum: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_add_ui(rop, op1, OP_2);
+  assert(z_get_si(rop) = OP_1 + OP_2);
+  sum := z_add_ui(op1, OP_2);
+  assert(z_get_si(sum) = OP_1 + OP_2);
+end;
+
+procedure TTestGmpExtensions.z_sub_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, op2, diff: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_sub(rop, op1, op2);
+  assert(z_get_si(rop) = OP_1 - OP_2);
+  diff := z_sub(op1, op2);
+  assert(z_get_si(diff) = OP_1 - OP_2);
+end;
+
+procedure TTestGmpExtensions.z_sub_ui_test;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, diff: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_sub_ui(rop, op1, OP_2);
+  assert(z_get_si(rop) = OP_1 - OP_2);
+  diff := z_sub_ui(op1, OP_2);
+  assert(z_get_si(diff) = OP_1 - OP_2);
+end;
+
+procedure TTestGmpExtensions.z_ui_sub_test;
+const
+  OP_1 = 1000;
+  OP_2 = 1000000;
+var rop, op2, diff: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op2, OP_2);
+  z_ui_sub(rop, OP_1, op2);
+  assert(z_get_si(rop) = OP_1 - OP_2);
+  diff := z_ui_sub(OP_1, op2);
+  assert(z_get_si(diff) = OP_1 - OP_2);
+end;
+
+procedure TTestGmpExtensions.z_mul_test;
+const
+  OP_1 = -10;
+  OP_2 = 1000;
+var rop, op1, op2, prod: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_mul(rop, op1, op2);
+  assert(z_get_si(rop) = OP_1 * OP_2);
+  prod := z_mul(op1, op2);
+  assert(z_get_si(prod) = OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_mul_si_test;
+const
+  OP_1 = 10;
+  OP_2 = -1000;
+var rop, op1, prod: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_mul_si(rop, op1, OP_2);
+  assert(z_get_si(rop) = OP_1 * OP_2);
+  prod := z_mul_si(op1, OP_2);
+  assert(z_get_si(prod) = OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_mul_ui_test;
+const
+  OP_1 = -10;
+  OP_2 = 1000;
+var rop, op1, prod: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_mul_ui(rop, op1, OP_2);
+  assert(z_get_si(rop) = OP_1 * OP_2);
+  prod := z_mul_ui(op1, OP_2);
+  assert(z_get_si(prod) = OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_addmul_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1, op2: MPInteger;
+begin
+  z_init_set_si(rop, ROP_);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_addmul(rop, op1, op2);
+  assert(z_get_si(rop) = ROP_ + OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_addmul_ui_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1: MPInteger;
+begin
+  z_init_set_si(rop, ROP_);
+  z_init_set_si(op1, OP_1);
+  z_addmul_ui(rop, op1, OP_2);
+  assert(z_get_si(rop) = ROP_ + OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_submul_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1, op2: MPInteger;
+begin
+  z_init_set_si(rop, ROP_);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_submul(rop, op1, op2);
+  assert(z_get_si(rop) = ROP_ - OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_submul_ui_test;
+const
+  ROP_ = 10;
+  OP_1 = -100;
+  OP_2 = 1000;
+var rop, op1: MPInteger;
+begin
+  z_init_set_si(rop, ROP_);
+  z_init_set_si(op1, OP_1);
+  z_submul_ui(rop, op1, OP_2);
+  assert(z_get_si(rop) = ROP_ - OP_1 * OP_2);
+end;
+
+procedure TTestGmpExtensions.z_mul_2exp_test;
+const
+  OP_1 = 10;
+  OP_2 = 10;
+var rop, op1, x: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_mul_2exp(rop, op1, OP_2);
+  assert(z_get_si(rop) = OP_1 * (1 shl OP_2));
+  x := z_mul_2exp(op1, OP_2);
+  assert(z_get_si(x) = OP_1 * (1 shl OP_2));
+end;
+
+procedure TTestGmpExtensions.z_neg_test;
+const OP_ = 1000;
+var rop, op, x: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, OP_);
+  z_neg(rop, op);
+  assert(z_get_si(rop) = -OP_);
+  x := z_neg(op);
+  assert(z_get_si(x) = -OP_);
+end;
+
+procedure TTestGmpExtensions.z_abs_test;
+const OP_ = -1000;
+var rop, op, x: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, OP_);
+  z_abs(rop, op);
+  assert(z_get_si(rop) = abs(OP_));
+  x := z_abs(op);
+  assert(z_get_si(x) = abs(OP_));
+end;
+
+procedure TTestGmpExtensions.z_cdiv_q_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_cdiv_q(q, n, d);
+  assert(z_get_si(q) = ceil(N_ / D_));
+  q2 := z_cdiv_q(n, d);
+  assert(z_get_si(q2) = ceil(N_ / D_));
+end;
+
+procedure TTestGmpExtensions.z_fdiv_q_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_fdiv_q(q, n, d);
+  assert(z_get_si(q) = floor(N_ / D_));
+  q2 := z_fdiv_q(n, d);
+  assert(z_get_si(q2) = floor(N_ / D_));
+end;
+
+procedure TTestGmpExtensions.z_tdiv_q_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_tdiv_q(q, n, d);
+  assert(z_get_si(q) = trunc(N_ / D_));
+  q2 := z_tdiv_q(n, d);
+  assert(z_get_si(q2) = trunc(N_ / D_));
+end;
+
+procedure TTestGmpExtensions.z_cdiv_q_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var q, n, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_cdiv_q_2exp(q, n, B_);
+  assert(z_get_si(q) = ceil(N_ / D_));
+  q2 := z_cdiv_q_2exp(n, B_);
+  assert(z_get_si(q2) = ceil(N_ / D_));
+end;
+
+procedure TTestGmpExtensions.z_fdiv_q_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var q, n, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_fdiv_q_2exp(q, n, B_);
+  assert(z_get_si(q) = floor(N_ / D_));
+  q2 := z_fdiv_q_2exp(n, B_);
+  assert(z_get_si(q2) = floor(N_ / D_));
+end;
+
+procedure TTestGmpExtensions.z_tdiv_q_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var q, n, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_tdiv_q_2exp(q, n, B_);
+  assert(z_get_si(q) = trunc(N_ / D_));
+  q2 := z_tdiv_q_2exp(n, B_);
+  assert(z_get_si(q2) = trunc(N_ / D_));
+end;
+
+procedure TTestGmpExtensions.z_cdiv_q_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  ur := z_cdiv_q_ui(q, n, D_);
+  assert(z_get_si(q) = ceil(N_ / D_));
+  assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_q_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  ur := z_fdiv_q_ui(q, n, D_);
+  assert(z_get_si(q) = floor(N_ / D_));
+  assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_q_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  ur := z_tdiv_q_ui(q, n, D_);
+  assert(z_get_si(q) = trunc(N_ / D_));
+  assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_cdiv_qr_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, r, n, d: MPInteger;
+begin
+  z_init(q);
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_cdiv_qr(q, r, n, d);
+  assert(z_get_si(q) = ceil(N_ / D_));
+  assert(z_get_si(q) * D_ + z_get_si(r) = N_);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_qr_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, r, n, d: MPInteger;
+begin
+  z_init(q);
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_fdiv_qr(q, r, n, d);
+  assert(z_get_si(q) = floor(N_ / D_));
+  assert(z_get_si(q) * D_ + z_get_si(r) = N_);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_qr_test;
+const
+  N_ = -17;
+  D_ = 4;
+var q, r, n, d: MPInteger;
+begin
+  z_init(q);
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_tdiv_qr(q, r, n, d);
+  assert(z_get_si(q) = trunc(N_ / D_));
+  assert(z_get_si(q) * D_ + z_get_si(r) = N_);
+end;
+
+procedure TTestGmpExtensions.z_cdiv_qr_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, r, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(q);
+  z_init(r);
+  z_init_set_si(n, N_);
+  ur := z_cdiv_qr_ui(q, r, n, D_);
+  assert(z_get_si(q) = ceil(N_ / D_));
+  assert(z_get_si(q) * D_ + z_get_si(r) = N_);
+  assert(ur - abs(z_get_si(r)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_qr_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, r, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(q);
+  z_init(r);
+  z_init_set_si(n, N_);
+  ur := z_fdiv_qr_ui(q, r, n, D_);
+  assert(z_get_si(q) = floor(N_ / D_));
+  assert(z_get_si(q) * D_ + z_get_si(r) = N_);
+  assert(ur - abs(z_get_si(r)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_qr_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  q, r, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(q);
+  z_init(r);
+  z_init_set_si(n, N_);
+  ur := z_tdiv_qr_ui(q, r, n, D_);
+  assert(z_get_si(q) = trunc(N_ / D_));
+  assert(z_get_si(q) * D_ + z_get_si(r) = N_);
+  assert(ur - abs(z_get_si(r)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_cdiv_r_test;
+const
+  N_ = -17;
+  D_ = 4;
+var r, n, d, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_cdiv_r(r, n, d);
+  assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
+  r2 := z_cdiv_r(n, d);
+  assert(ceil(N_ / D_) * D_ + z_get_si(r2) = N_);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_r_test;
+const
+  N_ = -17;
+  D_ = 4;
+var r, n, d, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_fdiv_r(r, n, d);
+  assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
+  r2 := z_fdiv_r(n, d);
+  assert(floor(N_ / D_) * D_ + z_get_si(r2) = N_);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_r_test;
+const
+  N_ = -17;
+  D_ = 4;
+var r, n, d, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_tdiv_r(r, n, d);
+  assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
+  r2 := z_tdiv_r(n, d);
+  assert(trunc(N_ / D_) * D_ + z_get_si(r2) = N_);
+end;
+
+procedure TTestGmpExtensions.z_cdiv_r_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var r, n, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_cdiv_r_2exp(r, n, B_);
+  assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
+  r2 := z_cdiv_r_2exp(n, B_);
+  assert(ceil(N_ / D_) * D_ + z_get_si(r2) = N_);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_r_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var r, n, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_fdiv_r_2exp(r, n, B_);
+  assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
+  r2 := z_fdiv_r_2exp(n, B_);
+  assert(floor(N_ / D_) * D_ + z_get_si(r2) = N_);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_r_2exp_test;
+const
+  N_ = -17;
+  B_ = 2;
+  D_ = 1 shl B_;
+var r, n, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_tdiv_r_2exp(r, n, B_);
+  assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
+  r2 := z_tdiv_r_2exp(n, B_);
+  assert(trunc(N_ / D_) * D_ + z_get_si(r2) = N_);
+end;
+
+procedure TTestGmpExtensions.z_cdiv_r_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  r, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  ur := z_cdiv_r_ui(r, n, D_);
+  assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
+  assert(ur - abs(z_get_si(r)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_r_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  r, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  ur := z_fdiv_r_ui(r, n, D_);
+  assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
+  assert(ur - abs(z_get_si(r)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_r_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var
+  r, n: MPInteger;
+  ur: valuint;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  ur := z_tdiv_r_ui(r, n, D_);
+  assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
+  assert(ur - abs(z_get_si(r)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_cdiv_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_cdiv_ui(n, D_) - abs(N_ - ceil(N_ / D_) * D_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_fdiv_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_fdiv_ui(n, D_) - abs(N_ - floor(N_ / D_) * D_) = 0);
+end;
+
+procedure TTestGmpExtensions.z_tdiv_ui_test;
+const
+  N_ = -17;
+  D_ = 4;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_tdiv_ui(n, D_) = abs(N_ - trunc(N_ / D_) * D_));
+end;
+
+procedure TTestGmpExtensions.z_mod_test;
+const
+  N_ = 17;
+  D_ = -4;
+var r, n, d, r2: MPInteger;
+begin
+  z_init(r);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_mod(r, n, d);
+  assert(z_get_si(r) = N_ mod abs(D_));
+  r2 := z_mod(n, d);
+  assert(z_get_si(r2) = N_ mod abs(D_));
+end;
+
+procedure TTestGmpExtensions.z_divexact_test;
+const
+  N_ = -16;
+  D_ = 4;
+var q, n, d, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  z_divexact(q, n, d);
+  assert(z_get_si(q) * D_ = N_);
+  q2 := z_divexact(n, d);
+  assert(z_get_si(q2) * D_ = N_);
+end;
+
+procedure TTestGmpExtensions.z_divexact_ui_test;
+const
+  N_ = -16;
+  D_ = 4;
+var q, n, q2: MPInteger;
+begin
+  z_init(q);
+  z_init_set_si(n, N_);
+  z_divexact_ui(q, n, D_);
+  assert(z_get_si(q) * D_ = N_);
+  q2 := z_divexact_ui(n, D_);
+  assert(z_get_si(q2) * D_ = N_);
+end;
+
+procedure TTestGmpExtensions.z_divisible_p_test;
+const
+  N_ = -16;
+  D_ = 4;
+var n, d: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  assert(z_divisible_p(n, d));
+  z_set_si(n, z_get_si(n) + 1);
+  assert(not z_divisible_p(n, d));
+end;
+
+procedure TTestGmpExtensions.z_divisible_ui_p_test;
+const
+  N_ = -16;
+  D_ = 4;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_divisible_ui_p(n, D_));
+  z_set_si(n, z_get_si(n) + 1);
+  assert(not z_divisible_ui_p(n, D_));
+end;
+
+procedure TTestGmpExtensions.z_divisible_2exp_p_test;
+const
+  N_ = -16;
+  B_ = 2;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_divisible_2exp_p(n, B_));
+  z_set_si(n, z_get_si(n) + 1);
+  assert(not z_divisible_ui_p(n, B_));
+end;
+
+procedure TTestGmpExtensions.z_congruent_p_test;
+const
+  N_ = 23;
+  C_ = 6;
+  D_ = 17;
+var n, c, d: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  z_init_set_si(c, C_);
+  z_init_set_si(d, D_);
+  assert(z_congruent_p(n, c, d));
+  z_set_si(n, z_get_si(n) + 1);
+  assert(not z_congruent_p(n, c, d));
+end;
+
+procedure TTestGmpExtensions.z_congruent_2exp_p_test;
+const
+  N_ = 23;
+  C_ = 7;
+  B_ = 4;
+var n, c: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  z_init_set_si(c, C_);
+  assert(z_congruent_2exp_p(n, c, B_));
+  z_set_si(n, z_get_si(n) + 1);
+  assert(not z_congruent_2exp_p(n, c, B_));
+end;
+
+procedure TTestGmpExtensions.z_congruent_ui_p_test;
+const
+  N_ = 23;
+  C_ = 6;
+  D_ = 17;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_congruent_ui_p(n, C_, D_));
+  z_set_si(n, z_get_si(n) + 1);
+  assert(not z_congruent_ui_p(n, C_, D_));
+end;
+
+procedure TTestGmpExtensions.z_powm_test;
+const
+  N_EXP = 3;
+  N_MOD = 16;
+  ROP_ = 8;
+var rop, base, exp, mod_, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(base, BASE10);
+  z_init_set_si(exp, N_EXP);
+  z_init_set_si(mod_, N_MOD);
+  z_powm(rop, base, exp, mod_);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_powm(base, exp, mod_);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_powm_ui_test;
+const
+  N_EXP = 3;
+  N_MOD = 16;
+  ROP_ = 8;
+var rop, base, mod_, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(base, BASE10);
+  z_init_set_si(mod_, N_MOD);
+  z_powm_ui(rop, base, N_EXP, mod_);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_powm_ui(base, N_EXP, mod_);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_pow_ui_test;
+const
+  BASE_ = 10;
+  EXP = 3;
+var rop, base, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(base, BASE_);
+  z_pow_ui(rop, base, EXP);
+  assert(z_get_si(rop) = BASE_ ** EXP);
+  r2 := z_pow_ui(base, EXP);
+  assert(z_get_si(r2) = BASE_ ** EXP);
+end;
+
+procedure TTestGmpExtensions.z_ui_pow_ui_test;
+const
+  BASE_ = 10;
+  EXP = 3;
+var rop, r2: MPInteger;
+begin
+  z_init(rop);
+  z_ui_pow_ui(rop, BASE_, EXP);
+  assert(z_get_si(rop) = BASE_ ** EXP);
+  r2 := z_ui_pow_ui(BASE_, EXP);
+  assert(z_get_si(r2) = BASE_ ** EXP);
+end;
+
+procedure TTestGmpExtensions.z_root_test;
+const
+  ROOT = 5;
+  N_ = 3;
+var rop, op: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, ROOT ** N_);
+  assert(z_root(rop, op, N_));
+  assert(z_get_si(rop) = ROOT);
+  z_set_si(op, ROOT ** N_ + 1);
+  assert(not z_root(rop, op, N_));
+  assert(z_get_si(rop) = ROOT);
+end;
+
+procedure TTestGmpExtensions.z_rootrem_test;
+const
+  ROOT_ = 5;
+  N_ = 3;
+  REM_ = 1;
+var root, rem, u: MPInteger;
+begin
+  assert(REM_ < ROOT_);
+  z_init(root);
+  z_init(rem);
+  z_init_set_si(u, ROOT_ ** N_);
+  z_rootrem(root, rem, u, N_);
+  assert(z_get_si(root) = ROOT_);
+  assert(z_get_si(rem) = 0);
+  z_set_si(u, ROOT_ ** N_ + REM_);
+  z_rootrem(root, rem, u, N_);
+  assert(z_get_si(root) = ROOT_);
+  assert(z_get_si(rem) = REM_);
+end;
+
+procedure TTestGmpExtensions.z_sqrt_test;
+const ROOT = 5;
+var rop, op, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, ROOT ** 2);
+  z_sqrt(rop, op);
+  assert(z_get_si(rop) = ROOT);
+  r2 := z_sqrt(op);
+  assert(z_get_si(r2) = ROOT);
+end;
+
+procedure TTestGmpExtensions.z_sqrtrem_test;
+const
+  ROOT = 5;
+  REM = 1;
+var rop1, rop2, op: MPInteger;
+begin
+  z_init(rop1);
+  z_init(rop2);
+  z_init_set_si(op, ROOT ** 2 + REM);
+  z_sqrtrem(rop1, rop2, op);
+  assert(z_get_si(rop1) = ROOT);
+  assert(z_get_si(rop2) = REM);
+end;
+
+procedure TTestGmpExtensions.z_perfect_power_p_test;
+const
+  ROOT = 3;
+  EXP = 3;
+var op: MPInteger;
+begin
+  z_init_set_si(op, ROOT ** EXP);
+  assert(z_perfect_power_p(op));
+  z_set_si(op, ROOT ** EXP + 1);
+  assert(not z_perfect_power_p(op));
+end;
+
+procedure TTestGmpExtensions.z_perfect_square_p_test;
+const ROOT = 3;
+var op: MPInteger;
+begin
+  z_init_set_si(op, ROOT ** 2);
+  assert(z_perfect_square_p(op));
+  z_set_si(op, ROOT ** 2 or 2);
+  assert(not z_perfect_square_p(op));
+end;
+
+procedure TTestGmpExtensions.z_probab_prime_p_test;
+const
+  N_ = 127;
+  REPS = 5;
+var n: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  assert(z_probab_prime_p(n, REPS) = 2);
+  z_set_si(n, N_ + 1);
+  assert(z_probab_prime_p(n, REPS) = 0);
+end;
+
+procedure TTestGmpExtensions.z_nextprime_test;
+const
+  PRIME3 = 5;
+  PRIME4 = 7;
+var rop, op, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, PRIME3);
+  z_nextprime(rop, op);
+  assert(z_get_si(rop) = PRIME4);
+  r2 := z_nextprime(op);
+  assert(z_get_si(r2) = PRIME4);
+end;
+
+procedure TTestGmpExtensions.z_gcd_test;
+const
+  OP_1 = 42;
+  OP_2 = 56;
+  ROP_ = 14;
+var rop, op1, op2, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_gcd(rop, op1, op2);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_gcd(op1, op2);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_gcd_ui_test;
+const
+  OP_1 = 42;
+  OP_2 = 56;
+  ROP_ = 14;
+var rop, op1: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  assert(z_gcd_ui(rop, op1, OP_2) = ROP_);
+  assert(z_get_si(rop) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_gcdext_test;
+const
+  A_ = 42;
+  B_ = 56;
+  G_ = 14;
+var g, s, t, a, b: MPInteger;
+begin
+  z_init(g);
+  z_init(s);
+  z_init(t);
+  z_init_set_si(a, A_);
+  z_init_set_si(b, B_);
+  z_gcdext(g, s, t, a, b);
+  assert(z_get_si(g) = G_);
+  assert(A_ * z_get_si(s) + B_ * z_get_si(t) = G_);
+end;
+
+procedure TTestGmpExtensions.z_lcm_test;
+const
+  OP_1 = 21;
+  OP_2 = 6;
+  ROP_ = 42;
+var rop, op1, op2, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_lcm(rop, op1, op2);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_lcm(op1, op2);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_lcm_ui_test;
+const
+  OP_1 = 21;
+  OP_2 = 6;
+  ROP_ = 42;
+var rop, op1, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_lcm_ui(rop, op1, OP_2);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_lcm_ui(op1, OP_2);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_invert_test;
+const
+  OP_1 = 256;
+  OP_2 = 337;
+  ROP_ = 104;
+var rop, op1, op2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  assert(z_invert(rop, op1, op2) <> 0);
+  assert(z_get_si(rop) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_jacobi_test;
+const
+  B0 = 11;
+  A0 = 13 * B0;
+  AM1 = 1001;
+  BM1 = 9907;
+  A1 = 4;
+  B1 = 7;
+var a, b: MPInteger;
+begin
+  z_init_set_si(a, A0);
+  z_init_set_si(b, B0);
+  assert(z_jacobi(a, b) = 0);
+  z_set_si(a, AM1);
+  z_set_si(b, BM1);
+  assert(z_jacobi(a, b) = -1);
+  z_set_si(a, A1);
+  z_set_si(b, B1);
+  assert(z_jacobi(a, b) = 1);
+end;
+
+procedure TTestGmpExtensions.z_kronecker_si_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var a: MPInteger;
+begin
+  z_init_set_si(a, A_);
+  assert(z_kronecker_si(a, B1) = 1);
+  assert(z_kronecker_si(a, B0) = 0);
+  assert(z_kronecker_si(a, BM1) = -1);
+end;
+
+procedure TTestGmpExtensions.z_kronecker_ui_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var a: MPInteger;
+begin
+  z_init_set_si(a, A_);
+  assert(z_kronecker_ui(a, B1) = 1);
+  assert(z_kronecker_ui(a, B0) = 0);
+  assert(z_kronecker_ui(a, BM1) = -1);
+end;
+
+procedure TTestGmpExtensions.z_si_kronecker_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var b: MPInteger;
+begin
+  z_init_set_si(b, B1);
+  assert(z_si_kronecker(A_, b) = 1);
+  z_set_si(b, B0);
+  assert(z_si_kronecker(A_, b) = 0);
+  z_set_si(b, BM1);
+  assert(z_si_kronecker(A_, b) = -1);
+end;
+
+procedure TTestGmpExtensions.z_ui_kronecker_test;
+const
+  A_ = 8;
+  B0 = 6;
+  BM1 = 5;
+  B1 = 7;
+var b: MPInteger;
+begin
+  z_init_set_si(b, B1);
+  assert(z_ui_kronecker(A_, b) = 1);
+  z_set_si(b, B0);
+  assert(z_ui_kronecker(A_, b) = 0);
+  z_set_si(b, BM1);
+  assert(z_ui_kronecker(A_, b) = -1);
+end;
+
+procedure TTestGmpExtensions.z_remove_test;
+const
+  F_ = 5;
+  OP_ = 3 * F_ * 7;
+  ROP_ = OP_ div F_;
+var rop, op, f: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op, OP_);
+  z_init_set_si(f, F_);
+  assert(z_remove(rop, op, f) = 1);
+  assert(z_get_si(rop) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_fac_ui_test;
+const
+  OP = 4;
+  ROP_ = 2 * 3 * 4;
+var rop, r2: MPInteger;
+begin
+  z_init(rop);
+  z_fac_ui(rop, OP);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_fac_ui(OP);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_bin_ui_test;
+const
+  N_ = 7;
+  K = 3;
+  ROP_ = 35;
+var rop, n, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(n, N_);
+  z_bin_ui(rop, n, K);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_bin_ui(n, K);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_bin_uiui_test;
+const
+  N = 7;
+  K = 3;
+  ROP_ = 35;
+var rop, r2: MPInteger;
+begin
+  z_init(rop);
+  z_bin_uiui(rop, N, K);
+  assert(z_get_si(rop) = ROP_);
+  r2 := z_bin_uiui(N, K);
+  assert(z_get_si(r2) = ROP_);
+end;
+
+procedure TTestGmpExtensions.z_fib_ui_test;
+const
+  N = 10;
+  FN_ = 55;
+var fn, ff: MPInteger;
+begin
+  z_init(fn);
+  z_fib_ui(fn, N);
+  assert(z_get_si(fn) = FN_);
+  ff := z_fib_ui(N);
+  assert(z_get_si(ff) = FN_);
+end;
+
+procedure TTestGmpExtensions.z_fib2_ui_test;
+const
+  N = 10;
+  FN_ = 55;
+  FNSUB1_ = 34;
+var fn, fnsub1, ff, ff1: MPInteger;
+begin
+  z_init(fn);
+  z_init(fnsub1);
+  z_fib2_ui(fn, fnsub1, N);
+  assert(z_get_si(fn) = FN_);
+  assert(z_get_si(fnsub1) = FNSUB1_);
+  z_init(ff1);
+  ff := z_fib2_ui(ff1, N);
+  assert(z_get_si(ff) = FN_);
+  assert(z_get_si(ff1) = FNSUB1_);
+end;
+
+procedure TTestGmpExtensions.z_lucnum_ui_test;
+const
+  N = 10;
+  LN_ = 123;
+var ln, l2: MPInteger;
+begin
+  z_init(ln);
+  z_lucnum_ui(ln, N);
+  assert(z_get_si(ln) = LN_);
+  l2 := z_lucnum_ui(N);
+  assert(z_get_si(l2) = LN_);
+end;
+
+procedure TTestGmpExtensions.z_lucnum2_ui_test;
+const
+  N = 10;
+  LN_ = 123;
+  LNSUB1_ = 76;
+var ln, lnsub1, l2, l2s1: MPInteger;
+begin
+  z_init(ln);
+  z_init(lnsub1);
+  z_lucnum2_ui(ln, lnsub1, N);
+  assert(z_get_si(ln) = LN_);
+  assert(z_get_si(lnsub1) = LNSUB1_);
+  z_init(l2s1);
+  l2 := z_lucnum2_ui(l2s1, N);
+  assert(z_get_si(l2) = LN_);
+  assert(z_get_si(l2s1) = LNSUB1_);
+end;
+
+procedure TTestGmpExtensions.z_cmp_test;
+const
+  OP_1 = -10;
+  OP_2 = OP_1 - 1;
+var op1, op2: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  assert(z_cmp(op1, op2) > 0);
+  z_set_si(op2, OP_1);
+  assert(z_cmp(op1, op2) = 0);
+  z_set_si(op2, OP_1 + 1);
+  assert(z_cmp(op1, op2) < 0);
+end;
+
+procedure TTestGmpExtensions.z_cmp_d_test;
+const
+  OP_1 = -10;
+var op1: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  assert(z_cmp_d(op1, OP_1 - 1) > 0);
+  assert(z_cmp_d(op1, OP_1) = 0);
+  assert(z_cmp_d(op1, OP_1 + 1) < 0);
+end;
+
+procedure TTestGmpExtensions.z_cmp_si_test;
+const
+  OP_1 = -10;
+var op1: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  assert(z_cmp_si(op1, OP_1 - 1) > 0);
+  assert(z_cmp_si(op1, OP_1) = 0);
+  assert(z_cmp_si(op1, OP_1 + 1) < 0);
+end;
+
+procedure TTestGmpExtensions.z_cmp_ui_test;
+const
+  OP_1 = 10;
+var op1: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  assert(z_cmp_ui(op1, OP_1 - 1) > 0);
+  assert(z_cmp_ui(op1, OP_1) = 0);
+  assert(z_cmp_ui(op1, OP_1 + 1) < 0);
+end;
+
+procedure TTestGmpExtensions.z_cmpabs_test;
+const
+  OP_1 = -10;
+  OP_2 = -OP_1 - 1;
+var op1, op2: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, -OP_2);
+  assert(z_cmpabs(op1, op2) > 0);
+  z_set_si(op2, -OP_1);
+  assert(z_cmpabs(op1, op2) = 0);
+  z_set_si(op2, -OP_1 + 1);
+  assert(z_cmpabs(op1, op2) < 0);
+end;
+
+procedure TTestGmpExtensions.z_cmpabs_d_test;
+const OP_1 = -10;
+var op1: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  assert(z_cmpabs_d(op1, -OP_1 - 1) > 0);
+  assert(z_cmpabs_d(op1, -OP_1) = 0);
+  assert(z_cmpabs_d(op1, -OP_1 + 1) < 0);
+end;
+
+procedure TTestGmpExtensions.z_cmpabs_ui_test;
+const OP_1 = -10;
+var op1: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  assert(z_cmpabs_ui(op1, -OP_1 - 1) > 0);
+  assert(z_cmpabs_ui(op1, -OP_1) = 0);
+  assert(z_cmpabs_ui(op1, -OP_1 + 1) < 0);
+end;
+
+procedure TTestGmpExtensions.z_and_test;
+const
+  OP_1 = $c;
+  OP_2 = $a;
+var rop, op1, op2, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_and(rop, op1, op2);
+  assert(z_get_si(rop) = OP_1 and OP_2);
+  r2 := z_and(op1, op2);
+  assert(z_get_si(r2) = OP_1 and OP_2);
+end;
+
+procedure TTestGmpExtensions.z_ior_test;
+const
+  OP_1 = $c;
+  OP_2 = $a;
+var rop, op1, op2, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_ior(rop, op1, op2);
+  assert(z_get_si(rop) = OP_1 or OP_2);
+  r2 := z_ior(op1, op2);
+  assert(z_get_si(r2) = OP_1 or OP_2);
+end;
+
+procedure TTestGmpExtensions.z_xor_test;
+const
+  OP_1 = $c;
+  OP_2 = $a;
+var rop, op1, op2, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  z_xor(rop, op1, op2);
+  assert(z_get_si(rop) = OP_1 xor OP_2);
+  r2 := z_xor(op1, op2);
+  assert(z_get_si(r2) = OP_1 xor OP_2);
+end;
+
+procedure TTestGmpExtensions.z_com_test;
+const
+  OP_1 = 2;
+var rop, op1, r2: MPInteger;
+begin
+  z_init(rop);
+  z_init_set_si(op1, OP_1);
+  z_com(rop, op1);
+  assert(z_get_si(rop) = not OP_1 );
+  r2 := z_com(op1);
+  assert(z_get_si(r2) = not OP_1 );
+end;
+
+procedure TTestGmpExtensions.z_popcount_test;
+const
+  OP_ = $55AA;
+  N = 8;
+var op: MPInteger;
+begin
+  z_init_set_si(op, OP_);
+  assert(z_popcount(op) = N);
+end;
+
+procedure TTestGmpExtensions.z_hamdist_test;
+const
+  OP_1 = $55;
+  OP_2 = $7A;
+  N = 5;
+var op1, op2: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  assert(z_hamdist(op1, op2) = N);
+end;
+
+procedure TTestGmpExtensions.z_scan0_test;
+const
+  OP_ = $F75;
+  STARTING_BIT = 4;
+  N = 7;
+var op: MPInteger;
+begin
+  z_init_set_si(op, OP_);
+  assert(z_scan0(op, STARTING_BIT) = N);
+end;
+
+procedure TTestGmpExtensions.z_scan1_test;
+const
+  OP_ = $85;
+  STARTING_BIT = 4;
+  N = 7;
+var op: MPInteger;
+begin
+  z_init_set_si(op, OP_);
+  assert(z_scan1(op, STARTING_BIT) = N);
+end;
+
+procedure TTestGmpExtensions.z_setbit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX = 7;
+var rop: MPInteger;
+begin
+  z_init_set_ui(rop, ROP_);
+  z_setbit(rop, BIT_INDEX);
+  assert(z_get_ui(rop) = ROP_ or (1 shl BIT_INDEX));
+end;
+
+procedure TTestGmpExtensions.z_clrbit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX = 9;
+var rop: MPInteger;
+begin
+  z_init_set_ui(rop, ROP_);
+  z_clrbit(rop, BIT_INDEX);
+  assert(z_get_ui(rop) = ROP_ and not (1 shl BIT_INDEX));
+end;
+
+procedure TTestGmpExtensions.z_combit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX = 7;
+var rop: MPInteger;
+begin
+  z_init_set_ui(rop, ROP_);
+  z_combit(rop, BIT_INDEX);
+  assert(z_get_ui(rop) = ROP_ xor (1 shl BIT_INDEX));
+end;
+
+procedure TTestGmpExtensions.z_tstbit_test;
+const
+  ROP_ = $F75;
+  BIT_INDEX1 = 7;
+  BIT_INDEX2 = 8;
+var rop: MPInteger;
+begin
+  z_init_set_ui(rop, ROP_);
+  assert(z_tstbit(rop, BIT_INDEX1) = longbool(ROP_ and (1 shl BIT_INDEX1)));
+  assert(z_tstbit(rop, BIT_INDEX2) = longbool(ROP_ and (1 shl BIT_INDEX2)));
+end;
+
+procedure TTestGmpExtensions.z_urandomb_test;
+const
+  B = 8 * (sizeof(valuint) - 1);
+  N = 1 shl B;
+var
+  rop, r2: MPInteger;
+  state: MPRandState;
+begin
+  randinit_default(state);
+  z_init(rop);
+  z_urandomb(rop, state, B);
+  assert(z_cmp_ui(rop, N) < 0);
+  r2 := z_urandomb(state, B);
+  assert(z_cmp_ui(r2, N) < 0);
+end;
+
+procedure TTestGmpExtensions.z_urandomm_test;
+const
+  N_ = 1000000;
+var
+  rop, n, r2: MPInteger;
+  state: MPRandState;
+begin
+  randinit_default(state);
+  z_init(rop);
+  z_init_set_ui(n, N_);
+  z_urandomm(rop, state, n);
+  assert(z_cmp_ui(rop, N_) < 0);
+  r2 := z_urandomm(state, n);
+  assert(z_cmp_ui(r2, N_) < 0);
+end;
+
+procedure TTestGmpExtensions.z_rrandomb_test;
+const
+  B = 8 * sizeof(valuint) - 2;
+  N = 1 shl B;
+var
+  rop, r2: MPInteger;
+  state: MPRandState;
+begin
+  randinit_default(state);
+  z_init(rop);
+  z_rrandomb(rop, state, B);
+  assert(z_cmp_ui(rop, N) < 0);
+  r2 := z_rrandomb(state, B);
+  assert(z_cmp_ui(r2, N) < 0);
+end;
+
+procedure TTestGmpExtensions.z_fits_ushort_p_test;
+var op: MPInteger;
+begin
+  z_init_set_ui(op, high(word));
+  assert(z_fits_ushort_p(op));
+  z_add_ui(op, op, 1);
+  assert(not z_fits_ushort_p(op));
+end;
+
+procedure TTestGmpExtensions.z_fits_sshort_p_test;
+var op: MPInteger;
+begin
+  z_init_set_si(op, high(smallint));
+  assert(z_fits_sshort_p(op));
+  z_add_ui(op, op, 1);
+  assert(not z_fits_sshort_p(op));
+end;
+
+procedure TTestGmpExtensions.z_fits_uint_p_test;
+var op: MPInteger;
+begin
+  z_init_set_ui(op, high(cardinal));
+  assert(z_fits_uint_p(op));
+  z_add_ui(op, op, 1);
+  assert(not z_fits_uint_p(op));
+end;
+
+procedure TTestGmpExtensions.z_fits_sint_p_test;
+var op: MPInteger;
+begin
+  z_init_set_si(op, high(integer));
+  assert(z_fits_sint_p(op));
+  z_add_ui(op, op, 1);
+  assert(not z_fits_sint_p(op));
+end;
+
+procedure TTestGmpExtensions.z_fits_ulong_p_test;
+var op: MPInteger;
+begin
+  z_init_set_ui(op, high(valuint));
+  assert(z_fits_ulong_p(op));
+  z_add_ui(op, op, 1);
+  assert(not z_fits_ulong_p(op));
+end;
+
+procedure TTestGmpExtensions.z_fits_slong_p_test;
+var op: MPInteger;
+begin
+  z_init_set_si(op, high(valsint));
+  assert(z_fits_slong_p(op));
+  z_add_ui(op, op, 1);
+  assert(not z_fits_slong_p(op));
+end;
+
+procedure TTestGmpExtensions.z_sizeinbase_test;
+const
+  OP_ = 1000000;
+var rop: MPInteger;
+begin
+  z_init_set_ui(rop, OP_);
+  assert(z_sizeinbase(rop, BASE10) - length(inttostr(OP_)) = 0);
+end;
+
+procedure TTestGmpExtensions.z_size_test;
+var rop: MPInteger;
+begin
+  z_init(rop);
+  assert(z_size(rop) = 0);
+  z_add_ui(rop, rop, 1);
+  assert(z_size(rop) = 1);
+end;
+
+procedure TTestGmpExtensions.q_init_test;
+var rational: MPRational;
+begin
+  q_init(rational);
+  assert(q_cmp_ui(rational, 0, 1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_clear_test;
+var rational: MPRational;
+begin
+  q_init(rational);
+  q_clear(rational);
+end;
+
+procedure TTestGmpExtensions.q_set_ui_test;
+const
+  OP_1 = 13;
+  OP_2 = 17;
+var rational: MPRational;
+begin
+  q_init(rational);
+  q_set_ui(rational, OP_1, OP_2);
+  assert(q_cmp_ui(rational, OP_1, OP_2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_set_si_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var rational: MPRational;
+begin
+  q_init(rational);
+  q_set_si(rational, OP_1, OP_2);
+  assert(q_cmp_si(rational, OP_1, OP_2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_canonicalize_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+  CF = 11;
+var rational: MPRational;
+begin
+  q_init(rational);
+  q_set_si(rational, CF * OP_1, CF * OP_2);
+  q_canonicalize(rational);
+  assert(q_cmp_si(rational, OP_1, OP_2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_set_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var rational1, rational2: MPRational;
+begin
+  q_init(rational1);
+  q_init(rational2);
+  q_set_si(rational2, OP_1, OP_2);
+  q_set(rational1, rational2);
+  assert(q_cmp_si(rational1, OP_1, OP_2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_set_z_test;
+const
+  OP_1 = -13;
+var
+  rational: MPRational;
+  op: MPInteger;
+begin
+  q_init(rational);
+  z_init_set_si(op, OP_1);
+  q_set_z(rational, op);
+  assert(q_cmp_si(rational, OP_1, 1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_set_str_test;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var rational: MPRational;
+begin
+  q_init(rational);
+  assert(q_set_str(rational, pchar(inttostr(OP_1) + '/' + inttostr(OP_2)), BASE10));
+  assert(q_cmp_si(rational, OP_1, OP_2) = 0);
+  assert(not q_set_str(rational, pchar(inttostr(OP_1) + '*' + inttostr(OP_2)), BASE10));
+end;
+
+procedure TTestGmpExtensions.q_swap_test;
+const
+  ROP_1N = -13;
+  ROP_1D = 17;
+  ROP_2N = -23;
+  ROP_2D = 31;
+var rop1, rop2: MPRational;
+begin
+  q_init(rop1);
+  q_init(rop2);
+  q_set_si(rop1, ROP_1N, ROP_1D);
+  q_set_si(rop2, ROP_2N, ROP_2D);
+  q_swap(rop1, rop2);
+  assert(q_cmp_si(rop1, ROP_2N, ROP_2D) = 0);
+  assert(q_cmp_si(rop2, ROP_1N, ROP_1D) = 0);
+end;
+
+procedure TTestGmpExtensions.q_get_d_test;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var op: MPRational;
+begin
+  q_init(op);
+  q_set_si(op, OP_1, OP_2);
+  assert(q_get_d(op) = OP_1 / OP_2);
+end;
+
+procedure TTestGmpExtensions.q_set_d_test;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var rop: MPRational;
+begin
+  q_init(rop);
+  q_set_d(rop, OP_1 / OP_2);
+  assert(q_cmp_si(rop, OP_1, OP_2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_set_f_test;
+const OP_ = -10;
+var
+  op: MPFloat;
+  rop: MPRational;
+begin
+  f_init_set_si(op, OP_);
+  q_init(rop);
+  q_set_f(rop, op);
+  assert(q_get_d(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.q_get_str_test;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var
+  op: MPRational;
+  p: pchar;
+  s, s2: string;
+begin
+  q_init(op);
+  q_set_si(op, OP_1, OP_2);
+  s := q_get_str(BASE10, op);
+  assert(s = inttostr(OP_1) + '/' + inttostr(OP_2));
+  p := q_get_str(nil, BASE10, op);
+  assert(p = inttostr(OP_1) + '/' + inttostr(OP_2));
+  freemem(p);
+  setlength(s2, length(inttostr(OP_1) + '/' + inttostr(OP_2)));
+  assert(pointer(q_get_str(pchar(s2), BASE10, op)) = pointer(s2));
+  assert(s2 = inttostr(OP_1) + '/' + inttostr(OP_2));
+end;
+
+procedure TTestGmpExtensions.q_add_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var sum, addend1, addend2, s2: MPRational;
+begin
+  q_init(sum);
+  q_init(addend1);
+  q_init(addend2);
+  q_set_si(addend1, N1, D1);
+  q_set_si(addend2, N2, D2);
+  q_add(sum, addend1, addend2);
+  assert(q_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
+  s2 := q_add(addend1, addend2);
+  assert(q_cmp_si(s2, N1 * D2 + N2 * D1, D1 * D2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_sub_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var difference, minuend, subtrahend, diff2: MPRational;
+begin
+  q_init(difference);
+  q_init(minuend);
+  q_init(subtrahend);
+  q_set_si(minuend, N1, D1);
+  q_set_si(subtrahend, N2, D2);
+  q_sub(difference, minuend, subtrahend);
+  assert(q_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
+  diff2 := q_sub(minuend, subtrahend);
+  assert(q_cmp_si(diff2, N1 * D2 - N2 * D1, D1 * D2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_mul_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var product, multiplier, multiplicant, p2: MPRational;
+begin
+  q_init(product);
+  q_init(multiplier);
+  q_init(multiplicant);
+  q_set_si(multiplier, N1, D1);
+  q_set_si(multiplicant, N2, D2);
+  q_mul(product, multiplier, multiplicant);
+  assert(q_cmp_si(product, N1 * N2, D1 * D2) = 0);
+  p2 := q_mul(multiplier, multiplicant);
+  assert(q_cmp_si(p2, N1 * N2, D1 * D2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_mul_2exp_test;
+const
+  N1 = 5;
+  D1 = 3;
+  OP_2 = 2;
+var rop, op1, r2: MPRational;
+begin
+  q_init(rop);
+  q_init(op1);
+  q_set_si(op1, N1, D1);
+  q_mul_2exp(rop, op1, OP_2);
+  assert(q_cmp_si(rop, N1 * (1 shl OP_2), D1) = 0);
+  r2 := q_mul_2exp(op1, OP_2);
+  assert(q_cmp_si(r2, N1 * (1 shl OP_2), D1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_div_test;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var quotient, dividend, divisor, q2: MPRational;
+begin
+  q_init(quotient);
+  q_init(dividend);
+  q_init(divisor);
+  q_set_si(dividend, N1, D1);
+  q_set_si(divisor, N2, D2);
+  q_div(quotient, dividend, divisor);
+  assert(q_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
+  q2 := q_div(dividend, divisor);
+  assert(q_cmp_si(q2, -N1 * D2, -D1 * N2) = 0);
+end;
+
+procedure TTestGmpExtensions.q_div_2exp_test;
+const
+  N1 = 5;
+  D1 = 3;
+  OP_2 = 2;
+var rop, op1, r2: MPRational;
+begin
+  q_init(rop);
+  q_init(op1);
+  q_set_si(op1, N1, D1);
+  q_div_2exp(rop, op1, OP_2);
+  assert(q_cmp_si(rop, N1, D1 * (1 shl OP_2)) = 0);
+  r2 := q_div_2exp(op1, OP_2);
+  assert(q_cmp_si(r2, N1, D1 * (1 shl OP_2)) = 0);
+end;
+
+procedure TTestGmpExtensions.q_neg_test;
+const
+  N1 = -5;
+  D1 = 3;
+var negated_operand, operand, n2: MPRational;
+begin
+  q_init(negated_operand);
+  q_init(operand);
+  q_set_si(operand, N1, D1);
+  q_neg(negated_operand, operand);
+  assert(q_cmp_si(negated_operand, -N1, D1) = 0);
+  n2 := q_neg(operand);
+  assert(q_cmp_si(n2, -N1, D1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_abs_test;
+const
+  N1 = 5;
+  D1 = 3;
+var rop, op, r2: MPRational;
+begin
+  q_init(rop);
+  q_init(op);
+  q_set_si(op, -N1, D1);
+  q_abs(rop, op);
+  assert(q_cmp_si(rop, N1, D1) = 0);
+  r2 := q_abs(op);
+  assert(q_cmp_si(r2, N1, D1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_inv_test;
+const
+  N1 = -5;
+  D1 = 3;
+var inverted_number, number, i2: MPRational;
+begin
+  q_init(inverted_number);
+  q_init(number);
+  q_set_si(number, N1, D1);
+  q_inv(inverted_number, number);
+  assert(q_cmp_si(inverted_number, -D1, -N1) = 0);
+  i2 := q_inv(number);
+  assert(q_cmp_si(i2, -D1, -N1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_cmp_test;
+const
+  N1 = -7;
+  D1 = 5;
+var op1, op2: MPRational;
+begin
+  q_init(op1);
+  q_init(op2);
+  q_set_si(op1, N1, D1);
+  q_set_si(op2, N1, D1);
+  assert(q_cmp(op1, op2) = 0);
+  q_set_si(op1, N1 + 1, D1);
+  assert(q_cmp(op1, op2) > 0);
+  q_set_si(op1, N1 - 1, D1);
+  assert(q_cmp(op1, op2) < 0);
+end;
+
+procedure TTestGmpExtensions.q_cmp_si_test;
+const
+  N1 = -7;
+  D1 = 5;
+var op1: MPRational;
+begin
+  q_init(op1);
+  q_set_si(op1, N1, D1);
+  assert(q_cmp_si(op1, N1, D1) = 0);
+  assert(q_cmp_si(op1, N1 - 1, D1) > 0);
+  assert(q_cmp_si(op1, N1 + 1, D1) < 0);
+end;
+
+procedure TTestGmpExtensions.q_cmp_ui_test;
+const
+  N1 = 7;
+  D1 = 5;
+var op1: MPRational;
+begin
+  q_init(op1);
+  q_set_si(op1, N1, D1);
+  assert(q_cmp_ui(op1, N1, D1) = 0);
+  assert(q_cmp_ui(op1, N1 - 1, D1) > 0);
+  assert(q_cmp_ui(op1, N1 + 1, D1) < 0);
+end;
+
+procedure TTestGmpExtensions.q_equal_test;
+const
+  N1 = -7;
+  D1 = 5;
+var op1, op2: MPRational;
+begin
+  q_init(op1);
+  q_init(op2);
+  q_set_si(op1, N1, D1);
+  q_set_si(op2, N1, D1);
+  assert(q_equal(op1, op2));
+  q_set_si(op1, N1 + 1, D1);
+  assert(not q_equal(op1, op2));
+  q_set_si(op1, N1 - 1, D1);
+  assert(not q_equal(op1, op2));
+end;
+
+procedure TTestGmpExtensions.q_get_num_test;
+const
+  N1 = -7;
+  D1 = 5;
+var
+  rational: MPRational;
+  numerator, n2: MPInteger;
+begin
+  q_init(rational);
+  z_init(numerator);
+  q_set_si(rational, N1, D1);
+  q_get_num(numerator, rational);
+  assert(z_get_si(numerator) = N1);
+  n2 := q_get_num(rational);
+  assert(z_get_si(n2) = N1);
+end;
+
+procedure TTestGmpExtensions.q_get_den_test;
+const
+  N1 = -7;
+  D1 = 5;
+var
+  rational: MPRational;
+  denominator, d2: MPInteger;
+begin
+  q_init(rational);
+  z_init(denominator);
+  q_set_si(rational, N1, D1);
+  q_get_den(denominator, rational);
+  assert(z_get_si(denominator) = D1);
+  d2 := q_get_den(rational);
+  assert(z_get_si(d2) = D1);
+end;
+
+procedure TTestGmpExtensions.q_set_num_test;
+const
+  N1 = -7;
+  D1 = 5;
+  N2 = 3;
+var
+  rational: MPRational;
+  numerator: MPInteger;
+begin
+  q_init(rational);
+  z_init_set_si(numerator, N2);
+  q_set_si(rational, N1, D1);
+  q_set_num(rational, numerator);
+  assert(q_cmp_si(rational, N2, D1) = 0);
+end;
+
+procedure TTestGmpExtensions.q_set_den_test;
+const
+  N1 = -7;
+  D1 = 5;
+  D2 = 3;
+var
+  rational: MPRational;
+  denominator: MPInteger;
+begin
+  q_init(rational);
+  z_init_set_si(denominator, D2);
+  q_set_si(rational, N1, D1);
+  q_set_den(rational, denominator);
+  assert(q_cmp_si(rational, N1, D2) = 0);
+end;
+
+procedure TTestGmpExtensions.f_get_default_prec_test;
+begin
+  assert(f_get_default_prec > 0);
+end;
+
+procedure TTestGmpExtensions.f_set_default_prec_test;
+var prec: valuint;
+begin
+  prec := f_get_default_prec;
+  f_set_default_prec(2 * prec);
+  assert(f_get_default_prec  = 2 * prec);
+  f_set_default_prec(prec);
+end;
+
+procedure TTestGmpExtensions.f_init_test;
+var x: MPFloat;
+begin
+  f_init(x);
+  assert(f_get_prec(x) = f_get_default_prec);
+end;
+
+procedure TTestGmpExtensions.f_init2_test;
+var x: MPFloat;
+begin
+  f_init2(x, 2 * f_get_default_prec);
+  assert(f_get_prec(x) = 2 * f_get_default_prec);
+end;
+
+procedure TTestGmpExtensions.f_clear_test;
+var x: MPFloat;
+begin
+  f_init(x);
+  f_clear(x);
+end;
+
+procedure TTestGmpExtensions.f_get_prec_test;
+var x: MPFloat;
+begin
+  f_init(x);
+  f_set_prec(x, 2 * f_get_default_prec);
+  assert(f_get_prec(x) = 2 * f_get_default_prec);
+end;
+
+procedure TTestGmpExtensions.f_set_prec_test;
+var x: MPFloat;
+begin
+  f_init(x);
+  f_set_prec(x, 2 * f_get_default_prec);
+  assert(f_get_prec(x) = 2 * f_get_default_prec);
+end;
+
+procedure TTestGmpExtensions.f_set_prec_raw_test;
+const N = 10;
+var x: MPFloat;
+begin
+  f_init2(x, N * f_get_default_prec);
+  f_set_prec_raw(x, f_get_default_prec);
+  f_set_prec_raw(x, N * f_get_default_prec);
+end;
+
+procedure TTestGmpExtensions.f_set_q_test;
+const OP_ = -10;
+var
+  op: MPRational;
+  rop: MPFloat;
+begin
+  q_init(op);
+  f_init(rop);
+  q_set_si(op, OP_, 1);
+  f_set_q(rop, op);
+  assert(f_get_si(rop) = OP_);
+end;
+
+procedure TTestGmpExtensions.f_set_ui_test;
+const OP = 1000000;
+var rop: MPFloat;
+begin
+  f_init(rop);
+  f_set_ui(rop, OP);
+  assert(f_get_ui(rop) = OP);
+end;
+
+procedure TTestGmpExtensions.f_get_ui_test;
+const OP = 1000000;
+var rop: MPFloat;
+begin
+  f_init(rop);
+  f_set_ui(rop, OP);
+  assert(f_get_ui(rop) = OP);
+end;
+
+procedure TTestGmpExtensions.f_set_si_test;
+const OP = -1000000;
+var rop: MPFloat;
+begin
+  f_init(rop);
+  f_set_si(rop, OP);
+  assert(f_get_si(rop) = OP);
+end;
+
+procedure TTestGmpExtensions.f_get_si_test;
+const OP = -1000000;
+var rop: MPFloat;
+begin
+  f_init(rop);
+  f_set_si(rop, OP);
+  assert(f_get_si(rop) = OP);
+end;
+
+procedure TTestGmpExtensions.f_set_test;
+const N = -1000000;
+var rop, op: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_si(op, N);
+  f_set(rop, op);
+  assert(f_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_set_str_test;
+const N = -123;
+var rop: MPFloat;
+begin
+  f_init(rop);
+  assert(f_set_str(rop, inttostr(N), BASE10));
+  assert(f_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_swap_test;
+const
+  ROP_1 = -13;
+  ROP_2 = -23;
+var rop1, rop2: MPFloat;
+begin
+  f_init_set_si(rop1, ROP_1);
+  f_init_set_si(rop2, ROP_2);
+  f_swap(rop1, rop2);
+  assert(f_get_si(rop1) =  ROP_2);
+  assert(f_get_si(rop2) = ROP_1);
+end;
+
+procedure TTestGmpExtensions.f_get_d_test;
+const N = -1.5;
+var rop: MPFloat;
+begin
+  f_init_set_d(rop, N);
+  assert(f_get_d(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_set_d_test;
+const N = -1.5;
+var rop: MPFloat;
+begin
+  f_init(rop);
+  f_set_d(rop, N);
+  assert(f_get_d(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_set_z_test;
+const
+  OP_1 = -13;
+var
+  rop: MPFloat;
+  op: MPInteger;
+begin
+  f_init(rop);
+  z_init_set_si(op, OP_1);
+  f_set_z(rop, op);
+  assert(f_get_si(rop) = OP_1);
+end;
+
+procedure TTestGmpExtensions.f_get_d_2exp_test;
+const
+  M = 0.5;
+  E = 4;
+  N = (1 shl E) div 2;
+var
+  rop: MPFloat;
+  exp: valsint;
+begin
+  f_init_set_d(rop, N);
+  exp := -1;
+  assert(f_get_d_2exp(exp, rop) = M);
+  assert(exp = E);
+end;
+
+procedure TTestGmpExtensions.f_get_str_test;
+const
+  N = 3.1416;
+  S = '31416';
+  E = 1;
+var
+  op: MPFloat;
+  p: pchar;
+  exp: mp_exp_t;
+  s1: string;
+begin
+  f_init_set_d(op, N);
+  p := f_get_str(nil, exp, BASE10, length(S), op);
+  assert(p = S);
+  assert(exp = E);
+  freemem(p);
+  setlength(s1, length(S));
+  assert(pointer(f_get_str(pchar(s1), exp, BASE10, length(s), op)) = pointer(s1));
+  assert(s1 = S);
+  s1 := f_get_str(exp, BASE10, length(S), op);
+  assert(s1 = S);
+end;
+
+procedure TTestGmpExtensions.f_add_test;
+const
+  OP1_ = 1;
+  OP2_ = 2;
+var rop, op1, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  f_add(rop, op1, op2);
+  assert(f_get_d(rop) = OP1_ + OP2_);
+  r2 := f_add(op1, op2);
+  assert(f_get_d(r2) = OP1_ + OP2_);
+end;
+
+procedure TTestGmpExtensions.f_add_ui_test;
+const
+  OP1_ = 1;
+  OP2_ = 2;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_add_ui(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ + OP2_);
+  r2 := f_add_ui(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ + OP2_);
+end;
+
+procedure TTestGmpExtensions.f_sub_test;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op1, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  f_sub(rop, op1, op2);
+  assert(f_get_d(rop) = OP1_ - OP2_);
+  r2 := f_sub(op1, op2);
+  assert(f_get_d(r2) = OP1_ - OP2_);
+end;
+
+procedure TTestGmpExtensions.f_sub_ui_test;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_sub_ui(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ - OP2_);
+  r2 := f_sub_ui(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ - OP2_);
+end;
+
+procedure TTestGmpExtensions.f_ui_sub_test;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op2, OP2_);
+  f_ui_sub(rop, OP1_, op2);
+  assert(f_get_d(rop) = OP1_ - OP2_);
+  r2 := f_ui_sub(OP1_, op2);
+  assert(f_get_d(r2) = OP1_ - OP2_);
+end;
+
+procedure TTestGmpExtensions.f_mul_test;
+const
+  OP1_ = 2;
+  OP2_ = 3;
+var rop, op1, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  f_mul(rop, op1, op2);
+  assert(f_get_d(rop) = OP1_ * OP2_);
+  r2 := f_mul(op1, op2);
+  assert(f_get_d(r2) = OP1_ * OP2_);
+end;
+
+procedure TTestGmpExtensions.f_mul_ui_test;
+const
+  OP1_ = 2;
+  OP2_ = 3;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_mul_ui(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ * OP2_);
+  r2 := f_mul_ui(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ * OP2_);
+end;
+
+procedure TTestGmpExtensions.f_mul_2exp_test;
+const
+  OP1_ = 3;
+  OP2_ = 4;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_mul_2exp(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ * (1 shl OP2_));
+  r2 := f_mul_2exp(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ * (1 shl OP2_));
+end;
+
+procedure TTestGmpExtensions.f_div_test;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op1, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  f_div(rop, op1, op2);
+  assert(f_get_d(rop) = OP1_ / OP2_);
+  r2 := f_div(op1, op2);
+  assert(f_get_d(r2) = OP1_ / OP2_);
+end;
+
+procedure TTestGmpExtensions.f_div_ui_test;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_div_ui(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ / OP2_);
+  r2 := f_div_ui(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ / OP2_);
+end;
+
+procedure TTestGmpExtensions.f_ui_div_test;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_si(op2, OP2_);
+  f_ui_div(rop, OP1_, op2);
+  assert(f_get_d(rop) = OP1_ / OP2_);
+  r2 := f_ui_div(OP1_, op2);
+  assert(f_get_d(r2) = OP1_ / OP2_);
+end;
+
+procedure TTestGmpExtensions.f_div_2exp_test;
+const
+  OP1_ = 16;
+  OP2_ = 2;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_div_2exp(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ / (1 shl OP2_));
+  r2 := f_div_2exp(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ / (1 shl OP2_));
+end;
+
+procedure TTestGmpExtensions.f_sqrt_test;
+const
+  OP_ = 4;
+var rop, op, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op, OP_);
+  f_sqrt(rop, op);
+  assert(f_get_d(rop) = sqrt(OP_));
+  r2 := f_sqrt(op);
+  assert(f_get_d(r2) = sqrt(OP_));
+end;
+
+procedure TTestGmpExtensions.f_sqrt_ui_test;
+const
+  OP_ = 4;
+var rop, r2: MPFloat;
+begin
+  f_init(rop);
+  f_sqrt_ui(rop, OP_);
+  assert(f_get_d(rop) = sqrt(OP_));
+  r2 := f_sqrt_ui(OP_);
+  assert(f_get_d(r2) = sqrt(OP_));
+end;
+
+procedure TTestGmpExtensions.f_pow_ui_test;
+const
+  OP1_ = 3;
+  OP2_ = 2;
+var rop, op1, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_pow_ui(rop, op1, OP2_);
+  assert(f_get_d(rop) = OP1_ ** OP2_);
+  r2 := f_pow_ui(op1, OP2_);
+  assert(f_get_d(r2) = OP1_ ** OP2_);
+end;
+
+procedure TTestGmpExtensions.f_neg_test;
+const
+  OP_ = 4;
+var rop, op, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op, OP_);
+  f_neg(rop, op);
+  assert(f_get_d(rop) = -OP_);
+  r2 := f_neg(op);
+  assert(f_get_d(r2) = -OP_);
+end;
+
+procedure TTestGmpExtensions.f_abs_test;
+const OP_ = -4;
+var rop, op, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op, OP_);
+  f_abs(rop, op);
+  assert(f_get_d(rop) = -OP_);
+  r2 := f_abs(op);
+  assert(f_get_d(r2) = -OP_);
+end;
+
+procedure TTestGmpExtensions.f_cmp_test;
+const OP_1 = -10;
+var op1, op2: MPFloat;
+begin
+  f_init_set_si(op1, OP_1);
+  f_init_set_si(op2, OP_1);
+  assert(f_cmp(op1, op2) = 0);
+  f_set_si(op2, OP_1 + 1);
+  assert(f_cmp(op1, op2) < 0);
+  f_set_si(op2, OP_1 - 1);
+  assert(f_cmp(op1, op2) > 0);
+end;
+
+procedure TTestGmpExtensions.f_cmp_d_test;
+const OP_ = -10;
+var op: MPFloat;
+begin
+  f_init_set_si(op, OP_);
+  assert(f_cmp_d(op, OP_) = 0);
+  assert(f_cmp_d(op, OP_ + 1) < 0);
+  assert(f_cmp_d(op, OP_ - 1) > 0);
+end;
+
+procedure TTestGmpExtensions.f_cmp_si_test;
+const OP_ = -10;
+var op: MPFloat;
+begin
+  f_init_set_si(op, OP_);
+  assert(f_cmp_si(op, OP_) = 0);
+  assert(f_cmp_si(op, OP_ + 1) < 0);
+  assert(f_cmp_si(op, OP_ - 1) > 0);
+end;
+
+procedure TTestGmpExtensions.f_cmp_ui_test;
+const OP_ = 10;
+var op: MPFloat;
+begin
+  f_init_set_si(op, OP_);
+  assert(f_cmp_ui(op, OP_) = 0);
+  assert(f_cmp_ui(op, OP_ + 1) < 0);
+  assert(f_cmp_ui(op, OP_ - 1) > 0);
+end;
+
+procedure TTestGmpExtensions.f_eq_test;
+const
+  OP_1 = 10;
+  OP_3 = 8;
+var op1, op2: MPFloat;
+begin
+  f_init_set_si(op1, OP_1);
+  f_init_set_si(op2, OP_1);
+  assert(f_eq(op1, op2, OP_3));
+end;
+
+procedure TTestGmpExtensions.f_reldiff_test;
+const
+  OP1_ = 4;
+  OP2_ = 2;
+var rop, op1, op2, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  f_reldiff(rop, op1, op2);
+  assert(f_get_d(rop) = abs(OP1_ - OP2_) / OP1_);
+  r2 := f_reldiff(op1, op2);
+  assert(f_get_d(r2) = abs(OP1_ - OP2_) / OP1_);
+end;
+
+procedure TTestGmpExtensions.f_ceil_test;
+const N = 3.1;
+var rop, op, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op, N);
+  f_ceil(rop, op);
+  assert(f_get_d(rop) = ceil(N));
+  r2 := f_ceil(op);
+  assert(f_get_d(r2) = ceil(N));
+end;
+
+procedure TTestGmpExtensions.f_floor_test;
+const N = 3.9;
+var rop, op, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op, N);
+  f_floor(rop, op);
+  assert(f_get_d(rop) = floor(N));
+  r2 := f_floor(op);
+  assert(f_get_d(r2) = floor(N));
+end;
+
+procedure TTestGmpExtensions.f_trunc_test;
+const N = -3.9;
+var rop, op, r2: MPFloat;
+begin
+  f_init(rop);
+  f_init_set_d(op, N);
+  f_trunc(rop, op);
+  assert(f_get_d(rop) = trunc(N));
+  r2 := f_trunc(op);
+  assert(f_get_d(r2) = trunc(N));
+end;
+
+procedure TTestGmpExtensions.f_integer_p_test;
+const
+  N1 = 10;
+  N2 = 10.1;
+var op: MPFloat;
+begin
+  f_init_set_si(op, N1);
+  assert(f_integer_p(op));
+  f_set_d(op, N2);
+  assert(not f_integer_p(op));
+end;
+
+procedure TTestGmpExtensions.f_fits_ushort_p_test;
+var op: MPFloat;
+begin
+  f_init_set_ui(op, high(word));
+  assert(f_fits_ushort_p(op));
+  f_add_ui(op, op, 1);
+  assert(not f_fits_ushort_p(op));
+end;
+
+procedure TTestGmpExtensions.f_fits_sshort_p_test;
+var op: MPFloat;
+begin
+  f_init_set_ui(op, high(smallint));
+  assert(f_fits_sshort_p(op));
+  f_add_ui(op, op, 1);
+  assert(not f_fits_sshort_p(op));
+  f_clear(op);
+end;
+
+procedure TTestGmpExtensions.f_fits_uint_p_test;
+var op: MPFloat;
+begin
+  f_init_set_ui(op, high(cardinal));
+  assert(f_fits_uint_p(op));
+  f_add_ui(op, op, 1);
+  assert(not f_fits_uint_p(op));
+  f_clear(op);
+end;
+
+procedure TTestGmpExtensions.f_fits_sint_p_test;
+var op: MPFloat;
+begin
+  f_init_set_ui(op, high(integer));
+  assert(f_fits_sint_p(op));
+  f_add_ui(op, op, 1);
+  assert(not f_fits_sint_p(op));
+  f_clear(op);
+end;
+
+procedure TTestGmpExtensions.f_fits_ulong_p_test;
+var op: MPFloat;
+begin
+  f_init_set_ui(op, high(valuint));
+  assert(f_fits_ulong_p(op));
+  f_add_ui(op, op, 1);
+  assert(not f_fits_ulong_p(op));
+  f_clear(op);
+end;
+
+procedure TTestGmpExtensions.f_fits_slong_p_test;
+var op: MPFloat;
+begin
+  f_init_set_ui(op, high(valsint));
+  assert(f_fits_slong_p(op));
+  f_add_ui(op, op, 1);
+  assert(not f_fits_slong_p(op));
+  f_clear(op);
+end;
+
+procedure TTestGmpExtensions.f_urandomb_test;
+const NBITS = 100;
+var
+  rop, r2: MPFloat;
+  state: MPRandState;
+  cmp: longint;
+begin
+  randinit_default(state);
+  f_init(rop);
+  f_urandomb(rop, state, NBITS);
+  cmp := f_cmp_ui(rop, 0);
+  assert(cmp >= 0);
+  assert(f_cmp_ui(rop, 1) < 0);
+  r2 := f_urandomb(state, NBITS);
+  cmp := f_cmp_ui(r2, 0);
+  assert(cmp >= 0);
+  assert(f_cmp_ui(r2, 1) < 0);
+end;
+
+procedure TTestGmpExtensions.f_random2_test;
+var
+  rop, r2: MPFloat;
+begin
+  f_init(rop);
+  f_random2(rop, 1, 1);
+  r2 := f_random2(1, 1);
+  assert(assigned(r2))
+end;
+
+procedure TTestGmpExtensions.f_init_set_test;
+const N = -1000000;
+var rop, op: MPFloat;
+begin
+  f_init_set_si(op, N);
+  f_init_set(rop, op);
+  assert(f_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_init_set_d_test;
+const N = -1.5;
+var rop: MPFloat;
+begin
+  f_init_set_d(rop, N);
+  assert(f_get_d(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_init_set_si_test;
+const N = -5;
+var rop: MPFloat;
+begin
+  f_init_set_si(rop, N);
+  assert(f_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_init_set_str_test;
+const N = -123;
+var rop: MPFloat;
+begin
+  f_init_set_str(rop, inttostr(N), BASE10);
+  assert(f_get_si(rop) = N);
+end;
+
+procedure TTestGmpExtensions.f_init_set_ui_test;
+const N = 5;
+var rop: MPFloat;
+begin
+  f_init_set_ui(rop, N);
+  assert(f_get_ui(rop) = N);
+end;
+
+{ TTestGmpOperators }
+
+// operator * (op1: MPFloat; op2: MPFloat): MPFloat;
+procedure TTestGmpOperators.star__MPFloat__MPFloat__MPFloat_;
+const
+  OP1_ = 2;
+  OP2_ = 3;
+var rop, op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  rop := op1 * op2;
+  assert(f_get_d(rop) = OP1_ * OP2_);
+end;
+
+// operator * (op1: MPInteger; op2: MPInteger): MPInteger;
+procedure TTestGmpOperators.star__MPInteger__MPInteger__MPInteger_;
+const
+  OP_1 = -10;
+  OP_2 = 1000;
+var rop, op1, op2: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  rop := op1 * op2;
+  assert(z_get_si(rop) = OP_1 * OP_2);
+end;
+
+// operator * (op1: MPRational; op2: MPRational): MPRational;
+procedure TTestGmpOperators.star__MPRational__MPRational__MPRational_;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var product, multiplier, multiplicant: MPRational;
+begin
+  q_init(multiplier);
+  q_init(multiplicant);
+  q_set_si(multiplier, N1, D1);
+  q_set_si(multiplicant, N2, D2);
+  product := multiplier * multiplicant;
+  assert(q_cmp_si(product, N1 * N2, D1 * D2) = 0);
+end;
+
+// operator ** (op1: MPFloat; op2: valuint): MPFloat;
+procedure TTestGmpOperators.pow__MPFloat_valuint_MPFloat_;
+const
+  OP1_ = 3;
+  OP2_ = 2;
+var rop, op1: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  rop := op1 ** OP2_;
+  assert(f_get_d(rop) = OP1_ ** OP2_);
+end;
+
+// operator ** (op1: MPInteger; op2: valuint): MPInteger;
+procedure TTestGmpOperators.pow__MPInteger_valuint_MPInteger_;
+const
+  BASE_ = 10;
+  EXP = 3;
+var rop, base: MPInteger;
+begin
+  z_init_set_si(base, BASE_);
+  rop := base ** EXP;
+  assert(z_get_si(rop) = BASE_ ** EXP);
+end;
+
+// operator + (op1: MPFloat; op2: MPFloat): MPFloat;
+procedure TTestGmpOperators.plus__MPFloat__MPFloat__MPFloat_;
+const
+  OP1_ = 1;
+  OP2_ = 2;
+var rop, op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  rop := op1 + op2;
+  assert(f_get_d(rop) = OP1_ + OP2_);
+end;
+
+// operator + (op1: MPInteger; op2: MPInteger): MPInteger;
+procedure TTestGmpOperators.plus__MPInteger__MPInteger__MPInteger_;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, op2: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  rop := op1 + op2;
+  assert(z_get_si(rop) = OP_1 + OP_2);
+end;
+
+// operator + (op1: MPRational; op2: MPRational): MPRational;
+procedure TTestGmpOperators.plus__MPRational__MPRational__MPRational_;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var sum, addend1, addend2: MPRational;
+begin
+  q_init(addend1);
+  q_init(addend2);
+  q_set_si(addend1, N1, D1);
+  q_set_si(addend2, N2, D2);
+  sum := addend1 + addend2;
+  assert(q_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
+end;
+
+// operator - (op: MPFloat): MPFloat;
+procedure TTestGmpOperators.minus__MPFloat__MPFloat_;
+const
+  OP_ = 4;
+var rop, op: MPFloat;
+begin
+  f_init_set_d(op, OP_);
+  rop := -op;
+  assert(f_get_d(rop) = -OP_);
+end;
+
+// operator - (op: MPInteger): MPInteger;
+procedure TTestGmpOperators.minus__MPInteger__MPInteger_;
+const OP_ = 1000;
+var rop, op: MPInteger;
+begin
+  z_init_set_si(op, OP_);
+  rop := -op;
+  assert(z_get_si(rop) = -OP_);
+end;
+
+// operator - (op: MPRational): MPRational;
+procedure TTestGmpOperators.minus__MPRational__MPRational_;
+const
+  N1 = -5;
+  D1 = 3;
+var negated_operand, operand: MPRational;
+begin
+  q_init(negated_operand);
+  q_init(operand);
+  q_set_si(operand, N1, D1);
+  negated_operand := - operand;
+  assert(q_cmp_si(negated_operand, -N1, D1) = 0);
+end;
+
+// operator - (op1: MPFloat; op2: MPFloat): MPFloat;
+procedure TTestGmpOperators.minus__MPFloat__MPFloat__MPFloat_;
+const
+  OP1_ = 3;
+  OP2_ = 1;
+var rop, op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  rop := op1 - op2;
+  assert(f_get_d(rop) = OP1_ - OP2_);
+end;
+
+// operator - (op1: MPInteger; op2: MPInteger): MPInteger;
+procedure TTestGmpOperators.minus__MPInteger__MPInteger__MPInteger_;
+const
+  OP_1 = -1000;
+  OP_2 = 1000000;
+var rop, op1, op2: MPInteger;
+begin
+  z_init_set_si(op1, OP_1);
+  z_init_set_si(op2, OP_2);
+  rop := op1 - op2;
+  assert(z_get_si(rop) = OP_1 - OP_2);
+end;
+
+// operator - (op1: MPRational; op2: MPRational): MPRational;
+procedure TTestGmpOperators.minus__MPRational__MPRational__MPRational_;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var difference, minuend, subtrahend: MPRational;
+begin
+  q_init(minuend);
+  q_init(subtrahend);
+  q_set_si(minuend, N1, D1);
+  q_set_si(subtrahend, N2, D2);
+  difference := minuend - subtrahend;
+  assert(q_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
+end;
+
+// operator / (op1: MPFloat; op2: MPFloat): MPFloat;
+procedure TTestGmpOperators.slash__MPFloat__MPFloat__MPFloat_;
+const
+  OP1_ = 6;
+  OP2_ = 2;
+var rop, op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  rop := op1 / op2;
+  assert(f_get_d(rop) = OP1_ / OP2_);
+end;
+
+// operator / (op1: MPInteger; op2: MPInteger): MPInteger;
+procedure TTestGmpOperators.slash__MPInteger__MPInteger__MPInteger_;
+const
+  N_ = -17;
+  D_ = 4;
+var q, n, d: MPInteger;
+begin
+  z_init_set_si(n, N_);
+  z_init_set_si(d, D_);
+  q := n / d;
+  assert(z_get_si(q) = trunc(N_ / D_));
+end;
+
+// operator / (op1: MPRational; op2: MPRational): MPRational;
+procedure TTestGmpOperators.slash__MPRational__MPRational__MPRational_;
+const
+  N1 = 5;
+  D1 = 2;
+  N2 = -7;
+  D2 = 3;
+var quotient, dividend, divisor: MPRational;
+begin
+  q_init(dividend);
+  q_init(divisor);
+  q_set_si(dividend, N1, D1);
+  q_set_si(divisor, N2, D2);
+  quotient := dividend / divisor;
+  assert(q_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
+end;
+
+// operator := (op: double): MPFloat;
+procedure TTestGmpOperators.assign_double_MPFloat_;
+const N = -1.5;
+var rop: MPFloat;
+begin
+  rop := N;
+  assert(f_get_d(rop) = N);
+end;
+
+// operator := (op: double): MPInteger;
+procedure TTestGmpOperators.assign_double_MPInteger_;
+const OP_ = 1000000;
+var rop: MPInteger;
+begin
+  rop := OP_;
+  assert(z_get_si(rop) = OP_);
+end;
+
+// operator := (op: double): MPRational;
+procedure TTestGmpOperators.assign_double_MPRational_;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var rop: MPRational;
+begin
+  rop := OP_1 / OP_2;
+  assert(q_cmp_si(rop, OP_1, OP_2) = 0);
+end;
+
+// operator := (op: MPFloat): cardinal;
+procedure TTestGmpOperators.assign__MPFloat_Cardinal;
+const OP = 1000000;
+var rop: MPFloat;
+begin
+  rop := OP;
+  assert(f_get_ui(rop) = OP);
+end;
+
+// operator := (op: MPFloat): double;
+procedure TTestGmpOperators.assign__MPFloat_double;
+const N = -1.5;
+var rop: MPFloat;
+begin
+  rop := N;
+  assert(f_get_d(rop) = N);
+end;
+
+// operator := (op: MPFloat): integer;
+procedure TTestGmpOperators.assign__MPFloat_integer;
+const OP = -1000000;
+var rop: MPFloat;
+begin
+  rop := OP;
+  assert(f_get_si(rop) = OP);
+end;
+
+// operator := (op: MPFloat): mpf_t;
+procedure TTestGmpOperators.assign__MPFloat_mpf_t;
+const N = -1000000;
+var
+  rop: mpf_t;
+  op: MPFloat;
+begin
+  f_init_set_si(op, N);
+  rop := op;
+  assert(mpf_get_si(rop) = N);
+  mpf_clear(rop);
+end;
+
+// operator := (op: MPFloat): MPInteger;
+procedure TTestGmpOperators.assign__MPFloat__MPInteger_;
+const OP_ = -10;
+var
+  op: MPFloat;
+  rop: MPInteger;
+begin
+  f_init_set_si(op, OP_);
+  rop := op;
+  assert(z_get_si(rop) = OP_);
+end;
+
+// operator := (op: MPFloat): MPRational;
+procedure TTestGmpOperators.assign__MPFloat__MPRational_;
+const OP_ = -10;
+var
+  op: MPFloat;
+  rop: MPRational;
+begin
+  f_init_set_si(op, OP_);
+  rop :=  op;
+  assert(q_get_d(rop) = OP_);
+end;
+
+// operator := (op: MPFloat): string;
+procedure TTestGmpOperators.assign__MPFloat_string;
+const
+  N = 123456;
+  S = '123456';
+var
+  op: MPFloat;
+  r: string;
+begin
+  f_init_set_d(op, N);
+  r := op;
+  assert(r = S);
+end;
+
+// operator := (op: MPFloat): valsint;
+procedure TTestGmpOperators.assign__MPFloat_valsint;
+const OP_ = -1000000;
+var
+  op: MPFloat;
+  r: valsint;
+begin
+  f_init_set_si(op, OP_);
+  r := op;
+  assert(r = OP_);
+end;
+
+// operator := (op: MPFloat): valuint;
+procedure TTestGmpOperators.assign__MPFloat_valuint;
+const OP_ = 1000000;
+var
+  op: MPFloat;
+  r: valuint;
+begin
+  f_init_set_si(op, OP_);
+  r := op;
+  assert(r = OP_);
+end;
+
+// operator := (var op: mpf_t): MPFloat;
+procedure TTestGmpOperators.assign_mpf_t_MPFloat_;
+const N = -1000000;
+var
+  op: mpf_t;
+  rop: MPFloat;
+begin
+  mpf_init_set_si(op, N);
+  rop := op;
+  assert(f_get_si(rop) = N);
+  mpf_clear(op);
+end;
+
+// operator := (op: MPInteger): cardinal;
+procedure TTestGmpOperators.assign__MPInteger_cardinal;
+const N = 1000000;
+var
+  op: MPInteger;
+  r: cardinal;
+begin
+  z_init_set_ui(op, N);
+  r := op;
+  assert(r = N);
+end;
+
+// operator := (op: MPInteger): double;
+procedure TTestGmpOperators.assign__MPInteger_double;
+const N = -1000;
+var
+  op: MPInteger;
+  r: double;
+begin
+  z_init_set_si(op, N);
+  r := op;
+  assert(r = N);
+end;
+
+// operator := (op: MPInteger): integer;
+procedure TTestGmpOperators.assign__MPInteger_integer;
+const N = -1000000;
+var
+  op: MPInteger;
+  r: integer;
+begin
+  z_init_set_si(op, N);
+  r := op;
+  assert(r = N);
+end;
+
+// operator := (op: MPInteger): MPFloat;
+procedure TTestGmpOperators.assign__MPInteger__MPFloat_;
+const
+  OP_1 = -13;
+var
+  rop: MPFloat;
+  op: MPInteger;
+begin
+  z_init_set_si(op, OP_1);
+  rop := op;
+  assert(f_get_si(rop) = OP_1);
+end;
+
+// operator := (op: MPInteger): MPRational;
+procedure TTestGmpOperators.assign__MPInteger__MPRational_;
+const
+  OP_1 = -13;
+var
+  rational: MPRational;
+  op: MPInteger;
+begin
+  z_init_set_si(op, OP_1);
+  rational := op;
+  assert(q_cmp_si(rational, OP_1, 1) = 0);
+end;
+
+// operator := (op: MPInteger): mpz_t;
+procedure TTestGmpOperators.assign__MPInteger_mpz_t;
+const N = -1000000;
+var
+  rop: mpz_t;
+  op: MPInteger;
+begin
+  z_init_set_si(op, N);
+  rop := op;
+  assert(mpz_get_si(rop) = N);
+  mpz_clear(rop);
+end;
+
+// operator := (op: MPInteger): string;
+procedure TTestGmpOperators.assign__MPInteger_string;
+const
+  N = 123456;
+  S = '123456';
+var
+  op: MPInteger;
+  r: string;
+begin
+  z_init_set_ui(op, N);
+  r := op;
+  assert(r = S);
+end;
+
+// operator := (op: MPInteger): valsint;
+procedure TTestGmpOperators.assign__MPInteger_valsint;
+const N = -1000000;
+var
+  op: MPInteger;
+  r: valsint;
+begin
+  z_init_set_si(op, N);
+  r := op;
+  assert(r = N);
+end;
+
+// operator := (op: MPInteger): valuint;
+procedure TTestGmpOperators.assign__MPInteger_valuint;
+const N = 1000000;
+var
+  op: MPInteger;
+  r: valuint;
+begin
+  z_init_set_ui(op, N);
+  r := op;
+  assert(r = N);
+end;
+
+// operator := (var op: mpq_t): MPRational;
+procedure TTestGmpOperators.assign_mpq_t_MPRational_;
+const
+  N = -17;
+  D = 3;
+var
+  op: mpq_t;
+  rop: MPRational;
+begin
+  mpq_init(op);
+  mpq_set_si(op, N, D);
+  rop := op;
+  assert(q_cmp_si(rop, N, D) = 0);
+  mpq_clear(op);
+end;
+
+// operator := (op: MPRandState): randstate_t;
+procedure TTestGmpOperators.assign__MPRandState_randstate_t;
+var
+  op: MPRandState;
+  rop: randstate_t;
+begin
+  randinit_default(op);
+  rop := op;
+  assert(rnd_test(rop));
+  mp_randclear(rop);
+end;
+
+// operator := (op: MPRational): double;
+procedure TTestGmpOperators.assign__MPRational_double;
+const
+  OP_1 = -1;
+  OP_2 = 2;
+var
+  op: MPRational;
+  r: double;
+begin
+  q_init(op);
+  q_set_si(op, OP_1, OP_2);
+  r := op;
+  assert(r = OP_1 / OP_2);
+end;
+
+// operator := (op: MPRational): MPFloat;
+procedure TTestGmpOperators.assign__MPRational__MPFloat_;
+const OP_ = -10;
+var
+  op: MPRational;
+  rop: MPFloat;
+begin
+  q_init(op);
+  q_set_si(op, OP_, 1);
+  rop :=  op;
+  assert(f_get_si(rop) = OP_);
+end;
+
+// operator := (op: MPRational): MPInteger;
+procedure TTestGmpOperators.assign__MPRational__MPInteger_;
+const OP_ = -10;
+var
+  op: MPRational;
+  rop: MPInteger;
+begin
+  q_init(op);
+  q_set_si(op, OP_, 1);
+  rop := op;
+  assert(z_get_si(rop) = OP_);
+end;
+
+// operator := (op: MPRational): mpq_t;
+procedure TTestGmpOperators.assign__MPRational_mpq_t;
+const
+  OP_1 = -13;
+  OP_2 = 17;
+var
+  rational: mpq_t;
+  op: MPRational;
+begin
+  q_init(op);
+  q_set_si(op, OP_1, OP_2);
+  rational := op;
+  assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
+  mpq_clear(rational);
+end;
+
+// operator := (op: MPRational): string;
+procedure TTestGmpOperators.assign__MPRational_string;
+const
+  N = 5;
+  D = 3;
+  S = '5/3';
+var
+  op: MPRational;
+  r: string;
+begin
+  q_init(op);
+  q_set_si(op, N, D);
+  r := op;
+  assert(r = S);
+end;
+
+// operator := (var op: mpz_t): MPInteger;
+procedure TTestGmpOperators.assign_mpz_t_MPInteger_;
+const N = -1000000;
+var
+  op: mpz_t;
+  rop: MPInteger;
+begin
+  mpz_init_set_si(op, N);
+  rop := op;
+  assert(z_get_si(rop) = N);
+  mpz_clear(op);
+end;
+
+// operator := (var op: randstate_t): MPRandState;
+procedure TTestGmpOperators.assign_randstate_t_MPRandState_;
+var
+  op: randstate_t;
+  rop: MPRandState;
+begin
+  mp_randinit_default(op);
+  rop := op;
+  assert(rnd_test(rop.ptr^));
+  mp_randclear(op);
+end;
+
+// operator := (op: string): MPFloat;
+procedure TTestGmpOperators.assign_string_MPFloat_;
+const N = -123;
+var rop: MPFloat;
+begin
+  rop := inttostr(N);
+  assert(f_get_si(rop) = N);
+end;
+
+// operator := (op: string): MPInteger;
+procedure TTestGmpOperators.assign_string_MPInteger_;
+const N = -123;
+var rop: MPInteger;
+begin
+  rop := inttostr(N);
+  assert(z_get_si(rop) = N);
+end;
+
+// operator := (op: string): MPRational;
+procedure TTestGmpOperators.assign_string_MPRational_;
+const
+  N = 5;
+  D = 3;
+  S = '5/3';
+var rop: MPRational;
+begin
+  rop := S;
+  assert(q_cmp_si(rop, N, D) = 0);
+end;
+
+// operator := (op: valsint): MPFloat;
+procedure TTestGmpOperators.assign_valsint_MPFloat_;
+const OP = -1000000;
+var rop: MPFloat;
+begin
+  rop := OP;
+  assert(f_get_si(rop) = OP);
+end;
+
+// operator := (op: valsint): MPInteger;
+procedure TTestGmpOperators.assign_valsint_MPInteger_;
+const OP = -1000000;
+var rop: MPInteger;
+begin
+  rop := OP;
+  assert(z_get_si(rop) = OP);
+end;
+
+// operator := (op: valsint): MPRational;
+procedure TTestGmpOperators.assign_valsint_MPRational_;
+const OP = -1000000;
+var rop: MPRational;
+begin
+  rop := OP;
+  assert(q_cmp_si(rop, OP, 1) = 0);
+end;
+
+// operator := (op: valuint): MPFloat;
+procedure TTestGmpOperators.assign_valuint_MPFloat_;
+const OP = 1000000;
+var rop: MPFloat;
+begin
+  rop := OP;
+  assert(f_get_ui(rop) = OP);
+end;
+
+// operator := (op: valuint): MPInteger;
+procedure TTestGmpOperators.assign_valuint_MPInteger_;
+const OP = 1000000;
+var rop: MPInteger;
+begin
+  rop := OP;
+  assert(z_get_ui(rop) = OP);
+end;
+
+// operator := (op: valuint): MPRational;
+procedure TTestGmpOperators.assign_valuint_MPRational_;
+const OP = 1000000;
+var rop: MPRational;
+begin
+  rop := OP;
+  assert(q_cmp_ui(rop, OP, 1) = 0);
+end;
+
+// operator < (op1: MPFloat; op2: MPFloat): boolean;
+procedure TTestGmpOperators.lt__MPFloat__MPFloat_boolean;
+const
+  OP1_ = 1.2;
+  OP2_ = OP1_ + 1;
+var op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  assert(op1 < op2);
+end;
+
+// operator < (op1: MPInteger; op2: MPInteger): boolean;
+procedure TTestGmpOperators.lt__MPInteger__MPInteger_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ + 1;
+var op1, op2: MPInteger;
+begin
+  z_init_set_d(op1, OP1_);
+  z_init_set_d(op2, OP2_);
+  assert(op1 < op2);
+end;
+
+// operator < (op1: MPRational; op2: MPRational): boolean;
+procedure TTestGmpOperators.lt__MPRational__MPRational_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ + 1;
+var op1, op2: MPRational;
+begin
+  q_init(op1);
+  q_init(op2);
+  q_set_si(op1, OP1_, 1);
+  q_set_si(op2, OP2_, 1);
+  assert(op1 < op2);
+end;
+
+// operator <= (op1: MPFloat; op2: MPFloat): boolean;
+procedure TTestGmpOperators.le__MPFloat__MPFloat_boolean;
+const
+  OP1_ = 1.2;
+  OP2_ = OP1_ + 1;
+var op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  assert(op1 <= op2);
+  f_set_d(op2, OP1_);
+  assert(op1 <= op2);
+end;
+
+// operator <= (op1: MPInteger; op2: MPInteger): boolean;
+procedure TTestGmpOperators.le__MPInteger__MPInteger_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ + 1;
+var op1, op2: MPInteger;
+begin
+  z_init_set_ui(op1, OP1_);
+  z_init_set_ui(op2, OP2_);
+  assert(op1 <= op2);
+  z_set_ui(op2, OP1_);
+  assert(op1 <= op2);
+end;
+
+// operator <= (op1: MPRational; op2: MPRational): boolean;
+procedure TTestGmpOperators.le__MPRational__MPRational_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ + 1;
+var op1, op2: MPRational;
+begin
+  q_init(op1);
+  q_init(op2);
+  q_set_si(op1, OP1_, 1);
+  q_set_si(op2, OP2_, 1);
+  assert(op1 <= op2);
+  q_set_si(op2, OP1_, 1);
+  assert(op1 <= op2);
+end;
+
+// operator > (op1: MPFloat; op2: MPFloat): boolean;
+procedure TTestGmpOperators.gt__MPFloat__MPFloat_boolean;
+const
+  OP1_ = 1.2;
+  OP2_ = OP1_ - 1;
+var op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  assert(op1 > op2);
+end;
+
+// operator > (op1: MPInteger; op2: MPInteger): boolean;
+procedure TTestGmpOperators.gt__MPInteger__MPInteger_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ - 1;
+var op1, op2: MPInteger;
+begin
+  z_init_set_d(op1, OP1_);
+  z_init_set_d(op2, OP2_);
+  assert(op1 > op2);
+end;
+
+// operator > (op1: MPRational; op2: MPRational): boolean;
+procedure TTestGmpOperators.gt__MPRational__MPRational_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ - 1;
+var op1, op2: MPRational;
+begin
+  q_init(op1);
+  q_init(op2);
+  q_set_si(op1, OP1_, 1);
+  q_set_si(op2, OP2_, 1);
+  assert(op1 > op2);
+end;
+
+// operator >= (op1: MPFloat; op2: MPFloat): boolean;
+procedure TTestGmpOperators.ge__MPFloat__MPFloat_boolean;
+const
+  OP1_ = 1.2;
+  OP2_ = OP1_ - 1;
+var op1, op2: MPFloat;
+begin
+  f_init_set_d(op1, OP1_);
+  f_init_set_d(op2, OP2_);
+  assert(op1 >= op2);
+  f_set_d(op2, OP1_);
+  assert(op1 >= op2);
+end;
+
+// operator >= (op1: MPInteger; op2: MPInteger): boolean;
+procedure TTestGmpOperators.ge__MPInteger__MPInteger_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ - 1;
+var op1, op2: MPInteger;
+begin
+  z_init_set_ui(op1, OP1_);
+  z_init_set_ui(op2, OP2_);
+  assert(op1 >= op2);
+  z_set_ui(op2, OP1_);
+  assert(op1 >= op2);
+end;
+
+// operator >= (op1: MPRational; op2: MPRational): boolean;
+procedure TTestGmpOperators.ge__MPRational__MPRational_boolean;
+const
+  OP1_ = 12;
+  OP2_ = OP1_ - 1;
+var op1, op2: MPRational;
+begin
+  q_init(op1);
+  q_init(op2);
+  q_set_si(op1, OP1_, 1);
+  q_set_si(op2, OP2_, 1);
+  assert(op1 >= op2);
+  q_set_si(op2, OP1_, 1);
+  assert(op1 >= op2);
+end;
+

+ 674 - 0
packages/gmp/examples/gmp_test_intf.inc

@@ -0,0 +1,674 @@
+{ Note: This doesn't test GMP per se.
+
+  Not covered:
+    mp_printf
+    mp_scanf
+    mpz_array_init
+    errno
+}
+
+{$assertions on - keep this}
+
+type
+
+  { TTestGmpBinding }
+
+  TTestGmpBinding = class(TTestCase)
+  published
+    procedure mp_get_memory_functions_test;
+    procedure mp_set_memory_functions_test;
+
+    procedure mp_randinit_default_test;
+    procedure mp_randinit_mt_test;
+    procedure mp_randinit_lc_2exp_test;
+    procedure mp_randinit_lc_2exp_size_test;
+    procedure mp_randinit_set_test;
+    procedure mp_randclear_test;
+    procedure mp_randseed_test;
+    procedure mp_randseed_ui_test;
+    procedure mp_urandomb_ui_test;
+    procedure mp_urandomm_ui_test;
+
+    procedure mp_asprintf_test;
+    procedure mp_asprintf_test2;
+    procedure mp_snprintf_test;
+    procedure mp_snprintf_test2;
+    procedure mp_sprintf_test;
+    procedure mp_sprintf_test2;
+    procedure mp_sscanf_test;
+    procedure mp_sscanf_test2;
+
+    procedure mpz_init_test;
+    procedure mpz_clear_test;
+    procedure mpz_init2_test;
+    procedure mpz_init_set_si_test;
+    procedure mpz_init_set_ui_test;
+    procedure mpz_init_set_d_test;
+    procedure mpz_init_set_test;
+    procedure mpz_init_set_str_test;
+    procedure mpz_realloc_test;
+    procedure mpz_realloc2_test;
+    procedure mpz_getlimbn_test;
+    procedure mpz_export_test;
+    procedure mpz_import_test;
+    procedure mpz_swap_test;
+    procedure mpz_set_test;
+    procedure mpz_set_d_test;
+    procedure mpz_set_f_test;
+    procedure mpz_set_q_test;
+    procedure mpz_set_si_test;
+    procedure mpz_set_str_test;
+    procedure mpz_set_ui_test;
+    procedure mpz_get_d_test;
+    procedure mpz_get_d_2exp_test;
+    procedure mpz_get_si_test;
+    procedure mpz_get_str_test;
+    procedure mpz_get_ui_test;
+    procedure mpz_add_test;
+    procedure mpz_add_ui_test;
+    procedure mpz_sub_test;
+    procedure mpz_sub_ui_test;
+    procedure mpz_ui_sub_test;
+    procedure mpz_mul_test;
+    procedure mpz_mul_si_test;
+    procedure mpz_mul_ui_test;
+    procedure mpz_addmul_test;
+    procedure mpz_addmul_ui_test;
+    procedure mpz_submul_test;
+    procedure mpz_submul_ui_test;
+    procedure mpz_mul_2exp_test;
+    procedure mpz_neg_test;
+    procedure mpz_abs_test;
+
+    procedure mpz_cdiv_q_test;
+    procedure mpz_fdiv_q_test;
+    procedure mpz_tdiv_q_test;
+    procedure mpz_cdiv_q_2exp_test;
+    procedure mpz_fdiv_q_2exp_test;
+    procedure mpz_tdiv_q_2exp_test;
+    procedure mpz_cdiv_q_ui_test;
+    procedure mpz_fdiv_q_ui_test;
+    procedure mpz_tdiv_q_ui_test;
+    procedure mpz_cdiv_qr_test;
+    procedure mpz_fdiv_qr_test;
+    procedure mpz_tdiv_qr_test;
+    procedure mpz_cdiv_qr_ui_test;
+    procedure mpz_fdiv_qr_ui_test;
+    procedure mpz_tdiv_qr_ui_test;
+    procedure mpz_cdiv_r_test;
+    procedure mpz_fdiv_r_test;
+    procedure mpz_tdiv_r_test;
+    procedure mpz_cdiv_r_2exp_test;
+    procedure mpz_fdiv_r_2exp_test;
+    procedure mpz_tdiv_r_2exp_test;
+    procedure mpz_cdiv_r_ui_test;
+    procedure mpz_fdiv_r_ui_test;
+    procedure mpz_tdiv_r_ui_test;
+    procedure mpz_cdiv_ui_test;
+    procedure mpz_fdiv_ui_test;
+    procedure mpz_tdiv_ui_test;
+
+    procedure mpz_mod_test;
+    procedure mpz_divexact_test;
+    procedure mpz_divexact_ui_test;
+    procedure mpz_divisible_p_test;
+    procedure mpz_divisible_ui_p_test;
+    procedure mpz_divisible_2exp_p_test;
+    procedure mpz_congruent_p_test;
+    procedure mpz_congruent_2exp_p_test;
+    procedure mpz_congruent_ui_p_test;
+    procedure mpz_powm_test;
+    procedure mpz_powm_ui_test;
+    procedure mpz_pow_ui_test;
+    procedure mpz_ui_pow_ui_test;
+    procedure mpz_root_test;
+    procedure mpz_rootrem_test;
+    procedure mpz_sqrt_test;
+    procedure mpz_sqrtrem_test;
+    procedure mpz_perfect_power_p_test;
+    procedure mpz_perfect_square_p_test;
+
+    procedure mpz_probab_prime_p_test;
+    procedure mpz_nextprime_test;
+    procedure mpz_gcd_test;
+    procedure mpz_gcd_ui_test;
+    procedure mpz_gcdext_test;
+    procedure mpz_lcm_test;
+    procedure mpz_lcm_ui_test;
+    procedure mpz_invert_test;
+    procedure mpz_jacobi_test;
+    procedure mpz_kronecker_si_test;
+    procedure mpz_kronecker_ui_test;
+    procedure mpz_si_kronecker_test;
+    procedure mpz_ui_kronecker_test;
+    procedure mpz_remove_test;
+    procedure mpz_fac_ui_test;
+    procedure mpz_bin_ui_test;
+    procedure mpz_bin_uiui_test;
+    procedure mpz_fib_ui_test;
+    procedure mpz_fib2_ui_test;
+    procedure mpz_lucnum_ui_test;
+    procedure mpz_lucnum2_ui_test;
+
+    procedure mpz_cmp_test;
+    procedure mpz_cmp_d_test;
+    procedure mpz_cmp_si_test;
+    procedure mpz_cmp_ui_test;
+    procedure mpz_cmpabs_test;
+    procedure mpz_cmpabs_d_test;
+    procedure mpz_cmpabs_ui_test;
+
+    procedure mpz_and_test;
+    procedure mpz_ior_test;
+    procedure mpz_xor_test;
+    procedure mpz_com_test;
+    procedure mpz_popcount_test;
+    procedure mpz_hamdist_test;
+    procedure mpz_scan0_test;
+    procedure mpz_scan1_test;
+    procedure mpz_setbit_test;
+    procedure mpz_clrbit_test;
+    procedure mpz_combit_test;
+    procedure mpz_tstbit_test;
+
+    procedure mpz_urandomb_test;
+    procedure mpz_urandomm_test;
+    procedure mpz_rrandomb_test;
+
+    procedure mpz_fits_ushort_p_test;
+    procedure mpz_fits_sshort_p_test;
+    procedure mpz_fits_uint_p_test;
+    procedure mpz_fits_sint_p_test;
+    procedure mpz_fits_ulong_p_test;
+    procedure mpz_fits_slong_p_test;
+    procedure mpz_sizeinbase_test;
+    procedure mpz_size_test;
+
+    procedure mpq_init_test;
+    procedure mpq_clear_test;
+    procedure mpq_set_ui_test;
+    procedure mpq_set_si_test;
+    procedure mpq_canonicalize_test;
+    procedure mpq_set_test;
+    procedure mpq_setmpz_test;
+    procedure mpq_set_str_test;
+    procedure mpq_swap_test;
+
+    procedure mpq_get_d_test;
+    procedure mpq_set_d_test;
+    procedure mpq_set_f_test;
+    procedure mpq_get_str_test;
+
+    procedure mpq_add_test;
+    procedure mpq_sub_test;
+    procedure mpq_mul_test;
+    procedure mpq_mul_2exp_test;
+    procedure mpq_div_test;
+    procedure mpq_div_2exp_test;
+    procedure mpq_neg_test;
+    procedure mpq_abs_test;
+    procedure mpq_inv_test;
+
+    procedure mpq_cmp_test;
+    procedure mpq_cmp_si_test;
+    procedure mpq_cmp_ui_test;
+    procedure mpq_equal_test;
+
+    procedure mpq_get_num_test;
+    procedure mpq_get_den_test;
+    procedure mpq_set_num_test;
+    procedure mpq_set_den_test;
+
+    procedure mpf_get_default_prec_test;
+    procedure mpf_set_default_prec_test;
+
+    procedure mpf_init_test;
+    procedure mpf_init2_test;
+    procedure mpf_clear_test;
+    procedure mpf_get_prec_test;
+    procedure mpf_set_prec_test;
+    procedure mpf_set_prec_raw_test;
+
+    procedure mpf_set_q_test;
+    procedure mpf_set_ui_test;
+    procedure mpf_get_ui_test;
+    procedure mpf_set_si_test;
+    procedure mpf_get_si_test;
+    procedure mpf_set_test;
+    procedure mpf_set_str_test;
+    procedure mpf_swap_test;
+
+    procedure mpf_get_d_test;
+    procedure mpf_set_d_test;
+    procedure mpf_setmpz_test;
+    procedure mpf_get_d_2exp_test;
+    procedure mpf_get_str_test;
+
+    procedure mpf_add_test;
+    procedure mpf_add_ui_test;
+    procedure mpf_sub_test;
+    procedure mpf_sub_ui_test;
+    procedure mpf_ui_sub_test;
+    procedure mpf_mul_test;
+    procedure mpf_mul_ui_test;
+    procedure mpf_mul_2exp_test;
+    procedure mpf_div_test;
+    procedure mpf_div_ui_test;
+    procedure mpf_ui_div_test;
+    procedure mpf_div_2exp_test;
+    procedure mpf_sqrt_test;
+    procedure mpf_sqrt_ui_test;
+    procedure mpf_pow_ui_test;
+    procedure mpf_neg_test;
+    procedure mpf_abs_test;
+
+    procedure mpf_cmp_test;
+    procedure mpf_cmp_d_test;
+    procedure mpf_cmp_si_test;
+    procedure mpf_cmp_ui_test;
+    procedure mpf_eq_test;
+    procedure mpf_reldiff_test;
+
+    procedure mpf_ceil_test;
+    procedure mpf_floor_test;
+    procedure mpf_trunc_test;
+    procedure mpf_integer_p_test;
+
+    procedure mpf_fits_ushort_p_test;
+    procedure mpf_fits_sshort_p_test;
+    procedure mpf_fits_uint_p_test;
+    procedure mpf_fits_sint_p_test;
+    procedure mpf_fits_ulong_p_test;
+    procedure mpf_fits_slong_p_test;
+
+    procedure mpf_urandomb_test;
+    procedure mpf_random2_test;
+
+    procedure mpf_init_set_test;
+    procedure mpf_init_set_d_test;
+    procedure mpf_init_set_si_test;
+    procedure mpf_init_set_str_test;
+    procedure mpf_init_set_ui_test;
+
+    procedure mpn_add_n_test;
+    procedure mpn_add_1_test;
+    procedure mpn_add_test;
+    procedure mpn_sub_n_test;
+    procedure mpn_sub_1_test;
+    procedure mpn_sub_test;
+    procedure mpn_mul_n_test;
+    procedure mpn_mul_1_test;
+    procedure mpn_mul_test;
+    procedure mpn_addmul_1_test;
+    procedure mpn_submul_1_test;
+    procedure mpn_tdiv_qr_test;
+    procedure mpn_divrem_1_test;
+    procedure mpn_divexact_by3c_test;
+    procedure mpn_mod_1_test;
+    procedure mpn_lshift_test;
+    procedure mpn_rshift_test;
+    procedure mpn_cmp_test;
+    procedure mpn_gcd_test;
+    procedure mpn_gcd_1_test;
+    procedure mpn_gcdext_test;
+    procedure mpn_sqrtrem_test;
+    procedure mpn_get_str_test;
+    procedure mpn_set_str_test;
+    procedure mpn_scan0_test;
+    procedure mpn_scan1_test;
+    procedure mpn_popcount_test;
+    procedure mpn_hamdist_test;
+    procedure mpn_perfect_square_p_test;
+
+    procedure mpn_random_test;
+    procedure mpn_random2_test;
+
+    procedure bits_per_limb_test;
+    procedure version_test;
+
+  end;
+
+  { TTestGmpExtensions }
+
+  TTestGmpExtensions = class(TTestCase)
+  published
+
+    procedure randinit_default_test;
+    procedure randinit_mt_test;
+    procedure randinit_lc_2exp_test;
+    procedure randinit_lc_2exp_size_test;
+    procedure randinit_set_test;
+    procedure randclear_test;
+    procedure randseed_test;
+    procedure randseed_ui_test;
+    procedure urandomb_ui_test;
+    procedure urandomm_ui_test;
+
+    procedure z_init_test;
+    procedure z_clear_test;
+    procedure z_init2_test;
+    procedure z_init_set_si_test;
+    procedure z_init_set_ui_test;
+    procedure z_init_set_d_test;
+    procedure z_init_set_test;
+    procedure z_init_set_str_test;
+    procedure z_realloc_test;
+    procedure z_realloc2_test;
+    procedure z_getlimbn_test;
+    procedure z_export_test;
+    procedure z_import_test;
+    procedure z_swap_test;
+    procedure z_set_test;
+    procedure z_set_d_test;
+    procedure z_set_f_test;
+    procedure z_set_q_test;
+    procedure z_set_si_test;
+    procedure z_set_str_test;
+    procedure z_set_ui_test;
+    procedure z_get_d_test;
+    procedure z_get_d_2exp_test;
+    procedure z_get_si_test;
+    procedure z_get_str_test;
+    procedure z_get_ui_test;
+    procedure z_add_test;
+    procedure z_add_ui_test;
+    procedure z_sub_test;
+    procedure z_sub_ui_test;
+    procedure z_ui_sub_test;
+    procedure z_mul_test;
+    procedure z_mul_si_test;
+    procedure z_mul_ui_test;
+    procedure z_addmul_test;
+    procedure z_addmul_ui_test;
+    procedure z_submul_test;
+    procedure z_submul_ui_test;
+    procedure z_mul_2exp_test;
+    procedure z_neg_test;
+    procedure z_abs_test;
+
+    procedure z_cdiv_q_test;
+    procedure z_fdiv_q_test;
+    procedure z_tdiv_q_test;
+    procedure z_cdiv_q_2exp_test;
+    procedure z_fdiv_q_2exp_test;
+    procedure z_tdiv_q_2exp_test;
+    procedure z_cdiv_q_ui_test;
+    procedure z_fdiv_q_ui_test;
+    procedure z_tdiv_q_ui_test;
+    procedure z_cdiv_qr_test;
+    procedure z_fdiv_qr_test;
+    procedure z_tdiv_qr_test;
+    procedure z_cdiv_qr_ui_test;
+    procedure z_fdiv_qr_ui_test;
+    procedure z_tdiv_qr_ui_test;
+    procedure z_cdiv_r_test;
+    procedure z_fdiv_r_test;
+    procedure z_tdiv_r_test;
+    procedure z_cdiv_r_2exp_test;
+    procedure z_fdiv_r_2exp_test;
+    procedure z_tdiv_r_2exp_test;
+    procedure z_cdiv_r_ui_test;
+    procedure z_fdiv_r_ui_test;
+    procedure z_tdiv_r_ui_test;
+    procedure z_cdiv_ui_test;
+    procedure z_fdiv_ui_test;
+    procedure z_tdiv_ui_test;
+
+    procedure z_mod_test;
+    procedure z_divexact_test;
+    procedure z_divexact_ui_test;
+    procedure z_divisible_p_test;
+    procedure z_divisible_ui_p_test;
+    procedure z_divisible_2exp_p_test;
+    procedure z_congruent_p_test;
+    procedure z_congruent_2exp_p_test;
+    procedure z_congruent_ui_p_test;
+    procedure z_powm_test;
+    procedure z_powm_ui_test;
+    procedure z_pow_ui_test;
+    procedure z_ui_pow_ui_test;
+    procedure z_root_test;
+    procedure z_rootrem_test;
+    procedure z_sqrt_test;
+    procedure z_sqrtrem_test;
+    procedure z_perfect_power_p_test;
+    procedure z_perfect_square_p_test;
+
+    procedure z_probab_prime_p_test;
+    procedure z_nextprime_test;
+    procedure z_gcd_test;
+    procedure z_gcd_ui_test;
+    procedure z_gcdext_test;
+    procedure z_lcm_test;
+    procedure z_lcm_ui_test;
+    procedure z_invert_test;
+    procedure z_jacobi_test;
+    procedure z_kronecker_si_test;
+    procedure z_kronecker_ui_test;
+    procedure z_si_kronecker_test;
+    procedure z_ui_kronecker_test;
+    procedure z_remove_test;
+    procedure z_fac_ui_test;
+    procedure z_bin_ui_test;
+    procedure z_bin_uiui_test;
+    procedure z_fib_ui_test;
+    procedure z_fib2_ui_test;
+    procedure z_lucnum_ui_test;
+    procedure z_lucnum2_ui_test;
+
+    procedure z_cmp_test;
+    procedure z_cmp_d_test;
+    procedure z_cmp_si_test;
+    procedure z_cmp_ui_test;
+    procedure z_cmpabs_test;
+    procedure z_cmpabs_d_test;
+    procedure z_cmpabs_ui_test;
+
+    procedure z_and_test;
+    procedure z_ior_test;
+    procedure z_xor_test;
+    procedure z_com_test;
+    procedure z_popcount_test;
+    procedure z_hamdist_test;
+    procedure z_scan0_test;
+    procedure z_scan1_test;
+    procedure z_setbit_test;
+    procedure z_clrbit_test;
+    procedure z_combit_test;
+    procedure z_tstbit_test;
+
+    procedure z_urandomb_test;
+    procedure z_urandomm_test;
+    procedure z_rrandomb_test;
+
+    procedure z_fits_ushort_p_test;
+    procedure z_fits_sshort_p_test;
+    procedure z_fits_uint_p_test;
+    procedure z_fits_sint_p_test;
+    procedure z_fits_ulong_p_test;
+    procedure z_fits_slong_p_test;
+    procedure z_sizeinbase_test;
+    procedure z_size_test;
+
+    procedure q_init_test;
+    procedure q_clear_test;
+    procedure q_set_ui_test;
+    procedure q_set_si_test;
+    procedure q_canonicalize_test;
+    procedure q_set_test;
+    procedure q_set_z_test;
+    procedure q_set_str_test;
+    procedure q_swap_test;
+
+    procedure q_get_d_test;
+    procedure q_set_d_test;
+    procedure q_set_f_test;
+    procedure q_get_str_test;
+
+    procedure q_add_test;
+    procedure q_sub_test;
+    procedure q_mul_test;
+    procedure q_mul_2exp_test;
+    procedure q_div_test;
+    procedure q_div_2exp_test;
+    procedure q_neg_test;
+    procedure q_abs_test;
+    procedure q_inv_test;
+
+    procedure q_cmp_test;
+    procedure q_cmp_si_test;
+    procedure q_cmp_ui_test;
+    procedure q_equal_test;
+
+    procedure q_get_num_test;
+    procedure q_get_den_test;
+    procedure q_set_num_test;
+    procedure q_set_den_test;
+
+    procedure f_get_default_prec_test;
+    procedure f_set_default_prec_test;
+
+    procedure f_init_test;
+    procedure f_init2_test;
+    procedure f_clear_test;
+    procedure f_get_prec_test;
+    procedure f_set_prec_test;
+    procedure f_set_prec_raw_test;
+
+    procedure f_set_q_test;
+    procedure f_set_ui_test;
+    procedure f_get_ui_test;
+    procedure f_set_si_test;
+    procedure f_get_si_test;
+    procedure f_set_test;
+    procedure f_set_str_test;
+    procedure f_swap_test;
+
+    procedure f_get_d_test;
+    procedure f_set_d_test;
+    procedure f_set_z_test;
+    procedure f_get_d_2exp_test;
+    procedure f_get_str_test;
+
+    procedure f_add_test;
+    procedure f_add_ui_test;
+    procedure f_sub_test;
+    procedure f_sub_ui_test;
+    procedure f_ui_sub_test;
+    procedure f_mul_test;
+    procedure f_mul_ui_test;
+    procedure f_mul_2exp_test;
+    procedure f_div_test;
+    procedure f_div_ui_test;
+    procedure f_ui_div_test;
+    procedure f_div_2exp_test;
+    procedure f_sqrt_test;
+    procedure f_sqrt_ui_test;
+    procedure f_pow_ui_test;
+    procedure f_neg_test;
+    procedure f_abs_test;
+
+    procedure f_cmp_test;
+    procedure f_cmp_d_test;
+    procedure f_cmp_si_test;
+    procedure f_cmp_ui_test;
+    procedure f_eq_test;
+    procedure f_reldiff_test;
+
+    procedure f_ceil_test;
+    procedure f_floor_test;
+    procedure f_trunc_test;
+    procedure f_integer_p_test;
+
+    procedure f_fits_ushort_p_test;
+    procedure f_fits_sshort_p_test;
+    procedure f_fits_uint_p_test;
+    procedure f_fits_sint_p_test;
+    procedure f_fits_ulong_p_test;
+    procedure f_fits_slong_p_test;
+
+    procedure f_urandomb_test;
+    procedure f_random2_test;
+
+    procedure f_init_set_test;
+    procedure f_init_set_d_test;
+    procedure f_init_set_si_test;
+    procedure f_init_set_str_test;
+    procedure f_init_set_ui_test;
+
+  end;
+
+  { TTestGmpOperators }
+
+  TTestGmpOperators = class(TTestCase)
+    procedure star__MPFloat__MPFloat__MPFloat_;
+    procedure star__MPInteger__MPInteger__MPInteger_;
+    procedure star__MPRational__MPRational__MPRational_;
+    procedure pow__MPFloat_valuint_MPFloat_;
+    procedure pow__MPInteger_valuint_MPInteger_;
+    procedure plus__MPFloat__MPFloat__MPFloat_;
+    procedure plus__MPInteger__MPInteger__MPInteger_;
+    procedure plus__MPRational__MPRational__MPRational_;
+    procedure minus__MPFloat__MPFloat_;
+    procedure minus__MPInteger__MPInteger_;
+    procedure minus__MPRational__MPRational_;
+    procedure minus__MPFloat__MPFloat__MPFloat_;
+    procedure minus__MPInteger__MPInteger__MPInteger_;
+    procedure minus__MPRational__MPRational__MPRational_;
+    procedure slash__MPFloat__MPFloat__MPFloat_;
+    procedure slash__MPInteger__MPInteger__MPInteger_;
+    procedure slash__MPRational__MPRational__MPRational_;
+    procedure assign_double_MPFloat_;
+    procedure assign_double_MPInteger_;
+    procedure assign_double_MPRational_;
+    procedure assign__MPFloat_Cardinal;
+    procedure assign__MPFloat_double;
+    procedure assign__MPFloat_integer;
+    procedure assign__MPFloat_mpf_t;
+    procedure assign__MPFloat__MPInteger_;
+    procedure assign__MPFloat__MPRational_;
+    procedure assign__MPFloat_string;
+    procedure assign__MPFloat_valsint;
+    procedure assign__MPFloat_valuint;
+    procedure assign_mpf_t_MPFloat_;
+    procedure assign__MPInteger_cardinal;
+    procedure assign__MPInteger_double;
+    procedure assign__MPInteger_integer;
+    procedure assign__MPInteger__MPFloat_;
+    procedure assign__MPInteger__MPRational_;
+    procedure assign__MPInteger_mpz_t;
+    procedure assign__MPInteger_string;
+    procedure assign__MPInteger_valsint;
+    procedure assign__MPInteger_valuint;
+    procedure assign_mpq_t_MPRational_;
+    procedure assign__MPRandState_randstate_t;
+    procedure assign__MPRational_double;
+    procedure assign__MPRational__MPFloat_;
+    procedure assign__MPRational__MPInteger_;
+    procedure assign__MPRational_mpq_t;
+    procedure assign__MPRational_string;
+    procedure assign_mpz_t_MPInteger_;
+    procedure assign_randstate_t_MPRandState_;
+    procedure assign_string_MPFloat_;
+    procedure assign_string_MPInteger_;
+    procedure assign_string_MPRational_;
+    procedure assign_valsint_MPFloat_;
+    procedure assign_valsint_MPInteger_;
+    procedure assign_valsint_MPRational_;
+    procedure assign_valuint_MPFloat_;
+    procedure assign_valuint_MPInteger_;
+    procedure assign_valuint_MPRational_;
+    procedure lt__MPFloat__MPFloat_boolean;
+    procedure lt__MPInteger__MPInteger_boolean;
+    procedure lt__MPRational__MPRational_boolean;
+    procedure le__MPFloat__MPFloat_boolean;
+    procedure le__MPInteger__MPInteger_boolean;
+    procedure le__MPRational__MPRational_boolean;
+    procedure gt__MPFloat__MPFloat_boolean;
+    procedure gt__MPInteger__MPInteger_boolean;
+    procedure gt__MPRational__MPRational_boolean;
+    procedure ge__MPFloat__MPFloat_boolean;
+    procedure ge__MPInteger__MPInteger_boolean;
+    procedure ge__MPRational__MPRational_boolean;
+  end;
+

+ 23 - 0
packages/gmp/examples/gmp_testcase.pas

@@ -0,0 +1,23 @@
+unit gmp_testcase;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, fpcunit, testregistry;
+
+{$include gmp_test_intf}
+
+implementation
+
+uses
+  math, strutils, gmp;
+
+{$include gmp_test_impl}
+
+initialization
+  RegisterTests([TTestGmpBinding, TTestGmpExtensions, TTestGmpOperators]);
+
+end.
+

+ 106 - 0
packages/gmp/examples/pidigits_example.pas

@@ -0,0 +1,106 @@
+{ The Computer Language Benchmarks Game
+  http://shootout.alioth.debian.org
+
+  contributed by Vincent Snijders
+  gmp headers by Karl-Michael Schindler
+}
+
+{$mode objfpc}
+
+program pidigits_example;
+
+uses
+  gmp;
+
+procedure PrintPiDigits(NumDigits: integer);
+var
+  q, r, s, t: mpz_t; // Transformation matrix components.
+  u, v, w: mpz_t; // Temporary variables
+  i, k, digit, c: integer;
+  line: string[10];
+
+  function Extract(x:cardinal): integer;
+  begin
+    mpz_mul_ui(u, q, x);
+    mpz_add(u, u, r);
+    mpz_mul_ui(v, s, x);
+    mpz_add(v, v, t);
+    mpz_tdiv_q(w, u, v);
+    result := mpz_get_ui(w);
+  end;
+
+  function IsSafe: boolean;
+  begin
+    result := digit = Extract(4);
+  end;
+
+  procedure Produce;
+  begin
+    mpz_mul_si(r, r, 10);
+    mpz_mul_si(v, t, -10 * digit);
+    mpz_add(r, r, v);
+    mpz_mul_si(q, q, 10);
+  end;
+
+  procedure Consume;
+  begin
+    inc(k);
+    mpz_mul_si(r, r, 2*k+1);
+    mpz_mul_si(u, q, 4*k+2);
+    mpz_add(r, r, u);
+    mpz_mul_si(t, t, 2*k+1);
+    mpz_mul_si(v, s, 4*k+2);
+    mpz_add(t, t, v);
+    mpz_mul_si(s, s, k);
+    mpz_mul_si(q, q, k);
+  end;
+
+begin
+  k := 0;
+  i := 0;
+  c := 0;
+  setlength(line, 10);
+  mpz_init_set_ui(q, 1);
+  mpz_init_set_ui(r, 0);
+  mpz_init_set_ui(s, 0);
+  mpz_init_set_ui(t, 1);
+  mpz_init(u);
+  mpz_init(v);
+  mpz_init(w);
+  while (i < NumDigits) do begin
+    digit := Extract(3);
+    while not IsSafe do begin
+      Consume;
+      digit:= Extract(3);
+    end;
+    Produce;
+    inc(c);
+    line[c] := chr(ord('0') + digit);
+    inc(i);
+    if c = 10 then begin
+      writeln(line, #9':', i);
+      c := 0;
+    end;
+  end;
+  if c <> 0 then begin
+    SetLength(line, c);
+    writeln(line);
+  end;
+  mpz_clear(q);
+  mpz_clear(r);
+  mpz_clear(s);
+  mpz_clear(t);
+  mpz_clear(u);
+  mpz_clear(v);
+  mpz_clear(w);
+end;
+
+var
+  n: integer = 27;
+
+begin
+  if (ParamCount = 1) then
+    val(ParamStr(1), n);
+  PrintPiDigits(n);
+end.
+

+ 84 - 0
packages/gmp/examples/pidigits_example2.pas

@@ -0,0 +1,84 @@
+{ The Computer Language Benchmarks Game
+  http://shootout.alioth.debian.org
+
+  contributed by Vincent Snijders
+  gmp headers by Karl-Michael Schindler
+}
+
+{$mode objfpc}
+
+program pidigits_example2;
+
+uses
+  gmp;
+
+procedure PrintPiDigits(NumDigits: integer);
+var
+  q, r, s, t: MPInteger;  // Transformation matrix components.
+  i, k, digit, c: integer;
+  line: string[10];
+
+  function Extract(x: cardinal): integer;
+  begin
+    result := (q * x + r) / (s * x + t);
+  end;
+
+  function IsSafe: boolean;
+  begin
+    result := digit = Extract(4);
+  end;
+
+  procedure Produce;
+  begin
+    r := 10 * (r - t * digit);
+    q *= 10;
+  end;
+
+  procedure Consume;
+  begin
+    inc(k);
+    r := r * (2 * k + 1) + q * (4 * k + 2);
+    t := t * (2 * k + 1) + s * (4 * k + 2);
+    s *= k;
+    q *= k;
+  end;
+
+begin
+  k := 0;
+  i := 0;
+  c := 0;
+  setlength(line, 10);
+  q := 1;
+  r := 0;
+  s := 0;
+  t := 1;
+  while (i < NumDigits) do begin
+    digit := Extract(3);
+    while not IsSafe do begin
+      Consume;
+      digit := Extract(3);
+    end;
+    Produce;
+    inc(c);
+    line[c] := chr(ord('0') + digit);
+    inc(i);
+    if c = 10 then begin
+      writeln(line, #9':', i);
+      c := 0;
+    end;
+  end;
+  if c <> 0 then begin
+    SetLength(line, c);
+    writeln(line);
+  end;
+end;
+
+var
+  n: integer = 27;
+
+begin
+  if (ParamCount = 1) then
+    val(ParamStr(1), n);
+  PrintPiDigits(n);
+end.
+

+ 27 - 0
packages/gmp/examples/printf_example.pas

@@ -0,0 +1,27 @@
+program printf_example;
+
+{$mode objfpc}{$H+}
+
+uses
+  math, gmp;
+
+const
+  N = 2;
+  NBITS = 100;
+
+var
+  f: mpf_t;
+  bits, digits: integer;
+begin
+  mpf_init2(f, NBITS);
+  bits := mpf_get_prec(f);
+  digits := floor(bits * LOG_10_2);
+  mpf_sqrt_ui(f, N);
+  mp_printf('Sqrt(%d) to %d digits (%d bits) = %.*Fg'#10, N, digits, bits, digits, @f);
+  mpf_pow_ui(f, f, 2);
+  mp_printf('Squared back = %.*Fg'#10, digits, @f);
+  mpf_sub_ui(f, f, N);
+  mp_printf('Minus %d = %.*Fg'#10, N, digits, @f);
+  mpf_clear(f);
+end.
+

+ 26 - 0
packages/gmp/examples/printf_example2.pas

@@ -0,0 +1,26 @@
+program printf_example2;
+
+{$mode objfpc}{$H+}
+
+uses
+  sysutils, math, gmp;
+
+const
+  N = 2;
+  NBITS = 100;
+
+var
+  f: mpfloat;
+  bits, digits: integer;
+begin
+  f_set_default_prec(NBITS);
+  bits := f_get_default_prec;
+  digits := floor(bits * LOG_10_2);
+  f := f_sqrt_ui(N);
+  writeln(format('Sqrt(%d) to %d digits (%d bits) = %s', [N, digits, bits, string(f)]));
+  f := f ** 2;
+  writeln(format('Squared back = %s', [string(f)]));
+  f -= N;
+  writeln(format('Minus %d = %s', [N, string(f)]));
+end.
+

+ 22 - 0
packages/gmp/examples/scanf_example.pas

@@ -0,0 +1,22 @@
+program scanf_example;
+
+{$mode objfpc}{$H+}
+
+uses
+  gmp;
+
+var n, sqr: mpz_t;
+
+begin
+  mpz_init(n);
+  mpz_init(sqr);
+  write('Please enter an integer of any length: ');
+  if mp_scanf('%Zd', @n) = 1 then begin
+    mpz_pow_ui(sqr, n, 2);
+    mp_printf('%Zd^2 = %Zd'#10, @n, @sqr);
+  end else
+    writeln('Failed to parse an integer from your input');
+  mpz_clear(sqr);
+  mpz_clear(n);
+end.
+

+ 21 - 0
packages/gmp/examples/scanf_example2.pas

@@ -0,0 +1,21 @@
+program scanf_example2;
+
+{$mode objfpc}{$H+}
+
+uses
+  sysutils, gmp;
+
+var
+  n, sqr: MPInteger;
+  s: string;
+begin
+  write('Please enter an integer of any length: ');
+  readln(s);
+  z_init(n);
+  if mp_sscanf(pchar(s), '%Zd', n.ptr) = 1 then begin
+    sqr := n ** 2;
+    writeln(format('%s^2 = %s', [string(n), string(sqr)]));
+  end else
+    writeln('Failed to parse an integer from your input');
+end.
+

+ 83 - 0
packages/gmp/readme

@@ -0,0 +1,83 @@
+Readme for libgmp.tar.bz2 2009-09-06
+
+= What
+
+  Free Pascal interface for the GNU Multiple Precision Arithmetic Library.
+
+= Why
+
+  Numeric computing outside the built in types range. AFAIK there is no complete
+  binding for Free Pascal available yet.
+
+= Files
+
+  - gmp_accept_test.pas
+    "Go/no go" test of the gmp unit against the GMP library on your system.
+
+  - gmp.pas
+    The interface unit.
+
+  - gmp_testcase.pas
+    Put this unit in your uses clause of a fpcunit project.
+
+  - gmp_test_impl.inc
+  - gmp_test_intf.inc
+    Test classes declarations and implementations. Included by:
+    * gmp_accept_test.pas
+    * gmp_testcase
+
+  - pidigits_example.pas
+    Original source from:
+    shootout.alioth.debian.org/u64/benchmark.php?test=pidigits&lang=fpascal&id=2
+    Adapted for using the gmp unit.
+
+  - pidigits_example2.pas
+    Modified pidigits_example.pas to demonstrate usage of the gmp extensions.
+
+  - printf_example.pas
+    Demo using the GMP printf
+
+  - printf_example2.pas
+    Dtto with gmp extensions.
+
+  - scanf_example.pas
+    Demo using the GMP scanf.
+
+  - scanf_example2.pas
+    Dtto with gmp extensions.
+
+= Status
+  - Tested on 64 and 32 bit Linux and on 32 bit Windows.
+  - Known issues
+    * There is a link error on Windows with the GMP global variables.
+      Probably could be solved with someone's better knowledge of the Windows
+      environment.
+
+= Bindings
+  - Standard
+    * Almost full (see comments in gmp.pas) binding of the types and functions
+      exported from libgmp.
+
+  - Extensions
+    * Based on pseudo value types (in fact interface types) with an automatic
+      memory management in the spirit of Object Pascal strings - compiler takes
+      care of initialization/finalization. Copy on write semantics. Can intermix
+      the standard binding/types with the extended ones. The extended types have
+      access to a same set of numeric functions as in the standard binding.
+
+  - Operators
+    * Overloaded operators for the extensions value types. Can make programs
+      significantly more readable/maintainable. See and compare for yourself
+      in the pidigits examples. BTW, the overhead in this example with
+      the extended types and operators is less than 10%. Unusable for shootout,
+      but is probably acceptable in many other areas.
+
+= Tips
+  - range checks
+    You should probably want to put asserts with *_fits before conversion to
+    FPC ordinal types - applies to the assignment operator too.
+
+= License
+  - FPC developers, you can do anything you see appropriate with the sources.
+    Review, refactor and/or reject :-)
+

+ 3819 - 0
packages/gmp/src/gmp.pas

@@ -0,0 +1,3819 @@
+{
+    This file is part of the Free Pascal packages
+    Copyright (c) 2009 by the Free Pascal development team
+
+    An header for the GMP library
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright. (LGPL)
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+}
+
+unit gmp;
+
+{$mode objfpc}{$h+}
+{$packrecords c}
+
+//todo:windows link error on GMP global vars, reason not yet known
+{$ifdef windows}
+{$define NO_GMP_GLOBVARS}
+{$endif}
+
+{ Unused symbols exported from GMP:
+
+  Marked preliminary in GMP manual
+    __gmpn_bdivmod
+
+  Marked obsolete in GMP manual
+    __gmpn_divrem
+    __gmpz_random
+    __gmpz_random2
+    __gmp_randinit
+
+  Not documented in GMP manual
+    __gmpf_size
+    __gmpn_divrem_2
+    __gmpn_pow_1
+    __gmpn_preinv_mod_1
+    __gmpz_millerrabin
+
+  Marked for use only within GDB
+    __gmpf_dump
+    __gmpz_dump
+}
+
+interface
+
+uses
+  sysutils;
+
+const
+  BASE10 = 10;
+  LIB = 'gmp';
+  LOG_10_2 = 0.3010299956639812;
+  ERROR_NONE = 0;
+  ERROR_UNSUPPORTED_ARGUMENT = 1;
+  ERROR_DIVISION_BY_ZERO = 2;
+  ERROR_SQRT_OF_NEGATIVE = 4;
+  ERROR_INVALID_ARGUMENT = 8;
+  RAND_ALG_DEFAULT = 0;
+  RAND_ALG_LC = RAND_ALG_DEFAULT;
+
+type
+
+  // ---- GMP types ----
+
+  { low level multi precision integer atom = machine size uint }
+  mp_limb_t = valuint;
+  { ^array of mp_limb_t}
+  mpn_ptr = ^mp_limb_t;
+  mp_size_t = sizeint;
+  mp_exp_t = valsint;
+  randalg_t = longint;
+
+  { multi precision integer number record }
+  mpz_t = record
+    alloc: longint;
+    size: longint;
+    data: mpn_ptr;
+  end;
+  mpz_ptr = ^mpz_t;
+
+  { multi precision rational number record }
+  mpq_t = record
+    num: mpz_t;
+    den: mpz_t;
+  end;
+  mpq_ptr = ^mpq_t;
+
+  { multi precision real number record }
+  mpf_t = record
+    prec: longint;
+    size: longint;
+    exp: mp_exp_t;
+    data: mpn_ptr;
+  end;
+  mpf_ptr = ^mpf_t;
+
+  randstate_t = record
+    seed: mpz_t;
+    alg: randalg_t;
+    algdata: record
+      case longint of
+        0 : (lc : pointer);
+    end;
+  end;
+  randstate_ptr = ^randstate_t;
+
+  { Return a pointer to newly allocated space with at least alloc size bytes }
+  alloc_func_t = function(alloc_size: sizeuint): pointer; cdecl;
+  { Resize a previously allocated block ptr of old size bytes to be new size bytes }
+  reallocate_func_t = function(p: pointer; old_size, new_size: sizeuint): pointer; cdecl;
+  { De-allocate the space pointed to by ptr }
+  free_proc_t = procedure(p: pointer; size: sizeuint); cdecl;
+  palloc_func = ^alloc_func_t;
+  preallocate_func = ^reallocate_func_t;
+  pfree_proc = ^free_proc_t;
+
+  // ---- ext types with automatic mem mngmt & cow, ~ fpc string type style -----
+
+  IMPBase = interface
+    function refs: longint;
+  end;
+
+  MPInteger = interface(IMPBase)
+    function ptr: mpz_ptr;
+  end;
+
+  MPFloat = interface(IMPBase)
+    function ptr: mpf_ptr;
+  end;
+
+  MPRational = interface(IMPBase)
+    function ptr: mpq_ptr;
+  end;
+
+  MPRandState = interface(IMPBase)
+    function ptr: randstate_ptr;
+  end;
+
+  { TMPBase }
+
+  TMPBase = class(TInterfacedObject, IMPBase)
+  private
+    function refs: longint;  inline;
+  end;
+
+  { TMPInteger }
+
+  TMPInteger = class(TMPBase, MPInteger)
+  private
+    fmpz: mpz_t;
+    function ptr: mpz_ptr;  inline;
+  public
+    destructor destroy; override;
+  end;
+
+  { TMPFloat }
+
+  TMPFloat = class(TMPBase, MPFloat)
+  private
+    fmpf: mpf_t;
+    function ptr: mpf_ptr;  inline;
+  public
+    destructor destroy; override;
+  end;
+
+  { TMPRational }
+
+  TMPRational = class(TMPBase, MPRational)
+  private
+    fmpq: mpq_t;
+    function ptr: mpq_ptr;  inline;
+  public
+    destructor destroy; override;
+  end;
+
+  { TMPRandState }
+
+  TMPRandState = class(TMPBase, MPRandState)
+  private
+    frandstate: randstate_t;
+    function ptr: randstate_ptr;  inline;
+  public
+    destructor destroy; override;
+  end;
+
+// ==== GMP bindings ====
+
+// ---- Custom Allocation ----
+
+{ Replace the current allocation functions from the arguments }
+procedure mp_set_memory_functions(alloc_func_ptr: alloc_func_t; realloc_func_ptr: reallocate_func_t; free_func_ptr: free_proc_t); cdecl; external LIB name '__gmp_set_memory_functions';
+{ Get the current allocation functions, storing function pointers to the locations given by the arguments }
+procedure mp_get_memory_functions(alloc_func_ptr: palloc_func; realloc_func_ptr: preallocate_func; free_func_ptr: pfree_proc); cdecl; external LIB name '__gmp_get_memory_functions';
+
+// ---- Random Number Functions ----
+
+{ Obsolete: Initialize state with an algorithm selected by alg }
+// procedure randinit(var state: randstate_t; alg: randalg_t; args: array of const); cdecl; external LIB name '__gmp_randinit';
+
+{ Initialize state with a default algorithm }
+procedure mp_randinit_default(out state: randstate_t); cdecl; external LIB name '__gmp_randinit_default';
+{ Initialize state with a linear congruential algorithm X = (aX + c) mod 2^m2exp }
+procedure mp_randinit_lc_2exp(out state: randstate_t; var a: mpz_t; c, m2exp: valuint); cdecl; external LIB name '__gmp_randinit_lc_2exp';
+{ Initialize state for a linear congruential algorithm as per gmp_randinit_lc_2exp }
+function mp_randinit_lc_2exp_size(out state: randstate_t; size: sizeuint): longint; cdecl; external LIB name '__gmp_randinit_lc_2exp_size';
+{ Initialize state for a Mersenne Twister algorithm }
+procedure mp_randinit_mt(out state: randstate_t); cdecl; external LIB name '__gmp_randinit_mt';
+{ Initialize rop with a copy of the algorithm and state from op }
+procedure mp_randinit_set(out rop: randstate_t; var op: randstate_t); cdecl; external LIB name '__gmp_randinit_set';
+{ Set an initial seed value into state }
+procedure mp_randseed(var state: randstate_t; var seed: mpz_t); cdecl; external LIB name '__gmp_randseed';
+{ Set an initial seed value into state }
+procedure mp_randseed_ui(var state: randstate_t; seed: valuint); cdecl; external LIB name '__gmp_randseed_ui';
+{ Free all memory occupied by state }
+procedure mp_randclear(var state: randstate_t); cdecl; external LIB name '__gmp_randclear';
+{ Return an uniformly distributed random number of n bits, ie. in the range 0 to 2^n−1 inclusive }
+function mp_urandomb_ui(var state: randstate_t; n: valuint): valuint; cdecl; external LIB name '__gmp_urandomb_ui';
+{ Return an uniformly distributed random number in the range 0 to n − 1, inclusive }
+function mp_urandomm_ui(var state: randstate_t; n: valuint): valuint; cdecl; external LIB name '__gmp_urandomm_ui';
+
+// ---- Formatted Input/Output ----
+
+{ Form a null-terminated string in a block of memory obtained from the current memory allocation function }
+function mp_asprintf(out pp: pchar; fmt: pchar; args: array of const): longint; cdecl; external LIB name '__gmp_asprintf';
+{ Form a null-terminated string in a block of memory obtained from the current memory allocation function }
+function mp_asprintf(out pp: pchar; fmt: pchar): longint; cdecl; varargs; external LIB name '__gmp_asprintf';
+{ Print to the standard output stdout. Return the number of characters written, or −1 if an error occurred. }
+function mp_printf(fmt: pchar; args: array of const): longint; cdecl; external LIB name '__gmp_printf';
+{ Print to the standard output stdout. Return the number of characters written, or −1 if an error occurred. }
+function mp_printf(fmt: pchar): longint; cdecl; varargs; external LIB name '__gmp_printf';
+{ Form a null-terminated string in buf. No more than size bytes will be written. }
+function mp_snprintf(buf: pchar; size: sizeuint; fmt: pchar; args: array of const): longint; cdecl; external LIB name '__gmp_snprintf';
+{ Form a null-terminated string in buf. No more than size bytes will be written. }
+function mp_snprintf(buf: pchar; size: sizeuint; fmt: pchar): longint; cdecl; varargs; external LIB name '__gmp_snprintf';
+{ Form a null-terminated string in buf. Return the number of characters written, excluding the terminating null. }
+function mp_sprintf(buf, fmt: pchar; args: array of const): longint; cdecl; external LIB name '__gmp_sprintf';
+{ Form a null-terminated string in buf. Return the number of characters written, excluding the terminating null. }
+function mp_sprintf(buf, fmt: pchar): longint; cdecl; varargs; external LIB name '__gmp_sprintf';
+{ Read from the standard input stdin }
+function mp_scanf(fmt: pchar; args: array of const): longint; cdecl; external LIB name '__gmp_scanf';
+{ Read from the standard input stdin }
+function mp_scanf(fmt: pchar): longint; cdecl; varargs; external LIB name '__gmp_scanf';
+{ Read from a null-terminated string s }
+function mp_sscanf(s, fmt: pchar; args: array of const): longint; cdecl; external LIB name '__gmp_sscanf';
+{ Read from a null-terminated string s }
+function mp_sscanf(s, fmt: pchar): longint; cdecl; varargs; external LIB name '__gmp_sscanf';
+
+// ---- integer Functions ----
+
+{ Change the space for integer to new_alloc limbs }
+function mpz_realloc(var integer_: mpz_t; new_alloc: mp_size_t): pointer; cdecl; external LIB name '__gmpz_realloc';
+{ Set rop to the absolute value of op }
+procedure mpz_abs(var rop, op: mpz_t); cdecl; external LIB name '__gmpz_abs';
+{ Set rop to op1 + op2 }
+procedure mpz_add(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_add';
+{ Set rop to op1 + op2 }
+procedure mpz_add_ui(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_add_ui';
+{ Set rop to rop + op1 × op2 }
+procedure mpz_addmul(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_addmul';
+{ Set rop to rop + op1 × op2 }
+procedure mpz_addmul_ui(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_addmul_ui';
+{ Set rop to op1 bitwise-and op2 }
+procedure mpz_and(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_and';
+{ _Fixed_ space of fixed_num_bits is allocated to each of the array size integers in integer array }
+procedure mpz_array_init(var integer_array: mpz_t; array_size, fixed_num_bits: mp_size_t); cdecl; external LIB name '__gmpz_array_init';
+{ Compute the binomial coefficient (n over k) and store the result in rop }
+procedure mpz_bin_ui(var rop, n: mpz_t; k: valuint); cdecl; external LIB name '__gmpz_bin_ui';
+{ Compute the binomial coefficient (n over k) and store the result in rop }
+procedure mpz_bin_uiui(var rop: mpz_t; n, k: valuint); cdecl; external LIB name '__gmpz_bin_uiui';
+{ Divide n by d, forming a quotient q. Round mode ceil. }
+procedure mpz_cdiv_q(var q, n, d: mpz_t); cdecl; external LIB name '__gmpz_cdiv_q';
+{ Divide n by d, forming a quotient q. d = 2^b. Round mode ceil. }
+procedure mpz_cdiv_q_2exp(var q, n: mpz_t; b: valuint); cdecl; external LIB name '__gmpz_cdiv_q_2exp';
+{ Divide n by d, forming a quotient q. Round mode ceil. }
+function mpz_cdiv_q_ui(var q, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_cdiv_q_ui';
+{ Divide n by d, forming a quotient q and remainder r. Round mode ceil. }
+procedure mpz_cdiv_qr(var q, r, n, d: mpz_t); cdecl; external LIB name '__gmpz_cdiv_qr';
+{ Divide n by d, forming a quotient q and remainder r. Round mode ceil. }
+function mpz_cdiv_qr_ui(var q, r, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_cdiv_qr_ui';
+{ Divide n by d, forming a remainder r. Round mode ceil. }
+procedure mpz_cdiv_r(var r, n, d: mpz_t); cdecl; external LIB name '__gmpz_cdiv_r';
+{ Divide n by d, forming a remainder r. d = 2^b. Round mode ceil. }
+procedure mpz_cdiv_r_2exp(var r, n: mpz_t; b: valuint); cdecl; external LIB name '__gmpz_cdiv_r_2exp';
+{ Divide n by d, forming a remainder r. Round mode ceil. }
+function mpz_cdiv_r_ui(var r, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_cdiv_r_ui';
+{ Divide n by d. Round mode ceil. }
+function mpz_cdiv_ui(var n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_cdiv_ui';
+{ Free the space occupied by integer. Call this function for all mpz_t variables when you are done with them. }
+procedure mpz_clear(var integer_: mpz_t); cdecl; external LIB name '__gmpz_clear';
+{ Clear bit bit_index in rop }
+procedure mpz_clrbit(var rop: mpz_t; bit_index: valuint); cdecl; external LIB name '__gmpz_clrbit';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function mpz_cmp(var op1, op2: mpz_t): longint; cdecl; external LIB name '__gmpz_cmp';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function mpz_cmp_d(var op1: mpz_t; op2: double): longint; cdecl; external LIB name '__gmpz_cmp_d';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function mpz_cmp_si(var op1: mpz_t; op2: valsint): longint; cdecl; external LIB name '__gmpz_cmp_si';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function mpz_cmp_ui(var op1: mpz_t; op2: valuint): longint; cdecl; external LIB name '__gmpz_cmp_ui';
+{ Compare the absolute values of op1 and op2. Return a positive value if |op1| > |op2|, zero if |op1| = |op2|, or a negative value if |op1| < |op2|. }
+function mpz_cmpabs(var op1, op2: mpz_t): longint; cdecl; external LIB name '__gmpz_cmpabs';
+{ Compare the absolute values of op1 and op2. Return a positive value if |op1| > |op2|, zero if |op1| = |op2|, or a negative value if |op1| < |op2|. }
+function mpz_cmpabs_d(var op1: mpz_t; op2: double): longint; cdecl; external LIB name '__gmpz_cmpabs_d';
+{ Compare the absolute values of op1 and op2. Return a positive value if |op1| > |op2|, zero if |op1| = |op2|, or a negative value if |op1| < |op2|. }
+function mpz_cmpabs_ui(var op1: mpz_t; op2: valuint): longint; cdecl; external LIB name '__gmpz_cmpabs_ui';
+{ Set rop to the one’s complement of op }
+procedure mpz_com(var rop, op: mpz_t); cdecl; external LIB name '__gmpz_com';
+{ Complement bit bit_index in rop }
+procedure mpz_combit(var rop: mpz_t; bit_index: valuint); cdecl; external LIB name '__gmpz_combit';
+{ Return non-zero if n is congruent to c modulo d }
+function mpz_congruent_p(var n, c, d: mpz_t): longint; cdecl; external LIB name '__gmpz_congruent_p';
+{ Return non-zero if n is congruent to c modulo 2^b }
+function mpz_congruent_2exp_p(var n, c: mpz_t; b: valuint): longint; cdecl; external LIB name '__gmpz_congruent_2exp_p';
+{ Return non-zero if n is congruent to c modulo d }
+function mpz_congruent_ui_p(var n: mpz_t; c, d: valuint): longint; cdecl; external LIB name '__gmpz_congruent_ui_p';
+{ Set q to n/d }
+procedure mpz_divexact(var q, n, d: mpz_t); cdecl; external LIB name '__gmpz_divexact';
+{ Set q to n/d }
+procedure mpz_divexact_ui(var q, n: mpz_t; d: valuint); cdecl; external LIB name '__gmpz_divexact_ui';
+{ Return non-zero if n is exactly divisible by d }
+function mpz_divisible_p(var n, d: mpz_t): longint; cdecl; external LIB name '__gmpz_divisible_p';
+{ Return non-zero if n is exactly divisible by d }
+function mpz_divisible_ui_p(var n: mpz_t; d: valuint): longint; cdecl; external LIB name '__gmpz_divisible_ui_p';
+{ Return non-zero if n is exactly divisible by by 2^b }
+function mpz_divisible_2exp_p(var n: mpz_t; b: valuint): longint; cdecl; external LIB name '__gmpz_divisible_2exp_p';
+
+// GDB only: procedure mpz_dump(var _para1: mpz_t); cdecl; external LIB name '__gmpz_dump';
+
+{ Fill buf with word data from op }
+function mpz_export(out buf; out countp: sizeuint; order: longint; size: sizeuint; endian: longint; nails: sizeuint; var op: mpz_t): pointer; cdecl; external LIB name '__gmpz_export';
+{ Set rop to op!, the factorial of op }
+procedure mpz_fac_ui(var rop: mpz_t; op: valuint); cdecl; external LIB name '__gmpz_fac_ui';
+{ Divide n by d, forming a quotient q. Round mode floor. }
+procedure mpz_fdiv_q(var q, n, d: mpz_t); cdecl; external LIB name '__gmpz_fdiv_q';
+{ Divide n by d, forming a quotient q. d = 2^b. Round mode floor. }
+procedure mpz_fdiv_q_2exp(var q, n: mpz_t; b: valuint); cdecl; external LIB name '__gmpz_fdiv_q_2exp';
+{ Divide n by d, forming a quotient q. Round mode floor. }
+function mpz_fdiv_q_ui(var q, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_fdiv_q_ui';
+{ Divide n by d, forming a quotient q and remainder r. Round mode floor. }
+procedure mpz_fdiv_qr(var q, r, n, d: mpz_t); cdecl; external LIB name '__gmpz_fdiv_qr';
+{ Divide n by d, forming a quotient q and remainder r. Round mode floor. }
+function mpz_fdiv_qr_ui(var q, r, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_fdiv_qr_ui';
+{ Divide n by d, forming a remainder r. Round mode floor. }
+procedure mpz_fdiv_r(var r, n, d: mpz_t); cdecl; external LIB name '__gmpz_fdiv_r';
+{ Divide n by d, forming a remainder r. d = 2^b. Round mode floor. }
+procedure mpz_fdiv_r_2exp(var r, n: mpz_t; b: valuint); cdecl; external LIB name '__gmpz_fdiv_r_2exp';
+{ Divide n by d, forming a remainder r. Round mode floor. }
+function mpz_fdiv_r_ui(var r, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_fdiv_r_ui';
+{ Divide n by d. Round mode floor. }
+function mpz_fdiv_ui(var n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_fdiv_ui';
+{ Set fn to to Fn, the n’th Fibonacci number }
+procedure mpz_fib_ui(var fn: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_fib_ui';
+{ Set fn to Fn, and fnsub1 to Fn−1 }
+procedure mpz_fib2_ui(var fn, fnsub1: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_fib2_ui';
+{ Return non-zero iff the value of op fits in an signed int. Otherwise, return zero. }
+function mpz_fits_sint_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_fits_sint_p';
+{ Return non-zero iff the value of op fits in an signed long int. Otherwise, return zero. }
+function mpz_fits_slong_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_fits_slong_p';
+{ Return non-zero iff the value of op fits in an signed short int. Otherwise, return zero. }
+function mpz_fits_sshort_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_fits_sshort_p';
+{ Return non-zero iff the value of op fits in an unsigned int. Otherwise, return zero. }
+function mpz_fits_uint_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_fits_uint_p';
+{ Return non-zero iff the value of op fits in an unsigned long int. Otherwise, return zero. }
+function mpz_fits_ulong_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_fits_ulong_p';
+{ Return non-zero iff the value of op fits in an unsigned short int. Otherwise, return zero. }
+function mpz_fits_ushort_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_fits_ushort_p';
+{ Set rop to the greatest common divisor of op1 and op2 }
+procedure mpz_gcd(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_gcd';
+{ Compute the greatest common divisor of op1 and op2. If rop is not NULL, store the result there. }
+function mpz_gcd_ui(var rop, op1: mpz_t; op2: valuint): valuint; cdecl; external LIB name '__gmpz_gcd_ui';
+{ Set g to the greatest common divisor of a and b, and in addition set s and t to coefficients satisfying as + bt = g }
+procedure mpz_gcdext(var g, s, t, a, b: mpz_t); cdecl; external LIB name '__gmpz_gcdext';
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero) }
+function mpz_get_d(var op: mpz_t): double; cdecl; external LIB name '__gmpz_get_d';
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero), and returning the exponent separately }
+function mpz_get_d_2exp(out exp: valsint; var op: mpz_t): double; cdecl; external LIB name '__gmpz_get_d_2exp';
+{ Return the value of op as a signed long }
+function mpz_get_si(var op: mpz_t): valsint; cdecl; external LIB name '__gmpz_get_si';
+{ Convert op to a string of digits in base base. The base argument may vary from 2 to 62 or from −2 to −36. If str is NULL, the result string is allocated using the current allocation function }
+function mpz_get_str(str: pchar; base: longint; var op: mpz_t): pchar; cdecl; external LIB name '__gmpz_get_str';
+{ Return the value of op as an unsigned long }
+function mpz_get_ui(var op: mpz_t): valuint; cdecl; external LIB name '__gmpz_get_ui';
+{ Return limb number n from op }
+function mpz_getlimbn(var op: mpz_t; n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpz_getlimbn';
+{ If op1 and op2 are both >= 0 or both < 0, return the hamming distance between the two operands, which is the number of bit positions where op1 and op2 have different bit values }
+function mpz_hamdist(var op1, op2: mpz_t): valuint; cdecl; external LIB name '__gmpz_hamdist';
+{ Set rop from an array of word data at op }
+procedure mpz_import(var rop: mpz_t; count: sizeuint; order: longint; size: sizeuint; endian: longint; nails: sizeuint; const op); cdecl; external LIB name '__gmpz_import';
+{ Initialize integer, and set its value to 0 }
+procedure mpz_init(out integer_: mpz_t); cdecl; external LIB name '__gmpz_init';
+{ Initialize integer, with space for n bits, and set its value to 0 }
+procedure mpz_init2(out integer_: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_init2';
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure mpz_init_set(out rop: mpz_t; var op: mpz_t); cdecl; external LIB name '__gmpz_init_set';
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure mpz_init_set_d(out rop: mpz_t; op: double); cdecl; external LIB name '__gmpz_init_set_d';
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure mpz_init_set_si(out rop: mpz_t; op: valsint); cdecl; external LIB name '__gmpz_init_set_si';
+{ Initialize rop and set its value like mpz_set_str }
+function mpz_init_set_str(out rop: mpz_t; str: pchar; base: longint): longint; cdecl; external LIB name '__gmpz_init_set_str';
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure mpz_init_set_ui(out rop: mpz_t; op: valuint); cdecl; external LIB name '__gmpz_init_set_ui';
+{ Compute the inverse of op1 modulo op2 and put the result in rop }
+function mpz_invert(var rop, op1, op2: mpz_t): longint; cdecl; external LIB name '__gmpz_invert';
+{ Set rop to op1 bitwise inclusive-or op2 }
+procedure mpz_ior(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_ior';
+{ Calculate the Jacobi symbol. This is defined only for b odd }
+function mpz_jacobi(var a, b: mpz_t): longint; cdecl; external LIB name '__gmpz_jacobi';
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function mpz_kronecker_si(var a: mpz_t; b: valsint): longint; cdecl; external LIB name '__gmpz_kronecker_si';
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function mpz_kronecker_ui(var a: mpz_t; b: valuint): longint; cdecl; external LIB name '__gmpz_kronecker_ui';
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function mpz_si_kronecker(a: valsint; var b: mpz_t): longint; cdecl; external LIB name '__gmpz_si_kronecker';
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function mpz_ui_kronecker(a: valuint; var b: mpz_t): longint; cdecl; external LIB name '__gmpz_ui_kronecker';
+{ Set rop to the least common multiple of op1 and op2 }
+procedure mpz_lcm(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_lcm';
+{ Set rop to the least common multiple of op1 and op2 }
+procedure mpz_lcm_ui(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_lcm_ui';
+{ Set ln to to Ln, the n’th Lucas number }
+procedure mpz_lucnum_ui(var ln: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_lucnum_ui';
+{ Set ln to Ln, and lnsub1 to Ln−1 }
+procedure mpz_lucnum2_ui(var ln, lnsub1: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_lucnum2_ui';
+
+// No docs: function mpz_millerrabin(var _para1: mpz_t; _para2: longint): longint; cdecl; external LIB name '__gmpz_millerrabin';
+
+{ Set r to n mod d. The sign of the divisor is ignored; the result is always non-negative. }
+procedure mpz_mod(var r, n, d: mpz_t); cdecl; external LIB name '__gmpz_mod';
+{ Set rop to op1 × op2 }
+procedure mpz_mul(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_mul';
+{ Set rop to op1 × 2^op2. This operation can also be defined as a left shift by op2 bits. }
+procedure mpz_mul_2exp(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_mul_2exp';
+{ Set rop to op1 × op2 }
+procedure mpz_mul_si(var rop, op1: mpz_t; op2: valsint); cdecl; external LIB name '__gmpz_mul_si';
+{ Set rop to op1 × op2 }
+procedure mpz_mul_ui(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_mul_ui';
+{ Set rop to −op }
+procedure mpz_neg(var rop, op: mpz_t); cdecl; external LIB name '__gmpz_neg';
+{ Set rop to the next prime greater than op }
+procedure mpz_nextprime(var rop, op: mpz_t); cdecl; external LIB name '__gmpz_nextprime';
+{ Return non-zero if op is a perfect power, i.e., if there exist integers a and b, with b > 1, such that op = a^b }
+function mpz_perfect_power_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_perfect_power_p';
+{ Return non-zero if op is a perfect square, i.e., if the square root of op is an integer }
+function mpz_perfect_square_p(var op: mpz_t): longint; cdecl; external LIB name '__gmpz_perfect_square_p';
+{ If op >= 0, return the population count of op, which is the number of 1 bits in the binary representation }
+function mpz_popcount(var op: mpz_t): valuint; cdecl; external LIB name '__gmpz_popcount';
+{ Set rop to base^exp. The case 0^0 yields 1. }
+procedure mpz_pow_ui(var rop, base: mpz_t; exp: valuint); cdecl; external LIB name '__gmpz_pow_ui';
+{ Set rop to base^exp mod mod_ }
+procedure mpz_powm(var rop, base, exp, mod_: mpz_t); cdecl; external LIB name '__gmpz_powm';
+{ Set rop to base^exp mod mod_ }
+procedure mpz_powm_ui(var rop, base: mpz_t; exp: valuint; var mod_: mpz_t); cdecl; external LIB name '__gmpz_powm_ui';
+{ Determine whether n is prime. Return 2 if n is definitely prime, return 1 if n is probably prime (without being certain), or return 0 if n is definitely composite. }
+function mpz_probab_prime_p(var n: mpz_t; reps: longint): longint; cdecl; external LIB name '__gmpz_probab_prime_p';
+
+{ Obsolete: Generate a random integer of at most max_size limbs }
+// procedure mpz_random(var rop: mpz_t; max_size: mp_size_t); cdecl; external LIB name '__gmpz_random';
+{ Obsolete: Generate a random integer of at most max_size limbs, with long strings of zeros and ones in the binary representation }
+// procedure mpz_random2(var rop: mpz_t; max_size: mp_size_t); cdecl; external LIB name '__gmpz_random2';
+
+{ Change the space allocated for integer to n bits. The value in integer is preserved if it fits, or is set to 0 if not. }
+procedure mpz_realloc2(var integer_: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_realloc2';
+{ Remove all occurrences of the factor f from op and store the result in rop }
+function mpz_remove(var rop, op, f: mpz_t): valuint; cdecl; external LIB name '__gmpz_remove';
+{ Set rop to trunc(op^(1/n)), the truncated integer part of the nth root of op. Return non-zero if the computation was exact, i.e., if op is rop to the nth power. }
+function mpz_root(var rop, op: mpz_t; n: valuint): longint; cdecl; external LIB name '__gmpz_root';
+{ Set root to trunc(u^(1/n)), the truncated integer part of the nth root of u. Set rem to the remainder, (u − root^n). }
+procedure mpz_rootrem(var root, rem, u: mpz_t; n: valuint); cdecl; external LIB name '__gmpz_rootrem';
+{ Generate a random integer with long strings of zeros and ones in the binary representation }
+procedure mpz_rrandomb(var rop: mpz_t; var state: randstate_t; n: valuint); cdecl; external LIB name '__gmpz_rrandomb';
+{ Scan op, starting from bit starting_bit, towards more significant bits, until the first 0 bit is found }
+function mpz_scan0(var op: mpz_t; starting_bit: valuint): valuint; cdecl; external LIB name '__gmpz_scan0';
+{ Scan op, starting from bit starting_bit, towards more significant bits, until the first 1 bit is found }
+function mpz_scan1(var op: mpz_t; starting_bit: valuint): valuint; cdecl; external LIB name '__gmpz_scan1';
+{ Set the value of rop from op }
+procedure mpz_set(var rop, op: mpz_t); cdecl; external LIB name '__gmpz_set';
+{ Set the value of rop from op }
+procedure mpz_set_d(var rop: mpz_t; op: double); cdecl; external LIB name '__gmpz_set_d';
+{ Set the value of rop from op }
+procedure mpz_set_f(var rop: mpz_t; var op: mpf_t); cdecl; external LIB name '__gmpz_set_f';
+{ Set the value of rop from op }
+procedure mpz_set_q(var rop: mpz_t; var op: mpq_t); cdecl; external LIB name '__gmpz_set_q';
+{ Set the value of rop from op }
+procedure mpz_set_si(var rop: mpz_t; op: valsint); cdecl; external LIB name '__gmpz_set_si';
+{ Set the value of rop from str, a null-terminated C string in base base. White space is allowed in the string, and is simply ignored. }
+function mpz_set_str(var rop: mpz_t; str: pchar; base: longint): longint; cdecl; external LIB name '__gmpz_set_str';
+{ Set the value of rop from op }
+procedure mpz_set_ui(var rop: mpz_t; op: valuint); cdecl; external LIB name '__gmpz_set_ui';
+{ Set bit bit_index in rop }
+procedure mpz_setbit(var rop: mpz_t; bit_index: valuint); cdecl; external LIB name '__gmpz_setbit';
+{ Return the size of op measured in number of limbs }
+function mpz_size(var op: mpz_t): sizeuint; cdecl; external LIB name '__gmpz_size';
+{ Return the size of op measured in number of digits in the given base }
+function mpz_sizeinbase(var op: mpz_t; base: longint): sizeuint; cdecl; external LIB name '__gmpz_sizeinbase';
+{ Set rop to trunc(sqrt(op)), the truncated integer part of the square root of op }
+procedure mpz_sqrt(var rop, op: mpz_t); cdecl; external LIB name '__gmpz_sqrt';
+{ Set rop1 to trunc(sqrt(op)), likempz_sqrt. Set rop2 to the remainder (op − rop1^2), which will be zero if op is a perfect square. }
+procedure mpz_sqrtrem(var rop1, rop2, op: mpz_t); cdecl; external LIB name '__gmpz_sqrtrem';
+{ Set rop to op1 − op2 }
+procedure mpz_sub(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_sub';
+{ Set rop to op1 − op2 }
+procedure mpz_sub_ui(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_sub_ui';
+{ Set rop to op1 − op2 }
+procedure mpz_ui_sub(var rop: mpz_t; op1: valuint; var op2: mpz_t); cdecl; external LIB name '__gmpz_ui_sub';
+{ Set rop to rop − op1 × op2 }
+procedure mpz_submul(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_submul';
+{ Set rop to rop − op1 × op2 }
+procedure mpz_submul_ui(var rop, op1: mpz_t; op2: valuint); cdecl; external LIB name '__gmpz_submul_ui';
+{ Swap the values rop1 and rop2 efficiently }
+procedure mpz_swap(var rop1, rop2: mpz_t); cdecl; external LIB name '__gmpz_swap';
+{ Divide n by d, forming a quotient q. Round mode trunc. }
+procedure mpz_tdiv_q(var q, n, d: mpz_t); cdecl; external LIB name '__gmpz_tdiv_q';
+{ Divide n by d, forming a quotient q. d = 2^b. Round mode trunc. }
+procedure mpz_tdiv_q_2exp(var q, n: mpz_t; b: valuint); cdecl; external LIB name '__gmpz_tdiv_q_2exp';
+{ Divide n by d, forming a quotient q. Round mode trunc. }
+function mpz_tdiv_q_ui(var q, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_tdiv_q_ui';
+{ Divide n by d, forming a quotient q and remainder r. Round mode trunc. }
+procedure mpz_tdiv_qr(var q, r, n, d: mpz_t); cdecl; external LIB name '__gmpz_tdiv_qr';
+{ Divide n by d, forming a quotient q and remainder r. Round mode trunc. }
+function mpz_tdiv_qr_ui(var q, r, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_tdiv_qr_ui';
+{ Divide n by d, forming a remainder r. Round mode trunc. }
+procedure mpz_tdiv_r(var r, n, d: mpz_t); cdecl; external LIB name '__gmpz_tdiv_r';
+{ Divide n by d, forming a remainder r. d = 2^b. Round mode trunc. }
+procedure mpz_tdiv_r_2exp(var r, n: mpz_t; b: valuint); cdecl; external LIB name '__gmpz_tdiv_r_2exp';
+{ Divide n by d, forming a remainder r. Round mode trunc. }
+function mpz_tdiv_r_ui(var r, n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_tdiv_r_ui';
+{ Divide n by d. Round mode trunc. }
+function mpz_tdiv_ui(var n: mpz_t; d: valuint): valuint; cdecl; external LIB name '__gmpz_tdiv_ui';
+{ Test bit bit_index in op and return 0 or 1 accordingly }
+function mpz_tstbit(var rop: mpz_t; bit_index: valuint): longint; cdecl; external LIB name '__gmpz_tstbit';
+{ Set rop to base^exp. The case 0^0 yields 1 }
+procedure mpz_ui_pow_ui(var rop: mpz_t; base, exp: valuint); cdecl; external LIB name '__gmpz_ui_pow_ui';
+{ Generate a uniformly distributed random integer in the range 0 to 2^n − 1, inclusive }
+procedure mpz_urandomb(var rop: mpz_t; var state: randstate_t; n: valuint); cdecl; external LIB name '__gmpz_urandomb';
+{ Generate a uniform random integer in the range 0 to n − 1, inclusive }
+procedure mpz_urandomm(var rop: mpz_t; var state: randstate_t; var n: mpz_t); cdecl; external LIB name '__gmpz_urandomm';
+{ Set rop to op1 bitwise exclusive-or op2 }
+procedure mpz_xor(var rop, op1, op2: mpz_t); cdecl; external LIB name '__gmpz_xor';
+
+// ---- Rational Number Functions ----
+
+{ Set rop to the absolute value of op }
+procedure mpq_abs(var rop, op: mpq_t); cdecl; external LIB name '__gmpq_abs';
+{ Set sum to addend1 + addend2 }
+procedure mpq_add(var sum, addend1, addend2: mpq_t); cdecl; external LIB name '__gmpq_add';
+{ Remove any factors that are common to the numerator and denominator of op, and make the denominator positive }
+procedure mpq_canonicalize(var op: mpq_t); cdecl; external LIB name '__gmpq_canonicalize';
+{ Free the space occupied by rational number }
+procedure mpq_clear(var rational_number: mpq_t); cdecl; external LIB name '__gmpq_clear';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2 }
+function mpq_cmp(var op1, op2: mpq_t): longint; cdecl; external LIB name '__gmpq_cmp';
+{ Compare op1 and num2/den2. Return a positive value if op1 > num2/den2, zero if op1 = num2/den2, and a negative value if op1 < num2/den2 }
+function mpq_cmp_si(var op1: mpq_t; num2: valsint; den2: valuint): longint; cdecl; external LIB name '__gmpq_cmp_si';
+{ Compare op1 and num2/den2. Return a positive value if op1 > num2/den2, zero if op1 = num2/den2, and a negative value if op1 < num2/den2 }
+function mpq_cmp_ui(var op1: mpq_t; num2, den2: valuint): longint; cdecl; external LIB name '__gmpq_cmp_ui';
+{ Set quotient to dividend/divisor }
+procedure mpq_div(var quotient, dividend, divisor: mpq_t); cdecl; external LIB name '__gmpq_div';
+{ Set rop to op1/(2^op2) }
+procedure mpq_div_2exp(var rop, op1: mpq_t; op2: valuint); cdecl; external LIB name '__gmpq_div_2exp';
+{ Return non-zero if op1 and op2 are equal, zero if they are non-equal }
+function mpq_equal(var op1, op2: mpq_t): longint; cdecl; external LIB name '__gmpq_equal';
+{ Get the numerator of a rational }
+procedure mpq_get_num(var numerator: mpz_t; var rational: mpq_t); cdecl; external LIB name '__gmpq_get_num';
+{ Get the denominator of a rational }
+procedure mpq_get_den(var denominator: mpz_t; var rational: mpq_t); cdecl; external LIB name '__gmpq_get_den';
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero) }
+function mpq_get_d(var op: mpq_t): double; cdecl; external LIB name '__gmpq_get_d';
+{ Convert op to a string of digits in base base }
+function mpq_get_str(str: pchar; base: longint; var op: mpq_t): pchar; cdecl; external LIB name '__gmpq_get_str';
+{ Initialize dest rational and set it to 0/1 }
+procedure mpq_init(out dest_rational: mpq_t); cdecl; external LIB name '__gmpq_init';
+{ Set inverted_number to 1/number }
+procedure mpq_inv(var inverted_number, number: mpq_t); cdecl; external LIB name '__gmpq_inv';
+{ Set product to multiplier × multiplicand }
+procedure mpq_mul(var product, multiplier, multiplicand: mpq_t); cdecl; external LIB name '__gmpq_mul';
+{ Set rop to op1 × (2^op2) }
+procedure mpq_mul_2exp(var rop, op1: mpq_t; op2: valuint); cdecl; external LIB name '__gmpq_mul_2exp';
+{ Set negated_operand to −operand }
+procedure mpq_neg(var negated_operand, operand: mpq_t); cdecl; external LIB name '__gmpq_neg';
+{ Assign rop from op }
+procedure mpq_set(var rop, op: mpq_t); cdecl; external LIB name '__gmpq_set';
+{ Set rop to the value of op. There is no rounding, this conversion is exact. }
+procedure mpq_set_d(var rop: mpq_t; op: double); cdecl; external LIB name '__gmpq_set_d';
+{ Set the denominator of a rational }
+procedure mpq_set_den(var rational: mpq_t; var denominator: mpz_t); cdecl; external LIB name '__gmpq_set_den';
+{ Set rop to the value of op. There is no rounding, this conversion is exact. }
+procedure mpq_set_f(var rop: mpq_t; var op: mpf_t); cdecl; external LIB name '__gmpq_set_f';
+{ Set the numerator of a rational }
+procedure mpq_set_num(var rational: mpq_t; var numerator: mpz_t); cdecl; external LIB name '__gmpq_set_num';
+{ Set the value of rop to op1/op2 }
+procedure mpq_set_si(var rop: mpq_t; op1: valsint; op2: valuint); cdecl; external LIB name '__gmpq_set_si';
+{ Set rop from a null-terminated string str in the given base }
+function mpq_set_str(var rop: mpq_t; str: pchar; base: longint): longint; cdecl; external LIB name '__gmpq_set_str';
+{ Set the value of rop to op1/op2 }
+procedure mpq_set_ui(var rop: mpq_t; op1, op2: valuint); cdecl; external LIB name '__gmpq_set_ui';
+{ Assign rop from op }
+procedure mpq_set_z(var rop: mpq_t; var op: mpz_t); cdecl; external LIB name '__gmpq_set_z';
+{ Set difference to minuend − subtrahend }
+procedure mpq_sub(var difference, minuend, subtrahend: mpq_t); cdecl; external LIB name '__gmpq_sub';
+{ Swap the values rop1 and rop2 efficiently }
+procedure mpq_swap(var rop1, rop2: mpq_t); cdecl; external LIB name '__gmpq_swap';
+
+// ---- Floating-point Functions ----
+
+{ Set rop to the absolute value of op }
+procedure mpf_abs(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_abs';
+{ Set rop to op1 + op2 }
+procedure mpf_add(var rop, op1, op2: mpf_t); cdecl; external LIB name '__gmpf_add';
+{ Set rop to op1 + op2 }
+procedure mpf_add_ui(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_add_ui';
+{ Set rop to op rounded to the next higher integer }
+procedure mpf_ceil(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_ceil';
+{ Free the space occupied by x }
+procedure mpf_clear(var x: mpf_t); cdecl; external LIB name '__gmpf_clear';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function mpf_cmp(var op1, op2: mpf_t): longint; cdecl; external LIB name '__gmpf_cmp';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function mpf_cmp_d(var op1: mpf_t; op2: double): longint; cdecl; external LIB name '__gmpf_cmp_d';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function mpf_cmp_si(var op1: mpf_t; op2: valsint): longint; cdecl; external LIB name '__gmpf_cmp_si';
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function mpf_cmp_ui(var op1: mpf_t; op2: valuint): longint; cdecl; external LIB name '__gmpf_cmp_ui';
+{ Set rop to op1/op2 }
+procedure mpf_div(var rop, op1, op2: mpf_t); cdecl; external LIB name '__gmpf_div';
+{ Set rop to op1/(2^op2) }
+procedure mpf_div_2exp(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_div_2exp';
+{ Set rop to op1/op2 }
+procedure mpf_div_ui(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_div_ui';
+
+// GDB only: procedure mpf_dump(var _para1: mpf_t); cdecl; external LIB name '__gmpf_dump';
+
+{ Return non-zero if the first op3 bits of op1 and op2 are equal, zero otherwise }
+function mpf_eq(var op1, op2: mpf_t; op3: valuint): longint; cdecl; external LIB name '__gmpf_eq';
+{ Return non-zero if op would fit in the respective C data type, when truncated to an integer }
+function mpf_fits_sint_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_fits_sint_p';
+{ Return non-zero if op would fit in the respective C data type, when truncated to an integer }
+function mpf_fits_slong_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_fits_slong_p';
+{ Return non-zero if op would fit in the respective C data type, when truncated to an integer }
+function mpf_fits_sshort_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_fits_sshort_p';
+{ Return non-zero if op would fit in the respective C data type, when truncated to an integer }
+function mpf_fits_uint_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_fits_uint_p';
+{ Return non-zero if op would fit in the respective C data type, when truncated to an integer }
+function mpf_fits_ulong_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_fits_ulong_p';
+{ Return non-zero if op would fit in the respective C data type, when truncated to an integer }
+function mpf_fits_ushort_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_fits_ushort_p';
+{ Set rop to op rounded to the next lower }
+procedure mpf_floor(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_floor';
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero) }
+function mpf_get_d(var op: mpf_t): double; cdecl; external LIB name '__gmpf_get_d';
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero), and with an exponent returned separately }
+function mpf_get_d_2exp(out exp: valsint; var op: mpf_t): double; cdecl; external LIB name '__gmpf_get_d_2exp';
+{ Return the default precision actually used }
+function mpf_get_default_prec: valuint; cdecl; external LIB name '__gmpf_get_default_prec';
+{ Return the current precision of op, in bits }
+function mpf_get_prec(var op: mpf_t): valuint; cdecl; external LIB name '__gmpf_get_prec';
+{ Convert op to a long, truncating any fraction part }
+function mpf_get_si(var op: mpf_t): valsint; cdecl; external LIB name '__gmpf_get_si';
+{ Convert op to a string of digits in base base }
+function mpf_get_str(str: pchar; out exp: mp_exp_t; base: longint; ndigits: sizeuint; var op: mpf_t): pchar; cdecl; external LIB name '__gmpf_get_str';
+{ Convert op to a unsigned long, truncating any fraction part }
+function mpf_get_ui(var op: mpf_t): valuint; cdecl; external LIB name '__gmpf_get_ui';
+{ Initialize x to 0 }
+procedure mpf_init(out x: mpf_t); cdecl; external LIB name '__gmpf_init';
+{ Initialize x to 0 and set its precision to be at least prec bits }
+procedure mpf_init2(out x: mpf_t; prec: valuint); cdecl; external LIB name '__gmpf_init2';
+{ Initialize rop and set its value from op }
+procedure mpf_init_set(out rop: mpf_t; var op: mpf_t); cdecl; external LIB name '__gmpf_init_set';
+{ Initialize rop and set its value from op }
+procedure mpf_init_set_d(out rop: mpf_t; op: double); cdecl; external LIB name '__gmpf_init_set_d';
+{ Initialize rop and set its value from op }
+procedure mpf_init_set_si(out rop: mpf_t; op: valsint); cdecl; external LIB name '__gmpf_init_set_si';
+{ Initialize rop and set its value from the string in str }
+function mpf_init_set_str(out rop: mpf_t; str: pchar; base: longint): longint; cdecl; external LIB name '__gmpf_init_set_str';
+{ Initialize rop and set its value from op }
+procedure mpf_init_set_ui(out rop: mpf_t; op: valuint); cdecl; external LIB name '__gmpf_init_set_ui';
+{ Return non-zero if op is an integer }
+function mpf_integer_p(var op: mpf_t): longint; cdecl; external LIB name '__gmpf_integer_p';
+{ Set rop to op1 × op2 }
+procedure mpf_mul(var rop, op1, op2: mpf_t); cdecl; external LIB name '__gmpf_mul';
+{ Set rop to op1 × (2^op2) }
+procedure mpf_mul_2exp(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_mul_2exp';
+{ Set rop to op1 × op2 }
+procedure mpf_mul_ui(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_mul_ui';
+{ Set rop to −op }
+procedure mpf_neg(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_neg';
+{ Set rop to op1^op2 }
+procedure mpf_pow_ui(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_pow_ui';
+{ Generate a random float of at most max_size limbs, with long strings of zeros and ones in the binary representation }
+procedure mpf_random2(var rop: mpf_t; max_size: mp_size_t; exp: mp_exp_t); cdecl; external LIB name '__gmpf_random2';
+{ Compute the relative difference between op1 and op2 and store the result in rop }
+procedure mpf_reldiff(var rop, op1, op2: mpf_t); cdecl; external LIB name '__gmpf_reldiff';
+{ Set the value of rop from op }
+procedure mpf_set(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_set';
+{ Set the value of rop from op }
+procedure mpf_set_d(var rop: mpf_t; op: double); cdecl; external LIB name '__gmpf_set_d';
+{ Set the default precision to be at least prec bits }
+procedure mpf_set_default_prec(prec: valuint); cdecl; external LIB name '__gmpf_set_default_prec';
+{ Set the precision of rop to be at least prec bits }
+procedure mpf_set_prec(var rop: mpf_t; prec: valuint); cdecl; external LIB name '__gmpf_set_prec';
+{ Set the precision of rop to be at least prec bits, without changing the memory allocated }
+procedure mpf_set_prec_raw(var rop: mpf_t; prec: valuint); cdecl; external LIB name '__gmpf_set_prec_raw';
+{ Set the value of rop from op }
+procedure mpf_set_q(var rop: mpf_t; var op: mpq_t); cdecl; external LIB name '__gmpf_set_q';
+{ Set the value of rop from op }
+procedure mpf_set_si(var rop: mpf_t; op: valsint); cdecl; external LIB name '__gmpf_set_si';
+{ Set the value of rop from the string in str }
+function mpf_set_str(var rop: mpf_t; str: pchar; base: longint): longint; cdecl; external LIB name '__gmpf_set_str';
+{ Set the value of rop from op }
+procedure mpf_set_ui(var rop: mpf_t; op: valuint); cdecl; external LIB name '__gmpf_set_ui';
+{ Set the value of rop from op }
+procedure mpf_set_z(var rop: mpf_t; var op: mpz_t); cdecl; external LIB name '__gmpf_set_z';
+
+// No docs: function mpf_size(var _para1: mpf_t): size_t; cdecl; external LIB name '__gmpf_size';
+
+{ Set rop to op^(1/2) }
+procedure mpf_sqrt(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_sqrt';
+{ Set rop to op^(1/2) }
+procedure mpf_sqrt_ui(var rop: mpf_t; op: valuint); cdecl; external LIB name '__gmpf_sqrt_ui';
+{ Set rop to op1 − op2 }
+procedure mpf_sub(var rop, op1, op2: mpf_t); cdecl; external LIB name '__gmpf_sub';
+{ Set rop to op1 − op2 }
+procedure mpf_sub_ui(var rop, op1: mpf_t; op2: valuint); cdecl; external LIB name '__gmpf_sub_ui';
+{ Swap rop1 and rop2 efficiently }
+procedure mpf_swap(var rop1, rop2: mpf_t); cdecl; external LIB name '__gmpf_swap';
+{ Set rop to op rounded to the integer towards zero }
+procedure mpf_trunc(var rop, op: mpf_t); cdecl; external LIB name '__gmpf_trunc';
+{ Set rop to op1/op2 }
+procedure mpf_ui_div(var rop: mpf_t; op1: valuint; var op2: mpf_t); cdecl; external LIB name '__gmpf_ui_div';
+{ Set rop to op1 − op2 }
+procedure mpf_ui_sub(var rop: mpf_t; op1: valuint; var op2: mpf_t); cdecl; external LIB name '__gmpf_ui_sub';
+{ Generate a uniformly distributed random float in rop, such that 0 <= rop < 1, with nbits significant bits in the mantissa }
+procedure mpf_urandomb(var rop: mpf_t; var state: randstate_t; nbits: valuint); cdecl; external LIB name '__gmpf_urandomb';
+
+// ---- Low-level Functions ----
+
+{ Add [s1p, s1n] and [s2p, s2n], and write the s1n least significant limbs of the result to rp. Return carry, either 0 or 1. }
+function mpn_add(rop, s1p: mpn_ptr; s1n: mp_size_t; s2p: mpn_ptr; s2n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpn_add';
+{ Add [s1p, n] and s2limb, and write the n least significant limbs of the result to rp. Return carry, either 0 or 1. }
+function mpn_add_1(rp, s1p: mpn_ptr; n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_add_1';
+{ Add [s1p, n] and [s2p, n], and write the n least significant limbs of the result to rp. Return carry, either 0 or 1. }
+function mpn_add_n(rop, s1p, s2p: mpn_ptr; n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpn_add_n';
+{ Multiply [s1p, n] and s2limb, and add the n least significant limbs of the product to [rp, n] and write the result to rp. Return the most significant limb of the product, plus carry-out from the addition. }
+function mpn_addmul_1(rp, s1p: mpn_ptr; n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_addmul_1';
+
+{ Preliminary: This function puts the low floor(d/mp_bits_per_limb) limbs of q = [s1p, s1n]/[s2p, s2n] mod 2^d at rp, and returns the high d mod mp_bits_per_limb bits of q }
+// function mpn_bdivmod(rp, s1p: mpn_t; s1n: mp_size_t; s2p: mpn_t; s2n: mp_size_t; d: valuint): mp_limb_t; cdecl; external LIB name '__gmpn_bdivmod';
+
+{ Compare [s1p, n] and [s2p, n] and return a positive value if s1 > s2, 0 if they are equal, or a negative value if s1 < s2 }
+function mpn_cmp(s1p, s2p: mpn_ptr; n: mp_size_t): longint; cdecl; external LIB name '__gmpn_cmp';
+{ Divide [sp, n] by 3, expecting it to divide exactly, and writing the result to [rp, n] }
+function mpn_divexact_by3c(rp, sp: mpn_ptr; n: mp_size_t; carry: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_divexact_by3c';
+
+{ Obsolete: Divide [rs2p, rs2n] by [s3p, s3n], and write the quotient at r1p, with the exception of the most significant limb, which is returned }
+// function mpn_divrem(r1p: mpn_t; qxn: mp_size_t; rs2p: mpn_t; rs2n: mp_size_t; s3p: mpn_t; s3n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpn_divrem';
+
+{ Divide [s2p, s2n] by s3limb, and write the quotient at r1p. Return the remainder }
+function mpn_divrem_1(r1p: mpn_ptr; qxn: mp_size_t; s2p: mpn_ptr; s2n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_divrem_1';
+
+// No docs: function mpn_divrem_2(_para1: mpn_t; _para2: mp_size_t; _para3: mpn_t; _para4: mp_size_t; _para5: mpn_t): mp_limb_t; cdecl; external LIB name '__gmpn_divrem_2';
+
+{ Set [rp, retval] to the greatest common divisor of [s1p, s1n] and [s2p, s2n] }
+function mpn_gcd(rp, s1p: mpn_ptr; s1n: mp_size_t; s2p: mpn_ptr; s2n: mp_size_t): mp_size_t; cdecl; external LIB name '__gmpn_gcd';
+{ Return the greatest common divisor of [s1p, s1n] and s2limb }
+function mpn_gcd_1(s1p: mpn_ptr; s1n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_gcd_1';
+{ Calculate the greatest common divisor of [s1p, s1n] and [s2p, s2n] }
+function mpn_gcdext(r1p, r2p: mpn_ptr; out r2n: mp_size_t; s1p: mpn_ptr; s1n: mp_size_t; s2p: mpn_ptr; s2n: mp_size_t): mp_size_t; cdecl; external LIB name '__gmpn_gcdext';
+{ Convert [s1p, s1n] to a raw unsigned char array at str in base base, and return the number of characters produced }
+function mpn_get_str(str: pbyte; base: longint; s1p: mpn_ptr; s1n: mp_size_t):sizeuint; cdecl; external LIB name '__gmpn_get_str';
+{ Compute the hamming distance between [s1p, n] and [s2p, n], which is the number of bit positions where the two operands have different bit values }
+function mpn_hamdist(s1p, s2p: mpn_ptr; n: mp_size_t): valuint; cdecl; external LIB name '__gmpn_hamdist';
+{ Shift [sp, n] left by count bits, and write the result to [rp, n] }
+function mpn_lshift(rp, sp: mpn_ptr; n: mp_size_t; count: dword): mp_limb_t; cdecl; external LIB name '__gmpn_lshift';
+{ Divide [s1p, s1n] by s2limb, and return the remainder. s1n can be zero. }
+function mpn_mod_1(s1p: mpn_ptr; s1n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_mod_1';
+{ Multiply [s1p, s1n] and [s2p, s2n], and write the result to rp. Return the most significant limb of the result. }
+function mpn_mul(rp, s1p: mpn_ptr; s1n: mp_size_t; s2p: mpn_ptr; s2n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpn_mul';
+{ Multiply [s1p, n] by s2limb, and write the n least significant limbs of the product to rp. Return the most significant limb of the product. }
+function mpn_mul_1(rp, s1p: mpn_ptr; n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_mul_1';
+{ Multiply [s1p, n] and [s2p, n], and write the 2*n-limb result to rp }
+procedure mpn_mul_n(rp, s1p, s2p: mpn_ptr; n: mp_size_t); cdecl; external LIB name '__gmpn_mul_n';
+{ Return non-zero iff [s1p, n] is a perfect square }
+function mpn_perfect_square_p(s1p: mpn_ptr; n: mp_size_t): longint; cdecl; external LIB name '__gmpn_perfect_square_p';
+{ Count the number of set bits in [s1p, n] }
+function mpn_popcount(s1p: mpn_ptr; n: mp_size_t): valuint; cdecl; external LIB name '__gmpn_popcount';
+
+// No docs: function mpn_pow_1(_para1, _para2: mpn_t; _para3: mp_size_t; _para4, _para5: mpn_t): mp_size_t; cdecl; external LIB name '__gmpn_pow_1';
+// No docs: function mpn_preinv_mod_1(_para1: mpn_t; _para2: mp_size_t; _para3, _para4: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_preinv_mod_1';
+
+{ Generate a random number of length r1n and store it at r1p }
+procedure mpn_random(r1p: mpn_ptr; r1n: mp_size_t); cdecl; external LIB name '__gmpn_random';
+{ Generate a random number of length r1n and store it at r1p }
+procedure mpn_random2(r1p: mpn_ptr; r1n: mp_size_t); cdecl; external LIB name '__gmpn_random2';
+{ Shift [sp, n] right by count bits, and write the result to [rp, n] }
+function mpn_rshift(rp, sp: mpn_ptr; n: mp_size_t; count: dword): mp_limb_t; cdecl; external LIB name '__gmpn_rshift';
+{ Scan s1p from bit position bit for the next clear bit }
+function mpn_scan0(s1p: mpn_ptr; bit: valuint): valuint; cdecl; external LIB name '__gmpn_scan0';
+{ Scan s1p from bit position bit for the next set bit }
+function mpn_scan1(s1p: mpn_ptr; bit: valuint): valuint; cdecl; external LIB name '__gmpn_scan1';
+{ Convert bytes [str,strsize] in the given base to limbs at rp }
+function mpn_set_str(rp: mpn_ptr; str: pbyte; strsize: sizeuint; base:longint): mp_size_t; cdecl; external LIB name '__gmpn_set_str';
+{ Compute the square root of [sp, n] and put the result at [r1p, dn/2e] and the remainder at [r2p, retval] }
+function mpn_sqrtrem(r1p, r2p, sp: mpn_ptr; n: mp_size_t): mp_size_t; cdecl; external LIB name '__gmpn_sqrtrem';
+{ Subtract [s2p, s2n] from [s1p, s1n], and write the s1n least significant limbs of the result to rp. Return borrow, either 0 or 1. }
+function mpn_sub(rp, s1p: mpn_ptr; s1n: mp_size_t; s2p: mpn_ptr; s2n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpn_sub';
+{ Subtract s2limb from [s1p, n], and write the n least significant limbs of the result to rp. Return borrow, either 0 or 1. }
+function mpn_sub_1(rp, s1p: mpn_ptr; n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_sub_1';
+{ Subtract [s2p, n] from [s1p, n], and write the n least significant limbs of the result to rp. Return borrow, either 0 or 1. }
+function mpn_sub_n(rp, s1p, s2p: mpn_ptr; n: mp_size_t): mp_limb_t; cdecl; external LIB name '__gmpn_sub_n';
+{ Multiply [s1p, n] and s2limb, and subtract the n least significant limbs of the product from [rp, n] and write the result to rp. Return the most significant limb of the product, plus borrow-out from the subtraction. }
+function mpn_submul_1(rp, s1p: mpn_ptr; n: mp_size_t; s2limb: mp_limb_t): mp_limb_t; cdecl; external LIB name '__gmpn_submul_1';
+{ Divide [np, nn] by [dp, dn] and put the quotient at [qp, nn−dn+1] and the remainder at [rp, dn] }
+procedure mpn_tdiv_qr(qp, rp: mpn_ptr; qxn: mp_size_t; np: mpn_ptr; nn: mp_size_t; dp: mpn_ptr; dn: mp_size_t); cdecl; external LIB name '__gmpn_tdiv_qr';
+
+// ---- GMP properties ----
+
+{ Size of a limb on this machine }
+function bits_per_limb: longint;
+{ Some GMP functions may set this thread unsafe variable. Better avoid using it. }
+function errno: longint;
+{ GMP version string a.b.c }
+function version: string;
+
+// ==== ext bindings =====
+
+// ---- Random Number Functions ----
+
+{ Initialize state with a default algorithm }
+procedure randinit_default(out state: MPRandState);
+{ Initialize state with a linear congruential algorithm X = (aX + c) mod 2^m2exp }
+procedure randinit_lc_2exp(out state: MPRandState; var a: MPInteger; c, m2exp: valuint);
+{ Initialize state for a linear congruential algorithm as per gmp_randinit_lc_2exp }
+function randinit_lc_2exp_size(out state: MPRandState; size: sizeuint): boolean;
+{ Initialize state for a Mersenne Twister algorithm }
+procedure randinit_mt(out state: MPRandState);
+{ Initialize rop with a copy of the algorithm and state from op }
+procedure randinit_set(out rop: MPRandState; var op: MPRandState);
+{ Set an initial seed value into state }
+procedure randseed(var state: MPRandState; var seed: MPInteger);
+{ Set an initial seed value into state }
+procedure randseed_ui(var state: MPRandState; seed: valuint);
+{ Free all memory occupied by state }
+procedure randclear(var state: MPRandState);
+{ Return an uniformly distributed random number of n bits, ie. in the range 0 to 2^n−1 inclusive }
+function urandomb_ui(var state: MPRandState; n: valuint): valuint;
+{ Return an uniformly distributed random number in the range 0 to n − 1, inclusive }
+function urandomm_ui(var state: MPRandState; n: valuint): valuint;
+
+// ---- integer Functions ----
+
+{ Change the space for integer to new_alloc limbs }
+function z_realloc(var integer_: MPInteger; new_alloc: mp_size_t): pointer;
+{ Set rop to the absolute value of op }
+procedure z_abs(var rop, op: MPInteger);
+{ Return the absolute value of op }
+function z_abs(var op: MPInteger): MPInteger;
+{ Set rop to op1 + op2 }
+procedure z_add(var rop, op1, op2: MPInteger);
+{ Return op1 + op2 }
+function z_add(var op1, op2: MPInteger): MPInteger;
+{ Set rop to op1 + op2 }
+procedure z_add_ui(var rop, op1: MPInteger; op2: valuint);
+{ Return op1 + op2 }
+function z_add_ui(var op1: MPInteger; op2: valuint): MPInteger;
+{ Set rop to rop + op1 × op2 }
+procedure z_addmul(var rop, op1, op2: MPInteger);
+{ Set rop to rop + op1 × op2 }
+procedure z_addmul_ui(var rop, op1: MPInteger; op2: valuint);
+{ Set rop to op1 bitwise-and op2 }
+procedure z_and(var rop, op1, op2: MPInteger);
+{ Return op1 bitwise-and op2 }
+function z_and(var op1, op2: MPInteger): MPInteger;
+//{ _Fixed_ space of fixed_num_bits is allocated to each of the array size integers in integer array }
+//procedure z_array_init(var integer_array: MPInteger; array_size, fixed_num_bits: mp_size_t);
+{ Compute the binomial coefficient (n over k) and store the result in rop }
+procedure z_bin_ui(var rop, n: MPInteger; k: valuint);
+{ Return the binomial coefficient (n over k) }
+function z_bin_ui(var n: MPInteger; k: valuint): MPInteger;
+{ Compute the binomial coefficient (n over k) and store the result in rop }
+procedure z_bin_uiui(var rop: MPInteger; n, k: valuint);
+{ Return the binomial coefficient (n over k) }
+function z_bin_uiui(n, k: valuint): MPInteger;
+{ Divide n by d, forming a quotient q. Round mode ceil. }
+procedure z_cdiv_q(var q, n, d: MPInteger);
+{ Divide n by d, forming a return quotient. Round mode ceil. }
+function z_cdiv_q(var n, d: MPInteger): MPInteger;
+{ Divide n by d, forming a quotient q. d = 2^b. Round mode ceil. }
+procedure z_cdiv_q_2exp(var q, n: MPInteger; b: valuint);
+{ Divide n by d, forming a return quotient. d = 2^b. Round mode ceil. }
+function z_cdiv_q_2exp(var n: MPInteger; b: valuint): MPInteger;
+{ Divide n by d, forming a quotient q. Round mode ceil. }
+function z_cdiv_q_ui(var q, n: MPInteger; d: valuint): valuint;
+{ Divide n by d, forming a quotient q and remainder r. Round mode ceil. }
+procedure z_cdiv_qr(var q, r, n, d: MPInteger);
+{ Divide n by d, forming a quotient q and remainder r. Round mode ceil. }
+function z_cdiv_qr_ui(var q, r, n: MPInteger; d: valuint): valuint;
+{ Divide n by d, forming a remainder r. Round mode ceil. }
+procedure z_cdiv_r(var r, n, d: MPInteger);
+{ Divide n by d, forming a return remainder. Round mode ceil. }
+function z_cdiv_r(var n, d: MPInteger): MPInteger;
+{ Divide n by d, forming a remainder r. d = 2^b. Round mode ceil. }
+procedure z_cdiv_r_2exp(var r, n: MPInteger; b: valuint);
+{ Divide n by d, forming a return remainder. d = 2^b. Round mode ceil. }
+function z_cdiv_r_2exp(var n: MPInteger; b: valuint): MPInteger;
+{ Divide n by d, forming a remainder r. Round mode ceil. }
+function z_cdiv_r_ui(var r, n: MPInteger; d: valuint): valuint;
+{ Divide n by d. Round mode ceil. }
+function z_cdiv_ui(var n: MPInteger; d: valuint): valuint;
+{ Free the space occupied by integer. Call this function for all MPInteger variables when you are done with them. }
+procedure z_clear(var integer_: MPInteger);
+{ Clear bit bit_index in rop }
+procedure z_clrbit(var rop: MPInteger; bit_index: valuint);
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function z_cmp(var op1, op2: MPInteger): longint;
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function z_cmp_d(var op1: MPInteger; op2: double): longint;
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function z_cmp_si(var op1: MPInteger; op2: valsint): longint;
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, or a negative value if op1 < op2. }
+function z_cmp_ui(var op1: MPInteger; op2: valuint): longint;
+{ Compare the absolute values of op1 and op2. Return a positive value if |op1| > |op2|, zero if |op1| = |op2|, or a negative value if |op1| < |op2|. }
+function z_cmpabs(var op1, op2: MPInteger): longint;
+{ Compare the absolute values of op1 and op2. Return a positive value if |op1| > |op2|, zero if |op1| = |op2|, or a negative value if |op1| < |op2|. }
+function z_cmpabs_d(var op1: MPInteger; op2: double): longint;
+{ Compare the absolute values of op1 and op2. Return a positive value if |op1| > |op2|, zero if |op1| = |op2|, or a negative value if |op1| < |op2|. }
+function z_cmpabs_ui(var op1: MPInteger; op2: valuint): longint;
+{ Set rop to the one’s complement of op }
+procedure z_com(var rop, op: MPInteger);
+{ Return the one’s complement of op }
+function z_com(var op: MPInteger): MPInteger;
+{ Complement bit bit_index in rop }
+procedure z_combit(var rop: MPInteger; bit_index: valuint);
+{ Return true if n is congruent to c modulo d }
+function z_congruent_p(var n, c, d: MPInteger): boolean;
+{ Return true if n is congruent to c modulo 2^b }
+function z_congruent_2exp_p(var n, c: MPInteger; b: valuint): boolean;
+{ Return true if n is congruent to c modulo d }
+function z_congruent_ui_p(var n: MPInteger; c, d: valuint): boolean;
+{ Set q to n/d }
+procedure z_divexact(var q, n, d: MPInteger);
+{ Return n/d }
+function z_divexact(var n, d: MPInteger): MPInteger;
+{ Set q to n/d }
+procedure z_divexact_ui(var q, n: MPInteger; d: valuint);
+{ Return n/d }
+function z_divexact_ui(var n: MPInteger; d: valuint): MPInteger;
+{ Return true if n is exactly divisible by d }
+function z_divisible_p(var n, d: MPInteger): boolean;
+{ Return true if n is exactly divisible by d }
+function z_divisible_ui_p(var n: MPInteger; d: valuint): boolean;
+{ Return true if n is exactly divisible by by 2^b }
+function z_divisible_2exp_p(var n: MPInteger; b: valuint): boolean;
+{ Fill buf with word data from op }
+function z_export(out buf; out countp: sizeuint; order: longint; size: sizeuint; endian: longint; nails: sizeuint; var op: MPInteger): pointer;
+{ Set rop to op!, the factorial of op }
+procedure z_fac_ui(var rop: MPInteger; op: valuint);
+{ Return op!, the factorial of op }
+function z_fac_ui(op: valuint): MPInteger;
+{ Divide n by d, forming a quotient q. Round mode floor. }
+procedure z_fdiv_q(var q, n, d: MPInteger);
+{ Divide n by d, forming a return quotient. Round mode floor. }
+function z_fdiv_q(var n, d: MPInteger): MPInteger;
+{ Divide n by d, forming a quotient q. d = 2^b. Round mode floor. }
+procedure z_fdiv_q_2exp(var q, n: MPInteger; b: valuint);
+{ Divide n by d, forming a return quotient. d = 2^b. Round mode floor. }
+function z_fdiv_q_2exp(var n: MPInteger; b: valuint): MPInteger;
+{ Divide n by d, forming a quotient q. Round mode floor. }
+function z_fdiv_q_ui(var q, n: MPInteger; d: valuint): valuint;
+{ Divide n by d, forming a quotient q and remainder r. Round mode floor. }
+procedure z_fdiv_qr(var q, r, n, d: MPInteger);
+{ Divide n by d, forming a quotient q and remainder r. Round mode floor. }
+function z_fdiv_qr_ui(var q, r, n: MPInteger; d: valuint): valuint;
+{ Divide n by d, forming a remainder r. Round mode floor. }
+procedure z_fdiv_r(var r, n, d: MPInteger);
+{ Divide n by d, forming a return remainder. Round mode floor. }
+function z_fdiv_r(var n, d: MPInteger): MPInteger;
+{ Divide n by d, forming a remainder r. d = 2^b. Round mode floor. }
+procedure z_fdiv_r_2exp(var r, n: MPInteger; b: valuint);
+{ Divide n by d, forming a return remainder. d = 2^b. Round mode floor. }
+function z_fdiv_r_2exp(var n: MPInteger; b: valuint): MPInteger;
+{ Divide n by d, forming a remainder r. Round mode floor. }
+function z_fdiv_r_ui(var r, n: MPInteger; d: valuint): valuint;
+{ Divide n by d. Round mode floor. }
+function z_fdiv_ui(var n: MPInteger; d: valuint): valuint;
+{ Set fn to to Fn, the n’th Fibonacci number }
+procedure z_fib_ui(var fn: MPInteger; n: valuint);
+{ Return Fn, the n’th Fibonacci number }
+function z_fib_ui(n: valuint): MPInteger;
+{ Set fn to Fn, and fnsub1 to Fn−1 }
+procedure z_fib2_ui(var fn, fnsub1: MPInteger; n: valuint);
+{ Return Fn, and fnsub1 = Fn−1 }
+function z_fib2_ui(var fnsub1: MPInteger; n: valuint): MPInteger;
+{ Return true iff the value of op fits in an signed int }
+function z_fits_sint_p(var op: MPInteger): boolean;
+{ Return true iff the value of op fits in an signed long int }
+function z_fits_slong_p(var op: MPInteger): boolean;
+{ Return true iff the value of op fits in an signed short int }
+function z_fits_sshort_p(var op: MPInteger): boolean;
+{ Return true iff the value of op fits in an unsigned int }
+function z_fits_uint_p(var op: MPInteger): boolean;
+{ Return true iff the value of op fits in an unsigned long int }
+function z_fits_ulong_p(var op: MPInteger): boolean;
+{ Return true iff the value of op fits in an unsigned short int }
+function z_fits_ushort_p(var op: MPInteger): boolean;
+{ Set rop to the greatest common divisor of op1 and op2 }
+procedure z_gcd(var rop, op1, op2: MPInteger);
+{ Return the greatest common divisor of op1 and op2 }
+function z_gcd(var op1, op2: MPInteger): MPInteger;
+{ Compute the greatest common divisor of op1 and op2 }
+function z_gcd_ui(var rop, op1: MPInteger; op2: valuint): valuint;
+{ Set g to the greatest common divisor of a and b, and in addition set s and t to coefficients satisfying as + bt = g }
+procedure z_gcdext(var g, s, t, a, b: MPInteger);
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero) }
+function z_get_d(var op: MPInteger): double;
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero), and returning the exponent separately }
+function z_get_d_2exp(out exp: valsint; var op: MPInteger): double;
+{ Return the value of op as a signed long }
+function z_get_si(op: MPInteger): valsint;
+{ Convert op to a string of digits in base base. The base argument may vary from 2 to 62 or from −2 to −36. }
+function z_get_str(base: longint; var op: MPInteger): string;
+{ Convert op to a string of digits in base base. The base argument may vary from 2 to 62 or from −2 to −36. If str is NULL, the result string is allocated using the current allocation function }
+function z_get_str(str: pchar; base: longint; var op: MPInteger): pchar;
+{ Return the value of op as an unsigned long }
+function z_get_ui(op: MPInteger): valuint;
+{ Return limb number n from op }
+function z_getlimbn(var op: MPInteger; n: mp_size_t): mp_limb_t;
+{ If op1 and op2 are both >= 0 or both < 0, return the hamming distance between the two operands, which is the number of bit positions where op1 and op2 have different bit values }
+function z_hamdist(var op1, op2: MPInteger): valuint;
+{ Set rop from an array of word data at op }
+procedure z_import(var rop: MPInteger; count: sizeuint; order: longint; size: sizeuint; endian: longint; nails: sizeuint; const op);
+{ Initialize integer, and set its value to 0 }
+procedure z_init(out integer_: MPInteger);
+{ Initialize integer, with space for n bits, and set its value to 0 }
+procedure z_init2(out integer_: MPInteger; n: valuint);
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure z_init_set(out rop: MPInteger; var op: MPInteger);
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure z_init_set_d(out rop: MPInteger; op: double);
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure z_init_set_si(out rop: MPInteger; op: valsint);
+{ Initialize rop and set its value like z_set_str. If the string is a correct base base number, the function returns true. }
+function z_init_set_str(out rop: MPInteger; str: string; base: longint): boolean;
+{ Initialize rop with limb space and set the initial numeric value from op }
+procedure z_init_set_ui(out rop: MPInteger; op: valuint);
+{ Compute the inverse of op1 modulo op2 and put the result in rop }
+function z_invert(var rop, op1, op2: MPInteger): longint;
+{ Set rop to op1 bitwise inclusive-or op2 }
+procedure z_ior(var rop, op1, op2: MPInteger);
+{ Return bitwise inclusive-or op2 }
+function z_ior(var op1, op2: MPInteger): MPInteger;
+{ Calculate the Jacobi symbol. This is defined only for b odd }
+function z_jacobi(var a, b: MPInteger): longint;
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function z_kronecker_si(var a: MPInteger; b: valsint): longint;
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function z_kronecker_ui(var a: MPInteger; b: valuint): longint;
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function z_si_kronecker(a: valsint; var b: MPInteger): longint;
+{ Calculate the Jacobi symbol with the Kronecker extension }
+function z_ui_kronecker(a: valuint; var b: MPInteger): longint;
+{ Set rop to the least common multiple of op1 and op2 }
+procedure z_lcm(var rop, op1, op2: MPInteger);
+{ Return the least common multiple of op1 and op2 }
+function z_lcm(var op1, op2: MPInteger): MPInteger;
+{ Set rop to the least common multiple of op1 and op2 }
+procedure z_lcm_ui(var rop, op1: MPInteger; op2: valuint);
+{ Return the least common multiple of op1 and op2 }
+function z_lcm_ui(var op1: MPInteger; op2: valuint): MPInteger;
+{ Set ln to to Ln, the n’th Lucas number }
+procedure z_lucnum_ui(var ln: MPInteger; n: valuint);
+{ Return Ln, the n’th Lucas number }
+function z_lucnum_ui(n: valuint): MPInteger;
+{ Set ln to Ln, and lnsub1 to Ln−1 }
+procedure z_lucnum2_ui(var ln, lnsub1: MPInteger; n: valuint);
+{ Return Ln, and lnsub1 to Ln−1 }
+function z_lucnum2_ui(var lnsub1: MPInteger; n: valuint): MPInteger;
+{ Set r to n mod d. The sign of the divisor is ignored; the result is always non-negative. }
+procedure z_mod(var r, n, d: MPInteger);
+{ Return n mod d. The sign of the divisor is ignored; the result is always non-negative. }
+function z_mod(var n, d: MPInteger): MPInteger;
+{ Set rop to op1 × op2 }
+procedure z_mul(var rop, op1, op2: MPInteger);
+{ Return op1 × op2 }
+function z_mul(var op1, op2: MPInteger): MPInteger;
+{ Set rop to op1 × 2^op2. This operation can also be defined as a left shift by op2 bits. }
+procedure z_mul_2exp(var rop, op1: MPInteger; op2: valuint);
+{ Return op1 × 2^op2. This operation can also be defined as a left shift by op2 bits. }
+function z_mul_2exp(var op1: MPInteger; op2: valuint): MPInteger;
+{ Set rop to op1 × op2 }
+procedure z_mul_si(var rop, op1: MPInteger; op2: valsint);
+{ Return op1 × op2 }
+function z_mul_si(var op1: MPInteger; op2: valsint): MPInteger;
+{ Set rop to op1 × op2 }
+procedure z_mul_ui(var rop, op1: MPInteger; op2: valuint);
+{ Return op1 × op2 }
+function z_mul_ui(var op1: MPInteger; op2: valuint): MPInteger;
+{ Set rop to −op }
+procedure z_neg(var rop, op: MPInteger);
+{ Return −op }
+function z_neg(var op: MPInteger): MPInteger;
+{ Set rop to the next prime greater than op }
+procedure z_nextprime(var rop, op: MPInteger);
+{ Return the next prime greater than op }
+function z_nextprime(var op: MPInteger): MPInteger;
+{ Return true if op is a perfect power, i.e., if there exist integers a and b, with b > 1, such that op = a^b }
+function z_perfect_power_p(var op: MPInteger): boolean;
+{ Return true if op is a perfect square, i.e., if the square root of op is an integer }
+function z_perfect_square_p(var op: MPInteger): boolean;
+{ If op >= 0, return the population count of op, which is the number of 1 bits in the binary representation }
+function z_popcount(var op: MPInteger): valuint;
+{ Set rop to base^exp. The case 0^0 yields 1. }
+procedure z_pow_ui(var rop, base: MPInteger; exp: valuint);
+{ Return base^exp. The case 0^0 yields 1. }
+function z_pow_ui(var base: MPInteger; exp: valuint): MPInteger;
+{ Set rop to base^exp mod mod_ }
+procedure z_powm(var rop, base, exp, mod_: MPInteger);
+{ Return base^exp mod mod_ }
+function z_powm(var base, exp, mod_: MPInteger): MPInteger;
+{ Set rop to base^exp mod mod_ }
+procedure z_powm_ui(var rop, base: MPInteger; exp: valuint; var mod_: MPInteger);
+{ Return base^exp mod mod_ }
+function z_powm_ui(var base: MPInteger; exp: valuint; var mod_: MPInteger): MPInteger;
+{ Determine whether n is prime. Return 2 if n is definitely prime, return 1 if n is probably prime (without being certain), or return 0 if n is definitely composite. }
+function z_probab_prime_p(var n: MPInteger; reps: longint): longint;
+{ Change the space allocated for integer to n bits. The value in integer is preserved if it fits, or is set to 0 if not. }
+procedure z_realloc2(var integer_: MPInteger; n: valuint);
+{ Remove all occurrences of the factor f from op and store the result in rop }
+function z_remove(var rop, op, f: MPInteger): valuint;
+{ Set rop to trunc(op^(1/n)), the truncated integer part of the nth root of op. Return true if the computation was exact, i.e., if op is rop to the nth power. }
+function z_root(var rop, op: MPInteger; n: valuint): boolean;
+{ Set root to trunc(u^(1/n)), the truncated integer part of the nth root of u. Set rem to the remainder, (u − root^n). }
+procedure z_rootrem(var root, rem, u: MPInteger; n: valuint);
+{ Generate a random integer with long strings of zeros and ones in the binary representation }
+procedure z_rrandomb(var rop: MPInteger; var state: MPRandState; n: valuint);
+{ Return a random integer with long strings of zeros and ones in the binary representation }
+function z_rrandomb(var state: MPRandState; n: valuint): MPInteger;
+{ Scan op, starting from bit starting_bit, towards more significant bits, until the first 0 bit is found }
+function z_scan0(var op: MPInteger; starting_bit: valuint): valuint;
+{ Scan op, starting from bit starting_bit, towards more significant bits, until the first 1 bit is found }
+function z_scan1(var op: MPInteger; starting_bit: valuint): valuint;
+{ Set the value of rop from op }
+procedure z_set(var rop, op: MPInteger);
+{ Set the value of rop from op }
+procedure z_set_d(var rop: MPInteger; op: double);
+{ Set the value of rop from op }
+procedure z_set_f(var rop: MPInteger; var op: MPFloat);
+{ Set the value of rop from op }
+procedure z_set_q(var rop: MPInteger; var op: MPRational);
+{ Set the value of rop from op }
+procedure z_set_si(var rop: MPInteger; op: valsint);
+{ Set the value of rop from str, a null-terminated C string in base base. If the string is a correct base base number, the function returns true. }
+function z_set_str(var rop: MPInteger; str: string; base: longint): boolean;
+{ Set the value of rop from op }
+procedure z_set_ui(var rop: MPInteger; op: valuint);
+{ Set bit bit_index in rop }
+procedure z_setbit(var rop: MPInteger; bit_index: valuint);
+{ Return the size of op measured in number of limbs }
+function z_size(var op: MPInteger): sizeuint;
+{ Return the size of op measured in number of digits in the given base }
+function z_sizeinbase(var op: MPInteger; base: longint): sizeuint;
+{ Set rop to trunc(sqrt(op)), the truncated integer part of the square root of op }
+procedure z_sqrt(var rop, op: MPInteger);
+{ Return trunc(sqrt(op)), the truncated integer part of the square root of op }
+function z_sqrt(var op: MPInteger): MPInteger;
+{ Set rop1 to trunc(sqrt(op)), like z_sqrt. Set rop2 to the remainder (op − rop1^2), which will be zero if op is a perfect square. }
+procedure z_sqrtrem(var rop1, rop2, op: MPInteger);
+{ Set rop to op1 − op2 }
+procedure z_sub(var rop, op1, op2: MPInteger);
+{ Return op1 − op2 }
+function z_sub(var op1, op2: MPInteger): MPInteger;
+{ Set rop to op1 − op2 }
+procedure z_sub_ui(var rop, op1: MPInteger; op2: valuint);
+{ Return op1 − op2 }
+function z_sub_ui(var op1: MPInteger; op2: valuint): MPInteger;
+{ Set rop to op1 − op2 }
+procedure z_ui_sub(var rop: MPInteger; op1: valuint; var op2: MPInteger);
+{ Return op1 − op2 }
+function z_ui_sub(op1: valuint; var op2: MPInteger): MPInteger;
+{ Set rop to rop − op1 × op2 }
+procedure z_submul(var rop, op1, op2: MPInteger);
+{ Set rop to rop − op1 × op2 }
+procedure z_submul_ui(var rop, op1: MPInteger; op2: valuint);
+{ Swap the values rop1 and rop2 efficiently }
+procedure z_swap(var rop1, rop2: MPInteger);
+{ Divide n by d, forming a quotient q. Round mode trunc. }
+procedure z_tdiv_q(var q, n, d: MPInteger);
+{ Divide n by d, forming a return quotient. Round mode trunc. }
+function z_tdiv_q(var n, d: MPInteger): MPInteger;
+{ Divide n by d, forming a quotient q. d = 2^b. Round mode trunc. }
+procedure z_tdiv_q_2exp(var q, n: MPInteger; b: valuint);
+{ Divide n by d, forming a return quotient. d = 2^b. Round mode trunc. }
+function z_tdiv_q_2exp(var n: MPInteger; b: valuint): MPInteger;
+{ Divide n by d, forming a quotient q. Round mode trunc. }
+function z_tdiv_q_ui(var q, n: MPInteger; d: valuint): valuint;
+{ Divide n by d, forming a quotient q and remainder r. Round mode trunc. }
+procedure z_tdiv_qr(var q, r, n, d: MPInteger);
+{ Divide n by d, forming a quotient q and remainder r. Round mode trunc. }
+function z_tdiv_qr_ui(var q, r, n: MPInteger; d: valuint): valuint;
+{ Divide n by d, forming a remainder r. Round mode trunc. }
+procedure z_tdiv_r(var r, n, d: MPInteger);
+{ Divide n by d, forming a return remainder. Round mode trunc. }
+function z_tdiv_r(var n, d: MPInteger): MPInteger;
+{ Divide n by d, forming a remainder r. d = 2^b. Round mode trunc. }
+procedure z_tdiv_r_2exp(var r, n: MPInteger; b: valuint);
+{ Divide n by d, forming a return remainder. d = 2^b. Round mode trunc. }
+function z_tdiv_r_2exp(var n: MPInteger; b: valuint): MPInteger;
+{ Divide n by d, forming a remainder r. Round mode trunc. }
+function z_tdiv_r_ui(var r, n: MPInteger; d: valuint): valuint;
+{ Divide n by d. Round mode trunc. }
+function z_tdiv_ui(var n: MPInteger; d: valuint): valuint;
+{ Test bit bit_index in op and return true or false accordingly }
+function z_tstbit(var rop: MPInteger; bit_index: valuint): boolean;
+{ Set rop to base^exp. The case 0^0 yields 1 }
+procedure z_ui_pow_ui(var rop: MPInteger; base, exp: valuint);
+{ Return base^exp. The case 0^0 yields 1 }
+function z_ui_pow_ui(base, exp: valuint): MPInteger;
+{ Generate a uniformly distributed random integer in the range 0 to 2^n − 1, inclusive }
+procedure z_urandomb(var rop: MPInteger; var state: MPRandState; n: valuint);
+{ Return a uniformly distributed random integer in the range 0 to 2^n − 1, inclusive }
+function z_urandomb(var state: MPRandState; n: valuint): MPInteger;
+{ Generate a uniform random integer in the range 0 to n − 1, inclusive }
+procedure z_urandomm(var rop: MPInteger; var state: MPRandState; var n: MPInteger);
+{ Return a uniform random integer in the range 0 to n − 1, inclusive }
+function z_urandomm(var state: MPRandState; var n: MPInteger): MPInteger;
+{ Set rop to op1 bitwise exclusive-or op2 }
+procedure z_xor(var rop, op1, op2: MPInteger);
+{ Retuen op1 bitwise exclusive-or op2 }
+function z_xor(var op1, op2: MPInteger): MPInteger;
+
+// ---- Rational Number Functions ----
+
+{ Set rop to the absolute value of op }
+procedure q_abs(var rop, op: MPRational);
+{ Return absolute value of op }
+function q_abs(var op: MPRational): MPRational;
+{ Set sum to addend1 + addend2 }
+procedure q_add(var sum, addend1, addend2: MPRational);
+{ Return addend1 + addend2 }
+function q_add(var addend1, addend2: MPRational): MPRational;
+{ Remove any factors that are common to the numerator and denominator of op, and make the denominator positive }
+procedure q_canonicalize(var op: MPRational);
+{ Free the space occupied by rational number }
+procedure q_clear(var rational_number: MPRational);
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2 }
+function q_cmp(var op1, op2: MPRational): longint;
+{ Compare op1 and num2/den2. Return a positive value if op1 > num2/den2, zero if op1 = num2/den2, and a negative value if op1 < num2/den2 }
+function q_cmp_si(var op1: MPRational; num2: valsint; den2: valuint): longint;
+{ Compare op1 and num2/den2. Return a positive value if op1 > num2/den2, zero if op1 = num2/den2, and a negative value if op1 < num2/den2 }
+function q_cmp_ui(var op1: MPRational; num2, den2: valuint): longint;
+{ Set quotient to dividend/divisor }
+procedure q_div(var quotient, dividend, divisor: MPRational);
+{ Return dividend/divisor }
+function q_div(var dividend, divisor: MPRational): MPRational;
+{ Set rop to op1/(2^op2) }
+procedure q_div_2exp(var rop, op1: MPRational; op2: valuint);
+{ Return op1/(2^op2) }
+function q_div_2exp(var op1: MPRational; op2: valuint): MPRational;
+{ Return true if op1 and op2 are equal, false if they are non-equal }
+function q_equal(var op1, op2: MPRational): boolean;
+{ Get the numerator of a rational }
+procedure q_get_num(var numerator: MPInteger; var rational: MPRational);
+{ Return the numerator of a rational }
+function q_get_num(var rational: MPRational): MPInteger;
+{ Get the denominator of a rational }
+procedure q_get_den(var denominator: MPInteger; var rational: MPRational);
+{ Return the denominator of a rational }
+function q_get_den(var rational: MPRational): MPInteger;
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero) }
+function q_get_d(var op: MPRational): double;
+{ Convert op to a string of digits in base base }
+function q_get_str(base: longint; var op: MPRational): string;
+{ Convert op to a string of digits in base base. If str is NULL, the result string is allocated using the current allocation function. }
+function q_get_str(str: pchar; base: longint; var op: MPRational): pchar;
+{ Initialize dest rational and set it to 0/1 }
+procedure q_init(out dest_rational: MPRational);
+{ Set inverted_number to 1/number }
+procedure q_inv(var inverted_number, number: MPRational);
+{ Return 1/number }
+function q_inv(var number: MPRational): MPRational;
+{ Set product to multiplier × multiplicand }
+procedure q_mul(var product, multiplier, multiplicand: MPRational);
+{ Return multiplier × multiplicand }
+function q_mul(var multiplier, multiplicand: MPRational): MPRational;
+{ Set rop to op1 × (2^op2) }
+procedure q_mul_2exp(var rop, op1: MPRational; op2: valuint);
+{ Return op1 × (2^op2) }
+function q_mul_2exp(var op1: MPRational; op2: valuint): MPRational;
+{ Set negated_operand to −operand }
+procedure q_neg(var negated_operand, operand: MPRational);
+{ Return −operand }
+function q_neg(var operand: MPRational): MPRational;
+{ Assign rop from op }
+procedure q_set(var rop, op: MPRational);
+{ Set rop to the value of op. There is no rounding, this conversion is exact. }
+procedure q_set_d(var rop: MPRational; op: double);
+{ Set the denominator of a rational }
+procedure q_set_den(var rational: MPRational; var denominator: MPInteger);
+{ Set rop to the value of op. There is no rounding, this conversion is exact. }
+procedure q_set_f(var rop: MPRational; var op: MPFloat);
+{ Set the numerator of a rational }
+procedure q_set_num(var rational: MPRational; var numerator: MPInteger);
+{ Set the value of rop to op1/op2 }
+procedure q_set_si(var rop: MPRational; op1: valsint; op2: valuint);
+{ Set rop from a null-terminated string str in the given base. The return value is true if the entire string is a valid number. }
+function q_set_str(var rop: MPRational; str: string; base: longint): boolean;
+{ Set the value of rop to op1/op2 }
+procedure q_set_ui(var rop: MPRational; op1, op2: valuint);
+{ Assign rop from op }
+procedure q_set_z(var rop: MPRational; var op: MPInteger);
+{ Set difference to minuend − subtrahend }
+procedure q_sub(var difference, minuend, subtrahend: MPRational);
+{ Return minuend − subtrahend }
+function q_sub(var minuend, subtrahend: MPRational): MPRational;
+{ Swap the values rop1 and rop2 efficiently }
+procedure q_swap(var rop1, rop2: MPRational);
+
+// ---- Floating-point Functions ----
+
+{ Set rop to the absolute value of op }
+procedure f_abs(var rop, op: MPFloat);
+{ Return the absolute value of op }
+function f_abs(var op: MPFloat): MPFloat;
+{ Set rop to op1 + op2 }
+procedure f_add(var rop, op1, op2: MPFloat);
+{ Return op1 + op2 }
+function f_add(var op1, op2: MPFloat): MPFloat;
+{ Set rop to op1 + op2 }
+procedure f_add_ui(var rop, op1: MPFloat; op2: valuint);
+{ Return op1 + op2 }
+function f_add_ui(var op1: MPFloat; op2: valuint): MPFloat;
+{ Set rop to op rounded to the next higher integer }
+procedure f_ceil(var rop, op: MPFloat);
+{ Return op rounded to the next higher integer }
+function f_ceil(var op: MPFloat): MPFloat;
+{ Free the space occupied by x }
+procedure f_clear(var x: MPFloat);
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function f_cmp(var op1, op2: MPFloat): longint;
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function f_cmp_d(var op1: MPFloat; op2: double): longint;
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function f_cmp_si(var op1: MPFloat; op2: valsint): longint;
+{ Compare op1 and op2. Return a positive value if op1 > op2, zero if op1 = op2, and a negative value if op1 < op2. }
+function f_cmp_ui(var op1: MPFloat; op2: valuint): longint;
+{ Set rop to op1/op2 }
+procedure f_div(var rop, op1, op2: MPFloat);
+{ Return op1/op2 }
+function f_div(var op1, op2: MPFloat): MPFloat;
+{ Set rop to op1/(2^op2) }
+procedure f_div_2exp(var rop, op1: MPFloat; op2: valuint);
+{ Return op1/(2^op2) }
+function f_div_2exp(var op1: MPFloat; op2: valuint): MPFloat;
+{ Set rop to op1/op2 }
+procedure f_div_ui(var rop, op1: MPFloat; op2: valuint);
+{ Return op1/op2 }
+function f_div_ui(var op1: MPFloat; op2: valuint): MPFloat;
+{ Return true if the first op3 bits of op1 and op2 are equal, false otherwise }
+function f_eq(var op1, op2: MPFloat; op3: valuint): boolean;
+{ Return true if op would fit in the respective C data type, when truncated to an integer }
+function f_fits_sint_p(var op: MPFloat): boolean;
+{ Return true if op would fit in the respective C data type, when truncated to an integer }
+function f_fits_slong_p(var op: MPFloat): boolean;
+{ Return true if op would fit in the respective C data type, when truncated to an integer }
+function f_fits_sshort_p(var op: MPFloat): boolean;
+{ Return true if op would fit in the respective C data type, when truncated to an integer }
+function f_fits_uint_p(var op: MPFloat): boolean;
+{ Return true if op would fit in the respective C data type, when truncated to an integer }
+function f_fits_ulong_p(var op: MPFloat): boolean;
+{ Return true if op would fit in the respective C data type, when truncated to an integer }
+function f_fits_ushort_p(var op: MPFloat): boolean;
+{ Set rop to op rounded to the next lower }
+procedure f_floor(var rop, op: MPFloat);
+{ Return op rounded to the next lower }
+function f_floor(var op: MPFloat): MPFloat;
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero) }
+function f_get_d(var op: MPFloat): double;
+{ Convert op to a double, truncating if necessary (ie. rounding towards zero), and with an exponent returned separately }
+function f_get_d_2exp(out exp: valsint; var op: MPFloat): double;
+{ Return the default precision actually used }
+function f_get_default_prec: valuint;
+{ Return the current precision of op, in bits }
+function f_get_prec(var op: MPFloat): valuint;
+{ Convert op to a long, truncating any fraction part }
+function f_get_si(var op: MPFloat): valsint;
+{ Convert op to a string of digits in base base }
+function f_get_str(out exp: mp_exp_t; base: longint; ndigits: sizeuint; var op: MPFloat): string;
+{ Convert op to a string of digits in base base. If str is NULL, the result string is allocated using the current allocation function. }
+function f_get_str(str: pchar; out exp: mp_exp_t; base: longint; ndigits: sizeuint; var op: MPFloat): pchar;
+{ Convert op to a unsigned long, truncating any fraction part }
+function f_get_ui(var op: MPFloat): valuint;
+{ Initialize x to 0 }
+procedure f_init(out x: MPFloat);
+{ Initialize x to 0 and set its precision to be at least prec bits }
+procedure f_init2(out x: MPFloat; prec: valuint);
+{ Initialize rop and set its value from op }
+procedure f_init_set(out rop: MPFloat; var op: MPFloat);
+{ Initialize rop and set its value from op }
+procedure f_init_set_d(out rop: MPFloat; op: double);
+{ Initialize rop and set its value from op }
+procedure f_init_set_si(out rop: MPFloat; op: valsint);
+{ Initialize rop and set its value from the string in str. Returns true if the entire string is a valid number in base base. }
+function f_init_set_str(out rop: MPFloat; str: string; base: longint): boolean;
+{ Initialize rop and set its value from op }
+procedure f_init_set_ui(out rop: MPFloat; op: valuint);
+{ Return true if op is an integer }
+function f_integer_p(var op: MPFloat): boolean;
+{ Set rop to op1 × op2 }
+procedure f_mul(var rop, op1, op2: MPFloat);
+{ Return op1 × op2 }
+function f_mul(var op1, op2: MPFloat): MPFloat;
+{ Set rop to op1 × (2^op2) }
+procedure f_mul_2exp(var rop, op1: MPFloat; op2: valuint);
+{ Return op1 × (2^op2) }
+function f_mul_2exp(var op1: MPFloat; op2: valuint): MPFloat;
+{ Set rop to op1 × op2 }
+procedure f_mul_ui(var rop, op1: MPFloat; op2: valuint);
+{ Return op1 × op2 }
+function f_mul_ui(var op1: MPFloat; op2: valuint): MPFloat;
+{ Set rop to −op }
+procedure f_neg(var rop, op: MPFloat);
+{ Return −op }
+function f_neg(var op: MPFloat): MPFloat;
+{ Set rop to op1^op2 }
+procedure f_pow_ui(var rop, op1: MPFloat; op2: valuint);
+{ Return op1^op2 }
+function f_pow_ui(var op1: MPFloat; op2: valuint): MPFloat;
+{ Generate a random float of at most max_size limbs, with long strings of zeros and ones in the binary representation }
+procedure f_random2(var rop: MPFloat; max_size: mp_size_t; exp: mp_exp_t);
+{ Return a random float of at most max_size limbs, with long strings of zeros and ones in the binary representation }
+function f_random2(max_size: mp_size_t; exp: mp_exp_t): MPFloat;
+{ Compute the relative difference between op1 and op2 and store the result in rop }
+procedure f_reldiff(var rop, op1, op2: MPFloat);
+{ Return the relative difference between op1 and op2 }
+function f_reldiff(var op1, op2: MPFloat): MPFloat;
+{ Set the value of rop from op }
+procedure f_set(var rop, op: MPFloat);
+{ Set the value of rop from op }
+procedure f_set_d(var rop: MPFloat; op: double);
+{ Set the default precision to be at least prec bits }
+procedure f_set_default_prec(prec: valuint);
+{ Set the precision of rop to be at least prec bits }
+procedure f_set_prec(var rop: MPFloat; prec: valuint);
+{ Set the precision of rop to be at least prec bits, without changing the memory allocated }
+procedure f_set_prec_raw(var rop: MPFloat; prec: valuint);
+{ Set the value of rop from op }
+procedure f_set_q(var rop: MPFloat; var op: MPRational);
+{ Set the value of rop from op }
+procedure f_set_si(var rop: MPFloat; op: valsint);
+{ Set the value of rop from the string in str. Returns true if the entire string is a valid number in base base. }
+function f_set_str(var rop: MPFloat; str: string; base: longint): boolean;
+{ Set the value of rop from op }
+procedure f_set_ui(var rop: MPFloat; op: valuint);
+{ Set the value of rop from op }
+procedure f_set_z(var rop: MPFloat; var op: MPInteger);
+{ Set rop to op^(1/2) }
+procedure f_sqrt(var rop, op: MPFloat);
+{ Return op^(1/2) }
+function f_sqrt(var op: MPFloat): MPFloat;
+{ Set rop to op^(1/2) }
+procedure f_sqrt_ui(var rop: MPFloat; op: valuint);
+{ Return op^(1/2) }
+function f_sqrt_ui(op: valuint): MPFloat;
+{ Set rop to op1 − op2 }
+procedure f_sub(var rop, op1, op2: MPFloat);
+{ Return op1 − op2 }
+function f_sub(var op1, op2: MPFloat): MPFloat;
+{ Set rop to op1 − op2 }
+procedure f_sub_ui(var rop, op1: MPFloat; op2: valuint);
+{ Return op1 − op2 }
+function f_sub_ui(var op1: MPFloat; op2: valuint): MPFloat;
+{ Swap rop1 and rop2 efficiently }
+procedure f_swap(var rop1, rop2: MPFloat);
+{ Set rop to op rounded to the integer towards zero }
+procedure f_trunc(var rop, op: MPFloat);
+{ Return op rounded to the integer towards zero }
+function f_trunc(var op: MPFloat): MPFloat;
+{ Set rop to op1/op2 }
+procedure f_ui_div(var rop: MPFloat; op1: valuint; var op2: MPFloat);
+{ Return op1/op2 }
+function f_ui_div(op1: valuint; var op2: MPFloat): MPFloat;
+{ Set rop to op1 − op2 }
+procedure f_ui_sub(var rop: MPFloat; op1: valuint; var op2: MPFloat);
+{ Return op1 − op2 }
+function f_ui_sub(op1: valuint; var op2: MPFloat): MPFloat;
+{ Generate a uniformly distributed random float in rop, such that 0 <= rop < 1, with nbits significant bits in the mantissa }
+procedure f_urandomb(var rop: MPFloat; var state: MPRandState; nbits: valuint);
+{ Return a uniformly distributed random float, such that 0 <= result < 1, with nbits significant bits in the mantissa }
+function f_urandomb(var state: MPRandState; nbits: valuint): MPFloat;
+
+// ---- operators ----
+
+operator * (op1: MPFloat; op2: MPFloat): MPFloat; inline;
+operator * (op1: MPInteger; op2: MPInteger): MPInteger; inline;
+operator * (op1: MPRational; op2: MPRational): MPRational; inline;
+operator ** (op1: MPFloat; op2: valuint): MPFloat; inline;
+operator ** (op1: MPInteger; op2: valuint): MPInteger; inline;
+operator + (op1: MPFloat; op2: MPFloat): MPFloat; inline;
+operator + (op1: MPInteger; op2: MPInteger): MPInteger; inline;
+operator + (op1: MPRational; op2: MPRational): MPRational; inline;
+operator - (op: MPFloat): MPFloat; inline;
+operator - (op: MPInteger): MPInteger; inline;
+operator - (op: MPRational): MPRational; inline;
+operator - (op1: MPFloat; op2: MPFloat): MPFloat; inline;
+operator - (op1: MPInteger; op2: MPInteger): MPInteger; inline;
+operator - (op1: MPRational; op2: MPRational): MPRational; inline;
+operator / (op1: MPFloat; op2: MPFloat): MPFloat; inline;
+operator / (op1: MPInteger; op2: MPInteger): MPInteger; inline;
+operator / (op1: MPRational; op2: MPRational): MPRational; inline;
+operator := (op: double): MPFloat; inline;
+operator := (op: double): MPInteger; inline;
+operator := (op: double): MPRational; inline;
+operator := (op: MPFloat): Cardinal; inline;
+operator := (op: MPFloat): double; inline;
+operator := (op: MPFloat): integer; inline;
+operator := (op: MPFloat): mpf_t; inline;
+operator := (op: MPFloat): MPInteger; inline;
+operator := (op: MPFloat): MPRational; inline;
+operator := (op: MPFloat): string; inline;
+{$ifdef CPU64}
+operator := (op: MPFloat): valsint; inline;
+operator := (op: MPFloat): valuint; inline;
+{$endif}
+operator := (var op: mpf_t): MPFloat; inline;
+operator := (op: MPInteger): cardinal; inline;
+operator := (op: MPInteger): double; inline;
+operator := (op: MPInteger): integer; inline;
+operator := (op: MPInteger): MPFloat; inline;
+operator := (op: MPInteger): MPRational; inline;
+operator := (op: MPInteger): mpz_t; inline;
+operator := (op: MPInteger): string; inline;
+{$ifdef CPU64}
+operator := (op: MPInteger): valsint; inline;
+operator := (op: MPInteger): valuint; inline;
+{$endif}
+operator := (var op: mpq_t): MPRational; inline;
+operator := (op: MPRandState): randstate_t; inline;
+operator := (op: MPRational): double; inline;
+operator := (op: MPRational): MPFloat; inline;
+operator := (op: MPRational): MPInteger; inline;
+operator := (op: MPRational): mpq_t; inline;
+operator := (op: MPRational): string; inline;
+operator := (var op: mpz_t): MPInteger; inline;
+operator := (var op: randstate_t): MPRandState; inline;
+operator := (op: string): MPFloat; inline;
+operator := (op: string): MPInteger; inline;
+operator := (op: string): MPRational; inline;
+operator := (op: valsint): MPFloat; inline;
+operator := (op: valsint): MPInteger; inline;
+operator := (op: valsint): MPRational; inline;
+operator := (op: valuint): MPFloat; inline;
+operator := (op: valuint): MPInteger; inline;
+operator := (op: valuint): MPRational; inline;
+operator < (op1: MPFloat; op2: MPFloat): boolean; inline;
+operator < (op1: MPInteger; op2: MPInteger): boolean; inline;
+operator < (op1: MPRational; op2: MPRational): boolean; inline;
+operator <= (op1: MPFloat; op2: MPFloat): boolean; inline;
+operator <= (op1: MPInteger; op2: MPInteger): boolean; inline;
+operator <= (op1: MPRational; op2: MPRational): boolean; inline;
+operator > (op1: MPFloat; op2: MPFloat): boolean; inline;
+operator > (op1: MPInteger; op2: MPInteger): boolean; inline;
+operator > (op1: MPRational; op2: MPRational): boolean; inline;
+operator >= (op1: MPFloat; op2: MPFloat): boolean; inline;
+operator >= (op1: MPInteger; op2: MPInteger): boolean; inline;
+operator >= (op1: MPRational; op2: MPRational): boolean; inline;
+// compiler doesn't like theese
+// operator = (op1: MPFloat; op2: MPFloat): boolean; inline;
+// operator = (op1: MPInteger; op2: MPInteger): boolean; inline;
+// operator = (op1: MPRational; op2: MPRational): boolean; inline;
+
+implementation
+
+uses
+  math;
+
+{$ifndef NO_GMP_GLOBVARS}
+var
+  __gmp_bits_per_limb: longint; cvar; external;
+  __gmp_errno: longint; cvar; external;
+  __gmp_version: pchar; cvar; external;
+
+function bits_per_limb: longint;
+begin
+  result := __gmp_bits_per_limb;
+end;
+
+function errno: longint;
+begin
+  result := __gmp_errno;
+end;
+
+function version: string;
+begin
+  result := __gmp_version;
+end;
+
+{$else NO_GMP_GLOBVARS}
+function bits_per_limb: longint;
+const BITS_PER_BYTE = 8;
+begin
+  result := sizeof(mp_limb_t) * BITS_PER_BYTE;
+end;
+
+function errno: longint;
+begin
+  result := 0;
+end;
+
+function version: string;
+const NO_VER = '0.0.0';
+begin
+  result := NO_VER;
+end;
+{$endif NO_GMP_GLOBVARS}
+
+// ---- ext types ----
+
+{ TMPBase }
+
+function TMPBase.refs: longint;
+begin
+  result := frefcount;
+end;
+
+{ TMPInteger }
+
+function TMPInteger.ptr: mpz_ptr;
+begin
+  result := @fmpz
+end;
+
+destructor TMPInteger.destroy;
+begin
+  mpz_clear(fmpz);
+  inherited destroy;
+end;
+
+{ TMPFloat }
+
+function TMPFloat.ptr: mpf_ptr;
+begin
+  result := @fmpf;
+end;
+
+destructor TMPFloat.destroy;
+begin
+  mpf_clear(fmpf);
+  inherited destroy;
+end;
+
+{ TMPRational }
+
+function TMPRational.ptr: mpq_ptr;
+begin
+  result := @fmpq;
+end;
+
+destructor TMPRational.destroy;
+begin
+  mpq_clear(fmpq);
+  inherited destroy;
+end;
+
+{ TMPRandState }
+
+function TMPRandState.ptr: randstate_ptr;
+begin
+  result := @frandstate;
+end;
+
+destructor TMPRandState.destroy;
+begin
+  mp_randclear(frandstate);
+  inherited destroy;
+end;
+
+// --- helpers ----
+
+function dest(var rop: MPInteger): mpz_ptr;
+begin
+  if (not assigned(rop)) or (rop.refs > 1) then
+    z_init(rop);
+  result := rop.ptr;
+end;
+
+function dest(var rop: MPFloat): mpf_ptr;
+begin
+  if (not assigned(rop)) or (rop.refs > 1) then
+    f_init(rop);
+  result := rop.ptr;
+end;
+
+function dest(var rop: MPRational): mpq_ptr;
+begin
+  if (not assigned(rop)) or (rop.refs > 1) then
+    q_init(rop);
+  result := rop.ptr;
+end;
+
+function dest(var rop: MPRandState): randstate_ptr;
+begin
+  if (not assigned(rop)) or (rop.refs > 1) then
+    randinit_default(rop);
+  result := rop.ptr;
+end;
+
+function src(var rop: MPInteger): mpz_ptr;
+begin
+  if not assigned(rop) then
+    z_init(rop);
+  result := rop.ptr;
+end;
+
+function src(var rop: MPFloat): mpf_ptr;
+begin
+  if not assigned(rop) then
+    f_init(rop);
+  result := rop.ptr;
+end;
+
+function src(var rop: MPRational): mpq_ptr;
+begin
+  if not assigned(rop) then
+    q_init(rop);
+  result := rop.ptr;
+end;
+
+function src(var rop: MPRandState): randstate_ptr;
+begin
+  if not assigned(rop) then
+    randinit_default(rop);
+  result := rop.ptr;
+end;
+
+procedure propagate_prec(var result, op: MPFloat);
+begin
+  f_set_prec(result, f_get_prec(op));
+end;
+
+procedure propagate_prec(var result, op1, op2: MPFloat);
+begin
+  f_set_prec(result, max(valsint(f_get_prec(op1)), f_get_prec(op2)));
+end;
+
+// --- ext bindings ----
+
+procedure randinit_default(out state: MPRandState);
+begin
+  state := TMPRandState.Create;
+  mp_randinit_default(state.ptr^);
+end;
+
+procedure randinit_lc_2exp(out state: MPRandState; var a: MPInteger; c, m2exp: valuint);
+begin
+  state := TMPRandState.Create;
+  mp_randinit_lc_2exp(state.ptr^, src(a)^, c, m2exp);
+end;
+
+function randinit_lc_2exp_size(out state: MPRandState; size: sizeuint): boolean;
+begin
+  state := TMPRandState.Create;
+  result := mp_randinit_lc_2exp_size(state.ptr^, size) <> 0;
+end;
+
+procedure randinit_mt(out state: MPRandState);
+begin
+  state := TMPRandState.Create;
+  mp_randinit_mt(state.ptr^);
+end;
+
+procedure randinit_set(out rop: MPRandState; var op: MPRandState);
+begin
+  rop := TMPRandState.Create;
+  mp_randinit_set(rop.ptr^, src(op)^);
+end;
+
+procedure randseed(var state: MPRandState; var seed: MPInteger);
+begin
+  mp_randseed(dest(state)^, src(seed)^);
+end;
+
+procedure randseed_ui(var state: MPRandState; seed: valuint);
+begin
+  mp_randseed_ui(dest(state)^, seed);
+end;
+
+procedure randclear(var state: MPRandState);
+begin
+  state := nil;
+end;
+
+function urandomb_ui(var state: MPRandState; n: valuint): valuint;
+begin
+  result := mp_urandomb_ui(dest(state)^, n);
+end;
+
+function urandomm_ui(var state: MPRandState; n: valuint): valuint;
+begin
+  result := mp_urandomb_ui(dest(state)^, n);
+end;
+
+function z_realloc(var integer_: MPInteger; new_alloc: mp_size_t): pointer;
+begin
+  result := mpz_realloc(dest(integer_)^, new_alloc);
+end;
+
+procedure z_abs(var rop, op: MPInteger);
+begin
+  mpz_abs(dest(rop)^, src(op)^);
+end;
+
+function z_abs(var op: MPInteger): MPInteger;
+begin
+  mpz_abs(dest(result)^, src(op)^);
+end;
+
+procedure z_add(var rop, op1, op2: MPInteger);
+begin
+  mpz_add(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_add(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_add(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_add_ui(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_add_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function z_add_ui(var op1: MPInteger; op2: valuint): MPInteger;
+begin
+  mpz_add_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure z_addmul(var rop, op1, op2: MPInteger);
+begin
+  mpz_addmul(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_addmul_ui(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_addmul_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+procedure z_and(var rop, op1, op2: MPInteger);
+begin
+  mpz_and(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_and(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_and(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_bin_ui(var rop, n: MPInteger; k: valuint);
+begin
+  mpz_bin_ui(dest(rop)^, src(n)^, k);
+end;
+
+function z_bin_ui(var n: MPInteger; k: valuint): MPInteger;
+begin
+  mpz_bin_ui(dest(result)^, src(n)^, k);
+end;
+
+procedure z_bin_uiui(var rop: MPInteger; n, k: valuint);
+begin
+  mpz_bin_uiui(dest(rop)^, n, k);
+end;
+
+function z_bin_uiui(n, k: valuint): MPInteger;
+begin
+  mpz_bin_uiui(dest(result)^, n, k);
+end;
+
+procedure z_cdiv_q(var q, n, d: MPInteger);
+begin
+  mpz_cdiv_q(dest(q)^, src(n)^, src(d)^);
+end;
+
+function z_cdiv_q(var n, d: MPInteger): MPInteger;
+begin
+  mpz_cdiv_q(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_cdiv_q_2exp(var q, n: MPInteger; b: valuint);
+begin
+  mpz_cdiv_q_2exp(dest(q)^, src(n)^, b);
+end;
+
+function z_cdiv_q_2exp(var n: MPInteger; b: valuint): MPInteger;
+begin
+  mpz_cdiv_q_2exp(dest(result)^, src(n)^, b);
+end;
+
+function z_cdiv_q_ui(var q, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_cdiv_q_ui(dest(q)^, src(n)^, d);
+end;
+
+procedure z_cdiv_qr(var q, r, n, d: MPInteger);
+begin
+  mpz_cdiv_qr(dest(q)^, dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_cdiv_qr_ui(var q, r, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_cdiv_qr_ui(dest(q)^, dest(r)^, src(n)^, d);
+end;
+
+procedure z_cdiv_r(var r, n, d: MPInteger);
+begin
+  mpz_cdiv_r(dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_cdiv_r(var n, d: MPInteger): MPInteger;
+begin
+  mpz_cdiv_r(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_cdiv_r_2exp(var r, n: MPInteger; b: valuint);
+begin
+  mpz_cdiv_r_2exp(dest(r)^, src(n)^, b);
+end;
+
+function z_cdiv_r_2exp(var n: MPInteger; b: valuint): MPInteger;
+begin
+  mpz_cdiv_r_2exp(dest(result)^, src(n)^, b);
+end;
+
+function z_cdiv_r_ui(var r, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_cdiv_r_ui(dest(r)^, src(n)^, d);
+end;
+
+function z_cdiv_ui(var n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_cdiv_ui(src(n)^, d);
+end;
+
+procedure z_clear(var integer_: MPInteger);
+begin
+  integer_ := nil;
+end;
+
+procedure z_clrbit(var rop: MPInteger; bit_index: valuint);
+begin
+  mpz_clrbit(dest(rop)^, bit_index);
+end;
+
+function z_cmp(var op1, op2: MPInteger): longint;
+begin
+  result := mpz_cmp(src(op1)^, src(op2)^);
+end;
+
+function z_cmp_d(var op1: MPInteger; op2: double): longint;
+begin
+  result := mpz_cmp_d(src(op1)^, op2);
+end;
+
+function z_cmp_si(var op1: MPInteger; op2: valsint): longint;
+begin
+  result := mpz_cmp_si(src(op1)^, op2);
+end;
+
+function z_cmp_ui(var op1: MPInteger; op2: valuint): longint;
+begin
+  result := mpz_cmp_ui(src(op1)^, op2);
+end;
+
+function z_cmpabs(var op1, op2: MPInteger): longint;
+begin
+  result := mpz_cmpabs(src(op1)^, src(op2)^);
+end;
+
+function z_cmpabs_d(var op1: MPInteger; op2: double): longint;
+begin
+  result := mpz_cmpabs_d(src(op1)^, op2);
+end;
+
+function z_cmpabs_ui(var op1: MPInteger; op2: valuint): longint;
+begin
+  result := mpz_cmpabs_ui(src(op1)^, op2);
+end;
+
+procedure z_com(var rop, op: MPInteger);
+begin
+  mpz_com(dest(rop)^, src(op)^);
+end;
+
+function z_com(var op: MPInteger): MPInteger;
+begin
+  mpz_com(dest(result)^, src(op)^);
+end;
+
+procedure z_combit(var rop: MPInteger; bit_index: valuint);
+begin
+  mpz_combit(dest(rop)^, bit_index);
+end;
+
+function z_congruent_p(var n, c, d: MPInteger): boolean;
+begin
+  result := mpz_congruent_p(src(n)^, src(c)^, src(d)^) <> 0;
+end;
+
+function z_congruent_2exp_p(var n, c: MPInteger; b: valuint): boolean;
+begin
+  result := mpz_congruent_2exp_p(src(n)^, src(c)^, b) <> 0;
+end;
+
+function z_congruent_ui_p(var n: MPInteger; c, d: valuint): boolean;
+begin
+  result := mpz_congruent_ui_p(src(n)^, c, d) <> 0;
+end;
+
+procedure z_divexact(var q, n, d: MPInteger);
+begin
+  mpz_divexact(dest(q)^, src(n)^, src(d)^);
+end;
+
+function z_divexact(var n, d: MPInteger): MPInteger;
+begin
+  mpz_divexact(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_divexact_ui(var q, n: MPInteger; d: valuint);
+begin
+  mpz_divexact_ui(dest(q)^, src(n)^, d);
+end;
+
+function z_divexact_ui(var n: MPInteger; d: valuint): MPInteger;
+begin
+  mpz_divexact_ui(dest(result)^, src(n)^, d);
+end;
+
+function z_divisible_p(var n, d: MPInteger): boolean;
+begin
+  result := mpz_divisible_p(src(n)^, src(d)^) <> 0;
+end;
+
+function z_divisible_ui_p(var n: MPInteger; d: valuint): boolean;
+begin
+  result := mpz_divisible_ui_p(src(n)^, d) <> 0;
+end;
+
+function z_divisible_2exp_p(var n: MPInteger; b: valuint): boolean;
+begin
+  result := mpz_divisible_2exp_p(src(n)^, b) <> 0;
+end;
+
+function z_export(out buf; out countp: sizeuint; order: longint; size: sizeuint; endian: longint; nails: sizeuint; var op: MPInteger): pointer;
+begin
+  result := mpz_export(buf, countp, order, size, endian, nails, src(op)^);
+end;
+
+procedure z_fac_ui(var rop: MPInteger; op: valuint);
+begin
+  mpz_fac_ui(dest(rop)^, op);
+end;
+
+function z_fac_ui(op: valuint): MPInteger;
+begin
+  mpz_fac_ui(dest(result)^, op);
+end;
+
+procedure z_fdiv_q(var q, n, d: MPInteger);
+begin
+  mpz_fdiv_q(dest(q)^, src(n)^, src(d)^);
+end;
+
+function z_fdiv_q(var n, d: MPInteger): MPInteger;
+begin
+  mpz_fdiv_q(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_fdiv_q_2exp(var q, n: MPInteger; b: valuint);
+begin
+  mpz_fdiv_q_2exp(dest(q)^, src(n)^, b);
+end;
+
+function z_fdiv_q_2exp(var n: MPInteger; b: valuint): MPInteger;
+begin
+  mpz_fdiv_q_2exp(dest(result)^, src(n)^, b);
+end;
+
+function z_fdiv_q_ui(var q, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_fdiv_q_ui(dest(q)^, src(n)^, d);
+end;
+
+procedure z_fdiv_qr(var q, r, n, d: MPInteger);
+begin
+  mpz_fdiv_qr(dest(q)^, dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_fdiv_qr_ui(var q, r, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_fdiv_qr_ui(dest(q)^, dest(r)^, src(n)^, d);
+end;
+
+procedure z_fdiv_r(var r, n, d: MPInteger);
+begin
+  mpz_fdiv_r(dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_fdiv_r(var n, d: MPInteger): MPInteger;
+begin
+  mpz_fdiv_r(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_fdiv_r_2exp(var r, n: MPInteger; b: valuint);
+begin
+  mpz_fdiv_r_2exp(dest(r)^, src(n)^, b);
+end;
+
+function z_fdiv_r_2exp(var n: MPInteger; b: valuint): MPInteger;
+begin
+  mpz_fdiv_r_2exp(dest(result)^, src(n)^, b);
+end;
+
+function z_fdiv_r_ui(var r, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_fdiv_r_ui(dest(r)^, src(n)^, d);
+end;
+
+function z_fdiv_ui(var n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_fdiv_ui(src(n)^, d);
+end;
+
+procedure z_fib_ui(var fn: MPInteger; n: valuint);
+begin
+  mpz_fib_ui(dest(fn)^, n);
+end;
+
+function z_fib_ui(n: valuint): MPInteger;
+begin
+  mpz_fib_ui(dest(result)^, n);
+end;
+
+procedure z_fib2_ui(var fn, fnsub1: MPInteger; n: valuint);
+begin
+  mpz_fib2_ui(dest(fn)^, dest(fnsub1)^, n);
+end;
+
+function z_fib2_ui(var fnsub1: MPInteger; n: valuint): MPInteger;
+begin
+  mpz_fib2_ui(dest(result)^, dest(fnsub1)^, n);
+end;
+
+function z_fits_sint_p(var op: MPInteger): boolean;
+begin
+  result := mpz_fits_sint_p(src(op)^) <> 0;
+end;
+
+function z_fits_slong_p(var op: MPInteger): boolean;
+begin
+  result := mpz_fits_slong_p(src(op)^) <> 0;
+end;
+
+function z_fits_sshort_p(var op: MPInteger): boolean;
+begin
+  result := mpz_fits_sshort_p(src(op)^) <> 0;
+end;
+
+function z_fits_uint_p(var op: MPInteger): boolean;
+begin
+  result := mpz_fits_uint_p(src(op)^) <> 0;
+end;
+
+function z_fits_ulong_p(var op: MPInteger): boolean;
+begin
+  result := mpz_fits_ulong_p(src(op)^) <> 0;
+end;
+
+function z_fits_ushort_p(var op: MPInteger): boolean;
+begin
+  result := mpz_fits_ushort_p(src(op)^) <> 0;
+end;
+
+procedure z_gcd(var rop, op1, op2: MPInteger);
+begin
+  mpz_gcd(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_gcd(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_gcd(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+function z_gcd_ui(var rop, op1: MPInteger; op2: valuint): valuint;
+begin
+  result := mpz_gcd_ui(dest(rop)^, src(op1)^, op2)
+end;
+
+procedure z_gcdext(var g, s, t, a, b: MPInteger);
+begin
+  mpz_gcdext(dest(g)^, dest(s)^, dest(t)^, src(a)^, src(b)^);
+end;
+
+function z_get_d(var op: MPInteger): double;
+begin
+  result := mpz_get_d(src(op)^);
+end;
+
+function z_get_d_2exp(out exp: valsint; var op: MPInteger): double;
+begin
+  result := mpz_get_d_2exp(exp, src(op)^);
+end;
+
+function z_get_si(op: MPInteger): valsint;
+begin
+  result := mpz_get_si(src(op)^);
+end;
+
+function z_get_str(base: longint; var op: MPInteger): string;
+var p: pchar;
+begin
+  p := mpz_get_str(nil, base, src(op)^);
+  result := p;
+  freemem(p);
+end;
+
+function z_get_str(str: pchar; base: longint; var op: MPInteger): pchar;
+begin
+  result := mpz_get_str(str, base, src(op)^);
+end;
+
+function z_get_ui(op: MPInteger): valuint;
+begin
+  result := mpz_get_ui(src(op)^);
+end;
+
+function z_getlimbn(var op: MPInteger; n: mp_size_t): mp_limb_t;
+begin
+  result := mpz_getlimbn(src(op)^, n);
+end;
+
+function z_hamdist(var op1, op2: MPInteger): valuint;
+begin
+  result := mpz_hamdist(src(op1)^, src(op2)^);
+end;
+
+procedure z_import(var rop: MPInteger; count: sizeuint; order: longint; size: sizeuint; endian: longint; nails: sizeuint; const op);
+begin
+  mpz_import(dest(rop)^, count, order, size, endian, nails, op);
+end;
+
+procedure z_init(out integer_: MPInteger);
+begin
+  integer_ := TMPInteger.Create;
+  mpz_init(integer_.ptr^);
+end;
+
+procedure z_init2(out integer_: MPInteger; n: valuint);
+begin
+  integer_ := TMPInteger.Create;
+  mpz_init2(integer_.ptr^, n);
+end;
+
+procedure z_init_set(out rop: MPInteger; var op: MPInteger);
+begin
+  rop := TMPInteger.Create;
+  mpz_init_set(rop.ptr^, src(op)^);
+end;
+
+procedure z_init_set_d(out rop: MPInteger; op: double);
+begin
+  rop := TMPInteger.Create;
+  mpz_init_set_d(rop.ptr^, op);
+end;
+
+procedure z_init_set_si(out rop: MPInteger; op: valsint);
+begin
+  rop := TMPInteger.Create;
+  mpz_init_set_si(rop.ptr^, op);
+end;
+
+function z_init_set_str(out rop: MPInteger; str: string; base: longint): boolean;
+begin
+  rop := TMPInteger.Create;
+  result := mpz_set_str(rop.ptr^, pchar(str), base) = 0;
+end;
+
+procedure z_init_set_ui(out rop: MPInteger; op: valuint);
+begin
+  rop := TMPInteger.Create;
+  mpz_init_set_ui(rop.ptr^, op);
+end;
+
+function z_invert(var rop, op1, op2: MPInteger): longint;
+begin
+  result := mpz_invert(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_ior(var rop, op1, op2: MPInteger);
+begin
+  mpz_ior(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_ior(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_ior(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+function z_jacobi(var a, b: MPInteger): longint;
+begin
+  result := mpz_jacobi(src(a)^, src(b)^);
+end;
+
+function z_kronecker_si(var a: MPInteger; b: valsint): longint;
+begin
+  result := mpz_kronecker_si(src(a)^, b);
+end;
+
+function z_kronecker_ui(var a: MPInteger; b: valuint): longint;
+begin
+  result := mpz_kronecker_ui(src(a)^, b);
+end;
+
+function z_si_kronecker(a: valsint; var b: MPInteger): longint;
+begin
+  result := mpz_si_kronecker(a, src(b)^);
+end;
+
+function z_ui_kronecker(a: valuint; var b: MPInteger): longint;
+begin
+  result := mpz_ui_kronecker(a, src(b)^);
+end;
+
+procedure z_lcm(var rop, op1, op2: MPInteger);
+begin
+  mpz_lcm(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_lcm(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_lcm(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_lcm_ui(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_lcm_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function z_lcm_ui(var op1: MPInteger; op2: valuint): MPInteger;
+begin
+  mpz_lcm_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure z_lucnum_ui(var ln: MPInteger; n: valuint);
+begin
+  mpz_lucnum_ui(dest(ln)^, n);
+end;
+
+function z_lucnum_ui(n: valuint): MPInteger;
+begin
+  mpz_lucnum_ui(dest(result)^, n);
+end;
+
+procedure z_lucnum2_ui(var ln, lnsub1: MPInteger; n: valuint);
+begin
+  mpz_lucnum2_ui(dest(ln)^, dest(lnsub1)^, n);
+end;
+
+function z_lucnum2_ui(var lnsub1: MPInteger; n: valuint): MPInteger;
+begin
+  mpz_lucnum2_ui(dest(result)^, dest(lnsub1)^, n);
+end;
+
+procedure z_mod(var r, n, d: MPInteger);
+begin
+  mpz_mod(dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_mod(var n, d: MPInteger): MPInteger;
+begin
+  mpz_mod(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_mul(var rop, op1, op2: MPInteger);
+begin
+  mpz_mul(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_mul(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_mul(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_mul_2exp(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_mul_2exp(dest(rop)^, src(op1)^, op2);
+end;
+
+function z_mul_2exp(var op1: MPInteger; op2: valuint): MPInteger;
+begin
+  mpz_mul_2exp(dest(result)^, src(op1)^, op2);
+end;
+
+procedure z_mul_si(var rop, op1: MPInteger; op2: valsint);
+begin
+  mpz_mul_si(dest(rop)^, src(op1)^, op2);
+end;
+
+function z_mul_si(var op1: MPInteger; op2: valsint): MPInteger;
+begin
+  mpz_mul_si(dest(result)^, src(op1)^, op2);
+end;
+
+procedure z_mul_ui(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_mul_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function z_mul_ui(var op1: MPInteger; op2: valuint): MPInteger;
+begin
+  mpz_mul_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure z_neg(var rop, op: MPInteger);
+begin
+  mpz_neg(dest(rop)^, src(op)^);
+end;
+
+function z_neg(var op: MPInteger): MPInteger;
+begin
+  mpz_neg(dest(result)^, src(op)^);
+end;
+
+procedure z_nextprime(var rop, op: MPInteger);
+begin
+  mpz_nextprime(dest(rop)^, src(op)^);
+end;
+
+function z_nextprime(var op: MPInteger): MPInteger;
+begin
+  mpz_nextprime(dest(result)^, src(op)^);
+end;
+
+function z_perfect_power_p(var op: MPInteger): boolean;
+begin
+  result := mpz_perfect_power_p(src(op)^) <> 0;
+end;
+
+function z_perfect_square_p(var op: MPInteger): boolean;
+begin
+  result := mpz_perfect_square_p(src(op)^) <> 0;
+end;
+
+function z_popcount(var op: MPInteger): valuint;
+begin
+  result := mpz_popcount(src(op)^);
+end;
+
+procedure z_pow_ui(var rop, base: MPInteger; exp: valuint);
+begin
+  mpz_pow_ui(dest(rop)^, src(base)^, exp);
+end;
+
+function z_pow_ui(var base: MPInteger; exp: valuint): MPInteger;
+begin
+  mpz_pow_ui(dest(result)^, src(base)^, exp);
+end;
+
+procedure z_powm(var rop, base, exp, mod_: MPInteger);
+begin
+  mpz_powm(dest(rop)^, src(base)^, src(exp)^, src(mod_)^);
+end;
+
+function z_powm(var base, exp, mod_: MPInteger): MPInteger;
+begin
+  mpz_powm(dest(result)^, src(base)^, src(exp)^, src(mod_)^);
+end;
+
+procedure z_powm_ui(var rop, base: MPInteger; exp: valuint; var mod_: MPInteger);
+begin
+  mpz_powm_ui(dest(rop)^, src(base)^, exp, src(mod_)^);
+end;
+
+function z_powm_ui(var base: MPInteger; exp: valuint; var mod_: MPInteger): MPInteger;
+begin
+  mpz_powm_ui(dest(result)^, src(base)^, exp, src(mod_)^);
+end;
+
+function z_probab_prime_p(var n: MPInteger; reps: longint): longint;
+begin
+  result := mpz_probab_prime_p(src(n)^, reps);
+end;
+
+procedure z_realloc2(var integer_: MPInteger; n: valuint);
+begin
+  mpz_realloc2(dest(integer_)^, n);
+end;
+
+function z_remove(var rop, op, f: MPInteger): valuint;
+begin
+  result := mpz_remove(dest(rop)^, src(op)^, src(f)^);
+end;
+
+function z_root(var rop, op: MPInteger; n: valuint): boolean;
+begin
+  result := mpz_root(dest(rop)^, src(op)^, n) <> 0;
+end;
+
+procedure z_rootrem(var root, rem, u: MPInteger; n: valuint);
+begin
+  mpz_rootrem(dest(root)^, dest(rem)^, src(u)^, n);
+end;
+
+procedure z_rrandomb(var rop: MPInteger; var state: MPRandState; n: valuint);
+begin
+  mpz_rrandomb(dest(rop)^, src(state)^, n);
+end;
+
+function z_rrandomb(var state: MPRandState; n: valuint): MPInteger;
+begin
+  mpz_rrandomb(dest(result)^, src(state)^, n);
+end;
+
+function z_scan0(var op: MPInteger; starting_bit: valuint): valuint;
+begin
+  result := mpz_scan0(src(op)^, starting_bit);
+end;
+
+function z_scan1(var op: MPInteger; starting_bit: valuint): valuint;
+begin
+  result := mpz_scan1(src(op)^, starting_bit);
+end;
+
+procedure z_set(var rop, op: MPInteger);
+begin
+  mpz_set(dest(rop)^, src(op)^);
+end;
+
+procedure z_set_d(var rop: MPInteger; op: double);
+begin
+  mpz_set_d(dest(rop)^, op);
+end;
+
+procedure z_set_f(var rop: MPInteger; var op: MPFloat);
+begin
+  mpz_set_f(dest(rop)^, src(op)^);
+end;
+
+procedure z_set_q(var rop: MPInteger; var op: MPRational);
+begin
+  mpz_set_q(dest(rop)^, src(op)^);
+end;
+
+procedure z_set_si(var rop: MPInteger; op: valsint);
+begin
+  mpz_set_si(dest(rop)^, op);
+end;
+
+function z_set_str(var rop: MPInteger; str: string; base: longint): boolean;
+begin
+  result := mpz_set_str(dest(rop)^, pchar(str), base) = 0;
+end;
+
+procedure z_set_ui(var rop: MPInteger; op: valuint);
+begin
+  mpz_set_ui(dest(rop)^, op);
+end;
+
+procedure z_setbit(var rop: MPInteger; bit_index: valuint);
+begin
+  mpz_setbit(dest(rop)^, bit_index);
+end;
+
+function z_size(var op: MPInteger): sizeuint;
+begin
+  result := mpz_size(src(op)^);
+end;
+
+function z_sizeinbase(var op: MPInteger; base: longint): sizeuint;
+begin
+  result := mpz_sizeinbase(src(op)^, base);
+end;
+
+procedure z_sqrt(var rop, op: MPInteger);
+begin
+  mpz_sqrt(dest(rop)^, src(op)^);
+end;
+
+function z_sqrt(var op: MPInteger): MPInteger;
+begin
+  mpz_sqrt(dest(result)^, src(op)^);
+end;
+
+procedure z_sqrtrem(var rop1, rop2, op: MPInteger);
+begin
+  mpz_sqrtrem(dest(rop1)^, dest(rop2)^, src(op)^);
+end;
+
+procedure z_sub(var rop, op1, op2: MPInteger);
+begin
+  mpz_sub(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_sub(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_sub(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_sub_ui(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_sub_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function z_sub_ui(var op1: MPInteger; op2: valuint): MPInteger;
+begin
+  mpz_sub_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure z_ui_sub(var rop: MPInteger; op1: valuint; var op2: MPInteger);
+begin
+  mpz_ui_sub(dest(rop)^, op1, src(op2)^);
+end;
+
+function z_ui_sub(op1: valuint; var op2: MPInteger): MPInteger;
+begin
+  mpz_ui_sub(dest(result)^, op1, src(op2)^);
+end;
+
+procedure z_submul(var rop, op1, op2: MPInteger);
+begin
+  mpz_submul(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+procedure z_submul_ui(var rop, op1: MPInteger; op2: valuint);
+begin
+  mpz_submul_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+procedure z_swap(var rop1, rop2: MPInteger);
+begin
+  mpz_swap(dest(rop1)^, dest(rop2)^);
+end;
+
+procedure z_tdiv_q(var q, n, d: MPInteger);
+begin
+  mpz_tdiv_q(dest(q)^, src(n)^, src(d)^);
+end;
+
+function z_tdiv_q(var n, d: MPInteger): MPInteger;
+begin
+  mpz_tdiv_q(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_tdiv_q_2exp(var q, n: MPInteger; b: valuint);
+begin
+  mpz_tdiv_q_2exp(dest(q)^, src(n)^, b);
+end;
+
+function z_tdiv_q_2exp(var n: MPInteger; b: valuint): MPInteger;
+begin
+  mpz_tdiv_q_2exp(dest(result)^, src(n)^, b);
+end;
+
+function z_tdiv_q_ui(var q, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_tdiv_q_ui(dest(q)^, src(n)^, d);
+end;
+
+procedure z_tdiv_qr(var q, r, n, d: MPInteger);
+begin
+  mpz_tdiv_qr(dest(q)^, dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_tdiv_qr_ui(var q, r, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_tdiv_qr_ui(dest(q)^, dest(r)^, src(n)^, d);
+end;
+
+procedure z_tdiv_r(var r, n, d: MPInteger);
+begin
+  mpz_tdiv_r(dest(r)^, src(n)^, src(d)^);
+end;
+
+function z_tdiv_r(var n, d: MPInteger): MPInteger;
+begin
+  mpz_tdiv_r(dest(result)^, src(n)^, src(d)^);
+end;
+
+procedure z_tdiv_r_2exp(var r, n: MPInteger; b: valuint);
+begin
+  mpz_tdiv_r_2exp(dest(r)^, src(n)^, b);
+end;
+
+function z_tdiv_r_2exp(var n: MPInteger; b: valuint): MPInteger;
+begin
+  mpz_tdiv_r_2exp(dest(result)^, src(n)^, b);
+end;
+
+function z_tdiv_r_ui(var r, n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_tdiv_r_ui(dest(r)^, src(n)^, d);
+end;
+
+function z_tdiv_ui(var n: MPInteger; d: valuint): valuint;
+begin
+  result := mpz_tdiv_ui(src(n)^, d);
+end;
+
+function z_tstbit(var rop: MPInteger; bit_index: valuint): boolean;
+begin
+  result := mpz_tstbit(src(rop)^, bit_index) <> 0;
+end;
+
+procedure z_ui_pow_ui(var rop: MPInteger; base, exp: valuint);
+begin
+  mpz_ui_pow_ui(dest(rop)^, base, exp);
+end;
+
+function z_ui_pow_ui(base, exp: valuint): MPInteger;
+begin
+  mpz_ui_pow_ui(dest(result)^, base, exp);
+end;
+
+procedure z_urandomb(var rop: MPInteger; var state: MPRandState; n: valuint);
+begin
+  mpz_urandomb(dest(rop)^, src(state)^, n);
+end;
+
+function z_urandomb(var state: MPRandState; n: valuint): MPInteger;
+begin
+  mpz_urandomb(dest(result)^, src(state)^, n);
+end;
+
+procedure z_urandomm(var rop: MPInteger; var state: MPRandState; var n: MPInteger);
+begin
+  mpz_urandomm(dest(rop)^, src(state)^, src(n)^);
+end;
+
+function z_urandomm(var state: MPRandState; var n: MPInteger): MPInteger;
+begin
+  mpz_urandomm(dest(result)^, src(state)^, src(n)^);
+end;
+
+procedure z_xor(var rop, op1, op2: MPInteger);
+begin
+  mpz_xor(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function z_xor(var op1, op2: MPInteger): MPInteger;
+begin
+  mpz_xor(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure q_abs(var rop, op: MPRational);
+begin
+  mpq_abs(dest(rop)^, src(op)^);
+end;
+
+function q_abs(var op: MPRational): MPRational;
+begin
+  mpq_abs(dest(result)^, src(op)^);
+end;
+
+procedure q_add(var sum, addend1, addend2: MPRational);
+begin
+  mpq_add(dest(sum)^, src(addend1)^, src(addend2)^);
+end;
+
+function q_add(var addend1, addend2: MPRational): MPRational;
+begin
+  mpq_add(dest(result)^, src(addend1)^, src(addend2)^);
+end;
+
+procedure q_canonicalize(var op: MPRational);
+begin
+  mpq_canonicalize(dest(op)^);
+end;
+
+procedure q_clear(var rational_number: MPRational);
+begin
+  rational_number := nil;
+end;
+
+function q_cmp(var op1, op2: MPRational): longint;
+begin
+  result := mpq_cmp(src(op1)^, src(op2)^);
+end;
+
+function q_cmp_si(var op1: MPRational; num2: valsint; den2: valuint): longint;
+begin
+  result := mpq_cmp_si(src(op1)^, num2, den2);
+end;
+
+function q_cmp_ui(var op1: MPRational; num2, den2: valuint): longint;
+begin
+  result := mpq_cmp_ui(src(op1)^, num2, den2);
+end;
+
+procedure q_div(var quotient, dividend, divisor: MPRational);
+begin
+  mpq_div(dest(quotient)^, src(dividend)^, src(divisor)^);
+end;
+
+function q_div(var dividend, divisor: MPRational): MPRational;
+begin
+  mpq_div(dest(result)^, src(dividend)^, src(divisor)^);
+end;
+
+procedure q_div_2exp(var rop, op1: MPRational; op2: valuint);
+begin
+  mpq_div_2exp(dest(rop)^, src(op1)^, op2);
+end;
+
+function q_div_2exp(var op1: MPRational; op2: valuint): MPRational;
+begin
+  mpq_div_2exp(dest(result)^, src(op1)^, op2);
+end;
+
+function q_equal(var op1, op2: MPRational): boolean;
+begin
+  result := mpq_equal(src(op1)^, src(op2)^) <> 0;
+end;
+
+procedure q_get_num(var numerator: MPInteger; var rational: MPRational);
+begin
+  mpq_get_num(dest(numerator)^, src(rational)^);
+end;
+
+function q_get_num(var rational: MPRational): MPInteger;
+begin
+  mpq_get_num(dest(result)^, src(rational)^);
+end;
+
+procedure q_get_den(var denominator: MPInteger; var rational: MPRational);
+begin
+  mpq_get_den(dest(denominator)^, src(rational)^);
+end;
+
+function q_get_den(var rational: MPRational): MPInteger;
+begin
+  mpq_get_den(dest(result)^, src(rational)^);
+end;
+
+function q_get_d(var op: MPRational): double;
+begin
+  result := mpq_get_d(src(op)^);
+end;
+
+function q_get_str(base: longint; var op: MPRational): string;
+var p: pchar;
+begin
+  p := mpq_get_str(nil, base, src(op)^);
+  result := p;
+  freemem(p);
+end;
+
+function q_get_str(str: pchar; base: longint; var op: MPRational): pchar;
+begin
+  result := mpq_get_str(str, base, src(op)^);
+end;
+
+procedure q_init(out dest_rational: MPRational);
+begin
+  dest_rational := TMPRational.Create;
+  mpq_init(dest_rational.ptr^);
+end;
+
+procedure q_inv(var inverted_number, number: MPRational);
+begin
+  mpq_inv(dest(inverted_number)^, src(number)^);
+end;
+
+function q_inv(var number: MPRational): MPRational;
+begin
+  mpq_inv(dest(result)^, src(number)^);
+end;
+
+procedure q_mul(var product, multiplier, multiplicand: MPRational);
+begin
+  mpq_mul(dest(product)^, src(multiplier)^, src(multiplicand)^);
+end;
+
+function q_mul(var multiplier, multiplicand: MPRational): MPRational;
+begin
+  mpq_mul(dest(result)^, src(multiplier)^, src(multiplicand)^);
+end;
+
+procedure q_mul_2exp(var rop, op1: MPRational; op2: valuint);
+begin
+  mpq_mul_2exp(dest(rop)^, src(op1)^, op2);
+end;
+
+function q_mul_2exp(var op1: MPRational; op2: valuint): MPRational;
+begin
+  mpq_mul_2exp(dest(result)^, src(op1)^, op2);
+end;
+
+procedure q_neg(var negated_operand, operand: MPRational);
+begin
+  mpq_neg(dest(negated_operand)^, src(operand)^);
+end;
+
+function q_neg(var operand: MPRational): MPRational;
+begin
+  mpq_neg(dest(result)^, src(operand)^);
+end;
+
+procedure q_set(var rop, op: MPRational);
+begin
+  mpq_set(dest(rop)^, src(op)^);
+end;
+
+procedure q_set_d(var rop: MPRational; op: double);
+begin
+  mpq_set_d(dest(rop)^, op);
+end;
+
+procedure q_set_den(var rational: MPRational; var denominator: MPInteger);
+begin
+  mpq_set_den(dest(rational)^, src(denominator)^);
+end;
+
+procedure q_set_f(var rop: MPRational; var op: MPFloat);
+begin
+  mpq_set_f(dest(rop)^, src(op)^);
+end;
+
+procedure q_set_num(var rational: MPRational; var numerator: MPInteger);
+begin
+  mpq_set_num(dest(rational)^, src(numerator)^);
+end;
+
+procedure q_set_si(var rop: MPRational; op1: valsint; op2: valuint);
+begin
+  mpq_set_si(dest(rop)^, op1, op2);
+end;
+
+function q_set_str(var rop: MPRational; str: string; base: longint): boolean;
+begin
+  result := mpq_set_str(dest(rop)^, pchar(str), base) = 0;
+end;
+
+procedure q_set_ui(var rop: MPRational; op1, op2: valuint);
+begin
+  mpq_set_ui(dest(rop)^, op1, op2);
+end;
+
+procedure q_set_z(var rop: MPRational; var op: MPInteger);
+begin
+  mpq_set_z(dest(rop)^, src(op)^);
+end;
+
+procedure q_sub(var difference, minuend, subtrahend: MPRational);
+begin
+  mpq_sub(dest(difference)^, src(minuend)^, src(subtrahend)^);
+end;
+
+function q_sub(var minuend, subtrahend: MPRational): MPRational;
+begin
+  mpq_sub(dest(result)^, src(minuend)^, src(subtrahend)^);
+end;
+
+procedure q_swap(var rop1, rop2: MPRational);
+begin
+  mpq_swap(dest(rop1)^, dest(rop2)^);
+end;
+
+procedure f_abs(var rop, op: MPFloat);
+begin
+  mpf_abs(dest(rop)^, src(op)^);
+end;
+
+function f_abs(var op: MPFloat): MPFloat;
+begin
+  mpf_abs(dest(result)^, src(op)^);
+end;
+
+procedure f_add(var rop, op1, op2: MPFloat);
+begin
+  mpf_add(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function f_add(var op1, op2: MPFloat): MPFloat;
+begin
+  mpf_add(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure f_add_ui(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_add_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_add_ui(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_add_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure f_ceil(var rop, op: MPFloat);
+begin
+  mpf_ceil(dest(rop)^, src(op)^);
+end;
+
+function f_ceil(var op: MPFloat): MPFloat;
+begin
+  mpf_ceil(dest(result)^, src(op)^);
+end;
+
+procedure f_clear(var x: MPFloat);
+begin
+  x := nil;
+end;
+
+function f_cmp(var op1, op2: MPFloat): longint;
+begin
+  result := mpf_cmp(src(op1)^, src(op2)^);
+end;
+
+function f_cmp_d(var op1: MPFloat; op2: double): longint;
+begin
+  result := mpf_cmp_d(src(op1)^, op2);
+end;
+
+function f_cmp_si(var op1: MPFloat; op2: valsint): longint;
+begin
+  result := mpf_cmp_si(src(op1)^, op2);
+end;
+
+function f_cmp_ui(var op1: MPFloat; op2: valuint): longint;
+begin
+  result := mpf_cmp_ui(src(op1)^, op2);
+end;
+
+procedure f_div(var rop, op1, op2: MPFloat);
+begin
+  mpf_div(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function f_div(var op1, op2: MPFloat): MPFloat;
+begin
+  mpf_div(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure f_div_2exp(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_div_2exp(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_div_2exp(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_div_2exp(dest(result)^, src(op1)^, op2);
+end;
+
+procedure f_div_ui(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_div_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_div_ui(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_div_ui(dest(result)^, src(op1)^, op2);
+end;
+
+function f_eq(var op1, op2: MPFloat; op3: valuint): boolean;
+begin
+  result := mpf_eq(src(op1)^, src(op2)^, op3) <> 0;
+end;
+
+function f_fits_sint_p(var op: MPFloat): boolean;
+begin
+  result := mpf_fits_sint_p(src(op)^) <> 0;
+end;
+
+function f_fits_slong_p(var op: MPFloat): boolean;
+begin
+  result := mpf_fits_slong_p(src(op)^) <> 0;
+end;
+
+function f_fits_sshort_p(var op: MPFloat): boolean;
+begin
+  result := mpf_fits_sshort_p(src(op)^) <> 0;
+end;
+
+function f_fits_uint_p(var op: MPFloat): boolean;
+begin
+  result := mpf_fits_uint_p(src(op)^) <> 0;
+end;
+
+function f_fits_ulong_p(var op: MPFloat): boolean;
+begin
+  result := mpf_fits_ulong_p(src(op)^) <> 0;
+end;
+
+function f_fits_ushort_p(var op: MPFloat): boolean;
+begin
+  result := mpf_fits_ushort_p(src(op)^) <> 0;
+end;
+
+procedure f_floor(var rop, op: MPFloat);
+begin
+  mpf_floor(dest(rop)^, src(op)^);
+end;
+
+function f_floor(var op: MPFloat): MPFloat;
+begin
+  mpf_floor(dest(result)^, src(op)^);
+end;
+
+function f_get_d(var op: MPFloat): double;
+begin
+  result := mpf_get_d(src(op)^);
+end;
+
+function f_get_d_2exp(out exp: valsint; var op: MPFloat): double;
+begin
+  result := mpf_get_d_2exp(exp, src(op)^);
+end;
+
+function f_get_default_prec: valuint;
+begin
+  result := mpf_get_default_prec;
+end;
+
+function f_get_prec(var op: MPFloat): valuint;
+begin
+  result := mpf_get_prec(src(op)^);
+end;
+
+function f_get_si(var op: MPFloat): valsint;
+begin
+  result := mpf_get_si(src(op)^);
+end;
+
+function f_get_str(out exp: mp_exp_t; base: longint; ndigits: sizeuint; var op: MPFloat): string;
+var p: pchar;
+begin
+  p := mpf_get_str(nil, exp, base, ndigits, src(op)^);
+  result := p;
+  freemem(p);
+end;
+
+function f_get_str(str: pchar; out exp: mp_exp_t; base: longint; ndigits: sizeuint; var op: MPFloat): pchar;
+begin
+  result := mpf_get_str(str, exp, base, ndigits, src(op)^);
+end;
+
+function f_get_ui(var op: MPFloat): valuint;
+begin
+  result := mpf_get_ui(src(op)^);
+end;
+
+procedure f_init(out x: MPFloat);
+begin
+  x := TMPFloat.Create;
+  mpf_init(x.ptr^);
+end;
+
+procedure f_init2(out x: MPFloat; prec: valuint);
+begin
+  x := TMPFloat.Create;
+  mpf_init2(x.ptr^, prec);
+end;
+
+procedure f_init_set(out rop: MPFloat; var op: MPFloat);
+begin
+  rop := TMPFloat.Create;
+  mpf_init_set(rop.ptr^, src(op)^);
+end;
+
+procedure f_init_set_d(out rop: MPFloat; op: double);
+begin
+  rop := TMPFloat.Create;
+  mpf_init_set_d(rop.ptr^, op);
+end;
+
+procedure f_init_set_si(out rop: MPFloat; op: valsint);
+begin
+  rop := TMPFloat.Create;
+  mpf_init_set_si(rop.ptr^, op);
+end;
+
+function f_init_set_str(out rop: MPFloat; str: string; base: longint): boolean;
+begin
+  rop := TMPFloat.Create;
+  result := mpf_init_set_str(rop.ptr^, pchar(str), base) = 0;
+end;
+
+procedure f_init_set_ui(out rop: MPFloat; op: valuint);
+begin
+  rop := TMPFloat.Create;
+  mpf_init_set_ui(rop.ptr^, op);
+end;
+
+function f_integer_p(var op: MPFloat): boolean;
+begin
+  result := mpf_integer_p(src(op)^) <> 0;
+end;
+
+procedure f_mul(var rop, op1, op2: MPFloat);
+begin
+  mpf_mul(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function f_mul(var op1, op2: MPFloat): MPFloat;
+begin
+  mpf_mul(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure f_mul_2exp(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_mul_2exp(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_mul_2exp(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_mul_2exp(dest(result)^, src(op1)^, op2);
+end;
+
+procedure f_mul_ui(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_mul_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_mul_ui(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_mul_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure f_neg(var rop, op: MPFloat);
+begin
+  mpf_neg(dest(rop)^, src(op)^);
+end;
+
+function f_neg(var op: MPFloat): MPFloat;
+begin
+  mpf_neg(dest(result)^, src(op)^);
+end;
+
+procedure f_pow_ui(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_pow_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_pow_ui(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_pow_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure f_random2(var rop: MPFloat; max_size: mp_size_t; exp: mp_exp_t);
+begin
+  mpf_random2(dest(rop)^, max_size, exp);
+end;
+
+function f_random2(max_size: mp_size_t; exp: mp_exp_t): MPFloat;
+begin
+  mpf_random2(dest(result)^, max_size, exp);
+end;
+
+procedure f_reldiff(var rop, op1, op2: MPFloat);
+begin
+  mpf_reldiff(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function f_reldiff(var op1, op2: MPFloat): MPFloat;
+begin
+  mpf_reldiff(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure f_set(var rop, op: MPFloat);
+begin
+  mpf_set(dest(rop)^, src(op)^);
+end;
+
+procedure f_set_d(var rop: MPFloat; op: double);
+begin
+  mpf_set_d(dest(rop)^, op);
+end;
+
+procedure f_set_default_prec(prec: valuint);
+begin
+  mpf_set_default_prec(prec);
+end;
+
+procedure f_set_prec(var rop: MPFloat; prec: valuint);
+begin
+  mpf_set_prec(dest(rop)^, prec);
+end;
+
+procedure f_set_prec_raw(var rop: MPFloat; prec: valuint);
+begin
+  mpf_set_prec_raw(dest(rop)^, prec);
+end;
+
+procedure f_set_q(var rop: MPFloat; var op: MPRational);
+begin
+  mpf_set_q(dest(rop)^, src(op)^);
+end;
+
+procedure f_set_si(var rop: MPFloat; op: valsint);
+begin
+  mpf_set_si(dest(rop)^, op);
+end;
+
+function f_set_str(var rop: MPFloat; str: string; base: longint): boolean;
+begin
+  result := mpf_set_str(dest(rop)^, pchar(str), base) = 0;
+end;
+
+procedure f_set_ui(var rop: MPFloat; op: valuint);
+begin
+  mpf_set_ui(dest(rop)^, op);
+end;
+
+procedure f_set_z(var rop: MPFloat; var op: MPInteger);
+begin
+  mpf_set_z(dest(rop)^, src(op)^);
+end;
+
+procedure f_sqrt(var rop, op: MPFloat);
+begin
+  mpf_sqrt(dest(rop)^, src(op)^);
+end;
+
+function f_sqrt(var op: MPFloat): MPFloat;
+begin
+  mpf_sqrt(dest(result)^, src(op)^);
+end;
+
+procedure f_sqrt_ui(var rop: MPFloat; op: valuint);
+begin
+  mpf_sqrt_ui(dest(rop)^, op);
+end;
+
+function f_sqrt_ui(op: valuint): MPFloat;
+begin
+  mpf_sqrt_ui(dest(result)^, op);
+end;
+
+procedure f_sub(var rop, op1, op2: MPFloat);
+begin
+  mpf_sub(dest(rop)^, src(op1)^, src(op2)^);
+end;
+
+function f_sub(var op1, op2: MPFloat): MPFloat;
+begin
+  mpf_sub(dest(result)^, src(op1)^, src(op2)^);
+end;
+
+procedure f_sub_ui(var rop, op1: MPFloat; op2: valuint);
+begin
+  mpf_sub_ui(dest(rop)^, src(op1)^, op2);
+end;
+
+function f_sub_ui(var op1: MPFloat; op2: valuint): MPFloat;
+begin
+  mpf_sub_ui(dest(result)^, src(op1)^, op2);
+end;
+
+procedure f_swap(var rop1, rop2: MPFloat);
+begin
+  mpf_swap(dest(rop1)^, dest(rop2)^);
+end;
+
+procedure f_trunc(var rop, op: MPFloat);
+begin
+  mpf_trunc(dest(rop)^, src(op)^);
+end;
+
+function f_trunc(var op: MPFloat): MPFloat;
+begin
+  mpf_trunc(dest(result)^, src(op)^);
+end;
+
+procedure f_ui_div(var rop: MPFloat; op1: valuint; var op2: MPFloat);
+begin
+  mpf_ui_div(dest(rop)^, op1, src(op2)^);
+end;
+
+function f_ui_div(op1: valuint; var op2: MPFloat): MPFloat;
+begin
+  mpf_ui_div(dest(result)^, op1, src(op2)^);
+end;
+
+procedure f_ui_sub(var rop: MPFloat; op1: valuint; var op2: MPFloat);
+begin
+  mpf_ui_sub(dest(rop)^, op1, src(op2)^);
+end;
+
+function f_ui_sub(op1: valuint; var op2: MPFloat): MPFloat;
+begin
+  mpf_ui_sub(dest(result)^, op1, src(op2)^);
+end;
+
+procedure f_urandomb(var rop: MPFloat; var state: MPRandState; nbits: valuint);
+begin
+  mpf_urandomb(dest(rop)^, src(state)^, nbits);
+end;
+
+function f_urandomb(var state: MPRandState; nbits: valuint): MPFloat;
+begin
+  mpf_urandomb(dest(result)^, src(state)^, nbits);
+end;
+
+// ---- operators ----
+
+operator * (op1: MPFloat; op2: MPFloat): MPFloat;
+begin
+  propagate_prec(result, op1, op2);
+  f_mul(result, op1, op2);
+end;
+
+operator * (op1: MPInteger; op2: MPInteger): MPInteger;
+begin
+  z_mul(result, op1, op2);
+end;
+
+operator * (op1: MPRational; op2: MPRational): MPRational;
+begin
+  q_mul(result, op1, op2);
+end;
+
+operator ** (op1: MPFloat; op2: valuint): MPFloat;
+begin
+  propagate_prec(result, op1);
+  f_pow_ui(result, op1, op2);
+end;
+
+operator ** (op1: MPInteger; op2: valuint): MPInteger;
+begin
+  z_pow_ui(result, op1, op2);
+end;
+
+operator + (op1: MPFloat; op2: MPFloat): MPFloat;
+begin
+  propagate_prec(result, op1, op2);
+  f_add(result, op1, op2);
+end;
+
+operator + (op1: MPInteger; op2: MPInteger): MPInteger;
+begin
+  z_add(result, op1, op2);
+end;
+
+operator + (op1: MPRational; op2: MPRational): MPRational;
+begin
+  q_add(result, op1, op2);
+end;
+
+operator - (op: MPFloat): MPFloat;
+begin
+  propagate_prec(result, op);
+  f_neg(result, op);
+end;
+
+operator - (op: MPInteger): MPInteger;
+begin
+  z_neg(result, op);
+end;
+
+operator - (op: MPRational): MPRational;
+begin
+  q_neg(result, op);
+end;
+
+operator - (op1: MPFloat; op2: MPFloat): MPFloat;
+begin
+  propagate_prec(result, op1, op2);
+  f_sub(result, op1, op2);
+end;
+
+operator - (op1: MPInteger; op2: MPInteger): MPInteger;
+begin
+  z_sub(result, op1, op2);
+end;
+
+operator - (op1: MPRational; op2: MPRational): MPRational;
+begin
+  q_sub(result, op1, op2);
+end;
+
+operator / (op1: MPFloat; op2: MPFloat): MPFloat;
+begin
+  propagate_prec(result, op1, op2);
+  f_div(result, op1, op2);
+end;
+
+operator / (op1: MPInteger; op2: MPInteger): MPInteger;
+begin
+  z_tdiv_q(result, op1, op2);
+end;
+
+operator / (op1: MPRational; op2: MPRational): MPRational;
+begin
+  q_div(result, op1, op2);
+end;
+
+operator := (op: double): MPFloat;
+begin
+  f_set_d(result, op);
+end;
+
+operator := (op: double): MPInteger;
+begin
+  z_set_d(result, op);
+end;
+
+operator := (op: double): MPRational;
+begin
+  q_set_d(result, op);
+end;
+
+operator := (op: MPFloat): cardinal;
+begin
+  result := f_get_ui(op);
+end;
+
+operator := (op: MPFloat): double;
+begin
+  result := f_get_d(op);
+end;
+
+operator := (op: MPFloat): integer;
+begin
+  result := f_get_si(op);
+end;
+
+operator := (op: MPFloat): mpf_t;
+begin
+  mpf_init_set(result, src(op)^);
+end;
+
+operator := (op: MPFloat): MPInteger;
+begin
+  z_set_f(result, op);
+end;
+
+operator := (op: MPFloat): MPRational;
+begin
+  q_set_f(result, op);
+end;
+
+operator := (op: MPFloat): string;
+const FMT = '%.*Fg';
+var p: pchar;
+begin
+  mp_asprintf(p, FMT, floor(f_get_prec(op) * LOG_10_2), src(op));
+  result := p;
+  freemem(p);
+end;
+
+{$ifdef CPU64}
+operator := (op: MPFloat): valsint;
+begin
+  result := f_get_si(op);
+end;
+
+operator := (op: MPFloat): valuint;
+begin
+  result := f_get_ui(op);
+end;
+{$endif}
+
+operator := (var op: mpf_t): MPFloat;
+begin
+  mpf_set(dest(result)^, op);
+end;
+
+operator := (op: MPInteger): cardinal;
+begin
+  result := z_get_ui(op);
+end;
+
+operator := (op: MPInteger): double;
+begin
+  result := z_get_d(op);
+end;
+
+operator := (op: MPInteger): integer;
+begin
+  result := z_get_si(op);
+end;
+
+operator := (op: MPInteger): MPFloat;
+begin
+  f_set_z(result, op);
+end;
+
+operator := (op: MPInteger): MPRational;
+begin
+  q_set_z(result, op);
+end;
+
+operator := (op: MPInteger): mpz_t;
+begin
+  mpz_init_set(result, src(op)^);
+end;
+
+operator := (op: MPInteger): string;
+const FMT = '%Zd';
+var p: pchar;
+begin
+  mp_asprintf(p, FMT, src(op));
+  result := p;
+  freemem(p);
+end;
+
+{$ifdef CPU64}
+operator := (op: MPInteger): valsint;
+begin
+  result := z_get_si(op);
+end;
+
+operator := (op: MPInteger): valuint;
+begin
+  result := z_get_ui(op);
+end;
+{$endif}
+
+operator := (var op: mpq_t): MPRational;
+begin
+  mpq_set(dest(result)^, op);
+end;
+
+operator := (op: MPRandState): randstate_t;
+begin
+  mp_randinit_set(result, src(op)^);
+end;
+
+operator := (op: MPRational): double;
+begin
+  result := q_get_d(op);
+end;
+
+operator := (op: MPRational): MPFloat;
+begin
+  f_set_q(result, op);
+end;
+
+operator := (op: MPRational): MPInteger;
+begin
+  z_set_q(result, op);
+end;
+
+operator := (op: MPRational): mpq_t;
+begin
+  mpq_init(result);
+  mpq_set(result, src(op)^);
+end;
+
+operator := (op: MPRational): string;
+const FMT = '%Qd';
+var p: pchar;
+begin
+  mp_asprintf(p, FMT, src(op));
+  result := p;
+  freemem(p);
+end;
+
+operator := (var op: mpz_t): MPInteger;
+begin
+  mpz_set(dest(result)^, op);
+end;
+
+operator := (var op: randstate_t): MPRandState;
+begin
+  result := TMPRandState.Create;
+  mp_randinit_set(result.ptr^, op);
+end;
+
+operator := (op: string): MPFloat;
+begin
+  f_set_prec(result, ceil(length(op) / LOG_10_2));
+  f_set_str(result, op, BASE10);
+end;
+
+operator := (op: string): MPInteger;
+begin
+  z_set_str(result, op, BASE10);
+end;
+
+operator := (op: string): MPRational;
+begin
+  q_set_str(result, op, BASE10);
+end;
+
+operator := (op: valsint): MPFloat;
+begin
+  f_set_si(result, op);
+end;
+
+operator := (op: valsint): MPInteger;
+begin
+  z_set_si(result, op);
+end;
+
+operator := (op: valsint): MPRational;
+begin
+  q_set_si(result, op, 1);
+end;
+
+operator := (op: valuint): MPFloat;
+begin
+  f_set_ui(result, op);
+end;
+
+operator := (op: valuint): MPInteger;
+begin
+  z_set_ui(result, op);
+end;
+
+operator := (op: valuint): MPRational;
+begin
+  q_set_ui(result, op, 1);
+end;
+
+operator < (op1: MPFloat; op2: MPFloat): boolean;
+begin
+  result := f_cmp(op1, op2) < 0;
+end;
+
+operator < (op1: MPInteger; op2: MPInteger): boolean;
+begin
+  result := z_cmp(op1, op2) < 0;
+end;
+
+operator < (op1: MPRational; op2: MPRational): boolean;
+begin
+  result := q_cmp(op1, op2) < 0;
+end;
+
+operator <= (op1: MPFloat; op2: MPFloat): boolean;
+begin
+  result := f_cmp(op1, op2) <= 0;
+end;
+
+operator <= (op1: MPInteger; op2: MPInteger): boolean;
+begin
+  result := z_cmp(op1, op2) <= 0;
+end;
+
+operator <= (op1: MPRational; op2: MPRational): boolean;
+begin
+  result := q_cmp(op1, op2) <= 0;
+end;
+
+//operator = (op1: MPFloat; op2: MPFloat): boolean;
+//begin
+//  result := f_cmp(op1, op2) = 0;
+//end;
+
+//operator = (op1: MPInteger; op2: MPInteger): boolean;
+//begin
+//  result := z_cmp(op1, op2) = 0;
+//end;
+
+//operator = (op1: MPRational; op2: MPRational): boolean;
+//begin
+//  result := q_cmp(op1, op2) = 0;
+//end;
+
+operator > (op1: MPFloat; op2: MPFloat): boolean;
+begin
+  result := f_cmp(op1, op2) > 0;
+end;
+
+operator > (op1: MPInteger; op2: MPInteger): boolean;
+begin
+  result := z_cmp(op1, op2) > 0;
+end;
+
+operator > (op1: MPRational; op2: MPRational): boolean;
+begin
+  result := q_cmp(op1, op2) > 0;
+end;
+
+operator >= (op1: MPFloat; op2: MPFloat): boolean;
+begin
+  result := f_cmp(op1, op2) >= 0;
+end;
+
+operator >= (op1: MPInteger; op2: MPInteger): boolean;
+begin
+  result := z_cmp(op1, op2) >= 0;
+end;
+
+operator >= (op1: MPRational; op2: MPRational): boolean;
+begin
+  result := q_cmp(op1, op2) >= 0;
+end;
+
+// ==== init stuff ====
+
+function alloc_func(alloc_size: sizeuint): pointer; cdecl;
+begin
+  result := getmem(alloc_size);
+end;
+
+procedure free_proc(p: pointer; size: sizeuint); cdecl;
+begin
+  assert(size = size); // hint off
+  freemem(p);
+end;
+
+function reallocate_func(p: pointer; old_size, new_size: sizeuint): pointer; cdecl;
+begin
+  assert(old_size = old_size); // hint off
+  result := reallocmem(p, new_size);
+end;
+
+var r1: mp_limb_t;
+
+initialization
+  // prealloc the GMP's global PRNG state, get rid of the (pseudo) mem leak report
+  mpn_random(@r1, 1);
+  mp_set_memory_functions(@alloc_func, @reallocate_func, @free_proc);
+
+end.
+