]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/asm, math: add s390x floating point test instructions
authorMichael Munday <mike.munday@ibm.com>
Tue, 3 Apr 2018 14:49:06 +0000 (15:49 +0100)
committerMichael Munday <mike.munday@ibm.com>
Tue, 3 Apr 2018 16:08:04 +0000 (16:08 +0000)
Floating point test instructions allow special cases (NaN, ±∞ and
a few other useful properties) to be checked directly.

This CL adds the following instructions to the assembler:
 * LTEBR - load and test (float32)
 * LTDBR - load and test (float64)
 * TCEB  - test data class (float32)
 * TCDB  - test data class (float64)

Note that I have only added immediate versions of the 'test data
class' instructions for now as that's the only case I think the
compiler will use.

Change-Id: I3398aab2b3a758bf909bd158042234030c8af582
Reviewed-on: https://go-review.googlesource.com/104457
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Michael Munday <mike.munday@ibm.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

19 files changed:
src/cmd/asm/internal/asm/testdata/s390x.s
src/cmd/internal/obj/s390x/a.out.go
src/cmd/internal/obj/s390x/anames.go
src/cmd/internal/obj/s390x/asmz.go
src/math/acosh_s390x.s
src/math/asinh_s390x.s
src/math/atan2_s390x.s
src/math/cbrt_s390x.s
src/math/cosh_s390x.s
src/math/erfc_s390x.s
src/math/exp_s390x.s
src/math/expm1_s390x.s
src/math/log10_s390x.s
src/math/log_s390x.s
src/math/pow_s390x.s
src/math/sin_s390x.s
src/math/sinh_s390x.s
src/math/tan_s390x.s
src/math/tanh_s390x.s

index 867fe40a725d24633152f6fcf93aab6bfc936718..68bc29ea10e1535c36845eb2bd0c135d02a4b922 100644 (file)
@@ -304,6 +304,10 @@ TEXT main·foo(SB),DUPOK|NOSPLIT,$16-0 // TEXT main.foo(SB), DUPOK|NOSPLIT, $16-
        LPDFR   F1, F2                 // b3700021
        LNDFR   F3, F4                 // b3710043
        CPSDR   F5, F6, F7             // b3725076
+       LTEBR   F1, F2                 // b3020021
+       LTDBR   F3, F4                 // b3120043
+       TCEB    F5, $8                 // ed5000080010
+       TCDB    F15, $4095             // edf00fff0011
 
        VL      (R15), V1               // e710f0000006
        VST     V1, (R15)               // e710f000000e
