mirror of
https://github.com/data61/MP-SPDZ.git
synced 2026-01-08 05:03:59 -05:00
402 lines
21 KiB
C
402 lines
21 KiB
C
/*
|
|
* instructions.h
|
|
*
|
|
*/
|
|
|
|
#ifndef PROCESSOR_INSTRUCTIONS_H_
|
|
#define PROCESSOR_INSTRUCTIONS_H_
|
|
|
|
#include "Instruction.h"
|
|
|
|
#define ARITHMETIC_INSTRUCTIONS \
|
|
X(LDI, auto dest = &Procp.get_C()[r[0]]; typename sint::clear tmp = int(n), \
|
|
*dest++ = tmp) \
|
|
X(LDSI, auto dest = &Procp.get_S()[r[0]]; \
|
|
auto tmp = sint::constant(int(n), Proc.P.my_num(), Procp.MC.get_alphai()), \
|
|
*dest++ = tmp) \
|
|
X(LDMS, auto dest = &Procp.get_S()[r[0]]; auto source = &Proc.machine.Mp.MS[n], \
|
|
*dest++ = *source++) \
|
|
X(STMS, auto source = &Procp.get_S()[r[0]]; auto dest = &Proc.machine.Mp.MS[n], \
|
|
*dest++ = *source++) \
|
|
X(LDMSI, Proc.machine.Mp.MS.indirect_read(instruction, Procp.get_S(), Proc.get_Ci()),) \
|
|
X(STMSI, Proc.machine.Mp.MS.indirect_write(instruction, Procp.get_S(), Proc.get_Ci()),) \
|
|
X(LDMCI, Proc.machine.Mp.MC.indirect_read(instruction, Procp.get_C(), Proc.get_Ci()),) \
|
|
X(STMCI, Proc.machine.Mp.MC.indirect_write(instruction, Procp.get_C(), Proc.get_Ci()),) \
|
|
X(MOVS, auto dest = &Procp.get_S()[r[0]]; auto source = &Procp.get_S()[r[1]], \
|
|
*dest++ = *source++) \
|
|
X(ADDS, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = &Procp.get_S()[r[2]], \
|
|
*dest++ = *op1++ + *op2++) \
|
|
X(ADDM, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ + sint::constant(*op2++, Proc.P.my_num(), Procp.MC.get_alphai())) \
|
|
X(ADDSI, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]], \
|
|
*dest++ = *op1++ + sint::constant(int(n), Proc.P.my_num(), Procp.MC.get_alphai())) \
|
|
X(ADDC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ + *op2++) \
|
|
X(ADDCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ + op2) \
|
|
X(SUBS, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = &Procp.get_S()[r[2]], \
|
|
*dest++ = *op1++ - *op2++) \
|
|
X(SUBSI, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = sint::constant(int(n), Proc.P.my_num(), Procp.MC.get_alphai()), \
|
|
*dest++ = *op1++ - op2) \
|
|
X(SUBSFI, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = sint::constant(int(n), Proc.P.my_num(), Procp.MC.get_alphai()), \
|
|
*dest++ = op2 - *op1++) \
|
|
X(SUBML, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ - sint::constant(*op2++, Proc.P.my_num(), Procp.MC.get_alphai())) \
|
|
X(SUBMR, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_S()[r[2]], \
|
|
*dest++ = sint::constant(*op1++, Proc.P.my_num(), Procp.MC.get_alphai()) - *op2++) \
|
|
X(SUBC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ - *op2++) \
|
|
X(SUBCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ - op2) \
|
|
X(SUBCFI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = op2 - *op1++) \
|
|
X(PREFIXSUMS, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
sint s, \
|
|
s += *op1++; *dest++ = s) \
|
|
X(PICKS, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1] + r[2]], \
|
|
*dest++ = *op1; op1 += int(n)) \
|
|
X(MULM, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]]; mulm_check<sint>(), \
|
|
*dest++ = *op1++ * *op2++) \
|
|
X(MULC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ * *op2++) \
|
|
X(MULCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ * op2) \
|
|
X(MULSI, auto dest = &Procp.get_S()[r[0]]; auto op1 = &Procp.get_S()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ * op2) \
|
|
X(ANDC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ & *op2++) \
|
|
X(XORC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ ^ *op2++) \
|
|
X(ORC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ | *op2++) \
|
|
X(ANDCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ & op2) \
|
|
X(XORCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ ^ op2) \
|
|
X(ORCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
typename sint::clear op2 = int(n), \
|
|
*dest++ = *op1++ | op2) \
|
|
X(SHLC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ << *op2++) \
|
|
X(SHRC, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]]; \
|
|
auto op2 = &Procp.get_C()[r[2]], \
|
|
*dest++ = *op1++ >> *op2++) \
|
|
X(SHLCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]], \
|
|
*dest++ = *op1++ << n) \
|
|
X(SHRCI, auto dest = &Procp.get_C()[r[0]]; auto op1 = &Procp.get_C()[r[1]], \
|
|
*dest++ = *op1++ >> n) \
|
|
X(TRIPLE, auto a = &Procp.get_S()[r[0]]; auto b = &Procp.get_S()[r[1]]; \
|
|
auto c = &Procp.get_S()[r[2]], \
|
|
Procp.DataF.get_three(DATA_TRIPLE, *a++, *b++, *c++)) \
|
|
X(BIT, auto dest = &Procp.get_S()[r[0]], \
|
|
Procp.DataF.get_one(DATA_BIT, *dest++)) \
|
|
X(RANDOMFULLS, auto dest = &Procp.get_S()[r[0]], \
|
|
*dest++ = Procp.DataF.get_random()) \
|
|
X(GLDSI, auto dest = &Proc2.get_S()[r[0]]; \
|
|
auto tmp = sgf2n::constant(int(n), Proc.P.my_num(), Proc2.MC.get_alphai()), \
|
|
*dest++ = tmp) \
|
|
X(GLDMS, auto dest = &Proc2.get_S()[r[0]]; auto source = &Proc.machine.M2.MS[n], \
|
|
*dest++ = *source++) \
|
|
X(GSTMS, auto source = &Proc2.get_S()[r[0]]; auto dest = &Proc.machine.M2.MS[n], \
|
|
*dest++ = *source++) \
|
|
X(GLDMSI, Proc.machine.M2.MS.indirect_read(instruction, Proc2.get_S(), Proc.get_Ci()),) \
|
|
X(GSTMSI, Proc.machine.M2.MS.indirect_write(instruction, Proc2.get_S(), Proc.get_Ci()),) \
|
|
X(GMOVS, auto dest = &Proc2.get_S()[r[0]]; auto source = &Proc2.get_S()[r[1]], \
|
|
*dest++ = *source++) \
|
|
X(GADDS, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = &Proc2.get_S()[r[2]], \
|
|
*dest++ = *op1++ + *op2++) \
|
|
X(GADDM, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = &Proc2.get_C()[r[2]], \
|
|
*dest++ = *op1++ + sgf2n::constant(*op2++, Proc.P.my_num(), Proc2.MC.get_alphai())) \
|
|
X(GADDSI, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]], \
|
|
*dest++ = *op1++ + sgf2n::constant(int(n), Proc.P.my_num(), Proc2.MC.get_alphai())) \
|
|
X(GSUBS, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = &Proc2.get_S()[r[2]], \
|
|
*dest++ = *op1++ - *op2++) \
|
|
X(GSUBSI, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = sgf2n::constant(int(n), Proc.P.my_num(), Proc2.MC.get_alphai()), \
|
|
*dest++ = *op1++ - op2) \
|
|
X(GSUBSFI, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = sgf2n::constant(int(n), Proc.P.my_num(), Proc2.MC.get_alphai()), \
|
|
*dest++ = op2 - *op1++) \
|
|
X(GSUBML, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = &Proc2.get_C()[r[2]], \
|
|
*dest++ = *op1++ - sgf2n::constant(*op2++, Proc.P.my_num(), Proc2.MC.get_alphai())) \
|
|
X(GSUBMR, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_C()[r[1]]; \
|
|
auto op2 = &Proc2.get_S()[r[2]], \
|
|
*dest++ = sgf2n::constant(*op1++, Proc.P.my_num(), Proc2.MC.get_alphai()) - *op2++) \
|
|
X(GMULM, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
auto op2 = &Proc2.get_C()[r[2]]; mulm_check<sgf2n>(), \
|
|
*dest++ = *op1++ * *op2++) \
|
|
X(GMULSI, auto dest = &Proc2.get_S()[r[0]]; auto op1 = &Proc2.get_S()[r[1]]; \
|
|
typename sgf2n::clear op2 = int(n), \
|
|
*dest++ = *op1++ * op2) \
|
|
X(GTRIPLE, auto a = &Proc2.get_S()[r[0]]; auto b = &Proc2.get_S()[r[1]]; \
|
|
auto c = &Proc2.get_S()[r[2]], \
|
|
Proc2.DataF.get_three(DATA_TRIPLE, *a++, *b++, *c++)) \
|
|
X(GBIT, auto dest = &Proc2.get_S()[r[0]], \
|
|
Proc2.DataF.get_one(DATA_BIT, *dest++)) \
|
|
X(CONVINT, auto dest = &Procp.get_C()[r[0]]; auto source = &Proc.get_Ci()[r[1]], \
|
|
*dest++ = *source++) \
|
|
X(GCONVINT, auto dest = &Proc2.get_C()[r[0]]; auto source = &Proc.get_Ci()[r[1]], \
|
|
*dest++ = *source++) \
|
|
|
|
#define REGINT_INSTRUCTIONS \
|
|
X(LDMINT, auto dest = &Proc.get_Ci()[r[0]]; auto source = &Mi[n], \
|
|
*dest++ = (*source).get(); source++) \
|
|
X(STMINT, auto dest = &Mi[n]; auto source = &Proc.get_Ci()[r[0]], \
|
|
*dest++ = *source++) \
|
|
X(LDMINTI, Mi.indirect_read(*this, Proc.get_Ci(), Proc.get_Ci()),) \
|
|
X(STMINTI, Mi.indirect_write(*this, Proc.get_Ci(), Proc.get_Ci()),) \
|
|
X(MOVINT, auto dest = &Proc.get_Ci()[r[0]]; auto source = &Ci[r[1]], \
|
|
*dest++ = *source++) \
|
|
X(PUSHINT, Proc.pushi(Ci[r[0]]),) \
|
|
X(POPINT, auto dest = &Ci[r[0]], Proc.popi(*dest++)) \
|
|
X(LDTN, auto dest = &Ci[r[0]], *dest++ = Proc.get_thread_num()) \
|
|
X(LDARG, auto dest = &Ci[r[0]], *dest++ = Proc.get_arg()) \
|
|
X(STARG, Proc.set_arg(Ci[r[0]]),) \
|
|
X(LDINT, auto dest = &Proc.get_Ci()[r[0]], \
|
|
*dest++ = int(n)) \
|
|
X(ADDINT, auto dest = &Proc.get_Ci()[r[0]]; auto op1 = &Proc.get_Ci()[r[1]]; \
|
|
auto op2 = &Proc.get_Ci()[r[2]], \
|
|
*dest++ = *op1++ + *op2++) \
|
|
X(SUBINT, auto dest = &Proc.get_Ci()[r[0]]; auto op1 = &Proc.get_Ci()[r[1]]; \
|
|
auto op2 = &Proc.get_Ci()[r[2]], \
|
|
*dest++ = *op1++ - *op2++) \
|
|
X(MULINT, auto dest = &Proc.get_Ci()[r[0]]; auto op1 = &Proc.get_Ci()[r[1]]; \
|
|
auto op2 = &Proc.get_Ci()[r[2]], \
|
|
*dest++ = *op1++ * *op2++) \
|
|
X(DIVINT, auto dest = &Proc.get_Ci()[r[0]]; auto op1 = &Proc.get_Ci()[r[1]]; \
|
|
auto op2 = &Proc.get_Ci()[r[2]], \
|
|
if (*op2 == 0) throw division_by_zero(); *dest++ = *op1++ / *op2++) \
|
|
X(INCINT, auto dest = &Proc.get_Ci()[r[0]]; auto base = Proc.get_Ci()[r[1]], \
|
|
int inc = (i / start[0]) % start[1]; *dest++ = base + inc * int(n)) \
|
|
X(EQZC, auto dest = &Ci[r[0]]; auto source = &Ci[r[1]], *dest++ = *source++ == 0) \
|
|
X(LTZC, auto dest = &Ci[r[0]]; auto source = &Ci[r[1]], *dest++ = *source++ < 0) \
|
|
X(LTC, auto dest = &Ci[r[0]]; auto op1 = &Ci[r[1]]; auto op2 = &Ci[r[2]], \
|
|
*dest++ = *op1++ < *op2++) \
|
|
X(GTC, auto dest = &Ci[r[0]]; auto op1 = &Ci[r[1]]; auto op2 = &Ci[r[2]], \
|
|
*dest++ = *op1++ > *op2++) \
|
|
X(EQC, auto dest = &Ci[r[0]]; auto op1 = &Ci[r[1]]; auto op2 = &Ci[r[2]], \
|
|
*dest++ = *op1++ == *op2++) \
|
|
X(PRINTINT, print(Proc.out, &Proc.get_Ci_ref(r[0])),) \
|
|
X(PRINTFLOATPREC, Proc.out << setprecision(n),) \
|
|
X(PRINTSTR, Proc.out << string((char*)&n,4) << flush,) \
|
|
X(PRINTCHR, Proc.out << string((char*)&n,1) << flush,) \
|
|
X(SHUFFLE, shuffle(Proc),) \
|
|
X(BITDECINT, bitdecint(Proc),) \
|
|
X(RAND, auto dest = &Ci[r[0]]; auto source = &Ci[r[1]], \
|
|
*dest++ = Proc.shared_prng.get_uint() % (1 << (*source++).get())) \
|
|
|
|
#define CLEAR_GF2N_INSTRUCTIONS \
|
|
X(GLDI, auto dest = &C2[r[0]]; cgf2n tmp = int(n), \
|
|
*dest++ = tmp) \
|
|
X(GLDMC, auto dest = &C2[r[0]]; auto source = &M2C[n], \
|
|
*dest++ = (*source).get(); source++) \
|
|
X(GSTMC, auto dest = &M2C[n]; auto source = &C2[r[0]], \
|
|
*dest++ = *source++) \
|
|
X(GLDMCI, M2C.indirect_read(*this, C2, Proc.get_Ci()),) \
|
|
X(GSTMCI, M2C.indirect_write(*this, C2, Proc.get_Ci()),) \
|
|
X(GMOVC, auto dest = &C2[r[0]]; auto source = &C2[r[1]], \
|
|
*dest++ = *source++) \
|
|
X(GADDC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
auto op2 = &C2[r[2]], \
|
|
*dest++ = *op1++ + *op2++) \
|
|
X(GADDCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = *op1++ + op2) \
|
|
X(GSUBC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
auto op2 = &C2[r[2]], \
|
|
*dest++ = *op1++ - *op2++) \
|
|
X(GSUBCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = *op1++ - op2) \
|
|
X(GSUBCFI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = op2 - *op1++) \
|
|
X(GMULC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
auto op2 = &C2[r[2]], \
|
|
*dest++ = *op1++ * *op2++) \
|
|
X(GMULCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = *op1++ * op2) \
|
|
X(GANDC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
auto op2 = &C2[r[2]], \
|
|
*dest++ = *op1++ & *op2++) \
|
|
X(GXORC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
auto op2 = &C2[r[2]], \
|
|
*dest++ = *op1++ ^ *op2++) \
|
|
X(GORC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
auto op2 = &C2[r[2]], \
|
|
*dest++ = *op1++ | *op2++) \
|
|
X(GANDCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = *op1++ & op2) \
|
|
X(GXORCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = *op1++ ^ op2) \
|
|
X(GORCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]]; \
|
|
cgf2n op2 = int(n), \
|
|
*dest++ = *op1++ | op2) \
|
|
X(GNOTC, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]], \
|
|
*dest++ = ~*op1++) \
|
|
X(GSHLCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]], \
|
|
*dest++ = *op1++ << n) \
|
|
X(GSHRCI, auto dest = &C2[r[0]]; auto op1 = &C2[r[1]], \
|
|
*dest++ = *op1++ >> n) \
|
|
X(GPRINTREG, auto source = &C2[r[0]], \
|
|
Proc.out << "Reg[" << r[0] << "] = " << *source++ \
|
|
<< " # " << string((char*)&n, 4) << endl) \
|
|
X(GPRINTREGPLAIN, auto source = &C2[r[0]], \
|
|
Proc.out << *source++ << flush) \
|
|
X(GBITDEC, gbitdec(C2),) \
|
|
X(GBITCOM, gbitcom(C2),) \
|
|
X(GCONVGF2N, auto dest = &Proc.get_Ci()[r[0]]; auto source = &C2[r[1]], \
|
|
*dest++ = source->get_word(); source++) \
|
|
X(GRAWOUTPUT, auto source = &C2[r[0]], \
|
|
(*source++).output(Proc.get_public_output(), false)) \
|
|
|
|
#define REMAINING_INSTRUCTIONS \
|
|
X(CONVMODP, throw not_implemented(),) \
|
|
X(LDMC, throw not_implemented(),) \
|
|
X(STMC, throw not_implemented(),) \
|
|
X(MOVC, throw not_implemented(),) \
|
|
X(DIVC, throw not_implemented(),) \
|
|
X(GDIVC, throw not_implemented(),) \
|
|
X(FLOORDIVC, throw not_implemented(),) \
|
|
X(MODC, throw not_implemented(),) \
|
|
X(LEGENDREC, throw not_implemented(),) \
|
|
X(DIGESTC, throw not_implemented(),) \
|
|
X(DIVCI, throw not_implemented(),) \
|
|
X(GDIVCI, throw not_implemented(),) \
|
|
X(INV2M, throw not_implemented(),) \
|
|
X(MODCI, throw not_implemented(),) \
|
|
X(SQUARE, throw not_implemented(),) \
|
|
X(GSQUARE, throw not_implemented(),) \
|
|
X(INV, throw not_implemented(),) \
|
|
X(GINV, throw not_implemented(),) \
|
|
X(RANDOMS, throw not_implemented(),) \
|
|
X(INPUTMASKREG, throw not_implemented(),) \
|
|
X(INPUTMASK, throw not_implemented(),) \
|
|
X(GINPUTMASK, throw not_implemented(),) \
|
|
X(INPUT, throw not_implemented(),) \
|
|
X(GINPUT, throw not_implemented(),) \
|
|
X(INPUTFIX, throw not_implemented(),) \
|
|
X(INPUTFLOAT, throw not_implemented(),) \
|
|
X(INPUTMIXED, throw not_implemented(),) \
|
|
X(INPUTMIXEDREG, throw not_implemented(),) \
|
|
X(RAWINPUT, throw not_implemented(),) \
|
|
X(GRAWINPUT, throw not_implemented(),) \
|
|
X(INPUTPERSONAL, throw not_implemented(),) \
|
|
X(NOTC, throw not_implemented(),) \
|
|
X(SHRSI, throw not_implemented(),) \
|
|
X(OPEN, throw not_implemented(),) \
|
|
X(GOPEN, throw not_implemented(),) \
|
|
X(MULS, throw not_implemented(),) \
|
|
X(GMULS, throw not_implemented(),) \
|
|
X(MULRS, throw not_implemented(),) \
|
|
X(GMULRS, throw not_implemented(),) \
|
|
X(DOTPRODS, throw not_implemented(),) \
|
|
X(GDOTPRODS, throw not_implemented(),) \
|
|
X(MATMULS, throw not_implemented(),) \
|
|
X(MATMULSM, throw not_implemented(),) \
|
|
X(CONV2DS, throw not_implemented(),) \
|
|
X(TRUNC_PR, throw not_implemented(),) \
|
|
X(CHECK, throw not_implemented(),) \
|
|
X(JMP, throw not_implemented(),) \
|
|
X(JMPI, throw not_implemented(),) \
|
|
X(JMPNZ, throw not_implemented(),) \
|
|
X(JMPEQZ, throw not_implemented(),) \
|
|
X(PRINTREG, throw not_implemented(),) \
|
|
X(PRINTREGPLAIN, throw not_implemented(),) \
|
|
X(CONDPRINTPLAIN, throw not_implemented(),) \
|
|
X(PRINTFLOATPLAIN, throw not_implemented(),) \
|
|
X(CONDPRINTSTR, throw not_implemented(),) \
|
|
X(REQBL, throw not_implemented(),) \
|
|
X(GREQBL, throw not_implemented(),) \
|
|
X(USE, throw not_implemented(),) \
|
|
X(USE_INP, throw not_implemented(),) \
|
|
X(USE_EDABIT, throw not_implemented(),) \
|
|
X(USE_MATMUL, throw not_implemented(),) \
|
|
X(USE_PREP, throw not_implemented(),) \
|
|
X(GUSE_PREP, throw not_implemented(),) \
|
|
X(TIME, throw not_implemented(),) \
|
|
X(START, throw not_implemented(),) \
|
|
X(STOP, throw not_implemented(),) \
|
|
X(RUN_TAPE, throw not_implemented(),) \
|
|
X(JOIN_TAPE, throw not_implemented(),) \
|
|
X(CRASH, throw not_implemented(),) \
|
|
X(STARTGRIND, throw not_implemented(),) \
|
|
X(STOPGRIND, throw not_implemented(),) \
|
|
X(NPLAYERS, throw not_implemented(),) \
|
|
X(THRESHOLD, throw not_implemented(),) \
|
|
X(PLAYERID, throw not_implemented(),) \
|
|
X(LISTEN, throw not_implemented(),) \
|
|
X(ACCEPTCLIENTCONNECTION, throw not_implemented(),) \
|
|
X(CLOSECLIENTCONNECTION, throw not_implemented(),) \
|
|
X(READSOCKETINT, throw not_implemented(),) \
|
|
X(READSOCKETC, throw not_implemented(),) \
|
|
X(READSOCKETS, throw not_implemented(),) \
|
|
X(WRITESOCKETINT, throw not_implemented(),) \
|
|
X(WRITESOCKETC, throw not_implemented(),) \
|
|
X(WRITESOCKETS, throw not_implemented(),) \
|
|
X(WRITESOCKETSHARE, throw not_implemented(),) \
|
|
X(WRITEFILESHARE, throw not_implemented(),) \
|
|
X(READFILESHARE, throw not_implemented(),) \
|
|
X(PUBINPUT, throw not_implemented(),) \
|
|
X(RAWOUTPUT, throw not_implemented(),) \
|
|
X(INTOUTPUT, throw not_implemented(),) \
|
|
X(FLOATOUTPUT, throw not_implemented(),) \
|
|
X(STARTPRIVATEOUTPUT, throw not_implemented(),) \
|
|
X(GSTARTPRIVATEOUTPUT, throw not_implemented(),) \
|
|
X(STOPPRIVATEOUTPUT, throw not_implemented(),) \
|
|
X(GSTOPPRIVATEOUTPUT, throw not_implemented(),) \
|
|
X(PREP, throw not_implemented(),) \
|
|
X(GPREP, throw not_implemented(),) \
|
|
X(CISC, throw not_implemented(),) \
|
|
X(SECSHUFFLE, throw not_implemented(),) \
|
|
X(GENSECSHUFFLE, throw not_implemented(),) \
|
|
X(APPLYSHUFFLE, throw not_implemented(),) \
|
|
X(DELSHUFFLE, throw not_implemented(),) \
|
|
X(ACTIVE, throw not_implemented(),) \
|
|
X(FIXINPUT, throw not_implemented(),) \
|
|
X(CONCATS, throw not_implemented(),) \
|
|
X(ZIPS, throw not_implemented(),) \
|
|
X(GMATMULS, throw not_implemented(),) \
|
|
X(GMATMULSM, throw not_implemented(),) \
|
|
X(PRINTREGPLAINS, throw not_implemented(),) \
|
|
X(GPRINTREGPLAINS, throw not_implemented(),) \
|
|
X(CALL_TAPE, throw not_implemented(),) \
|
|
X(CMDLINEARG, throw not_implemented(),) \
|
|
X(INITCLIENTCONNECTION, throw not_implemented(),) \
|
|
X(GWRITEFILESHARE, throw not_implemented(),) \
|
|
X(GREADFILESHARE, throw not_implemented(),) \
|
|
|
|
#define ALL_INSTRUCTIONS ARITHMETIC_INSTRUCTIONS REGINT_INSTRUCTIONS \
|
|
CLEAR_GF2N_INSTRUCTIONS REMAINING_INSTRUCTIONS
|
|
|
|
#endif /* PROCESSOR_INSTRUCTIONS_H_ */
|