diff options
Diffstat (limited to 'results/classifier/108/other/2865')
| -rw-r--r-- | results/classifier/108/other/2865 | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/results/classifier/108/other/2865 b/results/classifier/108/other/2865 new file mode 100644 index 000000000..9feee338c --- /dev/null +++ b/results/classifier/108/other/2865 @@ -0,0 +1,67 @@ +device: 0.653 +graphic: 0.618 +PID: 0.473 +socket: 0.439 +performance: 0.433 +vnc: 0.390 +network: 0.364 +other: 0.326 +debug: 0.298 +boot: 0.235 +semantic: 0.210 +KVM: 0.187 +files: 0.161 +permissions: 0.161 + +loongarch64: wrong implementation of `xvldi` instruction +Description of problem: +Consider this sample program. + +```c++ +#include <cstdio> +#include <cstdint> +#include <lsxintrin.h> +#include <lasxintrin.h> + +void dump_u32(__m256i x) { + uint32_t tmp[32/4]; + __lasx_xvst(x, tmp, 0); + putchar('['); + for (int i=0; i < 32/4; i++) { + if (i > 0) { + putchar(' '); + } + + printf("%08x", tmp[i]); + } + puts("]"); +} + +int main() { + __m256i const1 = __lasx_xvldi(-3832); + dump_u32(const1); +} +``` + +The magic constants here means: replicate in 32-bit words a byte (0x4) shifted left by 8. We should have a vector of words 0x800, and indeed, the program run on a real hardware prints expected: + +``` +[00000800 00000800 00000800 00000800 00000800 00000800 00000800 00000800] +``` + +The same program run under Qemu prints: + +``` +[08000800 00000000 08000800 00000000 08000800 00000000 08000800 00000000] +``` +Additional information: +I grabbed the latest sources, it seems there's bug in `target/loongarch/tcg/insn_trans/trans_vec.c.inc`, in function `vldi_get_value`. + +```c + case 1: + /* data: {2{16'0, imm[7:0], 8'0}} */ + data = (t << 24) | (t << 8); + break; +``` + +There should be `(t << (8+32)) | t << 8`. |