diff --git a/scripts/update_asm_instructions.py b/scripts/update_asm_instructions.py index bbb06d5..94f9608 100755 --- a/scripts/update_asm_instructions.py +++ b/scripts/update_asm_instructions.py @@ -266,6 +266,16 @@ class Instruction(object): return ret + def _handle_null_case(self, case): + """ + Return code to handle an instruction case that takes no arguments. + """ + return [ + TAB + "if (INST_NARGS == 0) {", + self._handle_return(case["return"], 2), + TAB + "}" + ] + def _handle_pseudo_case(self, pseudo, case): """ Return code to handle an instruction pseudo-case. @@ -294,6 +304,9 @@ class Instruction(object): Return code to handle an instruction case. """ ctype = case["type"] + if not ctype: + return self._handle_null_case(case) + for pseudo in self.PSEUDO_TYPES: if pseudo in ctype: return self._handle_pseudo_case(pseudo, case) diff --git a/src/assembler/instructions.c b/src/assembler/instructions.c index ac2558f..04e0cea 100644 --- a/src/assembler/instructions.c +++ b/src/assembler/instructions.c @@ -65,8 +65,6 @@ static ASMErrorDesc parse_inst_##mnemonic( \ INST_ERROR(TOO_MANY_ARGS) #define INST_TAKES_ARGS(a0, a1, a2) \ - if (!ap_info.arg) \ - INST_ERROR(TOO_FEW_ARGS) \ ASMInstArg args[3]; \ size_t nargs; \ ASMArgType masks[] = {a0, a1, a2}; \ diff --git a/src/assembler/instructions.inc.c b/src/assembler/instructions.inc.c index c368a00..3e3ce2a 100644 --- a/src/assembler/instructions.inc.c +++ b/src/assembler/instructions.inc.c @@ -7,7 +7,7 @@ `make` should trigger a rebuild when it is modified; if not, use: `python scripts/update_asm_instructions.py`. - @AUTOGEN_DATE Wed May 20 06:40:09 2015 UTC + @AUTOGEN_DATE Wed May 20 06:53:00 2015 UTC */ /* @AUTOGEN_INST_BLOCK_START */ @@ -1652,6 +1652,38 @@ INST_FUNC(res) INST_ERROR(ARG_TYPE) } +INST_FUNC(ret) +{ + INST_TAKES_ARGS( + AT_CONDITION|AT_OPTIONAL, + AT_NONE, + AT_NONE + ) + if (INST_NARGS == 0) { + INST_RETURN(1, 0xC9) + } + if (INST_NARGS == 1 && INST_TYPE(0) == AT_CONDITION) { + if (INST_COND(0) == COND_NZ) + INST_RETURN(1, 0xC0) + if (INST_COND(0) == COND_Z) + INST_RETURN(1, 0xC8) + if (INST_COND(0) == COND_NC) + INST_RETURN(1, 0xD0) + if (INST_COND(0) == COND_C) + INST_RETURN(1, 0xD8) + if (INST_COND(0) == COND_PO) + INST_RETURN(1, 0xE0) + if (INST_COND(0) == COND_PE) + INST_RETURN(1, 0xE8) + if (INST_COND(0) == COND_P) + INST_RETURN(1, 0xF0) + if (INST_COND(0) == COND_M) + INST_RETURN(1, 0xF8) + INST_ERROR(ARG_VALUE) + } + INST_ERROR(ARG_TYPE) +} + INST_FUNC(reti) { INST_TAKES_NO_ARGS @@ -2032,6 +2064,7 @@ static ASMInstParser lookup_parser(uint32_t key) HANDLE(pop) HANDLE(push) HANDLE(res) + HANDLE(ret) HANDLE(reti) HANDLE(retn) HANDLE(rla) diff --git a/src/assembler/instructions.yml b/src/assembler/instructions.yml index 6815608..ad68719 100644 --- a/src/assembler/instructions.yml +++ b/src/assembler/instructions.yml @@ -1110,9 +1110,29 @@ res: - cond: [bit.7, _, l] return: [0xCB, 0xBD] -# ret: -# args: yes -# return: TODO +ret: + args: yes + cases: + - type: [] + return: [0xC9] + - type: [condition] + cases: + - cond: [nz] + return: [0xC0] + - cond: [z] + return: [0xC8] + - cond: [nc] + return: [0xD0] + - cond: [c] + return: [0xD8] + - cond: [po] + return: [0xE0] + - cond: [pe] + return: [0xE8] + - cond: [p] + return: [0xF0] + - cond: [m] + return: [0xF8] reti: args: no