8 /* interpret the bitstream representing val as a base 256 number for testing
15 for (i = 0; i < 8; i++) {
17 sum = sum + bit * scale;
24 void test_parity_instrs()
26 unsigned long long_word;
30 for (i = 0; i < 50; i++) {
33 __asm__ volatile ("prtyd %0, %1":"=r" (parity):"r"(long_word));
34 printf("prtyd (%x) => parity=%x\n", i, parity);
35 __asm__ volatile ("prtyw %0, %1":"=r" (parity):"r"(word));
36 printf("prtyw (%x) => parity=%x\n", i, parity);
52 base = (unsigned long) &foo;
54 __asm__ volatile ("lfiwax %0, %1, %2":"=f" (FRT1):"r"(base),
56 ip = (int_pair_t *) & FRT1;
57 printf("lfiwax (%f) => FRT=(%x, %x)\n", foo, ip->hi, ip->lo);
64 /* lfdp FPp, DS(RA) : load float double pair
65 ** FPp = leftmost 64 bits stored at DS(RA)
66 ** FPp+1= rightmost 64 bits stored at DS(RA)
67 ** FPp must be an even float register
69 int test_double_pair_instrs()
76 /* the following decls are for alignment */
86 dbl_pair_t dbl_pair[3]; /* must be quad word aligned */
90 for (i = 0; i < 3; i++) {
91 dbl_pair[i].hi = -1024.0 + i;
92 dbl_pair[i].lo = 1024.0 + i + 1;
95 __asm__ volatile ("lfdp 10, %0"::"m" (dbl_pair[0]));
96 __asm__ volatile ("fmr %0, 10":"=f" (FRT1));
97 __asm__ volatile ("fmr %0, 11":"=f" (FRT2));
98 printf("lfdp (%f, %f) => F_hi=%f, F_lo=%f\n",
99 dbl_pair[0].hi, dbl_pair[0].lo, FRT1, FRT2);
104 __asm__ volatile ("fmr 10, %0"::"f" (FRT1));
105 __asm__ volatile ("fmr 11, %0"::"f" (FRT2));
106 __asm__ volatile ("stfdp 10, %0"::"m" (dbl_pair[1]));
107 printf("stfdp (%f, %f) => F_hi=%f, F_lo=%f\n",
108 FRT1, FRT2, dbl_pair[1].hi, dbl_pair[1].lo);
112 base = (unsigned long) &dbl_pair;
113 offset = (unsigned long) &dbl_pair[1] - base;
114 __asm__ volatile ("or 20, 0, %0"::"r" (base));
115 __asm__ volatile ("or 21, 0, %0"::"r" (offset));
116 __asm__ volatile ("lfdpx 10, 20, 21");
117 __asm__ volatile ("fmr %0, 10":"=f" (FRT1));
118 __asm__ volatile ("fmr %0, 11":"=f" (FRT2));
119 printf("lfdpx (%f, %f) => F_hi=%f, F_lo=%f\n",
120 dbl_pair[1].hi, dbl_pair[1].lo, FRT1, FRT2);
124 base = (unsigned long) &dbl_pair;
125 offset = (unsigned long) &dbl_pair[2] - base;
126 __asm__ volatile ("or 20, 0, %0"::"r" (base));
127 __asm__ volatile ("or 21, 0, %0"::"r" (offset));
128 __asm__ volatile ("fmr %0, 10":"=f" (FRT1));
129 __asm__ volatile ("fmr %0, 11":"=f" (FRT2));
130 __asm__ volatile ("stfdpx 10, 20, 21");
131 printf("stfdpx (%f, %f) => F_hi=%f, F_lo=%f\n",
132 FRT1, FRT2, dbl_pair[2].hi, dbl_pair[2].lo);
134 return i + j + k + l + m + n + o;
136 return i + j + k + l;
141 /* The contents of FRB with bit set 0 set to bit 0 of FRA copied into FRT */
158 double FRT, FRA, FRB;
161 for (i = 0; i < 4; i++) {
163 for (j = 0; j < 4; j++) {
165 __asm__ volatile ("fcpsgn %0, %1, %2":"=f" (FRT):"f"(FRA),
167 printf("fcpsgn sign=%f, base=%f => %f\n", FRA, FRB, FRT);
172 /* b0 may be non-zero in lwarx/ldarx Power6 instrs */
173 int test_reservation()
179 unsigned long offset;
180 long arr[4] = { 0xdeadbeef, 0xbad0beef, 0xbeefdead, 0xbeef0bad };
183 base = (unsigned long) &arr;
184 offset = (unsigned long) &arr[1] - base;
185 __asm__ volatile ("or 20, 0, %0"::"r" (base));
186 __asm__ volatile ("or 21, 0, %0"::"r" (offset));
187 __asm__ volatile ("lwarx %0, 20, 21, 1":"=r" (RT));
188 printf("lwarx => %x\n", RT);
191 offset = (unsigned long) &arr[1] - base;
192 __asm__ volatile ("or 21, 0, %0"::"r" (offset));
193 __asm__ volatile ("ldarx %0, 20, 21, 1":"=r" (RT));
194 printf("ldarx => %x\n", RT);
201 (void) test_reservation();
203 (void) test_double_pair_instrs();
205 test_parity_instrs();