Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Creating fastest Mul31




On 17 nov 2005, at 10:27, Rustam Muginov wrote:

I am interested what would be fastest implementation of the following multiplication:

#define Mul31(x,y) ((int32)(((int64)(x) * (y)) >> 31))

obviously, int32 and int64 are signed 32 and 64 integers.

Currently i am using:
inline int32 Mul31(int32 x, int32 y)
{
  register int hi_prod, lo_prod, result;
  asm
  {
    mullw lo_prod, x, y
    srwi lo_prod, lo_prod, 31

    mulhw hi_prod, x, y
    slwi hi_prod, hi_prod, 1

    or result, hi_prod, lo_prod;
  }
  return result;
}

Is it possible to make it faster?

You can replace the "slwi" and "or" at the end with a rlwimi (if you put the result of the mullhw immediately in result instead of in hi_prod), but I doubt it will make that much of a difference (majority of the time is spent multiplying). Something like (untested)


mullhw result, x, y
rlwimi result, lo_prod, 1, 0, 30


Jonas

_______________________________________________
Do not post admin requests to the list. They will be ignored.
PerfOptimization-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/perfoptimization-dev/email@hidden

This email sent to email@hidden
References: 
 >Creating fastest Mul31 (From: Rustam Muginov <email@hidden>)



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.