authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-15 18:33:31+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-26 22:00:09+02:00
log5cb45b68557e32724cb6a10ead8123a588c5000f
tree749741a1630707297c86a128e14f63e571f18b09
parent6a364b4a5e71b971b753d2b62c7708ae1e76d707
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

wasm2c: Add big endian support.

I took a slightly unconventional approach to detecting endianness here. We have no compiler/platform-specific preprocessor checks in the stage1 C code today, and I think that's a property worth maintaining.

2 files changed, 86 insertions(+), 60 deletions(-)

stage1/wasi.c+65-41
...@@ -184,6 +184,26 @@ enum wasi_whence {...@@ -184,6 +184,26 @@ enum wasi_whence {
184 wasi_whence_end = 2,184 wasi_whence_end = 2,
185};185};
186186
187extern uint16_t load16_align0(const uint8_t *ptr);
188extern uint16_t load16_align1(const uint16_t *ptr);
189extern uint32_t load32_align0(const uint8_t *ptr);
190extern uint32_t load32_align1(const uint16_t *ptr);
191extern uint32_t load32_align2(const uint32_t *ptr);
192extern uint64_t load64_align0(const uint8_t *ptr);
193extern uint64_t load64_align1(const uint16_t *ptr);
194extern uint64_t load64_align2(const uint32_t *ptr);
195extern uint64_t load64_align3(const uint64_t *ptr);
196
197extern void store16_align0(uint8_t *ptr, uint16_t val);
198extern void store16_align1(uint16_t *ptr, uint16_t val);
199extern void store32_align0(uint8_t *ptr, uint32_t val);
200extern void store32_align1(uint16_t *ptr, uint32_t val);
201extern void store32_align2(uint32_t *ptr, uint32_t val);
202extern void store64_align0(uint8_t *ptr, uint64_t val);
203extern void store64_align1(uint16_t *ptr, uint64_t val);
204extern void store64_align2(uint32_t *ptr, uint64_t val);
205extern void store64_align3(uint64_t *ptr, uint64_t val);
206
187extern uint8_t **const wasm_memory;207extern uint8_t **const wasm_memory;
188extern void wasm__start(void);208extern void wasm__start(void);
189209
...@@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch...@@ -362,14 +382,14 @@ static enum wasi_errno DirEntry_lookup(uint32_t dir_fd, uint32_t flags, const ch
362}382}
363383
364static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) {384static void DirEntry_filestat(uint32_t de, struct wasi_filestat *res_filestat) {
365 res_filestat->dev = 0;385 store64_align3(&res_filestat->dev, 0);
366 res_filestat->ino = de;386 store64_align3(&res_filestat->ino, de);
367 res_filestat->filetype = des[de].filetype;387 store64_align3(&res_filestat->filetype, des[de].filetype);
368 res_filestat->nlink = 1;388 store64_align3(&res_filestat->nlink, 1);
369 res_filestat->size = 0;389 store64_align3(&res_filestat->size, 0);
370 res_filestat->atim = des[de].atim * UINT64_C(1000000000);390 store64_align3(&res_filestat->atim, des[de].atim * UINT64_C(1000000000));
371 res_filestat->mtim = des[de].mtim * UINT64_C(1000000000);391 store64_align3(&res_filestat->mtim, des[de].mtim * UINT64_C(1000000000));
372 res_filestat->ctim = des[de].ctim * UINT64_C(1000000000);392 store64_align3(&res_filestat->ctim, des[de].ctim * UINT64_C(1000000000));
373}393}
374394
375static void DirEntry_unlink(uint32_t de) {395static void DirEntry_unlink(uint32_t de) {
...@@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv...@@ -394,8 +414,8 @@ uint32_t wasi_snapshot_preview1_args_sizes_get(uint32_t argv_size, uint32_t argv
394 if (i == 1) continue;414 if (i == 1) continue;
395 size += strlen(c_argv[i]) + 1;415 size += strlen(c_argv[i]) + 1;
396 }416 }
397 *argv_size_ptr = c_argc - 1;417 store32_align2(argv_size_ptr, c_argc - 1);
398 *argv_buf_size_ptr = size;418 store32_align2(argv_buf_size_ptr, size);
399 return wasi_errno_success;419 return wasi_errno_success;
400}420}
401421
...@@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) {...@@ -413,7 +433,7 @@ uint32_t wasi_snapshot_preview1_args_get(uint32_t argv, uint32_t argv_buf) {
413 uint32_t argv_buf_i = 0;433 uint32_t argv_buf_i = 0;
414 for (int src_i = 0; src_i < c_argc; src_i += 1) {434 for (int src_i = 0; src_i < c_argc; src_i += 1) {
415 if (src_i == 1) continue;435 if (src_i == 1) continue;
416 argv_ptr[dst_i] = argv_buf + argv_buf_i;436 store32_align2(&argv_ptr[dst_i], argv_buf + argv_buf_i);
417 dst_i += 1;437 dst_i += 1;
418 strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]);438 strcpy(&argv_buf_ptr[argv_buf_i], c_argv[src_i]);
419 argv_buf_i += strlen(c_argv[src_i]) + 1;439 argv_buf_i += strlen(c_argv[src_i]) + 1;
...@@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat...@@ -430,8 +450,8 @@ uint32_t wasi_snapshot_preview1_fd_prestat_get(uint32_t fd, uint32_t res_prestat
430450
431 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;451 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
432452
433 res_prestat_ptr[0] = 0;453 store32_align2(&res_prestat_ptr[0], 0);
434 res_prestat_ptr[1] = strlen(des[fds[fd].de].guest_path);454 store32_align2(&res_prestat_ptr[1], strlen(des[fds[fd].de].guest_path));
435 return wasi_errno_success;455 return wasi_errno_success;
436}456}
437457
...@@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path,...@@ -443,7 +463,7 @@ uint32_t wasi_snapshot_preview1_fd_prestat_dir_name(uint32_t fd, uint32_t path,
443#endif463#endif
444464
445 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;465 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
446 strncpy(path_ptr, des[fds[fd].de].guest_path, path_len);466 strncpy(path_ptr, des[fds[fd].de].guest_path, path_len);
447 return wasi_errno_success;467 return wasi_errno_success;
448}468}
449469
...@@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov...@@ -502,15 +522,16 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov
502522
503 size_t size = 0;523 size_t size = 0;
504 for (uint32_t i = 0; i < iovs_len; i += 1) {524 for (uint32_t i = 0; i < iovs_len; i += 1) {
525 uint32_t len = load32_align2(&iovs_ptr[i].len);
505 size_t read_size = 0;526 size_t read_size = 0;
506 if (fds[fd].stream != NULL)527 if (fds[fd].stream != NULL)
507 read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);528 read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
508 size += read_size;529 size += read_size;
509 if (read_size < iovs_ptr[i].len) break;530 if (read_size < len) break;
510 }531 }
511532
512 if (size > 0) des[fds[fd].de].atim = time(NULL);533 if (size > 0) des[fds[fd].de].atim = time(NULL);
513 *res_size_ptr = size;534 store32_align2(res_size_ptr, size);
514 return wasi_errno_success;535 return wasi_errno_success;
515}536}
516537
...@@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest...@@ -530,7 +551,7 @@ uint32_t wasi_snapshot_preview1_fd_filestat_get(uint32_t fd, uint32_t res_filest
530 if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io;551 if (fseek(fds[fd].stream, 0, SEEK_END) < 0) return wasi_errno_io;
531 long size = ftell(fds[fd].stream);552 long size = ftell(fds[fd].stream);
532 if (size < 0) return wasi_errno_io;553 if (size < 0) return wasi_errno_io;
533 res_filestat_ptr->size = size;554 store64_align3(&res_filestat_ptr->size, size);
534 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;555 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
535 return wasi_errno_success;556 return wasi_errno_success;
536}557}
...@@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i...@@ -617,13 +638,14 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i
617638
618 size_t size = 0;639 size_t size = 0;
619 for (uint32_t i = 0; i < iovs_len; i += 1) {640 for (uint32_t i = 0; i < iovs_len; i += 1) {
641 uint32_t len = load32_align2(&iovs_ptr[i].len);
620 size_t written_size = 0;642 size_t written_size = 0;
621 if (fds[fd].stream != NULL)643 if (fds[fd].stream != NULL)
622 written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);644 written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
623 else645 else
624 written_size = iovs_ptr[i].len;646 written_size = len;
625 size += written_size;647 size += written_size;
626 if (written_size < iovs_ptr[i].len) break;648 if (written_size < len) break;
627 }649 }
628650
629 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;651 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
...@@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i...@@ -633,7 +655,7 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i
633 des[fds[fd].de].atim = now;655 des[fds[fd].de].atim = now;
634 des[fds[fd].de].mtim = now;656 des[fds[fd].de].mtim = now;
635 }657 }
636 *res_size_ptr = size;658 store32_align2(res_size_ptr, size);
637 return wasi_errno_success;659 return wasi_errno_success;
638}660}
639661
...@@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_...@@ -669,8 +691,8 @@ uint32_t wasi_snapshot_preview1_environ_sizes_get(uint32_t environ_size, uint32_
669 fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n");691 fprintf(stderr, "wasi_snapshot_preview1_environ_sizes_get()\n");
670#endif692#endif
671693
672 *environ_size_ptr = 0;694 store32_align2(environ_size_ptr, 0);
673 *environ_buf_size_ptr = 0;695 store32_align2(environ_buf_size_ptr, 0);
674 return wasi_errno_success;696 return wasi_errno_success;
675}697}
676698
...@@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u...@@ -702,7 +724,7 @@ uint32_t wasi_snapshot_preview1_path_filestat_get(uint32_t fd, uint32_t flags, u
702 if (stream != NULL) {724 if (stream != NULL) {
703 if (fseek(stream, 0, SEEK_END) >= 0) {725 if (fseek(stream, 0, SEEK_END) >= 0) {
704 long size = ftell(stream);726 long size = ftell(stream);
705 if (size >= 0) res_filestat_ptr->size = size;727 if (size >= 0) store64_align3(&res_filestat_ptr->size, size);
706 }728 }
707 fclose(stream);729 fclose(stream);
708 }730 }
...@@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat)...@@ -718,10 +740,10 @@ uint32_t wasi_snapshot_preview1_fd_fdstat_get(uint32_t fd, uint32_t res_fdstat)
718#endif740#endif
719741
720 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;742 if (fd >= fd_len || fds[fd].de >= de_len) return wasi_errno_badf;
721 res_fdstat_ptr->fs_filetype = des[fds[fd].de].filetype;743 store16_align1(&res_fdstat_ptr->fs_filetype, des[fds[fd].de].filetype);
722 res_fdstat_ptr->fs_flags = fds[fd].fdflags;744 store16_align1(&res_fdstat_ptr->fs_flags, fds[fd].fdflags);
723 res_fdstat_ptr->padding = 0;745 store32_align2(&res_fdstat_ptr->padding, 0);
724 res_fdstat_ptr->fs_rights_inheriting = fds[fd].fs_rights_inheriting;746 store64_align3(&res_fdstat_ptr->fs_rights_inheriting, fds[fd].fs_rights_inheriting);
725 return wasi_errno_success;747 return wasi_errno_success;
726}748}
727749
...@@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io...@@ -757,13 +779,14 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io
757779
758 size_t size = 0;780 size_t size = 0;
759 for (uint32_t i = 0; i < iovs_len; i += 1) {781 for (uint32_t i = 0; i < iovs_len; i += 1) {
782 uint32_t len = load32_align2(&iovs_ptr[i].len);
760 size_t written_size = 0;783 size_t written_size = 0;
761 if (fds[fd].stream != NULL)784 if (fds[fd].stream != NULL)
762 written_size = fwrite(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);785 written_size = fwrite(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
763 else786 else
764 written_size = iovs_ptr[i].len;787 written_size = len;
765 size += written_size;788 size += written_size;
766 if (written_size < iovs_ptr[i].len) break;789 if (written_size < len) break;
767 }790 }
768791
769 if (size > 0) {792 if (size > 0) {
...@@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io...@@ -771,7 +794,7 @@ uint32_t wasi_snapshot_preview1_fd_write(uint32_t fd, uint32_t iovs, uint32_t io
771 des[fds[fd].de].atim = now;794 des[fds[fd].de].atim = now;
772 des[fds[fd].de].mtim = now;795 des[fds[fd].de].mtim = now;
773 }796 }
774 *res_size_ptr = size;797 store32_align2(res_size_ptr, size);
775 return wasi_errno_success;798 return wasi_errno_success;
776}799}
777800
...@@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32...@@ -809,7 +832,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32
809#if LOG_TRACE832#if LOG_TRACE
810 fprintf(stderr, "fd = %u\n", fd_len);833 fprintf(stderr, "fd = %u\n", fd_len);
811#endif834#endif
812 *res_fd_ptr = fd_len;835 store32_align2(res_fd_ptr, fd_len);
813 fd_len += 1;836 fd_len += 1;
814 }837 }
815 if (lookup_errno != wasi_errno_noent) return lookup_errno;838 if (lookup_errno != wasi_errno_noent) return lookup_errno;
...@@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32...@@ -867,7 +890,7 @@ uint32_t wasi_snapshot_preview1_path_open(uint32_t fd, uint32_t dirflags, uint32
867 fds[fd_len].fdflags = fdflags;890 fds[fd_len].fdflags = fdflags;
868 fds[fd_len].stream = stream;891 fds[fd_len].stream = stream;
869 fds[fd_len].fs_rights_inheriting = fs_rights_inheriting;892 fds[fd_len].fs_rights_inheriting = fs_rights_inheriting;
870 *res_fd_ptr = fd_len;893 store32_align2(res_fd_ptr, fd_len);
871 fd_len += 1;894 fd_len += 1;
872 return wasi_errno_success;895 return wasi_errno_success;
873}896}
...@@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision,...@@ -882,12 +905,12 @@ uint32_t wasi_snapshot_preview1_clock_time_get(uint32_t id, uint64_t precision,
882905
883 switch (id) {906 switch (id) {
884 case wasi_clockid_realtime:907 case wasi_clockid_realtime:
885 *res_timestamp_ptr = time(NULL) * UINT64_C(1000000000);908 store64_align3(res_timestamp_ptr, time(NULL) * UINT64_C(1000000000));
886 break;909 break;
887 case wasi_clockid_monotonic:910 case wasi_clockid_monotonic:
888 case wasi_clockid_process_cputime_id:911 case wasi_clockid_process_cputime_id:
889 case wasi_clockid_thread_cputime_id:912 case wasi_clockid_thread_cputime_id:
890 *res_timestamp_ptr = clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC);913 store64_align3(res_timestamp_ptr, clock() * (UINT64_C(1000000000) / CLOCKS_PER_SEC));
891 break;914 break;
892 default: return wasi_errno_inval;915 default: return wasi_errno_inval;
893 }916 }
...@@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io...@@ -947,19 +970,20 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io
947970
948 size_t size = 0;971 size_t size = 0;
949 for (uint32_t i = 0; i < iovs_len; i += 1) {972 for (uint32_t i = 0; i < iovs_len; i += 1) {
973 uint32_t len = load32_align2(&iovs_ptr[i].len);
950 size_t read_size = 0;974 size_t read_size = 0;
951 if (fds[fd].stream != NULL)975 if (fds[fd].stream != NULL)
952 read_size = fread(&m[iovs_ptr[i].ptr], 1, iovs_ptr[i].len, fds[fd].stream);976 read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
953 else977 else
954 panic("unimplemented");978 panic("unimplemented");
955 size += read_size;979 size += read_size;
956 if (read_size < iovs_ptr[i].len) break;980 if (read_size < len) break;
957 }981 }
958982
959 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;983 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
960984
961 if (size > 0) des[fds[fd].de].atim = time(NULL);985 if (size > 0) des[fds[fd].de].atim = time(NULL);
962 *res_size_ptr = size;986 store32_align2(res_size_ptr, size);
963 return wasi_errno_success;987 return wasi_errno_success;
964}988}
965989
...@@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_...@@ -996,7 +1020,7 @@ uint32_t wasi_snapshot_preview1_fd_seek(uint32_t fd, uint64_t in_offset, uint32_
996 if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io;1020 if (fseek(fds[fd].stream, offset, seek_whence) < 0) return wasi_errno_io;
997 long res_offset = ftell(fds[fd].stream);1021 long res_offset = ftell(fds[fd].stream);
998 if (res_offset < 0) return wasi_errno_io;1022 if (res_offset < 0) return wasi_errno_io;
999 *res_filesize_ptr = (uint64_t)res_offset;1023 store64_align3(res_filesize_ptr, res_offset);
1000 return wasi_errno_success;1024 return wasi_errno_success;
1001}1025}
10021026
stage1/wasm2c.c+21-19
...@@ -73,6 +73,8 @@ static void renderExpr(FILE *out, struct InputStream *in) {...@@ -73,6 +73,8 @@ static void renderExpr(FILE *out, struct InputStream *in) {
73 }73 }
74}74}
7575
76static const uint32_t big_endian = 0xff000000;
77
76int main(int argc, char **argv) {78int main(int argc, char **argv) {
77 if (argc != 3) {79 if (argc != 3) {
78 fprintf(stderr, "usage: %s in.wasm.zst out.c\n", argv[0]);80 fprintf(stderr, "usage: %s in.wasm.zst out.c\n", argv[0]);
...@@ -80,7 +82,7 @@ int main(int argc, char **argv) {...@@ -80,7 +82,7 @@ int main(int argc, char **argv) {
80 }82 }
8183
82 const char *mod = "wasm";84 const char *mod = "wasm";
83 bool is_big_endian = false; // TODO85 bool is_big_endian = *(uint8_t *)&big_endian;
8486
85 struct InputStream in;87 struct InputStream in;
86 InputStream_open(&in, argv[1]);88 InputStream_open(&in, argv[1]);
...@@ -111,55 +113,55 @@ int main(int argc, char **argv) {...@@ -111,55 +113,55 @@ int main(int argc, char **argv) {
111 " (uint64_t)i32_byteswap(src >> 32) << 0;\n"113 " (uint64_t)i32_byteswap(src >> 32) << 0;\n"
112 "}\n"114 "}\n"
113 "\n", out);115 "\n", out);
114 fputs("static uint16_t load16_align0(const uint8_t *ptr) {\n"116 fputs("uint16_t load16_align0(const uint8_t *ptr) {\n"
115 " uint16_t val;\n"117 " uint16_t val;\n"
116 " memcpy(&val, ptr, sizeof(val));\n", out);118 " memcpy(&val, ptr, sizeof(val));\n", out);
117 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);119 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
118 fputs(" return val;\n"120 fputs(" return val;\n"
119 "}\n"121 "}\n"
120 "static uint16_t load16_align1(const uint16_t *ptr) {\n"122 "uint16_t load16_align1(const uint16_t *ptr) {\n"
121 " uint16_t val;\n"123 " uint16_t val;\n"
122 " memcpy(&val, ptr, sizeof(val));\n", out);124 " memcpy(&val, ptr, sizeof(val));\n", out);
123 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);125 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
124 fputs(" return val;\n"126 fputs(" return val;\n"
125 "}\n"127 "}\n"
126 "static uint32_t load32_align0(const uint8_t *ptr) {\n"128 "uint32_t load32_align0(const uint8_t *ptr) {\n"
127 " uint32_t val;\n"129 " uint32_t val;\n"
128 " memcpy(&val, ptr, sizeof(val));\n", out);130 " memcpy(&val, ptr, sizeof(val));\n", out);
129 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);131 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
130 fputs(" return val;\n"132 fputs(" return val;\n"
131 "}\n"133 "}\n"
132 "static uint32_t load32_align1(const uint16_t *ptr) {\n"134 "uint32_t load32_align1(const uint16_t *ptr) {\n"
133 " uint32_t val;\n"135 " uint32_t val;\n"
134 " memcpy(&val, ptr, sizeof(val));\n", out);136 " memcpy(&val, ptr, sizeof(val));\n", out);
135 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);137 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
136 fputs(" return val;\n"138 fputs(" return val;\n"
137 "}\n"139 "}\n"
138 "static uint32_t load32_align2(const uint32_t *ptr) {\n"140 "uint32_t load32_align2(const uint32_t *ptr) {\n"
139 " uint32_t val;\n"141 " uint32_t val;\n"
140 " memcpy(&val, ptr, sizeof(val));\n", out);142 " memcpy(&val, ptr, sizeof(val));\n", out);
141 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);143 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
142 fputs(" return val;\n"144 fputs(" return val;\n"
143 "}\n"145 "}\n"
144 "static uint64_t load64_align0(const uint8_t *ptr) {\n"146 "uint64_t load64_align0(const uint8_t *ptr) {\n"
145 " uint64_t val;\n"147 " uint64_t val;\n"
146 " memcpy(&val, ptr, sizeof(val));\n", out);148 " memcpy(&val, ptr, sizeof(val));\n", out);
147 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);149 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
148 fputs(" return val;\n"150 fputs(" return val;\n"
149 "}\n"151 "}\n"
150 "static uint64_t load64_align1(const uint16_t *ptr) {\n"152 "uint64_t load64_align1(const uint16_t *ptr) {\n"
151 " uint64_t val;\n"153 " uint64_t val;\n"
152 " memcpy(&val, ptr, sizeof(val));\n", out);154 " memcpy(&val, ptr, sizeof(val));\n", out);
153 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);155 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
154 fputs(" return val;\n"156 fputs(" return val;\n"
155 "}\n"157 "}\n"
156 "static uint64_t load64_align2(const uint32_t *ptr) {\n"158 "uint64_t load64_align2(const uint32_t *ptr) {\n"
157 " uint64_t val;\n"159 " uint64_t val;\n"
158 " memcpy(&val, ptr, sizeof(val));\n", out);160 " memcpy(&val, ptr, sizeof(val));\n", out);
159 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);161 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
160 fputs(" return val;\n"162 fputs(" return val;\n"
161 "}\n"163 "}\n"
162 "static uint64_t load64_align3(const uint64_t *ptr) {\n"164 "uint64_t load64_align3(const uint64_t *ptr) {\n"
163 " uint64_t val;\n"165 " uint64_t val;\n"
164 " memcpy(&val, ptr, sizeof(val));\n", out);166 " memcpy(&val, ptr, sizeof(val));\n", out);
165 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);167 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
...@@ -199,39 +201,39 @@ int main(int argc, char **argv) {...@@ -199,39 +201,39 @@ int main(int argc, char **argv) {
199 " return i64_ctz(lhs);\n"201 " return i64_ctz(lhs);\n"
200 "}\n"202 "}\n"
201 "\n"203 "\n"
202 "static void store16_align0(uint8_t *ptr, uint16_t val) {\n", out);204 "void store16_align0(uint8_t *ptr, uint16_t val) {\n", out);
203 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);205 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
204 fputs(" memcpy(ptr, &val, sizeof(val));\n"206 fputs(" memcpy(ptr, &val, sizeof(val));\n"
205 "}\n"207 "}\n"
206 "static void store16_align1(uint16_t *ptr, uint16_t val) {\n", out);208 "void store16_align1(uint16_t *ptr, uint16_t val) {\n", out);
207 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);209 if (is_big_endian) fputs(" val = i16_byteswap(val);", out);
208 fputs(" memcpy(ptr, &val, sizeof(val));\n"210 fputs(" memcpy(ptr, &val, sizeof(val));\n"
209 "}\n"211 "}\n"
210 "static void store32_align0(uint8_t *ptr, uint32_t val) {\n", out);212 "void store32_align0(uint8_t *ptr, uint32_t val) {\n", out);
211 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);213 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
212 fputs(" memcpy(ptr, &val, sizeof(val));\n"214 fputs(" memcpy(ptr, &val, sizeof(val));\n"
213 "}\n"215 "}\n"
214 "static void store32_align1(uint16_t *ptr, uint32_t val) {\n", out);216 "void store32_align1(uint16_t *ptr, uint32_t val) {\n", out);
215 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);217 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
216 fputs(" memcpy(ptr, &val, sizeof(val));\n"218 fputs(" memcpy(ptr, &val, sizeof(val));\n"
217 "}\n"219 "}\n"
218 "static void store32_align2(uint32_t *ptr, uint32_t val) {\n", out);220 "void store32_align2(uint32_t *ptr, uint32_t val) {\n", out);
219 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);221 if (is_big_endian) fputs(" val = i32_byteswap(val);", out);
220 fputs(" memcpy(ptr, &val, sizeof(val));\n"222 fputs(" memcpy(ptr, &val, sizeof(val));\n"
221 "}\n"223 "}\n"
222 "static void store64_align0(uint8_t *ptr, uint64_t val) {\n", out);224 "void store64_align0(uint8_t *ptr, uint64_t val) {\n", out);
223 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);225 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
224 fputs(" memcpy(ptr, &val, sizeof(val));\n"226 fputs(" memcpy(ptr, &val, sizeof(val));\n"
225 "}\n"227 "}\n"
226 "static void store64_align1(uint16_t *ptr, uint64_t val) {\n", out);228 "void store64_align1(uint16_t *ptr, uint64_t val) {\n", out);
227 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);229 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
228 fputs(" memcpy(ptr, &val, sizeof(val));\n"230 fputs(" memcpy(ptr, &val, sizeof(val));\n"
229 "}\n"231 "}\n"
230 "static void store64_align2(uint32_t *ptr, uint64_t val) {\n", out);232 "void store64_align2(uint32_t *ptr, uint64_t val) {\n", out);
231 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);233 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
232 fputs(" memcpy(ptr, &val, sizeof(val));\n"234 fputs(" memcpy(ptr, &val, sizeof(val));\n"
233 "}\n"235 "}\n"
234 "static void store64_align3(uint64_t *ptr, uint64_t val) {\n", out);236 "void store64_align3(uint64_t *ptr, uint64_t val) {\n", out);
235 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);237 if (is_big_endian) fputs(" val = i64_byteswap(val);", out);
236 fputs(" memcpy(ptr, &val, sizeof(val));\n"238 fputs(" memcpy(ptr, &val, sizeof(val));\n"
237 "}\n"239 "}\n"