diff options
author | Jan Beulich <jbeulich@novell.com> | 2018-03-22 08:31:43 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2018-03-22 08:31:43 +0100 |
commit | d6793fa1acf384a93c83db6eb916e3b9eedd9ef4 (patch) | |
tree | 8c6ac3bc26803c338b3ae5a9edce2ff5f025f7e6 /gas | |
parent | f776822506b417ce25170c67c33cc05870b37adf (diff) | |
download | gdb-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/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/xmmword.l | 101 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/xmmword.s | 129 |
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] |