Skip to content

Commit c2c5325

Browse files
committed
Use 64-bit register values
1 parent 1f0f9f2 commit c2c5325

File tree

4 files changed

+73
-146
lines changed

4 files changed

+73
-146
lines changed

helpers.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
#include <stdint.h>
55

6-
#define MEM_F64(a) (double_from_memory(mem, a))
7-
#define MEM_F32(a) (*(float *)(mem + a))
8-
#define MEM_U32(a) (*(uint32_t *)(mem + a))
9-
#define MEM_S32(a) (*(int32_t *)(mem + a))
10-
#define MEM_U16(a) (*(uint16_t *)(mem + ((a) ^ 2)))
11-
#define MEM_S16(a) (*(int16_t *)(mem + ((a) ^ 2)))
12-
#define MEM_U8(a) (*(uint8_t *)(mem + ((a) ^ 3)))
13-
#define MEM_S8(a) (*(int8_t *)(mem + ((a) ^ 3)))
6+
#define MEM_F64(a) (double_from_memory(mem, (uint32_t)(a)))
7+
#define MEM_F32(a) (*(float *)(mem + (uint32_t)(a)))
8+
#define MEM_U32(a) (*(uint32_t *)(mem + (uint32_t)(a)))
9+
#define MEM_S32(a) (*(int32_t *)(mem + (uint32_t)(a)))
10+
#define MEM_U16(a) (*(uint16_t *)(mem + ((uint32_t)(a) ^ 2)))
11+
#define MEM_S16(a) (*(int16_t *)(mem + ((uint32_t)(a) ^ 2)))
12+
#define MEM_U8(a) (*(uint8_t *)(mem + ((uint32_t)(a) ^ 3)))
13+
#define MEM_S8(a) (*(int8_t *)(mem + ((uint32_t)(a) ^ 3)))
1414

1515
#if !defined(__GNUC__) && !defined(__clang__)
1616
#define __attribute__(x)

libc_impl.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2814,7 +2814,7 @@ uint32_t wrapper_tfind(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uin
28142814
// qsort implementation from SGI libc, originally derived from
28152815
// https://people.ece.ubc.ca/~eddieh/glu_dox/d7/da4/qsort_8c_source.html (public domain)
28162816

2817-
#define CMP(x, y) (int32_t)(trampoline(mem, sp, (x), (y), 0, 0, compare_addr) >> 32)
2817+
#define CMP(x, y) ((int32_t)(trampoline(mem, sp, (x), (y), 0, 0, compare_addr).v0))
28182818

28192819
static void qst(uint8_t* mem, uint32_t start, uint32_t end, fptr_trampoline trampoline, uint32_t compare_addr,
28202820
uint32_t sp, uint32_t size, uint32_t minSortSize, uint32_t medianOfThreeThreshold);

libc_impl.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ union FloatReg {
99
//double d;
1010
};
1111

12-
typedef uint64_t (*fptr_trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3,
13-
uint32_t fp_dest);
12+
struct ReturnValue {
13+
uint64_t v0;
14+
uint64_t v1;
15+
};
1416

17+
typedef struct ReturnValue (*fptr_trampoline)(uint8_t* mem, uint32_t sp, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3,
18+
uint32_t fp_dest);
1519

1620
void mmap_initial_data_range(uint8_t *mem, uint32_t start, uint32_t end);
1721
void setup_libc_data(uint8_t *mem);

0 commit comments

Comments
 (0)