summaryrefslogtreecommitdiff
path: root/sim/testsuite/bfin/c_cc_regmvlogi_mvbrsft_sn.S
blob: 8b041884275fbcef015b230a6ef4f807000dcbea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//Original:/proj/frio/dv/testcases/core/c_cc_regmvlogi_mvbrsft_sn/c_cc_regmvlogi_mvbrsft_sn.dsp
// Spec Reference: cc: set (regmv & logi2op) used (ccmv & brcc & dsp32sft)
# mach: bfin

#include "test.h"
.include "testutils.inc"
	start

	INIT_I_REGS 0;
	INIT_M_REGS 0;
	INIT_L_REGS 0;
	INIT_B_REGS 0;
	INIT_R_REGS 0;
	INIT_P_REGS 0;
	ASTAT = R0;
	A0 = A1 = 0;

	imm32 r0, (_CC);	// cc=1
	imm32 r1, 0x00000000;	// cc=0
	imm32 r2, 0x62b61557;
	imm32 r3, 0x07300007;
	imm32 r4, 0x00740088;
	imm32 r5, 0x609950aa;
	imm32 r6, 0x20bb06cc;
	imm32 r7, 0x00000002;

	A0 = R4;
	A1 = R6;

	ASTAT = R0;	// cc=1  REGMV
	P2 = R2;
	R2 = R0 + R2;	// comp3op dr plus dr
	M0 = P2;	// regmv
	IF CC R1 = R3;	// ccmov
	ASTAT = R1;	// cc=0  REGMV
	R3 >>= R7;	// alu2op sft
	R3 = R0 + R2;	// comp3op dr plus dr
	I0 = R5;
	IF CC R3 = R2;	// ccmv
	CC = R0 < R1;	// ccflag
	R3.H = R1.L + R3.H (S);	// dsp32alu
	R5 = ( A1 = R7.L * R4.H ),  R4 = ( A0 = R7.H * R4.L );	// dsp32mac pair
	IF CC R4 = R5;	// ccmv
	CC = ! BITTST( R0 , 4 );	// cc = 0
	R0 = R0 +|- R1 , R6 = R0 -|+ R1 (ASR);	// dsp32alu sft
	I0 += 2;	// dagmodim
	IF CC R4 = R5;	// ccmv
	CC = BITTST ( R1 , 4 );	// cc = 0
	R7.L = R5.L << 1;	// dsp32shiftim
	R1 = R0 +|- R1 , R5 = R0 -|+ R1 (ASR);	// dsp32alu sft
	P1 = A0.w;
	IF !CC JUMP LABEL1;	// branch
	CC = ! CC;
	R1 = ( A1 = R7.L * R4.L ),  R0 = ( A0 = R7.H * R4.H )  (S2RND);	// dsp32mac pair
	I0 += M0;	// dagmodim
	P2 = A1.w;
	IF !CC JUMP LABEL2 (BP);	// branch
LABEL1:
	R2 = R0 + R2;
	JUMP.S END;
LABEL2:
	R7 = R5 - R3;
	CC = R0 < R1;	// ccflag
	R6 = R0 + R2;	// comp3op dr plus dr
	P4 = I0;
	IF CC JUMP END (BP);	// branch on
	R7 = R5 + R7;

END:

	CHECKREG r0, 0x0398000C;
	CHECKREG r1, 0x05640002;
	CHECKREG r2, 0x664E1583;
	CHECKREG r3, 0x62BD1597;
	CHECKREG r4, 0x000001D0;
	CHECKREG r5, 0xFE340009;
	CHECKREG r6, 0xFC680013;
	CHECKREG r7, 0x000003A0;
	CHECKREG p1, 0x00000000;
	CHECKREG p2, 0x62B61557;
	CHECKREG p4, 0x00000000;

	imm32 r0, (_CC);
	imm32 r1, 0x00000000;
	imm32 r2, 0x62661557;
	imm32 r3, 0x073b0007;
	imm32 r4, 0x01f49088;
	imm32 r5, 0x6e2959aa;
	imm32 r6, 0xa0b506cc;
	imm32 r7, 0xabd30002;

	A1 = A0 = 0;
	ASTAT = R0;	// cc=1  REGMV
	R2.H = R3.L + R4.L (NS);	// dsp32alu
	R2.H = ( A1 = R2.L * R3.L ), A0 = R2.H * R3.L;	// dsp32mac
	R3 = ROT R2 BY 1;	// dsp32shiftim_rot
	ASTAT = R1;	// cc=0  REGMV
	A1 += R2.L * R3.L, A0 += R2.L * R3.H;	// dsp32mac
	R2.L = R5.L << 1;	// dsp32shiftimm
	R5 = ROT R3 BY 1;	// dsp32shiftim_rot
	CC = ! BITTST( R0 , 4 );	// cc = 0
	R4.L = R5.L << 1;	// dsp32shiftimm
	R0 >>= R7;	// alu2op sft
	A0 += A1;	// dsp32alu a0 + a1
	R6 = ROT R4 BY 5;	// dsp32shiftim_rot
	CC = BITTST ( R1 , 4 );	// cc = 0
	R0 = R0 + R2;	// comp3op dr plus dr
	R5 = R3.L * R4.H, R4 = R3.H * R4.L;	// dsp32mult
	P1 = A0.w;
	IF CC R4 = R5;	// ccmov
	P1.L = 0x3000;	// ldimmhalf
	P2 = A1.w;	// regmv
	CC = BITTST ( R0 , 4 );	// cc = 1
	R7 = ROT R6 BY R7.L;

	CHECKREG r0, 0x0001B354;
	CHECKREG r1, 0x00000000;
	CHECKREG r2, 0x0001B354;
	CHECKREG r3, 0x00022AAF;
	CHECKREG r4, 0xFFFEAAF0;
	CHECKREG r5, 0x00A6BB98;
	CHECKREG r6, 0x3E955790;
	CHECKREG r7, 0xFA555E42;
	CHECKREG p1, 0x07193000;
	CHECKREG p2, 0x071EE3B4;

	pass