1// { dg-do assemble  }
2// { dg-options "-O" }
3// GROUPS passed old-abort
4typedef unsigned char uchar;
5typedef unsigned short ushort;
6typedef unsigned long ulong;
7extern int swap_endian;
8inline ushort
9swapshort(ushort value)
10{
11    value &= 0xffff;
12    return ((value << 8) | (value >> 8));
13}
14struct eshort
15{
16    ushort	data;
17    operator ushort() { return swap_endian ? swapshort(data) : data;}
18    eshort(ushort t) { data = swap_endian ? swapshort(t) : t;}
19    eshort() {}
20};
21inline ulong
22swaplong(ulong value)
23{
24    ulong v = (value << 16) | (value >> 16);
25    return ((v >> 8) & 0x00ff00ff) | ((v << 8) & 0xff00ff00);
26}
27struct elong
28{
29    ulong	data;
30    operator ulong() { return swap_endian ? swaplong(data) : data;}
31    elong(ulong t) { data = swap_endian ? swaplong(t) : t; }
32    elong() {}
33};
34struct digiheader
35{
36    uchar	type[2];
37    eshort	soft_version;
38    eshort	lo_boot_rev;
39    eshort	hi_boot_rev;
40    eshort	load_segment;
41    eshort	length;
42    eshort	exec_start;
43    eshort	image_offset;
44    elong	startup_code[2];
45    elong	checksum;
46};
47extern void uncompress(uchar* buf, ulong len);
48extern ulong compress(char* filename, uchar* buffer, ulong);
49struct filehdr
50{
51    eshort	f_magic;
52    eshort	f_nscns;
53    elong	f_timdat;
54    elong	f_symptr;
55    elong	f_nsyms;
56    eshort	f_opthdr;
57    eshort	f_flags;
58};
59struct aouthdr
60{
61    eshort	magic;
62    eshort	vstamp;
63    elong	tsize;
64    elong	dsize;
65    elong	bsize;
66    elong	entry;
67    elong	text_start;
68    elong	data_start;
69    elong	bss_start;
70    elong	gprmask;
71    elong	cprmask[4];
72    elong	gp_value;
73};
74struct scnhdr
75{
76    char	s_name[8];
77    elong	s_paddr;
78    elong	s_vaddr;
79    elong	s_size;
80    elong	s_scnptr;
81    elong	s_relptr;
82    elong	s_lnnoptr;
83    eshort	s_nreloc;
84    eshort	s_nlnno;
85    elong	s_flags;
86};
87int file_little_endian;
88int host_little_endian;
89int swap_endian;
90int docheck;
91int expand;
92ulong memsize;
93ulong compression_quality;
94char *compressfile;
95int debug_level;
96extern "C" int getopt (int, char**, char*);
97int
98main(int argc, char** argv)
99{
100    uchar checksum;
101    uchar docrc;
102    ulong len;
103    ulong maxlen;
104    int i;
105    int c;
106    int magic;
107    int tsize;
108    int dsize;
109    int quality;
110    char dummy;
111    uchar* code;
112    uchar* buf;
113    char* ap;
114    digiheader *dh;
115    compression_quality = 10000;
116    docheck = 0;
117    while ((c = getopt(argc, argv, "Ccdf:k:q:x:")) != -1)
118    {
119	switch (c)
120	{
121	default:
122	    goto usage;
123	}
124    }
125    if ((expand && (docheck || compressfile || quality)) ||
126	(quality && !compressfile))
127    {
128    usage:
129	return(2);
130    }
131    if (compressfile)
132    {
133	dh->image_offset = len;
134
135	len += compress(compressfile, code + len, maxlen - len);
136    }
137}
138