brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · a19a13f Raw
109 lines · c
1#include <stdint.h>2 3#ifdef LASX4#define ELEM_COUNT 325#define REPLGR2VR_B "xvreplgr2vr.b $xr"6#define ST "xvst $xr"7#else8#define ELEM_COUNT 169#define REPLGR2VR_B "vreplgr2vr.b $vr"10#define ST "vst $vr"11#endif12 13// base is added to each value. If base = 2, then14// assume the vector element type is char:15// $reg0 = { 0x02 * $ELEM_COUNT }16// $reg1 = { 0x03 * $ELEM_COUNT } etc.17void write_simd_regs(unsigned base) {18#define WRITE_SIMD(NUM)                                                        \19  asm volatile(REPLGR2VR_B #NUM ", %0\n\t" ::"r"(base + NUM))20  WRITE_SIMD(0);21  WRITE_SIMD(1);22  WRITE_SIMD(2);23  WRITE_SIMD(3);24  WRITE_SIMD(4);25  WRITE_SIMD(5);26  WRITE_SIMD(6);27  WRITE_SIMD(7);28  WRITE_SIMD(8);29  WRITE_SIMD(9);30  WRITE_SIMD(10);31  WRITE_SIMD(11);32  WRITE_SIMD(12);33  WRITE_SIMD(13);34  WRITE_SIMD(14);35  WRITE_SIMD(15);36  WRITE_SIMD(16);37  WRITE_SIMD(17);38  WRITE_SIMD(18);39  WRITE_SIMD(19);40  WRITE_SIMD(20);41  WRITE_SIMD(21);42  WRITE_SIMD(22);43  WRITE_SIMD(23);44  WRITE_SIMD(24);45  WRITE_SIMD(25);46  WRITE_SIMD(26);47  WRITE_SIMD(27);48  WRITE_SIMD(28);49  WRITE_SIMD(29);50  WRITE_SIMD(30);51  WRITE_SIMD(31);52}53 54unsigned verify_simd_regs() {55  uint8_t simd_reg[ELEM_COUNT];56  uint8_t target = 0;57 58#define VERIFY_SIMD(NUM)                                                       \59  do {                                                                         \60    for (int i = 0; i < ELEM_COUNT; ++i)                                       \61      simd_reg[i] = 0;                                                         \62    asm volatile(ST #NUM ", %0\n\t" ::"m"(simd_reg));                          \63    target = NUM + 1;                                                          \64    for (int i = 0; i < ELEM_COUNT; ++i)                                       \65      if (simd_reg[i] != target)                                               \66        return 1;                                                              \67  } while (0)68 69  VERIFY_SIMD(0);70  VERIFY_SIMD(1);71  VERIFY_SIMD(2);72  VERIFY_SIMD(3);73  VERIFY_SIMD(4);74  VERIFY_SIMD(5);75  VERIFY_SIMD(6);76  VERIFY_SIMD(7);77  VERIFY_SIMD(8);78  VERIFY_SIMD(9);79  VERIFY_SIMD(10);80  VERIFY_SIMD(11);81  VERIFY_SIMD(12);82  VERIFY_SIMD(13);83  VERIFY_SIMD(14);84  VERIFY_SIMD(15);85  VERIFY_SIMD(16);86  VERIFY_SIMD(17);87  VERIFY_SIMD(18);88  VERIFY_SIMD(19);89  VERIFY_SIMD(20);90  VERIFY_SIMD(21);91  VERIFY_SIMD(22);92  VERIFY_SIMD(23);93  VERIFY_SIMD(24);94  VERIFY_SIMD(25);95  VERIFY_SIMD(26);96  VERIFY_SIMD(27);97  VERIFY_SIMD(28);98  VERIFY_SIMD(29);99  VERIFY_SIMD(30);100  VERIFY_SIMD(31);101 102  return 0;103}104int main(int argc, char *argv[]) {105  write_simd_regs(0);106 107  return verify_simd_regs(); // Set break point at this line.108}109