...

Text file src/pkg/math/dim_s390x.s

     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 ·Max(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 Min(x, y float64) float64
    56	TEXT ·Min(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	

View as plain text