Let's assume that we're starting with nothing but the list of functions to be supported, and try a stream of conscience design...
There are two obvious functional groups; arithmetic and logical. One control bit will need to select between the two groups.
The logical group is straightforward so we should design the arithmetic group first. For now, we'll hope the constants fall out somewhere along the way.
We need to do addition, subtraction, increment and decrement. It's a minor reconfiguration of a full adder to do these four functions:
We need to assign one control bit to select Y vs. FFFF and one bit to select the inverter / carry in.
We're missing reverse subtraction and inc/dec Y. I see that if we swap X and Y inputs we'll get those 3 functions too. We need another control bit to cause this swap.
At this point we have X+Y, X-Y, Y-X, X+1, Y+1, X-1 and Y-1. Not too bad for 3 control bits.
Missing are -X and -Y which are clearly arithmetic, and constant 1 which feels like it will need an arithmetic operation like 0+1 to generate it. I'm not sure how to add them at the moment.
It's time to work on the logical group. It will need to handle X&Y, X|Y, X, Y, !X and !Y. It would be nice if it can generate 0 and FFFF as well. Using the input swapper and Y vs. FFFF circuit as common input processing to both groups should be useful for generating the single variable functions.
I'll stop here for now and wait to hear from you, assuming that you might want to try your hand at finishing off this design. I also need to think about the missing arithmetic functions!
I think I'll try building this in Logisim. (I highly recommend Logisim
http://www.cburch.com/logisim/. The adder graphic came from it.)
--Mark