David Given
f1b128baeb
Signed comparisons now work correctly; sadly, Star Trek increases from 39656 to
...
39726 bytes. Note that the emulator doesn't set P/V correctly and all the tests
fail. Testing in z80ex works fine.
2019-02-11 20:46:06 +01:00
David Given
fca54ccc1b
Improve subtractions, using dad and inline constants where possible. Shrinks
...
Star Trek from 39740 to 39656 bytes.
2019-02-10 19:40:48 +01:00
David Given
7d34cd7407
Simplify simple comparisons and use inlie constants where possible. Reduces
...
Star Trek from 39771 to 39740 bytes.
2019-02-10 19:22:43 +01:00
David Given
35d1f36ca4
Use pop rather than inx;inx to retract the stack; consumes a register but
...
halves the number of calls. Reduces Star Trek from 39976 to 39771 bytes.
2019-02-10 18:57:20 +01:00
David Given
b34ff2bdec
Teach the i80 code generator how to do left shifts by using dad hl; prevents it
...
from calling out to .sli2 for simple shifts. Shrinks Star Trek from 40055 bytes
to 39976.
2019-02-10 18:44:47 +01:00
David Given
c95d5db372
Replace mkstemp() with the more modern and safer and simpler tmpfile().
2019-02-10 14:36:15 +01:00
David Given
63fa647bc9
freopen() appears to be problematic on OSX; as it's only ever used to rewind
...
files, replace with rewind().
2019-02-10 14:32:17 +01:00
David Given
1dfafe070c
Better error reporting.
2019-02-10 14:19:18 +01:00
David Given
58698bed19
Removed a whole bunch of old strcpy() prototypes in favour of <string.h>.
2019-02-10 13:20:04 +01:00
David Given
10b509d6b6
Add rst 3 to get the address of a frame variable; lots of rule overhaulage.
...
Reduces Star Trek from 41821 to 41055 bytes.
2019-02-09 13:29:41 +01:00
David Given
0de5001f82
Make sign extension much less horrible.
2019-02-08 23:16:57 +01:00
David Given
0ac145a0d1
Add tests for simple and, or, and xor; drastically improve the i80 code
...
generation for these.
2019-02-08 22:38:07 +01:00
David Given
a91ab5c599
Somehow the implementation of rst 2 got lost, with hilarious results. Also fix
...
some register corruption issues (I hope).
2019-02-08 21:35:14 +01:00
David Given
d319c7d679
Fix swapped bytes in probyte which was causing junk stack frames.
2019-02-08 08:09:55 +01:00
David Given
a5bf2932c8
Add rst 1 to store frame variables. Reduces Star Trek from 42339 to 41821
...
bytes.
2019-02-07 09:31:38 +01:00
David Given
67a9be26d1
Fix warnings.
2019-02-07 09:09:31 +01:00
David Given
9d8ea79c7f
rst 1 now takes an eight-bit parameter, not a 16 bit one. Reduces Star Trek
...
again from 43205 to 42339 bytes.
2019-02-07 08:45:20 +01:00
David Given
5ac280026e
Experimentally use rst 1 to optimise frame variable loads. Reduces Star Trek
...
from 43892 to 43205 bytes.
2019-02-07 00:06:32 +01:00
David Given
08b92153a0
Use a helper function for cai --- only saves two bytes per invocation, but is
...
much less embarassing.
2019-02-06 20:36:23 +01:00
David Given
2b0629f87f
Common out boilerplate function prologue code; shrinks Star Trek from 44256 to
...
43892 bytes.
2019-02-06 16:06:07 +01:00
David Given
b77f616598
Run through clang-format before editing.
2019-02-06 11:50:05 +01:00
David Given
02779325ab
Move the standard ret boilerplate into a helper procedure, to save a little
...
space.
2019-02-06 08:08:11 +01:00
David Given
ed91ea4371
When parsing constants which don't fit into an arith, handle overflow properly
...
(and don't turn them all into INT_MAX...).
2018-09-22 12:45:59 +02:00
David Given
79e7636537
Teach the code generator about the zero register and how to efficiently access
...
the stack.
2018-09-22 11:49:13 +02:00
David Given
99fcde69dc
Take hreg aliases into account when finding evicted registers and performing
...
the register shuffle dance.
2018-09-22 11:19:50 +02:00
David Given
bbb708717a
Add the OPTIONS clause to the mcgg grammar; add an optional pass which converts
...
sequences of PUSHes to a single STACKADJUST followed by STOREs. This should
dramatically improve code on stack-unfriendly architectures like MIPS.
2018-09-22 11:19:00 +02:00
David Given
985d3dc7d1
Remove some old, hopefully unused PowerPC code. Teach the code generator about
...
non-volatile long registers.
2018-09-20 23:30:38 +02:00
David Given
65a20ce2d6
Fix subtle register corruption bug where aliases weren't taken into account
...
when assigning input registers to phis, which could cause the same hreg to be
assigned to two vregs of different types. Also improve tracing.
2018-09-20 23:24:46 +02:00
David Given
cb20856aea
A few more minor optimisations.
2018-09-20 00:39:13 +02:00
David Given
ac856f3b09
The approach I was taking to csa and csb turns out not to work --- critical
...
edge splitting can cause new basic blocks to be added to the graph, but while
the graph itself gets properly rewritten the descriptor tables can't be updated
to take these into account, so they end up pointing at the wrong blocks. This
causes really hard-to-debug problems.
The new approach is to parse the descriptor blocks and then generate a
comparison chain. Brute force, but much easier for the compiler to reason
about.
2018-09-20 00:12:03 +02:00
David Given
ac921080b7
Fix incorrect ori encoding.
2018-09-20 00:06:26 +02:00
David Given
8fda024ec8
Remember to save longs and doubles. Yikes.
2018-09-19 00:09:50 +02:00
David Given
d23d2dd1b3
Loads and stores (except longs, which are difficult) are now loaded with two
...
instructions rather than three.
2018-09-18 23:38:37 +02:00
David Given
52ee317878
Fixed some bad mcg ir code generation: only nodes which have been appendir'd
...
may be used multiple times.
2018-09-18 23:32:53 +02:00
David Given
692caa2b0a
Add unsigned comparison rules.
2018-09-18 00:19:40 +02:00
David Given
f362d12dee
Add extern declaration which I forget to check in.
2018-09-17 23:59:49 +02:00
David Given
fe177bd688
Add specialist rules for signed integer comparisons; much better code.
2018-09-17 23:53:18 +02:00
David Given
ec0891469f
Array descriptor ranges are inclusive; adjust aar and the tests to check for
...
this. All the tests except rotate build now!
2018-09-17 19:34:38 +01:00
David Given
f61500c51b
Fix lar and sar, which were horribly, horribly broken. Add tests.
2018-09-17 18:44:17 +01:00
David Given
abb7e3e105
Fix aar; add test.
2018-09-17 16:59:45 +01:00
David Given
b665efca04
ACK loi 1 and sti 1 load and store unsigned bytes. I think.
2018-09-17 15:03:44 +01:00
David Given
c2dc1e184e
rotate() now generates valid code.
2018-09-17 13:13:39 +01:00
David Given
0202ac8700
Fix bls4.
2018-09-17 12:53:27 +01:00
David Given
1e073e944a
Added cms, and a test for it.
2018-09-17 12:42:10 +01:00
David Given
0b65591972
Add hacky 64-bit comparisons (used by M2).
2018-09-17 12:16:17 +01:00
David Given
15ae171aef
Added a test for set. Fix mips set implementation.
2018-09-17 11:56:15 +01:00
David Given
7efb749003
Set fixes; also add discrete tests for and, ior, xor.
2018-09-14 14:13:35 +01:00
David Given
08b1e8d71b
Make inn work; fix broken 64-bit loads and stores.
2018-09-14 13:48:43 +02:00
David Given
5d0876a30b
Implement a working .trp.
2018-09-14 12:26:27 +02:00
David Given
ba0849c87c
Remove la; turns out that the assembler gets upset if you ask it to
...
generate more than one fixup per instruction (I think).
2018-09-14 11:30:15 +02:00
David Given
c4e3d0903e
Bugfix rck.
2018-09-14 00:38:31 +02:00
David Given
8c0b2f8aee
Fix csa and csb.
2018-09-14 00:15:43 +02:00
David Given
9b0a1c1c10
Make work with clang.
2018-09-14 00:04:25 +02:00
David Given
57338b1991
Fix an incorrect instruction, and incredibly broken li handling.
2018-09-12 23:59:09 +02:00
David Given
ecb3395aba
Converting floats and doubles to integers now works, as much as these ever do
...
on MIPS; turns out that it can't (or at least can't in qemu) reliably turn
INT_MIN from a double to an int.
2018-09-12 23:58:48 +02:00
David Given
642956fa2f
mcg now uses dataf4 and dataf8 to emit floating point constants, and so doesn't
...
need flt_arith any more. (And also generates them correctly on little-endian
systems.) as now parses numbers properly, doesn't trash memory all over the
place, and can handle negative numbers.
2018-09-12 23:19:32 +02:00
David Given
8105281534
Make sure li works properly when loading fixed up values which end up as 0. Use
...
lui rather than li to load high values.
2018-09-12 22:28:40 +02:00
David Given
a8df9721d3
Adding new tokens to the assembler isn't quite as easy as I thought: ensure
...
that NUMBERF is stored properly in the temporary file.
2018-09-12 22:27:39 +02:00
David Given
8379969b6f
Fix an unsubtle bug where subtractions were done backwards...
2018-09-11 23:16:50 +02:00
David Given
8230ec42ac
Fix a subtle thinko which was causing bits 2-3 of jump targets to be reset.
2018-09-11 23:16:30 +02:00
David Given
0ce368324e
Add the bitset helpers. We now have enough helpers for the tests to run (and
...
massively fail).
2018-09-10 23:37:28 +02:00
David Given
2f8fe3ce6e
Do some cleanup; ha16[] and friends can now be used with li.
2018-09-10 23:37:04 +02:00
David Given
3122946a6f
Replaced some incorrect hi16s with ha16s.
2018-09-10 23:21:54 +02:00
David Given
008737ed19
Added some more very untested helper functions.
2018-09-10 23:20:52 +02:00
David Given
a1747ac916
Add the .dataf4 and .dataf8 directives to the assembler --- manually converting
...
floats and doubles to bytes is not fun. It might even work!
2018-09-10 22:56:18 +02:00
David Given
53f7de794a
Ansify.
2018-09-10 22:55:05 +02:00
David Given
976fa0efca
Clang-format before editing.
2018-09-10 22:37:04 +02:00
David Given
6275896a11
Clang-format before editing.
2018-09-10 22:25:14 +02:00
David Given
185e910246
Lots more untested helper functions.
2018-09-10 01:08:25 +02:00
David Given
f8f6fa9fc1
Added some more incredibly untested helper functions.
2018-09-10 00:21:16 +02:00
David Given
bb15c03339
Remember to preserve input registers if we're going to be reading from them
...
after writing to the output register.
2018-09-09 18:53:49 +02:00
David Given
e88670dad4
Yikes! Turns out that FPU registers are only 32 bits wide, and doubles are
...
stored in pairs, just like on the PowerPC!
2018-09-09 18:25:00 +02:00
David Given
5dfef6f180
Rework relocations again: add RELO2HI and RELO2HISAD for the high two bytes of
...
a word.
2018-09-09 14:11:11 +02:00
David Given
95dd6f0141
Fix some niggling issues --- we have our first binary now!
2018-09-09 12:24:22 +02:00
David Given
b3b7c684c6
Simplify MIPS relocations. Add RELS2 (for generic high-word relocations). Add
...
support for MIPS branch-and-jump relocations.
2018-09-09 12:23:59 +02:00
David Given
0d8d98fd0f
Warning fix.
2018-09-09 12:22:59 +02:00
David Given
d2a1d4dcda
Added some very untested csa and csb implementations, based on the PowerPC
...
ones.
2018-09-08 23:12:57 +02:00
David Given
75308901bc
Added hi[] and lo[] functions to the assembler; fix things enough that we now
...
get to the point of failing to link programs.
2018-09-08 22:42:06 +02:00
David Given
379c1a4a3c
Rework floating point conversion. Bash enough of the table into workingness
...
that the libraries build now.
2018-09-08 22:06:38 +02:00
David Given
d2c14ca44f
Precisely one stack hreg gets allocated for each vreg/congruence group for
...
eviction; this prevents us from having to worry about moving values from stack
slot to stack slot, which is hard.
2018-09-08 18:59:55 +02:00
David Given
b7a1c96986
MIPS appears to hate converting unsigneds to floats and vice versa.
2018-09-05 23:53:38 +02:00
David Given
fc0b0ae178
(Slightly) better errors on phi congruence group mismatches.
2018-09-05 23:53:08 +02:00
David Given
7fbce066f8
We attempt to compile the first library function; we fail.
2018-09-05 00:13:01 +02:00
David Given
26fe3f7530
Added library skeletons.
2018-09-05 00:07:07 +02:00
David Given
26c0228b14
The examples all compile now (probably incorrectly, and the libc doesn't
...
compile yet).
2018-09-04 23:55:28 +02:00
David Given
9d80756253
Lots of assembler and rule bugfixing.
2018-09-04 23:43:24 +02:00
David Given
fe5ca5a85f
Added li and la instructions.
2018-09-03 22:47:41 +02:00
David Given
26f9b4ceae
Add in floating point support to the code generator.
2018-09-03 22:06:05 +02:00
David Given
f8e71d888b
Add some painfully untested FPU instructions.
2018-09-02 21:36:09 +02:00
David Given
1d6ecddcf4
The MIPS backend is still full of holes, and cut-and-pasted PowerPC code, but
...
is beginning to look like an actual code generator.
2018-09-02 18:57:25 +02:00
David Given
4741ed8e14
Add a completely non-tested table-based MIPS assembler.
2018-09-01 19:35:31 +02:00
David Given
d623440c77
Add the core of a simple em22 platform. Unfortunately it doesn't work; the old
...
em libmon vanished decades ago (or never existed), and also ass appears to have
a different idea of what the em opcodes are to everything else and gets
confused.
2018-06-10 20:25:48 +09:00
David Given
911ce7ceb5
Crudely tweak some of the prototypes to please clang, which is pickier about
...
K&R C than gcc is.
2018-06-02 21:31:18 +02:00
David Given
05ddefad65
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
2018-06-02 18:02:51 +02:00
George Koehler
1df4db99c9
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.
2018-04-25 22:48:28 -04:00
George Koehler
93e01eb5d1
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.
2018-04-25 16:09:56 -04:00
George Koehler
b9b3428e01
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.
2018-04-25 00:34:10 -04:00
David Given
aabf0bdd69
Merge pull request #73 from kernigh/kernigh-pr
...
better code from PowerPC ncg and mcg
2018-03-13 13:57:28 +01:00
George Koehler
b1badf1851
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.
2018-03-07 13:37:31 -05:00
David Given
4b5a7fee14
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.
2018-02-23 22:31:46 +01:00