summaryrefslogtreecommitdiff
path: root/src/arch/x86/isa/insts/control_transfer
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-08-04 20:12:54 -0700
committerGabe Black <gblack@eecs.umich.edu>2007-08-04 20:12:54 -0700
commite410a925df8d37f386c97dc7cdd9a78347ce4700 (patch)
treeb4102987453b1303051dfeea61aa1a45c2e5e75f /src/arch/x86/isa/insts/control_transfer
parentced6cbcccf4540358093f060dad4d59ad6557d6a (diff)
downloadgem5-e410a925df8d37f386c97dc7cdd9a78347ce4700.tar.xz
X86: Start implementing segmentation support.
Make instructions observe segment prefixes, default segment rules, segment base addresses. Also fix some microcode and add sib and riprel "keywords" to the x86 specialization of the microassembler. --HG-- extra : convert_revision : be5a3b33d33f243ed6e1ad63faea8495e46d0ac9
Diffstat (limited to 'src/arch/x86/isa/insts/control_transfer')
-rw-r--r--src/arch/x86/isa/insts/control_transfer/call.py4
-rw-r--r--src/arch/x86/isa/insts/control_transfer/conditional_jump.py166
-rw-r--r--src/arch/x86/isa/insts/control_transfer/jump.py164
-rw-r--r--src/arch/x86/isa/insts/control_transfer/xreturn.py4
4 files changed, 167 insertions, 171 deletions
diff --git a/src/arch/x86/isa/insts/control_transfer/call.py b/src/arch/x86/isa/insts/control_transfer/call.py
index c5bb66e58..504e9ab0a 100644
--- a/src/arch/x86/isa/insts/control_transfer/call.py
+++ b/src/arch/x86/isa/insts/control_transfer/call.py
@@ -83,7 +83,7 @@ def macroop CALL_NEAR_M
.adjust_env oszIn64Override
rdip t7
- ld t1, ds, [scale, index, base], disp
+ ld t1, seg, sib, disp
subi rsp, rsp, dsz
st t7, ss, [0, t0, rsp]
wripi t1, 0
@@ -95,7 +95,7 @@ def macroop CALL_NEAR_P
.adjust_env oszIn64Override
rdip t7
- ld t1, ds, [0, t0, t7], disp
+ ld t1, seg, riprel, disp
subi rsp, rsp, dsz
st t7, ss, [0, t0, rsp]
wripi t1, 0
diff --git a/src/arch/x86/isa/insts/control_transfer/conditional_jump.py b/src/arch/x86/isa/insts/control_transfer/conditional_jump.py
index 7ca426be6..b04ca97d6 100644
--- a/src/arch/x86/isa/insts/control_transfer/conditional_jump.py
+++ b/src/arch/x86/isa/insts/control_transfer/conditional_jump.py
@@ -53,8 +53,164 @@
#
# Authors: Gabe Black
-microcode = ""
-#let {{
-# class JCC(Inst):
-# "GenFault ${new UnimpInstFault}"
-#}};
+microcode = '''
+def macroop JZ_I
+{
+ # Make the defualt data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CZF,)
+};
+
+def macroop JNZ_I
+{
+ # Make the defualt data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCZF,)
+};
+
+def macroop JB_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CCF,)
+};
+
+def macroop JNB_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCCF,)
+};
+
+def macroop JBE_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CCvZF,)
+};
+
+def macroop JNBE_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCCvZF,)
+};
+
+def macroop JS_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CSF,)
+};
+
+def macroop JNS_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCSF,)
+};
+
+def macroop JP_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CPF,)
+};
+
+def macroop JNP_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCPF,)
+};
+
+def macroop JL_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CSxOF,)
+};
+
+def macroop JNL_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCSxOF,)
+};
+
+def macroop JLE_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(CSxOvZF,)
+};
+
+def macroop JNLE_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCSxOvZF,)
+};
+
+def macroop JO_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(COF,)
+};
+
+def macroop JNO_I
+{
+ # Make the default data size of jumps 64 bits in 64 bit mode
+ .adjust_env oszIn64Override
+
+ rdip t1
+ limm t2, imm
+ wrip t1, t2, flags=(nCOF,)
+};
+'''
diff --git a/src/arch/x86/isa/insts/control_transfer/jump.py b/src/arch/x86/isa/insts/control_transfer/jump.py
index 0df84cbe8..bb3ae4213 100644
--- a/src/arch/x86/isa/insts/control_transfer/jump.py
+++ b/src/arch/x86/isa/insts/control_transfer/jump.py
@@ -54,166 +54,6 @@
# Authors: Gabe Black
microcode = '''
-def macroop JZ_I
-{
- # Make the defualt data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CZF,)
-};
-
-def macroop JNZ_I
-{
- # Make the defualt data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCZF,)
-};
-
-def macroop JB_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CCF,)
-};
-
-def macroop JNB_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCCF,)
-};
-
-def macroop JBE_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CCvZF,)
-};
-
-def macroop JNBE_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCCvZF,)
-};
-
-def macroop JS_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CSF,)
-};
-
-def macroop JNS_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCSF,)
-};
-
-def macroop JP_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CPF,)
-};
-
-def macroop JNP_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCPF,)
-};
-
-def macroop JL_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CSxOF,)
-};
-
-def macroop JNL_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCSxOF,)
-};
-
-def macroop JLE_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(CSxOvZF,)
-};
-
-def macroop JNLE_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCSxOvZF,)
-};
-
-def macroop JO_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(COF,)
-};
-
-def macroop JNO_I
-{
- # Make the default data size of jumps 64 bits in 64 bit mode
- .adjust_env oszIn64Override
-
- rdip t1
- limm t2, imm
- wrip t1, t2, flags=(nCOF,)
-};
-
def macroop JMP_I
{
# Make the default data size of jumps 64 bits in 64 bit mode
@@ -237,7 +77,7 @@ def macroop JMP_M
# Make the default data size of jumps 64 bits in 64 bit mode
.adjust_env oszIn64Override
- ld t1, ds, [scale, index, base], disp
+ ld t1, seg, sib, disp
wripi t1, 0
};
@@ -247,7 +87,7 @@ def macroop JMP_P
.adjust_env oszIn64Override
rdip t7
- ld t1, ds, [0, t0, t7], disp
+ ld t1, seg, riprel, disp
wripi t1, 0
};
'''
diff --git a/src/arch/x86/isa/insts/control_transfer/xreturn.py b/src/arch/x86/isa/insts/control_transfer/xreturn.py
index 0000cd3c1..1efddf1d2 100644
--- a/src/arch/x86/isa/insts/control_transfer/xreturn.py
+++ b/src/arch/x86/isa/insts/control_transfer/xreturn.py
@@ -59,7 +59,7 @@ def macroop RET_NEAR
# Make the default data size of rets 64 bits in 64 bit mode
.adjust_env oszIn64Override
- ld t1, ss, [0, t0, rsp]
+ ld t1, ss, [1, t0, rsp]
addi rsp, rsp, dsz
wripi t1, 0
};
@@ -70,7 +70,7 @@ def macroop RET_NEAR_I
.adjust_env oszIn64Override
limm t2, imm
- ld t1, ss, [0, t0, rsp]
+ ld t1, ss, [1, t0, rsp]
addi rsp, rsp, dsz
add rsp, rsp, t2
wripi t1, 0