diff options
Diffstat (limited to 'src/models.S')
| -rw-r--r-- | src/models.S | 716 |
1 files changed, 716 insertions, 0 deletions
diff --git a/src/models.S b/src/models.S new file mode 100644 index 0000000..77218f4 --- /dev/null +++ b/src/models.S @@ -0,0 +1,716 @@ +#include "abi.inc" +#include "defs.inc" + + .text + +FUNC cepis__addr_field_offset + PROLOGUE 24 + mov %rdi, %rbx + lea cepis__addr_fields(%rip), %r12 +.Lfo_loop: + mov (%r12), %rsi + test %rsi, %rsi + jz .Lfo_none + mov %rbx, %rdi + call strcmp@PLT + test %eax, %eax + jz .Lfo_hit + add $16, %r12 + jmp .Lfo_loop +.Lfo_hit: + mov 8(%r12), %rax + EPILOGUE + ret +.Lfo_none: + mov $-1, %rax + EPILOGUE + ret +ENDFUNC cepis__addr_field_offset + +FUNC cepis__addr_set + PROLOGUE 24 + mov %rdi, %rbx + mov %rsi, %r12 + mov %rdx, %r13 + mov (%rbx, %r12, 1), %rdi + test %rdi, %rdi + jz .Lset_store + call free@PLT +.Lset_store: + mov %r13, (%rbx, %r12, 1) + EPILOGUE + ret +ENDFUNC cepis__addr_set + +FUNC cepis__address_new + PROLOGUE 24 + mov $1, %rdi + mov $A_SIZE, %rsi + call calloc@PLT + test %rax, %rax + jz .Lanew_out + mov %rax, %rbx + xor %r12d, %r12d +.Lanew_loop: + cmp $(A_NFIELDS * 8), %r12 + jae .Lanew_done + call cepis__empty + test %rax, %rax + jz .Lanew_fail + mov %rax, (%rbx, %r12, 1) + add $8, %r12 + jmp .Lanew_loop +.Lanew_done: + mov %rbx, %rax +.Lanew_out: + EPILOGUE + ret +.Lanew_fail: + mov %rbx, %rdi + call cepis_address_free + xor %eax, %eax + EPILOGUE + ret +ENDFUNC cepis__address_new + +PUBFUNC cepis_address_free + PROLOGUE 24 + test %rdi, %rdi + jz .Lafree_out + mov %rdi, %rbx + xor %r12d, %r12d +.Lafree_loop: + cmp $(A_NFIELDS * 8), %r12 + jae .Lafree_geo + mov (%rbx, %r12, 1), %rdi + test %rdi, %rdi + jz .Lafree_next + call free@PLT +.Lafree_next: + add $8, %r12 + jmp .Lafree_loop +.Lafree_geo: + mov A_GEO(%rbx), %r13 + test %r13, %r13 + jz .Lafree_raw + mov GEO_PRECISAO(%r13), %rdi + test %rdi, %rdi + jz .Lafree_geo_self + call free@PLT +.Lafree_geo_self: + mov %r13, %rdi + call free@PLT +.Lafree_raw: + mov A_RAW(%rbx), %rdi + test %rdi, %rdi + jz .Lafree_self + call free@PLT +.Lafree_self: + mov %rbx, %rdi + call free@PLT +.Lafree_out: + EPILOGUE + ret +ENDFUNC cepis_address_free + +PUBFUNC cepis_address_list_free + PROLOGUE 24 + test %rdi, %rdi + jz .Llfree_out + mov %rdi, %rbx + mov %rsi, %r12 + xor %r13d, %r13d +.Llfree_loop: + cmp %r12, %r13 + jae .Llfree_self + mov (%rbx, %r13, 8), %rdi + call cepis_address_free + inc %r13 + jmp .Llfree_loop +.Llfree_self: + mov %rbx, %rdi + call free@PLT +.Llfree_out: + EPILOGUE + ret +ENDFUNC cepis_address_list_free + +PUBFUNC cepis_health_free + PROLOGUE 24 + test %rdi, %rdi + jz .Lhfree_out + mov %rdi, %rbx + mov H_STATUS(%rbx), %rdi + test %rdi, %rdi + jz .Lhfree_1 + call free@PLT +.Lhfree_1: + mov H_DNE(%rbx), %rdi + test %rdi, %rdi + jz .Lhfree_2 + call free@PLT +.Lhfree_2: + mov H_BASE_GERADA(%rbx), %rdi + test %rdi, %rdi + jz .Lhfree_3 + call free@PLT +.Lhfree_3: + mov H_RAW(%rbx), %rdi + test %rdi, %rdi + jz .Lhfree_self + call free@PLT +.Lhfree_self: + mov %rbx, %rdi + call free@PLT +.Lhfree_out: + EPILOGUE + ret +ENDFUNC cepis_health_free + +PUBFUNC cepis_geo_is_precise + xor %eax, %eax + test %rdi, %rdi + jz .Lprec_out + mov GEO_PRECISAO(%rdi), %rdi + test %rdi, %rdi + jz .Lprec_out + lea .Ls_logradouro_val(%rip), %rsi + jmp cepis__streq_tail +.Lprec_out: + ret +ENDFUNC cepis_geo_is_precise + +FUNC cepis__streq_tail + PROLOGUE 8 + call strcmp@PLT + test %eax, %eax + jz .Lseq_yes + xor %eax, %eax + EPILOGUE + ret +.Lseq_yes: + mov $1, %eax + EPILOGUE + ret +ENDFUNC cepis__streq_tail + +PUBFUNC cepis_address_formatted_cep + test %rsi, %rsi + jz .Lfmt_out + movb $0, (%rsi) + test %rdi, %rdi + jz .Lfmt_out + mov A_CEP(%rdi), %rdi + test %rdi, %rdi + jz .Lfmt_out + xor %ecx, %ecx + xor %edx, %edx +.Lfmt_loop: + cmp $9, %rcx + jae .Lfmt_end + movzbl (%rdi, %rcx, 1), %eax + test %al, %al + jz .Lfmt_end + cmp $5, %rcx + jne .Lfmt_put + movb $'-', (%rsi, %rdx, 1) + inc %rdx +.Lfmt_put: + mov %al, (%rsi, %rdx, 1) + inc %rdx + inc %rcx + jmp .Lfmt_loop +.Lfmt_end: + movb $0, (%rsi, %rdx, 1) +.Lfmt_out: + ret +ENDFUNC cepis_address_formatted_cep + +FUNC cepis__geo_parse + PROLOGUE 88 + mov %rsi, %r14 + movq $0, (%r14) + movq $0, LOCAL3(%rbp) + xor %r15d, %r15d + cmpb $'{', (%rdi) + jne .Lgeo_fail + lea 1(%rdi), %rdi + call cepis__js_ws + mov %rax, %rbx + cmpb $'}', (%rbx) + je .Lgeo_finish +.Lgeo_pair: + cmpb $'"', (%rbx) + jne .Lgeo_fail + mov %rbx, %rdi + lea LOCAL4(%rbp), %rsi + call cepis__js_string + test %rax, %rax + jz .Lgeo_fail + mov %rax, %rdi + call cepis__js_ws + mov %rax, %rbx + cmpb $':', (%rbx) + jne .Lgeo_fail_key + inc %rbx + mov LOCAL4(%rbp), %rdi + lea .Ls_lat(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lgeo_lat + mov LOCAL4(%rbp), %rdi + lea .Ls_lon(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lgeo_lon + mov LOCAL4(%rbp), %rdi + lea .Ls_raio_m(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lgeo_raio + mov LOCAL4(%rbp), %rdi + lea .Ls_precisao(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lgeo_prec + mov %rbx, %rdi + call cepis__js_skip + jmp .Lgeo_after +.Lgeo_lat: + mov %rbx, %rdi + lea LOCAL0(%rbp), %rsi + call cepis__js_number + or $1, %r15d + jmp .Lgeo_after +.Lgeo_lon: + mov %rbx, %rdi + lea LOCAL1(%rbp), %rsi + call cepis__js_number + or $2, %r15d + jmp .Lgeo_after +.Lgeo_raio: + mov %rbx, %rdi + lea LOCAL2(%rbp), %rsi + call cepis__js_number + or $4, %r15d + jmp .Lgeo_after +.Lgeo_prec: + mov LOCAL3(%rbp), %rdi + test %rdi, %rdi + jz .Lgeo_prec_go + call free@PLT + movq $0, LOCAL3(%rbp) +.Lgeo_prec_go: + mov %rbx, %rdi + lea LOCAL3(%rbp), %rsi + call cepis__js_scalar_text + or $8, %r15d +.Lgeo_after: + mov %rax, %r12 + mov LOCAL4(%rbp), %rdi + call free@PLT + movq $0, LOCAL4(%rbp) + test %r12, %r12 + jz .Lgeo_fail + mov %r12, %rdi + call cepis__js_ws + mov %rax, %rbx + cmpb $',', (%rbx) + je .Lgeo_comma + cmpb $'}', (%rbx) + je .Lgeo_finish + jmp .Lgeo_fail +.Lgeo_comma: + lea 1(%rbx), %rdi + call cepis__js_ws + mov %rax, %rbx + jmp .Lgeo_pair +.Lgeo_finish: + cmp $15, %r15d + jne .Lgeo_fail + cmpq $0, LOCAL3(%rbp) + je .Lgeo_fail + mov $1, %rdi + mov $GEO_SIZE, %rsi + call calloc@PLT + test %rax, %rax + jz .Lgeo_fail + mov %rax, %rbx + movsd LOCAL0(%rbp), %xmm0 + movsd %xmm0, GEO_LAT(%rbx) + movsd LOCAL1(%rbp), %xmm0 + movsd %xmm0, GEO_LON(%rbx) + cvttsd2si LOCAL2(%rbp), %rax + mov %rax, GEO_RAIO_M(%rbx) + mov LOCAL3(%rbp), %rax + mov %rax, GEO_PRECISAO(%rbx) + movq $0, LOCAL3(%rbp) + mov %rbx, (%r14) + EPILOGUE + ret +.Lgeo_fail_key: + mov LOCAL4(%rbp), %rdi + call free@PLT +.Lgeo_fail: + mov LOCAL3(%rbp), %rdi + test %rdi, %rdi + jz .Lgeo_fail_out + call free@PLT +.Lgeo_fail_out: + EPILOGUE + ret +ENDFUNC cepis__geo_parse + +FUNC cepis__address_from_json + PROLOGUE 40 + mov %rsi, %r14 + movq $0, (%r14) + mov %rdi, %r15 + call cepis__address_new + test %rax, %rax + jz .Lafj_nomem + mov %rax, %rbx + mov %r15, %rdi + call cepis__strdup + test %rax, %rax + jz .Lafj_nomem_free + mov %rax, A_RAW(%rbx) + mov %r15, %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $'{', (%r12) + jne .Lafj_invalid + lea 1(%r12), %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $'}', (%r12) + je .Lafj_ok +.Lafj_pair: + cmpb $'"', (%r12) + jne .Lafj_invalid + mov %r12, %rdi + lea LOCAL0(%rbp), %rsi + call cepis__js_string + test %rax, %rax + jz .Lafj_invalid + mov %rax, %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $':', (%r12) + jne .Lafj_invalid_key + lea 1(%r12), %rdi + call cepis__js_ws + mov %rax, %r12 + mov LOCAL0(%rbp), %rdi + lea .Ls_geo(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lafj_geo + mov LOCAL0(%rbp), %rdi + call cepis__addr_field_offset + cmp $0, %rax + jl .Lafj_unknown + mov %rax, %r13 + movzbl (%r12), %eax + cmp $'{', %al + je .Lafj_unknown + cmp $'[', %al + je .Lafj_unknown + mov %r12, %rdi + lea LOCAL1(%rbp), %rsi + call cepis__js_scalar_text + test %rax, %rax + jz .Lafj_invalid_key + mov %rax, %r12 + mov %rbx, %rdi + mov %r13, %rsi + mov LOCAL1(%rbp), %rdx + call cepis__addr_set + jmp .Lafj_next +.Lafj_unknown: + mov %r12, %rdi + call cepis__js_skip + test %rax, %rax + jz .Lafj_invalid_key + mov %rax, %r12 + jmp .Lafj_next +.Lafj_geo: + mov %r12, %rdi + call cepis__js_skip + test %rax, %rax + jz .Lafj_invalid_key + mov %rax, %r13 + cmpb $'{', (%r12) + jne .Lafj_geo_done + mov %r12, %rdi + lea LOCAL2(%rbp), %rsi + call cepis__geo_parse + mov LOCAL2(%rbp), %rax + test %rax, %rax + jz .Lafj_geo_done + mov %rax, A_GEO(%rbx) +.Lafj_geo_done: + mov %r13, %r12 +.Lafj_next: + mov LOCAL0(%rbp), %rdi + call free@PLT + movq $0, LOCAL0(%rbp) + mov %r12, %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $',', (%r12) + je .Lafj_comma + cmpb $'}', (%r12) + je .Lafj_ok + jmp .Lafj_invalid +.Lafj_comma: + lea 1(%r12), %rdi + call cepis__js_ws + mov %rax, %r12 + jmp .Lafj_pair +.Lafj_ok: + mov %rbx, (%r14) + xor %eax, %eax + EPILOGUE + ret +.Lafj_invalid_key: + mov LOCAL0(%rbp), %rdi + call free@PLT +.Lafj_invalid: + mov %rbx, %rdi + call cepis_address_free + mov $CEPIS_ERR_INVALID_RESPONSE, %eax + EPILOGUE + ret +.Lafj_nomem_free: + mov %rbx, %rdi + call cepis_address_free +.Lafj_nomem: + mov $CEPIS_ERR_NOMEM, %eax + EPILOGUE + ret +ENDFUNC cepis__address_from_json + +FUNC cepis__health_from_json + PROLOGUE 40 + mov %rsi, %r14 + movq $0, (%r14) + mov %rdi, %r15 + mov $1, %rdi + mov $H_SIZE, %rsi + call calloc@PLT + test %rax, %rax + jz .Lhfj_nomem + mov %rax, %rbx + call cepis__empty + test %rax, %rax + jz .Lhfj_nomem_free + mov %rax, H_STATUS(%rbx) + call cepis__empty + test %rax, %rax + jz .Lhfj_nomem_free + mov %rax, H_DNE(%rbx) + call cepis__empty + test %rax, %rax + jz .Lhfj_nomem_free + mov %rax, H_BASE_GERADA(%rbx) + mov %r15, %rdi + call cepis__strdup + test %rax, %rax + jz .Lhfj_nomem_free + mov %rax, H_RAW(%rbx) + mov %r15, %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $'{', (%r12) + jne .Lhfj_invalid + lea 1(%r12), %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $'}', (%r12) + je .Lhfj_ok +.Lhfj_pair: + cmpb $'"', (%r12) + jne .Lhfj_invalid + mov %r12, %rdi + lea LOCAL0(%rbp), %rsi + call cepis__js_string + test %rax, %rax + jz .Lhfj_invalid + mov %rax, %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $':', (%r12) + jne .Lhfj_invalid_key + lea 1(%r12), %rdi + call cepis__js_ws + mov %rax, %r12 + mov LOCAL0(%rbp), %rdi + lea .Ls_status(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lhfj_status + mov LOCAL0(%rbp), %rdi + lea .Ls_dne(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lhfj_dne + mov LOCAL0(%rbp), %rdi + lea .Ls_base_gerada(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lhfj_base + mov LOCAL0(%rbp), %rdi + lea .Ls_ceps(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lhfj_ceps + mov LOCAL0(%rbp), %rdi + lea .Ls_geo(%rip), %rsi + call strcmp@PLT + test %eax, %eax + jz .Lhfj_geo + mov %r12, %rdi + call cepis__js_skip + test %rax, %rax + jz .Lhfj_invalid_key + mov %rax, %r12 + jmp .Lhfj_next +.Lhfj_status: + mov $H_STATUS, %r13 + jmp .Lhfj_text +.Lhfj_dne: + mov $H_DNE, %r13 + jmp .Lhfj_text +.Lhfj_base: + mov $H_BASE_GERADA, %r13 +.Lhfj_text: + movzbl (%r12), %eax + cmp $'{', %al + je .Lhfj_skipval + cmp $'[', %al + je .Lhfj_skipval + mov %r12, %rdi + lea LOCAL1(%rbp), %rsi + call cepis__js_scalar_text + test %rax, %rax + jz .Lhfj_invalid_key + mov %rax, %r12 + mov (%rbx, %r13, 1), %rdi + call free@PLT + mov LOCAL1(%rbp), %rax + mov %rax, (%rbx, %r13, 1) + jmp .Lhfj_next +.Lhfj_skipval: + mov %r12, %rdi + call cepis__js_skip + test %rax, %rax + jz .Lhfj_invalid_key + mov %rax, %r12 + jmp .Lhfj_next +.Lhfj_ceps: + mov $H_CEPS, %r13 + jmp .Lhfj_int +.Lhfj_geo: + mov $H_GEO, %r13 +.Lhfj_int: + movzbl (%r12), %eax + cmp $'{', %al + je .Lhfj_skipval + cmp $'[', %al + je .Lhfj_skipval + mov %r12, %rdi + lea LOCAL1(%rbp), %rsi + call cepis__js_number + test %rax, %rax + jz .Lhfj_skipval + mov %rax, %r12 + cvttsd2si LOCAL1(%rbp), %rax + mov %rax, (%rbx, %r13, 1) +.Lhfj_next: + mov LOCAL0(%rbp), %rdi + call free@PLT + movq $0, LOCAL0(%rbp) + mov %r12, %rdi + call cepis__js_ws + mov %rax, %r12 + cmpb $',', (%r12) + je .Lhfj_comma + cmpb $'}', (%r12) + je .Lhfj_ok + jmp .Lhfj_invalid +.Lhfj_comma: + lea 1(%r12), %rdi + call cepis__js_ws + mov %rax, %r12 + jmp .Lhfj_pair +.Lhfj_ok: + mov %rbx, (%r14) + xor %eax, %eax + EPILOGUE + ret +.Lhfj_invalid_key: + mov LOCAL0(%rbp), %rdi + call free@PLT +.Lhfj_invalid: + mov %rbx, %rdi + call cepis_health_free + mov $CEPIS_ERR_INVALID_RESPONSE, %eax + EPILOGUE + ret +.Lhfj_nomem_free: + mov %rbx, %rdi + call cepis_health_free +.Lhfj_nomem: + mov $CEPIS_ERR_NOMEM, %eax + EPILOGUE + ret +ENDFUNC cepis__health_from_json + + .section .rodata + +.Ls_cep: .asciz "cep" +.Ls_logradouro: .asciz "logradouro" +.Ls_complemento: .asciz "complemento" +.Ls_unidade: .asciz "unidade" +.Ls_bairro: .asciz "bairro" +.Ls_localidade: .asciz "localidade" +.Ls_uf: .asciz "uf" +.Ls_estado: .asciz "estado" +.Ls_regiao: .asciz "regiao" +.Ls_ibge: .asciz "ibge" +.Ls_gia: .asciz "gia" +.Ls_ddd: .asciz "ddd" +.Ls_siafi: .asciz "siafi" +.Ls_geo: .asciz "geo" +.Ls_lat: .asciz "lat" +.Ls_lon: .asciz "lon" +.Ls_raio_m: .asciz "raio_m" +.Ls_precisao: .asciz "precisao" +.Ls_status: .asciz "status" +.Ls_dne: .asciz "dne" +.Ls_ceps: .asciz "ceps" +.Ls_base_gerada: .asciz "base_gerada_em" +.Ls_logradouro_val: .asciz "logradouro" + + .section .data.rel.ro,"aw",@progbits + .p2align 3 + .globl cepis__addr_fields + .hidden cepis__addr_fields +cepis__addr_fields: + .quad .Ls_cep, A_CEP + .quad .Ls_logradouro, A_LOGRADOURO + .quad .Ls_complemento, A_COMPLEMENTO + .quad .Ls_unidade, A_UNIDADE + .quad .Ls_bairro, A_BAIRRO + .quad .Ls_localidade, A_LOCALIDADE + .quad .Ls_uf, A_UF + .quad .Ls_estado, A_ESTADO + .quad .Ls_regiao, A_REGIAO + .quad .Ls_ibge, A_IBGE + .quad .Ls_gia, A_GIA + .quad .Ls_ddd, A_DDD + .quad .Ls_siafi, A_SIAFI + .quad 0, 0 + + .section .note.GNU-stack,"",@progbits |