Add NES emulator

It's now possible to play classic video game roms with teletypewriters.
https://justine.storage.googleapis.com/nesemu.png
main
Justine Tunney 2020-07-02 13:46:08 -07:00
parent 4918121810
commit 72b654cb6c
28 changed files with 1888 additions and 79 deletions

View File

@ -8,5 +8,8 @@ AlwaysBreakBeforeMultilineStrings: false
AllowShortFunctionsOnASingleLine: false
KeepEmptyLinesAtTheStartOfBlocks: true
---
Language: Cpp
AllowShortFunctionsOnASingleLine: true
---
Language: Proto
...

View File

@ -109,6 +109,7 @@ include libc/runtime/runtime.mk # ├──systems
include libc/unicode/unicode.mk # │
include third_party/dlmalloc/dlmalloc.mk # │
include libc/mem/mem.mk # │
include libc/ohmyplus/ohmyplus.mk # │
include libc/zipos/zipos.mk # │
include third_party/dtoa/dtoa.mk # │
include libc/time/time.mk # │

View File

@ -166,7 +166,9 @@ DEFAULT_CXXFLAGS = \
-fno-rtti \
-fno-exceptions \
-fuse-cxa-atexit \
-fno-threadsafe-statics
-fno-threadsafe-statics \
-Wno-int-in-bool-context \
-Wno-narrowing
DEFAULT_ASFLAGS = \
-W \
@ -278,6 +280,7 @@ PREPROCESS.flags = -E $(copt.flags) $(cc.flags) $(cpp.flags)
PREPROCESS.lds.flags = -D__LINKER__ $(filter-out -g%,$(PREPROCESS.flags)) -P -xc
COMPILE.c = $(CC) -S $(COMPILE.c.flags)
COMPILE.cxx = $(CXX) -S $(COMPILE.cxx.flags)
COMPILE.i = $(CC) -S $(COMPILE.i.flags)
COMPILE.f = $(FC) -S $(COMPILE.f.flags)
COMPILE.F = $(FC) -S $(COMPILE.F.flags)

View File

