Commit Graph

56 Commits

Author SHA1 Message Date
Scott Graham
d166a61141 Implementation of Windows amd64_win target
This is an implementation of the Windows ABI. It supports most features
(struct passing/returning, varargs, env). TLS is not yet supported.

This patch does not actually port QBE to Windows, it only allows QBE to
generate correct asm to target Windows. As a result, testing is
accomplished on a Linux host, by using a cross-compiling toolchain, and
running the resulting binaries by using wine. See:

	TARGET=amd64_win tools/test.sh all

A few cross-platform tests were changed from 'long' to 'long long' in
driver code because long in C does not match the size of a QBE 'l' on
Windows.
2026-02-12 09:17:17 +01:00
Roland Paterson-Jones
5c1eb24e2c If-conversion RFC 4 - x86 only (for now), use cmovXX
Replacement of tiny conditional jump graphlets with
conditional move instructions.

Currently enabled only for x86. Arm64 support using cselXX
will be essentially identical.

Adds (internal) frontend sel0/sel1 ops with flag-specific
backend xselXX following jnz implementation pattern.

Testing: standard QBE, cproc, harec, hare, roland
2026-01-13 18:11:30 +01:00
Antonio Terceiro
789e38fdb2 Makefile: add explicit target to test the x86_64 backend
When developing on an arm64 machine, it's useful to be able to test the
x86_64 target.
2025-03-15 14:40:55 +01:00
Roland Paterson-Jones
1cb255cb04 Get rid of movins() infra. 2025-03-14 13:07:40 +01:00
Roland Paterson-Jones
c2ff93e75e Global Value Numbering / Global Code Motion
More or less as proposed in its ninth iteration with the
addition of a gcmmove() functionality to restore coherent
local schedules.

Changes since RFC 8:

Features:

 - generalization of phi 1/0 detection
 - collapse linear jmp chains before GVN; simplifies if-graph
     detection used in 0/non-0 value inference and if-elim...
 - infer 0/non-0 values from dominating blk jnz; eliminates
     redundant cmp eq/ne 0 and associated jnz/blocks, for example
     redundant null pointer checks (hare codebase likes this)
 - remove (emergent) empty if-then-else graphlets between GVN and
     GCM; improves GCM instruction placement, particularly cmps.
 - merge %addr =l add %addr1, N sequences - reduces tmp count,
     register pressure.
 - squash consecutive associative ops with constant args, e.g.
     t1 = add t, N ... t2 = add t2, M -> t2 = add t, N+M

Bug Fixes:

 - remove "cmp eq/ne of non-identical RCon's " in copyref().
   RCon's are not guaranteed to be dedup'ed, and symbols can
   alias.

Codebase:

  - moved some stuff into cfg.c including blkmerge()
  - some refactoring in gvn.c
  - simplification of reassoc.c - always reassoc all cmp ops
      and Kl add %t, N. Better on coremark, smaller codebase.
  - minor simplification of movins() - use vins

Testing - standard QBE, cproc, hare, harec, coremark
          [still have Rust build issues with latest roland]

Benchmark
- coremark is ~15%+ faster than master
- hare "HARETEST_INCLUDE='slow' make check" ~8% faster
    (crypto::sha1::sha1_1gb is biggest obvious win - ~25% faster)

Changes since RFC 7:

Bug fixes:

- remove isbad4gcm() in GVN/GCM - it is unsound due to different state
    at GVN vs GCM time; replace with "reassociation" pass after GCM
- fix intra-blk use-before-def after GCM
- prevent GVN from deduping trapping instructions cos GCM will not
    move them
- remove cmp eq/ne identical arg copy detection for floating point, it
    is not valid for NaN
- fix cges/cged flagged as commutative in ops.h instead of cnes/cned
    respectively; just a typo

Minor features:

- copy detection handles cmp le/lt/ge/gt with identical args
- treat (integer) div/rem by non-zero constant as non-trapping
- eliminate add N/sub N pairs in copy detection
- maintain accurate tmp use in GVN; not strictly necessary but enables
    interim global state sanity checking
- "reassociation" of trivial constant offset load/store addresses, and
    cmp ops with point-of-use in pass after GCM
- normalise commutative op arg order - e.g. op con, tmp -> op tmp, con
    to simplify copy detection and GVN instruction dedup

Codebase:

- split out core copy detection and constant folding (back) out into
    copy.c, fold.c respectively; gvn.c was getting monolithic
- generic support for instruction moving in ins.c - used by GCM and
    reassoc
- new reassociation pass in reassoc.c
- other minor clean-up/refactor

