blob: 996b1e3d9a6ed08d1ea0648cc5d546a40d91d9af [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "runtime.h"
#include "cgocall.h"
typedef struct Int Int;
struct Int
{
void *v;
};
// turn on ffi
#pragma dynld initcgo initcgo "libcgo.so"
#pragma dynld cgo cgo "libcgo.so"
#pragma dynld c_free free "gmp.so"
void (*c_free)(void*);
// pull in gmp routines, implemented in gcc.c, from gmp.so
#pragma dynld gmp_addInt gmp_addInt "gmp.so"
#pragma dynld gmp_stringInt gmp_stringInt "gmp.so"
#pragma dynld gmp_newInt gmp_newInt "gmp.so"
#pragma dynld gmp_subInt gmp_subInt "gmp.so"
#pragma dynld gmp_mulInt gmp_mulInt "gmp.so"
#pragma dynld gmp_divInt gmp_divInt "gmp.so"
#pragma dynld gmp_modInt gmp_modInt "gmp.so"
#pragma dynld gmp_expInt gmp_expInt "gmp.so"
#pragma dynld gmp_gcdInt gmp_gcdInt "gmp.so"
#pragma dynld gmp_negInt gmp_negInt "gmp.so"
#pragma dynld gmp_absInt gmp_absInt "gmp.so"
#pragma dynld gmp_cmpInt gmp_cmpInt "gmp.so"
#pragma dynld gmp_stringInt gmp_stringInt "gmp.so"
#pragma dynld gmp_probablyPrimeInt gmp_probablyPrimeInt "gmp.so"
#pragma dynld gmp_lshInt gmp_lshInt "gmp.so"
#pragma dynld gmp_rshInt gmp_rshInt "gmp.so"
#pragma dynld gmp_lenInt gmp_lenInt "gmp.so"
#pragma dynld gmp_setInt gmp_setInt "gmp.so"
#pragma dynld gmp_setBytesInt gmp_setBytesInt "gmp.so"
#pragma dynld gmp_setStringInt gmp_setStringInt "gmp.so"
#pragma dynld gmp_bytesInt gmp_bytesInt "gmp.so"
#pragma dynld gmp_divModInt gmp_divModInt "gmp.so"
#pragma dynld gmp_setInt64Int gmp_setInt64Int "gmp.so"
#pragma dynld gmp_int64Int gmp_int64Int "gmp.so"
void (*gmp_addInt)(void*);
void (*gmp_stringInt)(void*);
void (*gmp_newInt)(void*);
void (*gmp_subInt)(void*);
void (*gmp_mulInt)(void*);
void (*gmp_divInt)(void*);
void (*gmp_modInt)(void*);
void (*gmp_expInt)(void*);
void (*gmp_gcdInt)(void*);
void (*gmp_negInt)(void*);
void (*gmp_absInt)(void*);
void (*gmp_cmpInt)(void*);
void (*gmp_stringInt)(void*);
void (*gmp_probablyPrimeInt)(void*);
void (*gmp_lshInt)(void*);
void (*gmp_rshInt)(void*);
void (*gmp_lenInt)(void*);
void (*gmp_setInt)(void*);
void (*gmp_setBytesInt)(void*);
void (*gmp_setStringInt)(void*);
void (*gmp_bytesInt)(void*);
void (*gmp_divModInt)(void*);
void (*gmp_setInt64Int)(void*);
void (*gmp_int64Int)(void*);
void gmp·addInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_addInt, &z); }
void gmp·subInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_subInt, &z); }
void gmp·mulInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_mulInt, &z); }
void gmp·divInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_divInt, &z); }
void gmp·modInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_modInt, &z); }
void gmp·expInt(Int *z, Int *x, Int *y, Int *m, Int *ret) { cgocall(gmp_expInt, &z); }
void gmp·GcdInt(Int *d, Int *x, Int *y, Int *a, Int *b) { cgocall(gmp_gcdInt, &d); }
void gmp·negInt(Int *z, Int *x, Int *ret) { cgocall(gmp_negInt, &z); }
void gmp·absInt(Int *z, Int *x, Int *ret) { cgocall(gmp_absInt, &z); }
void gmp·CmpInt(Int *x, Int *y, int32 ret) { cgocall(gmp_cmpInt, &x); }
void gmp·probablyPrimeInt(Int *z, int32 nreps, int32 pad, int32 ret) { cgocall(gmp_probablyPrimeInt, &z); }
void gmp·lshInt(Int *z, Int *x, uint32 s, Int *ret) { cgocall(gmp_lshInt, &z); }
void gmp·rshInt(Int *z, Int *x, uint32 s, Int *ret) { cgocall(gmp_rshInt, &z); }
void gmp·lenInt(Int *z, int32 ret) { cgocall(gmp_lenInt, &z); }
void gmp·setInt(Int *z, Int *x, Int *ret) { cgocall(gmp_setInt, &z); }
void gmp·setBytesInt(Int *z, Array b, Int *ret) { cgocall(gmp_setBytesInt, &z); }
void gmp·setStringInt(Int *z, String s, int32 base, int32 ret) { cgocall(gmp_setStringInt, &z); }
void gmp·bytesInt(Int *z, Array ret) { cgocall(gmp_bytesInt, &z); }
void gmp·DivModInt(Int *q, Int *r, Int *x, Int *y) { cgocall(gmp_divModInt, &q); }
void gmp·setInt64Int(Int *z, int64 x, Int *ret) { cgocall(gmp_setInt64Int, &z); }
void gmp·int64Int(Int *z, int64 ret) { cgocall(gmp_int64Int, &z); }
void
gmp·stringInt(Int *z, String ret)
{
struct {
Int *z;
byte *p;
} a;
a.z = z;
a.p = nil;
cgocall(gmp_stringInt, &a);
ret = gostring(a.p);
cgocall(c_free, a.p);
FLUSH(&ret);
}
void
gmp·NewInt(uint64 x, Int *z)
{
if(sizeof(uintptr) != 8) *(int32*)0 = 0;
z = mallocgc(sizeof *z);
FLUSH(&z);
cgocall(gmp_newInt, &x);
}