switch v.Op {
case ssa.Op386MOVSSconst, ssa.Op386MOVSDconst:
- p := s.Prog(loadPush(v.Type))
- p.From.Type = obj.TYPE_FCONST
- p.From.Val = math.Float64frombits(uint64(v.AuxInt))
- p.To.Type = obj.TYPE_REG
- p.To.Reg = x86.REG_F0
+ iv := uint64(v.AuxInt)
+ if iv == 0x0000000000000000 { // +0.0
+ s.Prog(x86.AFLDZ)
+ } else if iv == 0x3ff0000000000000 { // +1.0
+ s.Prog(x86.AFLD1)
+ } else if iv == 0x8000000000000000 { // -0.0
+ s.Prog(x86.AFLDZ)
+ s.Prog(x86.AFCHS)
+ } else if iv == 0xbff0000000000000 { // -1.0
+ s.Prog(x86.AFLD1)
+ s.Prog(x86.AFCHS)
+ } else { // others
+ p := s.Prog(loadPush(v.Type))
+ p.From.Type = obj.TYPE_FCONST
+ p.From.Val = math.Float64frombits(iv)
+ p.To.Type = obj.TYPE_REG
+ p.To.Reg = x86.REG_F0
+ }
popAndSave(s, v)
case ssa.Op386MOVSSconst2, ssa.Op386MOVSDconst2: