diff options
Diffstat (limited to 'src/upb_decoder_x86.dasc')
-rw-r--r-- | src/upb_decoder_x86.dasc | 64 |
1 files changed, 22 insertions, 42 deletions
diff --git a/src/upb_decoder_x86.dasc b/src/upb_decoder_x86.dasc index d02f7d1..fd2652a 100644 --- a/src/upb_decoder_x86.dasc +++ b/src/upb_decoder_x86.dasc @@ -135,7 +135,7 @@ void upb_reg_jit_gdb(upb_decoder *d) { |// Checks PTR for end-of-buffer. |.macro check_eob, m | cmp PTR, DECODER->effective_end -|| if (m->endgroup_f) { +|| if (m->is_group) { | jae ->exit_jit || } else { | jae =>m->jit_endofbuf_pclabel @@ -194,7 +194,7 @@ void upb_reg_jit_gdb(upb_decoder *d) { | |.macro setmsgend, m | mov rsi, DECODER->jit_end -|| if (m->endgroup_f) { +|| if (m->is_group) { | mov64 rax, 0xffffffffffffffff | mov qword DECODER->submsg_end, rax | mov DECODER->effective_end, rsi @@ -253,8 +253,8 @@ void upb_reg_jit_gdb(upb_decoder *d) { // PTR should point to the beginning of the tag. static void upb_decoder_jit_field(upb_decoder *d, uint32_t tag, uint32_t next_tag, - upb_handlers_msgent *m, - upb_handlers_fieldent *f, upb_handlers_fieldent *next_f) { + upb_msgent *m, + upb_fieldent *f, upb_fieldent *next_f) { int tag_size = upb_value_size(tag); // PC-label for the dispatch table. @@ -388,7 +388,7 @@ static void upb_decoder_jit_field(upb_decoder *d, uint32_t tag, uint32_t next_ta | mov DECODER->dispatcher.top, rax | mov FRAME, rax - upb_handlers_msgent *sub_m = upb_handlers_getmsgent(d->dispatcher.handlers, f); + upb_msgent *sub_m = upb_handlers_getmsgent(d->dispatcher.handlers, f); if (sub_m->jit_parent_field_done_pclabel != UPB_MULTIPLE) { | jmp =>sub_m->jit_startmsg_pclabel; } else { @@ -433,10 +433,11 @@ static void upb_decoder_jit_field(upb_decoder *d, uint32_t tag, uint32_t next_ta } static int upb_compare_uint32(const void *a, const void *b) { + // TODO: always put ENDGROUP at the end. return *(uint32_t*)a - *(uint32_t*)b; } -static void upb_decoder_jit_msg(upb_decoder *d, upb_handlers_msgent *m) { +static void upb_decoder_jit_msg(upb_decoder *d, upb_msgent *m) { |=>m->jit_startmsg_pclabel: // Call startmsg handler (if any): if (m->startmsg != upb_startmsg_nop) { @@ -466,32 +467,24 @@ static void upb_decoder_jit_msg(upb_decoder *d, upb_handlers_msgent *m) { } qsort(keys, num_keys, sizeof(uint32_t), &upb_compare_uint32); - - upb_handlers_fieldent *last_f = NULL; + upb_fieldent *last_f = NULL; uint32_t last_tag = 0; for(int i = 0; i < num_keys; i++) { uint32_t key = keys[i]; - upb_handlers_fieldent *f = upb_inttable_lookup(&m->fieldtab, key); - uint32_t tag = upb_vencode(key); + upb_fieldent *f = upb_inttable_lookup(&m->fieldtab, key); + uint32_t tag = upb_vencode32(key); if (last_f) upb_decoder_jit_field(d, last_tag, tag, m, last_f, f); last_tag = tag; last_f = f; } + upb_decoder_jit_field(d, last_tag, 0, m, last_f, NULL); free(keys); - if (m->endgroup_f) { - uint32_t tag = m->endgroup_f->number << 3 | UPB_WIRE_TYPE_END_GROUP; - upb_decoder_jit_field(d, last_tag, tag, m, last_f, m->endgroup_f); - upb_decoder_jit_field(d, tag, 0, m, m->endgroup_f, NULL); - } else { - upb_decoder_jit_field(d, last_tag, 0, m, last_f, NULL); - } - // --------- New code section (does not fall through) ------------------------ // End-of-buf / end-of-message. - if (!m->endgroup_f) { + if (!m->is_group) { // This case doesn't exist for groups, because there eob really means // eob, so that case just exits the jit directly. |=>m->jit_endofbuf_pclabel: @@ -560,16 +553,14 @@ static void upb_decoder_jit(upb_decoder *d) { | callp abort } -void upb_decoder_jit_assignfieldlabs(upb_handlers_fieldent *f, +void upb_decoder_jit_assignfieldlabs(upb_fieldent *f, uint32_t *pclabel_count) { f->jit_pclabel = (*pclabel_count)++; f->jit_pclabel_notypecheck = (*pclabel_count)++; f->jit_submsg_done_pclabel = (*pclabel_count)++; } -void upb_decoder_jit_assignmsglabs(upb_handlers *h, - upb_handlers_msgent *m, - uint32_t *pclabel_count) { +void upb_decoder_jit_assignmsglabs(upb_msgent *m, uint32_t *pclabel_count) { m->jit_startmsg_pclabel = (*pclabel_count)++; m->jit_endofbuf_pclabel = (*pclabel_count)++; m->jit_endofmsg_pclabel = (*pclabel_count)++; @@ -581,30 +572,22 @@ void upb_decoder_jit_assignmsglabs(upb_handlers *h, i = upb_inttable_next(&m->fieldtab, i)) { uint32_t key = upb_inttable_iter_key(i); m->max_field_number = UPB_MAX(m->max_field_number, key); - upb_handlers_fieldent *f = upb_inttable_iter_value(i); + upb_fieldent *f = upb_inttable_iter_value(i); upb_decoder_jit_assignfieldlabs(f, pclabel_count); - if (f->type == UPB_TYPE(GROUP)) { - upb_handlers_msgent *sub_m = upb_handlers_getmsgent(h, f); - sub_m->endgroup_f = malloc(sizeof(*sub_m->endgroup_f)); - memcpy(sub_m->endgroup_f, f, sizeof(*f)); - sub_m->endgroup_f->type = UPB_TYPE_ENDGROUP; - upb_decoder_jit_assignfieldlabs(sub_m->endgroup_f, pclabel_count); - } } // XXX: Won't work for large field numbers; will need to use a upb_table. - // +2 to cover group case, in case group number is larger than all tags. - m->tablearray = malloc((m->max_field_number + 2) * sizeof(void*)); + m->tablearray = malloc((m->max_field_number + 1) * sizeof(void*)); } // Second pass: for messages that have only one parent, link them to the field // from which they are called. -void upb_decoder_jit_assignmsglabs2(upb_handlers *h, upb_handlers_msgent *m) { +void upb_decoder_jit_assignmsglabs2(upb_handlers *h, upb_msgent *m) { upb_inttable_iter i; for(i = upb_inttable_begin(&m->fieldtab); !upb_inttable_done(i); i = upb_inttable_next(&m->fieldtab, i)) { - upb_handlers_fieldent *f = upb_inttable_iter_value(i); + upb_fieldent *f = upb_inttable_iter_value(i); if (upb_issubmsgtype(f->type)) { - upb_handlers_msgent *sub_m = upb_handlers_getmsgent(h, f); + upb_msgent *sub_m = upb_handlers_getmsgent(h, f); if (sub_m->jit_parent_field_done_pclabel == UPB_NONE) { sub_m->jit_parent_field_done_pclabel = f->jit_submsg_done_pclabel; } else { @@ -621,7 +604,7 @@ void upb_decoder_makejit(upb_decoder *d) { uint32_t pclabel_count = 1; upb_handlers *h = d->dispatcher.handlers; for (int i = 0; i < h->msgs_len; i++) - upb_decoder_jit_assignmsglabs(h, &h->msgs[i], &pclabel_count); + upb_decoder_jit_assignmsglabs(&h->msgs[i], &pclabel_count); for (int i = 0; i < h->msgs_len; i++) upb_decoder_jit_assignmsglabs2(h, &h->msgs[i]); @@ -648,9 +631,9 @@ void upb_decoder_makejit(upb_decoder *d) { // Create dispatch tables. for (int i = 0; i < h->msgs_len; i++) { - upb_handlers_msgent *m = &h->msgs[i]; + upb_msgent *m = &h->msgs[i]; for (uint32_t j = 0; j <= m->max_field_number; j++) { - upb_handlers_fieldent *f = NULL; + upb_fieldent *f = NULL; for (int k = 0; k < 8; k++) { f = upb_inttable_lookup(&m->fieldtab, (j << 3) | k); if (f) break; @@ -662,9 +645,6 @@ void upb_decoder_makejit(upb_decoder *d) { m->tablearray[j] = d->jit_code + dasm_getpclabel(d, 0); } } - if (m->endgroup_f) { - m->tablearray[m->endgroup_f->number] = d->jit_code + dasm_getpclabel(d, m->endgroup_f->jit_pclabel); - } } dasm_free(d); |