Skip to content

Commit

Permalink
noun: align u3n_prog to 8 byte boundaries
Browse files Browse the repository at this point in the history
  • Loading branch information
pkova committed Oct 2, 2024
1 parent 9bb2189 commit 6cafe5f
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 14 deletions.
1 change: 1 addition & 0 deletions build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -701,6 +701,7 @@ fn build_single(
"vortex_v2.c",
"hashtable_v3.c",
"manage_v3.c",
"manage_v4.c",
"vortex.c",
"xtract.c",
"zave.c",
Expand Down
4 changes: 3 additions & 1 deletion pkg/noun/manage.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "manage.h"
#include "manage_v2.h"
#include "manage_v3.h"
#include "manage_v4.h"

#include <ctype.h>
#include <dlfcn.h>
Expand Down Expand Up @@ -613,7 +614,8 @@ _find_home(void)
switch ( ver_w ) {
case U3V_VER1: u3m_v2_migrate();
case U3V_VER2: u3m_v3_migrate();
case U3V_VER3: {
case U3V_VER3: u3m_v4_migrate();
case U3V_VER4: {
mig_o = c3n;
break;
}
Expand Down
30 changes: 30 additions & 0 deletions pkg/noun/manage_v4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/// @file

#include "manage_v4.h"
#include "stdio.h"
#include "manage.h"
#include "allocate.h"
#include "vortex.h"
#include "options.h"

/* u3m_v4_migrate: perform loom migration if necessary.
*/
void
u3m_v4_migrate(void)
{
fprintf(stderr, "loom: bytecode alignment migration running...\r\n");

c3_w* mem_w = u3_Loom + u3a_walign;
c3_w siz_w = c3_wiseof(u3v_home);
c3_w len_w = u3C.wor_i - u3a_walign;
c3_w* mat_w = c3_align(mem_w + len_w - siz_w, u3a_balign, C3_ALGLO);

u3H = (void *)mat_w;
u3R = &u3H->rod_u;

u3m_reclaim();

u3H->ver_w = U3V_VER4;

fprintf(stderr, "loom: bytecode alignment migration done\r\n");
}
13 changes: 13 additions & 0 deletions pkg/noun/manage_v4.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/// @file

#ifndef U3_MANAGE_V4_H
#define U3_MANAGE_V4_H

/** System management.
**/
/* u3m_v3_migrate: perform memoization loom migration if necessary.
*/
void
u3m_v4_migrate(void);

#endif /* ifndef U3_MANAGE_V3_H */
35 changes: 23 additions & 12 deletions pkg/noun/nock.c
Original file line number Diff line number Diff line change
Expand Up @@ -706,21 +706,25 @@ _n_prog_new(c3_w byc_w, c3_w cal_w,
reb_w = (sizeof(u3j_rite) * reg_w),
lib_w = (sizeof(u3_noun) * lit_w),
meb_w = (sizeof(u3n_memo) * mem_w),
dat_w = byc_w + cab_w + reb_w + lib_w + meb_w;
pad_w = (8 - byc_w % 8) % 8,
pod_w = lit_w % 2,
ped_w = mem_w % 2,
dat_w = byc_w + cab_w + reb_w + lib_w + meb_w + pad_w +
(pod_w * sizeof(u3_noun)) + (ped_w * sizeof(u3n_memo));

u3n_prog* pog_u = u3a_malloc(sizeof(u3n_prog) + dat_w);
pog_u->byc_u.own_o = c3y;
pog_u->byc_u.len_w = byc_w;
pog_u->byc_u.ops_y = (c3_y*) _n_prog_dat(pog_u);

pog_u->lit_u.len_w = lit_w;
pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w);
pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w + pad_w);

pog_u->mem_u.len_w = mem_w;
pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w);
pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w + pod_w);

pog_u->cal_u.len_w = cal_w;
pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w);
pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w + ped_w);

