assembly – register usage and wasm compiler

I am using Ubuntu on x86_64. I first generate non-optimized WebAssembly code from clang. The WebAssembly code is compiled into machine code using wasmtime which uses cranelift as compiling backend.

I am doing a simple matrix multiplication. int first(m)(n), second(p)(q), multiply(m)(q);
Here is machine code for the 1st loop out of the three loops for ( int c = 0 ; c < m ; c++ ){} generated by wasmtime. I found many necessary instructions but I cannot find calling convention from cranelift to necessitate these instructions.

(!(Assembly code)(1))(1)

(1) My questions are mainly around esi register, does the compiler has to use it for get c‘s value using esi. Must esi‘s value be preserved? Otherwise why not directly use it to do cmp. If yes, why in 1ad we use esi to store 0 which is from r14d which is from eax? Also, the 0 value is preserved in eax, is eax also a non-volatile register?

(2) In 1b0, if we directly cmp esi, r12d and set esi 0 or 1 according to results, there is no need to complicated steps 1ba1c3 Right?

(3) if I generate optimized machine code from optimized WebAssembly using wasm32-wasi-clang -O2 I dont think cranelift by itself provides a optimization flag though, I find the machine code much shorter but also hard to understand. Are there any ways to help me read optimized machine code? AND Also, if my machine code is from the non-optimized wasm. According to the analysis we just did on this for loop example, is it ok to say that I have found the flaws of wasm compiler, cranelift?