Changes since RFC 6:

- More ext elimination in GVN by examination of def and use bit width
- elimination of redundant and mask by bit width examination
- Incorporation of Song's patch

Changes since RFC 5:

- avoidance of "bad" candidates for GVN/GCM - trivial address offset
    calculations, and comparisons
- more copy detection mostly around boolean values
- allow elimination of unused load, alloc, trapping instructions
- detection of trivial boolean v ? 1 : 0 phi patterns
- bug fix for (removal of) "chg" optimisation in ins recreation - it
    was missing removal of unused instructions in some cases

ifelim() between GVN and GCM; deeper nopunused()
2025-03-14 09:58:37 +01:00
Quentin Carbonneaux
fc98435f81 add "make wc" 2024-04-12 11:49:00 +02:00
Nguyễn Gia Phong
190fd3fb09 declare check-rv64 as a phony make target
References: 4e93eeaa3b ("add rv64 backend")
2024-03-07 16:44:48 +01:00
Lorenz (xha)
00501eeb6e hard-code $(CC) to equal "cc"
this fixes the build on FreeBSD, where the value of $(CC) recently
changed from "cc" (13.2) to "c99" (14).

Signed-off-by: Lorenz (xha) <me@xha.li>
2023-12-30 15:50:35 +01:00
Josiah Frentsos
d023bdaa6b Fix architecture detection on OpenBSD/arm64 2023-09-25 09:49:35 +02:00
Quentin Carbonneaux
011dfc839d silence format warning more reliably 2023-03-16 16:22:11 +01:00
Quentin Carbonneaux
6f45894c7f silence some warnings 2023-03-15 22:07:18 +01:00
Quentin Carbonneaux
26c1c30b7d new blit instruction 2022-12-14 23:18:26 +01:00
Quentin Carbonneaux
79f3673d20 new arm64_apple target
Should make qbe work on apple
arm-based hardware.
2022-10-03 10:41:26 +02:00
Quentin Carbonneaux
a9a70e30a8 add new target-specific abi0 pass
The general idea is to give abis a
chance to talk before we've done all
the optimizations. Currently, all
targets eliminate {par,arg,ret}{sb,ub,...}
during this pass. The forthcoming
arm64_apple will, however, insert
proper extensions during abi0.

Moving forward abis can, for example,
lower small-aggregates passing there
so that memory optimizations can
interact better with function calls.
2022-10-03 10:41:03 +02:00
Quentin Carbonneaux
8dddb971d9 drop -G flag and add target amd64_apple
apple support is more than assembly syntax
in case of arm64 machines, and apple syntax
is currently useless in all cases but amd64;
rather than having a -G option that only
makes sense with amd64, we add a new target
amd64_apple
2022-08-31 21:42:49 +02:00
Roberto E. Vargas Caballero
9b4bb8d224 Makefile: Avoid double macro expansion in targets
POSIX specification stays:

        string1 = [string2]
        ...
        Macro expansions in string1 of macro definition lines shall
        be evaluated when read. Macro expansions in string2 of macro
        definition lines shall be performed when the macro identified
        by string1 is expanded in a rule or command.

It means that recursive macro expansion is not guaranteed to work in
a portable Make. Also, as make is a declarative language makes more
sense to declare your targets as a primary concern instead of
derivating them from a informational macro like SRC that is only
used in a rule command.
2022-07-01 13:17:09 +02:00
Quentin Carbonneaux
cd778b44ba install with install -m755 2022-06-16 09:49:09 +02:00
illiliti
6cd5f70286 Makefile: POSIXify
Makefile now compatible with gmake, bmake, smake and pdpmake.
2022-06-14 13:58:01 +02:00
Quentin Carbonneaux
9a3e131cf7 install in /usr/local by default 2022-05-12 11:36:25 +02:00
Michael Forney
4e93eeaa3b add rv64 backend
It is mostly complete, but still has a few ABI bugs when passing
floats in structs, or when structs are passed partly in register,
and partly on stack.
2022-02-17 22:43:12 +01:00
Michael Forney
2a60575f53 Fix config.h dependency when OBJDIR != obj 2019-04-26 14:12:26 +02:00
Michael Forney
636568dcba Fix default config.h for arm64 2019-04-24 11:17:30 +02:00
Quentin Carbonneaux
5fde07c211 add handy src target to the Makefile
Intended usage: c_count `make src` (or similar).
2017-04-08 22:10:02 -04:00
Quentin Carbonneaux
f4ddc9e54e enable arm64 tests
The vararg tests had to be changed because
va_list is 32-bit wide on arm.  The astute
reader will notice that the way we pass
va_list values is wrong, we should be using
the ':valist' type as defined below instead
of 'l'.  But eh, that works for now, because
of the ABI.

    type :valist = align 8 { 32 }
