| # mach: frv fr500 fr550 |
| # sim: --memory-region 0xff000000,4 --memory-region 0xfe000000,00404000 |
| # xfail: "crashes with bad write" frv-* |
| |
| ; Exit with return code |
| |
| .macro exit rc |
| setlos.p #1,gr7 |
| setlos \rc,gr8 |
| tira gr0,#0 |
| .endm |
| |
| ; Pass the test case |
| .macro pass |
| pass: |
| setlos.p #5,gr10 |
| setlos #1,gr8 |
| setlos #5,gr7 |
| sethi.p %hi(passmsg),gr9 |
| setlo %lo(passmsg),gr9 |
| tira gr0,#0 |
| exit #0 |
| .endm |
| |
| ; Fail the testcase |
| .macro fail |
| fail\@: |
| setlos.p #5,gr10 |
| setlos #1,gr8 |
| setlos #5,gr7 |
| sethi.p %hi(failmsg),gr9 |
| setlo %lo(failmsg),gr9 |
| tira gr0,#0 |
| exit #1 |
| .endm |
| |
| .data |
| failmsg: |
| .ascii "fail\n" |
| passmsg: |
| .ascii "pass\n" |
| |
| .text |
| .global _start |
| _start: |
| movsg hsr0,gr10 ; enable insn and data caches |
| sethi.p 0xc800,gr11 ; in copy-back mode |
| setlo 0x0000,gr11 |
| or gr10,gr11,gr10 |
| movgs gr10,hsr0 |
| |
| sethi.p 0x7,sp |
| setlo 0x0000,sp |
| |
| ; fill the cache |
| sethi.p %hi(done1),gr10 |
| setlo %lo(done1),gr10 |
| movgs gr10,lr |
| setlos.p 0x1000,gr10 |
| setlos 0x0,gr11 |
| movgs gr10,lcr |
| write1: st.p gr11,@(sp,gr11) |
| addi.p gr11,4,gr11 |
| bctrlr.p 1,0 |
| bra write1 |
| done1: |
| ; read it back |
| sethi.p %hi(done2),gr10 |
| setlo %lo(done2),gr10 |
| movgs gr10,lr |
| setlos.p 0x1000,gr10 |
| setlos 0x0,gr11 |
| movgs gr10,lcr |
| read1: ld @(sp,gr11),gr12 |
| cmp gr11,gr12,icc0 |
| bne icc0,1,fail |
| addi.p gr11,4,gr11 |
| bctrlr.p 1,0 |
| bra read1 |
| done2: |
| |
| ; fill the cache twice |
| sethi.p %hi(done3),gr10 |
| setlo %lo(done3),gr10 |
| movgs gr10,lr |
| setlos.p 0x2000,gr10 |
| setlos 0x0,gr11 |
| movgs gr10,lcr |
| write3: st.p gr11,@(sp,gr11) |
| addi.p gr11,4,gr11 |
| bctrlr.p 1,0 |
| bra write3 |
| done3: |
| ; read it back |
| sethi.p %hi(done4),gr10 |
| setlo %lo(done4),gr10 |
| movgs gr10,lr |
| setlos.p 0x2000,gr10 |
| setlos 0x0,gr11 |
| movgs gr10,lcr |
| read4: ld @(sp,gr11),gr12 |
| cmp gr11,gr12,icc0 |
| bne icc0,1,fail |
| addi.p gr11,4,gr11 |
| bctrlr.p 1,0 |
| bra read4 |
| done4: |
| ; read it back in reverse |
| sethi.p %hi(done5),gr10 |
| setlo %lo(done5),gr10 |
| movgs gr10,lr |
| setlos.p 0x2000,gr10 |
| setlos 0x7ffc,gr11 |
| movgs gr10,lcr |
| read5: ld @(sp,gr11),gr12 |
| cmp gr11,gr12,icc0 |
| bne icc0,1,fail |
| subi.p gr11,4,gr11 |
| bctrlr.p 1,0 |
| bra read5 |
| done5: |
| |
| ; access data and insns in non-cache areas |
| sethi.p 0x8038,gr11 ; bctrlr 0,0 |
| setlo 0x2000,gr11 |
| |
| sethi.p 0xff00,gr10 ; documented area |
| setlo 0x0000,gr10 |
| sti gr11,@(gr10,0) |
| jmpl @(gr10,gr0) |
| |
| ; enable RAM mode |
| movsg hsr0,gr10 |
| sethi.p 0x0040,gr12 |
| setlo 0x0000,gr12 |
| or gr10,gr12,gr10 |
| movgs gr10,hsr0 |
| |
| sethi.p 0xfe00,gr10 ; documented area |
| setlo 0x0400,gr10 |
| sti gr11,@(gr10,0) |
| jmpl @(gr10,gr0) |
| |
| sethi.p 0xfe40,gr10 ; documented area |
| setlo 0x0400,gr10 |
| sti gr11,@(gr10,0) |
| dcf @(gr10,gr0) |
| jmpl @(gr10,gr0) |
| |
| sethi.p 0x0007,gr10 ; non RAM area |
| setlo 0x0000,gr10 |
| sti gr11,@(gr10,0) |
| jmpl @(gr10,gr0) |
| |
| sethi.p 0xfe00,gr10 ; insn RAM area |
| setlo 0x0000,gr10 |
| sti gr11,@(gr10,0) |
| jmpl @(gr10,gr0) |
| |
| sethi.p 0xfe40,gr10 ; data RAM area |
| setlo 0x0000,gr10 |
| sti gr11,@(gr10,0) |
| dcf @(gr10,gr0) |
| jmpl @(gr10,gr0) |
| |
| pass |
| fail: |
| fail |