Revision 33ebc293

b/target-arm/neon_helper.c
818 818
#define NEON_FN(dest, src1, src2) do { \
819 819
    int8_t tmp; \
820 820
    tmp = (int8_t)src2; \
821
    if (tmp < 0) { \
821
    if (tmp >= (ssize_t)sizeof(src1) * 8) { \
822
        if (src1) { \
823
            SET_QC(); \
824
            dest = ~0; \
825
        } else { \
826
            dest = 0; \
827
        } \
828
    } else if (tmp < -(ssize_t)sizeof(src1) * 8) { \
829
        dest = 0; \
830
    } else if (tmp == -(ssize_t)sizeof(src1) * 8) { \
831
        dest = src1 >> (sizeof(src1) * 8 - 1); \
832
    } else if (tmp < 0) { \
822 833
        dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \
823 834
    } else { \
824 835
        dest = src1 << tmp; \
......
837 848
{
838 849
    uint32_t dest;
839 850
    int8_t shift = (int8_t)shiftop;
840
    if (shift < 0) {
851
    if (shift >= 32) {
852
        if (val) {
853
            SET_QC();
854
            dest = ~0;
855
        } else {
856
            dest = 0;
857
        }
858
    } else if (shift < -32) {
859
        dest = 0;
860
    } else if (shift == -32) {
861
        dest = val >> 31;
862
    } else if (shift < 0) {
841 863
        uint64_t big_dest = ((uint64_t)val + (1 << (-1 - shift)));
842 864
        dest = big_dest >> -shift;
843 865
    } else {
......
855 877
uint64_t HELPER(neon_qrshl_u64)(CPUState *env, uint64_t val, uint64_t shiftop)
856 878
{
857 879
    int8_t shift = (int8_t)shiftop;
858
    if (shift < 0) {
880
    if (shift >= 64) {
881
        if (val) {
882
            SET_QC();
883
            val = ~0;
884
        }
885
    } else if (shift < -64) {
886
        val = 0;
887
    } else if (shift == -64) {
888
        val >>= 63;
889
    } else if (shift < 0) {
859 890
        val >>= (-shift - 1);
860 891
        if (val == UINT64_MAX) {
861 892
            /* In this case, it means that the rounding constant is 1,

Also available in: Unified diff