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