1b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include <stdio.h>
2b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "test.h"
3b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define icm(r1, mask, b) do {\
4b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	asm volatile(	"lg 1, 0(%0)\n"  \
5b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		"icm 1," #mask ",0(%1)\n" \
6b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		"stg 1, 0(%0)\n" \
7b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	:: "a" (r1), "a" (b) \
8b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	: "1", "memory", "cc"); \
9b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj} while(0)
10b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
11b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define icmh(r1, mask, b) do {\
12b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	asm volatile(	"lg 1, 0(%0)\n"  \
13b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		"icmh 1," #mask ",0(%1)\n" \
14b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		"stg 1, 0(%0)\n" \
15b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	:: "a" (r1), "a" (b) \
16b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	: "1", "memory", "cc"); \
17b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj} while(0)
18b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
19b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjint main()
20b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj{
21b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	long a[320];
22b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char buffer[256];
23b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *b1="\x80\x00\x00\x00";
24b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *b2="\x00\x00\x00\x01";
25b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *b3="\xff\x00\x00\x00";
26b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *b4="\x00\xff\x00\x00";
27b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *b5="\x00\x00\xff\x00";
28b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *b6="\x00\x00\x00\xff";
29b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	int n;
30b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	int cc;
31b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
32b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	for (n=0; n<320; n++)
33b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		a[n] = n;
34b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
35b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define test(what, offset) do { \
36b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[0+offset], 0, what); cc = get_cc(); \
37b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[1+offset+cc], 1, what); cc = get_cc(); \
38b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[2+offset+cc], 2, what); cc = get_cc(); \
39b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[3+offset+cc], 3, what); cc = get_cc(); \
40b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[4+offset+cc], 4, what); cc = get_cc(); \
41b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[5+offset+cc], 5, what); cc = get_cc(); \
42b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[6+offset+cc], 6, what); cc = get_cc(); \
43b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[7+offset+cc], 7, what); cc = get_cc(); \
44b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[8+offset+cc], 8, what); cc = get_cc(); \
45b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[9+offset+cc], 9, what); cc = get_cc(); \
46b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[10+offset+cc], 10, what); cc = get_cc(); \
47b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[11+offset+cc], 11, what); cc = get_cc(); \
48b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[12+offset+cc], 12, what); cc = get_cc(); \
49b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[13+offset+cc], 13, what); cc = get_cc(); \
50b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[14+offset+cc], 14, what); cc = get_cc(); \
51b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icm(&a[15+offset+cc], 15, what); cc = get_cc(); \
52b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[0+offset+cc], 0, what); cc = get_cc(); \
53b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[1+offset+cc], 1, what); cc = get_cc(); \
54b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[2+offset+cc], 2, what); cc = get_cc(); \
55b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[3+offset+cc], 3, what); cc = get_cc(); \
56b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[4+offset+cc], 4, what); cc = get_cc(); \
57b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[5+offset+cc], 5, what); cc = get_cc(); \
58b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[6+offset+cc], 6, what); cc = get_cc(); \
59b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[7+offset+cc], 7, what); cc = get_cc(); \
60b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[8+offset+cc], 8, what); cc = get_cc(); \
61b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[9+offset+cc], 9, what); cc = get_cc(); \
62b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[10+offset+cc], 10, what); cc = get_cc(); \
63b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[11+offset+cc], 11, what); cc = get_cc(); \
64b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[12+offset+cc], 12, what); cc = get_cc(); \
65b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[13+offset+cc], 13, what); cc = get_cc(); \
66b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[14+offset+cc], 14, what); cc = get_cc(); \
67b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	icmh(&a[15+offset+cc], 15, what); \
68b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj} while (0)
69b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
70b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	for (n=0; n<256; n++)
71b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		buffer[n] = n;
72b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
73b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[0],0);
74b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[60],16);
75b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[120],32);
76b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[180],48);
77b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[240],64);
78b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[252],80);
79b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(b1,96);
80b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(b2,112);
81b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	for (n=0; n<256; n++)
82b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		buffer[n] = 255-n;
83b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[0],128);
84b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[60],144);
85b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(&buffer[160],160);
86b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(b3,176);
87b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(b4,192);
88b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(b5,208);
89b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	test(b6,224);
90b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
91b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field((char *) a, sizeof(a));
92b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
93b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	return 0;
94b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj}
95