summaryrefslogtreecommitdiff
path: root/chapter22/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-05-08 17:04:02 -0700
committerCliff Click <cliffc@acm.org>2025-05-08 17:04:02 -0700
commitef35099ea5e28dd232a5aa166aa7b2be5e4abee4 (patch)
tree16e3d2900d88fb1f1647b618f1dc771ed1544bd1 /chapter22/src
parent6851144b727ac7e98600e2a4d70d5476cf74484e (diff)
downloadSimple-ef35099ea5e28dd232a5aa166aa7b2be5e4abee4.tar.gz
Simple-ef35099ea5e28dd232a5aa166aa7b2be5e4abee4.zip
Progress towards a 1st "real" program
Parser a 'char' MemAddX86 kills flags, uses `inc` form for +1 GCM can skip anti-deps for missing aliases
Diffstat (limited to 'chapter22/src')
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/Parser.java5
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java5
3 files changed, 9 insertions, 3 deletions
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/Parser.java b/chapter22/src/main/java/com/seaofnodes/simple/Parser.java
index 07fbdd5b..9c22fc43 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/Parser.java
@@ -1116,6 +1116,7 @@ public class Parser {
if( matchx("true" ) ) return con(1);
if( matchx("false") ) return ZERO;
if( matchx("null" ) ) return NIL;
+ if( match ("'" ) ) return parseChar();
if( match ("(" ) ) return require(parseAsgn(), ")");
if( matchx("new" ) ) return alloc();
if( match ("{" ) ) return require(func(),"}");
@@ -1548,6 +1549,10 @@ public class Parser {
return new String(_lexer._input,start,pos()-start-1);
}
+ // Already parsed "'"
+ private Node parseChar() {
+ return require(con(TypeInteger.constant(_lexer.nextChar())),"'");
+ }
//////////////////////////////////
// Utilities for lexical analysis
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java b/chapter22/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
index 3de66626..7e0a58ac 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
@@ -273,7 +273,7 @@ public abstract class GlobalCodeMotion {
for( Node mem : load.mem()._outputs ) {
switch( mem ) {
case MemOpNode st:
- if( !st._isLoad ) {
+ if( !st._isLoad && load._alias == st._alias ) {
assert late[mem._nid] != null;
lca = anti_dep( load, late[mem._nid], mem.cfg0(), lca, st );
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java
index a97f3d9f..f0d01b3d 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java
@@ -13,6 +13,7 @@ public class MemAddX86 extends MemOpX86 {
}
// Register mask allowed as a result. 0 for no register.
@Override public RegMask outregmap() { return null; }
+ @Override public RegMask killmap() { return x86_64_v2.FLAGS_MASK; }
@Override public void encoding( Encoding enc ) {
// add something to memory
// REX.W + 01 /r | REX.W + 81 /0 id
@@ -23,11 +24,11 @@ public class MemAddX86 extends MemOpX86 {
enc.add1(x86_64_v2.rex(src, ptr, idx));
// opcode
- enc.add1( src == -1 ? 0x81: 0x01);
+ enc.add1( src == -1 ? (_imm==1 ? 0xFF : 0x81): 0x01);
// includes modrm
x86_64_v2.indirectAdr(_scale, idx, ptr, _off, src == -1 ? 0 : src, enc);
- if( src == -1 ) enc.add4(_imm);
+ if( src == -1 && _imm!=1 ) enc.add4(_imm);
}
// General form: "add [base + idx<<2 + 12] += src"
@Override public void asm(CodeGen code, SB sb) {