Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/56901 )
Change subject: arch-x86: Make ucode labels simpler and more consistent.
......................................................................
arch-x86: Make ucode labels simpler and more consistent.
Referring to labels from br microops is now simpler. Local labels
(either within a macroop or the ROM), are specified as a bare text
constant which holds the name of the label. To branch to the ROM
explicitly, you wrap the same sort of string in RomLabel(). That
instantiates an instance of that class, which tells the Br microop to
treat that label differently.
Change-Id: I351f843ffef8e2f5dab020f3dcd36612fff08f56
---
M
src/arch/x86/microcode/general_purpose/arithmetic/multiply_and_divide.ucode
M src/arch/x86/microcode/general_purpose/compare_and_test/bit_scan.ucode
M
src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
M src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
M src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
M src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
M
src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
M src/arch/x86/microcode/general_purpose/flags/set_and_clear.ucode
M src/arch/x86/microcode/general_purpose/input_output/string_io.ucode
M src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
M src/arch/x86/microcode/general_purpose/semaphores.ucode
M src/arch/x86/microcode/general_purpose/string/compare_strings.ucode
M src/arch/x86/microcode/general_purpose/string/load_string.ucode
M src/arch/x86/microcode/general_purpose/string/move_string.ucode
M src/arch/x86/microcode/general_purpose/string/scan_string.ucode
M src/arch/x86/microcode/general_purpose/string/store_string.ucode
M src/arch/x86/microcode/simd128/integer/shift/left_logical_shift.ucode
M src/arch/x86/microcode/simd128/integer/shift/right_logical_shift.ucode
M src/arch/x86/microcode/system/segmentation.ucode
M src/arch/x86/ucasmlib/arch/x86/microops/base.py
M src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
M src/arch/x86/ucasmlib/arch/x86/symbols.py
22 files changed, 132 insertions(+), 112 deletions(-)
diff --git
a/src/arch/x86/microcode/general_purpose/arithmetic/multiply_and_divide.ucode
b/src/arch/x86/microcode/general_purpose/arithmetic/multiply_and_divide.ucode
index b7e0e37..87e85e7 100644
---
a/src/arch/x86/microcode/general_purpose/arithmetic/multiply_and_divide.ucode
+++
b/src/arch/x86/microcode/general_purpose/arithmetic/multiply_and_divide.ucode
@@ -252,7 +252,7 @@
divLoopTop:
div2 t1, rax, t1, dataSize=1
div2 t1, rax, t1, flags=(EZF,), dataSize=1
- br label("divLoopTop"), flags=(nCEZF,)
+ br "divLoopTop", flags=(nCEZF,)
#Unload the answer
divq rax, dataSize=1
@@ -300,7 +300,7 @@
div2 t1, rax, t1
div2 t1, rax, t1
div2 t1, rax, t1, flags=(EZF,)
- br label("divLoopTop"), flags=(nCEZF,)
+ br "divLoopTop", flags=(nCEZF,)
#Unload the answer
divq rax
@@ -367,7 +367,7 @@
divLoopTop:
div2 t4, t1, t4, dataSize=1
div2 t4, t1, t4, flags=(EZF,), dataSize=1
- br label("divLoopTop"), flags=(nCEZF,)
+ br "divLoopTop", flags=(nCEZF,)
#Unload the answer
divq t5, dataSize=1
@@ -463,7 +463,7 @@
div2 t4, t1, t4
div2 t4, t1, t4
div2 t4, t1, t4, flags=(EZF,)
- br label("divLoopTop"), flags=(nCEZF,)
+ br "divLoopTop", flags=(nCEZF,)
#Unload the answer
divq t5
diff --git
a/src/arch/x86/microcode/general_purpose/compare_and_test/bit_scan.ucode
b/src/arch/x86/microcode/general_purpose/compare_and_test/bit_scan.ucode
index f8b2854..47a01e3 100644
--- a/src/arch/x86/microcode/general_purpose/compare_and_test/bit_scan.ucode
+++ b/src/arch/x86/microcode/general_purpose/compare_and_test/bit_scan.ucode
@@ -42,7 +42,7 @@
# Determine if the input was zero, and also move it to a temp reg.
mov t1, t1, t0, dataSize=8
and t1, regm, regm, flags=(ZF,)
- br label("end"), flags=(CZF,)
+ br "end", flags=(CZF,)
# Zero out the result register
movi reg, reg, 0x0
@@ -94,7 +94,7 @@
# Determine if the input was zero, and also move it to a temp reg.
and t1, t1, t1, flags=(ZF,)
- br label("end"), flags=(CZF,)
+ br "end", flags=(CZF,)
# Zero out the result register
movi reg, reg, 0x0
@@ -147,7 +147,7 @@
# Determine if the input was zero, and also move it to a temp reg.
and t1, t1, t1, flags=(ZF,)
- br label("end"), flags=(CZF,)
+ br "end", flags=(CZF,)
# Zero out the result register
movi reg, reg, 0x0
@@ -197,7 +197,7 @@
# Determine if the input was zero, and also move it to a temp reg.
mov t1, t1, t0, dataSize=8
and t1, regm, regm, flags=(ZF,)
- br label("end"), flags=(CZF,)
+ br "end", flags=(CZF,)
# Zero out the result register
movi reg, reg, 0
@@ -253,7 +253,7 @@
# Determine if the input was zero, and also move it to a temp reg.
and t1, t1, t1, flags=(ZF,)
- br label("end"), flags=(CZF,)
+ br "end", flags=(CZF,)
# Zero out the result register
mov reg, reg, t0
@@ -310,7 +310,7 @@
# Determine if the input was zero, and also move it to a temp reg.
and t1, t1, t1, flags=(ZF,)
- br label("end"), flags=(CZF,)
+ br "end", flags=(CZF,)
# Zero out the result register
mov reg, reg, t0
diff --git
a/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
b/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
index b2018f4..4415ab0 100644
---
a/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
+++
b/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
@@ -100,15 +100,15 @@
#temp_RFLAGS.VM != 1
rcri t0, t3, 18, flags=(ECF,)
- br label("protToVirtFallThrough"), flags=(nCECF,)
+ br "protToVirtFallThrough", flags=(nCECF,)
#CPL=0
andi t0, t4, 0x30, flags=(EZF,)
- br label("protToVirtFallThrough"), flags=(nCEZF,)
+ br "protToVirtFallThrough", flags=(nCEZF,)
#(LEGACY_MODE)
rcri t0, t4, 1, flags=(ECF,)
- br label("protToVirtFallThrough"), flags=(nCECF,)
+ br "protToVirtFallThrough", flags=(nCECF,)
panic "iret to virtual mode not supported"
@@ -126,12 +126,12 @@
#CS = READ_DESCRIPTOR (temp_CS, iret_chk)
andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
- br label("processCSDescriptor"), flags=(CEZF,)
+ br "processCSDescriptor", flags=(CEZF,)
andi t6, t2, 0xF8, dataSize=8
andi t0, t2, 0x4, flags=(EZF,), dataSize=2
- br label("globalCSDescriptor"), flags=(CEZF,)
+ br "globalCSDescriptor", flags=(CEZF,)
ld t8, tsl, [1, t0, t6], dataSize=8, addressSize=8, atCPL0=True
- br label("processCSDescriptor")
+ br "processCSDescriptor"
globalCSDescriptor:
ld t8, tsg, [1, t0, t6], dataSize=8, addressSize=8, atCPL0=True
processCSDescriptor:
@@ -149,7 +149,7 @@
andi t0, t4, 0xE, flags=(EZF,)
# Since we just found out we're in 64 bit mode, take advantage and
# do the appropriate RIP checks.
- br label("doPopStackStuffAndCheckRIP"), flags=(CEZF,)
+ br "doPopStackStuffAndCheckRIP", flags=(CEZF,)
# Here, we know we're -not- in 64 bit mode, so we should do the
# appropriate/other RIP checks.
@@ -162,17 +162,17 @@
srli t7, t4, 4
xor t7, t7, t5
andi t0, t7, 0x3, flags=(EZF,)
- br label("doPopStackStuff"), flags=(nCEZF,)
+ br "doPopStackStuff", flags=(nCEZF,)
# We can modify user visible state here because we're know
# we're done with things that can fault.
addi rsp, rsp, "3 * env.dataSize", dataSize=ssz
- br label("fallThroughPopStackStuff")
+ br "fallThroughPopStackStuff"
doPopStackStuffAndCheckRIP:
# Check if the RIP is canonical.
srai t7, t1, 47, flags=(EZF,), dataSize=8
# if t7 isn't 0 or -1, it wasn't canonical.
- br label("doPopStackStuff"), flags=(CEZF,)
+ br "doPopStackStuff", flags=(CEZF,)
addi t0, t7, 1, flags=(EZF,), dataSize=8
fault "std::make_shared<GeneralProtection>(0)", flags=(nCEZF,)
@@ -183,12 +183,12 @@
ld t9, ss, [1, t0, rsp], "4 * env.dataSize", addressSize=ssz
# SS = READ_DESCRIPTOR (temp_SS, ss_chk)
andi t0, t9, 0xFC, flags=(EZF,), dataSize=2
- br label("processSSDescriptor"), flags=(CEZF,)
+ br "processSSDescriptor", flags=(CEZF,)
andi t7, t9, 0xF8, dataSize=8
andi t0, t9, 0x4, flags=(EZF,), dataSize=2
- br label("globalSSDescriptor"), flags=(CEZF,)
+ br "globalSSDescriptor", flags=(CEZF,)
ld t7, tsl, [1, t0, t7], dataSize=8, addressSize=8, atCPL0=True
- br label("processSSDescriptor")
+ br "processSSDescriptor"
globalSSDescriptor:
ld t7, tsg, [1, t0, t7], dataSize=8, addressSize=8, atCPL0=True
processSSDescriptor:
@@ -220,7 +220,7 @@
srli t7, t4, 4
xor t7, t7, t5
andi t0, t7, 0x3, flags=(EZF,)
- br label("skipSegmentSquashing"), flags=(CEZF,)
+ br "skipSegmentSquashing", flags=(CEZF,)
# FOR (seg = ES, DS, FS, GS)
# IF ((seg.attr.dpl < cpl && ((seg.attr.type = 'data')
@@ -251,11 +251,11 @@
# Check if attr[11:10] is 11.
xor t7, t2, t6, dataSize=8
and t0, t7, t6, flags=(EZF,), dataSize=8
- br label("skipDSSquash"), flags=(CEZF,)
+ br "skipDSSquash", flags=(CEZF,)
# Check if !(DPL < CPL)
andi t2, t2, 0x3, dataSize=8
sub t0, t2, t5, flags=(ECF,), dataSize=8
- br label("skipDSSquash"), flags=(nCECF,)
+ br "skipDSSquash", flags=(nCECF,)
wrdl ds, t0, t0
wrsel ds, t0
@@ -266,11 +266,11 @@
# Check if attr[11:10] is 11.
xor t7, t2, t6, dataSize=8
and t0, t7, t6, flags=(EZF,), dataSize=8
- br label("skipESSquash"), flags=(CEZF,)
+ br "skipESSquash", flags=(CEZF,)
# Check if !(DPL < CPL)
andi t2, t2, 0x3, dataSize=8
sub t0, t2, t5, flags=(ECF,), dataSize=8
- br label("skipESSquash"), flags=(nCECF,)
+ br "skipESSquash", flags=(nCECF,)
wrdl es, t0, t0
wrsel es, t0
@@ -281,11 +281,11 @@
# Check if attr[11:10] is 11.
xor t7, t2, t6, dataSize=8
and t0, t7, t6, flags=(EZF,), dataSize=8
- br label("skipFSSquash"), flags=(CEZF,)
+ br "skipFSSquash", flags=(CEZF,)
# Check if !(DPL < CPL)
andi t2, t2, 0x3, dataSize=8
sub t0, t2, t5, flags=(ECF,), dataSize=8
- br label("skipFSSquash"), flags=(nCECF,)
+ br "skipFSSquash", flags=(nCECF,)
wrdl fs, t0, t0
wrsel fs, t0
@@ -296,11 +296,11 @@
# Check if attr[11:10] is 11.
xor t7, t2, t6, dataSize=8
and t0, t7, t6, flags=(EZF,), dataSize=8
- br label("skipSegmentSquashing"), flags=(CEZF,)
+ br "skipSegmentSquashing", flags=(CEZF,)
# Check if !(DPL < CPL)
andi t2, t2, 0x3, dataSize=8
sub t0, t2, t5, flags=(ECF,), dataSize=8
- br label("skipSegmentSquashing"), flags=(nCECF,)
+ br "skipSegmentSquashing", flags=(nCECF,)
wrdl gs, t0, t0
wrsel gs, t0
@@ -334,8 +334,8 @@
# Are we in long mode?
rdm5reg t5
andi t0, t5, 0x1, flags=(EZF,)
- br rom_label("longModeSoftInterrupt"), flags=(CEZF,)
- br rom_label("legacyModeInterrupt")
+ br RomLabel("longModeSoftInterrupt"), flags=(CEZF,)
+ br RomLabel("legacyModeInterrupt")
};
def macroop INT3_VIRT {
@@ -355,7 +355,7 @@
rdip t7
# Are we in long mode?
- br rom_label("longModeSoftInterrupt")
+ br RomLabel("longModeSoftInterrupt")
};
def macroop INT_PROT {
@@ -367,7 +367,7 @@
rdip t7
# Are we in long mode?
- br rom_label("legacyModeInterrupt")
+ br RomLabel("legacyModeInterrupt")
};
def macroop INT_REAL {
diff --git
a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
index ca0a0cf..4c0fb80 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
+++ b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
@@ -89,7 +89,7 @@
lea t1, seg, sib, disp, dataSize=asz
ld t2, seg, [1, t0, t1], dsz
ld t1, seg, [1, t0, t1]
- br rom_label("jmpFarWork")
+ br RomLabel("jmpFarWork")
};
def macroop JMP_FAR
@@ -103,7 +103,7 @@
lea t1, seg, riprel, disp, dataSize=asz
ld t2, seg, [1, t0, t1], dsz
ld t1, seg, [1, t0, t1]
- br rom_label("jmpFarWork")
+ br RomLabel("jmpFarWork")
};
def macroop JMP_FAR
@@ -121,7 +121,7 @@
# Get the selector into t2.
srl t2, t2, t3, dataSize=8
mov t2, t0, t2, dataSize=2
- br rom_label("jmpFarWork")
+ br RomLabel("jmpFarWork")
};
def rom
diff --git
a/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
b/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
index 99b5aed..d670151 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
+++ b/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
@@ -138,12 +138,12 @@
# Do stuff if they're equal
andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t3, t2, 0xF8, dataSize=8
andi t0, t2, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t3], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t3], dataSize=8, addressSize=8
processDescriptor:
@@ -153,7 +153,7 @@
wrdl cs, t3, t2
wrsel cs, t2
wrip t0, t1
-# br label("end")
+# br "end"
# Do other stuff if they're not.
#end:
diff --git
a/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
b/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
index 5b4a14a..dee2dfe 100644
--- a/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
+++ b/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
@@ -264,12 +264,12 @@
def macroop MOV {
.args 'S', 'R'
andi t0, regm, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, regm, 0xF8, dataSize=8
andi t0, regm, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
processDescriptor:
@@ -282,12 +282,12 @@
.args 'S', 'M'
ld t1, seg, sib, disp, dataSize=2
andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, t1, 0xF8, dataSize=8
andi t0, t1, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
processDescriptor:
@@ -301,12 +301,12 @@
rdip t7
ld t1, seg, riprel, disp, dataSize=2
andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, t1, 0xF8, dataSize=8
andi t0, t1, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
processDescriptor:
@@ -318,12 +318,12 @@
def macroop MOVSS {
.args 'S', 'R'
andi t0, regm, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, regm, 0xF8, dataSize=8
andi t0, regm, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
processDescriptor:
@@ -336,12 +336,12 @@
.args 'S', 'M'
ld t1, seg, sib, disp, dataSize=2
andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, t1, 0xF8, dataSize=8
andi t0, t1, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
processDescriptor:
@@ -355,12 +355,12 @@
rdip t7
ld t1, seg, riprel, disp, dataSize=2
andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, t1, 0xF8, dataSize=8
andi t0, t1, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
processDescriptor:
diff --git
a/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
b/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
index d45c79b..01df801 100644
---
a/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
+++
b/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
@@ -84,14 +84,14 @@
ld t1, ss, [1, t0, rsp], addressSize=ssz, dataSize=2
andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
andi t2, t1, 0xF8, dataSize=8
andi t0, t1, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor")
+ br "globalDescriptor"
ld t3, tsl, [1, t0, t2], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
globalDescriptor:
ld t3, tsg, [1, t0, t2], dataSize=8, addressSize=8
@@ -213,11 +213,11 @@
# If the nesting level is zero, skip all this stuff.
sub t0, t1, t0, flags=(EZF,), dataSize=2
- br label("skipLoop"), flags=(CEZF,)
+ br "skipLoop", flags=(CEZF,)
# If the level was 1, only push the saved rbp
subi t0, t1, 1, flags=(EZF,)
- br label("bottomOfLoop"), flags=(CEZF,)
+ br "bottomOfLoop", flags=(CEZF,)
limm t4, "-1ULL", dataSize=8
topOfLoop:
@@ -228,7 +228,7 @@
# If we're not done yet, loop
subi t4, t4, 1, dataSize=8
add t0, t4, t1, flags=(EZF,)
- br label("topOfLoop"), flags=(nCEZF,)
+ br "topOfLoop", flags=(nCEZF,)
bottomOfLoop:
# Push the old rbp onto the stack
diff --git
a/src/arch/x86/microcode/general_purpose/flags/set_and_clear.ucode
b/src/arch/x86/microcode/general_purpose/flags/set_and_clear.ucode
index 56922fd..1570564 100644
--- a/src/arch/x86/microcode/general_purpose/flags/set_and_clear.ucode
+++ b/src/arch/x86/microcode/general_purpose/flags/set_and_clear.ucode
@@ -79,7 +79,7 @@
# if !(CPL > IOPL), jump down to setting IF.
sub t0, t2, t3, flags=(ECF,), dataSize=8
- br label("setIf"), flags=(nCECF,)
+ br "setIf", flags=(nCECF,)
# if (CR4.PVI == 1 && CPL == 3) {
# } else GP
@@ -102,7 +102,7 @@
fault "std::make_shared<GeneralProtection>(0)", flags=(nCEZF,)
limm t2, "VIFBit", dataSize=8
- br label("setBitInT2")
+ br "setBitInT2"
setIf:
limm t2, "IFBit", dataSize=8
@@ -137,7 +137,7 @@
# if !(CPL > IOPL), jump down to clearing IF.
sub t0, t2, t3, flags=(ECF,), dataSize=8
- br label("maskIf"), flags=(nCECF,)
+ br "maskIf", flags=(nCECF,)
# if (CR4.PVI == 1 && CPL == 3) {
# } else GP
@@ -154,7 +154,7 @@
# RFLAGS.VIF = 0
limm t2, "~((uint64_t)VIFBit)", dataSize=8
- br label("maskWithT2")
+ br "maskWithT2"
maskIf:
limm t2, "~((uint64_t)IFBit)", dataSize=8
diff --git
a/src/arch/x86/microcode/general_purpose/input_output/string_io.ucode
b/src/arch/x86/microcode/general_purpose/input_output/string_io.ucode
index 8408945..92d0729 100644
--- a/src/arch/x86/microcode/general_purpose/input_output/string_io.ucode
+++ b/src/arch/x86/microcode/general_purpose/input_output/string_io.ucode
@@ -60,7 +60,7 @@
def macroop INS_E {
.args 'Y', 'R'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -77,7 +77,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t3, dataSize=asz
- br label("topOfLoop"), flags=(nCEZF,)
+ br "topOfLoop", flags=(nCEZF,)
end:
mfence
fault "NoFault"
@@ -115,7 +115,7 @@
def macroop OUTS_E {
.args 'R', 'X'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -132,7 +132,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rsi, rsi, t3, dataSize=asz
- br label("topOfLoop"), flags=(nCEZF,)
+ br "topOfLoop", flags=(nCEZF,)
end:
mfence
fault "NoFault"
diff --git
a/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
b/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
index 79ed36c..ce94052 100644
--- a/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
+++ b/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
@@ -44,18 +44,18 @@
# Figure out if this is a null selector.
andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
- br label("processDescriptor"), flags=(CEZF,)
+ br "processDescriptor", flags=(CEZF,)
# Extract the index.
andi t3, t2, 0xF8, dataSize=8
# Check if this is a local or global descriptor.
andi t0, t2, 0x4, flags=(EZF,), dataSize=2
- br label("globalDescriptor"), flags=(CEZF,)
+ br "globalDescriptor", flags=(CEZF,)
# It's local.
ld t4, tsl, [1, t0, t3], dataSize=8, addressSize=8
- br label("processDescriptor")
+ br "processDescriptor"
# It's global.
globalDescriptor:
diff --git a/src/arch/x86/microcode/general_purpose/semaphores.ucode
b/src/arch/x86/microcode/general_purpose/semaphores.ucode
index 6dcb1ea..397e249 100644
--- a/src/arch/x86/microcode/general_purpose/semaphores.ucode
+++ b/src/arch/x86/microcode/general_purpose/semaphores.ucode
@@ -144,7 +144,7 @@
ldsplit{l} (t2, t3), seg, [1, t0, t1], disp=0
sub t0, rax, t2, flags=(ZF,)
- br label("doneComparing"), flags=(nCZF,)
+ br "doneComparing", flags=(nCZF,)
sub t0, rdx, t3, flags=(ZF,)
doneComparing:
diff --git
a/src/arch/x86/microcode/general_purpose/string/compare_strings.ucode
b/src/arch/x86/microcode/general_purpose/string/compare_strings.ucode
index bed0232..97ce4dc 100644
--- a/src/arch/x86/microcode/general_purpose/string/compare_strings.ucode
+++ b/src/arch/x86/microcode/general_purpose/string/compare_strings.ucode
@@ -59,7 +59,7 @@
.args 'Y', 'X'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
@@ -75,7 +75,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t3, dataSize=asz
add rsi, rsi, t3, dataSize=asz
- br label("topOfLoop"), flags=(CSTRZnEZF,)
+ br "topOfLoop", flags=(CSTRZnEZF,)
end:
fault "NoFault"
};
@@ -84,7 +84,7 @@
.args 'Y', 'X'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
@@ -100,7 +100,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t3, dataSize=asz
add rsi, rsi, t3, dataSize=asz
- br label("topOfLoop"), flags=(CSTRnZnEZF,)
+ br "topOfLoop", flags=(CSTRnZnEZF,)
end:
fault "NoFault"
};
diff --git
a/src/arch/x86/microcode/general_purpose/string/load_string.ucode
b/src/arch/x86/microcode/general_purpose/string/load_string.ucode
index e121a96..92f2d37 100644
--- a/src/arch/x86/microcode/general_purpose/string/load_string.ucode
+++ b/src/arch/x86/microcode/general_purpose/string/load_string.ucode
@@ -50,7 +50,7 @@
def macroop LODS_E {
.args 'X'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -62,7 +62,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rsi, rsi, t3, dataSize=asz
- br label("topOfLoop"), flags=(nCEZF,)
+ br "topOfLoop", flags=(nCEZF,)
end:
fault "NoFault"
};
diff --git
a/src/arch/x86/microcode/general_purpose/string/move_string.ucode
b/src/arch/x86/microcode/general_purpose/string/move_string.ucode
index 002383b..0402cf7 100644
--- a/src/arch/x86/microcode/general_purpose/string/move_string.ucode
+++ b/src/arch/x86/microcode/general_purpose/string/move_string.ucode
@@ -53,7 +53,7 @@
.args 'Y', 'X'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -67,7 +67,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t3, dataSize=asz
add rsi, rsi, t3, dataSize=asz
- br label("topOfLoop"), flags=(nCEZF,)
+ br "topOfLoop", flags=(nCEZF,)
end:
fault "NoFault"
};
diff --git
a/src/arch/x86/microcode/general_purpose/string/scan_string.ucode
b/src/arch/x86/microcode/general_purpose/string/scan_string.ucode
index 851f868..85eef80 100644
--- a/src/arch/x86/microcode/general_purpose/string/scan_string.ucode
+++ b/src/arch/x86/microcode/general_purpose/string/scan_string.ucode
@@ -57,7 +57,7 @@
.args 'Y'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
@@ -71,7 +71,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t2, dataSize=asz
- br label("topOfLoop"), flags=(CSTRZnEZF,)
+ br "topOfLoop", flags=(CSTRZnEZF,)
end:
fault "NoFault"
};
@@ -80,7 +80,7 @@
.args 'Y'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
@@ -94,7 +94,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t2, dataSize=asz
- br label("topOfLoop"), flags=(CSTRnZnEZF,)
+ br "topOfLoop", flags=(CSTRnZnEZF,)
end:
fault "NoFault"
};
diff --git
a/src/arch/x86/microcode/general_purpose/string/store_string.ucode
b/src/arch/x86/microcode/general_purpose/string/store_string.ucode
index 0ef8a3c..8df5bb4 100644
--- a/src/arch/x86/microcode/general_purpose/string/store_string.ucode
+++ b/src/arch/x86/microcode/general_purpose/string/store_string.ucode
@@ -51,7 +51,7 @@
.args 'Y'
and t0, rcx, rcx, flags=(EZF,), dataSize=asz
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
# Find the constant we need to either add or subtract from rdi
ruflag t0, 10
movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -63,7 +63,7 @@
subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
add rdi, rdi, t3, dataSize=asz
- br label("topOfLoop"), flags=(nCEZF,)
+ br "topOfLoop", flags=(nCEZF,)
end:
fault "NoFault"
};
diff --git
a/src/arch/x86/microcode/simd128/integer/shift/left_logical_shift.ucode
b/src/arch/x86/microcode/simd128/integer/shift/left_logical_shift.ucode
index e4d765f..c3b6939 100644
--- a/src/arch/x86/microcode/simd128/integer/shift/left_logical_shift.ucode
+++ b/src/arch/x86/microcode/simd128/integer/shift/left_logical_shift.ucode
@@ -119,19 +119,19 @@
limm t2, 8
subi t1, t2, imm, flags=(ECF,), dataSize=1
- br label("pslldq_less_8"), flags=(nCECF,)
+ br "pslldq_less_8", flags=(nCECF,)
# Greater than 8
limm t2, 16
subi t1, t2, imm, flags=(ECF,), dataSize=1
- br label("pslldq_less_16"), flags=(nCECF,)
+ br "pslldq_less_16", flags=(nCECF,)
# Greater than 16
lfpimm xmml, 0
lfpimm xmmh, 0
- br label("pslldq_end")
+ br "pslldq_end"
pslldq_less_16:
@@ -139,7 +139,7 @@
mslli xmmh, xmml, "(IMMEDIATE-8)<<3", size=8, ext=0
lfpimm xmml, 0
- br label("pslldq_end")
+ br "pslldq_end"
pslldq_less_8:
diff --git
a/src/arch/x86/microcode/simd128/integer/shift/right_logical_shift.ucode
b/src/arch/x86/microcode/simd128/integer/shift/right_logical_shift.ucode
index f2b26be..a18628c 100644
--- a/src/arch/x86/microcode/simd128/integer/shift/right_logical_shift.ucode
+++ b/src/arch/x86/microcode/simd128/integer/shift/right_logical_shift.ucode
@@ -119,18 +119,18 @@
limm t2, 8
subi t1, t2, imm, flags=(ECF,), dataSize=1
- br label("psrldq_less_8"), flags=(nCECF,)
+ br "psrldq_less_8", flags=(nCECF,)
# Greater than 8
limm t2, 16
subi t1, t2, imm, flags=(ECF,), dataSize=1
- br label("psrldq_less_16"), flags=(nCECF,)
+ br "psrldq_less_16", flags=(nCECF,)
# Greater than 16
lfpimm xmml, 0
lfpimm xmmh, 0
- br label("psrldq_end")
+ br "psrldq_end"
psrldq_less_16:
@@ -138,7 +138,7 @@
msrli xmml, xmmh, "(IMMEDIATE-8)<<3", size=8, ext=0
lfpimm xmmh, 0
- br label("psrldq_end")
+ br "psrldq_end"
psrldq_less_8:
diff --git a/src/arch/x86/microcode/system/segmentation.ucode
b/src/arch/x86/microcode/system/segmentation.ucode
index c656af1..d23d553 100644
--- a/src/arch/x86/microcode/system/segmentation.ucode
+++ b/src/arch/x86/microcode/system/segmentation.ucode
@@ -264,7 +264,7 @@
.serialize_after
chks t0, reg, t0, InGDTCheck
andi t0, reg, 0xf8, flags=(EZF,)
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, reg, 3, dataSize=2
ld t1, tsg, [8, t4, t0], dataSize=8
@@ -284,7 +284,7 @@
ld t5, seg, sib, disp, dataSize=2
chks t0, t5, t0, InGDTCheck
andi t0, t5, 0xf8, flags=(EZF,)
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, t5, 3, dataSize=2
ld t1, tsg, [8, t4, t0], dataSize=8
@@ -305,7 +305,7 @@
ld t5, seg, riprel, disp, dataSize=2
chks t0, t5, t0, InGDTCheck
andi t0, t5, 0xf8, flags=(EZF,)
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, t5, 3, dataSize=2
ld t1, tsg, [8, t4, t0], dataSize=8
@@ -324,7 +324,7 @@
.serialize_after
chks t0, reg, t0, InGDTCheck
andi t0, reg, 0xf8, flags=(EZF,)
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, reg, 3, dataSize=2
ld t1, tsg, [8, t4, t0], dataSize=8
@@ -341,7 +341,7 @@
ld t5, seg, sib, disp, dataSize=2
chks t0, t5, t0, InGDTCheck
andi t0, t5, 0xf8, flags=(EZF,)
- br label("end"), flags=(CEZF,)
+ br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, t5, 3, dataSize=2
ld t1, tsg, [8, t4, t0], dataSize=8
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/base.py
b/src/arch/x86/ucasmlib/arch/x86/microops/base.py
index b74545b..a835deb 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/base.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/base.py
@@ -41,7 +41,7 @@
return " | ".join(wrapped)
def lookUpLabels(self):
- labels = [f'static MicroPC {label} = labels.at("{label}");'
+ labels = [f'static MicroPC label_{label} = labels.at("{label}");'
for label in self.labels]
return '\n'.join(labels)
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
b/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
index 1365501..010e602b 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
@@ -40,8 +40,11 @@
def __init__(self, target, flags=None):
super().__init__()
self.className = 'Br'
- self.target = target
- self.labels.append(target)
+ if hasattr(target, 'rom_label'):
+ self.target = f'microcodeRom().getLabel("{target.rom_label}")'
+ else:
+ self.target = f'label_{target}'
+ self.labels.append(target)
if flags:
if not isinstance(flags, (list, tuple)):
raise Exception('flags must be a list or tuple of flags')
diff --git a/src/arch/x86/ucasmlib/arch/x86/symbols.py
b/src/arch/x86/ucasmlib/arch/x86/symbols.py
index 70bd1cc..aa48629 100644
--- a/src/arch/x86/ucasmlib/arch/x86/symbols.py
+++ b/src/arch/x86/ucasmlib/arch/x86/symbols.py
@@ -177,9 +177,10 @@
symbols['trimImm'] = \
lambda width: f'adjustedImm = adjustedImm & mask({width});'
-symbols["label"] = lambda label_str: f'label_{label_str}'
-symbols["rom_label"] = \
- lambda label_str: f'microcodeRom().getLabel("{label_str}")'
+class RomLabel:
+ def __init__(self, label):
+ self.rom_label = label
+symbols["RomLabel"] = RomLabel
def stack_index(index):
return fpRegIdx(f'NUM_FLOATREGS + ((({index}) + 8) % 8)')
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/56901
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I351f843ffef8e2f5dab020f3dcd36612fff08f56
Gerrit-Change-Number: 56901
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s