diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 20d846a0..443caf72 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -1179,7 +1179,7 @@ static uint32_t readFractionalPart(uint32_t integer) precision = fixPrecision; } - if (integer >= ((uint64_t)1 << precision)) + if (integer >= ((uint64_t)1 << (32 - precision))) warning(WARNING_LARGE_CONSTANT, "Magnitude of fixed-point constant is too large\n"); // Cast to unsigned avoids undefined overflow behavior diff --git a/test/asm/fixed-point-magnitude.asm b/test/asm/fixed-point-magnitude.asm index 6e05c726..8a9492d9 100644 --- a/test/asm/fixed-point-magnitude.asm +++ b/test/asm/fixed-point-magnitude.asm @@ -1,13 +1,19 @@ -OPT Q.4 -println 1.0 -println -1.0 -println 0.0625 -println -0.0625 -println 7.25 -println -7.25 -println 12.25 -println -12.25 -println 15.9375 -println -15.9375 -println 20.0 -println -20.0 +for precision, 1, 32 + opt Q{d:precision} + def magnitude = 32 - precision + + def maxInt = 1 << magnitude - 1 + redef defMaxValue equs "def maxValue = {d:maxInt}.0" + {defMaxValue} + println "Q.{2d:precision}: max ok = 1 << {2d:magnitude} - 1 = {11d:maxInt}.0 = {#09x:maxValue}" + + def minBadInt = maxInt + 1 + redef defMinBadValue equs "def minBadValue = {d:minBadInt}.0" + {defMinBadValue} + println "Q.{2d:precision}: min bad = 1 << {2d:magnitude} = {11d:minBadInt}.0 = {#09x:minBadValue}" + + def worseInt = minBadInt + 42 + redef defWorseValue equs "def worseValue = {d:worseInt}.0" + {defWorseValue} + println "Q.{2d:precision}: worse = 1 << {2d:magnitude} + 42 = {11d:worseInt}.0 = {#09x:worseValue}" +endr diff --git a/test/asm/fixed-point-magnitude.err b/test/asm/fixed-point-magnitude.err index 753e8fbb..7871ddbf 100644 --- a/test/asm/fixed-point-magnitude.err +++ b/test/asm/fixed-point-magnitude.err @@ -1,4 +1,183 @@ -warning: fixed-point-magnitude.asm(12): [-Wlarge-constant] +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~1(12): [-Wlarge-constant] Magnitude of fixed-point constant is too large -warning: fixed-point-magnitude.asm(13): [-Wlarge-constant] +while expanding symbol "def minBadValue = -2147483648.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~2(12): [-Wlarge-constant] Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 1073741824.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~2(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 1073741866.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~3(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 536870912.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~3(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 536870954.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~4(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 268435456.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~4(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 268435498.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~5(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 134217728.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~5(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 134217770.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~6(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 67108864.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~6(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 67108906.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~7(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 33554432.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~7(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 33554474.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~8(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 16777216.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~8(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 16777258.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~9(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 8388608.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~9(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 8388650.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~10(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 4194304.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~10(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 4194346.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~11(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 2097152.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~11(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 2097194.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~12(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 1048576.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~12(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 1048618.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~13(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 524288.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~13(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 524330.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~14(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 262144.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~14(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 262186.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~15(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 131072.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~15(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 131114.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~16(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 65536.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~16(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 65578.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~17(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 32768.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~17(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 32810.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~18(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 16384.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~18(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 16426.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~19(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 8192.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~19(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 8234.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~20(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 4096.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~20(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 4138.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~21(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 2048.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~21(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 2090.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~22(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 1024.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~22(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 1066.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~23(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 512.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~23(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 554.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~24(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 256.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~24(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 298.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~25(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 128.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~25(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 170.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~26(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 64.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~26(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 106.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~27(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 32.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~27(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 74.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~28(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 16.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~28(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 58.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~29(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 8.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~29(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 50.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~30(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 4.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~30(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 46.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~31(12): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def minBadValue = 2.0" +warning: fixed-point-magnitude.asm(1) -> fixed-point-magnitude.asm::REPT~31(17): [-Wlarge-constant] + Magnitude of fixed-point constant is too large +while expanding symbol "def worseValue = 44.0" diff --git a/test/asm/fixed-point-magnitude.out b/test/asm/fixed-point-magnitude.out index faa3c50e..a1afa8c8 100644 --- a/test/asm/fixed-point-magnitude.out +++ b/test/asm/fixed-point-magnitude.out @@ -1,12 +1,93 @@ -$10 -$FFFFFFF0 -$1 -$FFFFFFFF -$74 -$FFFFFF8C -$C4 -$FFFFFF3C -$FF -$FFFFFF01 -$140 -$FFFFFEC0 +Q. 1: max ok = 1 << 31 - 1 = 2147483647.0 = $fffffffe +Q. 1: min bad = 1 << 31 = -2147483648.0 = $00000000 +Q. 1: worse = 1 << 31 + 42 = -2147483606.0 = $00000054 +Q. 2: max ok = 1 << 30 - 1 = 1073741823.0 = $fffffffc +Q. 2: min bad = 1 << 30 = 1073741824.0 = $00000000 +Q. 2: worse = 1 << 30 + 42 = 1073741866.0 = $000000a8 +Q. 3: max ok = 1 << 29 - 1 = 536870911.0 = $fffffff8 +Q. 3: min bad = 1 << 29 = 536870912.0 = $00000000 +Q. 3: worse = 1 << 29 + 42 = 536870954.0 = $00000150 +Q. 4: max ok = 1 << 28 - 1 = 268435455.0 = $fffffff0 +Q. 4: min bad = 1 << 28 = 268435456.0 = $00000000 +Q. 4: worse = 1 << 28 + 42 = 268435498.0 = $000002a0 +Q. 5: max ok = 1 << 27 - 1 = 134217727.0 = $ffffffe0 +Q. 5: min bad = 1 << 27 = 134217728.0 = $00000000 +Q. 5: worse = 1 << 27 + 42 = 134217770.0 = $00000540 +Q. 6: max ok = 1 << 26 - 1 = 67108863.0 = $ffffffc0 +Q. 6: min bad = 1 << 26 = 67108864.0 = $00000000 +Q. 6: worse = 1 << 26 + 42 = 67108906.0 = $00000a80 +Q. 7: max ok = 1 << 25 - 1 = 33554431.0 = $ffffff80 +Q. 7: min bad = 1 << 25 = 33554432.0 = $00000000 +Q. 7: worse = 1 << 25 + 42 = 33554474.0 = $00001500 +Q. 8: max ok = 1 << 24 - 1 = 16777215.0 = $ffffff00 +Q. 8: min bad = 1 << 24 = 16777216.0 = $00000000 +Q. 8: worse = 1 << 24 + 42 = 16777258.0 = $00002a00 +Q. 9: max ok = 1 << 23 - 1 = 8388607.0 = $fffffe00 +Q. 9: min bad = 1 << 23 = 8388608.0 = $00000000 +Q. 9: worse = 1 << 23 + 42 = 8388650.0 = $00005400 +Q.10: max ok = 1 << 22 - 1 = 4194303.0 = $fffffc00 +Q.10: min bad = 1 << 22 = 4194304.0 = $00000000 +Q.10: worse = 1 << 22 + 42 = 4194346.0 = $0000a800 +Q.11: max ok = 1 << 21 - 1 = 2097151.0 = $fffff800 +Q.11: min bad = 1 << 21 = 2097152.0 = $00000000 +Q.11: worse = 1 << 21 + 42 = 2097194.0 = $00015000 +Q.12: max ok = 1 << 20 - 1 = 1048575.0 = $fffff000 +Q.12: min bad = 1 << 20 = 1048576.0 = $00000000 +Q.12: worse = 1 << 20 + 42 = 1048618.0 = $0002a000 +Q.13: max ok = 1 << 19 - 1 = 524287.0 = $ffffe000 +Q.13: min bad = 1 << 19 = 524288.0 = $00000000 +Q.13: worse = 1 << 19 + 42 = 524330.0 = $00054000 +Q.14: max ok = 1 << 18 - 1 = 262143.0 = $ffffc000 +Q.14: min bad = 1 << 18 = 262144.0 = $00000000 +Q.14: worse = 1 << 18 + 42 = 262186.0 = $000a8000 +Q.15: max ok = 1 << 17 - 1 = 131071.0 = $ffff8000 +Q.15: min bad = 1 << 17 = 131072.0 = $00000000 +Q.15: worse = 1 << 17 + 42 = 131114.0 = $00150000 +Q.16: max ok = 1 << 16 - 1 = 65535.0 = $ffff0000 +Q.16: min bad = 1 << 16 = 65536.0 = $00000000 +Q.16: worse = 1 << 16 + 42 = 65578.0 = $002a0000 +Q.17: max ok = 1 << 15 - 1 = 32767.0 = $fffe0000 +Q.17: min bad = 1 << 15 = 32768.0 = $00000000 +Q.17: worse = 1 << 15 + 42 = 32810.0 = $00540000 +Q.18: max ok = 1 << 14 - 1 = 16383.0 = $fffc0000 +Q.18: min bad = 1 << 14 = 16384.0 = $00000000 +Q.18: worse = 1 << 14 + 42 = 16426.0 = $00a80000 +Q.19: max ok = 1 << 13 - 1 = 8191.0 = $fff80000 +Q.19: min bad = 1 << 13 = 8192.0 = $00000000 +Q.19: worse = 1 << 13 + 42 = 8234.0 = $01500000 +Q.20: max ok = 1 << 12 - 1 = 4095.0 = $fff00000 +Q.20: min bad = 1 << 12 = 4096.0 = $00000000 +Q.20: worse = 1 << 12 + 42 = 4138.0 = $02a00000 +Q.21: max ok = 1 << 11 - 1 = 2047.0 = $ffe00000 +Q.21: min bad = 1 << 11 = 2048.0 = $00000000 +Q.21: worse = 1 << 11 + 42 = 2090.0 = $05400000 +Q.22: max ok = 1 << 10 - 1 = 1023.0 = $ffc00000 +Q.22: min bad = 1 << 10 = 1024.0 = $00000000 +Q.22: worse = 1 << 10 + 42 = 1066.0 = $0a800000 +Q.23: max ok = 1 << 9 - 1 = 511.0 = $ff800000 +Q.23: min bad = 1 << 9 = 512.0 = $00000000 +Q.23: worse = 1 << 9 + 42 = 554.0 = $15000000 +Q.24: max ok = 1 << 8 - 1 = 255.0 = $ff000000 +Q.24: min bad = 1 << 8 = 256.0 = $00000000 +Q.24: worse = 1 << 8 + 42 = 298.0 = $2a000000 +Q.25: max ok = 1 << 7 - 1 = 127.0 = $fe000000 +Q.25: min bad = 1 << 7 = 128.0 = $00000000 +Q.25: worse = 1 << 7 + 42 = 170.0 = $54000000 +Q.26: max ok = 1 << 6 - 1 = 63.0 = $fc000000 +Q.26: min bad = 1 << 6 = 64.0 = $00000000 +Q.26: worse = 1 << 6 + 42 = 106.0 = $a8000000 +Q.27: max ok = 1 << 5 - 1 = 31.0 = $f8000000 +Q.27: min bad = 1 << 5 = 32.0 = $00000000 +Q.27: worse = 1 << 5 + 42 = 74.0 = $50000000 +Q.28: max ok = 1 << 4 - 1 = 15.0 = $f0000000 +Q.28: min bad = 1 << 4 = 16.0 = $00000000 +Q.28: worse = 1 << 4 + 42 = 58.0 = $a0000000 +Q.29: max ok = 1 << 3 - 1 = 7.0 = $e0000000 +Q.29: min bad = 1 << 3 = 8.0 = $00000000 +Q.29: worse = 1 << 3 + 42 = 50.0 = $40000000 +Q.30: max ok = 1 << 2 - 1 = 3.0 = $c0000000 +Q.30: min bad = 1 << 2 = 4.0 = $00000000 +Q.30: worse = 1 << 2 + 42 = 46.0 = $80000000 +Q.31: max ok = 1 << 1 - 1 = 1.0 = $80000000 +Q.31: min bad = 1 << 1 = 2.0 = $00000000 +Q.31: worse = 1 << 1 + 42 = 44.0 = $00000000