📄 parser.y
字号:
} | FP_MOVE_OPS_REV2 F_DEST F_SRC1 { mips32_r2_inst (); } | MOVEC_OPS DEST SRC1 CC_REG { r_type_inst ($1.i, $2.i, $3.i, cc_to_rt ($4.i, 0, 0)); } | FP_MOVEC_OPS F_DEST F_SRC1 REG { r_co_type_inst ($1.i, $2.i, $3.i, $4.i); } | FP_MOVECC_OPS F_DEST F_SRC1 CC_REG { r_co_type_inst ($1.i, $2.i, $3.i, cc_to_rt ($4.i, 0, 0)); } | FP_MOVECC_OPS_REV2 F_DEST F_SRC1 CC_REG { mips32_r2_inst (); } | FP_MOVEC_OPS_REV2 F_DEST F_SRC1 REG { mips32_r2_inst (); } | MOVE_FROM_HILO_OPS REG { r_type_inst ($1.i, $2.i, 0, 0); } | MOVE_TO_HILO_OPS REG { r_type_inst ($1.i, 0, $2.i, 0); } | MOVEC_OPS DEST SRC1 SRC2 { r_type_inst ($1.i, $2.i, $3.i, $4.i); } | MOVE_COP_OPS REG COP_REG { if ($1.i == Y_MFC1_D_POP) { r_co_type_inst (Y_MFC1_OP, 0, $3.i, $2.i); r_co_type_inst (Y_MFC1_OP, 0, $3.i + 1, $2.i + 1); } else if ($1.i == Y_MTC1_D_POP) { r_co_type_inst (Y_MTC1_OP, 0, $3.i, $2.i); r_co_type_inst (Y_MTC1_OP, 0, $3.i + 1, $2.i + 1); } else r_co_type_inst ($1.i, 0, $3.i, $2.i); } | MOVE_COP_OPS_REV2 REG COP_REG { mips32_r2_inst (); } | CTL_COP_OPS REG COP_REG { r_co_type_inst ($1.i, 0, $3.i, $2.i); } | FP_UNARY_OPS F_DEST F_SRC2 { r_co_type_inst ($1.i, $2.i, $3.i, 0); } | FP_UNARY_OPS_REV2 F_DEST F_SRC2 { mips32_r2_inst (); } | FP_BINARY_OPS F_DEST F_SRC1 F_SRC2 { r_co_type_inst ($1.i, $2.i, $3.i, $4.i); } | FP_BINARY_OPS_REV2 F_DEST F_SRC1 F_SRC2 { mips32_r2_inst (); } | FP_TERNARY_OPS_REV2 F_DEST F_SRC1 F_SRC2 FP_REGISTER { mips32_r2_inst (); } | FP_CMP_OPS F_SRC1 F_SRC2 { r_cond_type_inst ($1.i, $2.i, $3.i, 0); } | FP_CMP_OPS CC_REG F_SRC1 F_SRC2 { r_cond_type_inst ($1.i, $3.i, $4.i, $2.i); } | FP_CMP_OPS_REV2 F_SRC1 F_SRC2 { mips32_r2_inst (); } | Y_COP2_OP IMM32 { i_type_inst_free ($1.i, 0, 0, (imm_expr *)$2.p); } ;LOAD_OPS: Y_LB_OP | Y_LBU_OP | Y_LH_OP | Y_LHU_OP | Y_LL_OP | Y_LW_OP | Y_LWL_OP | Y_LWR_OP | Y_PFW_OP | Y_LD_POP ;LOADI_OPS: Y_LUI_OP ;ULOADH_POPS: Y_ULH_POP | Y_ULHU_POP ;LOADC_OPS: Y_LDC2_OP | Y_LWC2_OP ;LOADFP_OPS: Y_LDC1_OP | Y_LWC1_OP | Y_L_D_POP { $$.i = Y_LDC1_OP; } | Y_L_S_POP { $$.i = Y_LWC1_OP; } ;LOADFP_INDEX_OPS: Y_LDXC1_OP | Y_LUXC1_OP | Y_LWXC1_OP ;STORE_OPS: Y_SB_OP | Y_SC_OP | Y_SH_OP | Y_SW_OP | Y_SWL_OP | Y_SWR_OP | Y_SD_POP ;STOREC_OPS: Y_SWC2_OP | Y_SDC2_OP | Y_S_D_POP { $$.i = Y_SDC1_OP; } | Y_S_S_POP { $$.i = Y_SWC1_OP; } ;STOREFP_OPS: Y_SWC1_OP | Y_SDC1_OP ;STOREFP_INDEX_OPS: Y_SDXC1_OP | Y_SUXC1_OP | Y_SWXC1_OP ;SYS_OPS: Y_RFE_OP {#ifdef MIPS1 yywarn ("RFE should only be used when SPIM is compiled as a MIPS-I processor");#endif } | Y_SYSCALL_OP ;PREFETCH_OPS: Y_PREFX_OP | Y_SYNCI_OP ;CACHE_OPS: Y_CACHE_OP | Y_PREF_OP ;TLB_OPS: Y_TLBP_OP | Y_TLBR_OP | Y_TLBWI_OP | Y_TLBWR_OP ;NULLARY_OPS: Y_ERET_OP {#ifdef MIPS1 yywarn ("ERET should only be used when SPIM is compiled as a MIPS32 processor");#endif } ;NULLARY_OPS_REV2: Y_DERET_OP | Y_EHB_OP | Y_SDBBP_OP ;COUNT_LEADING_OPS: Y_CLO_OP | Y_CLZ_OP ;UNARY_OPS_REV2: Y_DI_OP | Y_EI_OP ;/* These binary operations have immediate analogues. */BINARYI_OPS: Y_ADD_OP | Y_ADDU_OP | Y_AND_OP | Y_XOR_OP | Y_OR_OP | Y_SLT_OP | Y_SLTU_OP ;BINARYIR_OPS: Y_SLLV_OP | Y_SRAV_OP | Y_SRLV_OP ;BINARY_ARITHI_OPS: Y_ADDI_OP | Y_ADDIU_OP | Y_SLTI_OP | Y_SLTIU_OP ;BINARY_LOGICALI_OPS: Y_ANDI_OP | Y_ORI_OP | Y_XORI_OP ;SHIFT_OPS: Y_SLL_OP | Y_SRA_OP | Y_SRL_OP ;SHIFT_OPS_REV2: Y_ROTR_OP ;SHIFTV_OPS_REV2: Y_ROTRV_OP ;/* These binary operations do not have immediate analogues. */BINARY_OPS: Y_NOR_OP ;BINARY_OPS_REV2: Y_RDHWR_OP | Y_RDPGPR_OP | Y_SEB_OP | Y_SEH_OP | Y_WRPGPR_OP | Y_WSBH_OP ;SUB_OPS: Y_SUB_OP | Y_SUBU_OP ;DIV_POPS: Y_DIV_OP | Y_DIVU_OP | Y_REM_POP | Y_REMU_POP ;MUL_POPS: Y_MULO_POP | Y_MULOU_POP ;SET_LE_POPS: Y_SLE_POP | Y_SLEU_POP ;SET_GT_POPS: Y_SGT_POP | Y_SGTU_POP ;SET_GE_POPS: Y_SGE_POP | Y_SGEU_POP ;SET_EQ_POPS: Y_SEQ_POP | Y_SNE_POP ;MULT_OPS: Y_MULT_OP | Y_MULTU_OP | Y_MADD_OP | Y_MADDU_OP | Y_MSUB_OP | Y_MSUBU_OP ;MULT_OPS3: Y_MUL_OP ;BF_OPS_REV2: Y_EXT_OP | Y_INS_OP ;BR_COP_OPS: Y_BC1F_OP | Y_BC1FL_OP | Y_BC1T_OP | Y_BC1TL_OP | Y_BC2F_OP | Y_BC2FL_OP | Y_BC2T_OP | Y_BC2TL_OP ;UNARY_BR_OPS: Y_BGEZ_OP | Y_BGEZL_OP | Y_BGEZAL_OP | Y_BGEZALL_OP | Y_BGTZ_OP | Y_BGTZL_OP | Y_BLEZ_OP | Y_BLEZL_OP | Y_BLTZ_OP | Y_BLTZL_OP | Y_BLTZAL_OP | Y_BLTZALL_OP ;UNARY_BR_POPS: Y_BEQZ_POP | Y_BNEZ_POP ;BINARY_BR_OPS: Y_BEQ_OP | Y_BEQL_OP | Y_BNE_OP | Y_BNEL_OP ;BR_GT_POPS: Y_BGT_POP | Y_BGTU_POPBR_GE_POPS: Y_BGE_POP | Y_BGEU_POPBR_LT_POPS: Y_BLT_POP | Y_BLTU_POPBR_LE_POPS: Y_BLE_POP | Y_BLEU_POP ;J_OPS: Y_J_OP | Y_JR_OP | Y_JR_HB_OP { yywarn ("Warning:IPS32 Rev 2 '.HB' extension is not implemented and is ignored"); } | Y_JAL_OP | Y_JALR_OP | Y_JALR_HB_OP { yywarn ("Warning:IPS32 Rev 2 '.HB' extension is not implemented and is ignored"); } ;B_OPS: Y_B_POP | Y_BAL_POP ;UNARY_TRAP_OPS: Y_TEQI_OP | Y_TGEI_OP | Y_TGEIU_OP | Y_TLTI_OP | Y_TLTIU_OP | Y_TNEI_OP ;BINARY_TRAP_OPS: Y_TEQ_OP | Y_TGE_OP | Y_TGEU_OP | Y_TLT_OP | Y_TLTU_OP | Y_TNE_OP ;MOVE_FROM_HILO_OPS: Y_MFHI_OP | Y_MFLO_OP ;MOVE_TO_HILO_OPS: Y_MTHI_OP | Y_MTLO_OP ;MOVEC_OPS: Y_MOVN_OP | Y_MOVZ_OP ;MOVE_COP_OPS: Y_MFC0_OP | Y_MFC1_OP | Y_MFC1_D_POP | Y_MFC2_OP | Y_MTC0_OP | Y_MTC1_OP | Y_MTC1_D_POP | Y_MTC2_OP ;MOVE_COP_OPS_REV2: Y_MFHC1_OP | Y_MFHC2_OP | Y_MTHC1_OP | Y_MTHC2_OP ;CTL_COP_OPS: Y_CFC0_OP | Y_CFC1_OP | Y_CFC2_OP | Y_CTC0_OP | Y_CTC1_OP | Y_CTC2_OP ;/* Floating point operations */FP_MOVE_OPS: Y_MOV_S_OP | Y_MOV_D_OP ;FP_MOVE_OPS_REV2: Y_MOV_PS_OP ;MOVEC_OPS: Y_MOVF_OP | Y_MOVT_OP ;FP_MOVEC_OPS: Y_MOVN_D_OP | Y_MOVN_S_OP | Y_MOVZ_D_OP | Y_MOVZ_S_OP ;FP_MOVEC_OPS_REV2: Y_MOVN_PS_OP | Y_MOVZ_PS_OP ;FP_MOVECC_OPS: Y_MOVF_D_OP | Y_MOVF_S_OP | Y_MOVT_D_OP | Y_MOVT_S_OP ;FP_MOVECC_OPS_REV2: Y_MOVF_PS_OP | Y_MOVT_PS_OP ;FP_UNARY_OPS: Y_ABS_S_OP | Y_ABS_D_OP | Y_CEIL_W_D_OP | Y_CEIL_W_S_OP | Y_CVT_D_S_OP | Y_CVT_D_W_OP | Y_CVT_S_D_OP | Y_CVT_S_W_OP | Y_CVT_W_D_OP | Y_CVT_W_S_OP | Y_FLOOR_W_D_OP | Y_FLOOR_W_S_OP | Y_NEG_S_OP | Y_NEG_D_OP | Y_ROUND_W_D_OP | Y_ROUND_W_S_OP | Y_SQRT_D_OP | Y_SQRT_S_OP | Y_TRUNC_W_D_OP | Y_TRUNC_W_S_OP ;FP_UNARY_OPS_REV2: Y_ABS_PS_OP | Y_CEIL_L_D_OP | Y_CEIL_L_S_OP | Y_CVT_D_L_OP | Y_CVT_L_D_OP | Y_CVT_L_S_OP | Y_CVT_PS_S_OP | Y_CVT_S_L_OP | Y_CVT_S_PL_OP | Y_CVT_S_PU_OP | Y_FLOOR_L_D_OP | Y_FLOOR_L_S_OP | Y_NEG_PS_OP | Y_RECIP_D_OP | Y_RECIP_S_OP | Y_ROUND_L_D_OP | Y_ROUND_L_S_OP | Y_RSQRT_D_OP | Y_RSQRT_S_OP | Y_TRUNC_L_D_OP | Y_TRUNC_L_S_OP ;FP_BINARY_OPS: Y_ADD_S_OP | Y_ADD_D_OP | Y_DIV_S_OP | Y_DIV_D_OP | Y_MUL_S_OP | Y_MUL_D_OP | Y_SUB_S_OP | Y_SUB_D_OP ;FP_BINARY_OPS_REV2: Y_ADD_PS_OP | Y_MUL_PS_OP | Y_PLL_PS_OP | Y_PLU_PS_OP | Y_PUL_PS_OP | Y_PUU_PS_OP ;FP_TERNARY_OPS_REV2: Y_ALNV_PS_OP | Y_MADD_D_OP | Y_MADD_PS_OP | Y_MADD_S_OP | Y_MSUB_D_OP | Y_MSUB_PS_OP | Y_MSUB_S_OP | Y_NMADD_D_OP | Y_NMADD_PS_OP | Y_NMADD_S_OP | Y_NMSUB_D_OP | Y_NMSUB_PS_OP | Y_NMSUB_S_OP ;FP_CMP_OPS: Y_C_F_S_OP | Y_C_UN_S_OP | Y_C_EQ_S_OP | Y_C_UEQ_S_OP | Y_C_OLT_S_OP | Y_C_OLE_S_OP | Y_C_ULT_S_OP | Y_C_ULE_S_OP | Y_C_SF_S_OP | Y_C_NGLE_S_OP | Y_C_SEQ_S_OP | Y_C_NGL_S_OP | Y_C_LT_S_OP | Y_C_NGE_S_OP | Y_C_LE_S_OP | Y_C_NGT_S_OP | Y_C_F_D_OP | Y_C_UN_D_OP | Y_C_EQ_D_OP | Y_C_UEQ_D_OP | Y_C_OLT_D_OP | Y_C_OLE_D_OP | Y_C_ULT_D_OP | Y_C_ULE_D_OP | Y_C_SF_D_OP | Y_C_NGLE_D_OP | Y_C_SEQ_D_OP | Y_C_NGL_D_OP | Y_C_LT_D_OP | Y_C_NGE_D_OP | Y_C_LE_D_OP | Y_C_NGT_D_OP ;FP_CMP_OPS_REV2: Y_C_EQ_PS_OP | Y_C_F_PS_OP | Y_C_LT_PS_OP | Y_C_LE_PS_OP | Y_C_NGE_PS_OP | Y_C_NGL_PS_OP | Y_C_NGLE_PS_OP | Y_C_NGT_PS_OP | Y_C_OLE_PS_OP | Y_C_OLT_PS_OP | Y_C_SEQ_PS_OP | Y_C_SF_PS_OP | Y_C_UEQ_PS_OP | Y_C_ULE_PS_OP | Y_C_ULT_PS_OP | Y_C_UN_PS_OP ;ASM_DIRECTIVE: Y_ALIAS_DIR Y_REG Y_REG | Y_ALIGN_DIR EXPR { align_data ($2.i); } | Y_ASCII_DIR {null_term = 0;} STR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_ASCIIZ_DIR {null_term = 1;} STR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_ASM0_DIR | Y_BGNB_DIR Y_INT | Y_BYTE_DIR {store_op = store_byte;} EXPR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_COMM_DIR ID EXPR { align_data (2); if (lookup_label ((char*)$2.p)->addr == 0) { (void)record_label ((char*)$2.p, current_data_pc (), 1); free ((char*)$2.p); } increment_data_pc ($3.i); } | Y_DATA_DIR { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); } | Y_DATA_DIR Y_INT { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); set_data_pc ($2.i); } | Y_K_DATA_DIR { user_kernel_data_segment (1); data_dir = 1; text_dir = 0; enable_data_alignment (); } | Y_K_DATA_DIR Y_INT { user_kernel_data_segment (1); data_dir = 1; text_dir = 0; enable_data_alignment (); set_data_pc ($2.i); } | Y_DOUBLE_DIR { store_op = store_double; if (data_dir) set_data_alignment (3); } FP_EXPR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_END_DIR OPTIONAL_ID | Y_ENDB_DIR Y_INT | Y_ENDR_DIR | Y_ENT_DIR ID | Y_ENT_DIR ID Y_INT | Y_EXTERN_DIR ID EXPR { extern_directive ((char*)$2.p, $3.i); } | Y_ERR_DIR {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -