macromem.isa (6258:dadfc8d8b6dd) macromem.isa (6304:a2af27fbc06c)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2007-2008 The Florida State University
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met: redistributions of source code must retain the above copyright

--- 38 unchanged lines hidden (view full) ---

47}};
48
49def template MacroStoreConstructor {{
50inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
51 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
52{
53 %(constructor)s;
54 uint32_t regs_to_handle = reglist;
1// -*- mode:c++ -*-
2
3// Copyright (c) 2007-2008 The Florida State University
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met: redistributions of source code must retain the above copyright

--- 38 unchanged lines hidden (view full) ---

47}};
48
49def template MacroStoreConstructor {{
50inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
51 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
52{
53 %(constructor)s;
54 uint32_t regs_to_handle = reglist;
55 uint32_t j = 0,
56 start_addr = 0,
57 end_addr = 0;
55 uint32_t start_addr = 0;
58
59 switch (puswl)
60 {
61 case 0x00: // stmda
62 case 0x01: // L ldmda_l
63 case 0x02: // W stmda_w
64 case 0x03: // WL ldmda_wl
65 start_addr = (ones << 2) - 4;
56
57 switch (puswl)
58 {
59 case 0x00: // stmda
60 case 0x01: // L ldmda_l
61 case 0x02: // W stmda_w
62 case 0x03: // WL ldmda_wl
63 start_addr = (ones << 2) - 4;
66 end_addr = 0;
67 break;
68 case 0x08: // U stmia_u
69 case 0x09: // U L ldmia_ul
70 case 0x0a: // U W stmia
71 case 0x0b: // U WL ldmia
72 start_addr = 0;
64 break;
65 case 0x08: // U stmia_u
66 case 0x09: // U L ldmia_ul
67 case 0x0a: // U W stmia
68 case 0x0b: // U WL ldmia
69 start_addr = 0;
73 end_addr = (ones << 2) - 4;
74 break;
75 case 0x10: // P stmdb
76 case 0x11: // P L ldmdb
77 case 0x12: // P W stmdb
78 case 0x13: // P WL ldmdb
79 start_addr = (ones << 2); // U-bit is already 0 for subtract
70 break;
71 case 0x10: // P stmdb
72 case 0x11: // P L ldmdb
73 case 0x12: // P W stmdb
74 case 0x13: // P WL ldmdb
75 start_addr = (ones << 2); // U-bit is already 0 for subtract
80 end_addr = 4; // negative 4
81 break;
82 case 0x18: // PU stmib
83 case 0x19: // PU L ldmib
84 case 0x1a: // PU W stmib
85 case 0x1b: // PU WL ldmib
86 start_addr = 4;
76 break;
77 case 0x18: // PU stmib
78 case 0x19: // PU L ldmib
79 case 0x1a: // PU W stmib
80 case 0x1b: // PU WL ldmib
81 start_addr = 4;
87 end_addr = (ones << 2) + 4;
88 break;
89 default:
90 panic("Unhandled Load/Store Multiple Instruction, "
91 "puswl = 0x%x", (unsigned) puswl);
92 break;
93 }
94
82 break;
83 default:
84 panic("Unhandled Load/Store Multiple Instruction, "
85 "puswl = 0x%x", (unsigned) puswl);
86 break;
87 }
88
95 //TODO - Add addi_uop/subi_uop here to create starting addresses
96 //Just using addi with 0 offset makes a "copy" of Rn for our use
97 uint32_t newMachInst = 0;
98 newMachInst = machInst & 0xffff0000;
99 microOps[0] = new Addi_uop(newMachInst);
100
89 uint32_t newMachInst = 0;
90 newMachInst = machInst & 0xffff0000;
91 microOps[0] = new Addi_uop(newMachInst);
92
93 unsigned j = 0;
101 for (int i = 1; i < ones+1; i++)
102 {
103 // Get next available bit for transfer
104 while (! ( regs_to_handle & (1<<j)))
105 j++;
106 regs_to_handle &= ~(1<<j);
107
108 microOps[i] = gen_ldrstr_uop(machInst, loadop, j, start_addr);
109
110 if (up)
111 start_addr += 4;
112 else
113 start_addr -= 4;
114 }
115
94 for (int i = 1; i < ones+1; i++)
95 {
96 // Get next available bit for transfer
97 while (! ( regs_to_handle & (1<<j)))
98 j++;
99 regs_to_handle &= ~(1<<j);
100
101 microOps[i] = gen_ldrstr_uop(machInst, loadop, j, start_addr);
102
103 if (up)
104 start_addr += 4;
105 else
106 start_addr -= 4;
107 }
108
116 /* TODO: Take a look at how these 2 values should meet together
117 if (start_addr != (end_addr - 4))
118 {
119 fprintf(stderr, "start_addr: %d\n", start_addr);
120 fprintf(stderr, "end_addr: %d\n", end_addr);
121 panic("start_addr does not meet end_addr");
122 }
123 */
124
125 if (writeback)
126 {
127 uint32_t newMachInst = machInst & 0xf0000000;
128 uint32_t rn = (machInst >> 16) & 0x0f;
129 // 3322 2222 2222 1111 1111 11
130 // 1098 7654 3210 9876 5432 1098 7654 3210
131 // COND 0010 0100 [RN] [RD] 0000 [ IMM ]
132 // sub rn, rn, imm

--- 150 unchanged lines hidden ---
109 if (writeback)
110 {
111 uint32_t newMachInst = machInst & 0xf0000000;
112 uint32_t rn = (machInst >> 16) & 0x0f;
113 // 3322 2222 2222 1111 1111 11
114 // 1098 7654 3210 9876 5432 1098 7654 3210
115 // COND 0010 0100 [RN] [RD] 0000 [ IMM ]
116 // sub rn, rn, imm

--- 150 unchanged lines hidden ---