index a51685e22b15da3b77ecb60923f4c42451c826fd..d9f50a4f665f2005924e12d42b90f5d6738e7018 100644 (file)
@@ -318,6 +318,10 @@ const (
        AFIEBR
        AFIDBR
        ACPSDR
+       ALTEBR
+       ALTDBR
+       ATCEB
+       ATCDB
 
        // move from GPR to FPR and vice versa
        ALDGR
index 8488ccc46e3fd96364f2ab93be95985e6199eddb..c4731f77b30d6f87d1db18849fee222fcf74a107 100644 (file)
@@ -90,6 +90,10 @@ var Anames = []string{
        "FIEBR",
        "FIDBR",
        "CPSDR",
+       "LTEBR",
+       "LTDBR",
+       "TCEB",
+       "TCDB",
        "LDGR",
        "LGDR",
        "CEFBRA",
index 7304ab3cc456d63bb2bd6b92b302a9be025ed66f..3062c9af798ea7cf3420c19f3d2053fa58368681 100644 (file)
@@ -213,6 +213,8 @@ var optab = []Optab{
        Optab{ACFEBRA, C_FREG, C_NONE, C_NONE, C_REG, 83, 0},
        Optab{AFIEBR, C_SCON, C_FREG, C_NONE, C_FREG, 48, 0},
        Optab{ACPSDR, C_FREG, C_FREG, C_NONE, C_FREG, 49, 0},
+       Optab{ALTDBR, C_FREG, C_NONE, C_NONE, C_FREG, 50, 0},
+       Optab{ATCDB, C_FREG, C_NONE, C_NONE, C_SCON, 51, 0},
 
        // load symbol address (plus offset)
        Optab{AMOVD, C_SYMADDR, C_NONE, C_NONE, C_REG, 19, 0},
@@ -994,6 +996,10 @@ func buildop(ctxt *obj.Link) {
                        opset(AMOVDLE, r)
                        opset(AMOVDLT, r)
                        opset(AMOVDNE, r)
+               case ALTDBR:
+                       opset(ALTEBR, r)
+               case ATCDB:
+                       opset(ATCEB, r)
                case AVL:
                        opset(AVLLEZB, r)
                        opset(AVLLEZH, r)
@@ -3298,6 +3304,27 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) {
        case 49: // copysign
                zRRF(op_CPSDR, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
 
+       case 50: // load and test
+               var opcode uint32
+               switch p.As {
+               case ALTEBR:
+                       opcode = op_LTEBR
+               case ALTDBR:
+                       opcode = op_LTDBR
+               }
+               zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
+
+       case 51: // test data class (immediate only)
+               var opcode uint32
+               switch p.As {
+               case ATCEB:
+                       opcode = op_TCEB
+               case ATCDB:
+                       opcode = op_TCDB
+               }
+               d2 := c.regoff(&p.To)
+               zRXE(opcode, uint32(p.From.Reg), 0, 0, uint32(d2), 0, asm)
+
        case 67: // fmov $0 freg
                var opcode uint32
                switch p.As {
index e120285c3d2df0271fa859eda6c8727c73351633..3575ed6394b7dc3a6eee9af47d6a55f3e7fa2ee3 100644 (file)
@@ -146,7 +146,7 @@ L10:
        FMOVD   F0, F8
        FMOVD   0(R9), F0
        FMADD   F8, F8, F0
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        FSQRT   F0, F10
 L4:
        WFADB   V10, V8, V0
index 870a64a7a0848f0e3bd1fb958cc6adc29df79439..a9cee342d30f055798719fe1cc59aec7fb9b37b0 100644 (file)
@@ -84,7 +84,7 @@ L3:
        BYTE    $0xFF
        CMPW    R1, R2
        BGT     L1
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        FMOVD   F0, F10
        BLTU    L15
 L9:
@@ -120,13 +120,13 @@ L1:
        FMOVD   F0, ret+8(FP)
        RET
 L14:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L17
        FMOVD   F0, F10
 L4:
        FMOVD   192(R9), F2
        WFMADB  V0, V0, V2, V0
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        FSQRT   F0, F8
 L5:
        WFADB   V8, V10, V0
index 5d90d488fcc433a70f71b891ab51955f64950086..f37555b07f1bbb53fea20b5ac6920be591c02513 100644 (file)
@@ -212,10 +212,10 @@ L3:
        WFMADB  V4, V1, V3, V4
        BLT     L18
        BGT     L7
-       WORD    $0xB3120022     //ltdbr %f2,%f2
+       LTDBR   F2, F2
        BLTU    L21
 L8:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L22
 L9:
        WFCHDBS V2, V0, V0
@@ -238,11 +238,11 @@ L1:
        RET
 
 L20:
-       WORD    $0xB3120022     //ltdbr %f2,%f2
+       LTDBR   F2, F2
        BLTU    L23
        FMOVD   F2, F6
 L4:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L24
        FMOVD   F0, F4
 L5:
index 20d9fe6f55cfda3abb93fa0b490d38a8e4eed236..85a2fcb576c790fe2baf55b821c007785f46a4a2 100644 (file)
@@ -96,7 +96,7 @@ L1:
        RET
 L3:
 L2:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BEQ     L1
        FMOVD   F0, F2
        WORD    $0xED209040     //mdb   %f2,.L10-.L9(%r9)
index 343ae22e7de14c2a0ef1f6a87e94c827298e5409..5e7a8d88ccc805b635bbb451fd8c6cbf55d40d25 100644 (file)
@@ -64,7 +64,7 @@ GLOBL coshe6<>+0(SB), RODATA, $8
 TEXT ·coshAsm(SB),NOSPLIT,$0-16
        FMOVD   x+0(FP), F0
        MOVD    $coshrodataL23<>+0(SB), R9
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        MOVD    $0x4086000000000000, R2
        MOVD    $0x4086000000000000, R3
        BLTU    L19
index edf51440a5dc911845c66088707339b427c13348..1a867ad9f4aef1b17c4b6864627a98cfc747cd7e 100644 (file)
@@ -166,7 +166,7 @@ TEXT        ·erfcAsm(SB), NOSPLIT, $0-16
        RET
 
 L2:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        MOVH    $0x0, R4
        BLTU    L3
        FMOVD   F0, F1
@@ -264,7 +264,7 @@ L1:
        FMOVD   F2, ret+8(FP)
        RET
 L3:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L30
        FMOVD   568(R9), F2
        WFSDB   V0, V2, V0
index dac0a5cd9ba621bd18dc154347a1244c9bba975c..613ec24136491126dddf70cda8c37e35b4ce7b59 100644 (file)
@@ -59,7 +59,7 @@ GLOBL ·exptexp<> + 0(SB), RODATA, $128
 TEXT   ·expAsm(SB), NOSPLIT, $0-16
        FMOVD   x+0(FP), F0
        MOVD    $·exprodataL22<>+0(SB), R5
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L20
        FMOVD   F0, F2
 L2:
index 641b2a893d912a7fcf34f2bebe9e1a2a2224d455..22e5eb16a9049e1112b34b8c64f21c3dc3aa4c2d 100644 (file)
@@ -64,7 +64,7 @@ GLOBL ·expm1tab<> + 0(SB), RODATA, $128
 TEXT   ·expm1Asm(SB), NOSPLIT, $0-16
        FMOVD   x+0(FP), F0
        MOVD    $·expm1rodataL22<>+0(SB), R5
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L20
        FMOVD   F0, F2
 L2:
index edbc181bc9953dcbd8b51cc31ae55db62afff1c3..d6b750065bda72a8ea112c85cd85e97bde328bf5 100644 (file)
@@ -87,7 +87,7 @@ L1:
        RET
 
 L2:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLEU    L13
        WORD    $0xED009080     //mdb %f0,.L20-.L19(%r9)
        BYTE    $0x00
index b0e193f594491c58ece397e7dfe292db0278d02e..3e24ca79bb6f52cb6a31e4069d550ac50ad5517e 100644 (file)
@@ -79,7 +79,7 @@ TEXT  ·logAsm(SB), NOSPLIT, $0-16
        BYTE    $0x59
        MOVW    R1, R7
        CMPBGT  R7, $22, L17
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        MOVD    $·logx43f<>+0(SB), R1
        FMOVD   0(R1), F2
        BLEU    L3
@@ -87,7 +87,7 @@ TEXT  ·logAsm(SB), NOSPLIT, $0-16
        MOVH    $0x8405, R0
        BR      L15
 L7:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLEU    L3
 L15:
        FMUL    F2, F0
@@ -161,7 +161,7 @@ L1:
        FMOVD   F0, ret+8(FP)
        RET
 L3:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BEQ     L20
        BGE     L1
        BVS     L1
index fa8decb8065c42508148bb22c469bb1345ceeb8e..fd1961756161f827e16b18c30f8e2816574387be 100644 (file)
@@ -426,7 +426,7 @@ L1:
        FMOVD   F1, ret+16(FP)
        RET
 L43:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L44
        FMOVD   F0, F3
 L7:
@@ -438,7 +438,7 @@ L7:
 L8:
        WFCEDBS V2, V2, V3
        BVS     L9
-       WORD    $0xB3120022     //ltdbr %f2,%f2
+       LTDBR   F2, F2
        BEQ     L26
        MOVW    R1, R6
        CMPBLT  R6, $0, L45
@@ -469,7 +469,7 @@ L11:
        BYTE    $0x1C
        BR      L1
 L42:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L46
        FMOVD   F0, F4
 L3:
@@ -534,7 +534,7 @@ L26:
 L34:
        FMOVD   8(R9), F4
 L19:
-       WORD    $0xB3120066     //ltdbr %f6,%f6
+       LTDBR   F6, F6
        BLEU    L47
 L18:
        WFMDB   V4, V5, V1
@@ -552,7 +552,7 @@ L5:
 L45:
        WFCEDBS V0, V0, V4
        BVS     L35
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLEU    L48
        FMOVD   8(R9), F4
 L12:
@@ -576,7 +576,7 @@ L48:
        BYTE    $0x59
        MOVW    R1, R6
        CMPBEQ  R6, $0, L29
-       WORD    $0xB3120022     //ltdbr %f2,%f2
+       LTDBR   F2, F2
        BLTU    L50
        FMOVD   F2, F4
 L14:
@@ -588,11 +588,11 @@ L14:
        FSUB    F7, F3
        WFCEDBS V4, V3, V3
        BEQ     L15
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        FMOVD   8(R9), F4
        BNE     L16
 L13:
-       WORD    $0xB3120022     //ltdbr %f2,%f2
+       LTDBR   F2, F2
        BLT     L18
 L40:
        FMOVD   $0, F0
@@ -615,7 +615,7 @@ L15:
        BEQ     L32
        FMOVD   0(R9), F4
 L17:
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BNE     L12
        BR      L13
 L32:
index e2201e0b2c8dcea09dc3289faa35bdc31ff73a7f..7eb2206ca9d19ded373cecbf6188d9fb5969fb65 100644 (file)
@@ -69,7 +69,7 @@ TEXT ·sinAsm(SB),NOSPLIT,$0-16
        FMOVD   $(0.0), F1
        FCMPU   F0, F1
        BEQ     sinIsZero
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L17
        FMOVD   F0, F5
 L2:
@@ -219,7 +219,7 @@ sinIsZero:
 
 TEXT ·cosAsm(SB),NOSPLIT,$0-16
        FMOVD   x+0(FP), F0
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L35
        FMOVD   F0, F1
 L21:
index aa494de19a29eab3c09f6c60b10399ffd06418f3..bad2e218f8e380158d126cb9510d6ae8be4b73c9 100644 (file)
@@ -69,7 +69,7 @@ TEXT ·sinhAsm(SB),NOSPLIT,$0-16
        BGT             sinhIsInf
 
        MOVD    $sinhrodataL21<>+0(SB), R5
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        MOVD    sinhxinit<>+0(SB), R1
        FMOVD   F0, F4
        MOVD    R1, R3
index c03b24033b81cdaa3cc155f4c7e5cad00a0da6fb..7b05ba053e3e0db816644e821901270f4f00c97d 100644 (file)
@@ -44,7 +44,7 @@ TEXT  ·tanAsm(SB), NOSPLIT, $0-16
        BEQ     atanIsZero
 
        MOVD    $·tanrodataL13<>+0(SB), R5
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        BLTU    L10
        FMOVD   F0, F2
 L2:
index 026d989bd65c1bceffbc9f5179bb16eca51b7741..456ed623ee399599f50fb239e54b90c09621accb 100644 (file)
@@ -64,7 +64,7 @@ TEXT ·tanhAsm(SB),NOSPLIT,$0-16
        FCMPU   F0, F1
        BEQ     tanhIsZero
        MOVD    $tanhrodataL18<>+0(SB), R5
-       WORD    $0xB3120000     //ltdbr %f0,%f0
+       LTDBR   F0, F0
        MOVD    $0x4034000000000000, R1
        BLTU    L15
        FMOVD   F0, F1