To say it in the narrow sense, the "assembler language" you are talking about is ... C.
This is because many C expressions have direct mappings for individual assembly instructions even on different platforms. The following is partially hypothetical, but it shows some of the instructions that a particular C expression can evaluate to x86, ARM, or SPARC (choosing these three because the ones that I know best):
C code x86 asm ARM asm SPARC asm { enter push lr save %fp, ..., %sp } leave pop pc restore a += b; add %ebx, %eax add R0, R1 add %l0, %l1, %l0 a = b + c; lea (%ebx, %ecx), %eax add R0, R1, R2 add %l2, %l1, %l0 a = 0; xor %eax, %eax mov R0,
Of course, not everything you can write, since one line of C code is converted to one assembly instruction. It also depends heavily on the instruction set if certain multi-segment operations can be “flattened” to a single instruction with several operands or require a sequence of “more primitive” instructions.
Compilers
C for a long time performed an "intermediate representation" before the final conversion to assembly; this step is similar to the way it was done these days on equipment with x86 processors to “compile” the x86 assembly in lower-level microoperations that will process the actual chip actuators. The fact that the middle tier got codified / documented, as happened for LLVM IR, is not new or ... since, for example, Java Bytecode or Forth is conceptually suitable for this scheme.
I would go to C ... and look at the assembly. It is unlikely to be as compact as possible, and on platforms where the corresponding “complex” operation is available, it is unlikely to be more compact than LLVM IR (say, on a processor with smooth multiplication-addition, the auselen example would go to one instruction, out of three in LLVM IR).