aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2018-03-22 08:31:43 +0100
committerJan Beulich <jbeulich@suse.com>2018-03-22 08:31:43 +0100
commitd6793fa1acf384a93c83db6eb916e3b9eedd9ef4 (patch)
tree8c6ac3bc26803c338b3ae5a9edce2ff5f025f7e6 /gas
parentf776822506b417ce25170c67c33cc05870b37adf (diff)
downloadgdb-d6793fa1acf384a93c83db6eb916e3b9eedd9ef4.zip
gdb-d6793fa1acf384a93c83db6eb916e3b9eedd9ef4.tar.gz
gdb-d6793fa1acf384a93c83db6eb916e3b9eedd9ef4.tar.bz2
x86/Intel: fix fallout from earlier template folding
While many templates allowing multiple suitably matching XMM/YMM/ZMM operand sizes can be folded, a few need to be split in order to not wrongly accept "xmmword ptr" operands when only XMM registers are permitted (and memory operands are more narrow). Add a test case validating this.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-i386.c7
-rw-r--r--gas/testsuite/gas/i386/i386.exp1
-rw-r--r--gas/testsuite/gas/i386/xmmword.l101
-rw-r--r--gas/testsuite/gas/i386/xmmword.s129
5 files changed, 244 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 1e0ebb2..00a4edc 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,13 @@
2018-03-22 Jan Beulich <jbeulich@suse.com>
+ * config/tc-i386.c (match_mem_size): Extend sub-xmmword
+ exceptions.
+ * testsuite/gas/i386/xmmword.l, testsuite/gas/i386/xmmword.s:
+ New.
+ * testsuite/gas/i386/i386.exp: Run new test.
+
+2018-03-22 Jan Beulich <jbeulich@suse.com>
+
* config/tc-i386.c (match_template): Also match 2nd and 4th
operand's register sizes.
* testsuite/gas/i386/unspec.l, testsuite/gas/i386/unspec.s: New.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 01365f3..8905de4 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -1937,10 +1937,13 @@ match_mem_size (const insn_template *t, unsigned int j)
&& !t->operand_types[j].bitfield.fword)
/* For scalar opcode templates to allow register and memory
operands at the same time, some special casing is needed
- here. */
+ here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
+ down-conversion vpmov*. */
|| ((t->operand_types[j].bitfield.regsimd
&& !t->opcode_modifier.broadcast
- && (t->operand_types[j].bitfield.dword
+ && (t->operand_types[j].bitfield.byte
+ || t->operand_types[j].bitfield.word
+ || t->operand_types[j].bitfield.dword
|| t->operand_types[j].bitfield.qword))
? (i.types[j].bitfield.xmmword
|| i.types[j].bitfield.ymmword
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 2fbb52b..035d510 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -553,6 +553,7 @@ if [expr [istarget "i*86-*-*"] || [istarget "x86_64-*-*"]] then {
run_list_test "string-bad" ""
run_list_test "reg-bad" ""
run_list_test "space1" "-al"
+ run_list_test "xmmword" ""
run_dump_test rept
run_dump_test pr19498
run_list_test "nop-bad-1" ""
diff --git a/gas/testsuite/gas/i386/xmmword.l b/gas/testsuite/gas/i386/xmmword.l
new file mode 100644
index 0000000..ce3af8d
--- /dev/null
+++ b/gas/testsuite/gas/i386/xmmword.l
@@ -0,0 +1,101 @@
+.*: Assembler messages:
+.*:4: Error: .* `addsd'
+.*:5: Error: .* `vaddsd'
+.*:6: Error: .* `vaddsd'
+.*:8: Error: .* `addss'
+.*:9: Error: .* `vaddss'
+.*:10: Error: .* `vaddss'
+.*:12: Error: .* `vbroadcastf32x2'
+.*:13: Error: .* `vbroadcastf32x2'
+.*:15: Error: .* `vbroadcasti32x2'
+.*:16: Error: .* `vbroadcasti32x2'
+.*:17: Error: .* `vbroadcasti32x2'
+.*:19: Error: .* `vbroadcastsd'
+.*:20: Error: .* `vbroadcastsd'
+.*:21: Error: .* `vbroadcastsd'
+.*:23: Error: .* `vbroadcastss'
+.*:24: Error: .* `vbroadcastss'
+.*:25: Error: .* `vbroadcastss'
+.*:26: Error: .* `vbroadcastss'
+.*:27: Error: .* `vbroadcastss'
+.*:29: Error: .* `cvtdq2pd'
+.*:30: Error: .* `vcvtdq2pd'
+.*:31: Error: .* `vcvtdq2pd'
+.*:33: Error: .* `vcvtph2ps'
+.*:34: Error: .* `vcvtph2ps'
+.*:36: Error: .* `cvtps2pd'
+.*:37: Error: .* `vcvtps2pd'
+.*:38: Error: .* `vcvtps2pd'
+.*:40: Error: .* `vcvtps2ph'
+.*:41: Error: .* `vcvtps2ph'
+.*:43: Error: .* `vcvtudq2pd'
+.*:45: Error: .* `insertps'
+.*:46: Error: .* `vinsertps'
+.*:47: Error: .* `vinsertps'
+.*:49: Error: .* `movddup'
+.*:50: Error: .* `vmovddup'
+.*:51: Error: .* `vmovddup'
+.*:53: Error: .* `vpbroadcastb'
+.*:54: Error: .* `vpbroadcastb'
+.*:55: Error: .* `vpbroadcastb'
+.*:56: Error: .* `vpbroadcastb'
+.*:57: Error: .* `vpbroadcastb'
+.*:59: Error: .* `vpbroadcastd'
+.*:60: Error: .* `vpbroadcastd'
+.*:61: Error: .* `vpbroadcastd'
+.*:62: Error: .* `vpbroadcastd'
+.*:63: Error: .* `vpbroadcastd'
+.*:65: Error: .* `vpbroadcastq'
+.*:66: Error: .* `vpbroadcastq'
+.*:67: Error: .* `vpbroadcastq'
+.*:68: Error: .* `vpbroadcastq'
+.*:69: Error: .* `vpbroadcastq'
+.*:71: Error: .* `vpbroadcastw'
+.*:72: Error: .* `vpbroadcastw'
+.*:73: Error: .* `vpbroadcastw'
+.*:74: Error: .* `vpbroadcastw'
+.*:75: Error: .* `vpbroadcastw'
+.*:77: Error: .* `pmovsxbd'
+.*:78: Error: .* `vpmovsxbd'
+.*:79: Error: .* `vpmovsxbd'
+.*:80: Error: .* `vpmovsxbd'
+.*:81: Error: .* `vpmovsxbd'
+.*:83: Error: .* `pmovsxbq'
+.*:84: Error: .* `vpmovsxbq'
+.*:85: Error: .* `vpmovsxbq'
+.*:86: Error: .* `vpmovsxbq'
+.*:87: Error: .* `vpmovsxbq'
+.*:88: Error: .* `vpmovsxbq'
+.*:90: Error: .* `pmovsxdq'
+.*:91: Error: .* `vpmovsxdq'
+.*:92: Error: .* `vpmovsxdq'
+.*:94: Error: .* `pmovsxwd'
+.*:95: Error: .* `vpmovsxwd'
+.*:96: Error: .* `vpmovsxwd'
+.*:98: Error: .* `pmovsxwq'
+.*:99: Error: .* `vpmovsxwq'
+.*:100: Error: .* `vpmovsxwq'
+.*:101: Error: .* `vpmovsxwq'
+.*:102: Error: .* `vpmovsxwq'
+.*:104: Error: .* `pmovzxbd'
+.*:105: Error: .* `vpmovzxbd'
+.*:106: Error: .* `vpmovzxbd'
+.*:107: Error: .* `vpmovzxbd'
+.*:108: Error: .* `vpmovzxbd'
+.*:110: Error: .* `pmovzxbq'
+.*:111: Error: .* `vpmovzxbq'
+.*:112: Error: .* `vpmovzxbq'
+.*:113: Error: .* `vpmovzxbq'
+.*:114: Error: .* `vpmovzxbq'
+.*:115: Error: .* `vpmovzxbq'
+.*:117: Error: .* `pmovzxdq'
+.*:118: Error: .* `vpmovzxdq'
+.*:119: Error: .* `vpmovzxdq'
+.*:121: Error: .* `pmovzxwd'
+.*:122: Error: .* `vpmovzxwd'
+.*:123: Error: .* `vpmovzxwd'
+.*:125: Error: .* `pmovzxwq'
+.*:126: Error: .* `vpmovzxwq'
+.*:127: Error: .* `vpmovzxwq'
+.*:128: Error: .* `vpmovzxwq'
+.*:129: Error: .* `vpmovzxwq'
diff --git a/gas/testsuite/gas/i386/xmmword.s b/gas/testsuite/gas/i386/xmmword.s
new file mode 100644
index 0000000..47d2d8d
--- /dev/null
+++ b/gas/testsuite/gas/i386/xmmword.s
@@ -0,0 +1,129 @@
+ .text
+ .intel_syntax noprefix
+xmmword:
+ addsd xmm0, xmmword ptr [eax]
+ vaddsd xmm0, xmm0, xmmword ptr [eax]
+ vaddsd xmm0{k7}, xmm0, xmmword ptr [eax]
+
+ addss xmm0, xmmword ptr [eax]
+ vaddss xmm0, xmm0, xmmword ptr [eax]
+ vaddss xmm0{k7}, xmm0, xmmword ptr [eax]
+
+ vbroadcastf32x2 ymm0, xmmword ptr [eax]
+ vbroadcastf32x2 zmm0, xmmword ptr [eax]
+
+ vbroadcasti32x2 xmm0, xmmword ptr [eax]
+ vbroadcasti32x2 ymm0, xmmword ptr [eax]
+ vbroadcasti32x2 zmm0, xmmword ptr [eax]
+
+ vbroadcastsd ymm0, xmmword ptr [eax]
+ vbroadcastsd ymm0{k7}, xmmword ptr [eax]
+ vbroadcastsd zmm0{k7}, xmmword ptr [eax]
+
+ vbroadcastss xmm0, xmmword ptr [eax]
+ vbroadcastss xmm0{k7}, xmmword ptr [eax]
+ vbroadcastss ymm0, xmmword ptr [eax]
+ vbroadcastss ymm0{k7}, xmmword ptr [eax]
+ vbroadcastss zmm0, xmmword ptr [eax]
+
+ cvtdq2pd xmm0, xmmword ptr [eax]
+ vcvtdq2pd xmm0, xmmword ptr [eax]
+ vcvtdq2pd xmm0{k7}, xmmword ptr [eax]
+
+ vcvtph2ps xmm0, xmmword ptr [eax]
+ vcvtph2ps xmm0{k7}, xmmword ptr [eax]
+
+ cvtps2pd xmm0, xmmword ptr [eax]
+ vcvtps2pd xmm0, xmmword ptr [eax]
+ vcvtps2pd xmm0{k7}, xmmword ptr [eax]
+
+ vcvtps2ph xmmword ptr [eax], xmm0, 0
+ vcvtps2ph xmmword ptr [eax]{k7}, xmm0, 0
+
+ vcvtudq2pd xmm0, xmmword ptr [eax]
+
+ insertps xmm0, xmmword ptr [eax], 0
+ vinsertps xmm0, xmm0, xmmword ptr [eax], 0
+ {evex} vinsertps xmm0, xmm0, xmmword ptr [eax], 0
+
+ movddup xmm0, xmmword ptr [eax]
+ vmovddup xmm0, xmmword ptr [eax]
+ vmovddup xmm0{k7}, xmmword ptr [eax]
+
+ vpbroadcastb xmm0, xmmword ptr [eax]
+ vpbroadcastb xmm0{k7}, xmmword ptr [eax]
+ vpbroadcastb ymm0, xmmword ptr [eax]
+ vpbroadcastb ymm0{k7}, xmmword ptr [eax]
+ vpbroadcastb zmm0, xmmword ptr [eax]
+
+ vpbroadcastd xmm0, xmmword ptr [eax]
+ vpbroadcastd xmm0{k7}, xmmword ptr [eax]
+ vpbroadcastd ymm0, xmmword ptr [eax]
+ vpbroadcastd ymm0{k7}, xmmword ptr [eax]
+ vpbroadcastd zmm0, xmmword ptr [eax]
+
+ vpbroadcastq xmm0, xmmword ptr [eax]
+ vpbroadcastq xmm0{k7}, xmmword ptr [eax]
+ vpbroadcastq ymm0, xmmword ptr [eax]
+ vpbroadcastq ymm0{k7}, xmmword ptr [eax]
+ vpbroadcastq zmm0, xmmword ptr [eax]
+
+ vpbroadcastw xmm0, xmmword ptr [eax]
+ vpbroadcastw xmm0{k7}, xmmword ptr [eax]
+ vpbroadcastw ymm0, xmmword ptr [eax]
+ vpbroadcastw ymm0{k7}, xmmword ptr [eax]
+ vpbroadcastw zmm0, xmmword ptr [eax]
+
+ pmovsxbd xmm0, xmmword ptr [eax]
+ vpmovsxbd xmm0, xmmword ptr [eax]
+ vpmovsxbd xmm0{k7}, xmmword ptr [eax]
+ vpmovsxbd ymm0, xmmword ptr [eax]
+ vpmovsxbd ymm0{k7}, xmmword ptr [eax]
+
+ pmovsxbq xmm0, xmmword ptr [eax]
+ vpmovsxbq xmm0, xmmword ptr [eax]
+ vpmovsxbq xmm0{k7}, xmmword ptr [eax]
+ vpmovsxbq ymm0, xmmword ptr [eax]
+ vpmovsxbq ymm0{k7}, xmmword ptr [eax]
+ vpmovsxbq zmm0, xmmword ptr [eax]
+
+ pmovsxdq xmm0, xmmword ptr [eax]
+ vpmovsxdq xmm0, xmmword ptr [eax]
+ vpmovsxdq xmm0{k7}, xmmword ptr [eax]
+
+ pmovsxwd xmm0, xmmword ptr [eax]
+ vpmovsxwd xmm0, xmmword ptr [eax]
+ vpmovsxwd xmm0{k7}, xmmword ptr [eax]
+
+ pmovsxwq xmm0, xmmword ptr [eax]
+ vpmovsxwq xmm0, xmmword ptr [eax]
+ vpmovsxwq xmm0{k7}, xmmword ptr [eax]
+ vpmovsxwq ymm0, xmmword ptr [eax]
+ vpmovsxwq ymm0{k7}, xmmword ptr [eax]
+
+ pmovzxbd xmm0, xmmword ptr [eax]
+ vpmovzxbd xmm0, xmmword ptr [eax]
+ vpmovzxbd xmm0{k7}, xmmword ptr [eax]
+ vpmovzxbd ymm0, xmmword ptr [eax]
+ vpmovzxbd ymm0{k7}, xmmword ptr [eax]
+
+ pmovzxbq xmm0, xmmword ptr [eax]
+ vpmovzxbq xmm0, xmmword ptr [eax]
+ vpmovzxbq xmm0{k7}, xmmword ptr [eax]
+ vpmovzxbq ymm0, xmmword ptr [eax]
+ vpmovzxbq ymm0{k7}, xmmword ptr [eax]
+ vpmovzxbq zmm0, xmmword ptr [eax]
+
+ pmovzxdq xmm0, xmmword ptr [eax]
+ vpmovzxdq xmm0, xmmword ptr [eax]
+ vpmovzxdq xmm0{k7}, xmmword ptr [eax]
+
+ pmovzxwd xmm0, xmmword ptr [eax]
+ vpmovzxwd xmm0, xmmword ptr [eax]
+ vpmovzxwd xmm0{k7}, xmmword ptr [eax]
+
+ pmovzxwq xmm0, xmmword ptr [eax]
+ vpmovzxwq xmm0, xmmword ptr [eax]
+ vpmovzxwq xmm0{k7}, xmmword ptr [eax]
+ vpmovzxwq ymm0, xmmword ptr [eax]
+ vpmovzxwq ymm0{k7}, xmmword ptr [eax]