Files
MP-SPDZ/Processor/instructions.h
2025-12-24 13:47:42 +11:00

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_ */