decoder.isa revision 6019
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 9// notice, this list of conditions and the following disclaimer; 10// redistributions in binary form must reproduce the above copyright 11// notice, this list of conditions and the following disclaimer in the 12// documentation and/or other materials provided with the distribution; 13// neither the name of the copyright holders nor the names of its 14// contributors may be used to endorse or promote products derived from 15// this software without specific prior written permission. 16// 17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28// 29// Authors: Stephen Hines 30 31//////////////////////////////////////////////////////////////////// 32// 33// The actual ARM ISA decoder 34// -------------------------- 35// The following instructions are specified in the ARM ISA 36// Specification. Decoding closely follows the style specified 37// in the ARM ISA specification document starting with Table B.1 or 3-1 38// 39// 40decode COND_CODE default Unknown::unknown() { 41 0xf: decode COND_CODE { 42 0x0: decode OPCODE_27_25 { 43 // Just a simple trick to allow us to specify our new uops here 44 0x0: PredImmOp::addi_uop({{ Raddr = Rn + rotated_imm; }}, 45 'IsMicroop'); 46 0x1: PredImmOp::subi_uop({{ Raddr = Rn - rotated_imm; }}, 47 'IsMicroop'); 48 0x2: ArmLoadMemory::ldr_uop({{ Rd = Mem; }}, 49 {{ EA = Raddr + disp; }}, 50 inst_flags = [IsMicroop]); 51 0x3: ArmStoreMemory::str_uop({{ Mem = Rd; }}, 52 {{ EA = Raddr + disp; }}, 53 inst_flags = [IsMicroop]); 54 0x4: PredImmOp::addi_rd_uop({{ Rd = Rn + rotated_imm; }}, 55 'IsMicroop'); 56 0x5: PredImmOp::subi_rd_uop({{ Rd = Rn - rotated_imm; }}, 57 'IsMicroop'); 58 } 59 0x1: decode OPCODE_27_25 { 60 0x0: PredIntOp::mvtd_uop({{ Fd.ud = ((uint64_t) Rhi << 32)|Rlo; }}, 61 'IsMicroop'); 62 0x1: PredIntOp::mvfd_uop({{ Rhi = (Fd.ud >> 32) & 0xffffffff; 63 Rlo = Fd.ud & 0xffffffff; }}, 64 'IsMicroop'); 65 0x2: ArmLoadMemory::ldhi_uop({{ Rhi = Mem; }}, 66 {{ EA = Rn + disp; }}, 67 inst_flags = [IsMicroop]); 68 0x3: ArmLoadMemory::ldlo_uop({{ Rlo = Mem; }}, 69 {{ EA = Rn + disp; }}, 70 inst_flags = [IsMicroop]); 71 0x4: ArmStoreMemory::sthi_uop({{ Mem = Rhi; }}, 72 {{ EA = Rn + disp; }}, 73 inst_flags = [IsMicroop]); 74 0x5: ArmStoreMemory::stlo_uop({{ Mem = Rlo; }}, 75 {{ EA = Rn + disp; }}, 76 inst_flags = [IsMicroop]); 77 } 78 default: Unknown::unknown(); // TODO: Ignore other NV space for now 79 } 80 format BasicOp{ 81 default: decode OPCODE_27_25 { 82 0x0: decode OPCODE_4 { 83 0: decode S_FIELD { 84 0: decode OPCODE_24_21 { 85 format PredIntOp { 86 0x0: and({{ Rd = Rn & Rm_Imm; }}); 87 0x1: eor({{ Rd = Rn ^ Rm_Imm; }}); 88 0x2: sub({{ Rd = Rn - Rm_Imm; }}); 89 0x3: rsb({{ Rd = Rm_Imm - Rn; }}); 90 0x4: add({{ Rd = Rn + Rm_Imm; }}); 91 0x5: adc({{ Rd = Rn + Rm_Imm + Cpsr<29:>; }}); 92 0x6: sbc({{ Rd = Rn - Rm_Imm + Cpsr<29:> - 1; }}); 93 0x7: rsc({{ Rd = Rm_Imm - Rn + Cpsr<29:> - 1; }}); 94 //0x8:mrs_cpsr -- TODO 95 //0x9:msr_cpsr -- TODO 96 //0xa:mrs_spsr -- TODO 97 //0xb:msr_spsr -- TODO 98 0xc: orr({{ Rd = Rn | Rm_Imm; }}); 99 0xd: mov({{ Rd = Rm_Imm; }}); 100 0xe: bic({{ Rd = Rn & ~Rm_Imm; }}); 101 0xf: mvn({{ Rd = ~Rm_Imm; }}); 102 } 103 } 104 1: decode OPCODE_24_21 { 105 format PredIntOpCc { 106 0x0: ands({{ 107 uint32_t resTemp; 108 Rd = resTemp = Rn & Rm_Imm; 109 }}, 110 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 111 {{ Cpsr<28:> }}); 112 0x1: eors({{ 113 uint32_t resTemp; 114 Rd = resTemp = Rn ^ Rm_Imm; 115 }}, 116 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 117 {{ Cpsr<28:> }}); 118 0x2: subs({{ 119 uint32_t resTemp, 120 val2 = Rm_Imm; 121 Rd = resTemp = Rn - val2; 122 }}, 123 {{ arm_sub_carry(resTemp, Rn, val2) }}, 124 {{ arm_sub_overflow(resTemp, Rn, val2) }}); 125 0x3: rsbs({{ 126 uint32_t resTemp, 127 val2 = Rm_Imm; 128 Rd = resTemp = val2 - Rn; 129 }}, 130 {{ arm_sub_carry(resTemp, val2, Rn) }}, 131 {{ arm_sub_overflow(resTemp, val2, Rn) }}); 132 0x4: adds({{ 133 uint32_t resTemp, 134 val2 = Rm_Imm; 135 Rd = resTemp = Rn + val2; 136 }}, 137 {{ arm_add_carry(resTemp, Rn, val2) }}, 138 {{ arm_add_overflow(resTemp, Rn, val2) }}); 139 0x5: adcs({{ 140 uint32_t resTemp, 141 val2 = Rm_Imm; 142 Rd = resTemp = Rn + val2 + Cpsr<29:>; 143 }}, 144 {{ arm_add_carry(resTemp, Rn, val2) }}, 145 {{ arm_add_overflow(resTemp, Rn, val2) }}); 146 0x6: sbcs({{ 147 uint32_t resTemp, 148 val2 = Rm_Imm; 149 Rd = resTemp = Rn - val2 + Cpsr<29:> - 1; 150 }}, 151 {{ arm_sub_carry(resTemp, Rn, val2) }}, 152 {{ arm_sub_overflow(resTemp, Rn, val2) }}); 153 0x7: rscs({{ 154 uint32_t resTemp, 155 val2 = Rm_Imm; 156 Rd = resTemp = val2 - Rn + Cpsr<29:> - 1; 157 }}, 158 {{ arm_sub_carry(resTemp, val2, Rn) }}, 159 {{ arm_sub_overflow(resTemp, val2, Rn) }}); 160 0x8: tst({{ 161 uint32_t resTemp; 162 resTemp = Rn & Rm_Imm; 163 }}, 164 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 165 {{ Cpsr<28:> }}); 166 0x9: teq({{ 167 uint32_t resTemp; 168 resTemp = Rn ^ Rm_Imm; 169 }}, 170 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 171 {{ Cpsr<28:> }}); 172 0xa: cmp({{ 173 uint32_t resTemp, 174 val2 = Rm_Imm; 175 resTemp = Rn - val2; 176 }}, 177 {{ arm_sub_carry(resTemp, Rn, val2) }}, 178 {{ arm_sub_overflow(resTemp, Rn, val2) }}); 179 0xb: cmn({{ 180 uint32_t resTemp, 181 val2 = Rm_Imm; 182 resTemp = Rn + val2; 183 }}, 184 {{ arm_add_carry(resTemp, Rn, val2) }}, 185 {{ arm_add_overflow(resTemp, Rn, val2) }}); 186 0xc: orrs({{ 187 uint32_t resTemp, 188 val2 = Rm_Imm; 189 Rd = resTemp = Rn | val2; 190 }}, 191 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 192 {{ Cpsr<28:> }}); 193 0xd: movs({{ 194 uint32_t resTemp; 195 Rd = resTemp = Rm_Imm; 196 }}, 197 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 198 {{ Cpsr<28:> }}); 199 0xe: bics({{ 200 uint32_t resTemp; 201 Rd = resTemp = Rn & ~Rm_Imm; 202 }}, 203 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 204 {{ Cpsr<28:> }}); 205 0xf: mvns({{ 206 uint32_t resTemp; 207 Rd = resTemp = ~Rm_Imm; 208 }}, 209 {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>) }}, 210 {{ Cpsr<28:> }}); 211 } 212 } 213 } 214 1: decode OPCODE_7 { 215 0: decode S_FIELD { 216 0: decode OPCODE_24_21 { 217 format PredIntOp { 218 0x0: and_rs({{ Rd = Rn & Rm_Rs; }}); 219 0x1: eor_rs({{ Rd = Rn ^ Rm_Rs; }}); 220 0x2: sub_rs({{ Rd = Rn - Rm_Rs; }}); 221 0x3: rsb_rs({{ Rd = Rm_Rs - Rn; }}); 222 0x4: add_rs({{ Rd = Rn + Rm_Rs; }}); 223 0x5: adc_rs({{ Rd = Rn + Rm_Rs + Cpsr<29:>; }}); 224 0x6: sbc_rs({{ Rd = Rn - Rm_Rs + Cpsr<29:> - 1; }}); 225 0x7: rsc_rs({{ Rd = Rm_Rs - Rn + Cpsr<29:> - 1; }}); 226 0xc: orr_rs({{ Rd = Rn | Rm_Rs; }}); 227 0xd: mov_rs({{ Rd = Rm_Rs; }}); 228 0xe: bic_rs({{ Rd = Rn & ~Rm_Rs; }}); 229 0xf: mvn_rs({{ Rd = ~Rm_Rs; }}); 230 default: decode OPCODE_7_4 { 231 0x1: decode OPCODE_24_21 { 232 0x9: BranchExchange::bx({{ }}); 233 0xb: PredOp::clz({{ 234 if (Rm == 0) 235 Rd = 32; 236 else 237 { 238 int i; 239 for (i = 0; i < 32; i++) 240 { 241 if (Rm & (1<<(31-i))) 242 break; 243 } 244 Rd = i; 245 } 246 }}); 247 } 248 0x3: decode OPCODE_24_21 { 249 0x9: BranchExchange::blx({{ LR = NPC; }}); 250 } 251 } 252 } 253 } 254 1: decode OPCODE_24_21 { 255 format PredIntOpCc { 256 0x0: ands_rs({{ 257 uint32_t resTemp; 258 Rd = resTemp = Rn & Rm_Rs; 259 }}, 260 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 261 {{ Cpsr<28:> }}); 262 0x1: eors_rs({{ 263 uint32_t resTemp; 264 Rd = resTemp = Rn ^ Rm_Rs; 265 }}, 266 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 267 {{ Cpsr<28:> }}); 268 0x2: subs_rs({{ 269 uint32_t resTemp, 270 val2 = Rm_Rs; 271 Rd = resTemp = Rn - val2; 272 }}, 273 {{ arm_sub_carry(resTemp, Rn, val2) }}, 274 {{ arm_sub_overflow(resTemp, Rn, val2) }}); 275 0x3: rsbs_rs({{ 276 uint32_t resTemp, 277 val2 = Rm_Rs; 278 Rd = resTemp = val2 - Rn; 279 }}, 280 {{ arm_sub_carry(resTemp, val2, Rn) }}, 281 {{ arm_sub_overflow(resTemp, val2, Rn) }}); 282 0x4: adds_rs({{ 283 uint32_t resTemp, 284 val2 = Rm_Rs; 285 Rd = resTemp = Rn + val2; 286 }}, 287 {{ arm_add_carry(resTemp, Rn, val2) }}, 288 {{ arm_add_overflow(resTemp, Rn, val2) }}); 289 0x5: adcs_rs({{ 290 uint32_t resTemp, 291 val2 = Rm_Rs; 292 Rd = resTemp = Rn + val2 + Cpsr<29:>; 293 }}, 294 {{ arm_add_carry(resTemp, Rn, val2) }}, 295 {{ arm_add_overflow(resTemp, Rn, val2) }}); 296 0x6: sbcs_rs({{ 297 uint32_t resTemp, 298 val2 = Rm_Rs; 299 Rd = resTemp = Rn - val2 + Cpsr<29:> - 1; 300 }}, 301 {{ arm_sub_carry(resTemp, Rn, val2) }}, 302 {{ arm_sub_overflow(resTemp, Rn, val2) }}); 303 0x7: rscs_rs({{ 304 uint32_t resTemp, 305 val2 = Rm_Rs; 306 Rd = resTemp = val2 - Rn + Cpsr<29:> - 1; 307 }}, 308 {{ arm_sub_carry(resTemp, val2, Rn) }}, 309 {{ arm_sub_overflow(resTemp, val2, Rn) }}); 310 0x8: tst_rs({{ 311 uint32_t resTemp; 312 resTemp = Rn & Rm_Rs; 313 }}, 314 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 315 {{ Cpsr<28:> }}); 316 0x9: teq_rs({{ 317 uint32_t resTemp; 318 resTemp = Rn ^ Rm_Rs; 319 }}, 320 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 321 {{ Cpsr<28:> }}); 322 0xa: cmp_rs({{ 323 uint32_t resTemp, 324 val2 = Rm_Rs; 325 resTemp = Rn - val2; 326 }}, 327 {{ arm_sub_carry(resTemp, Rn, val2) }}, 328 {{ arm_sub_overflow(resTemp, Rn, val2) }}); 329 0xb: cmn_rs({{ 330 uint32_t resTemp, 331 val2 = Rm_Rs; 332 resTemp = Rn + val2; 333 }}, 334 {{ arm_add_carry(resTemp, Rn, val2) }}, 335 {{ arm_add_overflow(resTemp, Rn, val2) }}); 336 0xc: orrs_rs({{ 337 uint32_t resTemp, 338 val2 = Rm_Rs; 339 Rd = resTemp = Rn | val2; 340 }}, 341 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 342 {{ Cpsr<28:> }}); 343 0xd: movs_rs({{ 344 uint32_t resTemp; 345 Rd = resTemp = Rm_Rs; 346 }}, 347 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 348 {{ Cpsr<28:> }}); 349 0xe: bics_rs({{ 350 uint32_t resTemp; 351 Rd = resTemp = Rn & ~Rm_Rs; 352 }}, 353 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 354 {{ Cpsr<28:> }}); 355 0xf: mvns_rs({{ 356 uint32_t resTemp; 357 Rd = resTemp = ~Rm_Rs; 358 }}, 359 {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }}, 360 {{ Cpsr<28:> }}); 361 } 362 } 363 } 364 1: decode OPCODE_6_5 { 365 0x0: decode OPCODE_24 { 366 0: decode LUAS { 367 format PredIntOp { 368 0x0: mul({{ Rn = Rm * Rs; }}); 369 0x1: PredIntOpCc::muls({{ 370 uint32_t resTemp; 371 Rn = resTemp = Rm * Rs; 372 }}, 373 {{ Cpsr<29:> }}, 374 {{ Cpsr<28:> }}); 375 0x2: mla_a({{ Rn = Rm * Rs + Rd; }}); 376 0x8: umull_l({{ 377 uint64_t resTemp; 378 resTemp = ((uint64_t)Rm)*((uint64_t)Rs); 379 Rd = (uint32_t)(resTemp & 0xffffffff); 380 Rn = (uint32_t)(resTemp >> 32); 381 }}); 382 0xa: umlal_lu({{ 383 uint64_t resTemp; 384 resTemp = ((uint64_t)Rm)*((uint64_t)Rs); 385 resTemp += ((uint64_t)Rn << 32)+((uint64_t)Rd); 386 Rd = (uint32_t)(resTemp & 0xffffffff); 387 Rn = (uint32_t)(resTemp >> 32); 388 }}); 389 0xc: smull_lu({{ 390 int64_t resTemp; 391 resTemp = ((int64_t)Rm)*((int64_t)Rs); 392 Rd = (int32_t)(resTemp & 0xffffffff); 393 Rn = (int32_t)(resTemp >> 32); 394 }}); 395 } 396 } 397 } 398 0x1: decode PUIWL { 399 0x04,0x0c: ArmStoreMemory::strh_i({{ Mem.uh = Rd.uh; 400 Rn = Rn + hilo; }}, 401 {{ EA = Rn; }}); 402 0x05,0x0d: ArmLoadMemory::ldrh_il({{ Rd.uh = Mem.uh; 403 Rn = Rn + hilo; }}, 404 {{ EA = Rn; }}); 405 0x10,0x18: ArmStoreMemory::strh_p({{ Mem.uh = Rd.uh; }}, 406 {{ EA = Rn + Rm; }}); 407 0x11,0x19: ArmLoadMemory::ldrh_pl({{ Rd.uh = Mem.uh; }}, 408 {{ EA = Rn + Rm; }}); 409 0x12,0x1a: ArmStoreMemory::strh_pw({{ Mem.uh = Rd.uh; 410 Rn = Rn + Rm; }}, 411 {{ EA = Rn + Rm; }}); 412 0x13,0x1b: ArmLoadMemory::ldrh_pwl({{ Rd.uh = Mem.uh; 413 Rn = Rn + Rm; }}, 414 {{ EA = Rn + Rm; }}); 415 0x14,0x1c: ArmStoreMemory::strh_pi({{ Mem.uh = Rd.uh; }}, 416 {{ EA = Rn + hilo; }}); 417 0x15,0x1d: ArmLoadMemory::ldrh_pil({{ Rd.uh = Mem.uh; }}, 418 {{ EA = Rn + hilo; }}); 419 0x16,0x1e: ArmStoreMemory::strh_piw({{ Mem.uh = Rd.uh; 420 Rn = Rn + hilo; }}, 421 {{ EA = Rn + hilo; }}); 422 0x17,0x1f: ArmLoadMemory::ldrh_piwl({{ Rd.uh = Mem.uh; 423 Rn = Rn + hilo; }}, 424 {{ EA = Rn + hilo; }}); 425 } 426 0x2: decode PUIWL { 427 format ArmLoadMemory { 428 0x11,0x19: ldrsb_pl({{ Rd.sb = Mem.sb; }}, 429 {{ EA = Rn + Rm; }}); 430 0x13,0x1b: ldrsb_pwl({{ Rd.sb = Mem.sb; 431 Rn = Rn + Rm; }}, 432 {{ EA = Rn + Rm; }}); 433 0x15,0x1d: ldrsb_pil({{ Rd.sb = Mem.sb; }}, 434 {{ EA = Rn + hilo; }}); 435 0x17,0x1f: ldrsb_piwl({{ Rd.sb = Mem.sb; 436 Rn = Rn + hilo; }}, 437 {{ EA = Rn + hilo; }}); 438 } 439 } 440 0x3: decode PUIWL { 441 format ArmLoadMemory { 442 0x11,0x19: ldrsh_pl({{ Rd.sh = Mem.sh; }}, 443 {{ EA = Rn + Rm; }}); 444 0x13,0x1b: ldrsh_pwl({{ Rd.sh = Mem.sh; 445 Rn = Rn + Rm; }}, 446 {{ EA = Rn + Rm; }}); 447 0x15,0x1d: ldrsh_pil({{ Rd.sh = Mem.sh; }}, 448 {{ EA = Rn + hilo; }}); 449 0x17,0x1f: ldrsh_piwl({{ Rd.sh = Mem.sh; 450 Rn = Rn + hilo; }}, 451 {{ EA = Rn + hilo; }}); 452 } 453 } 454 } 455 } 456 } 457 0x1: decode S_FIELD { 458 0: decode OPCODE_24_21 { 459 format PredImmOp { 460 0x0: andi({{ Rd = Rn & rotated_imm; }}); 461 0x1: eori({{ Rd = Rn ^ rotated_imm; }}); 462 0x2: subi({{ Rd = Rn - rotated_imm; }}); 463 0x3: rsbi({{ Rd = rotated_imm - Rn; }}); 464 0x4: addi({{ Rd = Rn + rotated_imm; }}); 465 0x5: adci({{ Rd = Rn + rotated_imm + Cpsr<29:>; }}); 466 0x6: sbci({{ Rd = Rn - rotated_imm + Cpsr<29:> - 1; }}); 467 0x7: rsci({{ Rd = rotated_imm - Rn + Cpsr<29:> - 1; }}); 468 0xc: orri({{ Rd = Rn | rotated_imm; }}); 469 0xd: decode RN { 470 0: movi({{ Rd = rotated_imm; }}); 471 } 472 0xe: bici({{ Rd = Rn & ~rotated_imm; }}); 473 0xf: decode RN { 474 0: mvni({{ Rd = ~rotated_imm; }}); 475 } 476 } 477 } 478 1: decode OPCODE_24_21 { 479 format PredImmOpCc { 480 0x0: andsi({{ 481 uint32_t resTemp; 482 Rd = resTemp = Rn & rotated_imm; 483 }}, 484 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 485 {{ Cpsr<28:> }}); 486 0x1: eorsi({{ 487 uint32_t resTemp; 488 Rd = resTemp = Rn ^ rotated_imm; 489 }}, 490 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 491 {{ Cpsr<28:> }}); 492 0x2: subsi({{ 493 uint32_t resTemp; 494 Rd = resTemp = Rn - rotated_imm; 495 }}, 496 {{ arm_sub_carry(resTemp, Rn, rotated_imm) }}, 497 {{ arm_sub_overflow(resTemp, Rn, rotated_imm) }}); 498 0x3: rsbsi({{ 499 uint32_t resTemp; 500 Rd = resTemp = rotated_imm - Rn; 501 }}, 502 {{ arm_sub_carry(resTemp, rotated_imm, Rn) }}, 503 {{ arm_sub_overflow(resTemp, rotated_imm, Rn) }}); 504 0x4: addsi({{ 505 uint32_t resTemp; 506 Rd = resTemp = Rn + rotated_imm; 507 }}, 508 {{ arm_add_carry(resTemp, Rn, rotated_imm) }}, 509 {{ arm_add_overflow(resTemp, Rn, rotated_imm) }}); 510 0x5: adcsi({{ 511 uint32_t resTemp; 512 Rd = resTemp = Rn + rotated_imm + Cpsr<29:>; 513 }}, 514 {{ arm_add_carry(resTemp, Rn, rotated_imm) }}, 515 {{ arm_add_overflow(resTemp, Rn, rotated_imm) }}); 516 0x6: sbcsi({{ 517 uint32_t resTemp; 518 Rd = resTemp = Rn -rotated_imm + Cpsr<29:> - 1; 519 }}, 520 {{ arm_sub_carry(resTemp, Rn, rotated_imm) }}, 521 {{ arm_sub_overflow(resTemp, Rn, rotated_imm) }}); 522 0x7: rscsi({{ 523 uint32_t resTemp; 524 Rd = resTemp = rotated_imm - Rn + Cpsr<29:> - 1; 525 }}, 526 {{ arm_sub_carry(resTemp, rotated_imm, Rn) }}, 527 {{ arm_sub_overflow(resTemp, rotated_imm, Rn) }}); 528 0x8: tsti({{ 529 uint32_t resTemp; 530 resTemp = Rn & rotated_imm; 531 }}, 532 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 533 {{ Cpsr<28:> }}); 534 0x9: teqi({{ 535 uint32_t resTemp; 536 resTemp = Rn ^ rotated_imm; 537 }}, 538 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 539 {{ Cpsr<28:> }}); 540 0xa: cmpi({{ 541 uint32_t resTemp; 542 resTemp = Rn - rotated_imm; 543 }}, 544 {{ arm_sub_carry(resTemp, Rn, rotated_imm) }}, 545 {{ arm_sub_overflow(resTemp, Rn, rotated_imm) }}); 546 0xb: cmni({{ 547 uint32_t resTemp; 548 resTemp = Rn + rotated_imm; 549 }}, 550 {{ arm_add_carry(resTemp, Rn, rotated_imm) }}, 551 {{ arm_add_overflow(resTemp, Rn, rotated_imm) }}); 552 0xc: orrsi({{ 553 uint32_t resTemp; 554 Rd = resTemp = Rn | rotated_imm; 555 }}, 556 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 557 {{ Cpsr<28:> }}); 558 0xd: movsi({{ 559 uint32_t resTemp; 560 Rd = resTemp = rotated_imm; 561 }}, 562 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 563 {{ Cpsr<28:> }}); 564 0xe: bicsi({{ 565 uint32_t resTemp; 566 Rd = resTemp = Rn & ~rotated_imm; 567 }}, 568 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 569 {{ Cpsr<28:> }}); 570 0xf: mvnsi({{ 571 uint32_t resTemp; 572 Rd = resTemp = ~rotated_imm; 573 }}, 574 {{ (rotate ? rotated_carry:Cpsr<29:>) }}, 575 {{ Cpsr<28:> }}); 576 } 577 } 578 } 579 0x2: decode PUBWL { 580 // CAREFUL: 581 // Can always do EA + disp, since we negate disp using the UP flag 582 // Post-indexed variants 583 0x00,0x08: ArmStoreMemory::str_({{ Mem = Rd; 584 Rn = Rn + disp; }}, 585 {{ EA = Rn; }}); 586 0x01,0x09: ArmLoadMemory::ldr_l({{ Rd = Mem; 587 Rn = Rn + disp; }}, 588 {{ EA = Rn; }}); 589 0x04,0x0c: ArmStoreMemory::strb_b({{ Mem.ub = Rd.ub; 590 Rn = Rn + disp; }}, 591 {{ EA = Rn; }}); 592 0x05,0x0d: ArmLoadMemory::ldrb_bl({{ Rd.ub = Mem.ub; 593 Rn = Rn + disp; }}, 594 {{ EA = Rn; }}); 595 // Pre-indexed variants 596 0x10,0x18: ArmStoreMemory::str_p({{ Mem = Rd; }}); 597 0x11,0x19: ArmLoadMemory::ldr_pl({{ Rd = Mem; }}); 598 0x12,0x1a: ArmStoreMemory::str_pw({{ Mem = Rd; 599 Rn = Rn + disp; }}); 600 0x13,0x1b: ArmLoadMemory::ldr_pwl({{ Rd = Mem; 601 Rn = Rn + disp; }}); 602 0x14,0x1c: ArmStoreMemory::strb_pb({{ Mem.ub = Rd.ub; }}); 603 0x15,0x1d: ArmLoadMemory::ldrb_pbl({{ Rd.ub = Mem.ub; }}); 604 0x16,0x1e: ArmStoreMemory::strb_pbw({{ Mem.ub = Rd.ub; 605 Rn = Rn + disp; }}); 606 0x17,0x1f: ArmLoadMemory::ldrb_pbwl({{ Rd.ub = Mem.ub; 607 Rn = Rn + disp; }}); 608 } 609 0x3: decode OPCODE_4 { 610 0: decode PUBWL { 611 0x00,0x08: ArmStoreMemory::strr_({{ 612 Mem = Rd; 613 Rn = Rn + Rm_Imm; }}, 614 {{ EA = Rn; }}); 615 0x01,0x09: ArmLoadMemory::ldrr_l({{ 616 Rd = Mem; 617 Rn = Rn + Rm_Imm; }}, 618 {{ EA = Rn; }}); 619 0x04,0x0c: ArmStoreMemory::strr_b({{ 620 Mem.ub = Rd.ub; 621 Rn = Rn + Rm_Imm; }}, 622 {{ EA = Rn; }}); 623 0x05,0x0d: ArmLoadMemory::ldrr_bl({{ 624 Rd.ub = Mem.ub; 625 Rn = Rn + Rm_Imm; }}, 626 {{ EA = Rn; }}); 627 0x10,0x18: ArmStoreMemory::strr_p({{ 628 Mem = Rd; }}, 629 {{ EA = Rn + Rm_Imm; }}); 630 0x11,0x19: ArmLoadMemory::ldrr_pl({{ 631 Rd = Mem; }}, 632 {{ EA = Rn + Rm_Imm; }}); 633 0x12,0x1a: ArmStoreMemory::strr_pw({{ 634 Mem = Rd; 635 Rn = Rn + Rm_Imm; }}, 636 {{ EA = Rn + Rm_Imm; }}); 637 0x13,0x1b: ArmLoadMemory::ldrr_pwl({{ 638 Rd = Mem; 639 Rn = Rn + Rm_Imm; }}, 640 {{ EA = Rn + Rm_Imm; }}); 641 0x14,0x1c: ArmStoreMemory::strr_pb({{ 642 Mem.ub = Rd.ub; }}, 643 {{ EA = Rn + Rm_Imm; }}); 644 0x15,0x1d: ArmLoadMemory::ldrr_pbl({{ 645 Rd.ub = Mem.ub; }}, 646 {{ EA = Rn + Rm_Imm; }}); 647 0x16,0x1e: ArmStoreMemory::strr_pbw({{ 648 Mem.ub = Rd.ub; 649 Rn = Rn + Rm_Imm; }}, 650 {{ EA = Rn + Rm_Imm; }}); 651 0x17,0x1f: ArmLoadMemory::ldrr_pbwl({{ 652 Rd.ub = Mem.ub; 653 Rn = Rn + Rm_Imm; }}, 654 {{ EA = Rn + Rm_Imm; }}); 655 } 656 } 657 0x4: decode PUSWL { 658 // Right now we only handle cases when S (PSRUSER) is not set 659 default: ArmMacroStore::ldmstm({{ }}); 660 } 661 0x5: decode OPCODE_24 { 662 // Branch (and Link) Instructions 663 0: Branch::b({{ }}); 664 1: Branch::bl({{ LR = NPC; }}); 665 } 666 0x6: decode CPNUM { 667 0x1: decode PUNWL { 668 0x02,0x0a: decode OPCODE_15 { 669 0: ArmStoreMemory::stfs_({{ Mem.sf = Fd.sf; 670 Rn = Rn + disp8; }}, 671 {{ EA = Rn; }}); 672 1: ArmMacroFPAOp::stfd_({{ }}); 673 } 674 0x03,0x0b: decode OPCODE_15 { 675 0: ArmLoadMemory::ldfs_({{ Fd.sf = Mem.sf; 676 Rn = Rn + disp8; }}, 677 {{ EA = Rn; }}); 678 1: ArmMacroFPAOp::ldfd_({{ }}); 679 } 680 0x06,0x0e: decode OPCODE_15 { 681 0: ArmMacroFPAOp::stfe_nw({{ }}); 682 } 683 0x07,0x0f: decode OPCODE_15 { 684 0: ArmMacroFPAOp::ldfe_nw({{ }}); 685 } 686 0x10,0x18: decode OPCODE_15 { 687 0: ArmStoreMemory::stfs_p({{ Mem.sf = Fd.sf; }}, 688 {{ EA = Rn + disp8; }}); 689 1: ArmMacroFPAOp::stfd_p({{ }}); 690 } 691 0x11,0x19: decode OPCODE_15 { 692 0: ArmLoadMemory::ldfs_p({{ Fd.sf = Mem.sf; }}, 693 {{ EA = Rn + disp8; }}); 694 1: ArmMacroFPAOp::ldfd_p({{ }}); 695 } 696 0x12,0x1a: decode OPCODE_15 { 697 0: ArmStoreMemory::stfs_pw({{ Mem.sf = Fd.sf; 698 Rn = Rn + disp8; }}, 699 {{ EA = Rn + disp8; }}); 700 1: ArmMacroFPAOp::stfd_pw({{ }}); 701 } 702 0x13,0x1b: decode OPCODE_15 { 703 0: ArmLoadMemory::ldfs_pw({{ Fd.sf = Mem.sf; 704 Rn = Rn + disp8; }}, 705 {{ EA = Rn + disp8; }}); 706 1: ArmMacroFPAOp::ldfd_pw({{ }}); 707 } 708 0x14,0x1c: decode OPCODE_15 { 709 0: ArmMacroFPAOp::stfe_pn({{ }}); 710 } 711 0x15,0x1d: decode OPCODE_15 { 712 0: ArmMacroFPAOp::ldfe_pn({{ }}); 713 } 714 0x16,0x1e: decode OPCODE_15 { 715 0: ArmMacroFPAOp::stfe_pnw({{ }}); 716 } 717 0x17,0x1f: decode OPCODE_15 { 718 0: ArmMacroFPAOp::ldfe_pnw({{ }}); 719 } 720 } 721 0x2: decode PUNWL { 722 // could really just decode as a single instruction 723 0x00,0x04,0x08,0x0c: ArmMacroFMOp::sfm_({{ }}); 724 0x01,0x05,0x09,0x0d: ArmMacroFMOp::lfm_({{ }}); 725 0x02,0x06,0x0a,0x0e: ArmMacroFMOp::sfm_w({{ }}); 726 0x03,0x07,0x0b,0x0f: ArmMacroFMOp::lfm_w({{ }}); 727 0x10,0x14,0x18,0x1c: ArmMacroFMOp::sfm_p({{ }}); 728 0x11,0x15,0x19,0x1d: ArmMacroFMOp::lfm_p({{ }}); 729 0x12,0x16,0x1a,0x1e: ArmMacroFMOp::sfm_pw({{ }}); 730 0x13,0x17,0x1b,0x1f: ArmMacroFMOp::lfm_pw({{ }}); 731 } 732 } 733 0x7: decode OPCODE_24 { 734 0: decode CPNUM { 735 // Coprocessor Instructions 736 0x1: decode OPCODE_4 { 737 format FloatOp { 738 // Basic FPA Instructions 739 0: decode OPCODE_23_20 { 740 0x0: decode OPCODE_15 { 741 0: adf({{ Fd.sf = Fn.sf + Fm.sf; }}); 742 1: mvf({{ Fd.sf = Fm.sf; }}); 743 } 744 0x1: decode OPCODE_15 { 745 0: muf({{ Fd.sf = Fn.sf * Fm.sf; }}); 746 1: mnf({{ Fd.sf = -Fm.sf; }}); 747 } 748 0x2: decode OPCODE_15 { 749 0: suf({{ Fd.sf = Fn.sf - Fm.sf; }}); 750 1: abs({{ Fd.sf = fabs(Fm.sf); }}); 751 } 752 0x3: decode OPCODE_15 { 753 0: rsf({{ Fd.sf = Fm.sf - Fn.sf; }}); 754 1: rnd({{ Fd.sf = rint(Fm.sf); }}); 755 } 756 0x4: decode OPCODE_15 { 757 0: dvf({{ Fd.sf = Fn.sf / Fm.sf; }}); 758 1: sqt({{ Fd.sf = sqrt(Fm.sf); }}); 759 } 760 0x5: decode OPCODE_15 { 761 0: rdf({{ Fd.sf = Fm.sf / Fn.sf; }}); 762 1: log({{ Fd.sf = log10(Fm.sf); }}); 763 } 764 0x6: decode OPCODE_15 { 765 0: pow({{ Fd.sf = pow(Fm.sf, Fn.sf); }}); 766 1: lgn({{ Fd.sf = log(Fm.sf); }}); 767 } 768 0x7: decode OPCODE_15 { 769 0: rpw({{ Fd.sf = pow(Fn.sf, Fm.sf); }}); 770 1: exp({{ Fd.sf = exp(Fm.sf); }}); 771 } 772 0x8: decode OPCODE_15 { 773 0: rmf({{ Fd.sf = drem(Fn.sf, Fm.sf); }}); 774 1: sin({{ Fd.sf = sin(Fm.sf); }}); 775 } 776 0x9: decode OPCODE_15 { 777 0: fml({{ Fd.sf = Fn.sf * Fm.sf; }}); 778 1: cos({{ Fd.sf = cos(Fm.sf); }}); 779 } 780 0xa: decode OPCODE_15 { 781 0: fdv({{ Fd.sf = Fn.sf / Fm.sf; }}); 782 1: tan({{ Fd.sf = tan(Fm.sf); }}); 783 } 784 0xb: decode OPCODE_15 { 785 0: frd({{ Fd.sf = Fm.sf / Fn.sf; }}); 786 1: asn({{ Fd.sf = asin(Fm.sf); }}); 787 } 788 0xc: decode OPCODE_15 { 789 0: pol({{ Fd.sf = atan2(Fn.sf, Fm.sf); }}); 790 1: acs({{ Fd.sf = acos(Fm.sf); }}); 791 } 792 0xd: decode OPCODE_15 { 793 1: atn({{ Fd.sf = atan(Fm.sf); }}); 794 } 795 0xe: decode OPCODE_15 { 796 // Unnormalised Round 797 1: FailUnimpl::urd(); 798 } 799 0xf: decode OPCODE_15 { 800 // Normalise 801 1: FailUnimpl::nrm(); 802 } 803 } 804 1: decode OPCODE_15_12 { 805 0xf: decode OPCODE_23_21 { 806 format FloatCmp { 807 0x4: cmf({{ Fn.df }}, {{ Fm.df }}); 808 0x5: cnf({{ Fn.df }}, {{ -Fm.df }}); 809 0x6: cmfe({{ Fn.df }}, {{ Fm.df}}); 810 0x7: cnfe({{ Fn.df }}, {{ -Fm.df}}); 811 } 812 } 813 default: decode OPCODE_23_20 { 814 0x0: decode OPCODE_7 { 815 0: flts({{ Fn.sf = (float) Rd.sw; }}); 816 1: fltd({{ Fn.df = (double) Rd.sw; }}); 817 } 818 0x1: decode OPCODE_7 { 819 0: fixs({{ Rd = (uint32_t) Fm.sf; }}); 820 1: fixd({{ Rd = (uint32_t) Fm.df; }}); 821 } 822 0x2: wfs({{ Fpsr = Rd; }}); 823 0x3: rfs({{ Rd = Fpsr; }}); 824 0x4: FailUnimpl::wfc(); 825 0x5: FailUnimpl::rfc(); 826 } 827 } 828 } 829 } 830 } 831 format PredOp { 832 // ARM System Call (SoftWare Interrupt) 833 1: swi({{ if (arm_predicate(xc->readMiscReg(ArmISA::CPSR), 834 condCode)) 835 { 836 //xc->syscall(R7); 837 xc->syscall(IMMED_23_0); 838 } 839 }}); 840 } 841 } 842 } 843 } 844} 845 846