| 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> { |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 20 | let mayLoad = 1 in { |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 21 | def 32rm: I<opc, MRMSrcMem, (outs BNDR:$dst), (ins i32mem:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 22 | OpcodeStr#"\t{$src, $dst|$dst, $src}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 23 | Requires<[HasMPX, Not64BitMode]>; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame^] | 24 | def 64rm: I<opc, MRMSrcMem, (outs BNDR:$dst), (ins i64mem:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 25 | OpcodeStr#"\t{$src, $dst|$dst, $src}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 26 | Requires<[HasMPX, In64BitMode]>; |
| 27 | } |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 28 | } |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 29 | |
| 30 | defm BNDMK : mpx_bound_make<0x1B, "bndmk">, XS; |
| 31 | |
| 32 | multiclass mpx_bound_check<bits<8> opc, string OpcodeStr> { |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 33 | let mayLoad = 1 in { |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 34 | def 32rm: I<opc, MRMSrcMem, (outs), (ins BNDR:$src1, i32mem:$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, Not64BitMode]>; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame^] | 37 | def 64rm: I<opc, MRMSrcMem, (outs), (ins BNDR:$src1, i64mem:$src2), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 38 | OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 39 | Requires<[HasMPX, In64BitMode]>; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 40 | } |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 41 | def 32rr: I<opc, MRMSrcReg, (outs), (ins BNDR:$src1, GR32:$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, Not64BitMode]>; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame^] | 44 | def 64rr: I<opc, MRMSrcReg, (outs), (ins BNDR:$src1, GR64:$src2), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 45 | OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 46 | Requires<[HasMPX, In64BitMode]>; |
| 47 | } |
| 48 | defm BNDCL : mpx_bound_check<0x1A, "bndcl">, XS; |
| 49 | defm BNDCU : mpx_bound_check<0x1A, "bndcu">, XD; |
| 50 | defm BNDCN : mpx_bound_check<0x1B, "bndcn">, XD; |
| 51 | |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 52 | def BNDMOVrr : I<0x1A, MRMSrcReg, (outs BNDR:$dst), (ins BNDR:$src), |
| 53 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| 54 | Requires<[HasMPX]>; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 55 | let mayLoad = 1 in { |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 56 | def BNDMOV32rm : I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins i64mem:$src), |
| 57 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| 58 | Requires<[HasMPX, Not64BitMode]>; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame^] | 59 | def BNDMOV64rm : I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins i128mem:$src), |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 60 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| 61 | Requires<[HasMPX, In64BitMode]>; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 62 | } |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 63 | let isCodeGenOnly = 1, ForceDisassemble = 1 in |
| 64 | def BNDMOVrr_REV : I<0x1B, MRMDestReg, (outs BNDR:$dst), (ins BNDR:$src), |
| 65 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| 66 | Requires<[HasMPX]>; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 67 | let mayStore = 1 in { |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 68 | def BNDMOV32mr : I<0x1B, MRMDestMem, (outs), (ins i64mem:$dst, BNDR:$src), |
| 69 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| 70 | Requires<[HasMPX, Not64BitMode]>; |
| Craig Topper | ef3866a | 2018-04-28 06:02:40 +0000 | [diff] [blame^] | 71 | def BNDMOV64mr : I<0x1B, MRMDestMem, (outs), (ins i128mem:$dst, BNDR:$src), |
| Craig Topper | 8a6532a | 2018-04-28 06:02:39 +0000 | [diff] [blame] | 72 | "bndmov\t{$src, $dst|$dst, $src}", []>, PD, |
| 73 | Requires<[HasMPX, In64BitMode]>; |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 74 | |
| 75 | def BNDSTXmr: I<0x1B, MRMDestMem, (outs), (ins i64mem:$dst, BNDR:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 76 | "bndstx\t{$src, $dst|$dst, $src}", []>, PS, |
| Elena Demikhovsky | 6b62b65 | 2015-06-09 13:02:10 +0000 | [diff] [blame] | 77 | Requires<[HasMPX]>; |
| Ayman Musa | 62d1c71 | 2017-04-13 10:03:45 +0000 | [diff] [blame] | 78 | } |
| 79 | let mayLoad = 1 in |
| Craig Topper | 914b1d5 | 2017-12-15 19:01:50 +0000 | [diff] [blame] | 80 | def BNDLDXrm: I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), |
| Simon Pilgrim | 0cd0fbd | 2018-04-12 12:09:24 +0000 | [diff] [blame] | 81 | "bndldx\t{$src, $dst|$dst, $src}", []>, PS, |
| Craig Topper | 1b94d9a | 2016-01-06 06:18:41 +0000 | [diff] [blame] | 82 | Requires<[HasMPX]>; |
| Simon Pilgrim | 42fcda9 | 2017-12-08 19:03:42 +0000 | [diff] [blame] | 83 | } // SchedRW |