2025-12-08 21:30:21 +09:00
|
|
|
|
// tiny_route_env_box.h - Route snapshot for Tiny front (Heap vs Legacy)
|
|
|
|
|
|
// 役割:
|
|
|
|
|
|
// - 起動時に「各クラスが TinyHeap を使うか」をスナップショットし、ホットパスでは LUT 1 回に縮約する。
|
|
|
|
|
|
// - HAKMEM_TINY_HEAP_PROFILE / HAKMEM_TINY_HEAP_BOX / HAKMEM_TINY_HEAP_CLASSES の組合せをここで解決する。
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include "../hakmem_tiny_config.h"
|
|
|
|
|
|
#include "tiny_heap_env_box.h"
|
|
|
|
|
|
|
2025-12-09 21:50:15 +09:00
|
|
|
|
#include "smallobject_hotbox_v3_env_box.h"
|
2025-12-10 17:58:42 +09:00
|
|
|
|
#include "smallobject_hotbox_v4_env_box.h"
|
2025-12-09 21:50:15 +09:00
|
|
|
|
|
2025-12-08 21:30:21 +09:00
|
|
|
|
typedef enum {
|
|
|
|
|
|
TINY_ROUTE_LEGACY = 0,
|
2025-12-09 21:50:15 +09:00
|
|
|
|
TINY_ROUTE_HEAP = 1, // TinyHeap v1
|
|
|
|
|
|
TINY_ROUTE_HOTHEAP_V2 = 2, // TinyHotHeap v2
|
|
|
|
|
|
TINY_ROUTE_SMALL_HEAP_V3 = 3, // SmallObject HotHeap v3 (C7-first,研究箱)
|
2025-12-10 17:58:42 +09:00
|
|
|
|
TINY_ROUTE_SMALL_HEAP_V4 = 4, // SmallObject HotHeap v4 (stub, route未使用)
|
2025-12-08 21:30:21 +09:00
|
|
|
|
} tiny_route_kind_t;
|
|
|
|
|
|
|
|
|
|
|
|
extern tiny_route_kind_t g_tiny_route_class[TINY_NUM_CLASSES];
|
|
|
|
|
|
extern int g_tiny_route_snapshot_done;
|
|
|
|
|
|
|
|
|
|
|
|
static inline void tiny_route_snapshot_init(void) {
|
|
|
|
|
|
for (int i = 0; i < TINY_NUM_CLASSES; i++) {
|
2025-12-10 17:58:42 +09:00
|
|
|
|
if (small_heap_v4_class_enabled((uint8_t)i)) {
|
|
|
|
|
|
g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V4;
|
|
|
|
|
|
} else if (small_heap_v3_class_enabled((uint8_t)i)) {
|
2025-12-09 21:50:15 +09:00
|
|
|
|
g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V3;
|
|
|
|
|
|
} else if (tiny_hotheap_v2_class_enabled((uint8_t)i)) {
|
2025-12-08 21:30:21 +09:00
|
|
|
|
g_tiny_route_class[i] = TINY_ROUTE_HOTHEAP_V2;
|
|
|
|
|
|
} else if (tiny_heap_box_enabled() && tiny_heap_class_route_enabled(i)) {
|
|
|
|
|
|
g_tiny_route_class[i] = TINY_ROUTE_HEAP;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
g_tiny_route_class[i] = TINY_ROUTE_LEGACY;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
g_tiny_route_snapshot_done = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static inline tiny_route_kind_t tiny_route_for_class(uint8_t ci) {
|
|
|
|
|
|
if (__builtin_expect(!g_tiny_route_snapshot_done, 0)) {
|
|
|
|
|
|
tiny_route_snapshot_init();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (__builtin_expect(ci >= TINY_NUM_CLASSES, 0)) {
|
|
|
|
|
|
return TINY_ROUTE_LEGACY;
|
|
|
|
|
|
}
|
|
|
|
|
|
return g_tiny_route_class[ci];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static inline int tiny_route_is_heap_kind(tiny_route_kind_t route) {
|
2025-12-10 17:58:42 +09:00
|
|
|
|
return route == TINY_ROUTE_HEAP ||
|
|
|
|
|
|
route == TINY_ROUTE_HOTHEAP_V2 ||
|
|
|
|
|
|
route == TINY_ROUTE_SMALL_HEAP_V3 ||
|
|
|
|
|
|
route == TINY_ROUTE_SMALL_HEAP_V4;
|
2025-12-08 21:30:21 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// C7 front が TinyHeap を使うか(Route snapshot 経由で判定)
|
|
|
|
|
|
static inline int tiny_c7_front_uses_heap(void) {
|
|
|
|
|
|
return tiny_route_is_heap_kind(tiny_route_for_class(7));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// C6 front が TinyHeap を使うか(Route snapshot 経由で判定)
|
|
|
|
|
|
static inline int tiny_c6_front_uses_heap(void) {
|
|
|
|
|
|
return tiny_route_is_heap_kind(tiny_route_for_class(6));
|
|
|
|
|
|
}
|