Revision 33ebc293 target-arm/neon_helper.c
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