// 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< T1_L1 1011010Mrrrrrrrr B400 low // push rT T2_E2 1111100001001101 tttt110100000100 F84D 0D04 // push T2_I1 1110100100101101 0M0rrrrrrrrrrrrr E92D 0000 INST3(pop, "pop", 0, 0, IF_EN3D, 0xBC00, 0xF85D0B04, 0xE8BD0000) // pop {PC,} T1_L1 1011110Prrrrrrrr BC00 low // pop rT T2_E2 1111100001011101 tttt101100000100 F85D 0B04 // pop T2_I1 1110100010111101 PM0rrrrrrrrrrrrr E8BD 0000 // enum name FP LD/ST PC+-imm11 PC+-imm24 PC+-imm24 // T1_M T2_J2 T2_J3 INST3(b, "b", 0, 0, IF_EN3E, 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, Rn, // T1_J1 T2_I0 INST2(ldm, "ldm", 0,LD, IF_EN2D, 0xC800, 0xE8900000) // ldm Rn, T1_J1 11001nnnrrrrrrrr C800 low // ldm Rn{!}, T2_I0 1110100010W1nnnn rr0rrrrrrrrrrrrr E890 0000 INST2(stm, "stm", 0,ST, IF_EN2D, 0xC000, 0xE8800000) // stm Rn!, T1_J1 11000nnnrrrrrrrr C000 low // stm Rn{!}, 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{!}, 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{!}, 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, 0xF3C00000) // 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 /*****************************************************************************/