xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86Instr3DNow.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- X86Instr3DNow.td - The 3DNow! Instruction Set ------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the 3DNow! instruction set, which extends MMX to support
11*9880d681SAndroid Build Coastguard Worker// floating point and also adds a few more random instructions for good measure.
12*9880d681SAndroid Build Coastguard Worker//
13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerclass I3DNow<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pat>
16*9880d681SAndroid Build Coastguard Worker      : I<o, F, outs, ins, asm, pat>, TB, Requires<[Has3DNow]> {
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerclass I3DNow_binop<bits<8> o, Format F, dag ins, string Mnemonic, list<dag> pat>
20*9880d681SAndroid Build Coastguard Worker      : I3DNow<o, F, (outs VR64:$dst), ins,
21*9880d681SAndroid Build Coastguard Worker          !strconcat(Mnemonic, "\t{$src2, $dst|$dst, $src2}"), pat>,
22*9880d681SAndroid Build Coastguard Worker        Has3DNow0F0FOpcode {
23*9880d681SAndroid Build Coastguard Worker  // FIXME: The disassembler doesn't support Has3DNow0F0FOpcode yet.
24*9880d681SAndroid Build Coastguard Worker  let isAsmParserOnly = 1;
25*9880d681SAndroid Build Coastguard Worker  let Constraints = "$src1 = $dst";
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerclass I3DNow_conv<bits<8> o, Format F, dag ins, string Mnemonic, list<dag> pat>
29*9880d681SAndroid Build Coastguard Worker      : I3DNow<o, F, (outs VR64:$dst), ins,
30*9880d681SAndroid Build Coastguard Worker          !strconcat(Mnemonic, "\t{$src, $dst|$dst, $src}"), pat>,
31*9880d681SAndroid Build Coastguard Worker        Has3DNow0F0FOpcode {
32*9880d681SAndroid Build Coastguard Worker  // FIXME: The disassembler doesn't support Has3DNow0F0FOpcode yet.
33*9880d681SAndroid Build Coastguard Worker  let isAsmParserOnly = 1;
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workermulticlass I3DNow_binop_rm<bits<8> opc, string Mn> {
37*9880d681SAndroid Build Coastguard Worker  def rr : I3DNow_binop<opc, MRMSrcReg, (ins VR64:$src1, VR64:$src2), Mn, []>;
38*9880d681SAndroid Build Coastguard Worker  def rm : I3DNow_binop<opc, MRMSrcMem, (ins VR64:$src1, i64mem:$src2), Mn, []>;
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workermulticlass I3DNow_binop_rm_int<bits<8> opc, string Mn, string Ver = ""> {
42*9880d681SAndroid Build Coastguard Worker  def rr : I3DNow_binop<opc, MRMSrcReg, (ins VR64:$src1, VR64:$src2), Mn,
43*9880d681SAndroid Build Coastguard Worker    [(set VR64:$dst, (!cast<Intrinsic>(
44*9880d681SAndroid Build Coastguard Worker      !strconcat("int_x86_3dnow", Ver, "_", Mn)) VR64:$src1, VR64:$src2))]>;
45*9880d681SAndroid Build Coastguard Worker  def rm : I3DNow_binop<opc, MRMSrcMem, (ins VR64:$src1, i64mem:$src2), Mn,
46*9880d681SAndroid Build Coastguard Worker    [(set VR64:$dst, (!cast<Intrinsic>(
47*9880d681SAndroid Build Coastguard Worker      !strconcat("int_x86_3dnow", Ver, "_", Mn)) VR64:$src1,
48*9880d681SAndroid Build Coastguard Worker        (bitconvert (load_mmx addr:$src2))))]>;
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workermulticlass I3DNow_conv_rm<bits<8> opc, string Mn> {
52*9880d681SAndroid Build Coastguard Worker  def rr : I3DNow_conv<opc, MRMSrcReg, (ins VR64:$src1), Mn, []>;
53*9880d681SAndroid Build Coastguard Worker  def rm : I3DNow_conv<opc, MRMSrcMem, (ins i64mem:$src1), Mn, []>;
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workermulticlass I3DNow_conv_rm_int<bits<8> opc, string Mn, string Ver = ""> {
57*9880d681SAndroid Build Coastguard Worker  def rr : I3DNow_conv<opc, MRMSrcReg, (ins VR64:$src), Mn,
58*9880d681SAndroid Build Coastguard Worker    [(set VR64:$dst, (!cast<Intrinsic>(
59*9880d681SAndroid Build Coastguard Worker      !strconcat("int_x86_3dnow", Ver, "_", Mn)) VR64:$src))]>;
60*9880d681SAndroid Build Coastguard Worker  def rm : I3DNow_conv<opc, MRMSrcMem, (ins i64mem:$src), Mn,
61*9880d681SAndroid Build Coastguard Worker    [(set VR64:$dst, (!cast<Intrinsic>(
62*9880d681SAndroid Build Coastguard Worker      !strconcat("int_x86_3dnow", Ver, "_", Mn))
63*9880d681SAndroid Build Coastguard Worker        (bitconvert (load_mmx addr:$src))))]>;
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdefm PAVGUSB  : I3DNow_binop_rm_int<0xBF, "pavgusb">;
67*9880d681SAndroid Build Coastguard Workerdefm PF2ID    : I3DNow_conv_rm_int<0x1D, "pf2id">;
68*9880d681SAndroid Build Coastguard Workerdefm PFACC    : I3DNow_binop_rm_int<0xAE, "pfacc">;
69*9880d681SAndroid Build Coastguard Workerdefm PFADD    : I3DNow_binop_rm_int<0x9E, "pfadd">;
70*9880d681SAndroid Build Coastguard Workerdefm PFCMPEQ  : I3DNow_binop_rm_int<0xB0, "pfcmpeq">;
71*9880d681SAndroid Build Coastguard Workerdefm PFCMPGE  : I3DNow_binop_rm_int<0x90, "pfcmpge">;
72*9880d681SAndroid Build Coastguard Workerdefm PFCMPGT  : I3DNow_binop_rm_int<0xA0, "pfcmpgt">;
73*9880d681SAndroid Build Coastguard Workerdefm PFMAX    : I3DNow_binop_rm_int<0xA4, "pfmax">;
74*9880d681SAndroid Build Coastguard Workerdefm PFMIN    : I3DNow_binop_rm_int<0x94, "pfmin">;
75*9880d681SAndroid Build Coastguard Workerdefm PFMUL    : I3DNow_binop_rm_int<0xB4, "pfmul">;
76*9880d681SAndroid Build Coastguard Workerdefm PFRCP    : I3DNow_conv_rm_int<0x96, "pfrcp">;
77*9880d681SAndroid Build Coastguard Workerdefm PFRCPIT1 : I3DNow_binop_rm_int<0xA6, "pfrcpit1">;
78*9880d681SAndroid Build Coastguard Workerdefm PFRCPIT2 : I3DNow_binop_rm_int<0xB6, "pfrcpit2">;
79*9880d681SAndroid Build Coastguard Workerdefm PFRSQIT1 : I3DNow_binop_rm_int<0xA7, "pfrsqit1">;
80*9880d681SAndroid Build Coastguard Workerdefm PFRSQRT  : I3DNow_conv_rm_int<0x97, "pfrsqrt">;
81*9880d681SAndroid Build Coastguard Workerdefm PFSUB    : I3DNow_binop_rm_int<0x9A, "pfsub">;
82*9880d681SAndroid Build Coastguard Workerdefm PFSUBR   : I3DNow_binop_rm_int<0xAA, "pfsubr">;
83*9880d681SAndroid Build Coastguard Workerdefm PI2FD    : I3DNow_conv_rm_int<0x0D, "pi2fd">;
84*9880d681SAndroid Build Coastguard Workerdefm PMULHRW  : I3DNow_binop_rm_int<0xB7, "pmulhrw">;
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdef FEMMS : I3DNow<0x0E, RawFrm, (outs), (ins), "femms",
88*9880d681SAndroid Build Coastguard Worker                   [(int_x86_mmx_femms)]>;
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdef PREFETCH : I3DNow<0x0D, MRM0m, (outs), (ins i8mem:$addr),
91*9880d681SAndroid Build Coastguard Worker                      "prefetch\t$addr",
92*9880d681SAndroid Build Coastguard Worker                      [(prefetch addr:$addr, (i32 0), imm, (i32 1))]>;
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdef PREFETCHW : I<0x0D, MRM1m, (outs), (ins i8mem:$addr), "prefetchw\t$addr",
95*9880d681SAndroid Build Coastguard Worker                  [(prefetch addr:$addr, (i32 1), (i32 3), (i32 1))]>, TB,
96*9880d681SAndroid Build Coastguard Worker                Requires<[HasPrefetchW]>;
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker// "3DNowA" instructions
99*9880d681SAndroid Build Coastguard Workerdefm PF2IW    : I3DNow_conv_rm_int<0x1C, "pf2iw", "a">;
100*9880d681SAndroid Build Coastguard Workerdefm PI2FW    : I3DNow_conv_rm_int<0x0C, "pi2fw", "a">;
101*9880d681SAndroid Build Coastguard Workerdefm PFNACC   : I3DNow_binop_rm_int<0x8A, "pfnacc", "a">;
102*9880d681SAndroid Build Coastguard Workerdefm PFPNACC  : I3DNow_binop_rm_int<0x8E, "pfpnacc", "a">;
103*9880d681SAndroid Build Coastguard Workerdefm PSWAPD   : I3DNow_conv_rm_int<0xBB, "pswapd", "a">;
104