summaryrefslogtreecommitdiff
path: root/sys/src/cmd/7l/optab.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-04-08 14:12:01 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-04-08 14:12:01 +0200
commit12fc1c7d3e04649fb7d213d16f9da597726dd7b6 (patch)
treeeb12c7dad308f4e98fc9519bb0d51461812d651a /sys/src/cmd/7l/optab.c
parentd8d4802f80b40bc9a43031e3d6484aa237e7d444 (diff)
7l: fix bitcon instruction selection and encoding
the possible bitmasks generated depend on the data width of the instruction, so we introduce C_BITCON32 and C_BITCON64 operand types to keep them apart. the encoding of the bitcon operation was wrong.
Diffstat (limited to 'sys/src/cmd/7l/optab.c')
-rw-r--r--sys/src/cmd/7l/optab.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/sys/src/cmd/7l/optab.c b/sys/src/cmd/7l/optab.c
index c462857ed..a2d5bae36 100644
--- a/sys/src/cmd/7l/optab.c
+++ b/sys/src/cmd/7l/optab.c
@@ -42,25 +42,42 @@ Optab optab[] =
/* logical operations */
{ AAND, C_REG, C_REG, C_REG, 1, 4, 0 },
+ { AANDW, C_REG, C_REG, C_REG, 1, 4, 0 },
{ AAND, C_REG, C_NONE, C_REG, 1, 4, 0 },
+ { AANDW, C_REG, C_NONE, C_REG, 1, 4, 0 },
{ ABIC, C_REG, C_REG, C_REG, 1, 4, 0 },
+ { ABICW, C_REG, C_REG, C_REG, 1, 4, 0 },
{ ABIC, C_REG, C_NONE, C_REG, 1, 4, 0 },
+ { ABICW, C_REG, C_NONE, C_REG, 1, 4, 0 },
- { AAND, C_BITCON, C_REG, C_REG, 53, 4, 0 },
- { AAND, C_BITCON, C_NONE, C_REG, 53, 4, 0 },
- { ABIC, C_BITCON, C_REG, C_REG, 53, 4, 0 },
- { ABIC, C_BITCON, C_NONE, C_REG, 53, 4, 0 },
+ { AAND, C_BITCON64,C_REG,C_REG, 53, 4, 0 },
+ { AANDW, C_BITCON32,C_REG,C_REG, 53, 4, 0 },
+ { AAND, C_BITCON64,C_NONE,C_REG, 53, 4, 0 },
+ { AANDW, C_BITCON32,C_NONE,C_REG, 53, 4, 0 },
+ { ABIC, C_BITCON64,C_REG,C_REG, 53, 4, 0 },
+ { ABICW, C_BITCON32,C_REG,C_REG, 53, 4, 0 },
+ { ABIC, C_BITCON64,C_NONE,C_REG, 53, 4, 0 },
+ { ABICW, C_BITCON32,C_NONE,C_REG, 53, 4, 0 },
{ AAND, C_LCON, C_REG, C_REG, 28, 8, 0, LFROM },
+ { AANDW, C_LCON, C_REG, C_REG, 28, 8, 0, LFROM },
{ AAND, C_LCON, C_NONE, C_REG, 28, 8, 0, LFROM },
+ { AANDW, C_LCON, C_NONE, C_REG, 28, 8, 0, LFROM },
{ ABIC, C_LCON, C_REG, C_REG, 28, 8, 0, LFROM },
+ { ABICW, C_LCON, C_REG, C_REG, 28, 8, 0, LFROM },
{ ABIC, C_LCON, C_NONE, C_REG, 28, 8, 0, LFROM },
+ { ABICW, C_LCON, C_NONE, C_REG, 28, 8, 0, LFROM },
{ AAND, C_SHIFT,C_REG, C_REG, 3, 4, 0 },
+ { AANDW, C_SHIFT,C_REG, C_REG, 3, 4, 0 },
{ AAND, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
+ { AANDW, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
{ ABIC, C_SHIFT,C_REG, C_REG, 3, 4, 0 },
+ { ABICW, C_SHIFT,C_REG, C_REG, 3, 4, 0 },
{ ABIC, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
+ { ABICW, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
+ /* moves */
{ AMOV, C_RSP, C_NONE, C_RSP, 24, 4, 0 },
{ AMVN, C_REG, C_NONE, C_REG, 24, 4, 0 },
{ AMOVB, C_REG, C_NONE, C_REG, 45, 4, 0 },
@@ -70,12 +87,13 @@ Optab optab[] =
/* TO DO: MVN C_SHIFT */
/* MOVs that become MOVK/MOVN/MOVZ/ADD/SUB/OR */
- { AMOVW, C_MOVCON, C_NONE, C_REG, 32, 4, 0 },
+ { AMOVW, C_MOVCON, C_NONE, C_REG, 32, 4, 0 },
{ AMOV, C_MOVCON, C_NONE, C_REG, 32, 4, 0 },
-// { AMOVW, C_ADDCON, C_NONE, C_REG, 2, 4, 0 },
+// { AMOVW, C_ADDCON, C_NONE, C_REG, 2, 4, 0 },
// { AMOV, C_ADDCON, C_NONE, C_REG, 2, 4, 0 },
-// { AMOVW, C_BITCON, C_NONE, C_REG, 53, 4, 0 },
-// { AMOV, C_BITCON, C_NONE, C_REG, 53, 4, 0 },
+
+ { AMOV, C_BITCON64, C_NONE, C_REG, 53, 4, 0 },
+ { AMOVW, C_BITCON32, C_NONE, C_REG, 53, 4, 0 },
{ AMOVK, C_LCON, C_NONE, C_REG, 33, 4, 0 },