| @@ -240,29 +240,29 @@ int csr_pseudo_main(void) · 239 unmodified lines |
| 240 | 240 | asm volatile("csrr %0, 0x003" : "=r"(old)); |
| 241 | 241 | |
| 242 | 242 | asm volatile("csrr %0, 0x003" : "=r"(tmp)); |
| 243 | | − //printf("csrr fcsr=%x\n", (unsigned)tmp); |
| 243 | + printf("csrr fcsr=%x\n", (unsigned)tmp); |
| 244 | 244 | |
| 245 | 245 | asm volatile("csrw 0x003, %0" : : "r"(0xE0)); |
| 246 | 246 | asm volatile("csrr %0, 0x003" : "=r"(tmp)); |
| 247 | | − //printf("csrw: wrote e0 got %x\n", (unsigned)tmp); |
| 247 | + printf("csrw: wrote e0 got %x\n", (unsigned)tmp); |
| 248 | 248 | if (tmp != 0xE0) { printf("FAIL: csrw\n"); ok = 0; } |
| 249 | 249 | asm volatile("csrw 0x003, %0" : : "r"(old)); |
| 250 | 250 | |
| 251 | 251 | asm volatile("csrwi 0x003, 0x10"); |
| 252 | 252 | asm volatile("csrr %0, 0x003" : "=r"(tmp)); |
| 253 | | − //printf("csrwi: wrote 0x10 got %x\n", (unsigned)tmp); |
| 253 | + printf("csrwi: wrote 0x10 got %x\n", (unsigned)tmp); |
| 254 | 254 | if (tmp != 0x10) { printf("FAIL: csrwi\n"); ok = 0; } |
| 255 | 255 | asm volatile("csrw 0x003, %0" : : "r"(old)); |
| 256 | 256 | |
| 257 | 257 | asm volatile("csrsi 0x003, 0x03"); |
| 258 | 258 | asm volatile("csrr %0, 0x003" : "=r"(tmp)); |
| 259 | | − //printf("csrsi: old|3=%x\n", (unsigned)tmp); |
| 259 | + printf("csrsi: old|3=%x\n", (unsigned)tmp); |
| 260 | 260 | if ((old | 0x03) != tmp) { printf("FAIL: csrsi\n"); ok = 0; } |
| 261 | 261 | asm volatile("csrw 0x003, %0" : : "r"(old)); |
| 262 | 262 | |
| 263 | 263 | asm volatile("csrci 0x003, 0x03"); |
| 264 | 264 | asm volatile("csrr %0, 0x003" : "=r"(tmp)); |
| 265 | | − //printf("csrci: old&~3=%x\n", (unsigned)tmp); |
| 265 | + printf("csrci: old&~3=%x\n", (unsigned)tmp); |
| 266 | 266 | if ((old & ~0x03) != tmp) { printf("FAIL: csrci\n"); ok = 0; } |
| 267 | 267 | asm volatile("csrw 0x003, %0" : : "r"(old)); |
| 268 | 268 | |
| @@ -297,34 +297,30 @@ int fp_cmp_cvt_main(void) · 28 unmodified lines |
| 297 | 297 | |
| 298 | 298 | int amo_main(void) |
| 299 | 299 | { |
| 300 | | − /* AMO base (all funct5 now match GNU as) */ |
| 301 | | − asm volatile("amoadd.w a0, a1, (sp)"); |
| 302 | | − asm volatile("amoswap.w a0, a1, (sp)"); |
| 303 | | − asm volatile("amoand.w a0, a1, (sp)"); |
| 304 | | − asm volatile("amoor.d a0, a1, (sp)"); |
| 305 | | − asm volatile("amoxor.w a0, a1, (sp)"); |
| 306 | | − asm volatile("amomax.w a0, a1, (sp)"); |
| 307 | | − asm volatile("amomaxu.d a0, a1, (sp)"); |
| 308 | | − asm volatile("amomin.w a0, a1, (sp)"); |
| 309 | | − asm volatile("amominu.d a0, a1, (sp)"); |
| 310 | | − |
| 311 | | − /* AMO aq/rl ordering suffixes */ |
| 312 | | − asm volatile("amoadd.w.aq a0, a1, (sp)"); |
| 313 | | − asm volatile("amoadd.w.rl a0, a1, (sp)"); |
| 314 | | − asm volatile("amoadd.d.aqrl a0, a1, (sp)"); |
| 315 | | − |
| 300 | + int x = 0, r; |
| 301 | + long long xd = 0xCAFEBABECAFEBABELL, rd, val = 0xDEADBEEFDEADBEEFLL; |
| 302 | + asm("amoadd.w %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 303 | + asm("amoswap.w %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 304 | + asm("amoand.w %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 305 | + asm("amoor.d %0, %2, (%1)" : "=r"(rd) : "r"(&xd), "r"(val)); |
| 306 | + asm("amoxor.w %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 307 | + asm("amomax.w %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 308 | + asm("amomaxu.d %0, %2, (%1)" : "=r"(rd) : "r"(&xd), "r"(val)); |
| 309 | + asm("amomin.w %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 310 | + asm("amominu.d %0, %2, (%1)" : "=r"(rd) : "r"(&xd), "r"(val)); |
| 311 | + asm("amoadd.w.aq %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 312 | + asm("amoadd.w.rl %0, %2, (%1)" : "=r"(r) : "r"(&x), "r"(val)); |
| 313 | + asm("amoadd.d.aqrl %0, %2, (%1)" : "=r"(rd) : "r"(&xd), "r"(val)); |
| 316 | 314 | return 1; |
| 317 | 315 | } |
| 318 | 316 | |
| 319 | 317 | int fcvt_round_main(void) |
| 320 | 318 | { |
| 321 | | − /* fcvt with optional rounding mode operand (GNU as syntax) */ |
| 322 | 319 | asm volatile("fcvt.w.s a0, fa0, rne"); |
| 323 | 320 | asm volatile("fcvt.w.s a0, fa0, rtz"); |
| 324 | 321 | asm volatile("fcvt.w.s a0, fa0, rup"); |
| 325 | 322 | asm volatile("fcvt.w.d a0, fa0, rne"); |
| 326 | 323 | asm volatile("fcvt.w.d a0, fa0, rtz"); |
| 327 | | − |
| 328 | 324 | return 1; |
| 329 | 325 | } |
| 330 | 326 | |
| @@ -336,7 +332,7 @@ int main() · 5 unmodified lines |
| 336 | 332 | ok &= test_farith(); |
| 337 | 333 | ok &= csr_pseudo_main(); |
| 338 | 334 | ok &= fp_cmp_cvt_main(); |
| 339 | | − //ok &= amo_main(); //crash on qemu |
| 335 | + ok &= amo_main(); |
| 340 | 336 | ok &= fcvt_round_main(); |
| 341 | 337 | printf("%s\n", ok ? "PASS" : "FAIL"); |
| 342 | 338 | return !ok; |