1234353Sdim//===-- X86InstrMPX.td - MPX Instruction Set ---------*- tablegen -*-===// 2198090Srdivacky// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6198090Srdivacky// 7198090Srdivacky//===----------------------------------------------------------------------===// 8198090Srdivacky// 9198090Srdivacky// This file describes the X86 MPX instruction set, defining the 10198090Srdivacky// instructions, and properties of the instructions which are needed for code 11321369Sdim// generation, machine code emission, and analysis. 12321369Sdim// 13198090Srdivacky//===----------------------------------------------------------------------===// 14249423Sdim 15321369Sdim// FIXME: Investigate a better scheduler class if MPX is ever used inside LLVM. 16249423Sdimlet SchedRW = [WriteSystem] in { 17321369Sdim 18321369Sdimmulticlass mpx_bound_make<bits<8> opc, string OpcodeStr> { 19321369Sdim def 32rm: I<opc, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), 20249423Sdim OpcodeStr#"\t{$src, $dst|$dst, $src}", []>, 21198090Srdivacky Requires<[Not64BitMode]>; 22198090Srdivacky def 64rm: I<opc, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), 23234353Sdim OpcodeStr#"\t{$src, $dst|$dst, $src}", []>, 24321369Sdim Requires<[In64BitMode]>; 25321369Sdim} 26321369Sdim 27321369Sdimdefm BNDMK : mpx_bound_make<0x1B, "bndmk">, XS; 28321369Sdim 29321369Sdimmulticlass mpx_bound_check<bits<8> opc, string OpcodeStr> { 30321369Sdim def 32rm: I<opc, MRMSrcMem, (outs), (ins BNDR:$src1, anymem:$src2), 31198090Srdivacky OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, 32198090Srdivacky Requires<[Not64BitMode]>; 33276479Sdim def 64rm: I<opc, MRMSrcMem, (outs), (ins BNDR:$src1, anymem:$src2), 34353358Sdim OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, 35276479Sdim Requires<[In64BitMode]>; 36210299Sed 37210299Sed def 32rr: I<opc, MRMSrcReg, (outs), (ins BNDR:$src1, GR32:$src2), 38198090Srdivacky OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, 39353358Sdim Requires<[Not64BitMode]>; 40353358Sdim def 64rr: I<opc, MRMSrcReg, (outs), (ins BNDR:$src1, GR64:$src2), 41198090Srdivacky OpcodeStr#"\t{$src2, $src1|$src1, $src2}", []>, 42321369Sdim Requires<[In64BitMode]>; 43353358Sdim} 44210299Seddefm BNDCL : mpx_bound_check<0x1A, "bndcl">, XS, NotMemoryFoldable; 45198090Srdivackydefm BNDCU : mpx_bound_check<0x1A, "bndcu">, XD, NotMemoryFoldable; 46198090Srdivackydefm BNDCN : mpx_bound_check<0x1B, "bndcn">, XD, NotMemoryFoldable; 47261991Sdim 48198090Srdivackydef BNDMOVrr : I<0x1A, MRMSrcReg, (outs BNDR:$dst), (ins BNDR:$src), 49210299Sed "bndmov\t{$src, $dst|$dst, $src}", []>, PD, 50198090Srdivacky NotMemoryFoldable; 51198090Srdivackylet mayLoad = 1 in { 52353358Sdimdef BNDMOV32rm : I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins i64mem:$src), 53321369Sdim "bndmov\t{$src, $dst|$dst, $src}", []>, PD, 54276479Sdim Requires<[Not64BitMode]>, NotMemoryFoldable; 55198090Srdivackydef BNDMOV64rm : I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins i128mem:$src), 56309124Sdim "bndmov\t{$src, $dst|$dst, $src}", []>, PD, 57309124Sdim Requires<[In64BitMode]>, NotMemoryFoldable; 58314564Sdim} 59309124Sdimlet isCodeGenOnly = 1, ForceDisassemble = 1 in 60309124Sdimdef BNDMOVrr_REV : I<0x1B, MRMDestReg, (outs BNDR:$dst), (ins BNDR:$src), 61314564Sdim "bndmov\t{$src, $dst|$dst, $src}", []>, PD, 62353358Sdim NotMemoryFoldable; 63198090Srdivackylet mayStore = 1 in { 64198090Srdivackydef BNDMOV32mr : I<0x1B, MRMDestMem, (outs), (ins i64mem:$dst, BNDR:$src), 65198090Srdivacky "bndmov\t{$src, $dst|$dst, $src}", []>, PD, 66210299Sed Requires<[Not64BitMode]>, NotMemoryFoldable; 67210299Seddef BNDMOV64mr : I<0x1B, MRMDestMem, (outs), (ins i128mem:$dst, BNDR:$src), 68353358Sdim "bndmov\t{$src, $dst|$dst, $src}", []>, PD, 69353358Sdim Requires<[In64BitMode]>, NotMemoryFoldable; 70198090Srdivacky 71321369Sdimdef BNDSTXmr: I<0x1B, MRMDestMem, (outs), (ins anymem:$dst, BNDR:$src), 72353358Sdim "bndstx\t{$src, $dst|$dst, $src}", []>, PS; 73198090Srdivacky} 74321369Sdimlet mayLoad = 1 in 75321369Sdimdef BNDLDXrm: I<0x1A, MRMSrcMem, (outs BNDR:$dst), (ins anymem:$src), 76353358Sdim "bndldx\t{$src, $dst|$dst, $src}", []>, PS; 77353358Sdim} // SchedRW 78210299Sed