20
20
21
21
def X86loadp : SDNode<" X86ISD::LOAD_PACK" , SDTLoad, [SDNPHasChain]>;
22
22
def X86loadu : SDNode<" X86ISD::LOAD_UA" , SDTLoad, [SDNPHasChain]>;
23
+ def X86fmin : SDNode<" X86ISD::FMIN" , SDTFPBinOp>;
24
+ def X86fmax : SDNode<" X86ISD::FMAX" , SDTFPBinOp>;
23
25
def X86fand : SDNode<" X86ISD::FAND" , SDTFPBinOp,
24
26
[SDNPCommutative, SDNPAssociative]>;
25
27
def X86fxor : SDNode<" X86ISD::FXOR" , SDTFPBinOp,
@@ -375,6 +377,10 @@ defm SUB : scalar_sse12_fp_binop_rm<0x5C, "sub", fsub,
375
377
int_x86_sse_sub_ss, int_x86_sse2_sub_sd>;
376
378
defm DIV : scalar_sse12_fp_binop_rm<0x5E , " div" , fdiv,
377
379
int_x86_sse_div_ss, int_x86_sse2_div_sd>;
380
+ defm MAX : scalar_sse12_fp_binop_rm<0x5F , " max" , X86fmax,
381
+ int_x86_sse_max_ss, int_x86_sse2_max_sd>;
382
+ defm MIN : scalar_sse12_fp_binop_rm<0x5D , " min" , X86fmin,
383
+ int_x86_sse_min_ss, int_x86_sse2_min_sd>;
378
384
379
385
380
386
def SQRTSSr : SSI<0x51 , MRMSrcReg, (ops FR32:$dst, FR32:$src),
@@ -390,44 +396,13 @@ def SQRTSDm : SDI<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
390
396
" sqrtsd {$src, $dst|$dst, $src}" ,
391
397
[(set FR64:$dst, (fsqrt (loadf64 addr:$src)))]>;
392
398
393
- class SS_Intrr <bits<8 > o, string OpcodeStr, Intrinsic IntId>
394
- : SSI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
395
- !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}" ),
396
- [(set VR128:$dst, (v4f32 (IntId VR128:$src1, VR128:$src2)))]>;
397
- class SS_Intrm <bits<8 > o, string OpcodeStr, Intrinsic IntId>
398
- : SSI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, ssmem:$src2),
399
- !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}" ),
400
- [(set VR128:$dst, (v4f32 (IntId VR128:$src1, sse_load_f32:$src2)))]>;
401
- class SD_Intrr <bits<8 > o, string OpcodeStr, Intrinsic IntId>
402
- : SDI<o, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2),
403
- !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}" ),
404
- [(set VR128:$dst, (v2f64 (IntId VR128:$src1, VR128:$src2)))]>;
405
- class SD_Intrm <bits<8 > o, string OpcodeStr, Intrinsic IntId>
406
- : SDI<o, MRMSrcMem, (ops VR128:$dst, VR128:$src1, sdmem:$src2),
407
- !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}" ),
408
- [(set VR128:$dst, (v2f64 (IntId VR128:$src1, sse_load_f64:$src2)))]>;
409
-
410
-
411
399
// Aliases to match intrinsics which expect XMM operand(s).
412
400
413
401
defm SQRTSS_Int : SS_IntUnary<0x51 , " sqrtss" , int_x86_sse_sqrt_ss>;
414
402
defm SQRTSD_Int : SD_IntUnary<0x51 , " sqrtsd" , int_x86_sse2_sqrt_sd>;
415
403
defm RSQRTSS_Int : SS_IntUnary<0x52 , " rsqrtss" , int_x86_sse_rsqrt_ss>;
416
404
defm RCPSS_Int : SS_IntUnary<0x53 , " rcpss" , int_x86_sse_rcp_ss>;
417
405
418
- let isTwoAddress = 1 in {
419
- let isCommutable = 1 in {
420
- def Int_MAXSSrr : SS_Intrr<0x5F , " maxss" , int_x86_sse_max_ss>;
421
- def Int_MAXSDrr : SD_Intrr<0x5F , " maxsd" , int_x86_sse2_max_sd>;
422
- def Int_MINSSrr : SS_Intrr<0x5D , " minss" , int_x86_sse_min_ss>;
423
- def Int_MINSDrr : SD_Intrr<0x5D , " minsd" , int_x86_sse2_min_sd>;
424
- }
425
- def Int_MAXSSrm : SS_Intrm<0x5F , " maxss" , int_x86_sse_max_ss>;
426
- def Int_MAXSDrm : SD_Intrm<0x5F , " maxsd" , int_x86_sse2_max_sd>;
427
- def Int_MINSSrm : SS_Intrm<0x5D , " minss" , int_x86_sse_min_ss>;
428
- def Int_MINSDrm : SD_Intrm<0x5D , " minsd" , int_x86_sse2_min_sd>;
429
- }
430
-
431
406
// Conversion instructions
432
407
def CVTTSS2SIrr: SSI<0x2C , MRMSrcReg, (ops GR32:$dst, FR32:$src),
433
408
" cvttss2si {$src, $dst|$dst, $src}" ,
0 commit comments