mirror of
https://github.com/golang/go
synced 2024-11-21 22:34:48 -07:00
integer conversions and test.
R=ken OCL=29577 CL=29589
This commit is contained in:
parent
6e1762c06e
commit
5d1d8a8258
@ -1045,32 +1045,48 @@ gmove(Node *f, Node *t)
|
||||
case CASE(TUINT16, TINT8):
|
||||
case CASE(TINT32, TINT8):
|
||||
case CASE(TUINT32, TINT8):
|
||||
// case CASE(TINT64, TINT8):
|
||||
// case CASE(TUINT64, TINT8):
|
||||
case CASE(TINT16, TUINT8):
|
||||
case CASE(TUINT16, TUINT8):
|
||||
case CASE(TINT32, TUINT8):
|
||||
case CASE(TUINT32, TUINT8):
|
||||
// case CASE(TINT64, TUINT8):
|
||||
// case CASE(TUINT64, TUINT8):
|
||||
a = AMOVB;
|
||||
break;
|
||||
|
||||
case CASE(TINT64, TINT8): // truncate low word
|
||||
case CASE(TUINT64, TINT8):
|
||||
case CASE(TINT64, TUINT8):
|
||||
case CASE(TUINT64, TUINT8):
|
||||
split64(f, &flo, &fhi);
|
||||
regalloc(&r1, t->type, t);
|
||||
gins(AMOVB, &flo, &r1);
|
||||
gins(AMOVB, &r1, t);
|
||||
regfree(&r1);
|
||||
splitclean();
|
||||
return;
|
||||
|
||||
case CASE(TINT16, TINT16): // same size
|
||||
case CASE(TINT16, TUINT16):
|
||||
case CASE(TUINT16, TINT16):
|
||||
case CASE(TUINT16, TUINT16):
|
||||
case CASE(TINT32, TINT16): // truncate
|
||||
case CASE(TUINT32, TINT16):
|
||||
// case CASE(TINT64, TINT16):
|
||||
// case CASE(TUINT64, TINT16):
|
||||
case CASE(TINT32, TUINT16):
|
||||
case CASE(TUINT32, TUINT16):
|
||||
// case CASE(TINT64, TUINT16):
|
||||
// case CASE(TUINT64, TUINT16):
|
||||
a = AMOVW;
|
||||
break;
|
||||
|
||||
case CASE(TINT64, TINT16): // truncate low word
|
||||
case CASE(TUINT64, TINT16):
|
||||
case CASE(TINT64, TUINT16):
|
||||
case CASE(TUINT64, TUINT16):
|
||||
split64(f, &flo, &fhi);
|
||||
regalloc(&r1, t->type, t);
|
||||
gins(AMOVW, &flo, &r1);
|
||||
gins(AMOVW, &r1, t);
|
||||
regfree(&r1);
|
||||
splitclean();
|
||||
return;
|
||||
|
||||
case CASE(TINT32, TINT32): // same size
|
||||
case CASE(TINT32, TUINT32):
|
||||
case CASE(TUINT32, TINT32):
|
||||
@ -1124,10 +1140,10 @@ gmove(Node *f, Node *t)
|
||||
case CASE(TINT8, TUINT32):
|
||||
a = AMOVBLSX;
|
||||
goto rdst;
|
||||
// case CASE(TINT8, TINT64):
|
||||
// case CASE(TINT8, TUINT64):
|
||||
// a = AMOVBQSX;
|
||||
// goto rdst;
|
||||
case CASE(TINT8, TINT64): // convert via int32
|
||||
case CASE(TINT8, TUINT64):
|
||||
cvt = types[TINT32];
|
||||
goto hard;
|
||||
|
||||
case CASE(TUINT8, TINT16): // zero extend uint8
|
||||
case CASE(TUINT8, TUINT16):
|
||||
@ -1137,28 +1153,28 @@ gmove(Node *f, Node *t)
|
||||
case CASE(TUINT8, TUINT32):
|
||||
a = AMOVBLZX;
|
||||
goto rdst;
|
||||
// case CASE(TUINT8, TINT64):
|
||||
// case CASE(TUINT8, TUINT64):
|
||||
// a = AMOVBQZX;
|
||||
// goto rdst;
|
||||
case CASE(TUINT8, TINT64): // convert via uint32
|
||||
case CASE(TUINT8, TUINT64):
|
||||
cvt = types[TUINT32];
|
||||
goto hard;
|
||||
|
||||
case CASE(TINT16, TINT32): // sign extend int16
|
||||
case CASE(TINT16, TUINT32):
|
||||
a = AMOVWLSX;
|
||||
goto rdst;
|
||||
// case CASE(TINT16, TINT64):
|
||||
// case CASE(TINT16, TUINT64):
|
||||
// a = AMOVWQSX;
|
||||
// goto rdst;
|
||||
case CASE(TINT16, TINT64): // convert via int32
|
||||
case CASE(TINT16, TUINT64):
|
||||
cvt = types[TINT32];
|
||||
goto hard;
|
||||
|
||||
case CASE(TUINT16, TINT32): // zero extend uint16
|
||||
case CASE(TUINT16, TUINT32):
|
||||
a = AMOVWLZX;
|
||||
goto rdst;
|
||||
// case CASE(TUINT16, TINT64):
|
||||
// case CASE(TUINT16, TUINT64):
|
||||
// a = AMOVWQZX;
|
||||
// goto rdst;
|
||||
case CASE(TUINT16, TINT64): // convert via uint32
|
||||
case CASE(TUINT16, TUINT64):
|
||||
cvt = types[TUINT32];
|
||||
goto hard;
|
||||
|
||||
case CASE(TINT32, TINT64): // sign extend int32
|
||||
case CASE(TINT32, TUINT64):
|
||||
@ -1323,15 +1339,16 @@ gmove(Node *f, Node *t)
|
||||
*/
|
||||
/*
|
||||
* float to float
|
||||
*
|
||||
*/
|
||||
case CASE(TFLOAT32, TFLOAT32):
|
||||
a = AMOVSS;
|
||||
a = AFMOVF;
|
||||
break;
|
||||
|
||||
case CASE(TFLOAT64, TFLOAT64):
|
||||
a = AMOVSD;
|
||||
a = AFMOVD;
|
||||
break;
|
||||
|
||||
/*
|
||||
case CASE(TFLOAT32, TFLOAT64):
|
||||
a = ACVTSS2SD;
|
||||
goto rdst;
|
||||
|
140
test/intcvt.go
Normal file
140
test/intcvt.go
Normal file
@ -0,0 +1,140 @@
|
||||
// $G $D/$F.go && $L $F.$A && ./$A.out
|
||||
|
||||
// Copyright 2009 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 main
|
||||
|
||||
const (
|
||||
ci8 = -1<<7;
|
||||
ci16 = -1<<15 + 100;
|
||||
ci32 = -1<<31 + 100000;
|
||||
ci64 = -1<<63 + 10000000001;
|
||||
|
||||
cu8 = 1<<8 - 1;
|
||||
cu16 = 1<<16 - 1234;
|
||||
cu32 = 1<<32 - 1234567;
|
||||
cu64 = 1<<64 - 1234567890123;
|
||||
|
||||
cf32 = 1e8 + 0.5;
|
||||
cf64 = -1e8 + 0.5;
|
||||
)
|
||||
|
||||
var (
|
||||
i8 int8 = ci8;
|
||||
i16 int16 = ci16;
|
||||
i32 int32 = ci32;
|
||||
i64 int64 = ci64;
|
||||
|
||||
u8 uint8 = cu8;
|
||||
u16 uint16 = cu16;
|
||||
u32 uint32 = cu32;
|
||||
u64 uint64 = cu64;
|
||||
|
||||
// f32 float32 = 1e8 + 0.5;
|
||||
// f64 float64 = -1e8 + 0.5;
|
||||
)
|
||||
|
||||
func chki8(i, v int8) { if i != v { panicln(i, "!=", v) } }
|
||||
func chki16(i, v int16) { if i != v { panicln(i, "!=", v) } }
|
||||
func chki32(i, v int32) { if i != v { panicln(i, "!=", v) } }
|
||||
func chki64(i, v int64) { if i != v { panicln(i, "!=", v) } }
|
||||
func chku8(i, v uint8) { if i != v { panicln(i, "!=", v) } }
|
||||
func chku16(i, v uint16) { if i != v { panicln(i, "!=", v) } }
|
||||
func chku32(i, v uint32) { if i != v { panicln(i, "!=", v) } }
|
||||
func chku64(i, v uint64) { if i != v { panicln(i, "!=", v) } }
|
||||
//func chkf32(f, v float32) { if f != v { panicln(f, "!=", v) } }
|
||||
//func chkf64(f, v float64) { if f != v { panicln(f, "!=", v) } }
|
||||
|
||||
func main()
|
||||
{
|
||||
chki8(int8(i8), ci8 & 0xff - 1<<8);
|
||||
chki8(int8(i16), ci16 & 0xff);
|
||||
chki8(int8(i32), ci32 & 0xff - 1<<8);
|
||||
chki8(int8(i64), ci64 & 0xff);
|
||||
chki8(int8(u8), cu8 & 0xff - 1<<8);
|
||||
chki8(int8(u16), cu16 & 0xff);
|
||||
chki8(int8(u32), cu32 & 0xff);
|
||||
chki8(int8(u64), cu64 & 0xff);
|
||||
// chki8(int8(f32), 0);
|
||||
// chki8(int8(f64), 0);
|
||||
|
||||
chki16(int16(i8), ci8 & 0xffff - 1<<16);
|
||||
chki16(int16(i16), ci16 & 0xffff - 1<<16);
|
||||
chki16(int16(i32), ci32 & 0xffff - 1<<16);
|
||||
chki16(int16(i64), ci64 & 0xffff - 1<<16);
|
||||
chki16(int16(u8), cu8 & 0xffff);
|
||||
chki16(int16(u16), cu16 & 0xffff - 1<<16);
|
||||
chki16(int16(u32), cu32 & 0xffff);
|
||||
chki16(int16(u64), cu64 & 0xffff - 1<<16);
|
||||
// chki16(int16(f32), 0);
|
||||
// chki16(int16(f64), 0);
|
||||
|
||||
chki32(int32(i8), ci8 & 0xffffffff - 1<<32);
|
||||
chki32(int32(i16), ci16 & 0xffffffff - 1<<32);
|
||||
chki32(int32(i32), ci32 & 0xffffffff - 1<<32);
|
||||
chki32(int32(i64), ci64 & 0xffffffff);
|
||||
chki32(int32(u8), cu8 & 0xffffffff);
|
||||
chki32(int32(u16), cu16 & 0xffffffff);
|
||||
chki32(int32(u32), cu32 & 0xffffffff - 1<<32);
|
||||
chki32(int32(u64), cu64 & 0xffffffff - 1<<32);
|
||||
// chki32(int32(f32), 0);
|
||||
// chki32(int32(f64), 0);
|
||||
|
||||
chki64(int64(i8), ci8 & 0xffffffffffffffff - 1<<64);
|
||||
chki64(int64(i16), ci16 & 0xffffffffffffffff - 1<<64);
|
||||
chki64(int64(i32), ci32 & 0xffffffffffffffff - 1<<64);
|
||||
chki64(int64(i64), ci64 & 0xffffffffffffffff - 1<<64);
|
||||
chki64(int64(u8), cu8 & 0xffffffffffffffff);
|
||||
chki64(int64(u16), cu16 & 0xffffffffffffffff);
|
||||
chki64(int64(u32), cu32 & 0xffffffffffffffff);
|
||||
chki64(int64(u64), cu64 & 0xffffffffffffffff - 1<<64);
|
||||
// chki64(int64(f32), 0);
|
||||
// chki64(int64(f64), 0);
|
||||
|
||||
|
||||
chku8(uint8(i8), ci8 & 0xff);
|
||||
chku8(uint8(i16), ci16 & 0xff);
|
||||
chku8(uint8(i32), ci32 & 0xff);
|
||||
chku8(uint8(i64), ci64 & 0xff);
|
||||
chku8(uint8(u8), cu8 & 0xff);
|
||||
chku8(uint8(u16), cu16 & 0xff);
|
||||
chku8(uint8(u32), cu32 & 0xff);
|
||||
chku8(uint8(u64), cu64 & 0xff);
|
||||
// chku8(uint8(f32), 0);
|
||||
// chku8(uint8(f64), 0);
|
||||
|
||||
chku16(uint16(i8), ci8 & 0xffff);
|
||||
chku16(uint16(i16), ci16 & 0xffff);
|
||||
chku16(uint16(i32), ci32 & 0xffff);
|
||||
chku16(uint16(i64), ci64 & 0xffff);
|
||||
chku16(uint16(u8), cu8 & 0xffff);
|
||||
chku16(uint16(u16), cu16 & 0xffff);
|
||||
chku16(uint16(u32), cu32 & 0xffff);
|
||||
chku16(uint16(u64), cu64 & 0xffff);
|
||||
// chku16(uint16(f32), 0);
|
||||
// chku16(uint16(f64), 0);
|
||||
|
||||
chku32(uint32(i8), ci8 & 0xffffffff);
|
||||
chku32(uint32(i16), ci16 & 0xffffffff);
|
||||
chku32(uint32(i32), ci32 & 0xffffffff);
|
||||
chku32(uint32(i64), ci64 & 0xffffffff);
|
||||
chku32(uint32(u8), cu8 & 0xffffffff);
|
||||
chku32(uint32(u16), cu16 & 0xffffffff);
|
||||
chku32(uint32(u32), cu32 & 0xffffffff);
|
||||
chku32(uint32(u64), cu64 & 0xffffffff);
|
||||
// chku32(uint32(f32), 0);
|
||||
// chku32(uint32(f64), 0);
|
||||
|
||||
chku64(uint64(i8), ci8 & 0xffffffffffffffff);
|
||||
chku64(uint64(i16), ci16 & 0xffffffffffffffff);
|
||||
chku64(uint64(i32), ci32 & 0xffffffffffffffff);
|
||||
chku64(uint64(i64), ci64 & 0xffffffffffffffff);
|
||||
chku64(uint64(u8), cu8 & 0xffffffffffffffff);
|
||||
chku64(uint64(u16), cu16 & 0xffffffffffffffff);
|
||||
chku64(uint64(u32), cu32 & 0xffffffffffffffff);
|
||||
chku64(uint64(u64), cu64 & 0xffffffffffffffff);
|
||||
// chku64(uint64(f32), 0);
|
||||
// chku64(uint64(f64), 0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user