@@ -267,18 +267,60 @@ func defaultTarget(options *Options) (*TargetSpec, error) {
267
267
case "arm" :
268
268
spec .CPU = "generic"
269
269
spec .CFlags = append (spec .CFlags , "-fno-unwind-tables" , "-fno-asynchronous-unwind-tables" )
270
- switch options .GOARM {
270
+ subarch := strings .Split (options .GOARM , "," )
271
+ if len (subarch ) > 2 {
272
+ return nil , fmt .Errorf ("invalid GOARM=%s, must be of form <num>,[hardfloat|softfloat]" , options .GOARM )
273
+ }
274
+ archLevel := subarch [0 ]
275
+ var fpu string
276
+ if len (subarch ) >= 2 {
277
+ fpu = subarch [1 ]
278
+ } else {
279
+ // Pick the default fpu value: softfloat for armv5 and hardfloat
280
+ // above that.
281
+ if archLevel == "5" {
282
+ fpu = "softfloat"
283
+ } else {
284
+ fpu = "hardfloat"
285
+ }
286
+ }
287
+ switch fpu {
288
+ case "softfloat" :
289
+ spec .CFlags = append (spec .CFlags , "-msoft-float" )
290
+ spec .SoftFloat = true
291
+ case "hardfloat" :
292
+ // Hardware floating point support is the default everywhere except
293
+ // on ARMv5 where it needs to be enabled explicitly.
294
+ if archLevel == "5" {
295
+ spec .CFlags = append (spec .CFlags , "-mfpu=vfpv2" )
296
+ }
297
+ default :
298
+ return nil , fmt .Errorf ("invalid extension GOARM=%s, must be softfloat or hardfloat" , options .GOARM )
299
+ }
300
+ switch archLevel {
271
301
case "5" :
272
302
llvmarch = "armv5"
273
- spec .Features = "+armv5t,+strict-align,-aes,-bf16,-d32,-dotprod,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fp64,-fpregs,-fullfp16,-mve.fp,-neon,-sha2,-thumb-mode,-vfp2,-vfp2sp,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
303
+ if spec .SoftFloat {
304
+ spec .Features = "+armv5t,+soft-float,+strict-align,-aes,-bf16,-d32,-dotprod,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fp64,-fpregs,-fullfp16,-mve,-mve.fp,-neon,-sha2,-thumb-mode,-vfp2,-vfp2sp,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
305
+ } else {
306
+ spec .Features = "+armv5t,+fp64,+strict-align,+vfp2,+vfp2sp,-aes,-d32,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fullfp16,-neon,-sha2,-thumb-mode,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
307
+ }
274
308
case "6" :
275
309
llvmarch = "armv6"
276
- spec .Features = "+armv6,+dsp,+fp64,+strict-align,+vfp2,+vfp2sp,-aes,-d32,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fullfp16,-neon,-sha2,-thumb-mode,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
310
+ if spec .SoftFloat {
311
+ spec .Features = "+armv6,+dsp,+soft-float,+strict-align,-aes,-bf16,-d32,-dotprod,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fp64,-fpregs,-fullfp16,-mve,-mve.fp,-neon,-sha2,-thumb-mode,-vfp2,-vfp2sp,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
312
+ } else {
313
+ spec .Features = "+armv6,+dsp,+fp64,+strict-align,+vfp2,+vfp2sp,-aes,-d32,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fullfp16,-neon,-sha2,-thumb-mode,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
314
+ }
277
315
case "7" :
278
316
llvmarch = "armv7"
279
- spec .Features = "+armv7-a,+d32,+dsp,+fp64,+neon,+vfp2,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,-aes,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fullfp16,-sha2,-thumb-mode,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
317
+ if spec .SoftFloat {
318
+ spec .Features = "+armv7-a,+dsp,+soft-float,-aes,-bf16,-d32,-dotprod,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fp64,-fpregs,-fullfp16,-mve,-mve.fp,-neon,-sha2,-thumb-mode,-vfp2,-vfp2sp,-vfp3,-vfp3d16,-vfp3d16sp,-vfp3sp,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
319
+ } else {
320
+ spec .Features = "+armv7-a,+d32,+dsp,+fp64,+neon,+vfp2,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,-aes,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fullfp16,-sha2,-thumb-mode,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp"
321
+ }
280
322
default :
281
- return nil , fmt .Errorf ("invalid GOARM=%s, must be 5, 6, or 7" , options .GOARM )
323
+ return nil , fmt .Errorf ("invalid GOARM=%s, must be of form <num>,[hardfloat|softfloat] where num is 5, 6, or 7" , options .GOARM )
282
324
}
283
325
case "arm64" :
284
326
spec .CPU = "generic"
0 commit comments