📄 translate.c.svn-base
字号:
GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ gen_op_##name(); \ gen_op_store_T0_gpr(rD(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}/* Two operands arithmetic functions */#define GEN_INT_ARITH2(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH2(name, opc1, opc2, opc3, 0x00000000, type) \__GEN_INT_ARITH2_O(name##o, opc1, opc2, opc3 | 0x10, 0x00000000, type)/* Two operands arithmetic functions with no overflow allowed */#define GEN_INT_ARITHN(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH2(name, opc1, opc2, opc3, 0x00000400, type)/* One operand arithmetic functions */#define GEN_INT_ARITH1(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH1(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH1_O(name##o, opc1, opc2, opc3 | 0x10, type)#if defined(TARGET_PPC64)#define __GEN_INT_ARITH2_64(name, opc1, opc2, opc3, inval, type) \GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ gen_op_load_gpr_T1(rB(ctx->opcode)); \ if (ctx->sf_mode) \ gen_op_##name##_64(); \ else \ gen_op_##name(); \ gen_op_store_T0_gpr(rD(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}#define __GEN_INT_ARITH2_O_64(name, opc1, opc2, opc3, inval, type) \GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ gen_op_load_gpr_T1(rB(ctx->opcode)); \ if (ctx->sf_mode) \ gen_op_##name##_64(); \ else \ gen_op_##name(); \ gen_op_store_T0_gpr(rD(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}#define __GEN_INT_ARITH1_64(name, opc1, opc2, opc3, type) \GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ if (ctx->sf_mode) \ gen_op_##name##_64(); \ else \ gen_op_##name(); \ gen_op_store_T0_gpr(rD(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}#define __GEN_INT_ARITH1_O_64(name, opc1, opc2, opc3, type) \GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ if (ctx->sf_mode) \ gen_op_##name##_64(); \ else \ gen_op_##name(); \ gen_op_store_T0_gpr(rD(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}/* Two operands arithmetic functions */#define GEN_INT_ARITH2_64(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH2_64(name, opc1, opc2, opc3, 0x00000000, type) \__GEN_INT_ARITH2_O_64(name##o, opc1, opc2, opc3 | 0x10, 0x00000000, type)/* Two operands arithmetic functions with no overflow allowed */#define GEN_INT_ARITHN_64(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH2_64(name, opc1, opc2, opc3, 0x00000400, type)/* One operand arithmetic functions */#define GEN_INT_ARITH1_64(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH1_64(name, opc1, opc2, opc3, type) \__GEN_INT_ARITH1_O_64(name##o, opc1, opc2, opc3 | 0x10, type)#else#define GEN_INT_ARITH2_64 GEN_INT_ARITH2#define GEN_INT_ARITHN_64 GEN_INT_ARITHN#define GEN_INT_ARITH1_64 GEN_INT_ARITH1#endif/* add add. addo addo. */static always_inline void gen_op_addo (void){ gen_op_move_T2_T0(); gen_op_add(); gen_op_check_addo();}#if defined(TARGET_PPC64)#define gen_op_add_64 gen_op_addstatic always_inline void gen_op_addo_64 (void){ gen_op_move_T2_T0(); gen_op_add(); gen_op_check_addo_64();}#endifGEN_INT_ARITH2_64 (add, 0x1F, 0x0A, 0x08, PPC_INTEGER);/* addc addc. addco addco. */static always_inline void gen_op_addc (void){ gen_op_move_T2_T0(); gen_op_add(); gen_op_check_addc();}static always_inline void gen_op_addco (void){ gen_op_move_T2_T0(); gen_op_add(); gen_op_check_addc(); gen_op_check_addo();}#if defined(TARGET_PPC64)static always_inline void gen_op_addc_64 (void){ gen_op_move_T2_T0(); gen_op_add(); gen_op_check_addc_64();}static always_inline void gen_op_addco_64 (void){ gen_op_move_T2_T0(); gen_op_add(); gen_op_check_addc_64(); gen_op_check_addo_64();}#endifGEN_INT_ARITH2_64 (addc, 0x1F, 0x0A, 0x00, PPC_INTEGER);/* adde adde. addeo addeo. */static always_inline void gen_op_addeo (void){ gen_op_move_T2_T0(); gen_op_adde(); gen_op_check_addo();}#if defined(TARGET_PPC64)static always_inline void gen_op_addeo_64 (void){ gen_op_move_T2_T0(); gen_op_adde_64(); gen_op_check_addo_64();}#endifGEN_INT_ARITH2_64 (adde, 0x1F, 0x0A, 0x04, PPC_INTEGER);/* addme addme. addmeo addmeo. */static always_inline void gen_op_addme (void){ gen_op_move_T1_T0(); gen_op_add_me();}#if defined(TARGET_PPC64)static always_inline void gen_op_addme_64 (void){ gen_op_move_T1_T0(); gen_op_add_me_64();}#endifGEN_INT_ARITH1_64 (addme, 0x1F, 0x0A, 0x07, PPC_INTEGER);/* addze addze. addzeo addzeo. */static always_inline void gen_op_addze (void){ gen_op_move_T2_T0(); gen_op_add_ze(); gen_op_check_addc();}static always_inline void gen_op_addzeo (void){ gen_op_move_T2_T0(); gen_op_add_ze(); gen_op_check_addc(); gen_op_check_addo();}#if defined(TARGET_PPC64)static always_inline void gen_op_addze_64 (void){ gen_op_move_T2_T0(); gen_op_add_ze(); gen_op_check_addc_64();}static always_inline void gen_op_addzeo_64 (void){ gen_op_move_T2_T0(); gen_op_add_ze(); gen_op_check_addc_64(); gen_op_check_addo_64();}#endifGEN_INT_ARITH1_64 (addze, 0x1F, 0x0A, 0x06, PPC_INTEGER);/* divw divw. divwo divwo. */GEN_INT_ARITH2 (divw, 0x1F, 0x0B, 0x0F, PPC_INTEGER);/* divwu divwu. divwuo divwuo. */GEN_INT_ARITH2 (divwu, 0x1F, 0x0B, 0x0E, PPC_INTEGER);/* mulhw mulhw. */GEN_INT_ARITHN (mulhw, 0x1F, 0x0B, 0x02, PPC_INTEGER);/* mulhwu mulhwu. */GEN_INT_ARITHN (mulhwu, 0x1F, 0x0B, 0x00, PPC_INTEGER);/* mullw mullw. mullwo mullwo. */GEN_INT_ARITH2 (mullw, 0x1F, 0x0B, 0x07, PPC_INTEGER);/* neg neg. nego nego. */GEN_INT_ARITH1_64 (neg, 0x1F, 0x08, 0x03, PPC_INTEGER);/* subf subf. subfo subfo. */static always_inline void gen_op_subfo (void){ gen_op_moven_T2_T0(); gen_op_subf(); gen_op_check_addo();}#if defined(TARGET_PPC64)#define gen_op_subf_64 gen_op_subfstatic always_inline void gen_op_subfo_64 (void){ gen_op_moven_T2_T0(); gen_op_subf(); gen_op_check_addo_64();}#endifGEN_INT_ARITH2_64 (subf, 0x1F, 0x08, 0x01, PPC_INTEGER);/* subfc subfc. subfco subfco. */static always_inline void gen_op_subfc (void){ gen_op_subf(); gen_op_check_subfc();}static always_inline void gen_op_subfco (void){ gen_op_moven_T2_T0(); gen_op_subf(); gen_op_check_subfc(); gen_op_check_addo();}#if defined(TARGET_PPC64)static always_inline void gen_op_subfc_64 (void){ gen_op_subf(); gen_op_check_subfc_64();}static always_inline void gen_op_subfco_64 (void){ gen_op_moven_T2_T0(); gen_op_subf(); gen_op_check_subfc_64(); gen_op_check_addo_64();}#endifGEN_INT_ARITH2_64 (subfc, 0x1F, 0x08, 0x00, PPC_INTEGER);/* subfe subfe. subfeo subfeo. */static always_inline void gen_op_subfeo (void){ gen_op_moven_T2_T0(); gen_op_subfe(); gen_op_check_addo();}#if defined(TARGET_PPC64)#define gen_op_subfe_64 gen_op_subfestatic always_inline void gen_op_subfeo_64 (void){ gen_op_moven_T2_T0(); gen_op_subfe_64(); gen_op_check_addo_64();}#endifGEN_INT_ARITH2_64 (subfe, 0x1F, 0x08, 0x04, PPC_INTEGER);/* subfme subfme. subfmeo subfmeo. */GEN_INT_ARITH1_64 (subfme, 0x1F, 0x08, 0x07, PPC_INTEGER);/* subfze subfze. subfzeo subfzeo. */GEN_INT_ARITH1_64 (subfze, 0x1F, 0x08, 0x06, PPC_INTEGER);/* addi */GEN_HANDLER(addi, 0x0E, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_long simm = SIMM(ctx->opcode); if (rA(ctx->opcode) == 0) { /* li case */ gen_set_T0(simm); } else { gen_op_load_gpr_T0(rA(ctx->opcode)); if (likely(simm != 0)) gen_op_addi(simm); } gen_op_store_T0_gpr(rD(ctx->opcode));}/* addic */GEN_HANDLER(addic, 0x0C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_long simm = SIMM(ctx->opcode); gen_op_load_gpr_T0(rA(ctx->opcode)); if (likely(simm != 0)) { gen_op_move_T2_T0(); gen_op_addi(simm);#if defined(TARGET_PPC64) if (ctx->sf_mode) gen_op_check_addc_64(); else#endif gen_op_check_addc(); } else { gen_op_clear_xer_ca(); } gen_op_store_T0_gpr(rD(ctx->opcode));}/* addic. */GEN_HANDLER2(addic_, "addic.", 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_long simm = SIMM(ctx->opcode); gen_op_load_gpr_T0(rA(ctx->opcode)); if (likely(simm != 0)) { gen_op_move_T2_T0(); gen_op_addi(simm);#if defined(TARGET_PPC64) if (ctx->sf_mode) gen_op_check_addc_64(); else#endif gen_op_check_addc(); } else { gen_op_clear_xer_ca(); } gen_op_store_T0_gpr(rD(ctx->opcode)); gen_set_Rc0(ctx);}/* addis */GEN_HANDLER(addis, 0x0F, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_long simm = SIMM(ctx->opcode); if (rA(ctx->opcode) == 0) { /* lis case */ gen_set_T0(simm << 16); } else { gen_op_load_gpr_T0(rA(ctx->opcode)); if (likely(simm != 0)) gen_op_addi(simm << 16); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -