diff options
Diffstat (limited to 'src/jit/instrsarm.h')
-rw-r--r-- | src/jit/instrsarm.h | 557 |
1 files changed, 557 insertions, 0 deletions
diff --git a/src/jit/instrsarm.h b/src/jit/instrsarm.h new file mode 100644 index 0000000000..d1a77f8ebb --- /dev/null +++ b/src/jit/instrsarm.h @@ -0,0 +1,557 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/***************************************************************************** + * Arm Thumb1/Thumb2 instructions for JIT compiler + * + * id -- the enum name for the instruction + * nm -- textual name (for assembly dipslay) + * fp -- floating point instruction + * ld/st/cmp -- load/store/compare instruction + * fmt -- encoding format used by this instruction + * e1 -- encoding 1 + * e2 -- encoding 2 + * e3 -- encoding 3 + * e4 -- encoding 4 + * e5 -- encoding 5 + * e6 -- encoding 6 + * e7 -- encoding 7 + * e8 -- encoding 8 + * e9 -- encoding 9 + * +******************************************************************************/ + +#if !defined(_TARGET_ARM_) +#error Unexpected target type +#endif + +#ifndef INST1 +#error INST1 must be defined before including this file. +#endif +#ifndef INST2 +#error INST2 must be defined before including this file. +#endif +#ifndef INST3 +#error INST3 must be defined before including this file. +#endif +#ifndef INST4 +#error INST4 must be defined before including this file. +#endif +#ifndef INST5 +#error INST5 must be defined before including this file. +#endif +#ifndef INST6 +#error INST6 must be defined before including this file. +#endif +// No INST7 +// #ifndef INST7 +// #error INST7 must be defined before including this file. +// #endif +#ifndef INST8 +#error INST8 must be defined before including this file. +#endif +#ifndef INST9 +#error INST9 must be defined before including this file. +#endif + +/*****************************************************************************/ +/* The following is ARM-specific */ +/*****************************************************************************/ + +// If you're adding a new instruction: +// You need not only to fill in one of these macros describing the instruction, but also: +// * If the instruction writes to more than one destination register, update the function +// emitInsMayWriteMultipleRegs in emitArm.cpp. + +// clang-format off +INST9(invalid, "INVALID", 0, 0, IF_NONE, BAD_CODE, BAD_CODE, BAD_CODE, BAD_CODE, BAD_CODE, BAD_CODE, BAD_CODE, BAD_CODE, BAD_CODE) + +// enum name FP LD/ST Rdn,Rm Rd,Rn,Rm Rdn,i8 Rd,Rn,i3 Rd,Rn,+i8<<i4 Rd,Rn,Rm{,sh} SP,i9 Rd,SP,i10 Rd,PC,i10 +// T1_D0 T1_H T1_J0 T1_G T2_L0 T2_C0 T1_F T1_J2 T1_J3 +INST9(add, "add", 0, 0, IF_EN9, 0x4400, 0x1800, 0x3000, 0x1C00, 0xF1000000, 0xEB000000, 0xB000, 0xA800, 0xA000) + // add Rdn,Rm T1_D0 01000100Dmmmmddd 4400 high + // adds Rd,Rn,Rm T1_H 0001100mmmnnnddd 1800 low + // adds Rdn,i8 T1_J0 00110dddiiiiiiii 3000 low imm(0-255) + // adds Rd,Rn,i3 T1_G 0001110iiinnnddd 1C00 low imm(0-7) + // add{s} Rd,Rn,Rm{,sh} T2_C0 11101011000Snnnn 0iiiddddiishmmmm EB00 0000 + // add{s} Rd,Rn,+i8<<i4 T2_L0 11110i01000Snnnn 0iiiddddiiiiiiii F100 0000 imm(i8<<i4) *pref + // add SP,i9 T1_F 101100000iiiiiii B000 SP imm(0-508) + // add Rd,SP,i10 T1_J2 10101dddiiiiiiii A800 low imm(0-1020) + // add Rd,PC,i10 T1_J3 10100dddiiiiiiii A000 low imm(0-1020) +INST9(sub, "sub", 0, 0, IF_EN9, BAD_CODE, 0x1A00, 0x3800, 0x1E00, 0xF1A00000, 0xEBA00000, 0xB080, BAD_CODE, BAD_CODE) + // subs Rd,Rn,Rm T1_H 0001101mmmnnnddd 1A00 low + // subs Rdn,i8 T1_J0 00111dddiiiiiiii 3800 low imm(0-255) + // subs Rd,Rn,i3 T1_G 0001111iiinnnddd 1E00 low imm(0-7) + // sub{s} Rd,Rn,+i8<<i4 T2_L0 11110i01101Snnnn 0iiiddddiiiiiiii F1A0 0000 imm(i8<<i4) *pref + // sub{s} Rd,Rn,Rm{,sh} T2_C0 11101011101Snnnn 0iiiddddiishmmmm EBA0 0000 + // sub SP,i9 T1_F 101100001iiiiiii B080 SP imm(0-508) < + +// enum name FP LD/ST Rt,[Rn+Rm] Rt,[Rn+i7] Rt,[Rn+Rm,sh] Rt,[Rn+=i8] Rt,[Rn+i12] Rt,[PC+-i12] Rd,[SP+i10] Rd,[PC+i10] +// T1_H T1_C T2_E0 T2_H0 T2_K1 T2_K4 T1_J2 T1_J3 +INST8(ldr, "ldr", 0,LD, IF_EN8, 0x5800, 0x6800, 0xF8500000, 0xF8500800, 0xF8D00000, 0xF85F0000, 0x9800, 0x4800) + // ldr Rt,[Rn+Rm] T1_H 0101100mmmnnnttt 5800 low + // ldr Rt,[Rn+i7] T1_C 01101iiiiinnnttt 6800 low imm(0-124) + // ldr Rt,[Rn+Rm{,sh}] T2_E0 111110000101nnnn tttt000000shmmmm F850 0000 sh=(0,1,2,3) + // ldr Rt,[Rn],+-i8{!} T2_H0 111110000101nnnn tttt1PUWiiiiiiii F850 0800 imm(0-255) + // ldr Rt,[Rn+i12] T2_K1 111110001101nnnn ttttiiiiiiiiiiii F8D0 0000 imm(0-4095) + // ldr Rt,[PC+-i12] T2_K4 11111000U1011111 ttttiiiiiiiiiiii F85F 0000 imm(+-4095) + // ldr Rt,[SP+i10] T1_J2 10011tttiiiiiiii 9800 low imm(0-1020) + // ldr Rt,[PC+i10] T1_J3 01001tttiiiiiiii 4800 low imm(0-1020) + +// enum name FP LD/ST Rt,[Rn+Rm] Rt,[Rn+i7] Rt,[Rn+Rm,sh] Rt,[Rn+=i8] Rt,[Rn+i12] Rt,[PC+-i12] or Rt,[SP+-i10] +// T1_H T1_C T2_E0 T2_H0 T2_K1 T2_K4 or T1_J2 +INST6(str, "str", 0,ST, IF_EN6B, 0x5000, 0x6000, 0xF8400000, 0xF8400800, 0xF8C00000, 0x9000) + // str Rt,[Rn+Rm] T1_H 0101000mmmnnnttt 5000 low + // str Rt,[Rn+i7] T1_C 01100iiiiinnnttt 6000 low imm(0-124) + // str Rt,[Rn+Rm{,sh}] T2_E0 111110000100nnnn tttt000000shmmmm F840 0000 sh=(0,1,2,3) + // str Rt,[Rn],+-i8{!} T2_H0 111110000100nnnn tttt1PUWiiiiiiii F840 0800 imm(0-255) + // str Rt,[Rn+i12] T2_K1 111110001100nnnn ttttiiiiiiiiiiii F8C0 0000 imm(0-4095) + // str Rt,[SP+-i10] T1_J2 10010tttiiiiiiii 9000 low imm(0-1020) +INST6(ldrb, "ldrb", 0,LD, IF_EN6A, 0x5C00, 0x7800, 0xF8100000, 0xF8100800, 0xF8900000, 0xF81F0000) + // ldrb Rt,[Rn+Rm] T1_H 0101110mmmnnnttt 5C00 low + // ldrb Rt,[Rn+i5] T1_C 01111iiiiinnnttt 7800 low imm(0-31) + // ldrb Rt,[Rn+Rm{,sh}] T2_E0 111110000001nnnn tttt000000shmmmm F810 0000 sh=(0,1,2,3) + // ldrb Rt,[Rn],+-i8{!} T2_H0 111110000001nnnn tttt1PUWiiiiiiii F810 0800 imm(0-255) + // ldrb Rt,[Rn+i12] T2_K1 111110001001nnnn ttttiiiiiiiiiiii F890 0000 imm(0-4095) + // ldrb Rt,[PC+i12] T2_K4 11111000U0011111 ttttiiiiiiiiiiii F81F 0000 imm(+-4095) +INST6(strb, "strb", 0,ST, IF_EN6B, 0x5400, 0x7000, 0xF8000000, 0xF8000800, 0xF8800000, BAD_CODE) + // strb Rt,[Rn+Rm] T1_H 0101010mmmnnnttt 5400 low + // strb Rt,[Rn+i5] T1_C 01110iiiiinnnttt 7000 low imm(0-31) + // strb Rt,[Rn+Rm{,sh}] T2_E0 111110000000nnnn tttt000000shmmmm F800 0000 sh=(0,1,2,3) + // strb Rt,[Rn],+-i8{!} T2_H0 111110000000nnnn tttt1PUWiiiiiiii F800 0800 imm(0-255) + // strb Rt,[Rn+i12] T2_K1 111110001000nnnn ttttiiiiiiiiiiii F880 0000 imm(0-4095) +INST6(ldrh, "ldrh", 0,LD, IF_EN6A, 0x5A00, 0x8800, 0xF8300000, 0xF8300800, 0xF8B00000, 0xF83F0000) + // ldrh Rt,[Rn+Rm] T1_H 0101101mmmnnnttt 5A00 low + // ldrh Rt,[Rn+i6] T1_C 10001iiiiinnnttt 8800 low imm(0-62) + // ldrh Rt,[Rn+Rm{,sh}] T2_E0 111110000011nnnn tttt000000shmmmm F830 0000 sh=(0,1,2,3) + // ldrh Rt,[Rn],+-i8{!} T2_H0 111110000011nnnn tttt1PUWiiiiiiii F830 0800 imm(0-255) + // ldrh Rt,[Rn+i12] T2_K1 111110001011nnnn ttttiiiiiiiiiiii F8B0 0000 imm(0-4095) + // ldrh Rt,[PC+i12] T2_K4 11111000U0111111 ttttiiiiiiiiiiii F83F 0000 imm(+-4095) +INST6(strh, "strh", 0,ST, IF_EN6B, 0x5200, 0x8000, 0xF8200000, 0xF8200800, 0xF8a00000, BAD_CODE) + // strh Rt,[Rn+Rm] T1_H 0101001mmmnnnttt 5200 low + // strh Rt,[Rn+i6] T1_C 10000iiiiinnnttt 8000 low imm(0-62) + // strh Rt,[Rn+Rm{,sh}] T2_E0 111110000010nnnn tttt000000shmmmm F820 0000 sh=(0,1,2,3) + // strh Rt,[Rn],+-i8{!} T2_H0 111110000010nnnn tttt1PUWiiiiiiii F820 0800 imm(0-255) + // strh Rt,[Rn+i12] T2_K1 111110001010nnnn ttttiiiiiiiiiiii F8A0 0000 imm(0-4095) +INST6(ldrsb, "ldrsb", 0,LD, IF_EN6A, 0x5600, BAD_CODE, 0xF9100000, 0xF9100800, 0xF9900000, 0xF91F0000) + // ldrsb Rt,[Rn+Rm] T1_H 0101011mmmnnnttt 5600 low + // ldrsb Rt,[Rn+Rm{,sh}] T2_E0 111110010001nnnn tttt000000shmmmm F910 0000 sh=(0,1,2,3) + // ldrsb Rt,[Rn],+-i8{!} T2_H0 111110010001nnnn tttt1PUWiiiiiiii F910 0800 imm(0-255) + // ldrsb Rt,[Rn+i12] T2_K1 111110011001nnnn ttttiiiiiiiiiiii F990 0000 imm(0-4095) + // ldrsb Rt,[PC+i12] T2_K4 11111001U0011111 ttttiiiiiiiiiiii F91F 0000 imm(+-4095) +INST6(ldrsh, "ldrsh", 0,LD, IF_EN6A, 0x5E00, BAD_CODE, 0xF9300000, 0xF9300800, 0xF9B00000, 0xF93F0000) + // ldrsh Rt,[Rn+Rm] T1_H 0101111mmmnnnttt 5E00 low + // ldrsh Rt,[Rn+Rm{,sh}] T2_E0 111110010011nnnn tttt000000shmmmm F930 0000 sh=(0,1,2,3) + // ldrsh Rt,[Rn],+-i8{!} T2_H0 111110010011nnnn tttt1PUWiiiiiiii F930 0800 imm(0-255) + // ldrsh Rt,[Rn+i12] T2_K1 111110011011nnnn ttttiiiiiiiiiiii F9B0 0000 imm(0-4095) + // ldrsh Rt,[PC+i12] T2_K4 11111001U0111111 ttttiiiiiiiiiiii F93F 0000 imm(+-4095) + +// enum name FP LD/ST Rd, Rm Rd,Rm Rd,i8 Rd,+i8<<i4 S / Rn,Rm{,sh} +// T1_E T1_D0 T1_J0 T2_L1/L2 T2_C3/C8 +INST5(mov, "mov", 0, 0, IF_EN5A, 0x0000, 0x4600, 0x2000, 0xF04F0000, 0xEA5F0000) + // movs Rd,Rm T1_E 0000000000mmmddd 0000 low + // mov Rd,Rm T1_D0 01000110Dmmmmddd 4600 high + // movs Rd,i8 T1_J0 00100dddiiiiiiii 2000 low imm(0-255) + // mov{s} Rd,+i8<<i4 T2_L1 11110i00010S1111 0iiiddddiiiiiiii F04F 0000 imm(i8<<i4) + // mov{s} Rd,Rm T2_C3 1110101001011111 0000dddd0000mmmm EA5F 0000 +INST5(cmp, "cmp", 0,CMP,IF_EN5B, 0x4280, 0x4500, 0x2800, 0xF1B00F00, 0xEBB00F00) + // cmp Rn,Rm T1_E 0100001010mmmnnn 4280 low + // cmp Rn,Rm T1_D0 01000101Nmmmmnnn 4500 high + // cmp Rn,i8 T1_J0 00101nnniiiiiiii 2800 low imm(0-255) + // cmp Rn,+i8<<i4 T2_L2 11110i011011nnnn 0iii1111iiiiiiii F1B0 0F00 imm(i8<<i4) + // cmp Rn,Rm{,sh} T2_C8 111010111011nnnn 0iii1111iishmmmm EBB0 0F00 + +// enum name FP LD/ST Rdn, Rn Rd,Rn,i5 Rd,Rn,Rm Rd,Rn,i5 +// T1_E T2_C T2_C4 T2_C2 +INST4(lsl, "lsl", 0, 0, IF_EN4A, 0x4080, 0x0000, 0xFA00F000, 0xEA4F0000) + // lsls Rdn,Rm T1_E 0100000010mmmddd 4080 low + // lsls Rd,Rm,i5 T1_C 00000iiiiimmmddd 0000 low imm(0-31) + // lsl{s} Rd,Rn,Rm T2_C4 11111010000Snnnn 1111dddd0000mmmm FA00 F000 + // lsl{s} Rd,Rm,i5 T2_C2 11101010010S1111 0iiiddddii00mmmm EA4F 0000 imm(0-31) +INST4(lsr, "lsr", 0, 0, IF_EN4A, 0x40C0, 0x0800, 0xFA20F000, 0xEA4F0010) + // lsrs Rdn,Rm T1_E 0100000011mmmddd 40C0 low + // lsrs Rd,Rm,i5 T1_C 00001iiiiimmmddd 0800 low imm(0-31) + // lsr{s} Rd,Rn,Rm T2_C4 11111010001Snnnn 1111dddd0000mmmm FA20 F000 + // lsr{s} Rd,Rm,i5 T2_C2 11101010010S1111 0iiiddddii01mmmm EA4F 0010 imm(0-31) +INST4(asr, "asr", 0, 0, IF_EN4A, 0x4100, 0x1000, 0xFA40F000, 0xEA4F0020) + // asrs Rdn,Rm T1_E 0100000100mmmddd 4100 low shift by Rm + // asrs Rd,Rm,i5 T1_C 00010iiiiimmmddd 1000 low imm(0-31) + // asr{s} Rd,Rn,Rm T2_C4 11111010010Snnnn 1111dddd0000mmmm FA40 F000 + // asr{s} Rd,Rm,i5 T2_C2 11101010010S1111 0iiiddddii10mmmm EA4F 0020 imm(0-31) +INST4(ror, "ror", 0, 0, IF_EN4A, 0x41C0, BAD_CODE, 0xFA60F000, 0xEA4F0030) + // rors Rdn,Rm T1_E 0100000111mmmddd 41C0 low + // ror{s} Rd,Rn,Rm T2_C4 11111010011Snnnn 1111dddd0000mmmm FA60 F000 + // ror{s} Rd,Rm,i5 T2_C2 11101010010S1111 0iiiddddii11mmmm EA4F 0030 imm(0-31) + +// enum name FP LD/ST Rdn, Rn Rd,Rn,i5 Rd,Rn,Rm Rd,Rn,i5 +// T2_K2 T2_H2 T2_C7 T2_K3 +INST4(pld, "pld", 0,LD, IF_EN4B, 0xF890F000, 0xF810FC00, 0xF810F000, 0xF81FF000) // Cache Prefetch Data for Read + // pld [Rn+i12] T2_K2 111110001001nnnn 1111iiiiiiiiiiii F890 F000 imm(0-4095) + // pld [Rn-i8] T2_H2 111110000001nnnn 11111100iiiiiiii F810 FC00 imm(0-255) + // pld [Rn+Rm{,sh}] T2_C7 111110000001nnnn 1111000000shmmmm F810 F000 sh=(0,1,2,3) + // pld [PC+-i12] T2_K3 11111001U0011111 1111iiiiiiiiiiii F81F F000 imm(+-4095) +INST4(pldw, "pldw", 0,LD, IF_EN4B, 0xF8B0F000, 0xF830FC00, 0xF830F000, BAD_CODE) // Cache Prefetch Data for Write + // pldw [Rn+i12] T2_K2 111110001011nnnn 1111iiiiiiiiiiii F8B0 F000 imm(0-4095) + // pldw [Rn-i8] T2_H2 111110000011nnnn 11111100iiiiiiii F830 FC00 imm(0-255) + // pldw [Rn+Rm{,sh}] T2_C7 111110000011nnnn 1111000000shmmmm F830 F000 sh=(0,1,2,3) +#ifdef FEATURE_PLI_INSTRUCTION +// NOTE: The PLI instruction had an errata in early Krait implementations, so even though it's unlikely we would ever generate it, it is +// #ifdef'ed out to prevent its use. +INST4(pli, "pli", 0,LD, IF_EN4B, 0xF990F000, 0xF910FC00, 0xF910F000, 0xF91FF000) // Cache Prefetch Instructions for Execute + // pli [Rn+i12] T2_K2 111110011001nnnn 1111iiiiiiiiiiii F990 F000 imm(0-4095) + // pli [Rn-i8] T2_H2 111110010001nnnn 11111100iiiiiiii F910 FC00 imm(0-255) + // pli [Rn+Rm{,sh}] T2_C7 111110010001nnnn 1111000000shmmmm F910 F000 sh=(0,1,2,3) + // pli [PC+-i12] T2_K3 11111001U0011111 1111iiiiiiiiiiii F91F F000 imm(+-4095) +#endif // FEATURE_PLI_INSTRUCTION + +// enum name FP LD/ST Rdn, Rm Rd,Rn,Rm,sh Rd,Rn,i12 +// T1_E T2_C0 T2_L0 +INST3(and, "and", 0, 0, IF_EN3A, 0x4000, 0xEA000000, 0xF0000000) + // ands Rdn,Rm T1_E 0100000000mmmddd 4000 low + // and{s} Rd,Rn,Rm{,sh} T2_C0 11101010000Snnnn 0iiiddddiishmmmm EA00 0000 + // and{s} Rd,Rn,i12 T2_L0 11110i00000Snnnn 0iiiddddiiiiiiii F000 0000 imm(i8<<i4) +INST3(eor, "eor", 0, 0, IF_EN3A, 0x4040, 0xEA800000, 0xF0800000) + // eors Rd,Rm T1_E 0100000001mmmddd 4040 low + // eor{s} Rd,Rn,Rm{,sh} T2_C0 11101010100Snnnn 0iiiddddiishmmmm EA80 0000 + // eor{s} Rd,Rn,i12 T2_L0 11110i00100Snnnn 0iiiddddiiiiiiii F080 0000 imm(i8<<i4) +INST3(orr, "orr", 0, 0, IF_EN3A, 0x4300, 0xEA400000, 0xF0400000) + // orrs Rdn,Rm T1_E 0100001100mmmddd 4300 low + // orr{s} Rd,Rn,Rm{,sh} T2_C0 11101010010Snnnn 0iiiddddiishmmmm EA40 0000 + // orr{s} Rd,Rn,i12 T2_L0 11110i00010Snnnn 0iiiddddiiiiiiii F040 0000 imm(i8<<i4) +INST3(orn, "orn", 0, 0, IF_EN3A, BAD_CODE, 0xEA600000, 0xF0600000) + // orn{s} Rd,Rn,Rm{,sh} T2_C0 11101010011Snnnn 0iiiddddiishmmmm EA60 0000 + // orn{s} Rd,Rn,i12 T2_L0 11110i00011Snnnn 0iiiddddiiiiiiii F060 0000 imm(i8<<i4) +INST3(bic, "bic", 0, 0, IF_EN3A, 0x4380, 0xEA200000, 0xF0200000) + // bics Rdn,Rm T1_E 0100001110mmmddd 4380 low + // bic{s} Rd,Rn,Rm{,sh} T2_C0 11101010001Snnnn 0iiiddddiishmmmm EA20 0000 + // bic{s} Rd,Rn,i12 T2_L0 11110i00001Snnnn 0iiiddddiiiiiiii F020 0000 imm(i8<<i4) +INST3(adc, "adc", 0, 0, IF_EN3A, 0x4140, 0xEB400000, 0xF1400000) + // adcs Rdn,Rn T1_E 0100000101mmmddd 4140 low + // adcs Rd,Rn,Rm{,sh} T2_C0 11101011010Snnnn 0iiiddddiishmmmm EB40 0000 + // adcs Rd,Rn,i12 T2_L0 11110i01010Snnnn 0iiiddddiiiiiiii F140 0000 imm(0-4095) +INST3(sbc, "sbc", 0, 0, IF_EN3A, 0x4180, 0xEB600000, 0xF1600000) + // sbcs Rd,Rm T1_E 0100000110mmmddd 4180 low + // sbc{s} Rd,Rn,Rm{,sh} T2_C0 11101011011Snnnn 0iiiddddiishmmmm EB60 0000 + // sbc{s} Rd,Rn,+i8<<i4 T2_L0 11110i01011Snnnn 0iiiddddiiiiiiii F160 0000 imm(i8<<i4) +INST3(rsb, "rsb", 0, 0, IF_EN3A, 0x4240, 0xEBC00000, 0xF1C00000) + // rsbs Rd,Rn,#0 T1_E 0100001001nnnddd 4240 low (Note: x86 NEG instr) + // rsb{s} Rd,Rn,Rm{,sh} T2_C0 11101011110Snnnn 0iiiddddiishmmmm EBC0 0000 + // rsb{s} Rd,Rn,+i8<<i4 T2_L0 11110i01110Snnnn 0iiiddddiiiiiiii F1C0 0000 imm(i8<<i4) + +// enum name FP LD/ST Rn,Rm Rn,Rm,sh Rn,i12 +// T1_E T2_C8 T2_L2 +INST3(tst, "tst", 0,CMP,IF_EN3B, 0x4200, 0xEA100F00, 0xF0100F00) + // tst Rn,Rm T1_E 0100001000mmmnnn 4200 low + // tst Rn,Rm{,sh} T2_C8 111010100001nnnn 0iii1111iishmmmm EA10 0F00 + // tst Rn,+i8<<i4 T2_L2 11110i000001nnnn 0iii1111iiiiiiii F010 0F00 imm(i8<<i4) +INST3(teq, "teq", 0,CMP,IF_EN3B, BAD_CODE, 0xEA900F00, 0xF0900F00) + // teq Rn,Rm{,sh} T2_C8 111010101001nnnn 0iii1111iishmmmm EA90 0F00 + // teq Rn,+i8<<i4 T2_L2 11110i001001nnnn 0iii1111iiiiiiii F090 0F00 imm(i8<<i4) +INST3(cmn, "cmn", 0,CMP,IF_EN3B, 0x42C0, 0xEB100F00, 0xF1100F00) + // cmn Rn,Rn T1_E 0100001011mmmnnn 42C0 low + // cmn Rn,Rm{,sh} T2_C8 111010110001nnnn 0iii1111iishmmmm EB10 0F00 + // cmn Rn,+i8<<i4 T2_L2 11110i010001nnnn 0iii1111iiiiiiii F110 0F00 imm(i8<<i4) + +// enum name FP LD/ST Rd,Rm Rd,Rm,sh Rd,Rn,i12 +// T1_E T2_C1 T2_L1 +INST3(mvn, "mvn", 0, 0, IF_EN3C, 0x43C0, 0xEA6F0000, 0xF06F0000) + // mvns Rd,Rm T1_E 0100001111mmmddd 43C0 low + // mvn{s} Rd,Rm{,sh} T2_C1 11101010011S1111 0iiiddddiishmmmm EA6F 0000 + // mvn{s} Rd,+i8<<i4 T2_L1 11110i00011S1111 0iiiddddiiiiiiii F06F 0000 imm(i8<<i4) + +// enum name FP LD/ST SP,reg8 rT reg,reg16 +// T1_L1 T2_E2 T2_I1 +INST3(push, "push", 0, 0, IF_EN3D, 0xB400, 0xF84D0D04, 0xE92D0000) + // push {LR,}<reglist8> T1_L1 1011010Mrrrrrrrr B400 low + // push rT T2_E2 1111100001001101 tttt110100000100 F84D 0D04 + // push <reglist16> T2_I1 1110100100101101 0M0rrrrrrrrrrrrr E92D 0000 +INST3(pop, "pop", 0, 0, IF_EN3D, 0xBC00, 0xF85D0B04, 0xE8BD0000) + // pop {PC,}<reglist8> T1_L1 1011110Prrrrrrrr BC00 low + // pop rT T2_E2 1111100001011101 tttt101100000100 F85D 0B04 + // pop <reglist16> T2_I1 1110100010111101 PM0rrrrrrrrrrrrr E8BD 0000 + +// enum name FP LD/ST Rd,i16 Rd,i16 Rd,i16 +// T2_N T2_N1 T2_N2 +INST3(movt, "movt", 0, 0, IF_EN3E, 0xF2C00000,0xF2C00000,0xF2C00000) + // Rd,i16 T2_N 11110i101100iiii 0iiiddddiiiiiiii F2C0 0000 imm(0-65535) + // Rd,i16 T2_N1 11110i101100iiii 0iiiddddiiiiiiii F2C0 0000 imm(0-65535) + // Rd,i16 T2_N2 11110i101100iiii 0iiiddddiiiiiiii F2C0 0000 imm(0-65535) +INST3(movw, "movw", 0, 0, IF_EN3E, 0xF2400000,0xF2400000,0xF2400000) + // Rd,+i16 T2_N 11110i100100iiii 0iiiddddiiiiiiii F240 0000 imm(0-65535) + // Rd,+i16 T2_N1 11110i100100iiii 0iiiddddiiiiiiii F240 0000 imm(0-65535) + // Rd,+i16 T2_N2 11110i100100iiii 0iiiddddiiiiiiii F240 0000 imm(0-65535) + +// enum name FP LD/ST PC+-imm11 PC+-imm24 PC+-imm24 +// T1_M T2_J2 T2_J3 +INST3(b, "b", 0, 0, IF_EN3F, 0xE000, 0xF0009000, 0xF0009000) + // b PC+-i11 T1_M 11100iiiiiiiiiii E000 imm(-2048..2046) + // b PC+-i24 T2_J2 11110Siiiiiiiiii 10j1jiiiiiiiiiii F000 9000 imm(-16777216..16777214) (intra-procedure offset) + // b PC+-i24 T2_J3 11110Siiiiiiiiii 10j1jiiiiiiiiiii F000 9000 imm(-16777216..16777214) (inter-procedure offset) + + +// enum name FP LD/ST PC+-imm8 PC+-imm20 +// T1_K T2_J1 +INST2(beq, "beq", 0, 0, IF_EN2A, 0xD000, 0xF0008000) + // beq PC+-i8 T1_K 11010000iiiiiiii D000 imm(-256..254) + // beq PC+-i20 T2_J1 11110S0000iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bne, "bne", 0, 0, IF_EN2A, 0xD100, 0xF0408000) + // bne PC+-i8 T1_K 11010001iiiiiiii D000 imm(-256..254) + // bne PC+-i20 T2_J1 11110S0001iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bhs, "bhs", 0, 0, IF_EN2A, 0xD200, 0xF0808000) + // bhs PC+-i8 T1_K 11010010iiiiiiii D000 imm(-256..254) + // bhs PC+-i20 T2_J1 11110S0010iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(blo, "blo", 0, 0, IF_EN2A, 0xD300, 0xF0C08000) + // blo PC+-i8 T1_K 11010011iiiiiiii D000 imm(-256..254) + // blo PC+-i20 T2_J1 11110S0011iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bmi, "bmi", 0, 0, IF_EN2A, 0xD400, 0xF1008000) + // bmi PC+-i8 T1_K 11010100iiiiiiii D000 imm(-256..254) + // bmi PC+-i20 T2_J1 11110S0100iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bpl, "bpl", 0, 0, IF_EN2A, 0xD500, 0xF1408000) + // bpl PC+-i8 T1_K 11010101iiiiiiii D000 imm(-256..254) + // bpl PC+-i20 T2_J1 11110S0101iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bvs, "bvs", 0, 0, IF_EN2A, 0xD600, 0xF1808000) + // bvs PC+-i8 T1_K 11010110iiiiiiii D000 imm(-256..254) + // bvs PC+-i20 T2_J1 11110S0110iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bvc, "bvc", 0, 0, IF_EN2A, 0xD700, 0xF1C08000) + // bvc PC+-i8 T1_K 11010111iiiiiiii D000 imm(-256..254) + // bvc PC+-i20 T2_J1 11110S0111iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bhi, "bhi", 0, 0, IF_EN2A, 0xD800, 0xF2008000) + // bhi PC+-i8 T1_K 11011000iiiiiiii D000 imm(-256..254) + // bhi PC+-i20 T2_J1 11110S1000iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bls, "bls", 0, 0, IF_EN2A, 0xD900, 0xF2408000) + // bls PC+-i8 T1_K 11011001iiiiiiii D000 imm(-256..254) + // bls PC+-i20 T2_J1 11110S1001iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bge, "bge", 0, 0, IF_EN2A, 0xDA00, 0xF2808000) + // bge PC+-i8 T1_K 11011010iiiiiiii D000 imm(-256..254) + // bge PC+-i20 T2_J1 11110S1010iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(blt, "blt", 0, 0, IF_EN2A, 0xDB00, 0xF2C08000) + // blt PC+-i8 T1_K 11011011iiiiiiii D000 imm(-256..254) + // blt PC+-i20 T2_J1 11110S1011iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(bgt, "bgt", 0, 0, IF_EN2A, 0xDC00, 0xF3008000) + // bgt PC+-i8 T1_K 11011100iiiiiiii D000 imm(-256..254) + // bgt PC+-i20 T2_J1 11110S1100iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) +INST2(ble, "ble", 0, 0, IF_EN2A, 0xDD00, 0xF3408000) + // ble PC+-i8 T1_K 11011101iiiiiiii D000 imm(-256..254) + // ble PC+-i20 T2_J1 11110S1101iiiiii 10j0jiiiiiiiiiii F000 8000 imm(-1048576..1048574) + +// enum name FP LD/ST Rm Rm +// T1_D1 T1_D2 +INST2(bx, "bx", 0, 0, IF_EN2B, 0x4700, 0x4700) + // bx Rm T1_D1 010001110mmmm000 4700 high + // bx Rm T1_D2 010001110mmmm000 4700 high + +// enum name FP LD/ST rM PC+-imm24 +// T1_D2 T2_J3 +INST2(blx, "blx", 0, 0, IF_EN2C, 0x4780, 0xF000C000) + // blx Rm T1_D2 010001111mmmm000 4780 high + // blx PC+-i24 T2_J3 11110Siiiiiiiiii 11j0jiiiiiiiiii0 F000 C000 imm(-16777216..16777214) + +// enum name FP LD/ST Rn,<reg8> Rn,<reg16> +// T1_J1 T2_I0 +INST2(ldm, "ldm", 0,LD, IF_EN2D, 0xC800, 0xE8900000) + // ldm Rn,<reglist8> T1_J1 11001nnnrrrrrrrr C800 low + // ldm Rn{!},<reglist16> T2_I0 1110100010W1nnnn rr0rrrrrrrrrrrrr E890 0000 +INST2(stm, "stm", 0,ST, IF_EN2D, 0xC000, 0xE8800000) + // stm Rn!,<reglist8> T1_J1 11000nnnrrrrrrrr C000 low + // stm Rn{!},<reglist16> T2_I0 1110100010W0nnnn 0r0rrrrrrrrrrrrr E880 0000 + +// enum name FP LD/ST Rn,Rm Rn,Rm,{sb} +// T1_E T2_C6 +INST2(sxtb, "sxtb", 0, 0, IF_EN2E, 0xB240, 0xFA4FF080) + // Rd,Rm T1_E 1011001001mmmddd B240 low + // Rd,Rm{,sb} T2_C6 1111101001001111 1111dddd10sbmmmm FA4F F080 +INST2(sxth, "sxth", 0, 0, IF_EN2E, 0xB200, 0xFA0FF080) + // Rd,Rm T1_E 1011001000mmmddd B200 low + // Rd,Rm{,sb} T2_C6 1111101000001111 1111dddd10sbmmmm FA0F F080 +INST2(uxtb, "uxtb", 0, 0, IF_EN2E, 0xB2C0, 0xFA5FF080) + // Rd,Rm T1_E 1011001011mmmddd B2C0 low + // Rd,Rm{,sb} T2_C6 1111101001011111 1111dddd10sbmmmm FA5F F080 +INST2(uxth, "uxth", 0, 0, IF_EN2E, 0xB280, 0xFA1FF080) + // Rd,Rm T1_E 1011001010mmmddd B280 low + // Rd,Rm T2_C6 1111101000011111 1111dddd10sbmmmm FA1F F080 + +// enum name FP LD/ST Rdn,Rm Rd,Rn,Rm +// T1_E T2_C5 +INST2(mul, "mul", 0, 0, IF_EN2F, 0x4340, 0xFB00F000) + // Rd,Rm T1_E 0100001101nnnddd 4340 low + // Rd,Rn,Rm T2_C5 111110110000nnnn 1111dddd0000mmmm FB00 F000 + +// enum name FP LD/ST Rd,PC,i10 Rd,PC,+-i12 +// T1_J3 T2_M1 +INST2(adr, "adr", 0, 0, IF_EN2G, 0xA000, 0xF20F0000) + // Rd,PC+i10 T1_J3 10100dddiiiiiiii A000 low imm(0-1020) + // Rd,PC+-i12 T2_M1 11110i10U0U01111 0iiiddddiiiiiiii F20F 0000 imm(+-4095) + +INST1(addw, "addw", 0, 0, IF_T2_M0, 0xF2000000) + // Rd,Rn,i12 T2_M0 11110i100000nnnn 0iiiddddiiiiiiii F200 0000 imm(0-4095) +INST1(bfc, "bfc", 0, 0, IF_T2_D1, 0xF36F0000) + // Rd,#b,#w T2_D1 1111001101101111 0iiiddddii0wwwww F36F 0000 imm(0-31),imm(0-31) +INST1(bfi, "bfi", 0, 0, IF_T2_D0, 0xF3600000) + // Rd,Rn,#b,#w T2_D0 111100110110nnnn 0iiiddddii0wwwww F360 0000 imm(0-31),imm(0-31) +INST1(bl, "bl", 0, 0, IF_T2_J3, 0xF000D000) + // PC+-i24 T2_J3 11110Siiiiiiiiii 11j1jiiiiiiiiiii F000 D000 imm(-16777216..16777214) +INST1(bkpt, "bkpt", 0, 0, IF_T1_A, 0xDEFE) + // T1_A 1101111011111110 DEFE // Windows uses this + // i8 T1_L0 10111110iiiiiiii BE00 imm(0-255) +INST1(cbnz, "cbnz", 0, 0, IF_T1_I, 0xB900) + // Rn,PC+i7 T1_I 101110i1iiiiinnn B900 low imm(0-126) +INST1(cbz, "cbz", 0, 0, IF_T1_I, 0xB100) + // Rn,PC+i7 T1_I 101100i1iiiiinnn B100 low imm(0-126) +INST1(clz, "clz", 0, 0, IF_T2_C10, 0xFAB0F000) + // Rd,Rm T2_C10 111110101011mmmm 1111dddd0000mmmm FAB0 F000 +INST1(dmb, "dmb", 0, 0, IF_T2_B, 0xF3BF8F50) + // #i4 T2_B 1111001110111111 100011110101iiii F3BF 8F50 imm(0-15) +INST1(ism, "ism", 0, 0, IF_T2_B, 0xF3BF8F60) + // #i4 T2_B 1111001110111111 100011110110iiii F3BF 8F60 imm(0-15) +INST1(ldmdb, "ldmdb", 0,LD, IF_T2_I0, 0xE9100000) + // Rn{!},<reglist16> T2_I0 1110100100W1nnnn rr0rrrrrrrrrrrrr E910 0000 +INST1(ldrd, "ldrd", 0,LD, IF_T2_G0, 0xE8500000) + // Rt,RT,[Rn],+-i8{!}T2_G0 1110100PU1W1nnnn ttttTTTTiiiiiiii E850 0000 +INST1(ldrex, "ldrex", 0,LD, IF_T2_H1, 0xE8500F00) + // Rt,[Rn+i8] T2_H1 111010000101nnnn tttt1111iiiiiiii E850 0F00 imm(0-1020) +INST1(ldrexb, "ldrexb", 0,LD, IF_T2_E1, 0xE8D00F4F) + // Rt,[Rn] T2_E1 111010001101nnnn tttt111101001111 E8D0 0F4F +INST1(ldrexd, "ldrexd", 0,LD, IF_T2_G1, 0xE8D0007F) + // Rt,RT,[Rn] T2_G1 111010001101nnnn ttttTTTT01111111 E8D0 007F +INST1(ldrexh, "ldrexh", 0,LD, IF_T2_E1, 0xE8D00F5F) + // Rt,[Rn] T2_E1 111010001101nnnn tttt111101011111 E8D0 0F5F +INST1(mla, "mla", 0, 0, IF_T2_F2, 0xFB000000) + // Rd,Rn,Rm,Ra T2_F2 111110110000nnnn aaaadddd0000mmmm FB00 0000 +INST1(mls, "mls", 0, 0, IF_T2_F2, 0xFB000010) + // Rd,Rn,Rm,Ra T2_F2 111110110000nnnn aaaadddd0001mmmm FB00 0010 +INST1(nop, "nop", 0, 0, IF_T1_A, 0xBF00) + // T1_A 1011111100000000 BF00 +INST1(nopw, "nop.w", 0, 0, IF_T2_A, 0xF3AF8000) + // T2_A 1111001110101111 1000000000000000 F3AF 8000 +INST1(sbfx, "sbfx", 0, 0, IF_T2_D0, 0xF3400000) + // Rd,Rn,#b,#w T2_D0 111100110100nnnn 0iiiddddii0wwwww F340 0000 imm(0-31),imm(0-31) +INST1(sdiv, "sdiv", 0, 0, IF_T2_C5, 0xFB90F0F0) + // Rd,Rn,Rm T2_C5 111110111001nnnn 1111dddd1111mmmm FB90 F0F0 +INST1(smlal, "smlal", 0, 0, IF_T2_F1, 0xFBC00000) + // Rl,Rh,Rn,Rm T2_F1 111110111100nnnn llllhhhh0000mmmm FBC0 0000 +INST1(smull, "smull", 0, 0, IF_T2_F1, 0xFB800000) + // Rl,Rh,Rn,Rm T2_F1 111110111000nnnn llllhhhh0000mmmm FB80 0000 +INST1(stmdb, "stmdb", 0,ST, IF_EN2D, 0xE9000000) + // Rn{!},<reglist16> T2_I0 1110100100W0nnnn 0r0rrrrrrrrrrrrr E900 0000 +INST1(strd, "strd", 0,ST, IF_T2_G0, 0xE8400000) + // Rt,RT,[Rn],+-i8{!}T2_G0 1110100PU1W0nnnn ttttTTTTiiiiiiii E840 0000 +INST1(strex, "strex", 0,ST, IF_T2_H1, 0xE8400F00) + // Rt,[Rn+i8] T2_H1 111010000100nnnn tttt1111iiiiiiii E840 0F00 imm(0-1020) +INST1(strexb, "strexb", 0,ST, IF_T2_E1, 0xE8C00F4F) + // Rt,[Rn] T2_E1 111010001100nnnn tttt111101001111 E8C0 0F4F +INST1(strexd, "strexd", 0,ST, IF_T2_G1, 0xE8C0007F) + // Rt,RT,[Rn] T2_G1 111010001100nnnn ttttTTTT01111111 E8C0 007F +INST1(strexh, "strexh", 0,ST, IF_T2_E1, 0xE8C00F5F) + // Rt,[Rn] T2_E1 111010001100nnnn tttt111101011111 E8C0 0F5F +INST1(subw, "subw", 0, 0, IF_T2_M0, 0xF2A00000) + // Rd,Rn,+i12 T2_M0 11110i101010nnnn 0iiiddddiiiiiiii F2A0 0000 imm(0-4095) +INST1(tbb, "tbb", 0, 0, IF_T2_C9, 0xE8D0F000) + // Rn,Rm T2_C9 111010001101nnnn 111100000000mmmm E8D0 F000 +INST1(tbh, "tbh", 0, 0, IF_T2_C9, 0xE8D0F010) + // Rn,Rm,LSL #1 T2_C9 111010001101nnnn 111100000001mmmm E8D0 F010 +INST1(ubfx, "ubfx", 0, 0, IF_T2_D0, 0xF2C00000) + // Rd,Rn,#b,#w T2_D0 111100111100nnnn 0iiiddddii0wwwww F3C0 0000 imm(0-31),imm(0-31) +INST1(udiv, "udiv", 0, 0, IF_T2_C5, 0xFBB0F0F0) + // Rd,Rn,Rm T2_C5 111110111011nnnn 1111dddd1111mmmm FBB0 F0F0 +INST1(umlal, "umlal", 0, 0, IF_T2_F1, 0xFBE00000) + // Rl,Rh,Rn,Rm T2_F1 111110111110nnnn llllhhhh0000mmmm FBE0 0000 +INST1(umull, "umull", 0, 0, IF_T2_F1, 0xFBA00000) + // Rl,Rh,Rn,Rm T2_F1 111110111010nnnn llllhhhh0000mmmm FBA0 0000 + +#ifdef FEATURE_ITINSTRUCTION +INST1(it, "it", 0, 0, IF_T1_B, 0xBF08) + // cond T1_B 10111111cond1000 BF08 cond +INST1(itt, "itt", 0, 0, IF_T1_B, 0xBF04) + // cond T1_B 10111111cond0100 BF04 cond +INST1(ite, "ite", 0, 0, IF_T1_B, 0xBF0C) + // cond T1_B 10111111cond1100 BF0C cond +INST1(ittt, "ittt", 0, 0, IF_T1_B, 0xBF02) + // cond T1_B 10111111cond0010 BF02 cond +INST1(itte, "itte", 0, 0, IF_T1_B, 0xBF06) + // cond T1_B 10111111cond0110 BF06 cond +INST1(itet, "itet", 0, 0, IF_T1_B, 0xBF0A) + // cond T1_B 10111111cond1010 BF0A cond +INST1(itee, "itee", 0, 0, IF_T1_B, 0xBF0E) + // cond T1_B 10111111cond1110 BF0E cond +INST1(itttt, "itttt", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond0001 BF01 cond +INST1(ittte, "ittte", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond0011 BF03 cond +INST1(ittet, "ittet", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond0101 BF05 cond +INST1(ittee, "ittee", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond0111 BF07 cond +INST1(itett, "itett", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond1001 BF09 cond +INST1(itete, "itete", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond1011 BF0B cond +INST1(iteet, "iteet", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond1101 BF0D cond +INST1(iteee, "iteee", 0, 0, IF_T1_B, 0xBF01) + // cond T1_B 10111111cond1111 BF0F cond +#endif // FEATURE_ITINSTRUCTION + + +/*****************************************************************************/ +/* Floating Point Instructions */ +/*****************************************************************************/ +// enum name FP LD/ST + // Dd,[Rn+imm8] T2_VLDST 11101101UD0Lnnnn dddd101Ziiiiiiii ED00 0A00 imm(+-1020) +INST1(vstr, "vstr", 1,ST, IF_T2_VLDST, 0xED000A00) +INST1(vldr, "vldr", 1,LD, IF_T2_VLDST, 0xED100A00) +INST1(vstm, "vstm", 1,ST, IF_T2_VLDST, 0xEC800A00) // A8.6.399 VSTM (to an address in ARM core register from consecutive floats) +INST1(vldm, "vldm", 1,LD, IF_T2_VLDST, 0xEC900A00) // A8.6.399 VLDM (from an address in ARM core register to consecutive floats) +INST1(vpush, "vpush", 1,ST, IF_T2_VLDST, 0xED2D0A00) +INST1(vpop, "vpop", 1,LD, IF_T2_VLDST, 0xECBD0A00) + + // vmrs rT T2_E2 1110111011110001 tttt101000010000 EEF1 0A10 +INST1(vmrs, "vmrs", 1, 0, IF_T2_E2, 0xEEF10A10) + + // Dd,Dn,Dm T2_VFP3 11101110-D--nnnn dddd101ZN-M0mmmm EE30 0A00 +INST1(vadd, "vadd", 1, 0, IF_T2_VFP3, 0xEE300A00) +INST1(vsub, "vsub", 1, 0, IF_T2_VFP3, 0xEE300A40) +INST1(vmul, "vmul", 1, 0, IF_T2_VFP3, 0xEE200A00) +INST1(vdiv, "vdiv", 1, 0, IF_T2_VFP3, 0xEE800A00) + + // Dd,Dm T2_VFP2 111011101D110--- dddd101zp1M0mmmm EEB0 0A40 +INST1(vmov, "vmov", 1, 0, IF_T2_VFP2, 0xEEB00A40) // opc2 = '000', zp = 00 +INST1(vabs, "vabs", 1, 0, IF_T2_VFP2, 0xEEB00AC0) // opc2 = '000', zp = 01 +INST1(vsqrt, "vsqrt", 1, 0, IF_T2_VFP2, 0xEEB10AC0) // opc2 = '001', zp = 01 +INST1(vneg, "vneg", 1, 0, IF_T2_VFP2, 0xEEB10A40) // opc2 = '001', zp = 00 +INST1(vcmp, "vcmp", 1, CMP, IF_T2_VFP2, 0xEEB40A40) // opc2 = '100', zp = 00 +INST1(vcmp0, "vcmp.0", 1, CMP, IF_T2_VFP2, 0xEEB50A40) // opc2 = '101', zp = 00 + + // Dd,Dm T2_VFP2 111011101D111--- dddd101zp1M0mmmm EEB8 0A40 +INST1(vcvt_d2i, "vcvt.d2i", 1, 0, IF_T2_VFP2, 0xEEBD0BC0) // opc2 = '101', zp = 11 +INST1(vcvt_f2i, "vcvt.f2i", 1, 0, IF_T2_VFP2, 0xEEBD0AC0) // opc2 = '101', zp = 01 +INST1(vcvt_d2u, "vcvt.d2u", 1, 0, IF_T2_VFP2, 0xEEBC0BC0) // opc2 = '100', zp = 11 +INST1(vcvt_f2u, "vcvt.f2u", 1, 0, IF_T2_VFP2, 0xEEBC0AC0) // opc2 = '100', zp = 01 + +INST1(vcvt_i2f, "vcvt.i2f", 1, 0, IF_T2_VFP2, 0xEEB80AC0) // opc2 = '000', zp = 01 +INST1(vcvt_i2d, "vcvt.i2d", 1, 0, IF_T2_VFP2, 0xEEB80BC0) // opc2 = '000', zp = 11 +INST1(vcvt_u2f, "vcvt.u2f", 1, 0, IF_T2_VFP2, 0xEEB80A40) // opc2 = '000', zp = 00 +INST1(vcvt_u2d, "vcvt.u2d", 1, 0, IF_T2_VFP2, 0xEEB80B40) // opc2 = '000', zp = 10 + + // Dd,Dm T2_VFP2 111011101D110111 dddd101z11M0mmmm EEB7 0AC0 +INST1(vcvt_d2f, "vcvt.d2f", 1, 0, IF_T2_VFP2, 0xEEB70BC0) // opc2 = '111' zp = 01 +INST1(vcvt_f2d, "vcvt.f2d", 1, 0, IF_T2_VFP2, 0xEEB70AC0) // opc2 = '111' zp = 11 + + // Dd,Dm T2_VMOVD 111011F100D0V0000 +INST1(vmov_i2d, "vmov.i2d", 1, 0, IF_T2_VMOVD, 0xEC400B10) // A8.6.332 VMOV from 2 int regs to a double +INST1(vmov_d2i, "vmov.d2i", 1, 0, IF_T2_VMOVD, 0xEC500B10) // A8.6.332 VMOV from a double to 2 int regs +INST1(vmov_i2f, "vmov.i2f", 1, 0, IF_T2_VMOVS, 0xEE000A10) // A8.6.330 VMOV (between ARM core register and single-precision register) +INST1(vmov_f2i, "vmov.f2i", 1, 0, IF_T2_VMOVS, 0xEE100A10) // A8.6.330 VMOV (between ARM core register and single-precision register) +// clang-format on + +/*****************************************************************************/ +#undef INST1 +#undef INST2 +#undef INST3 +#undef INST4 +#undef INST5 +#undef INST6 +#undef INST7 +#undef INST8 +#undef INST9 +/*****************************************************************************/ |