blob: e8c55106f558694f19705d012cfdb706a062d41b [file] [log] [blame]
Andrew Geissler10fa1492020-12-11 16:25:29 -06001From 2c051a6d5326e34cb4a3170073cda17e7269055d Mon Sep 17 00:00:00 2001
Andrew Geissler84ad7c52020-06-27 00:00:16 -05002From: Nagaraju <nmekala@xilinx.com>
3Date: Wed, 22 Jan 2020 16:31:12 +0530
Andrew Geissler10fa1492020-12-11 16:25:29 -06004Subject: [PATCH 28/52] Fixed bug in generation of IMML instruction for the new
Andrew Geissler84ad7c52020-06-27 00:00:16 -05005 MB-64 instructions with single register.
6
7---
8 gas/config/tc-microblaze.c | 50 +++++++++++++++++++++++++++++++++++---
9 1 file changed, 47 insertions(+), 3 deletions(-)
10
11diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c
Andrew Geissler10fa1492020-12-11 16:25:29 -060012index aef54ad83f..647cfb6869 100644
Andrew Geissler84ad7c52020-06-27 00:00:16 -050013--- a/gas/config/tc-microblaze.c
14+++ b/gas/config/tc-microblaze.c
Andrew Geissler10fa1492020-12-11 16:25:29 -060015@@ -1639,12 +1639,56 @@ md_assemble (char * str)
Andrew Geissler84ad7c52020-06-27 00:00:16 -050016 exp.X_add_symbol,
17 exp.X_add_number,
18 (char *) opc);
19- immedl = 0L;
20+ immed = 0L;
21 }
22 else
23 {
24 output = frag_more (isize);
25 immed = exp.X_add_number;
26+ temp = ((long long)immed) & 0xFFFFFFFFFFFF8000;
27+ if (temp != 0 && temp != 0xFFFFFFFFFFFF8000 && temp != 0x8000)
28+ {
29+ /* Needs an immediate inst. */
30+ if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887)
31+ {
32+ opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml");
33+ if (opcode1 == NULL)
34+ {
35+ as_bad (_("unknown opcode \"%s\""), "imml");
36+ return;
37+ }
38+ inst1 = opcode1->bit_sequence;
39+ inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK;
40+ output[0] = INST_BYTE0 (inst1);
41+ output[1] = INST_BYTE1 (inst1);
42+ output[2] = INST_BYTE2 (inst1);
43+ output[3] = INST_BYTE3 (inst1);
44+ output = frag_more (isize);
45+ }
46+ else {
47+ opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml");
48+ opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml");
49+ if (opcode1 == NULL || opcode2 == NULL)
50+ {
51+ as_bad (_("unknown opcode \"%s\""), "imml");
52+ return;
53+ }
54+ inst1 = opcode2->bit_sequence;
55+ inst1 |= ((immed & 0xFFFFFF0000000000L) >> 40) & IMML_MASK;
56+ output[0] = INST_BYTE0 (inst1);
57+ output[1] = INST_BYTE1 (inst1);
58+ output[2] = INST_BYTE2 (inst1);
59+ output[3] = INST_BYTE3 (inst1);
60+ output = frag_more (isize);
61+ inst1 = opcode1->bit_sequence;
62+ inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK;
63+ output[0] = INST_BYTE0 (inst1);
64+ output[1] = INST_BYTE1 (inst1);
65+ output[2] = INST_BYTE2 (inst1);
66+ output[3] = INST_BYTE3 (inst1);
67+ output = frag_more (isize);
68+ }
69+ }
70 }
71 inst |= (reg1 << RD_LOW) & RD_MASK;
72 inst |= (immed << IMM_LOW) & IMM16_MASK;
Andrew Geissler10fa1492020-12-11 16:25:29 -060073@@ -2138,8 +2182,8 @@ md_assemble (char * str)
74 streq (name, "breaid") ||
Andrew Geissler84ad7c52020-06-27 00:00:16 -050075 streq (name, "brai") || streq (name, "braid")))
76 {
77- temp = immed & 0xFFFFFFFFFFFF8000;
78- if (temp != 0)
79+ temp = ((long long)immed) & 0xFFFFFFFFFFFF8000;
80+ if (temp != 0 && temp != 0xFFFFFFFFFFFF8000 && temp != 0x8000)
81 {
82 /* Needs an immediate inst. */
83 if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887)
84--
852.17.1
86