# Blackfin testcase for setting all ASTAT bits via CC # mach: bfin # We encode the opcodes directly since we test reserved bits # which lack an insn in the ISA for it. It's a 16bit insn; # the low 8 bits are always 0x03 while the encoding for the # high 8 bits are: # bit 7 - direction # 0: CC=...; # 1: ...=CC; # bit 6/5 - operation # 0: = assignment # 1: | bit or # 2: & bit and # 3: ^ bit xor # bit 4-0 - the bit in ASTAT to access .include "testutils.inc" .macro _do dir:req, op:req, bit:req, bit_in:req, cc_in:req, bg_val:req, bit_out:req, cc_out:req /* CC = CC; is invalid, so skip it */ .if \bit != 5 /* Calculate the before and after ASTAT values */ imm32 R1, (\bg_val & ~((1 << \bit) | (1 << 5))) | (\bit_in << \bit) | (\cc_in << 5); imm32 R3, (\bg_val & ~((1 << \bit) | (1 << 5))) | (\bit_out << \bit) | (\cc_out << 5); /* Test the actual opcode */ ASTAT = R1; .byte (\dir << 7) | (\op << 5) | \bit .byte 0x03 R2 = ASTAT; /* Make sure things line up */ CC = R3 == R2; IF !CC JUMP 1f; JUMP 2f; 1: fail 2: .endif /* Recurse through all the bits */ .if \bit > 0 _do \dir, \op, \bit - 1, \bit_in, \cc_in, \bg_val, \bit_out, \cc_out .endif .endm /* Test different background fields on ASTAT */ .macro do dir:req, op:req, bit_in:req, cc_in:req, bit_out:req, cc_out:req _do \dir, \op, 31, \bit_in, \cc_in, 0, \bit_out, \cc_out _do \dir, \op, 31, \bit_in, \cc_in, -1, \bit_out, \cc_out .endm start nop; _cc_eq_bit: /* CC = bit */ do 0, 0, 0, 0, 0, 0 do 0, 0, 0, 1, 0, 0 do 0, 0, 1, 0, 1, 1 do 0, 0, 1, 1, 1, 1 _bit_eq_cc: /* bit = CC */ do 1, 0, 0, 0, 0, 0 do 1, 0, 0, 1, 1, 1 do 1, 0, 1, 0, 0, 0 do 1, 0, 1, 1, 1, 1 _cc_or_bit: /* CC |= bit */ do 0, 1, 0, 0, 0, 0 do 0, 1, 0, 1, 0, 1 do 0, 1, 1, 0, 1, 1 do 0, 1, 1, 1, 1, 1 _bit_or_cc: /* bit |= CC */ do 1, 1, 0, 0, 0, 0 do 1, 1, 0, 1, 1, 1 do 1, 1, 1, 0, 1, 0 do 1, 1, 1, 1, 1, 1 _cc_and_bit: /* CC &= bit */ do 0, 2, 0, 0, 0, 0 do 0, 2, 0, 1, 0, 0 do 0, 2, 1, 0, 1, 0 do 0, 2, 1, 1, 1, 1 _bit_and_cc: /* bit &= CC */ do 1, 2, 0, 0, 0, 0 do 1, 2, 0, 1, 0, 1 do 1, 2, 1, 0, 0, 0 do 1, 2, 1, 1, 1, 1 _cc_xor_bit: /* CC ^= bit */ do 0, 3, 0, 0, 0, 0 do 0, 3, 0, 1, 0, 1 do 0, 3, 1, 0, 1, 1 do 0, 3, 1, 1, 1, 0 _bit_xor_cc: /* bit ^= CC */ do 1, 3, 0, 0, 0, 0 do 1, 3, 0, 1, 1, 1 do 1, 3, 1, 0, 1, 0 do 1, 3, 1, 1, 0, 1 pass