From 5692716770e9e2e733d0e7ab6ce0bd70cb830aba Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 11 Jul 2016 21:41:15 +0200 Subject: x86-asm: Fix lar opcode operands lar can accept multiple sizes as well (wlx), like lsl. When using autosize it's important to look at the destination operand first; when it's a register that one determines the size, not the input operand. --- i386-asm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'i386-asm.c') diff --git a/i386-asm.c b/i386-asm.c index 136fe60..71c451a 100644 --- a/i386-asm.c +++ b/i386-asm.c @@ -733,7 +733,11 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode) autosize = NBWLX-2; #endif if (s == autosize) { - for(i = 0; s == autosize && i < nb_ops; i++) { + /* Check for register operands providing hints about the size. + Start from the end, i.e. destination operands. This matters + only for opcodes accepting different sized registers, lar and lsl + are such opcodes. */ + for(i = nb_ops - 1; s == autosize && i >= 0; i--) { if ((ops[i].type & OP_REG) && !(op_type[i] & (OP_CL | OP_DX))) s = reg_to_size[ops[i].type & OP_REG]; } -- cgit v1.3.1