1/* { dg-do compile }  */
2
3struct unipair
4{
5  unsigned short unicode;
6  unsigned short fontpos;
7};
8
9struct __large_struct
10{
11  unsigned long buf[100];
12};
13
14struct vc_data
15{
16  unsigned long *vc_uni_pagedir_loc;
17};
18
19struct uni_pagedir
20{
21  unsigned short **uni_pgdir[32];
22};
23
24void con_get_unimap (struct vc_data *vc, unsigned short ct, unsigned short *uct,
25		     struct unipair *list)
26{
27  int i, j, k, ect;
28  unsigned short **p1, *p2;
29  struct uni_pagedir *p;
30
31  ect = 0;
32
33  if (*vc->vc_uni_pagedir_loc)
34  {
35    p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
36    for (i = 0; i < 32; i++)
37    if ((p1 = p->uni_pgdir[i]))
38    for (j = 0; j < 32; j++)
39    if ((p2 = *(p1++)))
40    for (k = 0; k < 64; k++)
41    {
42      if (*p2 < 512 && ect++ < ct)
43      {
44	{
45	  long __pu_err;
46	  __typeof__(*((&list->unicode))) *__pu_addr = ((&list->unicode));
47	  __typeof__(*((&list->unicode))) __pu_val =
48		((unsigned short)((i<<11)+(j<<6)+k));
49	  __pu_err = 0;
50	  switch ((sizeof(*(&list->unicode))))
51	  {
52	    case 1:
53		__asm__ __volatile__ (
54		"1:\n\t"
55			"mov." "b" "	%1, %2\n\t"
56		"2:\n"
57		".section	.fixup,\"ax\"\n"
58		"3:\n\t"
59			"mov.l	4f, %0\n\t"
60			"jmp	@%0\n\t"
61			" mov	%3, %0\n\t"
62			".balign	4\n"
63		"4:	.long	2b\n\t"
64			".previous\n"
65		".section	__ex_table,\"a\"\n\t"
66			".long	1b, 3b\n\t"
67			".previous"
68		: "=&r" (__pu_err)
69		: "r" (__pu_val), "m" ((*(struct __large_struct *)(__pu_addr))),
70		  "i" (-14), "0" (__pu_err) : "memory" );
71
72	      break;
73
74	    case 2:
75		__asm__ __volatile__ (
76		"1:\n\t"
77			"mov." "w" "	%1, %2\n\t"
78		"2:\n"
79		".section	.fixup,\"ax\"\n"
80		"3:\n\t"
81			"mov.l	4f, %0\n\t"
82			"jmp	@%0\n\t"
83			" mov	%3, %0\n\t"
84			".balign	4\n"
85			"4:	.long	2b\n\t"
86			".previous\n"
87		".section	__ex_table,\"a\"\n\t"
88			".long	1b, 3b\n\t"
89			".previous"
90		: "=&r" (__pu_err)
91		: "r" (__pu_val), "m" ((*(struct __large_struct *)(__pu_addr))),
92		  "i" (-14), "0" (__pu_err) : "memory" );
93	      break;
94
95	    default:
96	      break;
97	  }
98	}
99
100
101	{
102	  long __pu_err;
103	  __typeof__(*((&list->fontpos))) *__pu_addr = ((&list->fontpos));
104	  __typeof__(*((&list->fontpos))) __pu_val = ((unsigned short) *p2);
105	  __pu_err = 0;
106	  switch ((sizeof(*(&list->fontpos))))
107	  {
108	    case 1:
109		__asm__ __volatile__ (
110		"1:\n\t"
111			"mov." "b" "	%1, %2\n\t"
112		"2:\n"
113		".section	.fixup,\"ax\"\n"
114		"3:\n\t"
115			"mov.l	4f, %0\n\t"
116			"jmp	@%0\n\t"
117			" mov	%3, %0\n\t"
118			".balign	4\n"
119			"4:	.long	2b\n\t"
120			".previous\n"
121		".section	__ex_table,\"a\"\n\t"
122			".long	1b, 3b\n\t"
123			".previous"
124		: "=&r" (__pu_err)
125		: "r" (__pu_val), "m" ((*(struct __large_struct *)(__pu_addr))),
126		  "i" (-14), "0" (__pu_err) : "memory" );
127	      break;
128
129	    case 2:
130	      __asm__ __volatile__ (
131		"1:\n\t"
132			"mov." "w" "	%1, %2\n\t"
133		"2:\n"
134			".section	.fixup,\"ax\"\n"
135		"3:\n\t"
136			"mov.l	4f, %0\n\t"
137			"jmp	@%0\n\t"
138			" mov	%3, %0\n\t"
139		".balign	4\n"
140			"4:	.long	2b\n\t"
141		".previous\n"
142		".section	__ex_table,\"a\"\n\t"
143			".long	1b, 3b\n\t"
144			".previous"
145		: "=&r" (__pu_err)
146		: "r" (__pu_val), "m" ((*(struct __large_struct *)(__pu_addr))),
147		  "i" (-14), "0" (__pu_err) : "memory" );
148	      break;
149
150	    default:
151	      break;
152	  }
153	}
154
155        list++;
156      }
157      p2++;
158    }
159  }
160}
161