Hi,
In http://felleisen.org/matthias/manifesto/, you can read:
"In support, Racket offers protection mechanisms to implement a full
language spectrum, from C-level bit manipulation to soundly typed
extensions."
What are we talking about here when we mention C-level bit manipulation?
Is this referring to the ffi or some other Racket feature that allows me
to generate unsafe bit manipulation instructions?
In C, for a bitwise_and of an integer x and 0xff, I get:
https://godbolt.org/g/gy3ZN9
bitwise_and:
movzx eax, dil
ret
In Racket, I tried:
#lang racket
(require disassemble
racket/unsafe/ops)
(define (lsb x)
(bitwise-and x #xff))
(disassemble lsb)
0: 488b4808 (mov rcx (mem64+ rax #x8))
4: 48898bf8ffffff (mov (mem64+ rbx #x-8) rcx)
b: 488b4810 (mov rcx (mem64+ rax #x10))
f: 48898bf0ffffff (mov (mem64+ rbx #x-10) rcx)
16: 4881c3f0ffffff (add rbx #xfffffffffffffff0)
1d: 488b13 (mov rdx (mem64+ rbx))
20: 488b5230 (mov rdx (mem64+ rdx #x30))
24: 488b4208 (mov rax (mem64+ rdx #x8))
28: 488983f8ffffff (mov (mem64+ rbx #x-8) rax)
2f: 48b8a80e484c00000000 (mov rax #x4c480ea8)
39: 488b00 (mov rax (mem64+ rax))
3c: 488983f0ffffff (mov (mem64+ rbx #x-10) rax)
43: 4881c3f0ffffff (add rbx #xfffffffffffffff0)
4a: 488b4308 (mov rax (mem64+ rbx #x8))
4e: f6c001 (test al #x1)
51: 0f850f000000 (jnz (+ rip #xf))
57: 66833831 (cmp (mem16+ rax) #x31)
5b: 0f8505000000 (jnz (+ rip #x5))
61: e81e771fb4 (call (+ rip #x-4be088e2))
66: e8bb751fb4 (call (+ rip #x-4be08a45))
6b: 488b4320 (mov rax (mem64+ rbx #x20))
6f: 4883c310 (add rbx #x10)
73: f6c001 (test al #x1)
76: 0f8514000000 (jnz (+ rip #x14))
7c: ba60fba070 (mov edx #x70a0fb60)
81: b9ff010000 (mov ecx #x1ff)
86: e86e001fb4 (call (+ rip #x-4be0ff92))
8b: e907000000 (jmp (+ rip #x7))
90: 4881e0ff010000 (and rax #x1ff)
97: 4c8b75c8 (mov r14 (mem64+ rbp #x-38))
9b: 4883c428 (add rsp #x28)
9f: 5f (pop rdi)
a0: 5e (pop rsi)
a1: 5b (pop rbx)
a2: 5d (pop rbp)
a3: c3 (ret)
(define (unsafe-lsb x)
(unsafe-fxand x #xff))
(disassemble unsafe-lsb)
0: 488983f8ffffff (mov (mem64+ rbx #x-8) rax)
7: 4881c3f8ffffff (add rbx #xfffffffffffffff8)
e: 488b4308 (mov rax (mem64+ rbx #x8))
12: 4881e0ff010000 (and rax #x1ff)
19: 4c8b75c8 (mov r14 (mem64+ rbp #x-38))
1d: 4883c428 (add rsp #x28)
21: 5f (pop rdi)
22: 5e (pop rsi)
23: 5b (pop rbx)
24: 5d (pop rbp)
25: c3 (ret)
This returns two assembly listings and as expected the unsafe-lsb is
shorter than the one for lsb but not even close to the one you'd get in
C. Is there something else in Racket that I might be missing that it
gives me access to the low level C bit manip constructs besides ffi?
Kind regards,
--
Paulo Matos
--
You received this message because you are subscribed to the Google Groups "Racket
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.