diff options
author | Björn-Egil Dahlberg <[email protected]> | 2015-12-09 10:23:20 +0100 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2015-12-09 10:23:20 +0100 |
commit | 7fb587a24b340dd94378a06bd12282a966f7ae24 (patch) | |
tree | 6bc407f960fe612afabc87fb086627d0bbb6a354 /erts/emulator/beam/beam_load.c | |
parent | ebfca92e52ca3c857bf3873639b274c9ef851160 (diff) | |
parent | c97f3332aeddf039ee2207196229b9ff07047c72 (diff) | |
download | otp-7fb587a24b340dd94378a06bd12282a966f7ae24.tar.gz otp-7fb587a24b340dd94378a06bd12282a966f7ae24.tar.bz2 otp-7fb587a24b340dd94378a06bd12282a966f7ae24.zip |
Merge branch 'egil/pd-opt-get/OTP-13167'
* egil/pd-opt-get/OTP-13167:
erts: Add i_get_hash instruction
erts: Use internal hash for process dictionaries
Diffstat (limited to 'erts/emulator/beam/beam_load.c')
-rw-r--r-- | erts/emulator/beam/beam_load.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index 5db971b6af..d367cce212 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -4284,6 +4284,53 @@ gen_get_map_element(LoaderState* stp, GenOpArg Fail, GenOpArg Src, return op; } +static int +hash_internal_genop_arg(LoaderState* stp, GenOpArg Key, Uint32* hx) +{ + switch (Key.type) { + case TAG_a: + *hx = atom_tab(atom_val(Key.val))->slot.bucket.hvalue; + return 1; + case TAG_i: + *hx = Key.val; + return 1; + case TAG_n: + *hx = make_internal_hash(NIL); + return 1; + case TAG_q: + *hx = make_internal_hash(stp->literals[Key.val].term); + return 1; + default: + return 0; + } +} + + +static GenOp* +gen_get(LoaderState* stp, GenOpArg Src, GenOpArg Dst) +{ + GenOp* op; + Uint32 hx = 0; + + NEW_GENOP(stp, op); + op->next = NULL; + if (hash_internal_genop_arg(stp, Src, &hx)) { + op->arity = 3; + op->op = genop_i_get_hash_3; + op->a[0] = Src; + op->a[1].type = TAG_u; + op->a[1].val = (BeamInstr) hx; + op->a[2] = Dst; + } else { + op->arity = 2; + op->op = genop_i_get_2; + op->a[0] = Src; + op->a[1] = Dst; + } + return op; +} + + static GenOp* gen_get_map_elements(LoaderState* stp, GenOpArg Fail, GenOpArg Src, GenOpArg Size, GenOpArg* Rest) |