| /* |

| * Copyright (c) 2001, 2003-2005 The Regents of The University of Michigan |

| * All rights reserved. |

| * |

| * Redistribution and use in source and binary forms, with or without |

| * modification, are permitted provided that the following conditions are |

| * met: redistributions of source code must retain the above copyright |

| * notice, this list of conditions and the following disclaimer; |

| * redistributions in binary form must reproduce the above copyright |

| * notice, this list of conditions and the following disclaimer in the |

| * documentation and/or other materials provided with the distribution; |

| * neither the name of the copyright holders nor the names of its |

| * contributors may be used to endorse or promote products derived from |

| * this software without specific prior written permission. |

| * |

| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |

| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |

| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |

| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |

| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |

| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |

| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |

| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |

| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |

| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |

| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |

| * |

| * Authors: Nathan Binkert |

| * Steve Reinhardt |

| */ |

| |

| #include "base/intmath.hh" |

| |

| int |

| prevPrime(int n) |

| { |

| int decr; |

| |

| // If the number is even, let's start with the previous odd number. |

| if (!(n & 1)) |

| --n; |

| |

| // Lets test for divisibility by 3. Then we will be able to easily |

| // avoid numbers that are divisible by 3 in the future. |

| decr = n % 3; |

| if (decr == 0) { |

| n -= 2; |

| decr = 2; |

| } |

| else if (decr == 1) |

| decr = 4; |

| |

| for (;;) { |

| if (isPrime(n)) |

| return n; |

| n -= decr; |

| // Toggle between 2 and 4 to prevent trying numbers that are known |

| // to be divisible by 3. |

| decr = 6 - decr; |

| } |

| } |