diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-03-10 10:30:16 +0100 |
---|---|---|
committer | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-03-10 10:30:16 +0100 |
commit | e37e366c826a0dc422e449b9ad0afa70be204e12 (patch) | |
tree | 3bcc0c14099862614d19c95fee0edc7b388720b3 /runtime/c/i64_sar.c | |
parent | 8aae10b50b321cfcbde86582cdd7ce1df8960628 (diff) | |
parent | 3e01154d693e1c457e1e974f5e9ebaa4601050aa (diff) | |
download | compcert-e37e366c826a0dc422e449b9ad0afa70be204e12.tar.gz compcert-e37e366c826a0dc422e449b9ad0afa70be204e12.zip |
Merge branch 'master' into dwarf
Diffstat (limited to 'runtime/c/i64_sar.c')
-rw-r--r-- | runtime/c/i64_sar.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/runtime/c/i64_sar.c b/runtime/c/i64_sar.c new file mode 100644 index 00000000..a5f3364a --- /dev/null +++ b/runtime/c/i64_sar.c @@ -0,0 +1,56 @@ +/***************************************************************** + * + * The Compcert verified compiler + * + * Xavier Leroy, INRIA Paris-Rocquencourt + * + * Copyright (c) 2013 Institut National de Recherche en Informatique et + * en Automatique. + * + * 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 <organization> 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 <COPYRIGHT + * HOLDER> 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. + * + **********************************************************************/ + +/* Helper functions for 64-bit integer arithmetic. Reference C implementation */ + +#include "i64.h" + +/* Shift right signed */ + +signed long long __i64_sar(signed long long x, int amount) +{ + unsigned xl = x; + int xh = x >> 32; + amount = amount & 63; + if (amount == 0) { + return x; + } + else if (amount < 32) { + unsigned rl = (xl >> amount) | (xh << (32 - amount)); + int rh = xh >> amount; + return rl | ((signed long long) rh << 32); + } else { + return (signed long long) (xh >> (amount - 32)); + } +} |