2017-04-08 22:10:01 -04:00
Quentin Carbonneaux
e4bc35149c add cross testing for arm64 2017-04-08 22:10:01 -04:00
Quentin Carbonneaux
61090c758d new arm64 backend, yeepee 2017-04-08 22:09:55 -04:00
Quentin Carbonneaux
49a4593c33 prepare for multi-target
This big diff does multiple changes to allow
the addition of new targets to qbe.  The
changes are listed below in decreasing order
of impact.

1. Add a new Target structure.

To add support for a given target, one has to
implement all the members of the Target
structure.  All the source files where changed
to use this interface where needed.

2. Single out amd64-specific code.

In this commit, the amd64 target T_amd64_sysv
is the only target available, it is implemented
in the amd64/ directory.  All the non-static
items in this directory are prefixed with either
amd64_ or amd64_sysv (for items that are
specific to the System V ABI).

3. Centralize Ops information.

There is now a file 'ops.h' that must be used to
store all the available operations together with
their metadata.  The various targets will only
select what they need; but it is beneficial that
there is only *one* place to change to add a new
instruction.

One good side effect of this change is that any
operation 'xyz' in the IL now as a corresponding
'Oxyz' in the code.

4. Misc fixes.

One notable change is that instruction selection
now generates generic comparison operations and
the lowering to the target's comparisons is done
in the emitter.

GAS directives for data are the same for many
targets, so data emission was extracted in a
file 'gas.c'.

5. Modularize the Makefile.

The Makefile now has a list of C files that
are target-independent (SRC), and one list
of C files per target.  Each target can also
use its own 'all.h' header (for example to
define registers).
2017-04-08 21:56:20 -04:00
Quentin Carbonneaux
c6f8985c23 make install/uninstall phonies 2017-02-27 12:52:24 -05:00
Quentin Rameau
1a313306d6 add install and uninstall targets to Makefile 2017-02-27 12:47:29 -05:00
Quentin Carbonneaux
2c2db15995 do sign/zero extensions removal in copy.c 2017-02-25 15:14:12 -05:00
Quentin Carbonneaux
df61decee5 start a new simplification pass 2017-02-24 15:52:56 -05:00
Quentin Carbonneaux
3f147ed2e0 implement a simple load elimination pass 2016-12-12 22:17:03 -05:00
Quentin Carbonneaux
8fdea1dd52 implement a simple alias analysis 2016-12-12 22:17:03 -05:00
Quentin Carbonneaux
12f9d16c7b create cfg.c for cfg-related functions 2016-12-12 22:16:57 -05:00
Quentin Carbonneaux
6d62e5974b add funny 80 target 2016-04-13 17:43:18 -04:00
Quentin Carbonneaux
abe45f1ab0 enable constant folding 2016-04-09 14:32:07 -04:00
Quentin Carbonneaux
f2f9e156ca default to gnu gas format 2016-04-05 17:47:42 -04:00
Quentin Carbonneaux
7d37d0a7a4 yay, support freebsd 2016-04-05 14:08:04 -04:00
Quentin Carbonneaux
23c55ceb91 respect the order of the passes 2016-03-31 17:18:33 -04:00
Quentin Carbonneaux
0a81036fa2 move abi code in a new file 2016-03-31 17:17:09 -04:00
Quentin Carbonneaux
beec05cd3b do not echo compilation commands if verbose 2016-03-29 21:53:23 -04:00
Quentin Carbonneaux
b75cb8388f new layout, put LICENSE in root 2016-03-29 10:10:22 -04:00
Quentin Carbonneaux
205221226f move check rule into src/ 2016-03-27 19:13:34 -04:00
Quentin Carbonneaux
ff79d2abae move paper synchronization to top makefile 2016-03-27 18:20:34 -04:00
Quentin Carbonneaux
e38c61d95f add centralized all and clean targets 2016-03-27 18:05:27 -04:00
Quentin Carbonneaux
6405a0742f use make variable for extensibility 2016-03-27 15:05:26 -04:00
Quentin Carbonneaux
36635660b4 extract tests out of src 2016-03-27 15:00:45 -04:00
Quentin Carbonneaux
037c716b65 move ml prototype in a subdir 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
c7ab830c22 do not remove t subdir while cleaning 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
bab23d801e change name of test file 2015-09-15 23:01:27 -04:00