| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | // asmcheck | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Copyright 2018 The Go Authors. All rights reserved. | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package codegen | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This file contains codegen tests related to arithmetic | 
					
						
							|  |  |  | // simplifications and optimizations on float types. | 
					
						
							|  |  |  | // For codegen tests on integer types, see arithmetic.go. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // --------------------- // | 
					
						
							|  |  |  | //    Strength-reduce    // | 
					
						
							|  |  |  | // --------------------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Mul2(f float64) float64 { | 
					
						
							| 
									
										
										
										
											2020-10-06 14:42:15 -07:00
										 |  |  | 	// 386/sse2:"ADDSD",-"MULSD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// amd64:"ADDSD",-"MULSD" | 
					
						
							| 
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 |  |  | 	// arm/7:"ADDD",-"MULD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// arm64:"FADDD",-"FMULD" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FADD",-"FMUL" | 
					
						
							|  |  |  | 	// ppc64le:"FADD",-"FMUL" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	return f * 2.0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func DivPow2(f1, f2, f3 float64) (float64, float64, float64) { | 
					
						
							| 
									
										
										
										
											2020-10-06 14:42:15 -07:00
										 |  |  | 	// 386/sse2:"MULSD",-"DIVSD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// amd64:"MULSD",-"DIVSD" | 
					
						
							| 
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 |  |  | 	// arm/7:"MULD",-"DIVD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// arm64:"FMULD",-"FDIVD" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FMUL",-"FDIV" | 
					
						
							|  |  |  | 	// ppc64le:"FMUL",-"FDIV" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	x := f1 / 16.0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 14:42:15 -07:00
										 |  |  | 	// 386/sse2:"MULSD",-"DIVSD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// amd64:"MULSD",-"DIVSD" | 
					
						
							| 
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 |  |  | 	// arm/7:"MULD",-"DIVD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// arm64:"FMULD",-"FDIVD" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FMUL",-"FDIVD" | 
					
						
							|  |  |  | 	// ppc64le:"FMUL",-"FDIVD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	y := f2 / 0.125 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 14:42:15 -07:00
										 |  |  | 	// 386/sse2:"ADDSD",-"DIVSD",-"MULSD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// amd64:"ADDSD",-"DIVSD",-"MULSD" | 
					
						
							| 
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 |  |  | 	// arm/7:"ADDD",-"MULD",-"DIVD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// arm64:"FADDD",-"FMULD",-"FDIVD" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FADD",-"FMUL",-"FDIV" | 
					
						
							|  |  |  | 	// ppc64le:"FADD",-"FMUL",-"FDIV" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	z := f3 / 0.5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return x, y, z | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 09:31:35 +00:00
										 |  |  | func indexLoad(b0 []float32, b1 float32, idx int) float32 { | 
					
						
							|  |  |  | 	// arm64:`FMOVS\s\(R[0-9]+\)\(R[0-9]+\),\sF[0-9]+` | 
					
						
							|  |  |  | 	return b0[idx] * b1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func indexStore(b0 []float64, b1 float64, idx int) { | 
					
						
							|  |  |  | 	// arm64:`FMOVD\sF[0-9]+,\s\(R[0-9]+\)\(R[0-9]+\)` | 
					
						
							|  |  |  | 	b0[idx] = b1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | // ----------- // | 
					
						
							|  |  |  | //    Fused    // | 
					
						
							|  |  |  | // ----------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func FusedAdd32(x, y, z float32) float32 { | 
					
						
							|  |  |  | 	// s390x:"FMADDS\t" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FMADDS\t" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// ppc64le:"FMADDS\t" | 
					
						
							| 
									
										
										
										
											2018-10-15 05:39:23 +00:00
										 |  |  | 	// arm64:"FMADDS" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	return x*y + z | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 05:39:23 +00:00
										 |  |  | func FusedSub32_a(x, y, z float32) float32 { | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// s390x:"FMSUBS\t" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FMSUBS\t" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// ppc64le:"FMSUBS\t" | 
					
						
							|  |  |  | 	return x*y - z | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 05:39:23 +00:00
										 |  |  | func FusedSub32_b(x, y, z float32) float32 { | 
					
						
							|  |  |  | 	// arm64:"FMSUBS" | 
					
						
							|  |  |  | 	return z - x*y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | func FusedAdd64(x, y, z float64) float64 { | 
					
						
							|  |  |  | 	// s390x:"FMADD\t" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FMADD\t" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// ppc64le:"FMADD\t" | 
					
						
							| 
									
										
										
										
											2018-10-15 05:39:23 +00:00
										 |  |  | 	// arm64:"FMADDD" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	return x*y + z | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 05:39:23 +00:00
										 |  |  | func FusedSub64_a(x, y, z float64) float64 { | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// s390x:"FMSUB\t" | 
					
						
							| 
									
										
										
										
											2018-10-15 12:53:07 -04:00
										 |  |  | 	// ppc64:"FMSUB\t" | 
					
						
							| 
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 |  |  | 	// ppc64le:"FMSUB\t" | 
					
						
							|  |  |  | 	return x*y - z | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-04-15 19:17:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 05:39:23 +00:00
										 |  |  | func FusedSub64_b(x, y, z float64) float64 { | 
					
						
							|  |  |  | 	// arm64:"FMSUBD" | 
					
						
							|  |  |  | 	return z - x*y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 03:35:37 +00:00
										 |  |  | func Cmp(f float64) bool { | 
					
						
							| 
									
										
										
										
											2020-03-06 22:20:45 +00:00
										 |  |  | 	// arm64:"FCMPD","(BGT|BLE|BMI|BPL)",-"CSET\tGT",-"CBZ" | 
					
						
							| 
									
										
										
										
											2019-05-05 03:35:37 +00:00
										 |  |  | 	return f > 4 || f < -4 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 15:33:37 -05:00
										 |  |  | func CmpZero64(f float64) bool { | 
					
						
							|  |  |  | 	// s390x:"LTDBR",-"FCMPU" | 
					
						
							|  |  |  | 	return f <= 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func CmpZero32(f float32) bool { | 
					
						
							|  |  |  | 	// s390x:"LTEBR",-"CEBR" | 
					
						
							|  |  |  | 	return f <= 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-21 10:44:23 -05:00
										 |  |  | func CmpWithSub(a float64, b float64) bool { | 
					
						
							|  |  |  | 	f := a - b | 
					
						
							|  |  |  | 	// s390x:-"LTDBR" | 
					
						
							|  |  |  | 	return f <= 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func CmpWithAdd(a float64, b float64) bool { | 
					
						
							|  |  |  | 	f := a + b | 
					
						
							|  |  |  | 	// s390x:-"LTDBR" | 
					
						
							|  |  |  | 	return f <= 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-15 19:17:41 +02:00
										 |  |  | // ---------------- // | 
					
						
							|  |  |  | //    Non-floats    // | 
					
						
							|  |  |  | // ---------------- // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // We should make sure that the compiler doesn't generate floating point | 
					
						
							|  |  |  | // instructions for non-float operations on Plan 9, because floating point | 
					
						
							|  |  |  | // operations are not allowed in the note handler. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ArrayZero() [16]byte { | 
					
						
							|  |  |  | 	// amd64:"MOVUPS" | 
					
						
							|  |  |  | 	// plan9/amd64/:-"MOVUPS" | 
					
						
							|  |  |  | 	var a [16]byte | 
					
						
							|  |  |  | 	return a | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func ArrayCopy(a [16]byte) (b [16]byte) { | 
					
						
							|  |  |  | 	// amd64:"MOVUPS" | 
					
						
							|  |  |  | 	// plan9/amd64/:-"MOVUPS" | 
					
						
							|  |  |  | 	b = a | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } |