Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
00a8faa3
Commit
00a8faa3
authored
Apr 28, 1992
by
Richard Kenner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
entered into RCS
From-SVN: r852
parent
4c561ce2
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
147 additions
and
53 deletions
+147
-53
gcc/config/vax/vax.md
+147
-53
No files found.
gcc/config/vax/vax.md
View file @
00a8faa3
...
@@ -83,17 +83,21 @@
...
@@ -83,17 +83,21 @@
(define_insn "cmpdf"
(define_insn "cmpdf"
[
(set (cc0)
[
(set (cc0)
(compare (match_operand:DF 0 "general_operand" "gF")
(compare (match_operand:DF 0 "general_operand" "gF
,gF
")
(match_operand:DF 1 "general_operand" "gF")))]
(match_operand:DF 1 "general_operand" "
G,
gF")))]
""
""
"cmp%# %0,%1")
"@
tst%# %0
cmp%# %0,%1")
(define_insn "cmpsf"
(define_insn "cmpsf"
[
(set (cc0)
[
(set (cc0)
(compare (match_operand:SF 0 "general_operand" "gF")
(compare (match_operand:SF 0 "general_operand" "gF
,gF
")
(match_operand:SF 1 "general_operand" "gF")))]
(match_operand:SF 1 "general_operand" "
G,
gF")))]
""
""
"cmpf %0,%1")
"@
tstf %0
cmpf %0,%1")
(define_insn ""
(define_insn ""
[
(set (cc0)
[
(set (cc0)
...
@@ -173,6 +177,23 @@
...
@@ -173,6 +177,23 @@
clrq %0
clrq %0
movq %1,%0")
movq %1,%0")
;; The VAX move instructions have space-time tradeoffs. On a microVAX
;; register-register mov instructions take 3 bytes and 2 CPU cycles. clrl
;; takes 2 bytes and 3 cycles. mov from constant to register takes 2 cycles
;; if the constant is smaller than 4 bytes, 3 cycles for a longword
;; constant. movz, mneg, and mcom are as fast as mov, so movzwl is faster
;; than movl for positive constants that fit in 16 bits but not 6 bits. cvt
;; instructions take 4 cycles. inc takes 3 cycles. The machine description
;; is willing to trade 1 byte for 1 cycle (clrl instead of movl $0; cvtwl
;; instead of movl).
;; Cycle counts for other models may vary (on a VAX 750 they are similar,
;; but on a VAX 9000 most move and add instructions with one constant
;; operand take 1 cycle).
;; Loads of constants between 64 and 128 used to be done with
;; "addl3 $63,#,dst" but this is slower than movzbl and takes as much space.
(define_insn "movsi"
(define_insn "movsi"
[
(set (match_operand:SI 0 "general_operand" "=g")
[
(set (match_operand:SI 0 "general_operand" "=g")
(match_operand:SI 1 "general_operand" "g"))]
(match_operand:SI 1 "general_operand" "g"))]
...
@@ -187,7 +208,6 @@
...
@@ -187,7 +208,6 @@
&& GET_CODE (XEXP (link, 0)) != NOTE
&& GET_CODE (XEXP (link, 0)) != NOTE
/
* Make sure cross jumping didn't happen here. *
/
/
* Make sure cross jumping didn't happen here. *
/
&& no_labels_between_p (XEXP (link, 0), insn))
&& no_labels_between_p (XEXP (link, 0), insn))
/
* Fastest way to change a 0 to a 1. *
/
return
\"
incl %0
\"
;
return
\"
incl %0
\"
;
if (GET_CODE (operands
[
1
]
) == SYMBOL_REF || GET_CODE (operands
[
1
]
) == CONST)
if (GET_CODE (operands
[
1
]
) == SYMBOL_REF || GET_CODE (operands
[
1
]
) == CONST)
{
{
...
@@ -195,7 +215,6 @@
...
@@ -195,7 +215,6 @@
return
\"
pushab %a1
\"
;
return
\"
pushab %a1
\"
;
return
\"
movab %a1,%0
\"
;
return
\"
movab %a1,%0
\"
;
}
}
/
* this is slower than a movl, except when pushing an operand *
/
if (operands
[
1
]
== const0_rtx)
if (operands
[
1
]
== const0_rtx)
return
\"
clrl %0
\"
;
return
\"
clrl %0
\"
;
if (GET_CODE (operands
[
1
]
) == CONST_INT
if (GET_CODE (operands
[
1
]
) == CONST_INT
...
@@ -203,17 +222,7 @@
...
@@ -203,17 +222,7 @@
{
{
int i = INTVAL (operands
[
1
]
);
int i = INTVAL (operands
[
1
]
);
if ((unsigned)(~i) < 64)
if ((unsigned)(~i) < 64)
{
return
\"
mcoml %N1,%0
\"
;
operands
[
1
]
= gen_rtx (CONST_INT, VOIDmode, ~i);
return
\"
mcoml %1,%0
\"
;
}
if ((unsigned)i < 127)
{
operands
[
1
]
= gen_rtx (CONST_INT, VOIDmode, 63);
operands
[
2
]
= gen_rtx (CONST_INT, VOIDmode, i-63);
return
\"
addl3 %2,%1,%0
\"
;
}
/
* trading speed for space *
/
if ((unsigned)i < 0x100)
if ((unsigned)i < 0x100)
return
\"
movzbl %1,%0
\"
;
return
\"
movzbl %1,%0
\"
;
if (i >= -0x80 && i < 0)
if (i >= -0x80 && i < 0)
...
@@ -242,30 +251,40 @@
...
@@ -242,30 +251,40 @@
&& GET_CODE (XEXP (link, 0)) != NOTE
&& GET_CODE (XEXP (link, 0)) != NOTE
/
* Make sure cross jumping didn't happen here. *
/
/
* Make sure cross jumping didn't happen here. *
/
&& no_labels_between_p (XEXP (link, 0), insn))
&& no_labels_between_p (XEXP (link, 0), insn))
/
* Fastest way to change a 0 to a 1. *
/
return
\"
incw %0
\"
;
return
\"
incw %0
\"
;
if (operands
[
1
]
== const0_rtx)
return
\"
clrw %0
\"
;
if (GET_CODE (operands
[
1
]
) == CONST_INT)
if (GET_CODE (operands
[
1
]
) == CONST_INT
{
&& (unsigned) INTVAL (operands
[
1
]
) >= 64)
int i = INTVAL (operands
[
1
]
);
if (i == 0)
return
\"
clrw %0
\"
;
else if ((unsigned int)i < 64)
return
\"
movw %1,%0
\"
;
else if ((unsigned int)~i < 64)
return
\"
mcomw %H1,%0
\"
;
else if ((unsigned int)i < 256)
return
\"
movzbw %1,%0
\"
;
}
return
\"
movw %1,%0
\"
;
}")
(define_insn "movstricthi"
[
(set (strict_low_part (match_operand:HI 0 "register_operand" "=g"))
(match_operand:HI 1 "general_operand" "g"))]
""
"
*
{
if (GET_CODE (operands
[
1
]
) == CONST_INT)
{
{
int i = INTVAL (operands
[
1
]
);
int i = INTVAL (operands
[
1
]
);
if ((unsigned)((~i) & 0xffff) < 64)
if (i == 0)
{
return
\"
clrw %0
\"
;
operands
[
1
]
= gen_rtx (CONST_INT, VOIDmode, (~i) & 0xffff);
else if ((unsigned int)i < 64)
return
\"
mcomw %1,%0
\"
;
return
\"
movw %1,%0
\"
;
}
else if ((unsigned int)~i < 64)
if ((unsigned)(i & 0xffff) < 127)
return
\"
mcomw %H1,%0
\"
;
{
else if ((unsigned int)i < 256)
operands
[
1
]
= gen_rtx (CONST_INT, VOIDmode, 63);
return
\"
movzbw %1,%0
\"
;
operands
[
2
]
= gen_rtx (CONST_INT, VOIDmode, (i-63) & 0xffff);
return
\"
addw3 %2,%1,%0
\"
;
}
/
* this is a lot slower, and only saves 1 measly byte! *
/
/
*
if ((unsigned)i < 0x100)
return
\"
movzbw %1,%0
\"
;
*
/
/
*
if (i >= -0x80 && i < 0)
return
\"
cvtbw %1,%0
\"
;
*
/
}
}
return
\"
movw %1,%0
\"
;
return
\"
movw %1,%0
\"
;
}")
}")
...
@@ -276,17 +295,40 @@
...
@@ -276,17 +295,40 @@
""
""
"
*
"
*
{
{
if (operands
[
1
]
== const0_rtx)
rtx link;
return
\"
clrb %0
\"
;
if (operands
[
1
]
== const1_rtx
if (GET_CODE (operands
[
1
]
) == CONST_INT
&& (link = find_reg_note (insn, REG_WAS_0, 0))
&& (unsigned) INTVAL (operands
[
1
]
) >= 64)
/
* Make sure the insn that stored the 0 is still present. *
/
&& ! INSN_DELETED_P (XEXP (link, 0))
&& GET_CODE (XEXP (link, 0)) != NOTE
/
* Make sure cross jumping didn't happen here. *
/
&& no_labels_between_p (XEXP (link, 0), insn))
return
\"
incb %0
\"
;
if (GET_CODE (operands
[
1
]
) == CONST_INT)
{
int i = INTVAL (operands
[
1
]
);
if (i == 0)
return
\"
clrb %0
\"
;
else if ((unsigned int)~i < 64)
return
\"
mcomb %B1,%0
\"
;
}
return
\"
movb %1,%0
\"
;
}")
(define_insn "movstrictqi"
[
(set (strict_low_part (match_operand:QI 0 "register_operand" "=g"))
(match_operand:QI 1 "general_operand" "g"))]
""
"
*
{
if (GET_CODE (operands
[
1
]
) == CONST_INT)
{
{
int i = INTVAL (operands
[
1
]
);
int i = INTVAL (operands
[
1
]
);
if ((unsigned)((~i) & 0xff) < 64)
if (i == 0)
{
return
\"
clrb %0
\"
;
operands
[
1
]
= gen_rtx (CONST_INT, VOIDmode, (~i) & 0xff);
else if ((unsigned int)~i < 64)
return
\"
mcomb %1,%0
\"
;
return
\"
mcomb %B1,%0
\"
;
}
}
}
return
\"
movb %1,%0
\"
;
return
\"
movb %1,%0
\"
;
}")
}")
...
@@ -1285,13 +1327,26 @@
...
@@ -1285,13 +1327,26 @@
""
""
"cmpzv %2,%1,%0,%3")
"cmpzv %2,%1,%0,%3")
;; When the field position and size are constant and the destination
;; is a register, extv and extzv are much slower than a rotate followed
;; by a bicl or sign extension.
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "general_operand" "=g")
[
(set (match_operand:SI 0 "general_operand" "=g")
(sign_extract:SI (match_operand:SI 1 "nonmemory_operand" "r")
(sign_extract:SI (match_operand:SI 1 "nonmemory_operand" "r")
(match_operand:QI 2 "general_operand" "g")
(match_operand:QI 2 "general_operand" "g")
(match_operand:SI 3 "general_operand" "g")))]
(match_operand:SI 3 "general_operand" "g")))]
""
""
"extv %3,%2,%1,%0")
"
*
{
if (GET_CODE (operands
[
3
]
) != CONST_INT || GET_CODE (operands
[
2
]
) != CONST_INT
|| GET_CODE (operands
[
0
]
) != REG
|| (INTVAL (operands
[
2
]
) != 8 && INTVAL (operands
[
2
]
) != 16))
return
\"
extv %3,%2,%1,%0
\"
;
if (INTVAL (operands
[
2
]
) == 8)
return
\"
rotl %R3,%1,%0
\;
cvtbl %0,%0
\"
;
return
\"
rotl %R3,%1,%0
\;
cvtwl %0,%0
\"
;
}")
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "general_operand" "=g")
[
(set (match_operand:SI 0 "general_operand" "=g")
...
@@ -1299,7 +1354,21 @@
...
@@ -1299,7 +1354,21 @@
(match_operand:QI 2 "general_operand" "g")
(match_operand:QI 2 "general_operand" "g")
(match_operand:SI 3 "general_operand" "g")))]
(match_operand:SI 3 "general_operand" "g")))]
""
""
"extzv %3,%2,%1,%0")
"
*
{
if (GET_CODE (operands
[
3
]
) != CONST_INT || GET_CODE (operands
[
2
]
) != CONST_INT
|| GET_CODE (operands
[
0
]
) != REG)
return
\"
extzv %3,%2,%1,%0
\"
;
if (INTVAL (operands
[
2
]
) == 8)
return
\"
rotl %R3,%1,%0
\;
movzbl %0,%0
\"
;
if (INTVAL (operands
[
2
]
) == 16)
return
\"
rotl %R3,%1,%0
\;
movzwl %0,%0
\"
;
if (INTVAL (operands
[
3
]
) & 31)
return
\"
rotl %R3,%1,%0
\;
bicl2 %M2,%0
\"
;
if (rtx_equal_p (operands
[
0
]
, operands
[
1
]
))
return
\"
bicl2 %M2,%0
\"
;
return
\"
bicl3 %M2,%1,%0
\"
;
}")
;; Non-register cases.
;; Non-register cases.
;; nonimmediate_operand is used to make sure that mode-ambiguous cases
;; nonimmediate_operand is used to make sure that mode-ambiguous cases
...
@@ -1331,7 +1400,19 @@
...
@@ -1331,7 +1400,19 @@
(match_operand:QI 2 "general_operand" "g")
(match_operand:QI 2 "general_operand" "g")
(match_operand:SI 3 "general_operand" "g")))]
(match_operand:SI 3 "general_operand" "g")))]
""
""
"extv %3,%2,%1,%0")
"
*
{
if (GET_CODE (operands
[
0
]
) != REG || GET_CODE (operands
[
2
]
) != CONST_INT
|| GET_CODE (operands
[
3
]
) != CONST_INT
|| (INTVAL (operands
[
2
]
) != 8 && INTVAL (operands
[
2
]
) != 16)
|| side_effects_p (operands
[
1
]
)
|| (GET_CODE (operands
[
1
]
) == MEM
&& mode_dependent_address_p (XEXP (operands
[
1
]
, 0))))
return
\"
extv %3,%2,%1,%0
\"
;
if (INTVAL (operands
[
2
]
) == 8)
return
\"
rotl %R3,%1,%0
\;
cvtbl %0,%0
\"
;
return
\"
rotl %R3,%1,%0
\;
cvtwl %0,%0
\"
;
}")
(define_insn "extzv"
(define_insn "extzv"
[
(set (match_operand:SI 0 "general_operand" "=g")
[
(set (match_operand:SI 0 "general_operand" "=g")
...
@@ -1339,7 +1420,20 @@
...
@@ -1339,7 +1420,20 @@
(match_operand:QI 2 "general_operand" "g")
(match_operand:QI 2 "general_operand" "g")
(match_operand:SI 3 "general_operand" "g")))]
(match_operand:SI 3 "general_operand" "g")))]
""
""
"extzv %3,%2,%1,%0")
"
*
{
if (GET_CODE (operands
[
0
]
) != REG || GET_CODE (operands
[
2
]
) != CONST_INT
|| GET_CODE (operands
[
3
]
) != CONST_INT
|| side_effects_p (operands
[
1
]
)
|| (GET_CODE (operands
[
1
]
) == MEM
&& mode_dependent_address_p (XEXP (operands
[
1
]
, 0))))
return
\"
extzv %3,%2,%1,%0
\"
;
if (INTVAL (operands
[
2
]
) == 8)
return
\"
rotl %R3,%1,%0
\;
movzbl %0,%0
\"
;
if (INTVAL (operands
[
2
]
) == 16)
return
\"
rotl %R3,%1,%0
\;
movzwl %0,%0
\"
;
return
\"
rotl %R3,%1,%0
\;
bicl2 %M2,%0
\"
;
}")
(define_insn "insv"
(define_insn "insv"
[
(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+g")
[
(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+g")
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment