From 51ecf60dca9f98eeda1818814de6a344e197802f Mon Sep 17 00:00:00 2001 From: Bill Buzbee Date: Thu, 14 Jan 2010 14:27:52 -0800 Subject: Fix bad long negate; bug 2373405 - EnumSetTest failure with JIT today --- vm/compiler/codegen/arm/CodegenDriver.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'vm/compiler/codegen') diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c index 010e8ca23..d6cb5d6c1 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.c +++ b/vm/compiler/codegen/arm/CodegenDriver.c @@ -1048,12 +1048,15 @@ static bool genArithOpLong(CompilationUnit *cUnit, MIR *mir, secondOp = kOpXor; break; case OP_NEG_LONG: { + //TUNING: can improve this using Thumb2 code + int tReg = allocTemp(cUnit); rlSrc2 = loadValueWide(cUnit, rlSrc2, kCoreReg); rlResult = evalLoc(cUnit, rlDest, kCoreReg, true); - loadConstantValue(cUnit, rlResult.highReg, 0); + loadConstantValue(cUnit, tReg, 0); opRegRegReg(cUnit, kOpSub, rlResult.lowReg, - rlResult.highReg, rlSrc2.lowReg); - opRegReg(cUnit, kOpSbc, rlResult.highReg, rlSrc2.highReg); + tReg, rlSrc2.lowReg); + opRegReg(cUnit, kOpSbc, tReg, rlSrc2.highReg); + genRegCopy(cUnit, rlResult.highReg, tReg); storeValueWide(cUnit, rlDest, rlResult); return false; } -- cgit v1.2.3