Como a abordagem do LLDB aqui parece ser um pouco diferente da do GDB, demorei um pouco para acertar, então aqui está como fiz:
Digamos que paramos nosso programa em algum ponto e desejamos saber o estado do xmm0
registrador que contém 4 floats. Uma impressão simples produzirá apenas o seguinte:
(lldb) po $xmm0
(unsigned char __attribute__((ext_vector_type(16)))) $6 = {
[0] = ' '
...
[15] = '@'
}
Não é realmente útil. Para obter a saída adequada, precisamos converter o registrador para o tipo adequado, como este:
po (float __attribute__((ext_vector_type(4)))) $xmm0
([0] = 1, [1] = 2, [2] = 3, [3] = 4)
Para que isso funcione, deve-se modificar tanto o tipo (neste caso char -> float
) quanto a quantidade de elementos no vetor ( 16 -> 4
). O tamanho do tipo multiplicado pelo número de elementos deve corresponder ao tamanho do registro SIMD, caso contrário, o LLDB reclamará. Nesse caso, xmm0
tem 128 bits de largura e 32 (tamanho do flutuador) * 4 é igual a 128.