diff options
Diffstat (limited to 'isa/src/main')
| -rw-r--r-- | isa/src/main/java/com/seaofnodes/isa/Arm64.java | 6 | ||||
| -rw-r--r-- | isa/src/main/java/com/seaofnodes/isa/X86.java | 7 |
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. |
