From 300d2a9c3672acacc8bdd8d5370a424651a00571 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 18 Oct 2026 22:09:58 -0700 Subject: Cleanup & backport The phase rework, made new phases explicit and add them to the CodeGen driver. Fix the flag-spilling on X86 and ARM. Fix the GCM conservative anti-deps and backport. --- isa/src/main/java/com/seaofnodes/isa/Arm64.java | 6 ++++++ isa/src/main/java/com/seaofnodes/isa/X86.java | 7 +++++++ 2 files changed, 13 insertions(+) (limited to 'isa/src/main') diff --git a/isa/src/main/java/com/seaofnodes/isa/Arm64.java b/isa/src/main/java/com/seaofnodes/isa/Arm64.java index ce7f7b11..5edb2f3c 100644 --- a/isa/src/main/java/com/seaofnodes/isa/Arm64.java +++ b/isa/src/main/java/com/seaofnodes/isa/Arm64.java @@ -4,6 +4,12 @@ package com.seaofnodes.isa; public final class Arm64 { private Arm64() {} + // MRS Xt,NZCV / MSR NZCV,Xt. Register 31 denotes XZR. + public static int flags(int reg, boolean toFlags) { + assert 0<=reg && reg<32; + return (toFlags ? 0xD51B4200 : 0xD53B4200) | reg; + } + public static final int OP_ADD = 0b10_001_011; public static final int OPF_ADD = 0b00_011_110; public static final int OPF_OP_ADD = 0b00_101_0; diff --git a/isa/src/main/java/com/seaofnodes/isa/X86.java b/isa/src/main/java/com/seaofnodes/isa/X86.java index 78fa3da5..d5150a31 100644 --- a/isa/src/main/java/com/seaofnodes/isa/X86.java +++ b/isa/src/main/java/com/seaofnodes/isa/X86.java @@ -162,11 +162,18 @@ public final class X86 { } } public static void flags(CodeSink out, int reg, boolean toFlags) { + assert 0<=reg && reg<16 && reg!=4; if( !toFlags ) out.add1(0x9C); // PUSHF rexF(0,reg,-1,false,out); out.add1((toFlags ? 0x50 : 0x58)+(reg&7)); if( toFlags ) out.add1(0x9D); // POPF } + public static void flagsStack(CodeSink out, int offset, boolean toFlags) { + if( !toFlags ) out.add1(0x9C); // PUSHFQ + // POP's destination uses the restored RSP, so offset needs no adjustment. + memory(out,0,toFlags ? 0xFF : 0x8F,false,toFlags ? 6 : 0,4,-1,offset,0); + if( toFlags ) out.add1(0x9D); // POPFQ + } public static void stackCopy(CodeSink out, int srcOffset, int dstOffset) { memory(out,0,0xFF,false,6,4,-1,srcOffset,0); // PUSH [rsp+srcOffset] memory(out,0,0x8F,false,0,4,-1,dstOffset,0); // POP uses the restored rsp. -- cgit v1.2.3