| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 1 | //===-- X86InstrMPX.td - MPX Instruction Set ---------*- tablegen -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file describes the X86 MPX instruction set, defining the |
| 11 | // instructions, and properties of the instructions which are needed for code |
| 12 | // generation, machine code emission, and analysis. |
| 13 | // |
| 14 | //===----------------------------------------------------------------------===// |
| 15 | |
| Simon Pilgrim | e0c7868 | 2018-04-13 14:31:57 +0000 | [diff] [blame] | 16 | // FIXME: Investigate a better scheduler class once MPX is used inside LLVM. |
| Simon Pilgrim | 42fcda9 | 2017-12-08 19:03:42 +0000 | [diff] [blame] | 17 | let SchedRW = [WriteSystem] in { |
| 18 | |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 19 | multiclass mpx_bound_make<bits<8> opc, string OpcodeStr> { |
| Craig Topper | 6d6b2b9 | 2018-04-28 06:58:26 +0000 | [diff] [blame] | 20 | def 32rm: I<opc, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 21 | OpcodeStr#"\t{$src, $dst|$dst, $src}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 22 | Requires<[HasMPX, Not64BitMode]>; |
| Craig Topper | 6d6b2b9 | 2018-04-28 06:58:26 +0000 | [diff] [blame] | 23 | def 64rm: I<opc, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 24 | OpcodeStr#"\t{$src, $dst|$dst, $src}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 25 | Requires<[HasMPX, In64BitMode]>; |
| 26 | } |
| 27 | |
| 28 | defm BNDMK : mpx_bound_make<0x1B, "bndmk">, XS; |
| 29 | |
| 30 | multiclass mpx_bound_check<bits<8> opc, string OpcodeStr> { |
| Craig Topper | 6d6b2b9 | 2018-04-28 06:58:26 +0000 | [diff] [blame] | 31 | def 32rm: I<opc, MRMSrcMem, (outs), (ins BNDR:$src1, anymem:$src2), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 32 | OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 33 | Requires<[HasMPX, Not64BitMode]>; |
| Craig Topper | 6d6b2b9 | 2018-04-28 06:58:26 +0000 | [diff] [blame] | 34 | def 64rm: I<opc, MRMSrcMem, (outs), (ins BNDR:$src1, anymem:$src2), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 35 | OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 36 | Requires<[HasMPX, In64BitMode]>; |
| Craig Topper | 9e11f96 | 2018-04-28 06:58:27 +0000 | [diff] [blame] | 37 | |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 38 | def 32rr: I<opc, MRMSrcReg, (outs), (ins BNDR:$src1, GR32:$src2), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 39 | OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 40 | Requires<[HasMPX, Not64BitMode]>; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame] | 41 | def 64rr: I<opc, MRMSrcReg, (outs), (ins BNDR:$src1, GR64:$src2), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 42 | OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 43 | Requires<[HasMPX, In64BitMode]>; |
| 44 | } |
| Craig Topper | 860562c | 2018-06-10 21:48:24 +0000 | [diff] [blame] | 45 | defm BNDCL : mpx_bound_check<0x1A, "bndcl">, XS, NotMemoryFoldable; |
| 46 | defm BNDCU : mpx_bound_check<0x1A, "bndcu">, XD, NotMemoryFoldable; |
| 47 | defm BNDCN : mpx_bound_check<0x1B, "bndcn">, XD, NotMemoryFoldable; |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 48 | |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 49 | def BNDMOVrr : I<0x1A, MRMSrcReg, (outs BNDR:$dst), (ins BNDR:$src), |
| 50 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| Craig Topper | 66572df | 2018-06-12 04:34:59 +0000 | [diff] [blame] | 51 | Requires<[HasMPX]>, NotMemoryFoldable; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 52 | let mayLoad = 1 in { |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 53 | def BNDMOV32rm : I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins i64mem:$src), |
| 54 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| Craig Topper | 66572df | 2018-06-12 04:34:59 +0000 | [diff] [blame] | 55 | Requires<[HasMPX, Not64BitMode]>, NotMemoryFoldable; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame] | 56 | def BNDMOV64rm : I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins i128mem:$src), |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 57 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| Craig Topper | 66572df | 2018-06-12 04:34:59 +0000 | [diff] [blame] | 58 | Requires<[HasMPX, In64BitMode]>, NotMemoryFoldable; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 59 | } |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 60 | let isCodeGenOnly = 1, ForceDisassemble = 1 in |
| 61 | def BNDMOVrr_REV : I<0x1B, MRMDestReg, (outs BNDR:$dst), (ins BNDR:$src), |
| 62 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| Craig Topper | 66572df | 2018-06-12 04:34:59 +0000 | [diff] [blame] | 63 | Requires<[HasMPX]>, NotMemoryFoldable; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 64 | let mayStore = 1 in { |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 65 | def BNDMOV32mr : I<0x1B, MRMDestMem, (outs), (ins i64mem:$dst, BNDR:$src), |
| 66 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| Craig Topper | 66572df | 2018-06-12 04:34:59 +0000 | [diff] [blame] | 67 | Requires<[HasMPX, Not64BitMode]>, NotMemoryFoldable; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame] | 68 | def BNDMOV64mr : I<0x1B, MRMDestMem, (outs), (ins i128mem:$dst, BNDR:$src), |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 69 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| Craig Topper | 66572df | 2018-06-12 04:34:59 +0000 | [diff] [blame] | 70 | Requires<[HasMPX, In64BitMode]>, NotMemoryFoldable; |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 71 | |
| Craig Topper | 6d6b2b9 | 2018-04-28 06:58:26 +0000 | [diff] [blame] | 72 | def BNDSTXmr: I<0x1B, MRMDestMem, (outs), (ins anymem:$dst, BNDR:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 73 | "bndstx\t{$src, $dst|$dst, $src}", []>, PS, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 74 | Requires<[HasMPX]>; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 75 | } |
| 76 | let mayLoad = 1 in |
| Craig Topper | 914b1d5 | 2017-12-15 19:01:50 +0000 | [diff] [blame] | 77 | def BNDLDXrm: I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 78 | "bndldx\t{$src, $dst|$dst, $src}", []>, PS, |
| Craig Topper | 1b94d9a | 2016-01-06 06:18:41 +0000 | [diff] [blame] | 79 | Requires<[HasMPX]>; |
| Simon Pilgrim | 42fcda9 | 2017-12-08 19:03:42 +0000 | [diff] [blame] | 80 | } // SchedRW |