xref: /plan9/sys/src/cmd/gs/src/gsroptab.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 1995, 1997, 1998, 2001 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsroptab.c,v 1.5 2002/02/21 22:24:52 giles Exp $ */
187dd7cddfSDavid du Colombier /* Table of RasterOp procedures */
197dd7cddfSDavid du Colombier #include "stdpre.h"
207dd7cddfSDavid du Colombier #include "gsropt.h"
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier /*
237dd7cddfSDavid du Colombier  * The H-P documentation (probably copied from Microsoft documentation)
247dd7cddfSDavid du Colombier  * specifies RasterOp algorithms using reverse Polish notation, with
257dd7cddfSDavid du Colombier  *   a = AND, o = OR, n = NOT, x = XOR
267dd7cddfSDavid du Colombier  */
277dd7cddfSDavid du Colombier 
28*593dc095SDavid du Colombier #define ROP_PROC(pname, expr)\
297dd7cddfSDavid du Colombier private rop_operand pname(rop_operand D, rop_operand S, rop_operand T)\
307dd7cddfSDavid du Colombier { return expr; }
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier #define a(u,v) (u&v)
337dd7cddfSDavid du Colombier #define o(u,v) (u|v)
347dd7cddfSDavid du Colombier #define x(u,v) (u^v)
357dd7cddfSDavid du Colombier 
36*593dc095SDavid du Colombier ROP_PROC(rop0, 0)		/* 0 */
37*593dc095SDavid du Colombier ROP_PROC(rop1, ~(D | S | T))		/* DTSoon */
38*593dc095SDavid du Colombier ROP_PROC(rop2, D & ~(S | T))		/* DTSona */
39*593dc095SDavid du Colombier ROP_PROC(rop3, ~(S | T))	/* TSon */
40*593dc095SDavid du Colombier ROP_PROC(rop4, S & ~(D | T))		/* SDTona */
41*593dc095SDavid du Colombier ROP_PROC(rop5, ~(D | T))	/* DTon */
42*593dc095SDavid du Colombier ROP_PROC(rop6, ~(T | ~(D ^ S)))		/* TDSxnon */
43*593dc095SDavid du Colombier ROP_PROC(rop7, ~(T | (D & S)))		/* TDSaon */
44*593dc095SDavid du Colombier ROP_PROC(rop8, S & (D & ~T))		/* SDTnaa */
45*593dc095SDavid du Colombier ROP_PROC(rop9, ~(T | (D ^ S)))		/* TDSxon */
46*593dc095SDavid du Colombier ROP_PROC(rop10, D & ~T)		/* DTna */
47*593dc095SDavid du Colombier ROP_PROC(rop11, ~(T | (S & ~D)))	/* TSDnaon */
48*593dc095SDavid du Colombier ROP_PROC(rop12, S & ~T)		/* STna */
49*593dc095SDavid du Colombier ROP_PROC(rop13, ~(T | (D & ~S)))	/* TDSnaon */
50*593dc095SDavid du Colombier ROP_PROC(rop14, ~(T | ~(D | S)))	/* TDSonon */
51*593dc095SDavid du Colombier ROP_PROC(rop15, ~T)		/* Tn */
52*593dc095SDavid du Colombier ROP_PROC(rop16, T & ~(D | S))		/* TDSona */
53*593dc095SDavid du Colombier ROP_PROC(rop17, ~(D | S))	/* DSon */
54*593dc095SDavid du Colombier ROP_PROC(rop18, ~(S | ~(D ^ T)))	/* SDTxnon */
55*593dc095SDavid du Colombier ROP_PROC(rop19, ~(S | (D & T)))		/* SDTaon */
56*593dc095SDavid du Colombier ROP_PROC(rop20, ~(D | ~(T ^ S)))	/* DTSxnon */
57*593dc095SDavid du Colombier ROP_PROC(rop21, ~(D | (T & S)))		/* DTSaon */
58*593dc095SDavid du Colombier ROP_PROC(rop22, (T ^ (S ^ (D & ~(T & S)))))		/* TSDTSanaxx */
59*593dc095SDavid du Colombier ROP_PROC(rop23, ~(S ^ ((S ^ T) & (D ^ S))))		/* SSTxDSxaxn */
60*593dc095SDavid du Colombier ROP_PROC(rop24, (S ^ T) & (T ^ D))	/* STxTDxa */
61*593dc095SDavid du Colombier ROP_PROC(rop25, ~(S ^ (D & ~(T & S))))		/* SDTSanaxn */
62*593dc095SDavid du Colombier ROP_PROC(rop26, T ^ (D | (S & T)))	/* TDSTaox */
63*593dc095SDavid du Colombier ROP_PROC(rop27, ~(S ^ (D & (T ^ S))))		/* SDTSxaxn */
64*593dc095SDavid du Colombier ROP_PROC(rop28, T ^ (S | (D & T)))	/* TSDTaox */
65*593dc095SDavid du Colombier ROP_PROC(rop29, ~(D ^ (S & (T ^ D))))		/* DSTDxaxn */
66*593dc095SDavid du Colombier ROP_PROC(rop30, T ^ (D | S))		/* TDSox */
67*593dc095SDavid du Colombier ROP_PROC(rop31, ~(T & (D | S)))		/* TDSoan */
68*593dc095SDavid du Colombier ROP_PROC(rop32, D & (T & ~S))		/* DTSnaa */
69*593dc095SDavid du Colombier ROP_PROC(rop33, ~(S | (D ^ T)))		/* SDTxon */
70*593dc095SDavid du Colombier ROP_PROC(rop34, D & ~S)		/* DSna */
71*593dc095SDavid du Colombier ROP_PROC(rop35, ~(S | (T & ~D)))	/* STDnaon */
72*593dc095SDavid du Colombier ROP_PROC(rop36, (S ^ T) & (D ^ S))	/* STxDSxa */
73*593dc095SDavid du Colombier ROP_PROC(rop37, ~(T ^ (D & ~(S & T))))		/* TDSTanaxn */
74*593dc095SDavid du Colombier ROP_PROC(rop38, S ^ (D | (T & S)))	/* SDTSaox */
75*593dc095SDavid du Colombier ROP_PROC(rop39, S ^ (D | ~(T ^ S)))		/* SDTSxnox */
76*593dc095SDavid du Colombier ROP_PROC(rop40, D & (T ^ S))		/* DTSxa */
77*593dc095SDavid du Colombier ROP_PROC(rop41, ~(T ^ (S ^ (D | (T & S)))))		/* TSDTSaoxxn */
78*593dc095SDavid du Colombier ROP_PROC(rop42, D & ~(T & S))		/* DTSana */
79*593dc095SDavid du Colombier ROP_PROC(rop43, ~x(a(x(D, T), x(T, S)), S))		/* SSTxTDxaxn */
80*593dc095SDavid du Colombier ROP_PROC(rop44, (S ^ (T & (D | S))))		/* STDSoax */
81*593dc095SDavid du Colombier ROP_PROC(rop45, T ^ (S | ~D))		/* TSDnox */
82*593dc095SDavid du Colombier ROP_PROC(rop46, (T ^ (S | (D ^ T))))		/* TSDTxox */
83*593dc095SDavid du Colombier ROP_PROC(rop47, ~(T & (S | ~D)))	/* TSDnoan */
84*593dc095SDavid du Colombier ROP_PROC(rop48, T & ~S)		/* TSna */
85*593dc095SDavid du Colombier ROP_PROC(rop49, ~(S | (D & ~T)))	/* SDTnaon */
86*593dc095SDavid du Colombier ROP_PROC(rop50, S ^ (D | (T | S)))	/* SDTSoox */
87*593dc095SDavid du Colombier ROP_PROC(rop51, ~S)		/* Sn */
88*593dc095SDavid du Colombier ROP_PROC(rop52, S ^ (T | (D & S)))	/* STDSaox */
89*593dc095SDavid du Colombier ROP_PROC(rop53, S ^ (T | ~(D ^ S)))		/* STDSxnox */
90*593dc095SDavid du Colombier ROP_PROC(rop54, S ^ (D | T))		/* SDTox */
91*593dc095SDavid du Colombier ROP_PROC(rop55, ~(S & (D | T)))		/* SDToan */
92*593dc095SDavid du Colombier ROP_PROC(rop56, T ^ (S & (D | T)))	/* TSDToax */
93*593dc095SDavid du Colombier ROP_PROC(rop57, S ^ (T | ~D))		/* STDnox */
94*593dc095SDavid du Colombier ROP_PROC(rop58, S ^ (T | (D ^ S)))	/* STDSxox */
95*593dc095SDavid du Colombier ROP_PROC(rop59, ~(S & (T | ~D)))	/* STDnoan */
96*593dc095SDavid du Colombier ROP_PROC(rop60, T ^ S)		/* TSx */
97*593dc095SDavid du Colombier ROP_PROC(rop61, S ^ (T | ~(D | S)))		/* STDSonox */
98*593dc095SDavid du Colombier ROP_PROC(rop62, S ^ (T | (D & ~S)))		/* STDSnaox */
99*593dc095SDavid du Colombier ROP_PROC(rop63, ~(T & S))	/* TSan */
100*593dc095SDavid du Colombier ROP_PROC(rop64, T & (S & ~D))		/* TSDnaa */
101*593dc095SDavid du Colombier ROP_PROC(rop65, ~(D | (T ^ S)))		/* DTSxon */
102*593dc095SDavid du Colombier ROP_PROC(rop66, (S ^ D) & (T ^ D))	/* SDxTDxa */
103*593dc095SDavid du Colombier ROP_PROC(rop67, ~(S ^ (T & ~(D & S))))		/* STDSanaxn */
104*593dc095SDavid du Colombier ROP_PROC(rop68, S & ~D)		/* SDna */
105*593dc095SDavid du Colombier ROP_PROC(rop69, ~(D | (T & ~S)))	/* DTSnaon */
106*593dc095SDavid du Colombier ROP_PROC(rop70, D ^ (S | (T & D)))	/* DSTDaox */
107*593dc095SDavid du Colombier ROP_PROC(rop71, ~(T ^ (S & (D ^ T))))		/* TSDTxaxn */
108*593dc095SDavid du Colombier ROP_PROC(rop72, S & (D ^ T))		/* SDTxa */
109*593dc095SDavid du Colombier ROP_PROC(rop73, ~(T ^ (D ^ (S | (T & D)))))		/* TDSTDaoxxn */
110*593dc095SDavid du Colombier ROP_PROC(rop74, D ^ (T & (S | D)))	/* DTSDoax */
111*593dc095SDavid du Colombier ROP_PROC(rop75, T ^ (D | ~S))		/* TDSnox */
112*593dc095SDavid du Colombier ROP_PROC(rop76, S & ~(D & T))		/* SDTana */
113*593dc095SDavid du Colombier ROP_PROC(rop77, ~(S ^ ((S ^ T) | (D ^ S))))		/* SSTxDSxoxn */
114*593dc095SDavid du Colombier ROP_PROC(rop78, T ^ (D | (S ^ T)))	/* TDSTxox */
115*593dc095SDavid du Colombier ROP_PROC(rop79, ~(T & (D | ~S)))	/* TDSnoan */
116*593dc095SDavid du Colombier ROP_PROC(rop80, T & ~D)		/* TDna */
117*593dc095SDavid du Colombier ROP_PROC(rop81, ~(D | (S & ~T)))	/* DSTnaon */
118*593dc095SDavid du Colombier ROP_PROC(rop82, D ^ (T | (S & D)))	/* DTSDaox */
119*593dc095SDavid du Colombier ROP_PROC(rop83, ~(S ^ (T & (D ^ S))))		/* STDSxaxn */
120*593dc095SDavid du Colombier ROP_PROC(rop84, ~(D | ~(T | S)))	/* DTSonon */
121*593dc095SDavid du Colombier ROP_PROC(rop85, ~D)		/* Dn */
122*593dc095SDavid du Colombier ROP_PROC(rop86, D ^ (T | S))		/* DTSox */
123*593dc095SDavid du Colombier ROP_PROC(rop87, ~(D & (T | S)))		/* DTSoan */
124*593dc095SDavid du Colombier ROP_PROC(rop88, T ^ (D & (S | T)))	/* TDSToax */
125*593dc095SDavid du Colombier ROP_PROC(rop89, D ^ (T | ~S))		/* DTSnox */
126*593dc095SDavid du Colombier ROP_PROC(rop90, D ^ T)		/* DTx */
127*593dc095SDavid du Colombier ROP_PROC(rop91, D ^ (T | ~(S | D)))		/* DTSDonox */
128*593dc095SDavid du Colombier ROP_PROC(rop92, D ^ (T | (S ^ D)))	/* DTSDxox */
129*593dc095SDavid du Colombier ROP_PROC(rop93, ~(D & (T | ~S)))	/* DTSnoan */
130*593dc095SDavid du Colombier ROP_PROC(rop94, D ^ (T | (S & ~D)))		/* DTSDnaox */
131*593dc095SDavid du Colombier ROP_PROC(rop95, ~(D & T))	/* DTan */
132*593dc095SDavid du Colombier ROP_PROC(rop96, T & (D ^ S))		/* TDSxa */
133*593dc095SDavid du Colombier ROP_PROC(rop97, ~(D ^ (S ^ (T | (D & S)))))		/* DSTDSaoxxn */
134*593dc095SDavid du Colombier ROP_PROC(rop98, D ^ (S & (T | D)))	/* DSTDoax */
135*593dc095SDavid du Colombier ROP_PROC(rop99, S ^ (D | ~T))		/* SDTnox */
136*593dc095SDavid du Colombier ROP_PROC(rop100, S ^ (D & (T | S)))		/* SDTSoax */
137*593dc095SDavid du Colombier ROP_PROC(rop101, D ^ (S | ~T))		/* DSTnox */
138*593dc095SDavid du Colombier ROP_PROC(rop102, D ^ S)		/* DSx */
139*593dc095SDavid du Colombier ROP_PROC(rop103, S ^ (D | ~(T | S)))		/* SDTSonox */
140*593dc095SDavid du Colombier ROP_PROC(rop104, ~(D ^ (S ^ (T | ~(D | S)))))		/* DSTDSonoxxn */
141*593dc095SDavid du Colombier ROP_PROC(rop105, ~(T ^ (D ^ S)))	/* TDSxxn */
142*593dc095SDavid du Colombier ROP_PROC(rop106, D ^ (T & S))		/* DTSax */
143*593dc095SDavid du Colombier ROP_PROC(rop107, ~(T ^ (S ^ (D & (T | S)))))		/* TSDTSoaxxn */
144*593dc095SDavid du Colombier ROP_PROC(rop108, (D & T) ^ S)		/* SDTax */
145*593dc095SDavid du Colombier ROP_PROC(rop109, ~((((T | D) & S) ^ D) ^ T))		/* TDSTDoaxxn */
146*593dc095SDavid du Colombier ROP_PROC(rop110, ((~S | T) & D) ^ S)		/* SDTSnoax */
147*593dc095SDavid du Colombier ROP_PROC(rop111, ~(~(D ^ S) & T))	/* TDSxnan */
148*593dc095SDavid du Colombier ROP_PROC(rop112, ~(D & S) & T)		/* TDSana */
149*593dc095SDavid du Colombier ROP_PROC(rop113, ~(((S ^ D) & (T ^ D)) ^ S))		/* SSDxTDxaxn */
150*593dc095SDavid du Colombier ROP_PROC(rop114, ((T ^ S) | D) ^ S)		/* SDTSxox */
151*593dc095SDavid du Colombier ROP_PROC(rop115, ~((~T | D) & S))	/* SDTnoan */
152*593dc095SDavid du Colombier ROP_PROC(rop116, ((T ^ D) | S) ^ D)		/* DSTDxox */
153*593dc095SDavid du Colombier ROP_PROC(rop117, ~((~T | S) & D))	/* DSTnoan */
154*593dc095SDavid du Colombier ROP_PROC(rop118, ((~S & T) | D) ^ S)		/* SDTSnaox */
155*593dc095SDavid du Colombier ROP_PROC(rop119, ~(D & S))	/* DSan */
156*593dc095SDavid du Colombier ROP_PROC(rop120, (D & S) ^ T)		/* TDSax */
157*593dc095SDavid du Colombier ROP_PROC(rop121, ~((((D | S) & T) ^ S) ^ D))		/* DSTDSoaxxn */
158*593dc095SDavid du Colombier ROP_PROC(rop122, ((~D | S) & T) ^ D)		/* DTSDnoax */
159*593dc095SDavid du Colombier ROP_PROC(rop123, ~(~(D ^ T) & S))	/* SDTxnan */
160*593dc095SDavid du Colombier ROP_PROC(rop124, ((~S | D) & T) ^ S)		/* STDSnoax */
161*593dc095SDavid du Colombier ROP_PROC(rop125, ~(~(T ^ S) & D))	/* DTSxnan */
162*593dc095SDavid du Colombier ROP_PROC(rop126, (S ^ T) | (D ^ S))		/* STxDSxo */
163*593dc095SDavid du Colombier ROP_PROC(rop127, ~((T & S) & D))	/* DTSaan */
164*593dc095SDavid du Colombier ROP_PROC(rop128, (T & S) & D)		/* DTSaa */
165*593dc095SDavid du Colombier ROP_PROC(rop129, ~((S ^ T) | (D ^ S)))		/* STxDSxon */
166*593dc095SDavid du Colombier ROP_PROC(rop130, ~(T ^ S) & D)		/* DTSxna */
167*593dc095SDavid du Colombier ROP_PROC(rop131, ~(((~S | D) & T) ^ S))		/* STDSnoaxn */
168*593dc095SDavid du Colombier ROP_PROC(rop132, ~(D ^ T) & S)		/* SDTxna */
169*593dc095SDavid du Colombier ROP_PROC(rop133, ~(((~T | S) & D) ^ T))		/* TDSTnoaxn */
170*593dc095SDavid du Colombier ROP_PROC(rop134, (((D | S) & T) ^ S) ^ D)	/* DSTDSoaxx */
171*593dc095SDavid du Colombier ROP_PROC(rop135, ~((D & S) ^ T))	/* TDSaxn */
172*593dc095SDavid du Colombier ROP_PROC(rop136, D & S)		/* DSa */
173*593dc095SDavid du Colombier ROP_PROC(rop137, ~(((~S & T) | D) ^ S))		/* SDTSnaoxn */
174*593dc095SDavid du Colombier ROP_PROC(rop138, (~T | S) & D)		/* DSTnoa */
175*593dc095SDavid du Colombier ROP_PROC(rop139, ~(((T ^ D) | S) ^ D))		/* DSTDxoxn */
176*593dc095SDavid du Colombier ROP_PROC(rop140, (~T | D) & S)		/* SDTnoa */
177*593dc095SDavid du Colombier ROP_PROC(rop141, ~(((T ^ S) | D) ^ S))		/* SDTSxoxn */
178*593dc095SDavid du Colombier ROP_PROC(rop142, ((S ^ D) & (T ^ D)) ^ S)	/* SSDxTDxax */
179*593dc095SDavid du Colombier ROP_PROC(rop143, ~(~(D & S) & T))	/* TDSanan */
180*593dc095SDavid du Colombier ROP_PROC(rop144, ~(D ^ S) & T)		/* TDSxna */
181*593dc095SDavid du Colombier ROP_PROC(rop145, ~(((~S | T) & D) ^ S))		/* SDTSnoaxn */
182*593dc095SDavid du Colombier ROP_PROC(rop146, (((D | T) & S) ^ T) ^ D)	/* DTSDToaxx */
183*593dc095SDavid du Colombier ROP_PROC(rop147, ~((T & D) ^ S))	/* STDaxn */
184*593dc095SDavid du Colombier ROP_PROC(rop148, (((T | S) & D) ^ S) ^ T)	/* TSDTSoaxx */
185*593dc095SDavid du Colombier ROP_PROC(rop149, ~((T & S) ^ D))	/* DTSaxn */
186*593dc095SDavid du Colombier ROP_PROC(rop150, (T ^ S) ^ D)		/* DTSxx */
187*593dc095SDavid du Colombier ROP_PROC(rop151, ((~(T | S) | D) ^ S) ^ T)	/* TSDTSonoxx */
188*593dc095SDavid du Colombier ROP_PROC(rop152, ~((~(T | S) | D) ^ S))		/* SDTSonoxn */
189*593dc095SDavid du Colombier ROP_PROC(rop153, ~(D ^ S))	/* DSxn */
190*593dc095SDavid du Colombier ROP_PROC(rop154, (~S & T) ^ D)		/* DTSnax */
191*593dc095SDavid du Colombier ROP_PROC(rop155, ~(((T | S) & D) ^ S))		/* SDTSoaxn */
192*593dc095SDavid du Colombier ROP_PROC(rop156, (~D & T) ^ S)		/* STDnax */
193*593dc095SDavid du Colombier ROP_PROC(rop157, ~(((T | D) & S) ^ D))		/* DSTDoaxn */
194*593dc095SDavid du Colombier ROP_PROC(rop158, (((D & S) | T) ^ S) ^ D)	/* DSTDSaoxx */
195*593dc095SDavid du Colombier ROP_PROC(rop159, ~((D ^ S) & T))	/* TDSxan */
196*593dc095SDavid du Colombier ROP_PROC(rop160, D & T)		/* DTa */
197*593dc095SDavid du Colombier ROP_PROC(rop161, ~(((~T & S) | D) ^ T))		/* TDSTnaoxn */
198*593dc095SDavid du Colombier ROP_PROC(rop162, (~S | T) & D)		/* DTSnoa */
199*593dc095SDavid du Colombier ROP_PROC(rop163, ~(((D ^ S) | T) ^ D))		/* DTSDxoxn */
200*593dc095SDavid du Colombier ROP_PROC(rop164, ~((~(T | S) | D) ^ T))		/* TDSTonoxn */
201*593dc095SDavid du Colombier ROP_PROC(rop165, ~(D ^ T))	/* TDxn */
202*593dc095SDavid du Colombier ROP_PROC(rop166, (~T & S) ^ D)		/* DSTnax */
203*593dc095SDavid du Colombier ROP_PROC(rop167, ~(((T | S) & D) ^ T))		/* TDSToaxn */
204*593dc095SDavid du Colombier ROP_PROC(rop168, ((S | T) & D))		/* DTSoa */
205*593dc095SDavid du Colombier ROP_PROC(rop169, ~((S | T) ^ D))	/* DTSoxn */
206*593dc095SDavid du Colombier ROP_PROC(rop170, D)		/* D */
207*593dc095SDavid du Colombier ROP_PROC(rop171, ~(S | T) | D)		/* DTSono */
208*593dc095SDavid du Colombier ROP_PROC(rop172, (((S ^ D) & T) ^ S))		/* STDSxax */
209*593dc095SDavid du Colombier ROP_PROC(rop173, ~(((D & S) | T) ^ D))		/* DTSDaoxn */
210*593dc095SDavid du Colombier ROP_PROC(rop174, (~T & S) | D)		/* DSTnao */
211*593dc095SDavid du Colombier ROP_PROC(rop175, ~T | D)	/* DTno */
212*593dc095SDavid du Colombier ROP_PROC(rop176, (~S | D) & T)		/* TDSnoa */
213*593dc095SDavid du Colombier ROP_PROC(rop177, ~(((T ^ S) | D) ^ T))		/* TDSTxoxn */
214*593dc095SDavid du Colombier ROP_PROC(rop178, ((S ^ D) | (S ^ T)) ^ S)	/* SSTxDSxox */
215*593dc095SDavid du Colombier ROP_PROC(rop179, ~(~(T & D) & S))	/* SDTanan */
216*593dc095SDavid du Colombier ROP_PROC(rop180, (~D & S) ^ T)		/* TSDnax */
217*593dc095SDavid du Colombier ROP_PROC(rop181, ~(((D | S) & T) ^ D))		/* DTSDoaxn */
218*593dc095SDavid du Colombier ROP_PROC(rop182, (((T & D) | S) ^ T) ^ D)	/* DTSDTaoxx */
219*593dc095SDavid du Colombier ROP_PROC(rop183, ~((T ^ D) & S))	/* SDTxan */
220*593dc095SDavid du Colombier ROP_PROC(rop184, ((T ^ D) & S) ^ T)		/* TSDTxax */
221*593dc095SDavid du Colombier ROP_PROC(rop185, (~((D & T) | S) ^ D))		/* DSTDaoxn */
222*593dc095SDavid du Colombier ROP_PROC(rop186, (~S & T) | D)		/* DTSnao */
223*593dc095SDavid du Colombier ROP_PROC(rop187, ~S | D)	/* DSno */
224*593dc095SDavid du Colombier ROP_PROC(rop188, (~(S & D) & T) ^ S)		/* STDSanax */
225*593dc095SDavid du Colombier ROP_PROC(rop189, ~((D ^ T) & (D ^ S)))		/* SDxTDxan */
226*593dc095SDavid du Colombier ROP_PROC(rop190, (S ^ T) | D)		/* DTSxo */
227*593dc095SDavid du Colombier ROP_PROC(rop191, ~(S & T) | D)		/* DTSano */
228*593dc095SDavid du Colombier ROP_PROC(rop192, T & S)		/* TSa */
229*593dc095SDavid du Colombier ROP_PROC(rop193, ~(((~S & D) | T) ^ S))		/* STDSnaoxn */
230*593dc095SDavid du Colombier ROP_PROC(rop194, ~x(o(~o(S, D), T), S))		/* STDSonoxn */
231*593dc095SDavid du Colombier ROP_PROC(rop195, ~(S ^ T))	/* TSxn */
232*593dc095SDavid du Colombier ROP_PROC(rop196, ((~D | T) & S))	/* STDnoa */
233*593dc095SDavid du Colombier ROP_PROC(rop197, ~(((S ^ D) | T) ^ S))		/* STDSxoxn */
234*593dc095SDavid du Colombier ROP_PROC(rop198, ((~T & D) ^ S))	/* SDTnax */
235*593dc095SDavid du Colombier ROP_PROC(rop199, ~(((T | D) & S) ^ T))		/* TSDToaxn */
236*593dc095SDavid du Colombier ROP_PROC(rop200, ((T | D) & S))		/* SDToa */
237*593dc095SDavid du Colombier ROP_PROC(rop201, ~((D | T) ^ S))	/* STDoxn */
238*593dc095SDavid du Colombier ROP_PROC(rop202, ((D ^ S) & T) ^ D)		/* DTSDxax */
239*593dc095SDavid du Colombier ROP_PROC(rop203, ~(((S & D) | T) ^ S))		/* STDSaoxn */
240*593dc095SDavid du Colombier ROP_PROC(rop204, S)		/* S */
241*593dc095SDavid du Colombier ROP_PROC(rop205, ~(T | D) | S)		/* SDTono */
242*593dc095SDavid du Colombier ROP_PROC(rop206, (~T & D) | S)		/* SDTnao */
243*593dc095SDavid du Colombier ROP_PROC(rop207, ~T | S)	/* STno */
244*593dc095SDavid du Colombier ROP_PROC(rop208, (~D | S) & T)		/* TSDnoa */
245*593dc095SDavid du Colombier ROP_PROC(rop209, ~(((T ^ D) | S) ^ T))		/* TSDTxoxn */
246*593dc095SDavid du Colombier ROP_PROC(rop210, (~S & D) ^ T)		/* TDSnax */
247*593dc095SDavid du Colombier ROP_PROC(rop211, ~(((S | D) & T) ^ S))		/* STDSoaxn */
248*593dc095SDavid du Colombier ROP_PROC(rop212, x(a(x(D, T), x(T, S)), S))		/* SSTxTDxax */
249*593dc095SDavid du Colombier ROP_PROC(rop213, ~(~(S & T) & D))	/* DTSanan */
250*593dc095SDavid du Colombier ROP_PROC(rop214, ((((S & T) | D) ^ S) ^ T))		/* TSDTS aoxx */
251*593dc095SDavid du Colombier ROP_PROC(rop215, ~((S ^ T) & D))	/* DTS xan */
252*593dc095SDavid du Colombier ROP_PROC(rop216, ((T ^ S) & D) ^ T)		/* TDST xax */
253*593dc095SDavid du Colombier ROP_PROC(rop217, ~(((S & T) | D) ^ S))		/* SDTS aoxn */
254*593dc095SDavid du Colombier ROP_PROC(rop218, x(a(~a(D, S), T), D))		/* DTSD anax */
255*593dc095SDavid du Colombier ROP_PROC(rop219, ~a(x(S, D), x(T, S)))		/* STxDSxan */
256*593dc095SDavid du Colombier ROP_PROC(rop220, (~D & T) | S)		/* STD nao */
257*593dc095SDavid du Colombier ROP_PROC(rop221, ~D | S)	/* SDno */
258*593dc095SDavid du Colombier ROP_PROC(rop222, (T ^ D) | S)		/* SDT xo */
259*593dc095SDavid du Colombier ROP_PROC(rop223, (~(T & D)) | S)	/* SDT ano */
260*593dc095SDavid du Colombier ROP_PROC(rop224, ((S | D) & T))		/* TDS oa */
261*593dc095SDavid du Colombier ROP_PROC(rop225, ~((S | D) ^ T))	/*  TDS oxn */
262*593dc095SDavid du Colombier ROP_PROC(rop226, (((D ^ T) & S) ^ D))		/* DSTD xax */
263*593dc095SDavid du Colombier ROP_PROC(rop227, ~(((T & D) | S) ^ T))		/* TSDT aoxn */
264*593dc095SDavid du Colombier ROP_PROC(rop228, ((S ^ T) & D) ^ S)		/* SDTSxax */
265*593dc095SDavid du Colombier ROP_PROC(rop229, ~(((T & S) | D) ^ T))		/* TDST aoxn */
266*593dc095SDavid du Colombier ROP_PROC(rop230, (~(S & T) & D) ^ S)		/* SDTSanax */
267*593dc095SDavid du Colombier ROP_PROC(rop231, ~a(x(D, T), x(T, S)))		/* STxTDxan */
268*593dc095SDavid du Colombier ROP_PROC(rop232, x(a(x(S, D), x(T, S)), S))		/* SS TxD Sxax */
269*593dc095SDavid du Colombier ROP_PROC(rop233, ~x(x(a(~a(S, D), T), S), D))		/* DST DSan axxn   */
270*593dc095SDavid du Colombier ROP_PROC(rop234, (S & T) | D)		/* DTSao */
271*593dc095SDavid du Colombier ROP_PROC(rop235, ~(S ^ T) | D)		/* DTSxno */
272*593dc095SDavid du Colombier ROP_PROC(rop236, (T & D) | S)		/* SDTao */
273*593dc095SDavid du Colombier ROP_PROC(rop237, ~(T ^ D) | S)		/* SDTxno */
274*593dc095SDavid du Colombier ROP_PROC(rop238, S | D)		/* DSo */
275*593dc095SDavid du Colombier ROP_PROC(rop239, (~T | D) | S)		/* SDTnoo */
276*593dc095SDavid du Colombier ROP_PROC(rop240, T)		/* T */
277*593dc095SDavid du Colombier ROP_PROC(rop241, ~(S | D) | T)		/* TDSono */
278*593dc095SDavid du Colombier ROP_PROC(rop242, (~S & D) | T)		/* TDSnao */
279*593dc095SDavid du Colombier ROP_PROC(rop243, ~S | T)	/* TSno */
280*593dc095SDavid du Colombier ROP_PROC(rop244, (~D & S) | T)		/* TSDnao */
281*593dc095SDavid du Colombier ROP_PROC(rop245, ~D | T)	/* TDno */
282*593dc095SDavid du Colombier ROP_PROC(rop246, (S ^ D) | T)		/* TDSxo */
283*593dc095SDavid du Colombier ROP_PROC(rop247, ~(S & D) | T)		/* TDSano */
284*593dc095SDavid du Colombier ROP_PROC(rop248, (S & D) | T)		/* TDSao */
285*593dc095SDavid du Colombier ROP_PROC(rop249, ~(S ^ D) | T)		/* TDSxno */
286*593dc095SDavid du Colombier ROP_PROC(rop250, D | T)		/* DTo */
287*593dc095SDavid du Colombier ROP_PROC(rop251, (~S | T) | D)		/* DTSnoo */
288*593dc095SDavid du Colombier ROP_PROC(rop252, S | T)		/* TSo */
289*593dc095SDavid du Colombier ROP_PROC(rop253, (~D | S) | T)		/* TSDnoo */
290*593dc095SDavid du Colombier ROP_PROC(rop254, S | T | D)	/* DTSoo */
291*593dc095SDavid du Colombier ROP_PROC(rop255, ~(rop_operand) 0)	/* 1 */
292*593dc095SDavid du Colombier #undef ROP_PROC
293*593dc095SDavid du Colombier 
294*593dc095SDavid du Colombier      const rop_proc rop_proc_table[256] = {
2957dd7cddfSDavid du Colombier 	 rop0, rop1, rop2, rop3, rop4, rop5, rop6, rop7,
2967dd7cddfSDavid du Colombier 	 rop8, rop9, rop10, rop11, rop12, rop13, rop14, rop15,
2977dd7cddfSDavid du Colombier 	 rop16, rop17, rop18, rop19, rop20, rop21, rop22, rop23,
2987dd7cddfSDavid du Colombier 	 rop24, rop25, rop26, rop27, rop28, rop29, rop30, rop31,
2997dd7cddfSDavid du Colombier 	 rop32, rop33, rop34, rop35, rop36, rop37, rop38, rop39,
3007dd7cddfSDavid du Colombier 	 rop40, rop41, rop42, rop43, rop44, rop45, rop46, rop47,
3017dd7cddfSDavid du Colombier 	 rop48, rop49, rop50, rop51, rop52, rop53, rop54, rop55,
3027dd7cddfSDavid du Colombier 	 rop56, rop57, rop58, rop59, rop60, rop61, rop62, rop63,
3037dd7cddfSDavid du Colombier 	 rop64, rop65, rop66, rop67, rop68, rop69, rop70, rop71,
3047dd7cddfSDavid du Colombier 	 rop72, rop73, rop74, rop75, rop76, rop77, rop78, rop79,
3057dd7cddfSDavid du Colombier 	 rop80, rop81, rop82, rop83, rop84, rop85, rop86, rop87,
3067dd7cddfSDavid du Colombier 	 rop88, rop89, rop90, rop91, rop92, rop93, rop94, rop95,
3077dd7cddfSDavid du Colombier 	 rop96, rop97, rop98, rop99, rop100, rop101, rop102, rop103,
3087dd7cddfSDavid du Colombier 	 rop104, rop105, rop106, rop107, rop108, rop109, rop110, rop111,
3097dd7cddfSDavid du Colombier 	 rop112, rop113, rop114, rop115, rop116, rop117, rop118, rop119,
3107dd7cddfSDavid du Colombier 	 rop120, rop121, rop122, rop123, rop124, rop125, rop126, rop127,
3117dd7cddfSDavid du Colombier 	 rop128, rop129, rop130, rop131, rop132, rop133, rop134, rop135,
3127dd7cddfSDavid du Colombier 	 rop136, rop137, rop138, rop139, rop140, rop141, rop142, rop143,
3137dd7cddfSDavid du Colombier 	 rop144, rop145, rop146, rop147, rop148, rop149, rop150, rop151,
3147dd7cddfSDavid du Colombier 	 rop152, rop153, rop154, rop155, rop156, rop157, rop158, rop159,
3157dd7cddfSDavid du Colombier 	 rop160, rop161, rop162, rop163, rop164, rop165, rop166, rop167,
3167dd7cddfSDavid du Colombier 	 rop168, rop169, rop170, rop171, rop172, rop173, rop174, rop175,
3177dd7cddfSDavid du Colombier 	 rop176, rop177, rop178, rop179, rop180, rop181, rop182, rop183,
3187dd7cddfSDavid du Colombier 	 rop184, rop185, rop186, rop187, rop188, rop189, rop190, rop191,
3197dd7cddfSDavid du Colombier 	 rop192, rop193, rop194, rop195, rop196, rop197, rop198, rop199,
3207dd7cddfSDavid du Colombier 	 rop200, rop201, rop202, rop203, rop204, rop205, rop206, rop207,
3217dd7cddfSDavid du Colombier 	 rop208, rop209, rop210, rop211, rop212, rop213, rop214, rop215,
3227dd7cddfSDavid du Colombier 	 rop216, rop217, rop218, rop219, rop220, rop221, rop222, rop223,
3237dd7cddfSDavid du Colombier 	 rop224, rop225, rop226, rop227, rop228, rop229, rop230, rop231,
3247dd7cddfSDavid du Colombier 	 rop232, rop233, rop234, rop235, rop236, rop237, rop238, rop239,
3257dd7cddfSDavid du Colombier 	 rop240, rop241, rop242, rop243, rop244, rop245, rop246, rop247,
3267dd7cddfSDavid du Colombier 	 rop248, rop249, rop250, rop251, rop252, rop253, rop254, rop255
3277dd7cddfSDavid du Colombier      };
3287dd7cddfSDavid du Colombier 
3297dd7cddfSDavid du Colombier /*
3307dd7cddfSDavid du Colombier  * Here is the program that generated the table below.
3317dd7cddfSDavid du Colombier  *
3327dd7cddfSDavid du Colombier  int
3337dd7cddfSDavid du Colombier  main(int argc, char *argv[])
3347dd7cddfSDavid du Colombier  {      uint i;
3357dd7cddfSDavid du Colombier  for ( i = 0; i < 256; ++i )
3367dd7cddfSDavid du Colombier  printf("%d,",
3377dd7cddfSDavid du Colombier  (rop3_uses_D(i) ? rop_usage_D : 0) |
3387dd7cddfSDavid du Colombier  (rop3_uses_S(i) ? rop_usage_S : 0) |
3397dd7cddfSDavid du Colombier  (rop3_uses_T(i) ? rop_usage_T : 0));
3407dd7cddfSDavid du Colombier  fflush(stdout);
3417dd7cddfSDavid du Colombier  return 0;
3427dd7cddfSDavid du Colombier  }
3437dd7cddfSDavid du Colombier  */
3447dd7cddfSDavid du Colombier 
3457dd7cddfSDavid du Colombier      const byte /*rop_usage_t */ rop_usage_table[256] =
3467dd7cddfSDavid du Colombier      {
3477dd7cddfSDavid du Colombier 	 0, 7, 7, 6, 7, 5, 7, 7, 7, 7, 5, 7, 6, 7, 7, 4,
3487dd7cddfSDavid du Colombier 	 7, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3497dd7cddfSDavid du Colombier 	 7, 7, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3507dd7cddfSDavid du Colombier 	 6, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 6, 7, 7, 6,
3517dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3527dd7cddfSDavid du Colombier 	 5, 7, 7, 7, 7, 1, 7, 7, 7, 7, 5, 7, 7, 7, 7, 5,
3537dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3547dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 7, 3, 7, 7, 7, 7, 7, 7, 7, 7,
3557dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 7, 7, 3, 7, 7, 7, 7, 7, 7, 7,
3567dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 7, 7, 7, 7, 7, 7,
3577dd7cddfSDavid du Colombier 	 5, 7, 7, 7, 7, 5, 7, 7, 7, 7, 1, 7, 7, 7, 7, 5,
3587dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 7, 7, 7, 7,
3597dd7cddfSDavid du Colombier 	 6, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 6,
3607dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 7, 7,
3617dd7cddfSDavid du Colombier 	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 7,
3627dd7cddfSDavid du Colombier 	 4, 7, 7, 6, 7, 5, 7, 7, 7, 7, 5, 7, 6, 7, 7, 0
3637dd7cddfSDavid du Colombier      };
364