| # Blackfin testcase for insns that implicitly have DISALGNEXCPT behavior |
| # when used in parallel insns |
| # mach: bfin |
| |
| #include "test.h" |
| .include "testutils.inc" |
| |
| start |
| |
| LINK 0x100; |
| |
| # Set up I0/I1/I2/I3 to be unaligned by 0/1/2/3 bytes |
| init_l_regs 0 |
| init_m_regs 0 |
| R0 = SP; |
| BITCLR (R0, 0); |
| BITCLR (R0, 1); |
| I0 = R0; |
| B0 = R0; |
| R1 = 1; |
| R1 = R0 + R1; |
| I1 = R1; |
| B1 = R1; |
| R2 = 2; |
| R2 = R0 + R2; |
| I2 = R2; |
| B2 = R2; |
| R3 = 3; |
| R3 = R0 + R3; |
| I3 = R3; |
| B3 = R3; |
| |
| #define EXP_VAL 0x12345678 |
| #define EXP(r, n) CHECKREG (r, EXP_VAL); r = 0; I##n = B##n |
| imm32 R5, EXP_VAL; |
| imm32 R6, 0x9abcdef0; |
| imm32 R7, 0x0a1b2c3e; |
| [SP] = R5; |
| [SP - 4] = R6; |
| [SP + 4] = R7; |
| |
| #define BYTEPACK(n) \ |
| R7 = BYTEPACK (R0, R1) || R4 = [I##n]; EXP (R4, n); \ |
| R6 = BYTEPACK (R0, R1) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| R5 = BYTEPACK (R0, R1) || R6 = [I##n++]; EXP (R6, n); \ |
| R4 = BYTEPACK (R0, R1) || R7 = [I##n--]; EXP (R7, n); |
| BYTEPACK(0) |
| BYTEPACK(1) |
| BYTEPACK(2) |
| BYTEPACK(3) |
| |
| #define BYTEUNPACK(n) \ |
| (R7, R5) = BYTEUNPACK R1:0 || R4 = [I##n]; EXP (R4, n); \ |
| (R6, R7) = BYTEUNPACK R3:2 || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| (R5, R4) = BYTEUNPACK R1:0 || R6 = [I##n++]; EXP (R6, n); \ |
| (R4, R6) = BYTEUNPACK R3:2 || R7 = [I##n--]; EXP (R7, n); |
| BYTEUNPACK(0) |
| BYTEUNPACK(1) |
| BYTEUNPACK(2) |
| BYTEUNPACK(3) |
| |
| #define SAA(n) \ |
| SAA (R1:0, R3:2) || R4 = [I##n]; EXP (R4, n); \ |
| SAA (R1:0, R3:2) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| SAA (R1:0, R3:2) || R6 = [I##n++]; EXP (R6, n); \ |
| SAA (R1:0, R3:2) || R7 = [I##n--]; EXP (R7, n); |
| SAA(0) |
| SAA(1) |
| SAA(2) |
| SAA(3) |
| |
| #define BYTEOP1P(n) \ |
| R7 = BYTEOP1P (R1:0, R3:2) || R4 = [I##n]; EXP (R4, n); \ |
| R6 = BYTEOP1P (R1:0, R3:2) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| R5 = BYTEOP1P (R1:0, R3:2) || R6 = [I##n++]; EXP (R6, n); \ |
| R4 = BYTEOP1P (R1:0, R3:2) || R7 = [I##n--]; EXP (R7, n); |
| BYTEOP1P(0) |
| BYTEOP1P(1) |
| BYTEOP1P(2) |
| BYTEOP1P(3) |
| |
| #define BYTEOP2P(n) \ |
| R7 = BYTEOP2P (R1:0, R3:2) (TL) || R4 = [I##n]; EXP (R4, n); \ |
| R6 = BYTEOP2P (R1:0, R3:2) (TH) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| R5 = BYTEOP2P (R1:0, R3:2) (RNDL) || R6 = [I##n++]; EXP (R6, n); \ |
| R4 = BYTEOP2P (R1:0, R3:2) (RNDH) || R7 = [I##n--]; EXP (R7, n); |
| BYTEOP2P(0) |
| BYTEOP2P(1) |
| BYTEOP2P(2) |
| BYTEOP2P(3) |
| |
| #define BYTEOP3P(n) \ |
| R7 = BYTEOP3P (R1:0, R3:2) (LO) || R4 = [I##n]; EXP (R4, n); \ |
| R6 = BYTEOP3P (R1:0, R3:2) (HI) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| R5 = BYTEOP3P (R1:0, R3:2) (LO) || R6 = [I##n++]; EXP (R6, n); \ |
| R4 = BYTEOP3P (R1:0, R3:2) (HI) || R7 = [I##n--]; EXP (R7, n); |
| BYTEOP3P(0) |
| BYTEOP3P(1) |
| BYTEOP3P(2) |
| BYTEOP3P(3) |
| |
| #define BYTEOP16P(n) \ |
| (R7, R6) = BYTEOP16P (R1:0, R3:2) || R4 = [I##n]; EXP (R4, n); \ |
| (R6, R4) = BYTEOP16P (R1:0, R3:2) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| (R5, R7) = BYTEOP16P (R1:0, R3:2) || R6 = [I##n++]; EXP (R6, n); \ |
| (R4, R6) = BYTEOP16P (R1:0, R3:2) || R7 = [I##n--]; EXP (R7, n); |
| BYTEOP16P(0) |
| BYTEOP16P(1) |
| BYTEOP16P(2) |
| BYTEOP16P(3) |
| |
| #define BYTEOP16M(n) \ |
| (R7, R5) = BYTEOP16M (R1:0, R3:2) || R4 = [I##n]; EXP (R4, n); \ |
| (R6, R7) = BYTEOP16M (R1:0, R3:2) || R5 = [I##n ++ M##n]; EXP (R5, n); \ |
| (R5, R4) = BYTEOP16M (R1:0, R3:2) || R6 = [I##n++]; EXP (R6, n); \ |
| (R4, R5) = BYTEOP16M (R1:0, R3:2) || R7 = [I##n--]; EXP (R7, n); |
| BYTEOP16M(0) |
| BYTEOP16M(1) |
| BYTEOP16M(2) |
| BYTEOP16M(3) |
| |
| pass |