summaryrefslogtreecommitdiff
path: root/isa/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'isa/src/main')
-rw-r--r--isa/src/main/java/com/seaofnodes/isa/Arm64.java6
-rw-r--r--isa/src/main/java/com/seaofnodes/isa/X86.java7
2 files changed, 13 insertions, 0 deletions
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.