From 3f0be4e9ea637b97f8f1e13e83d50ebbf34edaa5 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Sat, 7 May 2022 12:17:04 -0600 Subject: [PATCH] LibC: Add barebones --- Userland/Libraries/LibC/CMakeLists.txt | 1 + Userland/Libraries/LibC/complex.cpp | 46 ++++++++++++++++++++++++++ Userland/Libraries/LibC/complex.h | 44 ++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 Userland/Libraries/LibC/complex.cpp create mode 100644 Userland/Libraries/LibC/complex.h diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index 2f8a603cb6f..885bbcbb3d5 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -1,6 +1,7 @@ set(LIBC_SOURCES arpa/inet.cpp assert.cpp + complex.cpp ctype.cpp cxxabi.cpp dirent.cpp diff --git a/Userland/Libraries/LibC/complex.cpp b/Userland/Libraries/LibC/complex.cpp new file mode 100644 index 00000000000..6820e03dab7 --- /dev/null +++ b/Userland/Libraries/LibC/complex.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022, Peter Elliott + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +extern "C" { + +// Function definitions of this form "type (name)(args)" are intentional, to +// prevent macro versions of "name" from being incorrectly expanded. These +// functions are here to provide external linkage to their macro implementations. + +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/creal.html +float(crealf)(float complex z) +{ + return crealf(z); +} + +double(creal)(double complex z) +{ + return creal(z); +} + +long double(creall)(long double complex z) +{ + return creall(z); +} + +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/cimag.html +double(cimag)(double complex z) +{ + return cimag(z); +} + +float(cimagf)(float complex z) +{ + return cimagf(z); +} + +long double(cimagl)(long double complex z) +{ + return cimagl(z); +} +} diff --git a/Userland/Libraries/LibC/complex.h b/Userland/Libraries/LibC/complex.h new file mode 100644 index 00000000000..a3b718e1f4a --- /dev/null +++ b/Userland/Libraries/LibC/complex.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022, Peter Elliott + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +/* complex arithmetic + * + * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/complex.h.html + */ + +#pragma once + +#include + +__BEGIN_DECLS + +#define complex _Complex + +#define _Complex_I (0.0f + 1.0fi) +#define I _Complex_I + +#define CMPLX(x, y) ((double complex)__builtin_complex((double)x, (double)y)) +#define CMPLXF(x, y) ((float complex)__builtin_complex((float)x, (float)y)) +#define CMPLXL(x, y) ((long double complex)__builtin_complex((long double)x, (long double)y)) + +float crealf(float complex z); +double creal(double complex z); +long double creall(long double complex z); + +double cimag(double complex z); +float cimagf(float complex z); +long double cimagl(long double complex z); + +// These are macro implementations of the above functions, so that they will always be inlined. +#define creal(z) ((double)__real__((double complex)z)) +#define crealf(z) ((float)__real__((float complex)z)) +#define creall(z) ((long double)__real__((long double complex)z)) + +#define cimag(z) ((double)__imag__((double complex)z)) +#define cimagf(z) ((float)__imag__((float complex)z)) +#define cimagl(z) ((long double)__imag__((long double complex)z)) + +__END_DECLS