Based on Eric's answer here are some I have spotted. Where I can see a reason I have indicated it, if not I freely speculate. Feel free to indicate if those speculations are wrong.
Break
Signals the Common Language Infrastructure (CLI) to inform the debugger that a break point has been tripped.
You would do this by calling System.Diagnostics.Debugger.Break(), this appears not to use that instruction directly but instead uses a BreakInternal() method baked into the CLR.
Cpblk
and Cpobj
Copies a specified number bytes from a source address to a destination address.
Copies the value type located at the address of an object (type &, * or native int) to the address of the destination object (type &, * or native int).
I presume these were added for C++/CLI (previously Managed C++), but that is purely speculation on my part. They may also be present in certain system calls but not generated normally by the compiler and provide some scope for unsafe fun and games.
Endfilter
Transfers control from the filter clause of an exception back to the Common Language Infrastructure (CLI) exception handler.
C# doesn't support exception filtering. The VB compiler doubtless makes use of this though.
Initblk
Initializes a specified block of memory at a specific address to a given size and initial value.
I am going to speculate again that this is potentially useful in unsafe code and C++/CLI
Jmp
Exits current method and jumps to specified method.
I will speculate that this sort of trampolining may be useful to those wanting to avoid tail calls. Perhaps the DLR makes use of it?
Tailcall
Performs a postfixed method call instruction such that the current method's stack frame is removed before the actual call instruction is executed.
Discussed in depth elsewhere, currently the c# compiler does not emit this opcode
Unaligned
Indicates that an address currently atop the evaluation stack might not be aligned to the natural size of the immediately following ldind, stind, ldfld, stfld, ldobj, stobj, initblk, or cpblk instruction.
C# (and the CLR) makes quite a few guarantees concerning the aligned nature of much of its resulting code and data. It is not surprising that this is not emitted, but I can see why it would be included.
Unbox
Converts the boxed representation of a value type to its unboxed form.
The c# compiler prefers to use the Unbox_Any
instruction exclusively for this purpose. I presume, based on the addition of this to the instruction set in the 2.0 release it makes generics either feasibale, or much simpler. At that point using it throughout the code for everything, generics or otherwise, was either safer, simpler or quicker (or some combination of all).
Footnote:
Prefix1, Prefix2, Prefix3, Prefix4, Prefix5, Prefix6, Prefix7, Prefixref
Infrastructure. This is a reserved instruction.
These are not instructions as such, Some IL instructions are longer than others. These variable length ones should start with prefixes which are never valid on their own to make parsing clear. These prefix opcodes are reserved for that so they are not used elsewhere. Doubtless someone implementing a switch statement based parser for an IL sequence would appreciate these so they could trap those and maintain state.