действительно с XORом какой то глюк! При проверке на 0
Код
volatile int beep;
void test1(unsigned a)
{
if ((a ^ (a >> 16)) & 0xffff)
beep = 1;
}
void test2(unsigned a)
{
if ((a ^ (a >> 1)) & 0xffff)
beep = 1;
}
unsigned test3(unsigned a)
{
return ((a ^ (a >> 16)) & 0xffff);
}
void test4(unsigned a, unsigned b)
{
if ((a ^ (b >> 16)) & 0xffff)
beep = 1;
}
void test5(unsigned a, unsigned b)
{
if ((a ^ (b >> 1)) & 0xffff)
beep = 1;
}
void test6(unsigned a, unsigned b)
{
if (((a & 0xffff) ^ (b >> 16)))
beep = 1;
}
void test7(unsigned a)
{
if (((a & 0xffff) ^ (a >> 16)))
beep = 1;
}
void test8(unsigned a)
{
if (((a & 0xffff) ^ (a >> 1)))
beep = 1;
}
void test9(unsigned a, unsigned b)
{
if (((a & 0xffff) ^ (b >> 1)))
beep = 1;
}
Все эти функции кроме 3, 8, 9
компилируются с ошибкой!
Код
2 void test1(unsigned a)
3 {
4 if ((a ^ (a >> 16)) & 0xffff)
\ test1:
\ 00000000 010C LSRS R1,R0,#+16
\ 00000002 90EA010F TEQ R0,R1
\ 00000006 02D0 BEQ.N ??test1_0
5 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
6 }
\ ??test1_0:
\ 0000000E 7047 BX LR ;; return
7
\ In section .text, align 2, keep-with-next
8 void test2(unsigned a)
9 {
10 if ((a ^ (a >> 1)) & 0xffff)
\ test2:
\ 00000000 4108 LSRS R1,R0,#+1
\ 00000002 90EA010F TEQ R0,R1
\ 00000006 02D0 BEQ.N ??test2_0
11 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
12 }
\ ??test2_0:
\ 0000000E 7047 BX LR ;; return
13
\ In section .text, align 2, keep-with-next
14 unsigned test3(unsigned a)
15 {
16 return ((a ^ (a >> 16)) & 0xffff);
\ test3:
\ 00000000 80EA1040 EOR R0,R0,R0, LSR #+16
\ 00000004 80B2 UXTH R0,R0
\ 00000006 7047 BX LR ;; return
17
18 }
19
\ In section .text, align 2, keep-with-next
20 void test4(unsigned a, unsigned b)
21 {
22 if ((a ^ (b >> 16)) & 0xffff)
\ test4:
\ 00000000 090C LSRS R1,R1,#+16
\ 00000002 90EA010F TEQ R0,R1
\ 00000006 02D0 BEQ.N ??test4_0
23 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
24 }
\ ??test4_0:
\ 0000000E 7047 BX LR ;; return
25
\ In section .text, align 2, keep-with-next
26 void test5(unsigned a, unsigned b)
27 {
28 if ((a ^ (b >> 1)) & 0xffff)
\ test5:
\ 00000000 4908 LSRS R1,R1,#+1
\ 00000002 90EA010F TEQ R0,R1
\ 00000006 02D0 BEQ.N ??test5_0
29 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
30 }
\ ??test5_0:
\ 0000000E 7047 BX LR ;; return
31
\ In section .text, align 2, keep-with-next
32 void test6(unsigned a, unsigned b)
33 {
34 if (((a & 0xffff) ^ (b >> 16)))
\ test6:
\ 00000000 090C LSRS R1,R1,#+16
\ 00000002 90EA010F TEQ R0,R1
\ 00000006 02D0 BEQ.N ??test6_0
35 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
36 }
\ ??test6_0:
\ 0000000E 7047 BX LR ;; return
37
\ In section .text, align 2, keep-with-next
38 void test7(unsigned a)
39 {
40 if (((a & 0xffff) ^ (a >> 16)))
\ test7:
\ 00000000 010C LSRS R1,R0,#+16
\ 00000002 90EA010F TEQ R0,R1
\ 00000006 02D0 BEQ.N ??test7_0
41 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
42 }
\ ??test7_0:
\ 0000000E 7047 BX LR ;; return
43
\ In section .text, align 2, keep-with-next
44 void test8(unsigned a)
45 {
46 if (((a & 0xffff) ^ (a >> 1)))
\ test8:
\ 00000000 81B2 UXTH R1,R0
\ 00000002 91EA500F TEQ R1,R0, LSR #+1
\ 00000006 02D0 BEQ.N ??test8_0
47 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
48 }
\ ??test8_0:
\ 0000000E 7047 BX LR ;; return
49
\ In section .text, align 2, keep-with-next
50 void test9(unsigned a, unsigned b)
51 {
52 if (((a & 0xffff) ^ (b >> 1)))
\ test9:
\ 00000000 80B2 UXTH R0,R0
\ 00000002 90EA510F TEQ R0,R1, LSR #+1
\ 00000006 02D0 BEQ.N ??test9_0
53 beep = 1;
\ 00000008 .... LDR.N R0,??DataTable7 ;; beep
\ 0000000A 0121 MOVS R1,#+1
\ 0000000C 0160 STR R1,[R0, #+0]
54 }
\ ??test9_0:
\ 0000000E 7047 BX LR ;; return