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
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-08-23 02:08:15 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								import "math"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-03-15 11:15:22 +01:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								// 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 {
							 | 
						
					
						
							
								
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									// 386/sse2:"ADDSD",-"MULSD"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									// 386/387:"FADDDP",-"FMULDP"
							 | 
						
					
						
							
								
									
										
										
										
											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) {
							 | 
						
					
						
							
								
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									// 386/sse2:"MULSD",-"DIVSD"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									// 386/387:"FMULDP",-"FDIVDP"
							 | 
						
					
						
							
								
									
										
										
										
											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
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									// 386/sse2:"MULSD",-"DIVSD"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									// 386/387:"FMULDP",-"FDIVDP"
							 | 
						
					
						
							
								
									
										
										
										
											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
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-04-15 19:00:27 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									// 386/sse2:"ADDSD",-"DIVSD",-"MULSD"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									// 386/387:"FADDDP",-"FDIVDP",-"FMULDP"
							 | 
						
					
						
							
								
									
										
										
										
											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-08-23 02:08:15 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								func getPi() float64 {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									// 386/387:"FLDPI"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									return math.Pi
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											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 {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									// arm64:"FCMPD","BLE",-"CSET\tGT",-"CBZ"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									return f > 4 || f < -4
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											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
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 |