Detect correct instruction with incorrect operands
Display a different warning when an instruction is recognized by tcc but the operands found do not correspond to the constraints of the instruction.
This commit is contained in:
		
							parent
							
								
									45b35a3d66
								
							
						
					
					
						commit
						a1a691a030
					
				
					 3 changed files with 6 additions and 2 deletions
				
			
		| 
						 | 
					@ -27,6 +27,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TOK_ASM_first TOK_ASM_clc
 | 
					#define TOK_ASM_first TOK_ASM_clc
 | 
				
			||||||
#define TOK_ASM_last TOK_ASM_emms
 | 
					#define TOK_ASM_last TOK_ASM_emms
 | 
				
			||||||
 | 
					#define TOK_ASM_alllast TOK_ASM_pxor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPC_JMP        0x01  /* jmp operand */
 | 
					#define OPC_JMP        0x01  /* jmp operand */
 | 
				
			||||||
#define OPC_B          0x02  /* only used with OPC_WL */
 | 
					#define OPC_B          0x02  /* only used with OPC_WL */
 | 
				
			||||||
| 
						 | 
					@ -715,6 +716,9 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode)
 | 
				
			||||||
                g(b >> 8);
 | 
					                g(b >> 8);
 | 
				
			||||||
            g(b);
 | 
					            g(b);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
 | 
					        } else if (opcode <= TOK_ASM_alllast) {
 | 
				
			||||||
 | 
					            tcc_error("bad operand with opcode '%s'",
 | 
				
			||||||
 | 
					                  get_tok_str(opcode, NULL));
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            tcc_error("unknown opcode '%s'",
 | 
					            tcc_error("unknown opcode '%s'",
 | 
				
			||||||
                  get_tok_str(opcode, NULL));
 | 
					                  get_tok_str(opcode, NULL));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -463,7 +463,7 @@ ALT(DEF_ASM_OP2(psrlq, 0x0f73, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))
 | 
				
			||||||
    DEF_ASM_OP2(punpcklbw, 0x0f60, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(punpcklbw, 0x0f60, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
				
			||||||
    DEF_ASM_OP2(punpcklwd, 0x0f61, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(punpcklwd, 0x0f61, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
				
			||||||
    DEF_ASM_OP2(punpckldq, 0x0f62, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(punpckldq, 0x0f62, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
				
			||||||
    DEF_ASM_OP2(pxor, 0x0fef, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(pxor, 0x0fef, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX ) /* must be last !OP0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef ALT
 | 
					#undef ALT
 | 
				
			||||||
#undef DEF_ASM_OP0
 | 
					#undef DEF_ASM_OP0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -438,7 +438,7 @@ ALT(DEF_ASM_OP2(psrlq, 0x0f73, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))
 | 
				
			||||||
    DEF_ASM_OP2(punpcklbw, 0x0f60, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(punpcklbw, 0x0f60, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
				
			||||||
    DEF_ASM_OP2(punpcklwd, 0x0f61, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(punpcklwd, 0x0f61, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
				
			||||||
    DEF_ASM_OP2(punpckldq, 0x0f62, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(punpckldq, 0x0f62, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
				
			||||||
    DEF_ASM_OP2(pxor, 0x0fef, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )
 | 
					    DEF_ASM_OP2(pxor, 0x0fef, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX ) /* must be last !OP0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef ALT
 | 
					#undef ALT
 | 
				
			||||||
#undef DEF_ASM_OP0
 | 
					#undef DEF_ASM_OP0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue