* Parse a memory operand. */
| 112 | * Parse a memory operand. |
| 113 | */ |
| 114 | static MemOp parseMemOp(Parser &parser, int t) |
| 115 | { |
| 116 | MemOp memop; |
| 117 | switch (t) |
| 118 | { |
| 119 | case TOKEN_MEM8: |
| 120 | memop.size = sizeof(int8_t); break; |
| 121 | case TOKEN_MEM16: |
| 122 | memop.size = sizeof(int16_t); break; |
| 123 | case TOKEN_MEM32: |
| 124 | memop.size = sizeof(int32_t); break; |
| 125 | case TOKEN_MEM64: |
| 126 | memop.size = sizeof(int64_t); break; |
| 127 | default: |
| 128 | parser.unexpectedToken(); |
| 129 | } |
| 130 | |
| 131 | intptr_t disp64 = 0x0; |
| 132 | intptr_t scale64 = 1; |
| 133 | memop.seg = REGISTER_NONE; |
| 134 | memop.disp = 0x0; |
| 135 | memop.base = REGISTER_NONE; |
| 136 | memop.index = REGISTER_NONE; |
| 137 | memop.scale = 1; |
| 138 | |
| 139 | parser.expectToken('<'); |
| 140 | if (parser.peekToken() == TOKEN_REGISTER) |
| 141 | { |
| 142 | parser.getToken(); |
| 143 | memop.seg = (Register)parser.i; |
| 144 | parser.expectToken(':'); |
| 145 | } |
| 146 | bool neg = false; |
| 147 | switch (parser.peekToken()) |
| 148 | { |
| 149 | case '-': |
| 150 | neg = true; |
| 151 | // Fallthrough: |
| 152 | case '+': |
| 153 | parser.getToken(); |
| 154 | // Fallthrough: |
| 155 | case TOKEN_INTEGER: |
| 156 | parser.expectToken(TOKEN_INTEGER); |
| 157 | disp64 = (neg? -parser.i: parser.i); |
| 158 | break; |
| 159 | default: |
| 160 | break; |
| 161 | } |
| 162 | |
| 163 | if (parser.peekToken() != '(') |
| 164 | goto memop_validate; |
| 165 | parser.getToken(); |
| 166 | |
| 167 | switch (parser.getToken()) |
| 168 | { |
| 169 | case ',': |
| 170 | break; |
| 171 | case TOKEN_NIL: case TOKEN_REGISTER: |
no test coverage detected