aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r--src/cmd/internal/obj/s390x/a.out.go8
-rw-r--r--src/cmd/internal/obj/s390x/anames.go8
-rw-r--r--src/cmd/internal/obj/s390x/asmz.go21
-rw-r--r--src/cmd/internal/obj/s390x/vector.go22
4 files changed, 58 insertions, 1 deletions
diff --git a/src/cmd/internal/obj/s390x/a.out.go b/src/cmd/internal/obj/s390x/a.out.go
index 1a64370efa..dc715182f5 100644
--- a/src/cmd/internal/obj/s390x/a.out.go
+++ b/src/cmd/internal/obj/s390x/a.out.go
@@ -715,6 +715,14 @@ const (
AWFLNDB
AVFLPDB
AWFLPDB
+ AVFMAXDB
+ AWFMAXDB
+ AVFMAXSB
+ AWFMAXSB
+ AVFMINDB
+ AWFMINDB
+ AVFMINSB
+ AWFMINSB
AVFSQ
AVFSQDB
AWFSQDB
diff --git a/src/cmd/internal/obj/s390x/anames.go b/src/cmd/internal/obj/s390x/anames.go
index c0a0c401fa..a6f2820f85 100644
--- a/src/cmd/internal/obj/s390x/anames.go
+++ b/src/cmd/internal/obj/s390x/anames.go
@@ -438,6 +438,14 @@ var Anames = []string{
"WFLNDB",
"VFLPDB",
"WFLPDB",
+ "VFMAXDB",
+ "WFMAXDB",
+ "VFMAXSB",
+ "WFMAXSB",
+ "VFMINDB",
+ "WFMINDB",
+ "VFMINSB",
+ "WFMINSB",
"VFSQ",
"VFSQDB",
"WFSQDB",
diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go
index 72d92abbaf..957222a155 100644
--- a/src/cmd/internal/obj/s390x/asmz.go
+++ b/src/cmd/internal/obj/s390x/asmz.go
@@ -441,6 +441,11 @@ var optab = []Optab{
{i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
{i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG},
+ // VRR-c floating point min/max
+ {i: 128, as: AVFMAXDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 128, as: AWFMAXDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
+ {i: 128, as: AWFMAXDB, a1: C_SCON, a2: C_FREG, a3: C_FREG, a6: C_FREG},
+
// VRR-d
{i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
@@ -1480,6 +1485,14 @@ func buildop(ctxt *obj.Link) {
opset(AVFMSDB, r)
opset(AWFMSDB, r)
opset(AVPERM, r)
+ case AVFMAXDB:
+ opset(AVFMAXSB, r)
+ opset(AVFMINDB, r)
+ opset(AVFMINSB, r)
+ case AWFMAXDB:
+ opset(AWFMAXSB, r)
+ opset(AWFMINDB, r)
+ opset(AWFMINSB, r)
case AKM:
opset(AKMC, r)
opset(AKLMD, r)
@@ -2636,6 +2649,8 @@ const (
op_VUPLL uint32 = 0xE7D4 // VRR-a VECTOR UNPACK LOGICAL LOW
op_VUPL uint32 = 0xE7D6 // VRR-a VECTOR UNPACK LOW
op_VMSL uint32 = 0xE7B8 // VRR-d VECTOR MULTIPLY SUM LOGICAL
+ op_VFMAX uint32 = 0xE7EF // VRR-c VECTOR FP MAXIMUM
+ op_VFMIN uint32 = 0xE7EE // VRR-c VECTOR FP MINIMUM
// added in z15
op_KDSA uint32 = 0xB93A // FORMAT_RRE COMPUTE DIGITAL SIGNATURE AUTHENTICATION (KDSA)
@@ -4475,6 +4490,12 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) {
c.ctxt.Diag("padding byte register cannot be same as input or output register %v", p)
}
zRS(op_MVCLE, uint32(p.To.Reg), uint32(p.Reg), uint32(p.From.Reg), uint32(d2), asm)
+
+ case 128: // VRR-c floating point max/min
+ op, m4, _ := vop(p.As)
+ m5 := singleElementMask(p.As)
+ m6 := uint32(c.vregoff(&p.From))
+ zVRRc(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), m6, m5, m4, asm)
}
}
diff --git a/src/cmd/internal/obj/s390x/vector.go b/src/cmd/internal/obj/s390x/vector.go
index e7e36eaf15..966cd04c27 100644
--- a/src/cmd/internal/obj/s390x/vector.go
+++ b/src/cmd/internal/obj/s390x/vector.go
@@ -1027,6 +1027,22 @@ func vop(as obj.As) (opcode, es, cs uint32) {
return op_VUPL, 1, 0
case AVUPLF:
return op_VUPL, 2, 0
+ case AVFMAXDB:
+ return op_VFMAX, 3, 0
+ case AWFMAXDB:
+ return op_VFMAX, 3, 0
+ case AVFMAXSB:
+ return op_VFMAX, 2, 0
+ case AWFMAXSB:
+ return op_VFMAX, 2, 0
+ case AVFMINDB:
+ return op_VFMIN, 3, 0
+ case AWFMINDB:
+ return op_VFMIN, 3, 0
+ case AVFMINSB:
+ return op_VFMIN, 2, 0
+ case AWFMINSB:
+ return op_VFMIN, 2, 0
}
}
@@ -1062,7 +1078,11 @@ func singleElementMask(as obj.As) uint32 {
AWFSQDB,
AWFSDB,
AWFTCIDB,
- AWFIDB:
+ AWFIDB,
+ AWFMAXDB,
+ AWFMAXSB,
+ AWFMINDB,
+ AWFMINSB:
return 8
}
return 0