... | ... | @@ -175,3 +175,398 @@ The "The word size story" section in `primops.txt.pp` provides a good overview. |
|
|
|
|
|
Just define `Num` instances in the safeint package as it's done for `SafeInt`.
|
|
|
(There could be an alternative class for things returning an `Either`, but first I'll just add a version that fails at runtime.)
|
|
|
|
|
|
## Asm from `subWordC#` vs. asm from a user-defined overflow-checking function
|
|
|
|
|
|
### `subWordC#`
|
|
|
|
|
|
|
|
|
Test module:
|
|
|
|
|
|
```wiki
|
|
|
{-# LANGUAGE MagicHash #-}
|
|
|
{-# LANGUAGE UnboxedTuples #-}
|
|
|
|
|
|
module SubWordC where
|
|
|
|
|
|
import GHC.Base
|
|
|
|
|
|
foo x = subWordC# 1##
|
|
|
```
|
|
|
|
|
|
|
|
|
x86_64:
|
|
|
|
|
|
```wiki
|
|
|
[1 of 1] Compiling SubWordC ( SubWordC.hs, SubWordC.o )
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
.globl __stginit_main@main:SubWordC
|
|
|
.type __stginit_main@main:SubWordC, @object
|
|
|
__stginit_main@main:SubWordC:
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
.globl SubWordC.foo_closure
|
|
|
.type SubWordC.foo_closure, @object
|
|
|
SubWordC.foo_closure:
|
|
|
.quad SubWordC.foo_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.text
|
|
|
.align 8
|
|
|
.quad 8589934606
|
|
|
.quad 0
|
|
|
.quad 15
|
|
|
.globl SubWordC.foo_info
|
|
|
.type SubWordC.foo_info, @object
|
|
|
SubWordC.foo_info:
|
|
|
_cv7:
|
|
|
_cv9:
|
|
|
movl $1,%eax
|
|
|
subq %rsi,%rax
|
|
|
setc %bl
|
|
|
movzbl %bl,%ebx
|
|
|
movq %rbx,%r14
|
|
|
movq %rax,%rbx
|
|
|
jmp *(%rbp)
|
|
|
.size SubWordC.foo_info, .-SubWordC.foo_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.section .data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
Svn_srt:
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
x86:
|
|
|
|
|
|
```wiki
|
|
|
[1 of 1] Compiling SubWordC ( SubWordC.hs, SubWordC.o )
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
.globl __stginit_main@main:SubWordC
|
|
|
.type __stginit_main@main:SubWordC, @object
|
|
|
__stginit_main@main:SubWordC:
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
.globl SubWordC.foo_closure
|
|
|
.type SubWordC.foo_closure, @object
|
|
|
SubWordC.foo_closure:
|
|
|
.long SubWordC.foo_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.text
|
|
|
.align 4,0x90
|
|
|
.long 131086
|
|
|
.long 0
|
|
|
.long 15
|
|
|
.globl SubWordC.foo_info
|
|
|
.type SubWordC.foo_info, @object
|
|
|
SubWordC.foo_info:
|
|
|
_cvj:
|
|
|
movl (%ebp),%eax
|
|
|
movl 4(%ebp),%eax
|
|
|
_cvl:
|
|
|
movl $1,%ecx
|
|
|
subl %eax,%ecx
|
|
|
setc %al
|
|
|
movzbl %al,%eax
|
|
|
movl %ecx,%esi
|
|
|
movl %eax,4(%ebp)
|
|
|
addl $4,%ebp
|
|
|
jmp *4(%ebp)
|
|
|
.size SubWordC.foo_info, .-SubWordC.foo_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.section .data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
Svz_srt:
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
### User-defined overflow-checking function
|
|
|
|
|
|
|
|
|
Test modules:
|
|
|
|
|
|
|
|
|
MySubWordC.hs:
|
|
|
|
|
|
```wiki
|
|
|
{-# LANGUAGE MagicHash #-}
|
|
|
{-# LANGUAGE UnboxedTuples #-}
|
|
|
|
|
|
module MySubWordC where
|
|
|
|
|
|
import GHC.Base
|
|
|
import GHC.Prim
|
|
|
|
|
|
subWordC :: Word# -> Word# -> (# Word#, Int# #)
|
|
|
subWordC x y = (# minusWord# x y, gtWord# y x #)
|
|
|
```
|
|
|
|
|
|
|
|
|
MySubWordCTest.hs:
|
|
|
|
|
|
```wiki
|
|
|
{-# LANGUAGE MagicHash #-}
|
|
|
{-# LANGUAGE UnboxedTuples #-}
|
|
|
|
|
|
module MySubWordCTest where
|
|
|
|
|
|
import MySubWordC
|
|
|
|
|
|
foo x = subWordC 1##
|
|
|
```
|
|
|
|
|
|
|
|
|
x86_64:
|
|
|
|
|
|
```wiki
|
|
|
[1 of 2] Compiling MySubWordC ( MySubWordC.hs, MySubWordC.o )
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
.globl __stginit_main@main:MySubWordC
|
|
|
.type __stginit_main@main:MySubWordC, @object
|
|
|
__stginit_main@main:MySubWordC:
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
.globl MySubWordC.subWordC_closure
|
|
|
.type MySubWordC.subWordC_closure, @object
|
|
|
MySubWordC.subWordC_closure:
|
|
|
.quad MySubWordC.subWordC_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.text
|
|
|
.align 8
|
|
|
.quad 8589934604
|
|
|
.quad 0
|
|
|
.quad 15
|
|
|
.globl MySubWordC.subWordC_info
|
|
|
.type MySubWordC.subWordC_info, @object
|
|
|
MySubWordC.subWordC_info:
|
|
|
_cv9:
|
|
|
_cvb:
|
|
|
cmpq %r14,%rsi
|
|
|
seta %al
|
|
|
movzbl %al,%eax
|
|
|
subq %rsi,%r14
|
|
|
movq %r14,%rbx
|
|
|
movq %rax,%r14
|
|
|
jmp *(%rbp)
|
|
|
.size MySubWordC.subWordC_info, .-MySubWordC.subWordC_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.section .data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
Svl_srt:
|
|
|
|
|
|
|
|
|
[2 of 2] Compiling MySubWordCTest ( MySubWordCTest.hs, MySubWordCTest.o )
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
.globl __stginit_main@main:MySubWordCTest
|
|
|
.type __stginit_main@main:MySubWordCTest, @object
|
|
|
__stginit_main@main:MySubWordCTest:
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
.globl MySubWordCTest.foo_closure
|
|
|
.type MySubWordCTest.foo_closure, @object
|
|
|
MySubWordCTest.foo_closure:
|
|
|
.quad MySubWordCTest.foo_info
|
|
|
.quad 0
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.text
|
|
|
.align 8
|
|
|
.long SvL_srt-(MySubWordCTest.foo_info)+0
|
|
|
.long 0
|
|
|
.quad 4294967301
|
|
|
.quad 0
|
|
|
.quad 4294967311
|
|
|
.globl MySubWordCTest.foo_info
|
|
|
.type MySubWordCTest.foo_info, @object
|
|
|
MySubWordCTest.foo_info:
|
|
|
_cvI:
|
|
|
_cvK:
|
|
|
movl $1,%r14d
|
|
|
movl $MySubWordC.subWordC_closure,%ebx
|
|
|
jmp stg_ap_n_fast
|
|
|
.size MySubWordCTest.foo_info, .-MySubWordCTest.foo_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.section .data
|
|
|
.align 8
|
|
|
.align 1
|
|
|
SvL_srt:
|
|
|
.quad MySubWordC.subWordC_closure
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
x86:
|
|
|
|
|
|
```wiki
|
|
|
[1 of 2] Compiling MySubWordC ( MySubWordC.hs, MySubWordC.o )
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
.globl __stginit_main@main:MySubWordC
|
|
|
.type __stginit_main@main:MySubWordC, @object
|
|
|
__stginit_main@main:MySubWordC:
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
.globl MySubWordC.subWordC_closure
|
|
|
.type MySubWordC.subWordC_closure, @object
|
|
|
MySubWordC.subWordC_closure:
|
|
|
.long MySubWordC.subWordC_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.text
|
|
|
.align 4,0x90
|
|
|
.long 131084
|
|
|
.long 0
|
|
|
.long 15
|
|
|
.globl MySubWordC.subWordC_info
|
|
|
.type MySubWordC.subWordC_info, @object
|
|
|
MySubWordC.subWordC_info:
|
|
|
_cvl:
|
|
|
movl (%ebp),%eax
|
|
|
movl 4(%ebp),%ecx
|
|
|
_cvn:
|
|
|
cmpl %eax,%ecx
|
|
|
seta %dl
|
|
|
movzbl %dl,%edx
|
|
|
subl %ecx,%eax
|
|
|
movl %eax,%esi
|
|
|
movl %edx,4(%ebp)
|
|
|
addl $4,%ebp
|
|
|
jmp *4(%ebp)
|
|
|
.size MySubWordC.subWordC_info, .-MySubWordC.subWordC_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.section .data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
Svx_srt:
|
|
|
|
|
|
|
|
|
[2 of 2] Compiling MySubWordCTest ( MySubWordCTest.hs, MySubWordCTest.o )
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
.globl __stginit_main@main:MySubWordCTest
|
|
|
.type __stginit_main@main:MySubWordCTest, @object
|
|
|
__stginit_main@main:MySubWordCTest:
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
.globl MySubWordCTest.foo_closure
|
|
|
.type MySubWordCTest.foo_closure, @object
|
|
|
MySubWordCTest.foo_closure:
|
|
|
.long MySubWordCTest.foo_info
|
|
|
.long 0
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.text
|
|
|
.align 4,0x90
|
|
|
.long SvX_srt-(MySubWordCTest.foo_info)+0
|
|
|
.long 65541
|
|
|
.long 0
|
|
|
.long 65551
|
|
|
.globl MySubWordCTest.foo_info
|
|
|
.type MySubWordCTest.foo_info, @object
|
|
|
MySubWordCTest.foo_info:
|
|
|
_cvU:
|
|
|
movl (%ebp),%eax
|
|
|
_cvW:
|
|
|
movl $MySubWordC.subWordC_closure,%esi
|
|
|
movl $1,(%ebp)
|
|
|
jmp stg_ap_n_fast
|
|
|
.size MySubWordCTest.foo_info, .-MySubWordCTest.foo_info
|
|
|
|
|
|
|
|
|
|
|
|
==================== Asm code ====================
|
|
|
.section .data
|
|
|
.align 4
|
|
|
.align 1
|
|
|
SvX_srt:
|
|
|
.long MySubWordC.subWordC_closure
|
|
|
|
|
|
|
|
|
``` |
|
|
\ No newline at end of file |