From b4c05977c28c38d2f81b48d0cb15559dc3d05564 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 24 Feb 2010 16:36:18 -0800 Subject: Optimize more easy multiplications by constants. Rather than make these changes in the libraries (*10 being a common case), let's do them once and for all in the JIT. The 2^n-1 case could be better if we generated RSB instructions, but the current "fake" RSB is still better than a full multiply. Thumb doesn't support reg/reg/reg/shift instructions, so we can't optimize the "population count <= 2" cases (such as *10) there. Tested on sholes, passion, and passion-running-sapphire (and visually inspected to check we weren't trying to generate Thumb2 instructions there). Also tested with the self-verifier. --- vm/compiler/codegen/arm/Thumb/Gen.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'vm/compiler/codegen/arm/Thumb/Gen.c') diff --git a/vm/compiler/codegen/arm/Thumb/Gen.c b/vm/compiler/codegen/arm/Thumb/Gen.c index a274e1928..35c4451b7 100644 --- a/vm/compiler/codegen/arm/Thumb/Gen.c +++ b/vm/compiler/codegen/arm/Thumb/Gen.c @@ -289,3 +289,12 @@ static bool genInlinedAbsLong(CompilationUnit *cUnit, MIR *mir) dvmCompilerClobber(cUnit, ophi); return false; } + +static void genMultiplyByTwoBitMultiplier(CompilationUnit *cUnit, + RegLocation rlSrc, RegLocation rlResult, int lit, + int firstBit, int secondBit) +{ + // We can't implement "add src, src, src, lsl#shift" on Thumb, so we have + // to do a regular multiply. + opRegRegImm(cUnit, kOpMul, rlResult.lowReg, rlSrc.lowReg, lit); +} -- cgit v1.2.3