dim_s390x.s raw

   1  // Copyright 2016 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  // Based on dim_amd64.s
   6  
   7  #include "textflag.h"
   8  
   9  #define PosInf 0x7FF0000000000000
  10  #define NaN    0x7FF8000000000001
  11  #define NegInf 0xFFF0000000000000
  12  
  13  // func ·Max(x, y float64) float64
  14  TEXT ·archMax(SB),NOSPLIT,$0
  15  	// +Inf special cases
  16  	MOVD    $PosInf, R4
  17  	MOVD    x+0(FP), R8
  18  	CMPUBEQ R4, R8, isPosInf
  19  	MOVD    y+8(FP), R9
  20  	CMPUBEQ R4, R9, isPosInf
  21  	// NaN special cases
  22  	MOVD    $~(1<<63), R5 // bit mask
  23  	MOVD    $PosInf, R4
  24  	MOVD    R8, R2
  25  	AND     R5, R2 // x = |x|
  26  	CMPUBLT R4, R2, isMaxNaN
  27  	MOVD    R9, R3
  28  	AND     R5, R3 // y = |y|
  29  	CMPUBLT R4, R3, isMaxNaN
  30  	// ±0 special cases
  31  	OR      R3, R2
  32  	BEQ     isMaxZero
  33  
  34  	FMOVD   x+0(FP), F1
  35  	FMOVD   y+8(FP), F2
  36  	FCMPU   F2, F1
  37  	BGT     +3(PC)
  38  	FMOVD   F1, ret+16(FP)
  39  	RET
  40  	FMOVD   F2, ret+16(FP)
  41  	RET
  42  isMaxNaN: // return NaN
  43  	MOVD	$NaN, R4
  44  isPosInf: // return +Inf
  45  	MOVD    R4, ret+16(FP)
  46  	RET
  47  isMaxZero:
  48  	MOVD    $(1<<63), R4 // -0.0
  49  	CMPUBEQ R4, R8, +3(PC)
  50  	MOVD    R8, ret+16(FP) // return 0
  51  	RET
  52  	MOVD    R9, ret+16(FP) // return other 0
  53  	RET
  54  
  55  // func archMin(x, y float64) float64
  56  TEXT ·archMin(SB),NOSPLIT,$0
  57  	// -Inf special cases
  58  	MOVD    $NegInf, R4
  59  	MOVD    x+0(FP), R8
  60  	CMPUBEQ R4, R8, isNegInf
  61  	MOVD    y+8(FP), R9
  62  	CMPUBEQ R4, R9, isNegInf
  63  	// NaN special cases
  64  	MOVD    $~(1<<63), R5
  65  	MOVD    $PosInf, R4
  66  	MOVD    R8, R2
  67  	AND     R5, R2 // x = |x|
  68  	CMPUBLT R4, R2, isMinNaN
  69  	MOVD    R9, R3
  70  	AND     R5, R3 // y = |y|
  71  	CMPUBLT R4, R3, isMinNaN
  72  	// ±0 special cases
  73  	OR      R3, R2
  74  	BEQ     isMinZero
  75  
  76  	FMOVD   x+0(FP), F1
  77  	FMOVD   y+8(FP), F2
  78  	FCMPU   F2, F1
  79  	BLT     +3(PC)
  80  	FMOVD   F1, ret+16(FP)
  81  	RET
  82  	FMOVD   F2, ret+16(FP)
  83  	RET
  84  isMinNaN: // return NaN
  85  	MOVD	$NaN, R4
  86  isNegInf: // return -Inf
  87  	MOVD    R4, ret+16(FP)
  88  	RET
  89  isMinZero:
  90  	MOVD    $(1<<63), R4 // -0.0
  91  	CMPUBEQ R4, R8, +3(PC)
  92  	MOVD    R9, ret+16(FP) // return other 0
  93  	RET
  94  	MOVD    R8, ret+16(FP) // return -0
  95  	RET
  96  
  97