trunk/src/emu/cpu/arcompact/arcompact_make.py
| r242581 | r242582 | |
| 3 | 3 | import sys |
| 4 | 4 | import re |
| 5 | 5 | |
| 6 | def EmitGroup04_Handle_NZ_Flags(f, funcname, opname): |
| 7 | print >>f, " if (result & 0x80000000) { STATUS32_SET_N; }" |
| 8 | print >>f, " else { STATUS32_CLEAR_N; }" |
| 9 | print >>f, " if (result == 0x00000000) { STATUS32_SET_Z; }" |
| 10 | print >>f, " else { STATUS32_CLEAR_Z; }" |
| 6 | 11 | |
| 7 | | def EmitGroup04(f,funcname, opname, opexecute): |
| 12 | def EmitGroup04_no_Flags(f, funcname, opname): |
| 13 | print >>f, " // no flag changes" |
| 14 | |
| 15 | def EmitGroup04_unsupported_Flags(f, funcname, opname): |
| 16 | print >>f, " arcompact_fatal(\"arcompact_handle%s (%s) (F set)\\n\"); // not yet supported" % (funcname, opname) |
| 17 | |
| 18 | def EmitGroup04_Flaghandler(f,funcname, opname, flagcondition, flaghandler): |
| 19 | if flagcondition == -1: |
| 20 | print >>f, " if (F)" |
| 21 | print >>f, " {" |
| 22 | flaghandler(f, funcname, opname) |
| 23 | print >>f, " }" |
| 24 | elif flagcondition == 0: |
| 25 | print >>f, " if (0)" |
| 26 | print >>f, " {" |
| 27 | flaghandler(f, funcname, opname) |
| 28 | print >>f, " }" |
| 29 | elif flagcondition == 1: |
| 30 | print >>f, " if (1)" |
| 31 | print >>f, " {" |
| 32 | flaghandler(f, funcname, opname) |
| 33 | print >>f, " }" |
| 34 | |
| 35 | def EmitGroup04(f,funcname, opname, opexecute, ignore_a, breg_is_dst_only, flagcondition, flaghandler): |
| 8 | 36 | # the mode 0x00 handler |
| 9 | 37 | print >>f, "ARCOMPACT_RETTYPE arcompact_device::arcompact_handle%s_p00(OPS_32)" % (funcname) |
| 10 | 38 | print >>f, "{" |
| 11 | 39 | print >>f, " int size = 4;" |
| 40 | |
| 12 | 41 | print >>f, " UINT32 limm = 0;" |
| 42 | |
| 13 | 43 | print >>f, " int got_limm = 0;" |
| 14 | 44 | print >>f, " " |
| 15 | 45 | print >>f, " COMMON32_GET_breg;" |
| 16 | | print >>f, " COMMON32_GET_F;" |
| 46 | |
| 47 | if flagcondition == -1: |
| 48 | print >>f, " COMMON32_GET_F;" |
| 49 | |
| 17 | 50 | print >>f, " COMMON32_GET_creg;" |
| 18 | | print >>f, " COMMON32_GET_areg;" |
| 51 | |
| 52 | if ignore_a == 0: |
| 53 | print >>f, " COMMON32_GET_areg;" |
| 54 | elif ignore_a == 1: |
| 55 | print >>f, " //COMMON32_GET_areg; // areg is reserved / not used" |
| 56 | |
| 19 | 57 | print >>f, " " |
| 20 | | print >>f, " UINT32 b, c;" |
| 58 | |
| 59 | print >>f, " UINT32 c;" |
| 60 | if breg_is_dst_only == 0: |
| 61 | print >>f, " UINT32 b;" |
| 62 | print >>f, " " |
| 63 | print >>f, " if (breg == LIMM_REG)" |
| 64 | print >>f, " {" |
| 65 | print >>f, " GET_LIMM_32;" |
| 66 | print >>f, " size = 8;" |
| 67 | print >>f, " got_limm = 1;" |
| 68 | print >>f, " b = limm;" |
| 69 | print >>f, " }" |
| 70 | print >>f, " else" |
| 71 | print >>f, " {" |
| 72 | print >>f, " b = m_regs[breg];" |
| 73 | print >>f, " }" |
| 74 | |
| 21 | 75 | print >>f, " " |
| 22 | | print >>f, " if (breg == LIMM_REG)" |
| 23 | | print >>f, " {" |
| 24 | | print >>f, " GET_LIMM_32;" |
| 25 | | print >>f, " size = 8;" |
| 26 | | print >>f, " got_limm = 1;" |
| 27 | | print >>f, " b = limm;" |
| 28 | | print >>f, " }" |
| 29 | | print >>f, " else" |
| 30 | | print >>f, " {" |
| 31 | | print >>f, " b = m_regs[breg];" |
| 32 | | print >>f, " }" |
| 33 | | print >>f, " " |
| 34 | 76 | print >>f, " if (creg == LIMM_REG)" |
| 35 | 77 | print >>f, " {" |
| 36 | 78 | print >>f, " if (!got_limm)" |
| r242581 | r242582 | |
| 48 | 90 | print >>f, " /* todo: if areg = LIMM then there is no result (but since that register can never be read, I guess it doesn't matter if we store it there anyway?) */" |
| 49 | 91 | print >>f, " %s" % (opexecute) |
| 50 | 92 | print >>f, " " |
| 51 | | print >>f, " if (F)" |
| 52 | | print >>f, " {" |
| 53 | | print >>f, " arcompact_fatal(\"arcompact_handle%s_p00 (%s) (F set)\\n\"); // not yet supported" % (funcname, opname) |
| 54 | | print >>f, " }" |
| 93 | EmitGroup04_Flaghandler(f,funcname,opname,flagcondition,flaghandler) |
| 55 | 94 | print >>f, " return m_pc + (size >> 0);" |
| 56 | 95 | print >>f, "}" |
| 57 | 96 | print >>f, "" |
| r242581 | r242582 | |
| 60 | 99 | print >>f, "ARCOMPACT_RETTYPE arcompact_device::arcompact_handle%s_p01(OPS_32)" % (funcname) |
| 61 | 100 | print >>f, "{" |
| 62 | 101 | print >>f, " int size = 4;" |
| 63 | | print >>f, " UINT32 limm = 0;" |
| 102 | |
| 103 | if breg_is_dst_only == 0: |
| 104 | print >>f, " UINT32 limm = 0;" |
| 105 | |
| 64 | 106 | print >>f, "/* int got_limm = 0; */" |
| 65 | 107 | print >>f, " " |
| 66 | 108 | print >>f, " COMMON32_GET_breg;" |
| 67 | | print >>f, " COMMON32_GET_F;" |
| 109 | |
| 110 | if flagcondition == -1: |
| 111 | print >>f, " COMMON32_GET_F;" |
| 112 | |
| 68 | 113 | print >>f, " COMMON32_GET_u6;" |
| 69 | | print >>f, " COMMON32_GET_areg;" |
| 114 | |
| 115 | if ignore_a == 0: |
| 116 | print >>f, " COMMON32_GET_areg;" |
| 117 | elif ignore_a == 1: |
| 118 | print >>f, " //COMMON32_GET_areg; // areg is reserved / not used" |
| 119 | |
| 70 | 120 | print >>f, " " |
| 71 | | print >>f, " UINT32 b, c;" |
| 72 | | print >>f, " " |
| 73 | | print >>f, " /* is having b as LIMM valid here? LIMM vs. fixed u6 value makes no sense */" |
| 74 | | print >>f, " if (breg == LIMM_REG)" |
| 75 | | print >>f, " {" |
| 76 | | print >>f, " GET_LIMM_32;" |
| 77 | | print >>f, " size = 8;" |
| 78 | | print >>f, "/* got_limm = 1; */" |
| 79 | | print >>f, " b = limm;" |
| 80 | | print >>f, " }" |
| 81 | | print >>f, " else" |
| 82 | | print >>f, " {" |
| 83 | | print >>f, " b = m_regs[breg];" |
| 84 | | print >>f, " }" |
| 121 | |
| 122 | print >>f, " UINT32 c;" |
| 123 | if breg_is_dst_only == 0: |
| 124 | print >>f, " UINT32 b;" |
| 125 | print >>f, " " |
| 126 | print >>f, " /* is having b as LIMM valid here? LIMM vs. fixed u6 value makes no sense */" |
| 127 | print >>f, " if (breg == LIMM_REG)" |
| 128 | print >>f, " {" |
| 129 | print >>f, " GET_LIMM_32;" |
| 130 | print >>f, " size = 8;" |
| 131 | print >>f, "/* got_limm = 1; */" |
| 132 | print >>f, " b = limm;" |
| 133 | print >>f, " }" |
| 134 | print >>f, " else" |
| 135 | print >>f, " {" |
| 136 | print >>f, " b = m_regs[breg];" |
| 137 | print >>f, " }" |
| 138 | |
| 85 | 139 | print >>f, " " |
| 86 | 140 | print >>f, " c = u;" |
| 87 | 141 | print >>f, " " |
| 88 | 142 | print >>f, " /* todo: if areg = LIMM then there is no result (but since that register can never be read, I guess it doesn't matter if we store it there anyway?) */" |
| 89 | 143 | print >>f, " %s" % (opexecute) |
| 90 | 144 | print >>f, " " |
| 91 | | print >>f, " if (F)" |
| 92 | | print >>f, " {" |
| 93 | | print >>f, " arcompact_fatal(\"arcompact_handle%s_p01 (%s) (F set)\\n\"); // not yet supported" % (funcname, opname) |
| 94 | | print >>f, " }" |
| 145 | EmitGroup04_Flaghandler(f,funcname,opname,flagcondition,flaghandler) |
| 95 | 146 | print >>f, " return m_pc + (size >> 0);" |
| 96 | 147 | print >>f, "}" |
| 97 | 148 | print >>f, "" |
| r242581 | r242582 | |
| 100 | 151 | print >>f, "ARCOMPACT_RETTYPE arcompact_device::arcompact_handle%s_p10(OPS_32)" % (funcname) |
| 101 | 152 | print >>f, "{" |
| 102 | 153 | print >>f, " int size = 4;" |
| 103 | | print >>f, " UINT32 limm = 0;" |
| 154 | |
| 155 | if breg_is_dst_only == 0: |
| 156 | print >>f, " UINT32 limm = 0;" |
| 157 | |
| 104 | 158 | print >>f, "/* int got_limm = 0; */" |
| 105 | 159 | print >>f, " " |
| 106 | 160 | print >>f, " COMMON32_GET_breg;" |
| 107 | | print >>f, " COMMON32_GET_F;" |
| 161 | |
| 162 | if flagcondition == -1: |
| 163 | print >>f, " COMMON32_GET_F;" |
| 164 | |
| 108 | 165 | print >>f, " COMMON32_GET_s12;" |
| 109 | | print >>f, " COMMON32_GET_areg;" |
| 166 | |
| 167 | if ignore_a == 0: |
| 168 | print >>f, " COMMON32_GET_areg;" |
| 169 | elif ignore_a == 1: |
| 170 | print >>f, " //COMMON32_GET_areg; // areg is reserved / not used" |
| 171 | |
| 110 | 172 | print >>f, " " |
| 111 | | print >>f, " UINT32 b, c;" |
| 112 | | print >>f, " " |
| 113 | | print >>f, " /* is having b as LIMM valid here? LIMM vs. fixed u6 value makes no sense */" |
| 114 | | print >>f, " if (breg == LIMM_REG)" |
| 115 | | print >>f, " {" |
| 116 | | print >>f, " GET_LIMM_32;" |
| 117 | | print >>f, " size = 8;" |
| 118 | | print >>f, "/* got_limm = 1; */" |
| 119 | | print >>f, " b = limm;" |
| 120 | | print >>f, " }" |
| 121 | | print >>f, " else" |
| 122 | | print >>f, " {" |
| 123 | | print >>f, " b = m_regs[breg];" |
| 124 | | print >>f, " }" |
| 173 | print >>f, " UINT32 c;" |
| 174 | if breg_is_dst_only == 0: |
| 175 | print >>f, " UINT32 b;" |
| 176 | print >>f, " " |
| 177 | print >>f, " /* is having b as LIMM valid here? LIMM vs. fixed u6 value makes no sense */" |
| 178 | print >>f, " if (breg == LIMM_REG)" |
| 179 | print >>f, " {" |
| 180 | print >>f, " GET_LIMM_32;" |
| 181 | print >>f, " size = 8;" |
| 182 | print >>f, "/* got_limm = 1; */" |
| 183 | print >>f, " b = limm;" |
| 184 | print >>f, " }" |
| 185 | print >>f, " else" |
| 186 | print >>f, " {" |
| 187 | print >>f, " b = m_regs[breg];" |
| 188 | print >>f, " }" |
| 189 | |
| 125 | 190 | print >>f, " " |
| 126 | 191 | print >>f, " c = (UINT32)S;" |
| 127 | 192 | print >>f, " " |
| 128 | 193 | print >>f, " /* todo: if areg = LIMM then there is no result (but since that register can never be read, I guess it doesn't matter if we store it there anyway?) */" |
| 129 | 194 | print >>f, " %s" % (opexecute) |
| 130 | 195 | print >>f, " " |
| 131 | | print >>f, " if (F)" |
| 132 | | print >>f, " {" |
| 133 | | print >>f, " arcompact_fatal(\"arcompact_handle%s_p01 (%s) (F set)\\n\"); // not yet supported" % (funcname, opname) |
| 134 | | print >>f, " }" |
| 196 | EmitGroup04_Flaghandler(f,funcname,opname,flagcondition,flaghandler) |
| 135 | 197 | print >>f, " return m_pc + (size >> 0);" |
| 136 | 198 | print >>f, "}" |
| 137 | 199 | print >>f, "" |
| r242581 | r242582 | |
| 182 | 244 | sys.exit(1) |
| 183 | 245 | |
| 184 | 246 | |
| 185 | | EmitGroup04(f, "04_00", "ADD", "m_regs[areg] = b + c;" ) |
| 247 | EmitGroup04(f, "04_00", "ADD", "UINT32 result = b + c; m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 186 | 248 | |
| 187 | | EmitGroup04(f, "04_02", "SUB", "m_regs[areg] = b - c;" ) |
| 249 | EmitGroup04(f, "04_02", "SUB", "UINT32 result = b - c; m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 188 | 250 | |
| 189 | | EmitGroup04(f, "04_04", "AND", "m_regs[areg] = b & c;" ) |
| 190 | | EmitGroup04(f, "04_05", "OR", "m_regs[areg] = b | c;" ) |
| 191 | | EmitGroup04(f, "04_06", "BIC", "m_regs[areg] = b & (~c);" ) |
| 192 | | EmitGroup04(f, "04_07", "XOR", "m_regs[areg] = b ^ c;" ) |
| 251 | EmitGroup04(f, "04_04", "AND", "UINT32 result = b & c; m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 252 | EmitGroup04(f, "04_05", "OR", "UINT32 result = b | c; m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 253 | EmitGroup04(f, "04_06", "BIC", "UINT32 result = b & (~c); m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 254 | EmitGroup04(f, "04_07", "XOR", "UINT32 result = b ^ c; m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 193 | 255 | |
| 194 | | EmitGroup04(f, "04_0f", "BSET", "m_regs[areg] = b | (1 << (c & 0x1f));" ) |
| 256 | EmitGroup04(f, "04_0a", "MOV", "UINT32 result = c; m_regs[breg] = result;", 1,1, -1, EmitGroup04_Handle_NZ_Flags ) |
| 195 | 257 | |
| 196 | | EmitGroup04(f, "04_15", "ADD2", "m_regs[areg] = b + (c << 2);" ) |
| 197 | | EmitGroup04(f, "04_16", "ADD3", "m_regs[areg] = b + (c << 3);" ) |
| 258 | EmitGroup04(f, "04_0f", "BSET", "UINT32 result = b | (1 << (c & 0x1f)); m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 198 | 259 | |
| 260 | EmitGroup04(f, "04_15", "ADD2", "UINT32 result = b + (c << 2); m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 261 | EmitGroup04(f, "04_16", "ADD3", "UINT32 result = b + (c << 3); m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 199 | 262 | |
| 200 | | EmitGroup04(f, "05_00", "ASL", "m_regs[areg] = b << (c&0x1f);" ) |
| 201 | | EmitGroup04(f, "05_01", "LSR", "m_regs[areg] = b >> (c&0x1f);" ) |
| 202 | 263 | |
| 264 | EmitGroup04(f, "05_00", "ASL", "UINT32 result = b << (c&0x1f); m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 265 | EmitGroup04(f, "05_01", "LSR", "UINT32 result = b >> (c&0x1f); m_regs[areg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 266 | |
| 203 | 267 | # xxx_S b, b, u5 format opcodes |
| 204 | 268 | EmitGroup17(f, "17_00", "ASL_S", "m_regs[breg] = m_regs[breg] << (u&0x1f);" ) |
| 205 | 269 | EmitGroup17(f, "17_01", "LSR_S", "m_regs[breg] = m_regs[breg] >> (u&0x1f);" ) |