-#define FIRM_OP(a) op_##a->ops.generic = (op_func)gen_##a
-#define BAD(a) op_##a->ops.generic = (op_func)bad_transform
-#define IGN(a)
-
- FIRM_OP(Add); // done
- FIRM_OP(Mul); // done
- FIRM_OP(Quot); // done
- FIRM_OP(And); // done
- FIRM_OP(Or); // done
- FIRM_OP(Eor); // done
-
- FIRM_OP(Sub); // done
- FIRM_OP(Shl); // done
- FIRM_OP(Shr); // done
- FIRM_OP(Shrs); // done
-
- FIRM_OP(Minus); // done
- FIRM_OP(Not); // done
- FIRM_OP(Abs); // done
-
- FIRM_OP(CopyB); // done
- FIRM_OP(Const); // TODO: floating point consts
- FIRM_OP(Conv); // TODO: floating point conversions
-
- FIRM_OP(Load); // done
- FIRM_OP(Store); // done
-
- FIRM_OP(SymConst);
- FIRM_OP(Cond); // integer done
-
- /* TODO: implement these nodes */
-
- IGN(Div); // intrinsic lowering
- IGN(Mod); // intrinsic lowering
- IGN(DivMod); // TODO: implement DivMod
-
- IGN(Mux);
- IGN(Unknown);
- IGN(Cmp); // done, implemented in cond
-
- /* You probably don't need to handle the following nodes */
-
- IGN(Call);
- IGN(Proj);
- IGN(Alloc);
-
- IGN(Block);
- IGN(Start);
- IGN(End);
- IGN(NoMem);
- IGN(Phi);
- IGN(IJmp);
- IGN(Jmp); // emitter done
- IGN(Break);
- IGN(Sync);
-
- BAD(Raise);
- BAD(Sel);
- BAD(InstOf);
- BAD(Cast);
- BAD(Free);
- BAD(Tuple);
- BAD(Id);
- BAD(Bad);
- BAD(Confirm);
- BAD(Filter);
- BAD(CallBegin);
- BAD(EndReg);
- BAD(EndExcept);
-
- FIRM_OP(be_FrameAddr);
-
- op_Max = get_op_Max();
- if (op_Max)
- BAD(Max);
- op_Min = get_op_Min();
- if (op_Min)
- BAD(Min);
- op_Mulh = get_op_Mulh();
- if (op_Mulh)
- BAD(Mulh);
-
-#undef IGN
-#undef FIRM_OP
-#undef BAD
+ set_transformer(op_Abs, gen_Abs);
+ set_transformer(op_Add, gen_Add);
+ set_transformer(op_And, gen_And);
+ set_transformer(op_be_AddSP, gen_be_AddSP);
+ set_transformer(op_be_Call, gen_be_Call);
+ set_transformer(op_be_Copy, gen_be_Copy);
+ set_transformer(op_be_FrameAddr, gen_be_FrameAddr);
+ set_transformer(op_be_SubSP, gen_be_SubSP);
+ set_transformer(op_Cmp, gen_Cmp);
+ set_transformer(op_Cond, gen_Cond);
+ set_transformer(op_Const, gen_Const);
+ set_transformer(op_Conv, gen_Conv);
+ set_transformer(op_CopyB, gen_CopyB);
+ set_transformer(op_Eor, gen_Eor);
+ set_transformer(op_Jmp, gen_Jmp);
+ set_transformer(op_Load, gen_Load);
+ set_transformer(op_Minus, gen_Minus);
+ set_transformer(op_Mul, gen_Mul);
+ set_transformer(op_Not, gen_Not);
+ set_transformer(op_Or, gen_Or);
+ set_transformer(op_Phi, gen_Phi);
+ set_transformer(op_Proj, gen_Proj);
+ set_transformer(op_Quot, gen_Quot);
+ set_transformer(op_Rotl, gen_Rotl);
+ set_transformer(op_Shl, gen_Shl);
+ set_transformer(op_Shr, gen_Shr);
+ set_transformer(op_Shrs, gen_Shrs);
+ set_transformer(op_Store, gen_Store);
+ set_transformer(op_Sub, gen_Sub);
+ set_transformer(op_SymConst, gen_SymConst);
+ set_transformer(op_Unknown, gen_Unknown);
+
+ set_transformer(op_ASM, bad_transform);
+ set_transformer(op_Builtin, bad_transform);
+ set_transformer(op_CallBegin, bad_transform);
+ set_transformer(op_Cast, bad_transform);
+ set_transformer(op_Confirm, bad_transform);
+ set_transformer(op_DivMod, bad_transform);
+ set_transformer(op_EndExcept, bad_transform);
+ set_transformer(op_EndReg, bad_transform);
+ set_transformer(op_Filter, bad_transform);
+ set_transformer(op_Free, bad_transform);
+ set_transformer(op_Id, bad_transform);
+ set_transformer(op_InstOf, bad_transform);
+ set_transformer(op_Mulh, bad_transform);
+ set_transformer(op_Mux, bad_transform);
+ set_transformer(op_Raise, bad_transform);
+ set_transformer(op_Sel, bad_transform);
+ set_transformer(op_Tuple, bad_transform);