summaryrefslogtreecommitdiff
path: root/src/upb_decoder_x86.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/upb_decoder_x86.dasc')
-rw-r--r--src/upb_decoder_x86.dasc64
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);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback