break;
}
}
- void onInteger(int64_t TmpInt) {
+ bool onInteger(int64_t TmpInt, StringRef &ErrMsg) {
IntelExprState CurrState = State;
switch (State) {
default:
assert (!IndexReg && "IndexReg already set!");
IndexReg = TmpReg;
Scale = TmpInt;
+ if(Scale != 1 && Scale != 2 && Scale != 4 && Scale != 8) {
+ ErrMsg = "scale factor in address must be 1, 2, 4 or 8";
+ return true;
+ }
// Get the scale and replace the 'Register * Scale' with '0'.
IC.popOperator();
} else if ((PrevState == IES_PLUS || PrevState == IES_MINUS ||
break;
}
PrevState = CurrState;
+ return false;
}
void onStar() {
PrevState = State;
return Error(Tok.getLoc(), "Unexpected identifier!");
}
case AsmToken::Integer: {
+ StringRef ErrMsg;
if (isParsingInlineAsm() && SM.getAddImmPrefix())
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix,
Tok.getLoc()));
SM.onIdentifierExpr(Val, Identifier);
End = consumeToken();
} else {
- SM.onInteger(IntVal);
+ if (SM.onInteger(IntVal, ErrMsg))
+ return Error(Loc, ErrMsg);
}
} else {
- SM.onInteger(IntVal);
+ if (SM.onInteger(IntVal, ErrMsg))
+ return Error(Loc, ErrMsg);
}
break;
}
--- /dev/null
+// RUN: not llvm-mc -triple x86_64-unknown-unknown %s 2> %t.err
+// RUN: FileCheck < %t.err %s
+
+.intel_syntax
+
+// CHECK: error: scale factor in address must be 1, 2, 4 or 8
+ lea rax, [rdi + rdx*64]
+// CHECK: error: scale factor in address must be 1, 2, 4 or 8
+ lea rax, [rdi + rdx*32]
+// CHECK: error: scale factor in address must be 1, 2, 4 or 8
+ lea rax, [rdi + rdx*16]