| @@ -266,6 +266,16 @@ class Instruction(object): | |||||
| return ret | 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): | def _handle_pseudo_case(self, pseudo, case): | ||||
| """ | """ | ||||
| Return code to handle an instruction pseudo-case. | Return code to handle an instruction pseudo-case. | ||||
| @@ -294,6 +304,9 @@ class Instruction(object): | |||||
| Return code to handle an instruction case. | Return code to handle an instruction case. | ||||
| """ | """ | ||||
| ctype = case["type"] | ctype = case["type"] | ||||
| if not ctype: | |||||
| return self._handle_null_case(case) | |||||
| for pseudo in self.PSEUDO_TYPES: | for pseudo in self.PSEUDO_TYPES: | ||||
| if pseudo in ctype: | if pseudo in ctype: | ||||
| return self._handle_pseudo_case(pseudo, case) | return self._handle_pseudo_case(pseudo, case) | ||||
| @@ -65,8 +65,6 @@ static ASMErrorDesc parse_inst_##mnemonic( \ | |||||
| INST_ERROR(TOO_MANY_ARGS) | INST_ERROR(TOO_MANY_ARGS) | ||||
| #define INST_TAKES_ARGS(a0, a1, a2) \ | #define INST_TAKES_ARGS(a0, a1, a2) \ | ||||
| if (!ap_info.arg) \ | |||||
| INST_ERROR(TOO_FEW_ARGS) \ | |||||
| ASMInstArg args[3]; \ | ASMInstArg args[3]; \ | ||||
| size_t nargs; \ | size_t nargs; \ | ||||
| ASMArgType masks[] = {a0, a1, a2}; \ | ASMArgType masks[] = {a0, a1, a2}; \ | ||||
| @@ -7,7 +7,7 @@ | |||||
| `make` should trigger a rebuild when it is modified; if not, use: | `make` should trigger a rebuild when it is modified; if not, use: | ||||
| `python scripts/update_asm_instructions.py`. | `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 */ | /* @AUTOGEN_INST_BLOCK_START */ | ||||
| @@ -1652,6 +1652,38 @@ INST_FUNC(res) | |||||
| INST_ERROR(ARG_TYPE) | 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_FUNC(reti) | ||||
| { | { | ||||
| INST_TAKES_NO_ARGS | INST_TAKES_NO_ARGS | ||||
| @@ -2032,6 +2064,7 @@ static ASMInstParser lookup_parser(uint32_t key) | |||||
| HANDLE(pop) | HANDLE(pop) | ||||
| HANDLE(push) | HANDLE(push) | ||||
| HANDLE(res) | HANDLE(res) | ||||
| HANDLE(ret) | |||||
| HANDLE(reti) | HANDLE(reti) | ||||
| HANDLE(retn) | HANDLE(retn) | ||||
| HANDLE(rla) | HANDLE(rla) | ||||
| @@ -1110,9 +1110,29 @@ res: | |||||
| - cond: [bit.7, _, l] | - cond: [bit.7, _, l] | ||||
| return: [0xCB, 0xBD] | 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: | reti: | ||||
| args: no | args: no | ||||