Skip to content

Commit bd52e46

Browse files
author
Dwight Guth
authored
Add missing hash and equality cases for mint (#1137)
We now support hash and equality for MINTS of size 32, 64, 160, and 256. We may add more later.
1 parent 656bde0 commit bd52e46

File tree

6 files changed

+2748
-0
lines changed

6 files changed

+2748
-0
lines changed

runtime/collections/hash.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ __attribute__((always_inline)) void add_hash8(void *h, uint8_t data) {
1919
hash_length++;
2020
}
2121

22+
__attribute__((always_inline)) void add_hash32(void *h, uint32_t data) {
23+
auto *buf = (uint8_t *)&data;
24+
add_hash8(h, buf[0]);
25+
add_hash8(h, buf[1]);
26+
add_hash8(h, buf[2]);
27+
add_hash8(h, buf[3]);
28+
}
29+
2230
__attribute__((always_inline)) void add_hash64(void *h, uint64_t data) {
2331
auto *buf = (uint8_t *)&data;
2432
add_hash8(h, buf[0]);
@@ -116,6 +124,31 @@ void k_hash(block *arg, void *h) {
116124
k_hash(*childptrptr, h);
117125
break;
118126
}
127+
case MINT_LAYOUT + 32: {
128+
auto *intptr = (uint32_t *)(argintptr + offset);
129+
add_hash32(h, *intptr);
130+
break;
131+
}
132+
case MINT_LAYOUT + 64: {
133+
auto *intptr = (uint64_t *)(argintptr + offset);
134+
add_hash64(h, *intptr);
135+
break;
136+
}
137+
case MINT_LAYOUT + 160: {
138+
auto *intptr = (uint64_t *)(argintptr + offset);
139+
add_hash64(h, intptr[0]);
140+
add_hash64(h, intptr[1]);
141+
add_hash64(h, intptr[2] & UINT32_MAX);
142+
break;
143+
}
144+
case MINT_LAYOUT + 256: {
145+
auto *intptr = (uint64_t *)(argintptr + offset);
146+
add_hash64(h, intptr[0]);
147+
add_hash64(h, intptr[1]);
148+
add_hash64(h, intptr[2]);
149+
add_hash64(h, intptr[3]);
150+
break;
151+
}
119152
default: abort();
120153
}
121154
}

runtime/collections/kelemle.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,28 @@ bool hook_KEQUAL_eq(block *arg1, block *arg2) {
143143
}
144144
break;
145145
}
146+
case MINT_LAYOUT + 160: {
147+
auto *child1ptr = (int64_t *)(child1intptr);
148+
auto *child2ptr = (int64_t *)(child2intptr);
149+
bool cmp
150+
= child1ptr[0] == child2ptr[0] && child1ptr[1] == child2ptr[1]
151+
&& (child1ptr[2] & UINT32_MAX) == (child2ptr[2] & UINT32_MAX);
152+
if (!cmp) {
153+
return false;
154+
}
155+
break;
156+
}
157+
case MINT_LAYOUT + 256: {
158+
auto *child1ptr = (int64_t *)(child1intptr);
159+
auto *child2ptr = (int64_t *)(child2intptr);
160+
bool cmp
161+
= child1ptr[0] == child2ptr[0] && child1ptr[1] == child2ptr[1]
162+
&& child1ptr[2] == child2ptr[2] && child1ptr[3] == child2ptr[3];
163+
if (!cmp) {
164+
return false;
165+
}
166+
break;
167+
}
146168

147169
default: abort();
148170
}

0 commit comments

Comments
 (0)