@ -32,6 +32,7 @@ o/%.lds: %.lds; @ACTION=PREPROCESS build/compile $(PREPROCESS.lds) $(OUTPUT_OPTI
o/%.inc: %.h; @ACTION=PREPROCESS build/compile $(PREPROCESS) $(OUTPUT_OPTION) -D__ASSEMBLER__ -P $<
o/%.pkg:; @build/package $(OUTPUT_OPTION) $(addprefix -d,$(filter %.pkg,$^)) $(filter %.o,$^)
o/%.h.ok: %.h; @ACTION=CHECK.h build/compile $(COMPILE.c) -x c -g0 -o $@ $<
o/%.h.okk: %.h; @ACTION=CHECK.h build/compile $(COMPILE.cxx) -x c++ -g0 -o $@ $<
o/%.greg.o: %.greg.c; @ACTION=OBJECTIFY.greg build/compile $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $<
o/%.zip.o: o/%; @build/zipobj $(OUTPUT_OPTION) $<
@ -60,6 +61,7 @@ o/$(MODE)/%.o: %.cc; @ACTION=OBJECTIFY.cxx build/compile $(OBJECTIFY.cxx) $(OUTP
o/$(MODE)/%.o: o/$(MODE)/%.cc; @ACTION=OBJECTIFY.cxx build/compile $(OBJECTIFY.cxx) $(OUTPUT_OPTION) $<
o/$(MODE)/%.lds: %.lds; @ACTION=PREPROCESS build/compile $(PREPROCESS.lds) $(OUTPUT_OPTION) $<
o/$(MODE)/%.h.ok: %.h; @ACTION=CHECK.h build/compile $(COMPILE.c) -x c -g0 -o $@ $<
o/$(MODE)/%.h.okk: %.h; @ACTION=CHECK.h build/compile $(COMPILE.cxx) -x c++ -g0 -o $@ $<
o/$(MODE)/%.o: %.greg.c; @ACTION=OBJECTIFY.greg build/compile $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $<
o/$(MODE)/%.greg.o: %.greg.c; @ACTION=OBJECTIFY.greg build/compile $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $<
o/$(MODE)/%.ansi.o: %.ansi.c; @ACTION=OBJECTIFY.ansi build/compile $(OBJECTIFY.ansi.c) $(OUTPUT_OPTION) $<

View File

@ -17,7 +17,6 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "dsp/scale/scale.h"
#include "libc/assert.h"
#include "libc/intrin/packuswb.h"
#include "libc/intrin/paddw.h"

View File

@ -0,0 +1,11 @@
#ifndef COSMOPOLITAN_DSP_SCALE_CDECIMATE2XUINT8X8_H_
#define COSMOPOLITAN_DSP_SCALE_CDECIMATE2XUINT8X8_H_
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
void *cDecimate2xUint8x8(unsigned long n, unsigned char[n],
const signed char[8]);
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_DSP_SCALE_CDECIMATE2XUINT8X8_H_ */

View File

@ -22,7 +22,6 @@
#include "dsp/core/ituround.h"
#include "dsp/core/q.h"
#include "dsp/core/twixt8.h"
#include "dsp/scale/scale.h"
#include "libc/limits.h"
#include "libc/log/check.h"
#include "libc/log/log.h"

View File

@ -20,7 +20,7 @@
#include "dsp/core/half.h"
#include "dsp/core/ks8.h"
#include "dsp/core/kss8.h"
#include "dsp/scale/scale.h"
#include "dsp/scale/cdecimate2xuint8x8.h"
#include "libc/macros.h"
#include "libc/nexgen32e/x86feature.h"
#include "libc/str/str.h"

View File

@ -18,7 +18,6 @@
02110-1301 USA
*/
#include "dsp/core/half.h"
#include "dsp/scale/scale.h"
void *Scale2xX(long ys, long xs, unsigned char p[ys][xs], long yn, long xn) {
long y, x, w;

View File

@ -15,34 +15,22 @@ void FreeSamplingSolution(struct SamplingSolution *);
struct SamplingSolution *ComputeSamplingSolution(long, long, double, double,
double);
void *Scale2xX(long ys, long xs, unsigned char[ys][xs], long, long);
void *Scale2xY(long ys, long xs, unsigned char[ys][xs], long, long);
void *Magikarp2xX(long ys, long xs, unsigned char[ys][xs], long, long);
void *Magikarp2xY(long ys, long xs, unsigned char[ys][xs], long, long);
void *Magkern2xX(long ys, long xs, unsigned char[ys][xs], long, long);
void *Magkern2xY(long ys, long xs, unsigned char[ys][xs], long, long);
void *MagikarpY(long dys, long dxs, unsigned char d[restrict dys][dxs],
long sys, long sxs, const unsigned char s[sys][sxs], long yn,
long xn, const signed char K[8]);
void *GyaradosUint8(long dyw, long dxw, unsigned char dst[dyw][dxw], long syw,
long sxw, const unsigned char src[syw][sxw], long dyn,
long dxn, long syn, long sxn, long lo, long hi,
struct SamplingSolution *cy, struct SamplingSolution *cx,
bool sharpen);
void *EzGyarados(long dcw, long dyw, long dxw, unsigned char dst[dcw][dyw][dxw],
long scw, long syw, long sxw,
const unsigned char src[scw][syw][sxw], long c0, long cn,
long dyn, long dxn, long syn, long sxn, double ry, double rx,
double oy, double ox);
void Decimate2xUint8x8(unsigned long n, unsigned char[n * 2],
const signed char[static 8]);
void *cDecimate2xUint8x8(unsigned long n, unsigned char[n * 2],
void *Scale2xX(long, long, void *, long, long);
void *Scale2xY(long, long, void *, long, long);
void *Magikarp2xX(long, long, void *, long, long);
void *Magikarp2xY(long, long, void *, long, long);
void *Magkern2xX(long, long, void *, long, long);
void *Magkern2xY(long, long, void *, long, long);
void *MagikarpY(long, long, void *, long, long, const void *, long, long,
const signed char[8]);
void *transpose(long yn, long xn, const unsigned char[yn][xn]);
extern void (*const transpose88b)(unsigned char[8][8]);
void *GyaradosUint8(long, long, void *, long, long, const void *, long, long,
long, long, long, long, struct SamplingSolution *,
struct SamplingSolution *, bool);
void *GyaradosInt16(long, void *, long, const void *, long, long,
struct SamplingSolution *, bool);
void *EzGyarados(long, long, long, void *, long, long, long, const void *, long,
long, long, long, long, long, double, double, double, double);
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */

View File

@ -23,20 +23,26 @@ typedef struct TtyRgb (*rgb2ttyf_f)(__m128);
typedef struct TtyRgb (*tty2rgb_f)(struct TtyRgb);
typedef struct TtyRgb ttypalette_t[2][8];
struct TtyQuant {
enum TtyQuantizationAlgorithm {
kTtyQuantAnsi,
kTtyQuantTrue,
kTtyQuantXterm256,
} alg;
};
enum TtyBlocksSelection {
kTtyBlocksUnicode,
kTtyBlocksCp437,
} blocks;
};
enum TtyQuantizationChannels {
kTtyQuantGrayscale = 1,
kTtyQuantRgb = 3,
} chans;
};
struct TtyQuant {
enum TtyQuantizationAlgorithm alg;
enum TtyBlocksSelection blocks;
enum TtyQuantizationChannels chans;
unsigned min;
unsigned max;
setbg_f setbg;

View File

@ -47,12 +47,12 @@ EXAMPLES_DIRECTDEPS = \
LIBC_CONV \
LIBC_FMT \
LIBC_LOG \
LIBC_MATH \
LIBC_MEM \
LIBC_NEXGEN32E \
LIBC_NT_KERNELBASE \
LIBC_NT_NTDLL \
LIBC_NT_USER32 \
LIBC_OHMYPLUS \
LIBC_RAND \
LIBC_RUNTIME \
LIBC_SOCK \
@ -69,7 +69,6 @@ EXAMPLES_DIRECTDEPS = \
THIRD_PARTY_COMPILER_RT \
THIRD_PARTY_DLMALLOC \
THIRD_PARTY_DTOA \
THIRD_PARTY_DUKTAPE \
THIRD_PARTY_GETOPT \
THIRD_PARTY_MUSL \
THIRD_PARTY_STB \
@ -82,6 +81,7 @@ EXAMPLES_DEPS := \
o/$(MODE)/examples/examples.pkg: \
$(EXAMPLES_OBJS) \
$(THIRD_PARTY_DUKTAPE_A).pkg \
$(foreach x,$(EXAMPLES_DIRECTDEPS),$($(x)_A).pkg)
o/$(MODE)/examples/unbourne.o: \
@ -98,6 +98,7 @@ o/$(MODE)/examples/%.com.dbg: \
o/$(MODE)/examples/%.elf: \
$(EXAMPLES_DEPS) \
$(THIRD_PARTY_DUKTAPE) \
o/$(MODE)/examples/%.o \
$(CRT) \
$(ELF)
@ -107,6 +108,7 @@ $(EXAMPLES_OBJS): examples/examples.mk
o/$(MODE)/examples/hellojs.com.dbg: \
$(EXAMPLES_DEPS) \
$(THIRD_PARTY_DUKTAPE) \
o/$(MODE)/examples/hellojs.o \
o/$(MODE)/examples/hello.js.zip.o \
o/$(MODE)/examples/examples.pkg \

1555
examples/nesemu1.cc 100644

File diff suppressed because it is too large Load Diff

View File

@ -1024,9 +1024,9 @@ STATIC_YOINK_SOURCE(__BASE_FILE__);
#endif
#ifndef __cplusplus
#define COSMOPOLITAN_CPP_START_
#define COSMOPOLITAN_CPP_END_
#define COSMOPOLITAN_CPP_USING_
#define COSMOPOLITAN_CXX_START_
#define COSMOPOLITAN_CXX_END_
#define COSMOPOLITAN_CXX_USING_
#define COSMOPOLITAN_C_START_
#define COSMOPOLITAN_C_END_
#endif

View File

@ -1,6 +1,6 @@
#define COSMOPOLITAN_CPP_START_ namespace cosmo {
#define COSMOPOLITAN_CPP_END_ }
#define COSMOPOLITAN_CPP_USING_ using namespace cosmo;
#define COSMOPOLITAN_CXX_START_ namespace cosmo {
#define COSMOPOLITAN_CXX_END_ }
#define COSMOPOLITAN_CXX_USING_ using namespace cosmo;
#define COSMOPOLITAN_C_START_ extern "C" {
#define COSMOPOLITAN_C_END_ }

View File

@ -26,6 +26,7 @@ o/$(MODE)/libc: o/$(MODE)/libc/alg \
o/$(MODE)/libc/math \
o/$(MODE)/libc/mem \
o/$(MODE)/libc/nexgen32e \
o/$(MODE)/libc/ohmyplus \
o/$(MODE)/libc/rand \
o/$(MODE)/libc/runtime \
o/$(MODE)/libc/sock \

View File

@ -0,0 +1,55 @@
#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐
#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘
PKGS += LIBC_OHMYPLUS
LIBC_OHMYPLUS_ARTIFACTS += LIBC_OHMYPLUS_A
LIBC_OHMYPLUS = $(LIBC_OHMYPLUS_A_DEPS) $(LIBC_OHMYPLUS_A)
LIBC_OHMYPLUS_A = o/$(MODE)/libc/ohmyplus/ohmyplus.a
LIBC_OHMYPLUS_A_FILES := $(wildcard libc/ohmyplus/*)
LIBC_OHMYPLUS_A_HDRS = $(filter %.h,$(LIBC_OHMYPLUS_A_FILES))
LIBC_OHMYPLUS_A_SRCS_S = $(filter %.S,$(LIBC_OHMYPLUS_A_FILES))
LIBC_OHMYPLUS_A_SRCS_C = $(filter %.c,$(LIBC_OHMYPLUS_A_FILES))
LIBC_OHMYPLUS_A_SRCS_CXX = $(filter %.cc,$(LIBC_OHMYPLUS_A_FILES))
LIBC_OHMYPLUS_A_SRCS = \
$(LIBC_OHMYPLUS_A_SRCS_S) \
$(LIBC_OHMYPLUS_A_SRCS_C) \
$(LIBC_OHMYPLUS_A_SRCS_CXX)
LIBC_OHMYPLUS_A_OBJS = \
$(LIBC_OHMYPLUS_A_SRCS:%=o/$(MODE)/%.zip.o) \
$(LIBC_OHMYPLUS_A_SRCS_S:%.S=o/$(MODE)/%.o) \
$(LIBC_OHMYPLUS_A_SRCS_C:%.c=o/$(MODE)/%.o) \
$(LIBC_OHMYPLUS_A_SRCS_CXX:%.cc=o/$(MODE)/%.o)
LIBC_OHMYPLUS_A_CHECKS = \
$(LIBC_OHMYPLUS_A).pkg \
$(LIBC_OHMYPLUS_A_HDRS:%=o/$(MODE)/%.okk)
LIBC_OHMYPLUS_A_DIRECTDEPS = \
LIBC_BITS \
LIBC_MEM \
LIBC_STUBS
LIBC_OHMYPLUS_A_DEPS := \
$(call uniq,$(foreach x,$(LIBC_OHMYPLUS_A_DIRECTDEPS),$($(x))))
$(LIBC_OHMYPLUS_A): \
libc/ohmyplus/ \
$(LIBC_OHMYPLUS_A).pkg \
$(LIBC_OHMYPLUS_A_OBJS)
$(LIBC_OHMYPLUS_A).pkg: \
$(LIBC_OHMYPLUS_A_OBJS) \
$(foreach x,$(LIBC_OHMYPLUS_A_DIRECTDEPS),$($(x)_A).pkg)
LIBC_OHMYPLUS_LIBS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)))
LIBC_OHMYPLUS_SRCS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_SRCS))
LIBC_OHMYPLUS_HDRS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_HDRS))
LIBC_OHMYPLUS_CHECKS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_CHECKS))
LIBC_OHMYPLUS_OBJS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_OBJS))
$(LIBC_OHMYPLUS_OBJS): $(BUILD_FILES) libc/ohmyplus/ohmyplus.mk
.PHONY: o/$(MODE)/libc/ohmyplus
o/$(MODE)/libc/ohmyplus: $(LIBC_OHMYPLUS_CHECKS)

View File

@ -0,0 +1,28 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "libc/bits/bits.h"
#include "libc/mem/mem.h"
void __vector_reserve(size_t n, size_t m, intptr_t **data, size_t *toto) {
if ((n = roundup2pow(n)) > *toto) {
*toto = n;
*data = realloc(*data, n * m);
}
}

View File

@ -0,0 +1,52 @@
/*-*-mode:c++;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8-*-│
vi: set net ft=c++ ts=2 sts=2 sw=2 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#ifndef COSMOPOLITAN_LIBC_OHMYPLUS_VECTOR_H_
#define COSMOPOLITAN_LIBC_OHMYPLUS_VECTOR_H_
extern "C" {
void __vector_reserve(size_t, size_t, intptr_t **, size_t *);
} /* extern c */
namespace std {
template <class T>
class vector {
public:
vector() : data_(NULL), size_(0), toto_(0) {}
vector(size_t n) : data_(NULL), size_(n), toto_(0) { VectorReserve(n); }
size_t size() const { return size_; }
size_t capacity() const { return toto_; }
T &front() { return data_[0]; }
T &back() { return data_[size_ - 1]; }
void clear() { size_ = 0; }
void reserve(size_t n) { VectorReserve(n); }
void resize(size_t n) { reserve((size_ = n)); }
bool empty() const { return !size_; }
T &operator[](size_t i) { return data_[i]; }
private:
T *data_;
size_t size_;
size_t toto_;
void VectorReserve(size_t n) {
__vector_reserve(n, sizeof(T), (intptr_t **)&data_, &toto_);
}
};
}; /* namespace std */
#endif /* COSMOPOLITAN_LIBC_OHMYPLUS_VECTOR_H_ */

View File

@ -17,17 +17,17 @@
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
hidden extern const long POLLERR;
hidden extern const long POLLHUP;
hidden extern const long POLLIN;
hidden extern const long POLLNVAL;
hidden extern const long POLLOUT;
hidden extern const long POLLPRI;
hidden extern const long POLLRDBAND;
hidden extern const long POLLRDHUP;
hidden extern const long POLLRDNORM;
hidden extern const long POLLWRBAND;
hidden extern const long POLLWRNORM;
hidden extern const int16_t POLLERR;
hidden extern const int16_t POLLHUP;
hidden extern const int16_t POLLIN;
hidden extern const int16_t POLLNVAL;
hidden extern const int16_t POLLOUT;
hidden extern const int16_t POLLPRI;
hidden extern const int16_t POLLRDBAND;
hidden extern const int16_t POLLRDHUP;
hidden extern const int16_t POLLRDNORM;
hidden extern const int16_t POLLWRBAND;
hidden extern const int16_t POLLWRNORM;
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */

View File

@ -2,6 +2,7 @@
#define COSMOPOLITAN_LIBC_TESTLIB_EZBENCH_H_
#include "libc/macros.h"
#include "libc/testlib/bench.h"
#include "libc/testlib/testlib.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
#define EZBENCH(INIT, EXPR) EZBENCH2(#EXPR, INIT, EXPR)

View File

@ -0,0 +1,29 @@
/*-*- mode:asm; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
This program is free software; you can redistribute it and/or modify │
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License. │
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of │
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software │
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "libc/macros.h"
/ Returns cube root of 𝑥.
/
/ @param %xmm0 holds binary64 number
/ @return %xmm0 holds binary64 result
tinymath_cbrt:
jmp __cbrt
.endfn tinymath_cbrt,globl
.alias tinymath_cbrt,cbrt

View File

@ -11,9 +11,6 @@
*
* Optimized by Bruce D. Evans.
*/
/* cbrt(x)
* Return cube root of x
*/
#include "libc/math.h"
asm(".ident\t\"\\n\\n\
@ -32,7 +29,10 @@ static const double P0 = 1.87595182427177009643, /* 0x3ffe03e6, 0x0f61e692 */
P3 = -0.758397934778766047437, /* 0xbfe844cb, 0xbee751d9 */
P4 = 0.145996192886612446982; /* 0x3fc2b000, 0xd4e4edd7 */
double(cbrt)(double x) {
/**
* Returns cube root of 𝑥.
*/
double __cbrt(double x) {
union {
double f;
uint64_t i;

View File

@ -0,0 +1,35 @@
/*-*- mode:asm; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
This program is free software; you can redistribute it and/or modify │
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License. │
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of │
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software │
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "libc/macros.h"
/ Returns cube root of 𝑥.
/
/ @param %xmm0 holds binary32 number
/ @return %xmm0 holds binary32 result
tinymath_cbrtf:
pushq %rbp
mov %rsp,%rbp
cvtss2sd %xmm0,%xmm0
call __cbrt
cvtsd2ss %xmm0,%xmm0
popq %rbp
ret
.endfn tinymath_cbrtf,globl
.alias tinymath_cbrtf,cbrtf

View File

@ -0,0 +1,39 @@
/*-*- mode:asm; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
This program is free software; you can redistribute it and/or modify │
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License. │
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of │
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software │
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "libc/macros.h"
/ Returns cube root of 𝑥.
/
/ @param 𝑥 is an 80-bit long double passed on stack in 16-bytes
/ @return result of computation on FPU stack in %st
tinymath_cbrtl:
pushq %rbp
mov %rsp,%rbp
sub $16,%rsp
fldt 16(%rbp)
fstpl -8(%rbp)
movsd -8(%rbp),%xmm0
call __cbrt
movsd %xmm0,-8(%rbp)
fldl -8(%rbp)
leave
ret
.endfn tinymath_cbrtl,globl
.alias tinymath_cbrtl,cbrtl

View File

@ -17,6 +17,7 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "dsp/scale/cdecimate2xuint8x8.h"
#include "dsp/scale/scale.h"
#include "libc/fmt/bing.h"
#include "libc/nexgen32e/x86feature.h"

View File

@ -1298,9 +1298,9 @@
(cosmopolitan-builtin-defines
'("__COSMOPOLITAN__"
"__LINKER__"
"COSMOPOLITAN_CPP_START_"
"COSMOPOLITAN_CPP_END_"
"COSMOPOLITAN_CPP_USING_"
"COSMOPOLITAN_CXX_START_"
"COSMOPOLITAN_CXX_END_"
"COSMOPOLITAN_CXX_USING_"
"COSMOPOLITAN_C_START_"
"COSMOPOLITAN_C_END_"
"MACHINE_CODE_ANALYSIS_BEGIN_"

View File

@ -1,4 +1,4 @@
(require 'mog-mode)
(require 'ctest-mode)
(require 'ld-script)
(require 'optinfo-mode)
(require 'protobuf-mode)