David Given [Sun, 10 Jun 2018 09:09:18 +0000 (18:09 +0900)]
Merge.
David Given [Sun, 10 Jun 2018 08:52:45 +0000 (17:52 +0900)]
Fix table underrun when looking up the character class of the EOF character,
-1.
David Given [Sat, 9 Jun 2018 12:21:28 +0000 (21:21 +0900)]
File cleanup.
David Given [Sat, 9 Jun 2018 12:18:50 +0000 (21:18 +0900)]
Make ass and int built with clang --- surprisingly easy.
David Given [Sat, 9 Jun 2018 12:13:31 +0000 (21:13 +0900)]
Make the em interpreter build --- again, lots of warnings, so it probably won't
work on clang. I have no idea whether it runs or not as building a e.out
program is quite hard and needs a special platform.
David Given [Sat, 9 Jun 2018 05:10:45 +0000 (14:10 +0900)]
Get ass running --- it's very K&R and almost certainly won't build on clang,
but it works on gcc.
David Given [Fri, 8 Jun 2018 06:59:04 +0000 (15:59 +0900)]
Rearrange the tests into sets; allow plats to skip sets; pc86 and linux68k now
skip the tests which use floating point instructions (as their emulators don't
support them).
David Given [Thu, 7 Jun 2018 15:18:18 +0000 (00:18 +0900)]
Merge pull request #92 from davidgiven/dtrg-pc86-2
Replace the qemu pc86 emulator with a custom x86emu-based one.
David Given [Thu, 7 Jun 2018 15:05:50 +0000 (00:05 +0900)]
Merge from trunk.
David Given [Thu, 7 Jun 2018 04:48:06 +0000 (13:48 +0900)]
Merge pull request #91 from davidgiven/dtrg-m68k
Add a Musashi-based 68020 emulator; use it to run the linux68k tests.
David Given [Thu, 7 Jun 2018 04:12:15 +0000 (13:12 +0900)]
Dummied out some more system calls --- more tests pass.
David Given [Thu, 7 Jun 2018 04:03:36 +0000 (13:03 +0900)]
More real ELF loading and brk handling; more tests pass.
David Given [Wed, 6 Jun 2018 13:39:43 +0000 (22:39 +0900)]
Beat the 68k simulator into enough shape that at least *some* of the tests pass.
David Given [Wed, 6 Jun 2018 03:49:21 +0000 (12:49 +0900)]
Hang on, the 68k is big-endian --- I'm extracting words (and bytes) from longs
incorrectly.
David Given [Tue, 5 Jun 2018 14:17:22 +0000 (23:17 +0900)]
Get the emulator to the point where it'll start to run code; it then fails,
because the version of Musashi I imported doesn't support floating point...
David Given [Tue, 5 Jun 2018 14:16:34 +0000 (23:16 +0900)]
Enable tests for linux68k.
David Given [Tue, 5 Jun 2018 08:45:00 +0000 (17:45 +0900)]
Crudely beat the standard Masushi simulator into working in the ACK framework.
David Given [Tue, 5 Jun 2018 00:53:56 +0000 (09:53 +0900)]
Basic mid now throws an error on out-of-bounds parameters rather than returning
an uninitialised pointer (and crashing).
Fixes: #54
David Given [Tue, 5 Jun 2018 00:41:31 +0000 (09:41 +0900)]
Fix bogus test.
Fixes: #89.
David Given [Tue, 5 Jun 2018 00:20:46 +0000 (09:20 +0900)]
Fix bogus test.
Fixes: #90
David Given [Mon, 4 Jun 2018 07:19:45 +0000 (16:19 +0900)]
Check in the x86emu-based emulator. Sadly, just like the 8086tiny-based
emulator, FPU instructions aren't supported.
David Given [Sun, 3 Jun 2018 13:13:43 +0000 (15:13 +0200)]
Modify the pc86 test harness to use 8086tiny instead of qemu. Sadly, some tests fail.
David Given [Tue, 5 Jun 2018 08:04:47 +0000 (17:04 +0900)]
Add a clean copy of the Musashi emulator.
David Given [Sun, 3 Jun 2018 13:13:43 +0000 (15:13 +0200)]
Modify the pc86 test harness to use 8086tiny instead of qemu. Sadly, some tests fail.
David Given [Sun, 3 Jun 2018 15:24:21 +0000 (08:24 -0700)]
Add the pc86emu skeleton.
David Given [Sun, 3 Jun 2018 15:06:23 +0000 (08:06 -0700)]
Add a clean copy of the x86emu library.
David Given [Sat, 2 Jun 2018 20:00:48 +0000 (23:00 +0300)]
Merge pull request #87 from davidgiven/dtrg-travis
Get clang working on travis.
David Given [Sat, 2 Jun 2018 19:48:18 +0000 (21:48 +0200)]
Typo fix.
David Given [Sat, 2 Jun 2018 19:31:18 +0000 (21:31 +0200)]
Crudely tweak some of the prototypes to please clang, which is pickier about
K&R C than gcc is.
David Given [Sat, 2 Jun 2018 19:30:52 +0000 (21:30 +0200)]
Honour CFLAGS set in the Makefile.
David Given [Sat, 2 Jun 2018 19:01:03 +0000 (21:01 +0200)]
Try and *actually* use clang for the clang build.
Fixes: #67
David Given [Sat, 2 Jun 2018 18:59:11 +0000 (20:59 +0200)]
Fix resource leak.
Closes: #75
David Given [Sat, 2 Jun 2018 18:57:43 +0000 (20:57 +0200)]
Format.
David Given [Sat, 2 Jun 2018 18:51:41 +0000 (20:51 +0200)]
Crudely bounds check some naked fscanf("%s") parsing. Fixes #79, mostly.
David Given [Sat, 2 Jun 2018 16:23:19 +0000 (19:23 +0300)]
Merge pull request #85 from davidgiven/dtrg-ed
Fix the incompatibility with modern ed
David Given [Sat, 2 Jun 2018 16:08:55 +0000 (18:08 +0200)]
Don't need ed any more in the travis configuration.
David Given [Sat, 2 Jun 2018 16:02:51 +0000 (18:02 +0200)]
Adopt a copy of Minix 2's ed; this allows the ACK's antiquated ed scripts to
run with a minimum of tweaking. Rewriting them for modern ed looks really hard.
Fixes: #84
David Given [Fri, 11 May 2018 22:59:05 +0000 (00:59 +0200)]
Merge pull request #81 from kernigh/kernigh-libfp
software floats, line editor for CP/M
George Koehler [Mon, 7 May 2018 20:08:44 +0000 (16:08 -0400)]
Update cpm/README for console changes, `ack -fp`.
George Koehler [Fri, 4 May 2018 22:32:24 +0000 (18:32 -0400)]
Build a smaller startrek for CP/M.
The game was larger than the 64K address space. I remove the intro
and replace part of libc. Now I can play startrek in YAZE-AG.
George Koehler [Fri, 4 May 2018 22:21:01 +0000 (18:21 -0400)]
Enable the line editor in read() for CP/M.
This changes the BDOS call from CPM_BDOS_CONSOLE_INPUT to
CPN_BDOS_READ_CONSOLE_BUFFER. This allows commands like ^H to delete
characters and ^C to exit to CCP. This is more like how Unix read(2)
uses canonical mode of termios to read a line.
This change has a disadvantage: the user buffer to read(2) must now be
large enough for an entire line. This is because CP/M, unlike Unix,
lacks a kernel buffer to hold the rest of the line. If you use a
buffered input library like stdio to call read(2), then it works; but
if you try to read part of a line or a single character, then it
doesn't work.
George Koehler [Fri, 4 May 2018 22:06:51 +0000 (18:06 -0400)]
Change readstring() to use buffered input.
Change from `uread(0, c, 1)` to `read(c)`, so input goes through
libpc's buffer. If input is a tty in Unix, this reduces the number of
read(2) system calls from one per character to one per line.
This change will become necessary in CP/M when I enable the line
editor.
George Koehler [Sat, 28 Apr 2018 17:18:27 +0000 (13:18 -0400)]
Use `ack -mcpm -fp` for mandelbrot.c, startrek.c
Add a variable %{ackldflags} so I can pass `-fp`. This change seems
to cause the build to relink every ackprogram, because the link now
needs to use %{ackldflags} even if the flags are empty.
mandelbrot_c_cpm runs in YAZE-AG; startrek_c_cpm doesn't run because
it doesn't fit in the 16-bit address space.
George Koehler [Thu, 26 Apr 2018 02:48:28 +0000 (22:48 -0400)]
Optimize libfp. Don't lose -O6 in ackcflags.
This drops 124 bytes from the mandelbrot command (from 15015 to 14891
bytes) but has almost no effect on performance; the command takes
about 144 seconds (in YAZE-AG) both before and after optimizing libfp.
George Koehler [Wed, 25 Apr 2018 20:09:56 +0000 (16:09 -0400)]
Teach i80 ncg to use libfp. Enable `ack -mcpm -fp`.
Old .o files stop working if they use floating point. One must
recompile those files. Old files don't call libfp in the correct way,
and may use symbols that I removed from libem. I don't keep old
symbols in libem/flp.s, because a program that pulls both libfp and
flp.s would get "multiply defined" errors in the linker.
I teach mach/i80/ncg/table to use libfp by copying or adapting the
patterns from mach/i86/ncg/table. I did not test all the patterns,
but I did use `ack -mcpm -fp -O4` to compile examples/mandelbrot.c,
then I ran it in the emulator YAZE-AG. It worked, but it was slow.
George Koehler [Wed, 25 Apr 2018 04:17:19 +0000 (00:17 -0400)]
Build (but don't use) libfp for cpm.
This library is for software floating point. The i80 back end has
never implemented floating point, and might not be ready for libfp.
This commit only builds libfp without using it.
I edit first/build.lua and plat/build.lua to allow `ack -c.s`, then
use FP.script to edit the assembly code. I edit FP.script so it
writes the edited assembly code to stdout, not to the input file.
David Given [Tue, 13 Mar 2018 12:57:28 +0000 (13:57 +0100)]
Merge pull request #73 from kernigh/kernigh-pr
better code from PowerPC ncg and mcg
George Koehler [Tue, 13 Mar 2018 00:58:31 +0000 (20:58 -0400)]
Check LOI expressions to prevent a read after free.
CS eliminates outer expressions before inner ones, as `x * y * z`
before `x * y`. It does this by reversing the order of expressions in
the code. This almost always works, but it sometimes doesn't work if
a STI changes the value number of a LOI. In code like `expr1 LOI
expr2 STI expr2 LOI`, CS might eliminate the inner `expr2` before the
outer `expr2 LOI`. This caused a read after free because the
occurrence of `expr2 LOI` pointed to the eliminated lines of `expr2`.
This bug went unnoticed until my recent changes caused CS to crash
with a double free. I did not get the crash in OpenBSD, but I saw the
crash in Travis, then David Given reproduced the crash in Linux. See
the discussion in https://github.com/davidgiven/ack/pull/73
George Koehler [Mon, 12 Mar 2018 00:10:13 +0000 (20:10 -0400)]
Don't read INSTR(l) after oldline(l) frees it.
This bug got in my way while I was looking for another read-after-free
bug in the CS phase.
David Given [Sun, 11 Mar 2018 11:37:23 +0000 (12:37 +0100)]
There are two places where names are added to the global symbol table; one via
the -U command line option, and one via file scanning. Turns out only the
second would increment the number of global names, so adding names with -U
would cause names found via scanning to fall off the end of the list! This
wouldn't cause linker errors because fixups don't use the list, but would cause
the generated symbol table in the output to be incorrect.
David Given [Sun, 11 Mar 2018 10:00:35 +0000 (11:00 +0100)]
lchar() needs to return the character written. (This happens by magic on 386,
but no on PPC.) See #72.
George Koehler [Thu, 8 Mar 2018 23:51:07 +0000 (18:51 -0500)]
Solve some gcc warnings in ego.
Some of these are from gcc -Wimplicit
George Koehler [Thu, 8 Mar 2018 17:04:02 +0000 (12:04 -0500)]
Read from new, not old, buffer after realloc.
This got caught by MALLOC_OPTIONS=S in OpenBSD. The B compiler filled
the buffer while compiling hilo.b. Then realloc moved the buffer and
unmapped the old buffer. The compiler tried to read the old buffer
and segfaulted.
George Koehler [Thu, 8 Mar 2018 16:49:40 +0000 (11:49 -0500)]
Fix wr_ranlib() for big-endian machines.
With this change, I built and ran ack on a big-endian PowerPC Linux
machine. I used gcc 4.9.4 to build ack, and I only built the linuxppc
back end.
Before this change, wr_ranlib() corrupted a value by changing it from
0x66 to 0x66000066. This value was too big, so led made a fatal
error, "bad ranlib string offset".
George Koehler [Wed, 7 Mar 2018 18:37:31 +0000 (13:37 -0500)]
Add instructions like "lwarx". Extend manual.
Add more page numbers from PowerPC version 2.01. Remove "xnop" not in
2.01, add "mtcr" from 2.01. Add "lwarx" and the other instructions
from Book II. I did not try all the newly added instructions, but
these seem to work: dcbt, dcbtst, icibi, isync, lwarx, stwcx., mftb,
mftbu
In man/powerpc_as.6 (not installed), add a summary of the registers
and addressing modes (like in i386_as.6), describe short forms, update
description of hi16/ha16, add CAVEATS about instructions that some
processors can't run.
George Koehler [Mon, 5 Mar 2018 18:32:06 +0000 (13:32 -0500)]
Optimize procedures that do both a / b and a % b.
Enable this in CS for PowerPC; disable it for all other machines.
PowerPC has no remainder instruction; the back end uses division to
compute remainder. If CS finds both a / b and a % b, then CS now
rewrites a % b as a - b * (a / b) and computes a / b only once. This
removes an extra division in the PowerPC code, so it saves both time
and space.
I have not considered whether to enable this optimization for other
machines. It might be less useful in machines with a remainder
instruction. Also, if a % b occurs before a / b, the EM code gets a
DUP. PowerPC ncg handles this DUP well; other back ends might not.
George Koehler [Fri, 2 Mar 2018 21:06:21 +0000 (16:06 -0500)]
Check AAR earlier to prevent LOI/STI unknown size.
In ego, the CS phase may convert a LAR/SAR to AAR LOI/STI so it can
optimize multiple occurrences of AAR of the same array element. This
conversion should not happen if it would LOI/STI a large or unknown
size.
cs_profit.c okay_lines() checked the size of each occurrence of AAR
except the first. If the first AAR was the implicit AAR in a LAR/SAR,
then the conversion happened without checking the size. For unknown
size, this made a bad LOI -1 or STI -1. Fix by checking the size
earlier: if a LAR/SAR has a bad size, then don't enter it as an AAR.
This Modula-2 code showed the bug. Given M.def:
DEFINITION MODULE M;
TYPE S = SET OF [0..95];
PROCEDURE F(a: ARRAY OF S; i, j: INTEGER);
END M.
and M.mod:
(*$R-*) IMPLEMENTATION MODULE M;
FROM SYSTEM IMPORT ADDRESS, ADR;
PROCEDURE G(s: S; p, q: ADDRESS; t: S); BEGIN
s := s; p := p; q := q; t := t;
END G;
PROCEDURE F(a: ARRAY OF S; i, j: INTEGER); BEGIN
G(a[i + j], ADR(a[i + j]), ADR(a[i + j]), a[i + j])
END F;
END M.
then the bug caused an error:
$ ack -mlinuxppc -O3 -c.e M.mod
/tmp/Ack_b357d.g, line 57: Argument range error
The bug had put LOI -1 in the code, then em_decode got an error
because -1 is out of range for LOI.
Procedure F has 4 occurrences of `a[i + j]`. The size of `a[i + j]`
is 96 bits, or 12 bytes, but the EM code hides the size in an array
descriptor, so the size is unknown to CS. The pragma `(*$R-*)`
disables a range check on `i + j` so CS can work. EM uses AAR for the
2 `ADR(a[i + j])` and LAR for the other 2 `a[i + j]`. EM pushes the
arguments to G in reverse order, so the last `a[i + j]` in Modula-2 is
the first LAR in EM.
CS found 4 occurrences of AAR. The first AAR was an implicit AAR in
LAR. Because of the bug, CS converted this LAR 4 to AAR 4 LOI -1.
David Given [Fri, 2 Mar 2018 17:48:11 +0000 (18:48 +0100)]
Merge pull request #71 from tkchia/default
Define appropriate macros when building Lua on Linux or OS X.
George Koehler [Thu, 1 Mar 2018 18:19:38 +0000 (13:19 -0500)]
Fixes for compiling ego with -DTRACE
- In share/debug.c, undo my mistake in commit
9037d13 by changing
vfprintf back to fprintf in OUTTRACE.
- In ud/ud.c, move the trace output from stdout to stderr, because
stdout has ego's output file, which becomes opt2's input file. If
trace output goes to stdout, it gets prepended to the output file,
and opt2 errors with "wrong input file".
I also edit both build.lua files so ego depends on its header files;
this part isn't needed for -DTRACE.
One can now use -DTRACE by adding it to the cflags in both build.lua
files.
David Given [Fri, 23 Feb 2018 21:50:08 +0000 (13:50 -0800)]
Merge pull request #70 from davidgiven/dtrg-pdp11
Make the PDP/11 code generator work.
David Given [Fri, 23 Feb 2018 21:42:38 +0000 (22:42 +0100)]
I figured out how to get top working.
David Given [Fri, 23 Feb 2018 21:36:03 +0000 (22:36 +0100)]
Update README.
David Given [Fri, 23 Feb 2018 21:31:46 +0000 (22:31 +0100)]
Made the cgg and the cg code generator work; use this to beat the PDP/11
backend into shape. It now generates binaries --- no idea whether they work or
not.
George Koehler [Mon, 5 Feb 2018 21:09:30 +0000 (16:09 -0500)]
Use prototypes in ego/cs, ego/sp.
George Koehler [Mon, 5 Feb 2018 19:55:10 +0000 (14:55 -0500)]
Don't use '-' in option string to getopt().
Using '-' might fail on platforms like FreeBSD. Commit
50a7031
stopped using '-' in the B compiler and ego. I now stop using '-' in
mcg, because I can now check that mcg still works.
George Koehler [Thu, 1 Feb 2018 17:20:31 +0000 (12:20 -0500)]
Only lower "addi sp, sp, X" if X > 0.
If X < 0, then lowering the addi might cause the code to use the stack
space before allocating it. This is a bug because an asynchronous
signal handler can overwrite the unallocated stack space.
George Koehler [Tue, 30 Jan 2018 20:53:26 +0000 (15:53 -0500)]
Teach mcg to pass our tests.
Tests pass if one edits the top build.lua to uncomment "qemuppc" from
both vars.plats and vars.plats_with_tests, and one leaves mcg in
plat/qemuppc/descr.
Add or correct some EM instructions in treebuilder.c:
- "lof", "stf": handle negative offsets in load() and store().
- "cuu": add using IR_FROMUI.
- "lim", "sim": keep an entire word in ".ignmask", to be compatible
with mach/powerpc/libem/trp.s and ncg. We also keep a word in
".ignmask" in ncg for both i386 and m68020.
- "trp": pass trap number in register. See comment in
helper_function_with_arg().
- "sig": push the old value of .trppc on the stack.
- "and ?", "ior ?", "xor ?", "com ?", "cms ?", "set ?", "inn ?":
connect to helper functions in libem.
- "blm", "bls": drop call to memmove() and use new helper ".bls4",
because tests/plat/structcopy_e.c can't call memmove().
- "xor s", "cms s": if s is large, fall back on helper function.
- "rol", "ror": add by decomposing each rotate into 4 IR ops.
- "rck s", "bls s": make fatal unless s is word size.
- "loi": push multiple loads in the correct order.
- "dup s", "exg s": if s is large, fall back on helper.
- "dus": add using new helper ".dus4".
- "lxl", "lxa": follow the static chain, not the dynamic chain.
- "lor 1": materialise the stack before pushing the stack pointer.
- "lor 2", "str 2": make fatal.
- "los", "sts": drop calls to memcpy() and use helpers ".los4" and
and ".sts4", so lang/m2/libm2/LtoUset.e starts working.
- "gto": correctly read descriptor.
Change mach/powerpc/mcg/table:
- ANY.L: add for "asp -8".
- LOAD.L: work around register corruption.
- COMPAREUL.I: add for "cms 8".
Tee-Kiah Chia [Sun, 28 Jan 2018 16:05:17 +0000 (00:05 +0800)]
Define appropriate macros when building Lua on Linux or OS X.
George Koehler [Sun, 28 Jan 2018 02:41:13 +0000 (21:41 -0500)]
Sync qemuppc with linuxppc.
- Don't reverse bitfields; do use ego (
41f3bf7).
- Use MACHOPT_F=-m2 (
3dae9e4).
- Remove old trap.s (
26de4c1).
At this commit, one can build qemuppc with mcg by editing the root
build.lua to uncomment "qemuppc" in "vars.plats". If one also
uncomments "qemuppc" from "vars.plats_with_tests", then mcg fails to
build the tests. If one uses ncg (by editing plat/qemuppc/descr to
change "mcg" to "ncg"), then the tests pass.
George Koehler [Sun, 28 Jan 2018 01:09:16 +0000 (20:09 -0500)]
Add tests for clearing BSS, copying C structs.
The new tests are bss_e.c, structcopy_e.c. We do clear the BSS before
calling _m_a_i_n, so fix the comments in the other tests.
George Koehler [Sat, 27 Jan 2018 21:35:48 +0000 (16:35 -0500)]
For osxppc, change size 8 to alignment 4.
You may need to delete and recompile some .o files! This changes the
alignment of 8-byte values in C structs to match what Apple's gcc
does. See Apple's "32-bit PowerPC Function Calling Conventions" at
https://developer.apple.com
/library/content/documentation/DeveloperTools/Conceptual/LowLevelABI
/100-32-bit_PowerPC_Function_Calling_Conventions/32bitPowerPC.html
George Koehler [Sat, 27 Jan 2018 20:33:43 +0000 (15:33 -0500)]
Use subfic (val - reg) and mulli (reg * val).
In the instruction list, put /* kills xer */ for sraw, srawi, subfic;
and correct the (now unused) "addi." and "lfdu".
Change MACHOPT_F from -m3 to -m2. This changes the code for 15 * i
from
slwi r3,r4,4
subfic r5,r4,0
add r3,r3,r5
to
mulli r3,r4,15
If the sequence "slwi subfic addi" takes 3 cycles and 12 bytes, and
mulli takes 3 cycles and 4 bytes, then mulli is better.
George Koehler [Sat, 27 Jan 2018 01:08:03 +0000 (20:08 -0500)]
Get `ack -mosxppc -g` to partly work with gdb.
Copy and adapt code from mach/{i386,m68020}/ncg/mach.c to pass the
debugging stabs from EM to assembly. The next tools (as, led, cv)
already know how to put the stabs in the Mach-o executable.
Modify the function prolog/prologue so gdb uses fp, not sp, for N_LSYM
and N_PSYM stabs. Simplify prolog() by reducing differences between
stabs and no stabs, and zero and nonzero framesize. For files without
stabs, the new prolog has the same number of instructions and memory
accesses as the old prolog, and to run at about the same speed on my
PowerPC Mac.
This is enough to see some info for global and local variables in gdb
for Mac OS X. I still can't get a backtrace; gdb gets confused
because EM and ncg don't link 0(sp) to the previous stack frame.
I don't expect `ack -mlinuxppc -g` to work with gdb for Linux, because
we prepend underscores to the symbol table, which is correct for
Mach-o but wrong for ELF.
George Koehler [Wed, 24 Jan 2018 20:17:32 +0000 (15:17 -0500)]
Add some comments before I forget how this stuff works.
George Koehler [Tue, 23 Jan 2018 23:18:40 +0000 (18:18 -0500)]
Allow sp and fp on the fake stack.
This simplifies parts of the PowerPC table and causes ncg to better
decide whether to push sp or fp to the real stack, or coerce it to
REG3, or coerce it to REG-REG3, or move it to a regvar. These better
decisions remove extra _mr_ instructions.
The idea comes from mach/powerpc/arm/table, where SP has a property
STACKPOINTER and LB has LOCALBASE. I don't need two properties, so I
make one property SPFP for both registers.
George Koehler [Tue, 23 Jan 2018 18:55:39 +0000 (13:55 -0500)]
Make osx386 and osxppc use _hol0.s like the other platforms.
Because I'm lazy, I didn't make another copy of _hol0.s; I am building
plat/linux/libsys/_hol0.s for OS X.
George Koehler [Mon, 22 Jan 2018 19:04:15 +0000 (14:04 -0500)]
Add fef 4, fif 4. Improve fef 8, fif 8. Other float changes.
When I wrote fef 8, I forgot to test denormalized numbers. Oops. Now
fix two of my mistakes:
- When checking for zero, `extrwi r6, r3, 22, 12` needs to be
`extrwi r6, r3, 20, 12`. There are only 20 bits to extract.
- After the multiplication by 2**64, I forgot to put the fraction in
[0.5, 1) or (-1, 0.5] by setting IEEE exponent = 1022.
Teach fif 8 about signed zero and NaN.
In ncg/table, change cmf so NaN is not equal to any value, and comment
why ordered comparisons don't work with NaN. Also add cost for
fctwiz, remove extra `uses REG`.
Edit comment in cfu8.s because the conditional branch might be before
or after fctwiz.
George Koehler [Fri, 12 Jan 2018 01:04:27 +0000 (20:04 -0500)]
Use extended mnemonics and ha16/lo16.
Remove wrong comment: that's a right shift, not a left shift.
George Koehler [Thu, 11 Jan 2018 22:59:02 +0000 (17:59 -0500)]
Rewrite sigaction() to prevent another race.
A signal handler might call sigaction(). We must block all signals,
not only our signal, to prevent a race between us and the next signal
handler.
Use /* comments */ because cpp might expand macros in ! comments
though such expansion is probably harmless.
The bridge is now shorter by 2 instructions.
George Koehler [Tue, 9 Jan 2018 05:39:03 +0000 (00:39 -0500)]
These are EM trap numbers.
Remove .sect; absolute symbols don't go in a section.
George Koehler [Tue, 9 Jan 2018 03:26:24 +0000 (22:26 -0500)]
Hide some i386 stuff from linux68k, linuxppc.
Rename plat/linux/libsys/errno.s to plat/linux386/libsys/trapno.s and
stop building it for linux68k and linuxppc. It defines symbols for
mach/i386/libem.
In syscalls.h, the numbers after 165 are only for i386, so hide them
from 68k, ppc. These numbers are unused, because the system calls now
in libsys use the lower numbers.
Also teach the build system that libsys depends on the internal
headers in plat/linux/libsys/*.h
George Koehler [Sun, 7 Jan 2018 21:03:55 +0000 (16:03 -0500)]
Shrink .cfu8
With my PowerBook G4, a program that converts values from 1.0 to
4000000.0 runs in about 0.32s with the old .cfu8 and 0.29s with this
shrunken .cfu8
Leave a comment about other ways to implement .cfu8
George Koehler [Fri, 5 Jan 2018 22:55:50 +0000 (17:55 -0500)]
Teach top to merge or delete "addi sp, sp, X".
This reduces code size, because ncg emits too many "addi sp, sp, X"
instructions when unstacking things. Now top lowers "addi sp, sp, X"
by lifting other instructions. This sometimes creates chances to
merge or delete _addi_ instructions. If no such chance is found, the
_addi_ remains uselessly lowered.
Edit ncg/table to remove something that top now does.
Edit ncg/mach.c to remove some spaces after commas. This removes a
whitespace difference between *.s and *.so files, because top removes
the space.
George Koehler [Fri, 5 Jan 2018 01:40:35 +0000 (20:40 -0500)]
Fix lim. Improve lxl, lxa, lor, str, procs with no locals.
_lim_ must use _loe_ (load word external), not _lde_ (load double-word
external).
The new patterns for _lxl_, _lxa_, _lor_, _str_ emit shorter code in
some cases. The change from GPR_EXPR to REG_EXPR allows moving
LXFRAME to a register variable.
Add more "reusing" clauses. We have enough registers that ncg almost
never reuses a register, but sometimes it can reuse r3.
In mach.c, emit one fewer instruction in procedures with no locals.
George Koehler [Wed, 3 Jan 2018 19:51:14 +0000 (14:51 -0500)]
Add tests for C <setjmp.h> and Modula-2 Semaphores.
Fix PowerPC ncg so setjmp() returns the correct value. I got unlucky
when ncg picked r3 for "uses REG"; this destroyed the return value in
r3 and caused the new test to fail.
George Koehler [Mon, 25 Dec 2017 03:37:52 +0000 (22:37 -0500)]
Add test for EM _rck_. Fix traps in PowerPC ncg.
The new test rck_e.e segfaults on PowerPC unless I make some changes.
The inline code for _rck_ was wrong because it didn't allow the trap
handler to return. _sig_ forgot to push the old trap handler.
Move plat/linuxppc/libsys/trap.s to mach/powerpc/libem/trp.s and
rewrite it with simplified/extended mnemonics. Remove .trap alias for
.trp procedure. Add a missing `mtspr lr, r0` so we can return from
the trap handler. Call write() and _exit() so trp.s works with both
linuxppc and osxppc. Before, Mac OS X was wrongly using the trap.s
for Linux.
In powerpc/libem, simplify .aar4; teach .csa and .csb to raise the
trap if the default target is zero.
C programs don't need these changes. You may relink your C programs
with the changed .csa and .csb, but C code doesn't raise the trap.
Modula-2 code can raise traps, so you may want to relink your Modula-2
programs with the changed libem, but you might keep your old .o files
from Modula-2. You may need to recompile your Pascal programs (delete
old .o files from Pascal) because the Pascal compiler might use _rck_.
George Koehler [Sat, 23 Dec 2017 03:32:16 +0000 (22:32 -0500)]
Optimize `mr. X, X` after some instructions.
For example, when ncg emits
slw r9,r8,r5
mr. r9,r9
then top simplifies the code to
slw. r9,r8,r5
George Koehler [Sat, 23 Dec 2017 02:18:58 +0000 (21:18 -0500)]
Remove INT32 and such. Adjust indentation.
I understand `loi 4` more easily than `loi INT32`, because `loi 4`
appears in .e files. So remove INT8, INT16, INT32, INT64.
Add a comment to explain r3 during unconditional jumps.
George Koehler [Sat, 23 Dec 2017 01:37:39 +0000 (20:37 -0500)]
Generate shorter code for ret 4 and ret 8.
George Koehler [Sat, 23 Dec 2017 00:57:42 +0000 (19:57 -0500)]
Remove two obsolete patterns.
These patterns seem to have no effect on the generated code.
George Koehler [Fri, 22 Dec 2017 22:04:16 +0000 (17:04 -0500)]
Add FRAME_V tokens for local variables.
When storing to a local, stop killing the tokens of other locals,
unless they might overlap with the stored local. This helps some
procedures that juggle locals when the locals aren't in registers.
Also use FRAME_V tokens for locals in statically enclosing procedures.
Rewrite _lxa_ as _lxl_, to skip the `addi ?,?,8` if we can add 8 to
the next constant. The PowerPC code from _lxl_ is now sometimes
better, sometimes worse than before.
The i386 table provided the idea to use %size to find overlapping
locals.
George Koehler [Thu, 21 Dec 2017 23:19:26 +0000 (18:19 -0500)]
Revise the comments in the EM tests.
You can cheat these tests if _cms_ and _cmu_ always push zero.
George Koehler [Thu, 21 Dec 2017 22:44:03 +0000 (17:44 -0500)]
Add some tests for Modula-2.
George Koehler [Tue, 19 Dec 2017 02:58:57 +0000 (21:58 -0500)]
Pass 4 bytes to fail(uint32_t)
This would become necessary if something failed on a platform with
16-bit int (EM_WSIZE == 2).
Remove unreachable `ret 0`. If reached, it wouldn't work to return
from _m_a_i_n.
George Koehler [Tue, 19 Dec 2017 02:52:13 +0000 (21:52 -0500)]
Simplify code by using cms EM_WSIZE to compare bytes.
This should work because the C compiler does it.
George Koehler [Tue, 19 Dec 2017 02:17:42 +0000 (21:17 -0500)]
Remove '\0' from output. Fix a compiler warning.
Don't output '\0' in "@@FINISHED\0".
Cast code to unsigned int. This helps platforms with 16-bit int, by
doing only the low 16 bits of the bitwise-and. It also removes the
"(warning) conversion of long to pointer loses accuracy".
George Koehler [Tue, 19 Dec 2017 01:59:04 +0000 (20:59 -0500)]
Add splitting coercions for IND_ALL_D.
Delete my wrong comment (from commits
cfbc537,
a8f62f4,
5432bd0) which
claimed that such coercions are not possible.
George Koehler [Tue, 19 Dec 2017 01:39:56 +0000 (20:39 -0500)]
Enable conditional expressions in splitting coercions.
ncgg has parsed the optional conditional expression (optexpr) of each
splitting coercion since commit
72b83cc in 1985; but for almost 33
years, ncg has ignored the expression in c2_expr.
Few tables had conditional coercions (I only found them in arm and
m68020), and no tables had conditional splitting coercions, so this
only becomes a problem now as I try to add a conditional splitting
coercion to powerpc.
George Koehler [Mon, 18 Dec 2017 17:36:10 +0000 (12:36 -0500)]
Rename two tokens. CONST_HZ was not hertz (Hz).
George Koehler [Sun, 17 Dec 2017 17:45:27 +0000 (12:45 -0500)]
In coercions, try to reuse a register with the same token.
This reduces code size.