After addressing @PeterCordes suggestions:
TokenType::MemoryScan(n) => {
let loop_label = format!("loop_memory_scan{}", label_counter);
label_counter += 1;
let constant = match *n {
1 => format!(" cbz x8, {}\n", loop_label),
2 => " ands x8, x8, #0x0f0f0f0f0f0f0f0f\n".to_string(),
4 => " ands x8, x8, #0x000f000f000f000f\n".to_string(),
8 => " ands x8, x8, #0x0000000f0000000f\n".to_string(),
_ => unreachable!(),
};
assembly.push_str(&format!("{}:\n", loop_label));
assembly.push_str(" ld1.16b {v0}, [x19], #16\n");
assembly.push_str(" cmeq.16b v0, v0, #0\n");
assembly.push_str(" shrn.8b v0, v0, #4\n");
assembly.push_str(" fmov x8, d0\n");
assembly.push_str(&constant);
if *n != 1 {
assembly.push_str(&format!(" b.eq {}\n", loop_label));
}
assembly.push_str(" rbit x9, x8\n");
assembly.push_str(" clz x9, x9\n");
assembly.push_str(" ubfx x9, x9, #2, #30\n");
assembly.push_str(" sub x19, x19, #16\n");
assembly.push_str(" add x19, x19, x9\n");
},
Thanks a lot! I guess there is no pre-increment in arm, so I used the post-increment and subtracted before adding the index to handle additional increment from the last try. This code turned out working fine.