pog_u->reg_u.len_w = reg_w;
pog_u->reg_u.rit_u = (u3j_rite*) (pog_u->cal_u.sit_u + pog_u->cal_u.len_w);
Expand All @@ -738,7 +742,10 @@ _n_prog_old(u3n_prog* sep_u)
reb_w = sizeof(u3j_rite) * sep_u->reg_u.len_w,
lib_w = sizeof(u3_noun) * sep_u->lit_u.len_w,
meb_w = sizeof(u3n_memo) * sep_u->mem_u.len_w,
dat_w = cab_w + reb_w + lib_w + meb_w;
pod_w = sep_u->lit_u.len_w % 2,
ped_w = sep_u->mem_u.len_w % 2,
dat_w = cab_w + reb_w + lib_w + meb_w +
(pod_w * sizeof(u3_noun)) + (ped_w * sizeof(u3n_memo));

u3n_prog* pog_u = u3a_malloc(sizeof(u3n_prog) + dat_w);
pog_u->byc_u.own_o = c3n;
Expand All @@ -749,10 +756,10 @@ _n_prog_old(u3n_prog* sep_u)
pog_u->lit_u.non = (u3_noun*) _n_prog_dat(pog_u);

pog_u->mem_u.len_w = sep_u->mem_u.len_w;
pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w);
pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w + pod_w);

pog_u->cal_u.len_w = sep_u->cal_u.len_w;
pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w);
pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w + ped_w);

pog_u->reg_u.len_w = sep_u->reg_u.len_w;
pog_u->reg_u.rit_u = (u3j_rite*) (pog_u->cal_u.sit_u + pog_u->cal_u.len_w);
Expand Down Expand Up @@ -2036,7 +2043,7 @@ _n_kale(u3_noun a)
return a;
}

typedef struct {
typedef struct __attribute__((__packed__)) {
u3n_prog* pog_u;
c3_w ip_w;
} burnframe;
Expand Down Expand Up @@ -2888,12 +2895,13 @@ _cn_take_prog_cb(u3p(u3n_prog) pog_p)
u3n_prog* gop_u;

if ( c3y == pog_u->byc_u.own_o ) {
c3_w pad_w = (8 - pog_u->byc_u.len_w % 8) % 8;
gop_u = _n_prog_new(pog_u->byc_u.len_w,
pog_u->cal_u.len_w,
pog_u->reg_u.len_w,
pog_u->lit_u.len_w,
pog_u->mem_u.len_w);
memcpy(gop_u->byc_u.ops_y, pog_u->byc_u.ops_y, pog_u->byc_u.len_w);
memcpy(gop_u->byc_u.ops_y, pog_u->byc_u.ops_y, pog_u->byc_u.len_w + pad_w);
}
else {
gop_u = _n_prog_old(pog_u);
Expand Down Expand Up @@ -2988,11 +2996,14 @@ _n_ream(u3_noun kev)
c3_w i_w;
u3n_prog* pog_u = u3to(u3n_prog, u3t(kev));

c3_w pad_w = (8 - pog_u->byc_u.len_w % 8) % 8;
c3_w pod_w = pog_u->lit_u.len_w % 2;
c3_w ped_w = pog_u->mem_u.len_w % 2;
// fix up pointers for loom portability
pog_u->byc_u.ops_y = (c3_y*) _n_prog_dat(pog_u);
pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w);
pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w);
pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w);
pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w + pad_w);
pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w + pod_w);
pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w + ped_w);
pog_u->reg_u.rit_u = (u3j_rite*) (pog_u->cal_u.sit_u + pog_u->cal_u.len_w);

for ( i_w = 0; i_w < pog_u->cal_u.len_w; ++i_w ) {
Expand Down
3 changes: 2 additions & 1 deletion pkg/noun/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ typedef c3_w u3v_version;
#define U3V_VER1 1
#define U3V_VER2 2
#define U3V_VER3 3
#define U3V_VERLAT U3V_VER3
#define U3V_VER4 4
#define U3V_VERLAT U3V_VER4

/* PATCHES
*/
Expand Down

0 comments on commit 6cafe5f

Please sign in to comment.