mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-25 20:10:29 +00:00
Add chibicc
This program popped up on Hacker News recently. It's the only modern compiler I've ever seen that doesn't have dependencies and is easily modified. So I added all of the missing GNU extensions I like to use which means it might be possible soon to build on non-Linux and have third party not vendor gcc binaries.
This commit is contained in:
parent
e44a0cf6f8
commit
8da931a7f6
298 changed files with 19493 additions and 11950 deletions
|
@ -22,9 +22,11 @@ int bsfl(long);
|
|||
int bsfll(long long);
|
||||
int bsfmax(uintmax_t);
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define bsf(u) __builtin_ctz(u)
|
||||
#define bsfl(u) __builtin_ctzl(u)
|
||||
#define bsfll(u) __builtin_ctzll(u)
|
||||
#endif
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
|
|
@ -22,9 +22,11 @@ int bsrl(long);
|
|||
int bsrll(long long);
|
||||
int bsrmax(uintmax_t);
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define bsr(u) ((sizeof(int) * 8 - 1) ^ __builtin_clz(u))
|
||||
#define bsrl(u) ((sizeof(long) * 8 - 1) ^ __builtin_clzl(u))
|
||||
#define bsrll(u) ((sizeof(long long) * 8 - 1) ^ __builtin_clzll(u))
|
||||
#endif
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
|
|
@ -36,32 +36,32 @@ cescapec:
|
|||
movzbl %cl,%ecx
|
||||
jmp *cescapectab(,%rcx,8)
|
||||
.Lanchorpoint:
|
||||
.LBEL: mov $'a,%ah
|
||||
.LBEL: mov $'a',%ah
|
||||
ret
|
||||
.LBS: mov $'b,%ah
|
||||
.LBS: mov $'b',%ah
|
||||
ret
|
||||
.LHT: mov $'t,%ah
|
||||
.LHT: mov $'t',%ah
|
||||
ret
|
||||
.LLF: mov $'n,%ah
|
||||
.LLF: mov $'n',%ah
|
||||
ret
|
||||
.LVT: mov $'v,%ah
|
||||
.LVT: mov $'v',%ah
|
||||
ret
|
||||
.LFF: mov $'f,%ah
|
||||
.LFF: mov $'f',%ah
|
||||
ret
|
||||
.LCR: mov $'r,%ah
|
||||
.LCR: mov $'r',%ah
|
||||
ret
|
||||
.LDQ: mov $'\",%ah
|
||||
.LDQ: mov $'\"',%ah
|
||||
ret
|
||||
.LSQ: mov $'\',%ah
|
||||
.LSQ: mov $'\'',%ah
|
||||
ret
|
||||
.LBSL: mov $'\\,%ah
|
||||
.LBSL: mov $'\\',%ah
|
||||
ret
|
||||
#ifdef __STRICT_ANSI__
|
||||
.LQM: mov $'?,%ah
|
||||
.LQM: mov $'?',%ah
|
||||
ret
|
||||
.LESC:
|
||||
#elif defined(__GNUC__)
|
||||
.LESC: mov $'e,%ah
|
||||
.LESC: mov $'e',%ah
|
||||
ret
|
||||
.LQM:
|
||||
#endif
|
||||
|
|
25
libc/nexgen32e/ctz.c
Normal file
25
libc/nexgen32e/ctz.c
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*-*- 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/math.h"
|
||||
#include "libc/nexgen32e/nexgen32e.h"
|
||||
|
||||
bool ctz(double x, double y) {
|
||||
return __builtin_islessgreater(x, y);
|
||||
}
|
|
@ -41,7 +41,7 @@ ffs: .leafprologue
|
|||
bsf %edi,%eax
|
||||
or $-1,%edx
|
||||
cmovz %edx,%eax
|
||||
add $1,%eax
|
||||
inc %eax
|
||||
.leafepilogue
|
||||
.endfn ffs,globl
|
||||
.source __FILE__
|
||||
|
|
|
@ -41,7 +41,7 @@ ffsl: .leafprologue
|
|||
bsf %rdi,%rax
|
||||
or $-1,%edx
|
||||
cmovz %edx,%eax
|
||||
add $1,%eax
|
||||
inc %eax
|
||||
.leafepilogue
|
||||
.endfn ffsl,globl
|
||||
.alias ffsl,ffsll
|
||||
|
|
64
libc/nexgen32e/khalfcache3.S
Normal file
64
libc/nexgen32e/khalfcache3.S
Normal file
|
@ -0,0 +1,64 @@
|
|||
/*-*- mode:unix-assembly; 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"
|
||||
|
||||
/ Half size of level 3 cache in bytes.
|
||||
.initbss 202,_init_kHalfCache3
|
||||
kHalfCache3:
|
||||
.quad 0
|
||||
.endobj kHalfCache3,globl
|
||||
.previous
|
||||
|
||||
.init.start 202,_init_kHalfCache3
|
||||
cmpl $3,kCpuids(%rip)
|
||||
jbe 3f
|
||||
xor %r8d,%r8d
|
||||
mov $4,%r8d
|
||||
1: mov %r8d,%eax
|
||||
mov %r8d,%ecx
|
||||
push %rbx
|
||||
cpuid
|
||||
mov %ebx,%r9d
|
||||
pop %rbx
|
||||
test $31,%al
|
||||
je 3f
|
||||
cmp $99,%al
|
||||
jne 2f
|
||||
mov %r9d,%eax
|
||||
mov %r9d,%edx
|
||||
inc %ecx
|
||||
shr $12,%r9d
|
||||
shr $22,%eax
|
||||
and $0x0fff,%edx
|
||||
and $0x03ff,%r9d
|
||||
inc %eax
|
||||
inc %edx
|
||||
imul %edx,%eax
|
||||
imul %ecx,%eax
|
||||
lea 1(%r9),%ecx
|
||||
imul %ecx,%eax
|
||||
jmp 4f
|
||||
2: inc %r8d
|
||||
jmp 1b
|
||||
3: mov $0x00400000,%eax
|
||||
4: shr %eax
|
||||
stosq
|
||||
.init.end 202,_init_kHalfCache3
|
||||
.source __FILE__
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
/ Loads XMM registers from buffer.
|
||||
/
|
||||
/ @param %rdi points to &(aligned(16) uint8_t[256])[128]
|
||||
/ @param %rdi points to &(forcealign(16) uint8_t[256])[128]
|
||||
/ @note modern cpus have out-of-order execution engines
|
||||
loadxmm:.leafprologue
|
||||
movaps -0x80(%rdi),%xmm0
|
||||
|
|
|
@ -112,7 +112,7 @@ MemCpy: .leafprologue
|
|||
.L1: mov (%rsi),%cl
|
||||
mov %cl,(%rdi)
|
||||
jmp .L0
|
||||
.Lerms: cmp $4*1024*1024,%rdx # TODO: getcachesize()
|
||||
.Lerms: cmp kHalfCache3(%rip),%rdx
|
||||
ja .Lnts
|
||||
push %rdi
|
||||
push %rsi
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
/ Stores XMM registers to buffer.
|
||||
/
|
||||
/ @param %rdi points to &(aligned(16) uint8_t[256])[128]
|
||||
/ @param %rdi points to &(forcealign(16) uint8_t[256])[128]
|
||||
/ @note modern cpus have out-of-order execution engines
|
||||
savexmm:.leafprologue
|
||||
movaps %xmm0,-0x80(%rdi)
|
||||
|
|
|
@ -28,6 +28,21 @@
|
|||
/ @return rax is pointer to substring or NULL
|
||||
/ @asyncsignalsafe
|
||||
strstr$sse42:
|
||||
.strstr .Lequalordered
|
||||
.leafprologue
|
||||
mov %rdi,%rax
|
||||
xor %ecx,%ecx
|
||||
0: mov $-16,%rdx
|
||||
1: add $16,%rdx
|
||||
movaps (%rsi,%rdx),%xmm0
|
||||
2: add %rcx,%rax
|
||||
lea (%rax,%rdx),%rdi
|
||||
pcmpistri $.Lequalordered,(%rdi),%xmm0
|
||||
3: ja 2b # !CF (no match) && !ZF (need NUL-term)
|
||||
jnc 4f # !CF (no match) && ZF (NUL-terminator)
|
||||
jno 0b # !OF ← CF && CX!=0 (matched at offset)
|
||||
jns 1b # !SF ← NUL ∉ XMM1 (need to match more)
|
||||
jmp 5f # youtu.be/nVk1DjMtLWs
|
||||
4: xor %eax,%eax
|
||||
5: .leafepilogue
|
||||
.endfn strstr$sse42,globl,hidden
|
||||
.source __FILE__
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue